feat(tradein): dev/CI preview route for a11y+lighthouse (#801) #803
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#803
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/801-preview-route"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
Dev/CI-only preview-маршрут «денежного экрана» на статичной фикстуре — разблокирует автоматический UI-аудит (axe/lighthouse). Решает #801.
Проблема: axe/lighthouse требуют отрендеренную страницу; live trade-in за auth-gate, локальный фронт без бэкенда = белый экран (RouteGuard висит на pending
/me).Как
src/app/ui-preview/estimate/{page,fixture}.tsx— рендерит реальные компоненты результата (HeroSummary + CianValuationCard + Distribution + Deals + StreetDeals + Exposure + PriceTrend) на фикстуреAggregatedEstimate, полностью оффлайн: собственныйQueryClientс засеянным фейковым/me→useMe/useBrandрезолвятся без сети.RouteGuard— bypass/ui-preview/*под флагом (RBAC к preview не применяется).NEXT_PUBLIC_ENABLE_PREVIEW=1(иначеnotFound) — в проде по умолчанию OFF. Папкаui-preview(не_-prefix — Next трактует_*как private/non-routable, отсюда первый 404).Проверено (локально, флаг включён)
color-contrast: teal#14b8a6на#f6f7f9, 14px → 2.32 (надо ≥4.5) — подпись в card-meta.svg-img-alt: recharts scatter-точки (role="img") безaria-label/title (3 ноды).tsc --noEmitclean, pre-commit passed.Использование
CI: собрать с
NEXT_PUBLIC_ENABLE_PREVIEW=1,next start, навести axe/lighthouse на/ui-preview/estimate.Followup
Найденные axe-дефекты (контраст teal, svg-alt recharts) — отдельными issue после merge.
Refs #801.
UI-аудит инструментами (axe/lighthouse) требует отрендеренную контентную страницу. Live trade-in за auth-gate, локальный фронт без бэкенда = белый экран (RouteGuard висит на pending /me). Добавлен оффлайн preview «денежного экрана». - src/app/ui-preview/estimate/{page,fixture}.tsx — рендерит реальные компоненты результата (HeroSummary + Cian + Distribution + Deals + StreetDeals + Exposure + PriceTrend) на статичной фикстуре AggregatedEstimate, без сети: свой QueryClient с засеянным фейковым /me (useMe/useBrand резолвятся оффлайн). - RouteGuard: bypass /ui-preview/* под флагом (RBAC к preview не применяется). - Гейт: NEXT_PUBLIC_ENABLE_PREVIEW=1 (иначе notFound) — в проде по умолчанию off. Папка ui-preview (НЕ _-prefix: Next трактует _* как private/non-routable). Проверено локально (NEXT_PUBLIC_ENABLE_PREVIEW=1): страница рендерится оффлайн, axe (wcag2a/aa) дал baseline — 2 serious: color-contrast (teal #14b8a6 на светлом 2.32<4.5) + svg-img-alt (recharts scatter без accessible text). tsc clean. Refs #801. Followup: фиксы найденных axe-дефектов отдельными issue.✅ APPROVE
Dev/CI preview-маршрут (#801). RBAC-bypass проверил тщательно (ключевой риск).
Security (RBAC bypass) — корректно gated
ENABLED = NEXT_PUBLIC_ENABLE_PREVIEW === "1"; pageif (!ENABLED) notFound()→ 404 в проде. RouteGuard-bypassif (ENABLE_PREVIEW && rawPath.startsWith("/ui-preview"))— тоже flag-gated. Double-gated: в проде (флаг unset, build-time) и bypass-условие false, И страница notFound → маршрут мёртв, RBAC не затронут.PREVIEW_USER(admin) засеян только в QueryClient самой preview-страницы (render-scoped) чтобыuseMe/useBrandрезолвились оффлайн — не privilege escalation (нет реального/me, нет токена, scope = preview-поддерево).Correctness — рендерит реальные result-компоненты на фикстуре полностью оффлайн — ровно что нужно axe/lighthouse.
ui-preview-папка (не_-prefix, который Next трактует non-routable). tsc clean, pre-commit passed. axe baseline (2 serious: teal-контраст 2.32, recharts svg-alt) задокументированы как post-merge follow-up — их обнаружение валидирует работу маршрута.Scope — RouteGuard.tsx = app auth-код (не bot-pipeline/self-extending файл); RBAC-правка — легитимный предмет #801, gated, без расширения bot-merge-прав. Нет backend, нет secrets.
Verdict: ✅ APPROVE (#801). Advisory: прод-build/deploy НЕ должен выставлять
NEXT_PUBLIC_ENABLE_PREVIEW=1(deploy-config дисциплина) — ops/QA подтвердить; 2 axe-находки → follow-up issues.