Дмитрий
79248f33fe
feat(deals): sweep 14->5 funnel slugs — controllers, mocks, stories, tests
2026-05-18 03:42:41 +03:00
Дмитрий
73e67585bd
refactor(deals): A9 review nits — drop duplicate spec, single Pinia, accurate comment
2026-05-18 03:42:40 +03:00
Дмитрий
016e9b09ae
refactor(deals): extract DealDetailBody; DealDetailDrawer = overlay/inline wrapper
2026-05-18 03:42:40 +03:00
Дмитрий
b1ea9208c2
feat(deals): DealsBulkBar — status-change only (drop export/delete/trash)
2026-05-18 03:42:40 +03:00
Дмитрий
583e1986ff
feat(deals): DealsTable — lead-registry columns (Телефон/Источник/Город/Статус/Напоминание/Комментарий/Поставлен)
2026-05-18 03:42:40 +03:00
Дмитрий
b336752851
feat(deals): DealsFilters — phone search + Status/Project/City selects
2026-05-18 03:42:40 +03:00
Дмитрий
5bd3a366e3
feat(deals): redesign groundwork — spec, plan, mockups + sidebar nav cleanup
...
Deals page redesign: design spec + implementation plan (Phase A page redesign,
Phase B 14->5 status funnel) + v8 HTML mockups (variants comparison + final).
AppSidebar: remove Импорт данных / Отчёты nav links (routes stay reachable by
direct URL); AppLayout.spec updated to 6 nav items. stylelint --fix on mockups;
cspell-words += deals-redesign terms.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 03:42:39 +03:00
Дмитрий
2c90349fb3
feat(projects): RegionsBulkDialog — subject-level regions (89 RF subjects) #1426
...
Bulk regions dialog reworked from federal-district bitmask to subject/region
selection, consistent with ProjectDetailsDrawer/NewProjectDialog. Full-stack:
add_regions/remove_regions on projects.regions INT[], BulkProjectActionRequest
split validation, ProjectService model-instance update. federal-districts.ts
removed (zero consumers). +menuRepositionFix util for v-autocomplete menu.
phpstan-baseline: bump actingAs ignore count 14->15 (new validation test).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-18 03:41:46 +03:00
Дмитрий
c847c02441
merge: C9 — Plan 6 регионы субъект-уровня в портал
...
# Conflicts:
# app/tests/Feature/Plan4/Schema/SchemaDeltaTest.php
# db/CHANGELOG_schema.md
# db/schema.sql
2026-05-17 09:30:21 +03:00
Дмитрий
05183c32d7
refactor(polling): вынести интервалы в constants/polling.ts — Sprint 6 F4
2026-05-17 08:18:44 +03:00
Дмитрий
ff96e2f7ad
fix(admin): I4 — devPlainCode-баннер за import.meta.env.DEV
2026-05-17 07:13:51 +03:00
Дмитрий
347f54957d
fix(deals): I3 — убрать mock-fallback в NewDealDialog/DealDetailDrawer
2026-05-17 07:13:50 +03:00
Дмитрий
0b146e48b9
feat(billing): E2 — disabled+tooltip на кнопках Автопополнение/Сменить тариф
2026-05-17 05:24:43 +03:00
Дмитрий
2b14071fda
style(ui): Sprint 5B — prettier-формат затронутых файлов
...
Регрессия full: prettier --check на 5 файлах, тронутых Sprint 5B
(T2/T3/T4). Whitespace-only, 0 изменений поведения — Vitest 67/67
на затронутых спеках. Pre-existing prettier-дрейф 28 НЕ-5B файлов
оставлен (вне scope спринта).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-17 04:03:36 +03:00
Дмитрий
e40a575a5a
feat(ui): C6 — degradation-alert в NewDealDialog при провале загрузки списков
2026-05-17 03:48:39 +03:00
Дмитрий
4584eb95c0
fix(ui): B3 — ⌘K open-only + DOM-тесты палитры (review-fixup)
2026-05-17 03:33:51 +03:00
Дмитрий
dc3773b4fb
feat(ui): B3 — минимальная ⌘K command-palette навигации
2026-05-17 03:28:05 +03:00
Дмитрий
d8d60ae0a0
docs(ui): B2 — актуализация комментариев AppSidebar (review-fixup)
...
Code-quality review T1: stale JSDoc «Counts — mock» теперь ложный
(count live из API); +поясняющий комментарий к null→undefined цепочке.
Comment-only, 0 изменений поведения. Vitest 6/6 green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-17 03:20:02 +03:00
Дмитрий
84fbd56215
feat(ui): B2 — счётчик «Сделки» в сайдбаре из API вместо хардкода
2026-05-17 03:14:13 +03:00
Дмитрий
4c92d564de
feat(import): маршрут /import + сайдбар + инструкция H9
...
- router/index.ts: добавлен маршрут /import (name=import, layout=app,
requiresAuth=true, transition=ld-route-fadeup, devIndex=29)
- AppSidebar.vue: пункт «Импорт данных» (mdi-database-import-outline)
добавлен в группу «Работа» следом за Дашборд
- router.spec.ts: TDD-кейс маршрута /import (layout=app, requiresAuth=true)
- docs/Как_перенести_данные_из_crm-bp-gr.md: инструкция H9 (4 шага + таблица ошибок)
- cspell-words.txt: добавлены формы глагола «замапить»
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 20:14:04 +03:00
Дмитрий
4cccf9ef22
feat(import): api/imports.ts + UnknownStatusesDialog (wizard маппинга)
...
- api/imports.ts: типы ImportLogResource/UnknownStatus/StatusMapping,
функции uploadImport/listImports/getImport/getUnknownStatuses/resolveUnknownStatuses
(apiClient из ./client, стиль api/dashboard.ts)
- UnknownStatusesDialog.vue: wizard маппинга незамапленных статусов воронки
(ТЗ §6.4/§6.6), 14 канонических slug, defineExpose(selection, save)
- Vitest 3/3 (tests/Frontend/UnknownStatusesDialog.spec.ts)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 19:58:33 +03:00
Дмитрий
9ccd960714
feat(reports): кнопка «Скачать» → signed download URL (F2 frontend)
2026-05-16 12:45:51 +03:00
Дмитрий
56b4c3e282
feat(deals): deep-link /deals?openId= из напоминаний и колокольчика (audit C8/F3)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
6098bb0b77
revert(nav): откат B1 «Напоминания» в сайдбаре — конфликт с решением заказчика
...
Откат 4342dc7 . Audit B1 предлагал вернуть «Напоминания» в сайдбар, но
пункт был намеренно убран по требованию заказчика (commit 5c8ad27
«sidebar cleanup»; тест AppLayout.spec.ts фиксирует «Напоминания убраны
по требованию заказчика»). Решение заказчика 2026-05-16: B1 → won't-do,
пункт остаётся убранным. Восстанавливает зелёный AppLayout.spec.ts.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 10:04:13 +03:00
Дмитрий
e708825e1a
feat(admin): ImpersonationBanner — глобальный индикатор активных сессий (audit B5)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 09:59:43 +03:00
Дмитрий
4342dc7fe2
feat(nav): AppSidebar — пункт «Напоминания» в группе «Работа» (audit B1)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 09:40:00 +03:00
Дмитрий
ae9f534f5a
fix(billing): TopupDialog NaN-guard + state reset on open (Task 5 review)
...
Code-quality review fixups: Number.isFinite-guard в amountError/canSubmit
(очищенное number-поле не должно включать кнопку); watch(model) сбрасывает
amount/errorMsg при открытии (паттерн ReminderDialog, нет префилла/race);
комментарий про намеренный refetch в onTopupSuccess; flushPromises в spec.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 08:29:05 +03:00
Дмитрий
2c7281291b
feat(billing): TopupDialog + Пополнить wiring (E1)
...
TopupDialog (сумма + пресеты + min 100 ₽ валидация) → POST
/api/billing/topup. Кнопки «Пополнить баланс» (шапка) и «Пополнить»
(BalanceCard) открывают диалог; при успехе — refresh кошелька +
транзакций + snackbar.
Sprint 2 Plan C, audit E1 (frontend).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 08:16:08 +03:00
Дмитрий
12289cb415
feat(billing): TransactionsTable + InvoicesTable real API (E3)
...
TransactionsTable — server-driven история транзакций (GET
/api/billing/transactions, табы → фильтр type). InvoicesTable —
GET /api/billing/invoices с empty-state (real-but-empty до Б-1).
billingFormatters почищен (drop status/format-функций), mockBilling
ужат до pending-баннера (E4).
Sprint 2 Plan C, audit E3 (frontend pt2).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 07:56:22 +03:00
Дмитрий
92f5973a95
feat(billing): BillingView wallet + BalanceCard real API (E3)
...
api/billing.ts (getWallet) + BillingView тянет GET /api/billing/wallet
на mount (шапка + BalanceCard, loading/error-state). BalanceCard на
реальные props с nullable-тарифом. featureLabel для feature-слагов.
Sprint 2 Plan C, audit E3 (frontend pt1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 07:32:59 +03:00
Дмитрий
be32d9121f
feat(auth): /legal/offer + /legal/privacy stub pages (closes A7)
...
Audit A7: the «Оферта» / «Политика» links in the AuthLayout footer were
raw <a href> pointing at unrouted paths -> 404 via the SPA catch-all.
Adds a single DRY LegalDocView served by /legal/:doc(offer|privacy),
rendering an honest «document being finalized» stub (real legal text
needs юр. редактура — реестр K3 / blocker Б-1). Footer links upgraded
to <RouterLink> for SPA navigation. Also refreshes two stale auth-layout
doc-comments left by the /recovery removal (review M1).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-15 19:37:20 +03:00
Дмитрий
ac934af699
fix(projects): C5 — replace window.alert() with v-snackbar in BulkActionsBar
...
window.alert блокирует UI thread, не accessible (a11y), breaks браузерный
automation (Playwright/Selenium). Заменено на v-snackbar (timeout 6s,
color warning, location bottom-right, кнопка «Закрыть»). Текст идентичен:
«Применено: N. Пропущено: M (конфликт с уже доставленными лидами).»
+2 Vitest specs (snackbar opens / snackbar НЕ opens at skipped=0).
window.confirm для pause/resume/archive намеренно оставлен — это
deliberate blocking прерывание для деструктивных операций (UX-pattern).
Closes audit ID C5 from docs/superpowers/specs/2026-05-15-portal-audit-design.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-15 09:02:47 +03:00
Дмитрий
0c96d96784
feat(ui): subject-level regions autocomplete in NewProjectDialog + PDD (Plan 6 Task 5)
...
- projectsStore: Project.regions?: number[] interface field
- NewProjectDialog: replace interim placeholder с v-autocomplete (89
subjects + federal district subtitle); form drops region_mask/region_mode
(backend dual-writes)
- ProjectDetailsDrawer: replace maskToCodes/encode-watch с direct
form.regions binding; same v-autocomplete component
- Vitest: +2 NewProjectDialog tests (count=89, POST payload includes regions[]);
refactor 3 existing PDD region tests на regions[] model
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-15 05:54:05 +03:00
Дмитрий
0e5e5a9d30
feat(pdd): regions multi-select autocomplete + bitmask binding
...
Реализует Out-of-plan «Region multi-select autocomplete» из parent PDD spec.
Spec: d0ee2d8 . Plan: 9e86519 .
Component (ProjectDetailsDrawer.vue):
- import REGIONS из constants/regions
- selectedRegions: Ref<number[]> + selectableRegions (filter code !== 0
для исключения «Вся РФ» sentinel — fixes latent NewProjectDialog bug)
- maskToCodes(mask): reverse-decompose bits 1..31
- reseedFromProject: +selectedRegions.value = maskToCodes(form.region_mask)
- watch(selectedRegions): forward-encode mask + mode (include при empty, exclude иначе)
- Template: v-autocomplete multi+chips+clearable между Лимитом и Днями
Tests (ProjectDetailsDrawer.spec.ts): 17 passed (14 prior + 3 new):
- renders region chips when project has non-zero region_mask
- selecting regions encodes mask + sets mode=exclude on save
- clearing all regions resets mask=0 + mode=include on save
NB: config.global.plugins = [createVuetify()] добавлен в spec.ts — v-autocomplete
требует Vuetify defaults provide context. Все 17 PDD tests + 8/1sk ProjectsView
integration green (0 regressions).
Backend без изменений (region_mask + region_mode payload уже в Task 5 onSave).
2026-05-14 17:51:56 +03:00
Дмитрий
f4c17c375d
feat(pdd): Delete button with confirm + archive + close
2026-05-14 14:54:55 +03:00
Дмитрий
170cd4aea2
feat(pdd): Pause/Resume button with toggleActive + dynamic label
2026-05-14 14:48:24 +03:00
Дмитрий
fdb344bdc4
feat(pdd): Save action — PATCH /api/projects/{id} + 422 errors
2026-05-14 14:41:28 +03:00
Дмитрий
09dc29ee0f
feat(pdd): reseed form on project.id change
2026-05-14 14:35:54 +03:00
Дмитрий
596df62289
feat(pdd): emit close on X/Cancel/ESC
2026-05-14 14:28:49 +03:00
Дмитрий
15f6f9ca5c
feat(pdd): render project name/limit/days form fields
2026-05-14 14:21:07 +03:00
Дмитрий
e4a0bb8cf9
test(pdd): scaffold ProjectDetailsDrawer + null-project no-open test
2026-05-14 14:13:52 +03:00
Дмитрий
687456ff27
fix(a11y): .sep dot separator contrast 2.92:1 → 5.33:1 (Pattern B)
...
A11y rescan Pattern B — scoped CSS `.sep { color: #92907b; }` повторяется
в 8 компонентах (page-stats / page-meta / hero-meta containers с точкой-
разделителем `·`). На ivory page background #f6f3ec даёт contrast
2.92:1, ниже WCAG 2.1 AA 4.5:1 threshold.
Fix: #92907b → #6b6356 — same warm-grey hue, darker tone, gives
5.33:1 contrast. 8 files:
- views/{DealsView,BillingView,KanbanView,ReportsView}.vue
- components/dashboard/DashboardPageHead.vue
- components/deals/DealDetailHero.vue
- components/admin/tenants/TenantsStatsHeader.vue
- components/admin/tenant-detail/TenantDetailHeader.vue
Closes Pa11y «color-contrast» violations на /dashboard /billing /reports
(8 .sep elements total flagged).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-14 10:07:11 +03:00
Дмитрий
6480aae75e
fix(a11y): add aria-label to mobile nav-icon button (closes Pattern A)
...
A11y rescan Pattern A — Vuetify <v-app-bar-nav-icon class="d-md-none">
без accessible name. Pa11y/axe видит button в DOM даже на desktop где
он hidden via CSS — флагает «button-name» violation на 9 AppLayout views
(/dashboard, /deals, /kanban, /projects, /billing, /settings, /reports,
/reminders, /admin/tenants).
Fix: AppTopbar.vue:90-94 — `aria-label="Открыть меню навигации"`.
Closes 9 of 14 authenticated routes' a11y violations (down 14→5 affected
URLs after this commit).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-14 10:06:52 +03:00
Дмитрий
98e07d44e0
chore(p3): close P3 tooling and structural mini-fixes
...
Closes Audit #3 P3 batch.
Changes:
1. **knip.config.ts cleanup** — remove 4 stale config hints flagged in
Audit #3 Phase 1B (`ignore: tests/**` redundant since `project` is
`resources/js/**`; `ignoreDependencies` for vitest/@vue/test-utils/jsdom
redundant since knip auto-detects test frameworks). Add `histoire.config.ts`
+ `resources/js/histoire.setup.ts` to entry — closes 2 documented FPs
(histoire.setup.ts + @histoire/plugin-vue unused-flag). Verified:
`npx knip` exits 0 clean.
2. **Admin table actions column header label** — change `title: ''` →
`title: 'Действия'` in:
- TenantsTable.vue (actions column, /admin/tenants)
- AdminSupplierPricesView.vue (actions column, /admin/supplier-prices)
Closes axe-core `empty-table-header` violation seen in Audit #3 Phase 7
on /admin/tenants. Header is now visible in UI (better UX than sr-only
sleight-of-hand).
3. **npm overrides for lodash** in `package.json` — pin `pa11y-ci > lodash`
to ^4.17.21. Verified: `npm ls lodash` resolves to lodash@4.17.23 (latest
4.x; CVE-2021-23337 + GHSA-f23m patched in <4.17.21, our version is above
that). npm audit may still surface advisory ranges as informational.
4. **Decision doc for pgFormatter (Q.HARD.002)** — explicit FIX-DEFER with
3-hypothesis comparison (Strawberry Perl install vs sqlfluff replacement
vs Docker pg_format vs drop SQL formatting). Decision: drop automated
SQL formatting until Б-1 closure; squawk (linter) covers correctness.
Addendum: axe-core .v-overlay-container region landmark — no permanent
axe-core test setup exists, so no whitelist needed at this point.
Verification:
- knip: 0 issues
- vue-tsc: 0 errors
- ESLint: 0 errors
- Vitest: 91 files / 736 passed / 3 skipped (no regressions)
- Vite build: 2.03s
Plan: docs/superpowers/plans/2026-05-14-audit3-deferred-fixes.md Task 4.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-14 08:38:51 +03:00
Дмитрий
dc191ef09a
fix(a11y): add aria-label to VTooltip on /admin/tenants impersonate btn
...
Audit #2 Phase 10.2 P2: axe-core 4.10 reported aria-tooltip-name
violation — <div role="tooltip"> had no accessible name. Adding
aria-label to <v-tooltip> passes it through to the rendered overlay.
Verified: axe-core on /admin/tenants — 0 tooltip violations post-fix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-13 13:38:21 +03:00
Дмитрий
9f835162e7
style(frontend): apply prettier --write — fix formatting drift
...
4 files reformatted (import list expansion, line-length wrapping).
Vitest 88/683+3sk green.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-13 13:30:51 +03:00
Дмитрий
d9fc3d92e4
fix(a11y): Q.DEFER.004 sub-A — DealsTable show-select bulk-checkbox aria-label
...
VDataTable show-select prop генерировал unlabeled checkbox per row + select-all
header — axe-core критичная label violation (6 nodes на demo seed).
Override через Vuetify 3.12 typed slots:
- header.data-table-select → aria-label='Выбрать все сделки'
- item.data-table-select → aria-label='Выбрать сделку «{{name}}»' (per row)
Test coverage: tests/Frontend/DealsTable.spec.ts (2 specs).
2026-05-13 00:28:39 +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
Дмитрий
fff2dff499
fix(a11y): ErrorView 404 support-link contrast 2.77 → 12+ (Q.DEFER.002 partial)
...
Phase 10 audit Pa11y нашёл WCAG2AA G18 contrast Fail на 404 ErrorView
support link: `<a class="text-primary">support@liderra.app </a>`.
Diagnosis через Playwright browser_evaluate computed-style:
- Link color: rgb(15, 110, 86) = #0F6E56 (Vuetify text-primary = Forest teal)
- Parent `.v-main.error-main` bg: rgb(1, 32, 25) = #012019 (теало-нуар)
- Contrast: 2.77:1 < 4.5:1 → WCAG2AA Fail
Pa11y предложил `#fcfffe` (white-on-white false-suggest). Реальный fix —
заменить teal на light color, читаемый на noir.
Изменения ErrorMeta.vue:56,98:
- class="text-primary" → class="err-help__link"
- + локальный CSS class:
.err-help__link { color: #d3dad8; text-decoration: underline; }
.err-help__link:hover { color: #ffffff; }
Color #d3dad8 vs #012019 = contrast ~12:1 (passes WCAG AAA).
Verify (после `npx vite build` чтобы Laravel переключился на production assets;
dev HMR через :5175 продолжал отдавать cached chunk):
- npx pa11y --standard WCAG2AA http://127.0.0.1:8000/no-such-path-404 → **No issues found** ✅
- npx vue-tsc --noEmit → 0 errors
- npx vitest run → 79/79 files, 614/614 + 3 skipped (0 regression)
Forgot-alert contrast (другие 2 Pa11y errors на /forgot) — Vuetify info-variant
theme, требует design-decision Платон/брендбук; defer в Q.DEFER.002 (A).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-12 20:51:55 +03:00
Дмитрий
cb05657f30
chore(format): prettier --write across 37 .vue/.ts files
...
Phase 1B audit found 48 files failing `prettier --check`. Auto-apply
via `npx prettier --write resources/js/**/*.{ts,vue,css}` produced
style-only changes:
- consistent quote style
- trailing comma normalization
- spaces around : in v-card style="position: relative" attrs
- explicit ; insertion
No semantic changes. No code-behavior changes. Production-code only;
test files batched separately into `test(frontend):` commit.
Verification:
- npx vitest run → 79/79 files, 614/614 + 3 skipped (no regression).
- npx vue-tsc --noEmit → 0 errors.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-12 20:24:33 +03:00