# Phase 3: Token purification — 265 hardcoded colors → vars

**Status:** ⬜ Not Started
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** frontend

## Objective

Заменить 265 хардкодных brand-цветов в lab-related files на `var(--token)` где это семантически корректно. Сохранить curated palettes (subject-specific colors) и canvas-fillStyle (CSS vars не resolve'ятся в canvas context).

## Tasks

- [ ] Идентифицировать все хардкоды в:
  - `frontend/lab.html` (HTML body + remaining inline styles)
  - `frontend/css/lab.css` (после Phase 1)
  - `frontend/js/labs/lab-glue.js` (после Phase 2)
- [ ] Заменить direct token matches:
  - `#9B5DE5` → `var(--violet)`
  - `#06D6E0` → `var(--cyan)`
  - `#06D664` → `var(--green)` (also `#06D6A0` если есть)
  - `#F15BB5` → `var(--pink)`
  - `#FFB347` → `var(--amber)`
  - `#0F172A` → `var(--text)`
  - `#3D4F6B` → `var(--text-2)`
  - `#56687A` → `var(--text-3)`
  - `#EEF2FF` → `var(--bg)`
- [ ] KEEP (НЕ менять):
  - Tinted/alpha (`rgba(155,93,229,0.12)` etc.) — CSS не имеет color-mix() без deps
  - Canvas `ctx.fillStyle = "#..."` — CSS vars не работают в canvas
  - Curated subject palettes (bio violet / chem green / math cyan / phys amber) если они вложены массивом
  - Slightly-different shades (`#9B5DE6` ≠ `#9B5DE5`) — это намеренно другой цвет
- [ ] Semantic aliases: использовать `var(--danger)` / `var(--success)` / `var(--warning)` / `var(--info)` в semantic context

## Files to Modify

- `frontend/lab.html` — заменить hardcodes
- `frontend/css/lab.css` (после Phase 1) — заменить hardcodes
- `frontend/js/labs/lab-glue.js` (после Phase 2) — заменить hardcodes если есть

## Acceptance Criteria

- Хардкодов brand-colors ≤ 30 (от 265, target 90%+ replacement)
- Визуально lab выглядит идентично
- Pre-commit hook passes
- No regression в любой sim

## Notes

- Lab.html сейчас содержит много inline `style="color: #XXX"` — multi-line replacement через ast-index search + manual replacement
- Don't over-aggressive — если color используется один раз в curated palette decoration, лучше keep
- Document log: "Заменено: N, оставлено: M (reasons listed)"

## Review Checklist

- [ ] Counts reported: before / after
- [ ] Spot-check 3 sims визуально (canvas рендеринг не поменялся)
- [ ] No emoji в коде
- [ ] Pre-commit hook passes

## Handoff to Next Phase

<!-- Implementer: какие места были tricky, есть ли паттерны которые нужно унифицировать в будущем. -->
