chore: add design tokens\css lint rules
This commit is contained in:
@@ -27,6 +27,13 @@
|
||||
реальные маршруты), на C19 при переименовании `kit/`→`ui/` — и компонентный
|
||||
glob. Не оставлять устаревшие пути в `eslint.config.js`.
|
||||
- Для `*.svelte` выключен `prefer-const` (пропсы в Svelte 5 пишутся через `let`).
|
||||
- **Единый запуск всей дизайн-проверки: `pnpm --dir web lint:all`**
|
||||
(`web/scripts/lint-all.mjs`) — гоняет по очереди: ESLint (все правила,
|
||||
включая design-tokens), stylelint (`lint:css`) и токен-аудит
|
||||
(`lint:tokens`). Каждый шаг выполняется, даже если предыдущий упал; выход
|
||||
ненулевой, если хоть один не прошёл. Текущие «ожидаемые долги» (hardcoded
|
||||
размеры в kit, не-Prefix токены в preview.css и т.п.) — техдолг: чинить
|
||||
только по заведённым tasks, не игнорировать правилом.
|
||||
|
||||
## Правила кода
|
||||
|
||||
@@ -70,6 +77,58 @@
|
||||
используется.
|
||||
- Все повторяющиеся визуальные элементы — отдельные компоненты в
|
||||
`web/src/lib/components/kit/`, даже «просто div с двумя стилями».
|
||||
- Токены нового дизайна живут в `design2.css`; `refs/` и `refs-html/` —
|
||||
одноразовый источник, не поддерживаемый (правки дизайна — сразу в код).
|
||||
|
||||
### Линтинг дизайн-токенов («единая точка правды» дизайна)
|
||||
|
||||
Запрещено «захардкоживать» дизайн: цвета, размеры, длительности и z-index
|
||||
обязаны приходить из CSS-переменных. Стек: **stylelint** прогоняется по всем
|
||||
CSS-файлам (`web/stylelint.config.js`), **ESLint** лезет в `<style>`-блоки
|
||||
svelte-компонентов через локальный плагин `web/eslint-plugins/design-tokens/`
|
||||
(постпрефес postcss AST от svelte-eslint-parser). Правила применяются к тем же
|
||||
scoped-путям (`kit/**`, `preview/**`).
|
||||
|
||||
Команды:
|
||||
|
||||
- `pnpm --dir web lint:css` — stylelint по всем `src/**/*.css` (`old.css` и
|
||||
`node_modules/build/.svelte-kit/static` игнорируются).
|
||||
- `pnpm --dir web exec node scripts/check-token-parity.mjs` — каждый цветовой
|
||||
токен из `:root` обязан иметь пару в `[data-theme="dark"]` и наоборот.
|
||||
Производные токены (значение содержит `var()`, напр. `oklch(from var(--...))`)
|
||||
из пары исключены — они наследуют тему автоматически. Дополнительно выводит
|
||||
**варнинг** о неиспользуемых токенах preview.css (определены, но нигде не
|
||||
используются) — выход не меняется (only parity = exit 1).
|
||||
|
||||
Токены-префиксы (целевой словарь дизайна):
|
||||
|
||||
- Цвета: `--color-*`, бренд `--brand-main` / `--brand-alt` — единственные
|
||||
две переменные, которым разрешено быть hex/rgb, остальные цвета — только
|
||||
`oklch()` и только в preview.css.
|
||||
- Размеры: `--space-*`, `--text-*` (font-size), `--radius-*`, `--size-*`.
|
||||
- Брейкпоинты: `--bp-mobile` (640px), `--bp-tablet` (800px), `--bp-desktop`
|
||||
(1100px) — mobile-first.
|
||||
- z-index: `--z-*`; длительности/анимации: `--duration-*`, `--ease-*`.
|
||||
- Правило `custom-property-pattern` в stylelint тестирует паттерн **без** `--`
|
||||
(`--x` → `x`), а `declaration-property-value-disallowed-list` — целиком с `--`.
|
||||
- `custom-property-empty-line-before` перенастроен (`after-custom-property` в
|
||||
`ignore`, не в `except`): пустые строки между подряд идущими токенами
|
||||
**свободны** и `--fix` их не удаляет — можно группировать цветовые и размерные
|
||||
токены в preview.css отдельными блоками.
|
||||
|
||||
Правила плагина (компоненты, `eslint.config.js`):
|
||||
|
||||
- `design-tokens/no-hardcoded-in-svelte` — запрет прямых цветов/размеров/
|
||||
длительностей/z-index и `color-mix()` (результат токенизировать в CSS).
|
||||
Исключения размеров: `0`, `0px`, `1px`, проценты и unitless (`line-height`).
|
||||
- `design-tokens/no-category-mismatch` — size-свойство не может использовать
|
||||
color-токен (`--color-*`/`--brand-*`) и наоборот.
|
||||
- `design-tokens/no-token-definition-in-svelte` — определение `--x:` в
|
||||
компоненте не может содержать примитив (hex/rgb/oklch/px/rem); допустимы
|
||||
производные от токенов (`var()`, `calc()`, unitless-числа).
|
||||
- `design-tokens/no-undefined-in-svelte` — `var(--x)` в `<style>` должен быть
|
||||
определён в `src/preview.css` (словарь токенов) или локально в компоненте.
|
||||
Файл читается один раз и кэшируется (не `glob`-зависим).
|
||||
|
||||
Линтер только показывает ошибки, старый код (непрефиксованные токены, hex в
|
||||
preview.css) — известный техдолг, его НЕ чинить и не игнорировать правилами.
|
||||
|
||||
- Коммиты мелкие (< ~500 строк), атомарные
|
||||
|
||||
Reference in New Issue
Block a user