Дмитрий
|
398f6bcf5a
|
fix(a11y): Vuetify tonal alert/chip + text-warning contrast overrides (Patterns C+D+E)
A11y rescan Patterns C+D+E — Vuetify default theme colours для tonal-variant
.v-alert .v-alert__content (4.18:1) и tonal .v-chip__content (success 4.25:1
/ warning 2.25:1), плюс `.text-warning` utility used в count badges (2.03:1
на ivory) — все ниже WCAG 2.1 AA 4.5:1.
Global CSS overrides in app/resources/css/app.css:
Pattern C — alert tonal content (2 URLs: billing, admin/system):
.v-alert--variant-tonal .v-alert__content {
color: #0a0700; /* near-black, 16:1 on ivory */
}
Pattern D — chip tonal success/warning content (4 URLs: billing,
admin/{tenants,billing,incidents,system}):
.v-chip--variant-tonal.bg-success .v-chip__content { color: #1f5e3a }
.v-chip--variant-tonal.bg-warning .v-chip__content { color: #6a4504 }
Pattern E — .text-warning utility (2 URLs: admin/billing «5», admin/incidents
«1»). Critical specificity fix: Vuetify defines selector as
`.v-theme--liderraForest .text-warning { color: rgb(var(--v-theme-warning))
!important }` (specificity 0,2,0 + !important). Naive `.text-warning
!important` (0,1,0) loses on specificity even with !important. Match Vuetify
selector exactly so override wins on cascade order (loaded after Vuetify CSS):
.v-theme--liderraForest .text-warning,
.v-theme--liderraForest.text-warning,
.text-warning {
color: #6a4504 !important;
}
Closes 4+11+2 = 17 color-contrast violations across 5 distinct URLs.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-14 10:07:35 +03:00 |
|
Дмитрий
|
143cc458c1
|
fix(a11y): Q.DEFER.002 sub-B — 12 patterns fixed across 16 auth views
Q.DEFER.002 sub-B closure: manual Pa11y audit-pass via Playwright MCP login +
axe-core CDN inject on 16 auth-required views. Found ~13 unique violation
patterns, 12 fixed, 3 deferred to Q.DEFER.004.
ROOT CAUSE found: AdminLayout `<v-navigation-drawer color="secondary"
theme="dark">` resolved to Vuetify default-dark `secondary=#54b6b2` (Teal
mid) instead of liderraForest `#012019` теало-нуар. Switching to direct hex
preserves design intent + restores white-text contrast across all 8 admin
views (~50 nodes color-contrast violations cleared).
Patterns fixed:
1. AdminLayout sidebar palette (8 admin views):
- color="secondary" → color="#012019" (root cause)
- .brand-sub red #b94837 → #e06155 (3.41 → 5.08)
- .nav-count gray #7a8c87 → #8a9c95 (4.26 → 5.34)
- <v-list nav> + role="navigation" + aria-label (aria-required-children
fix: <v-list role=list> had [role=link] children — undefined для list)
2. DashboardBalance .runway-bar — role="img" (aria-prohibited-attr fix)
3. DashboardKpiRow .delta-up — #2e8b57 → #1b6e3b (4.27 → 6.25)
4. TransactionsTable .tx-amount-up — #2e8b57 → #1b6e3b (same fix)
5. RemindersList .empty-hint — #9a9690 → #6b6356 (2.98 → 5.74; +liderra-muted alignment)
6. KanbanView .kanban-board — tabindex="0" role="region" aria-label
(scrollable-region-focusable fix)
7. ProjectCard:
- .v-progress-linear + :aria-label="Прогресс дневной нормы: N%"
- icon menu :aria-label="Меню действий проекта «...»"
- bulk-select .card-check input :aria-label="Выбрать проект «...»"
8. useStatusPill in_progress #3F7C95 → #2A5A6E (4.07 → 6.11);
useStatusPill.spec.ts sync
9. ProjectsView toolbar select-all input aria-label
10. AdminTenants impersonate v-btn aria-label
11. Global app.css:
`.v-messages, .v-field-label { --v-medium-emphasis-opacity: 0.7; }`
Vuetify default ~0.52 → rendered #7a7a7a/#767471 fails 4.20-4.29:1;
0.7 → rendered ≈#595959 → 7.9:1+ passes WCAG AA.
Re-verified post-fix via axe-core on all affected views: all clean except
DEV-only `.dev-index-num` chip (tree-shaked в prod, not a real violation).
Vitest verified post-fix: 79 files / 614 passed / 3 skipped / 0 failed
(baseline preserved).
3 patterns deferred to Q.DEFER.004:
- DealsTable VDataTable show-select bulk-checkboxes (6 nodes) — Vuetify
slot rewrite needed
- AdminSupplierPrices 9 form inputs — v-text-field/v-switch label props
- Vuetify v-tooltip eager-mount aria-tooltip-name — library-level cosmetic
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-12 22:09:48 +03:00 |
|
Дмитрий
|
952373fce5
|
phase2(trigger): Vue 3 + Vuetify 3 + ESLint+Prettier+Vue + vue-tsc + Vitest
Триггер фазы 2 выполнен — первый коммит в app/resources/js/. Активирует
5 из 6 инструментов фазы 2 (CLAUDE.md §3.3) — без Histoire (отдельно).
Tailwind удалён (правило CLAUDE.md §5 п.2).
Стек:
- vue@3.5, vuetify@3.12, @vitejs/plugin-vue@6 (для Vite 8 совместимости —
@vitejs/plugin-vue@5 поддерживает только Vite 5/6), vite-plugin-vuetify@2
(auto-import), sass-embedded
- eslint@10 (flat-config), eslint-plugin-vue@10,
@vue/eslint-config-typescript@14, eslint-config-prettier, prettier@3.8
- typescript@6, vue-tsc@3.2
- vitest@4.1, @vue/test-utils, jsdom, @vitest/coverage-v8
Конфиги:
- app/vite.config.js — vue + vuetify auto-import
- app/vitest.config.ts — jsdom + setup file для ResizeObserver/
IntersectionObserver/matchMedia/CSS.supports stubs (без них Vuetify
падает в JSDOM)
- app/eslint.config.js — flat-config
- app/.prettierrc.json, app/tsconfig.json
Frontend-структура:
- resources/js/app.ts — точка входа
- resources/js/plugins/vuetify.ts — палитра Forest (Teal/ivory/теало-нуар
из BRANDBOOK_v2 §3)
- resources/js/components/AppShell.vue — первый компонент: v-app +
v-app-bar + v-card
- resources/css/app.css — Inter (UI, opsz axis), JetBrains Mono
(.numeric, tnum)
- resources/views/welcome.blade.php — упрощён под Vue mount
Smoke-тесты Vitest 3/3 за 2.8 сек:
- монтируется без ошибок
- содержит «Лидерра.»
- рендерит chip с фазой 2
Build: 158 модулей за 386 ms (184 KB JS / 295 KB CSS gzipped).
npm-scripts: lint:vue, format, format:check, type-check, test:vue.
lefthook job #8 (ESLint на staged .ts/.vue) добавлен в pre-commit.
Полный type-check (vue-tsc) и Vitest — отдельно вручную (медленно для
pre-commit: ~3 сек на каждый).
CLAUDE.md v1.16 → v1.17 (фаза 1 → фаза 2 в §6).
Реестр Открытые_вопросы v1.25 → v1.26.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 16:07:14 +03:00 |
|
Дмитрий
|
4d38f75826
|
phase1(scaffold): Laravel 11 + predis + .env под PG 16 + Memurai
Триггер фазы 1 запущен 08.05.2026 (вечер):
composer create-project laravel/laravel app
Стек подтверждён native (без Docker/WSL2/Sail):
- PostgreSQL 16.13 (Chocolatey, Windows-сервис, port 5432)
- Memurai Developer 4.1.8 (Redis 7-совм., port 6379) — TCP +PONG OK
- PHP 8.3.31 + 11/11 Laravel-required ext (pdo_pgsql, mbstring,
openssl, tokenizer, xml, ctype, json, bcmath, fileinfo, curl, pgsql)
- Composer 2.9.7
Что в коммите (59 файлов, 11059 строк скаффолда Laravel 11 +
правки):
- composer require predis/predis (v3.4.2) — PHP-only Redis-клиент,
т.к. php_redis ext не установлен (см. project_phase1_strategy.md)
- app/.env (gitignored) — APP_NAME=Liderra, APP_LOCALE=ru,
APP_TIMEZONE=Europe/Moscow, DB_CONNECTION=pgsql → liderra@localhost,
REDIS_CLIENT=predis
- app/.env.example — те же правки без секретов (для команды)
Smoke-test PG ↔ Laravel ↔ pdo_pgsql прошёл:
3/3 default-миграций → 9 таблиц в liderra (cache, cache_locks,
failed_jobs, job_batches, jobs, migrations, password_reset_tokens,
sessions, users).
Артефакт стартера app/database/database.sqlite (0 B) удалён —
sqlite не используется.
Что НЕ в этом коммите (следующие шаги фазы 1):
- Pest 3 swap (CTO-12) — composer remove phpunit + require pest
- Laravel Boost MCP + 9 guidelines disable по CLAUDE.md §5/§7
- Pint, Larastan, Roave/SecurityAdvisories, IDE Helper, squawk,
pgFormatter (Прил. Н #11–18)
- resources/boost/guidelines/vuetify.blade.php
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-08 09:37:16 +03:00 |
|