# `/__preview/*` — mock-render маршруты для UI-аудита (issue #801)

Dev/CI-only страницы, которые рендерят «тяжёлый» UI на **статичных fixture**
без единого сетевого запроса. Нужны потому, что live-фронт за auth-gate (Caddy
basic_auth), а dev без бэкенда отвечает `/api/v1/me` + `/estimate` 401 /
network-fail → реальные страницы рендерят пустой EmptyState / NoAccessScreen.
axe / lighthouse требуют **reachable rendered content** — его и даёт preview.

## Маршруты

| URL | Рендерит | Fixture |
|---|---|---|
| `/__preview/estimate` | `<EstimateResult>` — HeroSummary + price-range bar + таблицы аналогов/сделок («денежный экран» Trade-In) | `src/lib/mocks/trade-in-estimate.ts` |

> Folder назван `%5F%5Fpreview` (URL-encoded `__preview`): App Router исключает
> из роутинга папки с leading `_`, поэтому underscore-сегмент задаётся `%5F`.

## Гарды (preview не утекает в prod)

1. **Страница** 404'ит (`notFound()`), если не выполнено
   `NODE_ENV !== "production"` **или** `NEXT_PUBLIC_ENABLE_PREVIEW=true`.
   В `next dev` доступна всегда; в собранном prod-build — только при явном флаге.
2. **RouteGuard** (`components/auth/RouteGuard.tsx`) пропускает `/__preview/*`
   без вызова `/me`, иначе network-fail подменил бы content на `<NoAccessScreen>`.

## Локальный прогон аудита

```bash
# 1. Поднять preview без бэкенда (NODE_ENV=development → preview включён)
cd frontend && npm run dev          # http://localhost:3000/__preview/estimate

# 2a. axe (a11y) — через @axe-core/cli или @axe-core/playwright
npx @axe-core/cli http://localhost:3000/__preview/estimate

# 2b. lighthouse (CWV: LCP / CLS / TBT)
npx lighthouse http://localhost:3000/__preview/estimate \
  --only-categories=performance,accessibility \
  --preset=desktop --output=json --output-path=./lh-estimate.json
```

Для собранного build вместо `dev`:
```bash
NEXT_PUBLIC_ENABLE_PREVIEW=true npm run build && \
NEXT_PUBLIC_ENABLE_PREVIEW=true npm run start
```

## Baseline-метрики (заполнить после первого реального прогона)

Зафиксировать здесь, чтобы ловить регрессии (DoD #801). Прочерки — TODO
followup-issue: реальный axe/lighthouse прогон.

| Метрика | Baseline | Дата | Порог регрессии |
|---|---|---|---|
| axe violations (critical/serious) | _TODO_ | — | 0 critical |
| lighthouse a11y score | _TODO_ | — | ≥ 90 |
| LCP (desktop) | _TODO_ | — | ≤ 2.5 s |
| CLS | _TODO_ | — | ≤ 0.1 |

> Известные кандидаты-дефекты для followup-issue (UI-аудит 2026-05-30, #559):
> контраст `text-xs` / `#9ca3af` на белом, ARIA на sortable `<th>` таблиц
> (`AnalogsTable`), LCP/CLS от Hero + фото-ячеек.

## CI (опционально — вне scope #801, отдельный followup)

Деп `@axe-core/playwright` + `lighthouse` не добавлены в `package.json` (правило:
изменение deps требует regen lockfile, иначе deploy aborts). Интеграция в
`.forgejo/workflows/ci.yml` — отдельная задача для devops-engineer: поднять
`npm run dev`, прогнать команды выше, fail job при превышении порогов.
