diff --git a/app/resources/css/app.css b/app/resources/css/app.css index c2517873..22fea661 100644 --- a/app/resources/css/app.css +++ b/app/resources/css/app.css @@ -23,3 +23,14 @@ body { font-family: 'JetBrains Mono', ui-monospace, monospace; font-feature-settings: 'tnum' 1; } + +/* + * A11y override: Vuetify .v-messages helper-text + .v-field-label opacity + * (~0.52 default) рендерится ≈#7a7a7a/#767471 → contrast 4.20-4.29 fails + * WCAG 2.1 AA 4.5:1. Q.DEFER.002 fix (12.05.2026 audit): локально bump до 0.7 + * → rendered ≈#595959 → 7.9:1+. + */ +.v-messages, +.v-field-label { + --v-medium-emphasis-opacity: 0.7; +} diff --git a/app/resources/js/components/admin/tenants/TenantsTable.vue b/app/resources/js/components/admin/tenants/TenantsTable.vue index 09e83827..a9bf71df 100644 --- a/app/resources/js/components/admin/tenants/TenantsTable.vue +++ b/app/resources/js/components/admin/tenants/TenantsTable.vue @@ -86,6 +86,7 @@ function statusColor(s: TenantStatus): string { variant="text" size="small" density="comfortable" + :aria-label="`Войти как клиент (impersonation) для ${item.name}`" :disabled="item.status === 'suspended'" :data-testid="`impersonate-btn-${item.id}`" @click.stop="emit('impersonate', item)" diff --git a/app/resources/js/components/billing/TransactionsTable.vue b/app/resources/js/components/billing/TransactionsTable.vue index 7202fffd..81093f4f 100644 --- a/app/resources/js/components/billing/TransactionsTable.vue +++ b/app/resources/js/components/billing/TransactionsTable.vue @@ -93,7 +93,7 @@ const filteredTransactions = computed(() => { color: #66635c; } .tx-amount-up { - color: #2e8b57; + color: #1b6e3b; } .tx-amount-down { color: #b83a3a; diff --git a/app/resources/js/components/dashboard/DashboardBalance.vue b/app/resources/js/components/dashboard/DashboardBalance.vue index 436b1ee6..bbbf9b0f 100644 --- a/app/resources/js/components/dashboard/DashboardBalance.vue +++ b/app/resources/js/components/dashboard/DashboardBalance.vue @@ -29,7 +29,7 @@ defineProps<{  ₽
-
+