dsh-desktop-kit 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +87 -2
- package/client.js +3349 -0
- package/cordis.patch.yml +5 -0
- package/index.js +80 -0
- package/package.json +60 -4
- package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
- package/plugins/dsh-gkb-ru-ui/lib/client.js +1083 -0
- package/plugins/dsh-gkb-ru-ui/lib/index.js +142 -0
- package/plugins/dsh-gkb-ru-ui/lib/skills.js +376 -0
- package/plugins/dsh-gkb-ru-ui/package.json +28 -0
- package/plugins/dsh-peak-guard/README.md +70 -0
- package/plugins/dsh-peak-guard/client.js +741 -0
- package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
- package/plugins/dsh-peak-guard/icon.svg +12 -0
- package/plugins/dsh-peak-guard/index.js +2 -0
- package/plugins/dsh-peak-guard/locale/en.json +6 -0
- package/plugins/dsh-peak-guard/locale/ru.json +6 -0
- package/plugins/dsh-peak-guard/locale/zh.json +6 -0
- package/plugins/dsh-peak-guard/package.json +33 -0
- package/plugins/dsh-profile-transfer/README.md +62 -0
- package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-/320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/232/320/220.md +42 -0
- package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
- package/plugins/dsh-profile-transfer/bootstrap//320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/230/320/242/320/254.cmd +5 -0
- package/plugins/dsh-profile-transfer/client.js +806 -0
- package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
- package/plugins/dsh-profile-transfer/icon.svg +13 -0
- package/plugins/dsh-profile-transfer/index.js +375 -0
- package/plugins/dsh-profile-transfer/locale/en.json +6 -0
- package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
- package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
- package/plugins/dsh-profile-transfer/package.json +36 -0
- package/plugins/dsh-profile-transfer/transfer.js +1004 -0
- package/plugins/dsh-project-memory/README.md +71 -0
- package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
- package/plugins/dsh-project-memory/icon.svg +12 -0
- package/plugins/dsh-project-memory/index.js +1240 -0
- package/plugins/dsh-project-memory/locale/en.json +6 -0
- package/plugins/dsh-project-memory/locale/ru.json +6 -0
- package/plugins/dsh-project-memory/locale/zh.json +6 -0
- package/plugins/dsh-project-memory/package.json +26 -0
- package/plugins/dsh-session-move/README.md +67 -0
- package/plugins/dsh-session-move/client.js +719 -0
- package/plugins/dsh-session-move/cordis.patch.yml +5 -0
- package/plugins/dsh-session-move/icon.svg +14 -0
- package/plugins/dsh-session-move/index.js +497 -0
- package/plugins/dsh-session-move/locale/en.json +6 -0
- package/plugins/dsh-session-move/locale/ru.json +6 -0
- package/plugins/dsh-session-move/locale/zh.json +6 -0
- package/plugins/dsh-session-move/package.json +31 -0
- package/skills/code-review-checklist/SKILL.md +37 -0
- package/skills/content-writing/README.md +87 -0
- package/skills/content-writing/SKILL.md +348 -0
- package/skills/content-writing/assets/checklists/fact-check.md +53 -0
- package/skills/content-writing/assets/checklists/publish.md +65 -0
- package/skills/content-writing/assets/checklists/social.md +40 -0
- package/skills/content-writing/assets/templates/article.md +47 -0
- package/skills/content-writing/assets/templates/brief.md +44 -0
- package/skills/content-writing/assets/templates/doctor-card.md +41 -0
- package/skills/content-writing/assets/templates/image-prompts.md +128 -0
- package/skills/content-writing/assets/templates/post-telegram.md +36 -0
- package/skills/content-writing/assets/templates/post-vk.md +42 -0
- package/skills/content-writing/assets/templates/press-release.md +56 -0
- package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
- package/skills/content-writing/assets/templates/service-card.md +46 -0
- package/skills/content-writing/references/anti-ai-style.md +248 -0
- package/skills/content-writing/references/editing.md +185 -0
- package/skills/content-writing/references/fact-checking.md +205 -0
- package/skills/content-writing/references/government-medical.md +246 -0
- package/skills/content-writing/references/images.md +212 -0
- package/skills/content-writing/references/journalism.md +252 -0
- package/skills/content-writing/references/science-popular.md +218 -0
- package/skills/content-writing/references/seo-content.md +172 -0
- package/skills/content-writing/references/social-media.md +253 -0
- package/skills/content-writing/references/templates.md +291 -0
- package/skills/database-safety/SKILL.md +31 -0
- package/skills/debugging-playbook/SKILL.md +39 -0
- package/skills/design-critique/SKILL.md +118 -0
- package/skills/dev-workflow/SKILL.md +41 -0
- package/skills/git-and-ci/SKILL.md +40 -0
- package/skills/pg-upgrade-verify/SKILL.md +48 -0
- package/skills/project-deep-dive/SKILL.md +170 -0
- package/skills/project-deep-dive/references/recon-commands.md +78 -0
- package/skills/project-deep-dive/references/section-templates.md +102 -0
- package/skills/project-memory-maintenance/SKILL.md +170 -0
- package/skills/project-memory-maintenance/references/journal-template.md +48 -0
- package/skills/project-memory-maintenance/references/section-rules.md +57 -0
- package/skills/release-and-deploy/SKILL.md +39 -0
- package/skills/requirements-and-planning/SKILL.md +115 -0
- package/skills/security-review/SKILL.md +36 -0
- package/skills/seo/README.md +60 -0
- package/skills/seo/SKILL.md +329 -0
- package/skills/seo/assets/README.md +66 -0
- package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/seo/assets/scripts/README.md +179 -0
- package/skills/seo/assets/scripts/lib/args.mjs +105 -0
- package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
- package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
- package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
- package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
- package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
- package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
- package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
- package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
- package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
- package/skills/seo/assets/snippets/meta.blade.php +61 -0
- package/skills/seo/assets/snippets/robots.txt +61 -0
- package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
- package/skills/seo/assets/snippets/sitemap.xml +36 -0
- package/skills/seo/references/audit-checklist.md +305 -0
- package/skills/seo/references/content-seo.md +198 -0
- package/skills/seo/references/eeat-medical.md +217 -0
- package/skills/seo/references/measurement.md +223 -0
- package/skills/seo/references/on-page.md +209 -0
- package/skills/seo/references/stack-recipes.md +693 -0
- package/skills/seo/references/structured-data.md +485 -0
- package/skills/seo/references/technical-seo.md +294 -0
- package/skills/service-desk-conventions/SKILL.md +40 -0
- package/skills/service-desk-db-safety/SKILL.md +52 -0
- package/skills/service-desk-release/SKILL.md +43 -0
- package/skills/service-desk-testing/SKILL.md +47 -0
- package/skills/service-desk-ui/SKILL.md +33 -0
- package/skills/skills-router/SKILL.md +91 -0
- package/skills/testing-strategy/SKILL.md +37 -0
- package/skills/ui-design-system/SKILL.md +45 -0
- package/skills/web-research/SKILL.md +40 -0
- package/skills/wow-design/SKILL.md +168 -0
- package/skills/wow-design/assets/kit/README.md +195 -0
- package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
- package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
- package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
- package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
- package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
- package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
- package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
- package/skills/wow-design/assets/kit/showcase.html +1164 -0
- package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
- package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/wow-design/assets/scripts/README.md +312 -0
- package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
- package/skills/wow-design/assets/scripts/capture.mjs +337 -0
- package/skills/wow-design/assets/scripts/package.json +30 -0
- package/skills/wow-design/references/anti-patterns.md +249 -0
- package/skills/wow-design/references/critique-rubric.md +259 -0
- package/skills/wow-design/references/design-brief-template.md +46 -0
- package/skills/wow-design/references/inspiration.md +200 -0
- package/skills/wow-design/references/presets.md +96 -0
- package/skills/wow-design/references/principles.md +368 -0
- package/skills/wow-design/references/stack-recipes.md +93 -0
- package/skills/wow-design/references/visual-qa.md +79 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Пресеты AURORA — как выбрать и как настроить
|
|
2
|
+
|
|
3
|
+
> Все пресеты уже реализованы в `assets/kit/assets/css/tokens.css`: переключаются атрибутом
|
|
4
|
+
> `<html data-preset="...">`, тема — `<html data-theme="light|dark">`.
|
|
5
|
+
> Не создавай новый визуальный язык без причины — выбери пресет и адаптируй акцент/шрифт под бренд.
|
|
6
|
+
|
|
7
|
+
## Как выбрать за 60 секунд
|
|
8
|
+
1. Кто пользователь и что важно? (доверие / скорость / плотность / эмоция / статус)
|
|
9
|
+
2. Это «бренд-история» (лендинг, клиника, культура) или «рабочий инструмент» (дашборд, кабинет)?
|
|
10
|
+
3. Есть ли бренд-цвета? Если да — акцент берём из бренда, остальное из ближайшего пресета.
|
|
11
|
+
4. Нужна ли тёмная тема по умолчанию? (product/DevOps — да → `graphite`)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. `aurora` — премиальная клиника / культура / сервис
|
|
16
|
+
- **Настроение:** тихая роскошь, человечность, доверие, «дорого, но не кричит».
|
|
17
|
+
- **Кому:** медицина, wellness, образование, премиум-услуги, бренд-лендинги.
|
|
18
|
+
- **Палитра (light):** бумага `#F4F1EA`, поверхность `#FFFFFF`, чернила `#14181A`, изумруд `#0E6E5E`,
|
|
19
|
+
медь `#B36A43`, линии `#DCD6CA`.
|
|
20
|
+
- **Палитра (dark):** фон `#0B0F0F`, поверхность `#121718`, мята `#5AD2B7`, медь `#E09A70`.
|
|
21
|
+
- **Шрифты:** display — **Lora** (serif, 500), body — **Golos Text**.
|
|
22
|
+
- **Формы:** радиус карточек 14px, контролов 10px, волосяные линии, слоистые тени.
|
|
23
|
+
- **Signature-элементы:** крупные редакционные цифры, печать/эмблема, монограммы вместо фото,
|
|
24
|
+
капс-надзаголовки с линией, тонкая бумажная текстура.
|
|
25
|
+
- **Композиция hero:** 7/5, слева kicker → H1 в 2–3 строки → lead → 2 CTA; справа — «документ/печать»
|
|
26
|
+
или вертикальная колонка цифр на волосяной сетке.
|
|
27
|
+
- **Do:** много воздуха, спокойный тон, один изумрудный акцент, медь только в деталях.
|
|
28
|
+
- **Don't:** яркие градиенты, неон, стоковые фото улыбающихся врачей, «медицинский синий» по умолчанию.
|
|
29
|
+
|
|
30
|
+
## 2. `graphite` — продукт / SaaS / дашборд / админка
|
|
31
|
+
- **Настроение:** точность, плотность, технологичность, контроль.
|
|
32
|
+
- **Кому:** Service Desk, CRM, аналитика, dev-tools, панели управления.
|
|
33
|
+
- **Палитра (light):** фон `#F4F6F5`, поверхность `#FFFFFF`, чернила `#0F1414`, акцент `#0E7C66`,
|
|
34
|
+
мятный `#6EE7C8` для тёмной.
|
|
35
|
+
- **Палитра (dark):** фон `#080B0B`, поверхность `#0F1414`, мята `#6EE7C8`, линии `#1F2926`.
|
|
36
|
+
- **Шрифты:** display — **Unbounded** (осторожно, 1–2 места), body — **Golos Text**, цифры — tabular.
|
|
37
|
+
- **Формы:** радиусы 4–11px, плотные отступы, границы вместо теней, аккуратные hover-состояния.
|
|
38
|
+
- **Signature-элементы:** KPI-цифры с дельтой и sparkline, sticky-таблица, командная строка ⌘K,
|
|
39
|
+
тонкая сетка графиков, статус-точки.
|
|
40
|
+
- **Композиция:** сайдбар 240–260px, топбар 64px, контентная сетка 12 колонок, 8px ритм, таблицы
|
|
41
|
+
с правыми числами, панель активности справа.
|
|
42
|
+
- **Do:** данные прежде декора, состояния всего, читаемые таблицы, tabular-nums, один акцент.
|
|
43
|
+
- **Don't:** огромные радиусы, «карточки ради карточек», тени поверх данных, пестрота статусов.
|
|
44
|
+
|
|
45
|
+
## 3. `editorial` — медиа / истории / бренд-лендинг
|
|
46
|
+
- **Настроение:** журнал, характер, смелость, крупная типографика.
|
|
47
|
+
- **Кому:** новости, блог, культура, портфолио, лендинг с историей.
|
|
48
|
+
- **Палитра (light):** бумага `#F8F5EF`, чернила `#171310`, вермильон `#C8442A`, линии `#DCD4C7`.
|
|
49
|
+
- **Палитра (dark):** фон `#121110`, поверхность `#1A1613`, коралл `#F06A4D`.
|
|
50
|
+
- **Шрифты:** display — **Lora** с крупным кеглем, body — Golos Text; допустим italic для цитат.
|
|
51
|
+
- **Формы:** почти прямоугольные (2–5px), жирные волосяные линии, много чёрного текста.
|
|
52
|
+
- **Signature-элементы:** гигантские заголовки (clamp 3–6rem), номерные рубрики, drop cap в первом
|
|
53
|
+
абзаце, цитаты на всю ширину, асимметричные фото-блоки (в нашем случае — типографические).
|
|
54
|
+
- **Do:** контраст масштабов, строгая сетка, смелые переносы, крупные отступы между секциями.
|
|
55
|
+
- **Don't:** мелкие заголовки, «SaaS-карточки», пастель, всё центрировать.
|
|
56
|
+
|
|
57
|
+
## 4. `warm` — человечный сервис / забота / образование
|
|
58
|
+
- **Настроение:** тепло, спокойствие, дружелюбие, «свои люди».
|
|
59
|
+
- **Кому:** школы/курсы, детские сервисы, ЗОЖ, соцпроекты, сервис для сотрудников.
|
|
60
|
+
- **Палитра (light):** крем `#FBF5EC`, чернила `#241B14`, терракота `#B85C38`, шалфей `#6C7A5B`.
|
|
61
|
+
- **Палитра (dark):** фон `#14100D`, поверхность `#1D1712`, акцент `#E8835C`.
|
|
62
|
+
- **Шрифты:** display — Lora, body — Golos Text.
|
|
63
|
+
- **Формы:** крупные радиусы 12–24px (осознанно мягко), скруглённые иконки, тёплые тени.
|
|
64
|
+
- **Signature-элементы:** мягкие плашки-акценты, рукописные подчёркивания (SVG), крупные эмпатичные
|
|
65
|
+
цитаты, фото-иллюстрации (если есть контент), «шаги» с крупными номерами.
|
|
66
|
+
- **Do:** дружелюбный copy, округлость, тёплый фон, простые формы.
|
|
67
|
+
- **Don't:** корпоративный холод, острые углы, кислотные цвета, перегруз данными.
|
|
68
|
+
|
|
69
|
+
## 5. `swiss` — строгий корпоративный / B2B / отчёты
|
|
70
|
+
- **Настроение:** дисциплина, ясность, сдержанность, точность.
|
|
71
|
+
- **Кому:** банки/страхование, промышленность, госуслуги, документы, отчёты.
|
|
72
|
+
- **Палитра (light):** белый `#FFFFFF`, чёрный `#0E0E0E`, сигнальный красный `#E0301E`, серые линии.
|
|
73
|
+
- **Палитра (dark):** фон `#0D0D0D`, поверхность `#151515`, акцент `#FF5B47`.
|
|
74
|
+
- **Шрифты:** display — **Golos Text** 700 с плотным трекингом, body — Golos Text.
|
|
75
|
+
- **Формы:** радиусы 1–4px, жёсткая сетка, минимум декора, максимум выравнивания.
|
|
76
|
+
- **Signature-элементы:** толстые линии-разделители, номера секций, таблицы, крупные цифры,
|
|
77
|
+
красные акценты только на действиях и статусах.
|
|
78
|
+
- **Do:** строгая сетка, монохром + один красный, крупные поля, читаемые таблицы.
|
|
79
|
+
- **Don't:** декор, тени, мягкие радиусы, пастель, «игривые» иллюстрации.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Адаптация под бренд (если есть фирменные цвета)
|
|
84
|
+
Меняй **только** эти переменные, остальное оставь из пресета:
|
|
85
|
+
```css
|
|
86
|
+
:root{
|
|
87
|
+
--accent:#<бренд>; /* основной акцент */
|
|
88
|
+
--accent-hover:#<темнее>;
|
|
89
|
+
--accent-press:#<ещё темнее>;
|
|
90
|
+
--accent-soft:#<очень светлый тон акцента>;
|
|
91
|
+
--accent-ink:#<тёмный тон для текста на soft>;
|
|
92
|
+
--accent-contrast:#<текст на акценте: белый или тёмный>;
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
Правила: контраст `accent` ↔ `accent-contrast` ≥ 4.5:1; `accent-soft` — это фон для бейджей/подсветок,
|
|
96
|
+
текст на нём — `accent-ink`; не использовать акцент для больших заливок, только для действий/статусов/линий.
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# 01 · Принципы ремесла — 76 правил
|
|
2
|
+
|
|
3
|
+
> Рабочий документ для системы WOW-дизайна (DSH). Читать перед вёрсткой и во время критики.
|
|
4
|
+
> Каждое правило — **что делать → как → типичная ошибка**. Все значения совместимы с токенами
|
|
5
|
+
> AURORA (`assets/kit/assets/css/tokens.css`): отступы `--sp-*`, типографика `--text-*`,
|
|
6
|
+
> строка `--measure`, движение `--dur*`/`--ease*`, фокус `--focus-ring`, радиусы `--radius-*`.
|
|
7
|
+
> Опирается на практику Linear, Stripe, Vercel, Apple, Airbnb, Raycast, Framer, Notion, Aesop
|
|
8
|
+
> и крупных клиник (Mayo, Cleveland, Charité, One Medical) — своими словами, без цитат.
|
|
9
|
+
|
|
10
|
+
## A. Иерархия и композиция
|
|
11
|
+
|
|
12
|
+
**P01. Один главный акцент на экран.** Взгляд должен иметь одну точку притяжения — заголовок или primary-CTA.
|
|
13
|
+
→ Как: primary-кнопка одна на секцию; всё остальное — secondary/ghost; акцентный цвет ≤10% площади.
|
|
14
|
+
✗ Ошибка: две равные яркие кнопки в hero — пользователь не знает, куда нажать.
|
|
15
|
+
|
|
16
|
+
**P02. Не больше трёх уровней иерархии.** Primary (H1/CTA) → secondary (подзаголовок, lead) → tertiary (подписи, мета).
|
|
17
|
+
→ Как: различие по размеру ≥1.25×, по контрасту — ink → ink-2 → muted; не 5 «почти одинаковых» уровней.
|
|
18
|
+
✗ Ошибка: все тексты 16–18px, различаются только жирностью — «серая каша».
|
|
19
|
+
|
|
20
|
+
**P03. Контраст масштабов обязателен.** Display 56–96px против служебного 11–13px; body 16–18px.
|
|
21
|
+
→ Как: AURORA `--display-l/xl` + `.eyebrow` (11–12px, трекинг .14em); не «всё 16px».
|
|
22
|
+
✗ Ошибка: H1 32px и body 18px — заголовок не звучит, страница выглядит как документ.
|
|
23
|
+
|
|
24
|
+
**P04. Маршрут взгляда проектируется, а не получается.** Z-паттерн для лендинга, F/скан для текста; CTA — в конце маршрута.
|
|
25
|
+
→ Как: kicker → H1 → lead → 2 CTA → proof-цифры → визуальный якорь; каждую секцию начинать с левого верхнего угла.
|
|
26
|
+
✗ Ошибка: CTA спрятан в середине текста, а главный акцент — декоративная картинка.
|
|
27
|
+
|
|
28
|
+
**P05. Асимметрия вместо 50/50.** Пропорции 7/5 или 8/4 дают «редакционность»; идеальная симметрия — только для форм и модалок.
|
|
29
|
+
→ Как: `grid-template-columns:minmax(0,7fr) minmax(0,5fr)`; текст 5–6 колонок, визуал 6–7.
|
|
30
|
+
✗ Ошибка: hero 50/50 с двумя одинаковыми половинами — выглядит как шаблон.
|
|
31
|
+
|
|
32
|
+
**P06. Близость сильнее рамок.** Элементы одной группы ближе друг к другу, чем к соседним группам.
|
|
33
|
+
→ Как: внутри группы 8–16px, между группами 32–64px; убрать рамку, если хватает воздуха.
|
|
34
|
+
✗ Ошибка: карточки с рамкой и одинаковым отступом внутри и снаружи — границы групп не читаются.
|
|
35
|
+
|
|
36
|
+
**P07. Одна signature-деталь.** Запоминается одна вещь: крупные редакционные цифры, номерные секции, монограмма, вертикальный лейбл, необычный разделитель.
|
|
37
|
+
→ Как: выбрать 1 деталь и повторить в 2–3 местах; всё остальное — спокойно.
|
|
38
|
+
✗ Ошибка: пять «фишек» сразу (градиент + блоб + стекло + 3D + карусель) — визуальный шум.
|
|
39
|
+
|
|
40
|
+
## B. Типографика
|
|
41
|
+
|
|
42
|
+
**P08. Только модульная шкала.** Размеры берутся из ряда, а не «на глаз».
|
|
43
|
+
→ Как: `--text-2xs…--text-5xl` (11/12/14/16/17/20/24/30/36/44) + display clamp; коэффициент 1.125–1.25 для UI, 1.25–1.333 для лендинга.
|
|
44
|
+
✗ Ошибка: 13/15/17/19/23px — непредсказуемый ритм и «дрожащая» иерархия.
|
|
45
|
+
|
|
46
|
+
**P09. Body не меньше 16px.** На мобильном 16–18px; 14–15px допустимо только в плотном продуктовом UI (таблицы, сайдбар).
|
|
47
|
+
→ Как: `font-size:var(--text-md)` (16px), на мобиле не уменьшать; line-length контролировать через `--measure`.
|
|
48
|
+
✗ Ошибка: 14px body и 12px подписи на лендинге — читается как «мелкий шрифт в договоре».
|
|
49
|
+
|
|
50
|
+
**P10. Интерлиньяж по роли текста.** Body 1.5–1.65; заголовки 1.05–1.2; display 0.95–1.05; мелкий текст 1.4+.
|
|
51
|
+
→ Как: `--lh-relaxed:1.65` для body, `--lh-tight:1.05` для H1; крупный serif требует больше воздуха (+0.02).
|
|
52
|
+
✗ Ошибка: line-height 1.2 у абзаца — строки слипаются; 1.8 у заголовка — заголовок «рассыпается».
|
|
53
|
+
|
|
54
|
+
**P11. Длина строки 60–72ch.** Комфортный диапазон 45–75 знаков; lead — ≤52ch; подписи — ≤48ch.
|
|
55
|
+
→ Как: `max-width:var(--measure)` (66ch) для body, `--measure-narrow` (48ch) для лидов; не задавать фиксированный px.
|
|
56
|
+
✗ Ошибка: текст на всю ширину 1360px — глаз теряет строку, чтение падает.
|
|
57
|
+
|
|
58
|
+
**P12. Трекинг зависит от размера.** Крупный display: −0.015…−0.03em; body: −0.006em; капс-лейблы: +0.08…+0.14em.
|
|
59
|
+
→ Как: `--display-tracking` в пресетах; `.eyebrow{letter-spacing:.14em}`; не трекать body положительно.
|
|
60
|
+
✗ Ошибка: letter-spacing .1em у body — текст «рассыпается», особенно на кириллице.
|
|
61
|
+
|
|
62
|
+
**P13. 2–3 начертания максимум.** Обычно display + body; третий — моно для кода/ID.
|
|
63
|
+
→ Как: 400/500/600 для текста; 700 — только в swiss-пресете; не использовать 300 на светлом фоне.
|
|
64
|
+
✗ Ошибка: пять жирностей и три семейства на одном экране.
|
|
65
|
+
|
|
66
|
+
**P14. Заголовки балансируются, абзацы — нет.** `text-wrap:balance` для H1–H2, `pretty` для body; без висячих предлогов и «сирот».
|
|
67
|
+
→ Как: `h1,h2{text-wrap:balance}`; в управляемом контенте — ` ` после коротких предлогов; не использовать `<br>` для «красоты».
|
|
68
|
+
✗ Ошибка: в H1 последняя строка — одно слово; в абзаце одинокая строка на всю ширину.
|
|
69
|
+
|
|
70
|
+
**P15. Числа — табличные.** В таблицах, таймерах, KPI, ценах: `font-variant-numeric:tabular-nums`.
|
|
71
|
+
→ Как: `.tnum{font-variant-numeric:tabular-nums}`; моно (`--font-mono`) для ID, кодов, ⌘K-подсказок.
|
|
72
|
+
✗ Ошибка: пропорциональные цифры — колонки «пляшут», дельты не выравниваются.
|
|
73
|
+
|
|
74
|
+
**P16. Пары шрифтов — по контрасту, не по сходству.** Serif display + гротеск body (AURORA); либо один гротеск в двух ролях.
|
|
75
|
+
→ Как: Lora/Unbounded для display, Golos Text для body; не скрещивать два похожих геометр-гротеска.
|
|
76
|
+
✗ Ошибка: два похожих sans в заголовке и тексте — выглядит как ошибка, а не приём.
|
|
77
|
+
|
|
78
|
+
**P17. Капс — только для коротких лейблов.** До 3 слов: надзаголовок, категория, табличный заголовок; не для абзацев.
|
|
79
|
+
→ Как: `.eyebrow`/`.caps` — 11–12px, вес 600, трекинг .12–.14em, цвет muted.
|
|
80
|
+
✗ Ошибка: длинный заголовок капсом — читается по буквам и выглядит дёшево.
|
|
81
|
+
|
|
82
|
+
**P18. Соседние уровни шкалы различимы.** Отношение размеров ≥1.2×, иначе уровень не читается.
|
|
83
|
+
→ Как: 16→20→24→30→36; не ставить 16 и 17 рядом как разные уровни.
|
|
84
|
+
✗ Ошибка: 18px H3 и 16px body — иерархия почти не видна.
|
|
85
|
+
|
|
86
|
+
**P19. Кириллица требует проверки.** Тестировать «ё, й, Щ, Д, Ж», кавычки-ёлочки, длинные слова; не переносить латинские типографские приёмы слепо.
|
|
87
|
+
→ Как: `lang="ru"`, `«ёлочки»`, длинное тире, неразрывный пробел перед единицами; проверить переносы в узких колонках.
|
|
88
|
+
✗ Ошибка: латинские кавычки и дефис вместо тире; «рваться» слова в заголовке.
|
|
89
|
+
|
|
90
|
+
## C. Цвет
|
|
91
|
+
|
|
92
|
+
**P20. Правило 60-30-10.** 60% — нейтральный фон, 30% — поверхности и текст, 10% — акцент.
|
|
93
|
+
→ Как: фон `--bg`, панели `--surface/--bg-alt`, акцент — только кнопки, ссылки, активные состояния, 1–2 акцента на экран.
|
|
94
|
+
✗ Ошибка: акцентные блоки на 30–40% площади — «пёстро» и дёшево.
|
|
95
|
+
|
|
96
|
+
**P21. Один акцент + нейтрали + редкий тёплый тон.** В AURORA второй тон — медь (`--copper`), ≤2% площади: линия, цифра, хайлайт.
|
|
97
|
+
→ Как: медь для деталей, не для кнопок; не вводить третий акцент «для красоты».
|
|
98
|
+
✗ Ошибка: четыре цвета-акцента в одном интерфейсе, каждый «важный».
|
|
99
|
+
|
|
100
|
+
**P22. Оттенки генерируются в OKLCH.** Hover/press — сдвиг светлоты L на ±0.04–0.06 при той же хроме; не «подбирать hex на глаз».
|
|
101
|
+
→ Как: `oklch()`/`color-mix(in oklab, …)`; в токенах уже есть пары `--accent/-hover/-press`.
|
|
102
|
+
✗ Ошибка: hover-цвет случайно уходит в другой оттенок (изумруд → бирюза → синий).
|
|
103
|
+
|
|
104
|
+
**P23. Контраст — порог, а не вкус.** Текст ≥4.5:1; крупный (≥24px или ≥18.66px bold) ≥3:1; иконки/границы контролов ≥3:1.
|
|
105
|
+
→ Как: проверять пары WebAIM Contrast Checker; не «серый на сером»; `--faint` — только декор.
|
|
106
|
+
✗ Ошибка: подписи `--faint` на `--bg` (2.35:1) — формально «видно», фактически нечитаемо.
|
|
107
|
+
|
|
108
|
+
**P24. Не только цветом.** Статус дублируется текстом, иконкой или формой: «Ошибка» + иконка + цвет, не только красный.
|
|
109
|
+
→ Как: badge = точка/иконка + подпись; в таблицах статус текстом, цвет — фоном; проверить grayscale.
|
|
110
|
+
✗ Ошибка: красная/зелёная точка без подписи — не работает для 8% мужчин и в ч/б.
|
|
111
|
+
|
|
112
|
+
**P25. Поверхности отделяются светлотой, а не только тенью.** Разница L между `--bg` и `--surface` 3–6%; в тёмной теме — светлее с уровнем.
|
|
113
|
+
→ Как: `--bg:#F4F1EA` → `--surface:#FFFFFF`; `--surface-2` для вложенных панелей; hairline по краю.
|
|
114
|
+
✗ Ошибка: белая карточка на белом фоне без границы — «парит» непонятно где.
|
|
115
|
+
|
|
116
|
+
**P26. Акцент — для действия, не для декора.** Ссылки — `--accent-ink` (контрастнее), крупные акцентные заливки — только CTA/активные состояния.
|
|
117
|
+
→ Как: в editorial/warm-пресетах `--accent` как мелкий текст даёт 4.19–4.47:1 — для ссылок брать `--accent-ink`.
|
|
118
|
+
✗ Ошибка: акцентный цвет у всех заголовков — акцент перестаёт быть акцентом.
|
|
119
|
+
|
|
120
|
+
**P27. Семантика статусов фиксирована.** success/warning/danger/info + soft-фон; не менять значение цвета между экранами.
|
|
121
|
+
→ Как: пары `--danger`/`--danger-soft`, `--success`/`--success-soft`; иконка + текст + цвет.
|
|
122
|
+
✗ Ошибка: «предупреждение» оранжевым на одном экране и синим на другом.
|
|
123
|
+
|
|
124
|
+
**P28. Grayscale-тест.** Убрать цвет: иерархия, границы, статусы должны остаться понятными.
|
|
125
|
+
→ Как: DevTools → Rendering → Grayscale (или фильтр `grayscale(1)`); если всё «слиплось» — добавить контраст/линии/вес.
|
|
126
|
+
✗ Ошибка: единственное различие блоков — цвет фона; в ч/б страница превращается в кашу.
|
|
127
|
+
|
|
128
|
+
## D. Сетка, воздух, выравнивание, оптика
|
|
129
|
+
|
|
130
|
+
**P29. 12 колонок, контейнер 1200–1360.** Gutter `clamp(20px,4.5vw,56px)`, контент — в `--container`/`--container-wide`.
|
|
131
|
+
→ Как: `.container`/`.container-wide` из base.css; не задавать max-width вручную на каждой секции.
|
|
132
|
+
✗ Ошибка: 5 разных ширин контента на одной странице — левый край «гуляет».
|
|
133
|
+
|
|
134
|
+
**P30. Одна шкала отступов.** Только `--sp-*`: 4/8/12/16/24/32/48/64/96/128; никаких 13/17/22/27px.
|
|
135
|
+
→ Как: `gap:var(--sp-5)`, `padding-block:var(--section-y)`; если нужного нет — брать соседний токен, не выдумывать.
|
|
136
|
+
✗ Ошибка: «на глаз» 18px здесь, 22px там — страница выглядит неаккуратной без явной причины.
|
|
137
|
+
|
|
138
|
+
**P31. Вертикальный ритм секций.** Desktop 96–140px, mobile 56–72px; между заголовком и контентом — 24–40px.
|
|
139
|
+
→ Как: `--section-y:clamp(64px,8vw,128px)`; чередовать фон секций (`bg`/`surface`/`bg-alt`), а не рамки.
|
|
140
|
+
✗ Ошибка: одинаковые 24px между всеми блоками — нет «дыхания» и группировки.
|
|
141
|
+
|
|
142
|
+
**P32. Воздух важнее рамок.** Сомневаешься — убери border и добавь padding.
|
|
143
|
+
→ Как: 24–32px внутри карточки, 48–64px между блоками; рамка только когда нужна граница данных (таблица).
|
|
144
|
+
✗ Ошибка: каждая карточка в рамке и с тенью — «сетка клеток», а не композиция.
|
|
145
|
+
|
|
146
|
+
**P33. Выравнивание по оптике, а не по математике.** Иконки — по оптическому центру строки, кавычки — выступают за поле, буллеты — висят в отступе.
|
|
147
|
+
→ Как: `transform:translateY(1px)` для иконки 20px в строке 16px; `hanging-punctuation` где поддерживается; visually center в круге.
|
|
148
|
+
✗ Ошибка: иконка «на 2px ниже» текста — заметно на всех кнопках.
|
|
149
|
+
|
|
150
|
+
**P34. Оптические поправки типографики.** Крупный display: чуть плотнее трекинг и меньше line-height; serif — на 1–2% больше воздуха; цифры — выровнены по базовой линии.
|
|
151
|
+
→ Как: `--display-tracking` −0.018em, `--lh-tight`; для Lora H1 допускать line-height 1.02–1.06.
|
|
152
|
+
✗ Ошибка: одинаковые line-height и tracking у 14px и 96px — крупный текст «разваливается».
|
|
153
|
+
|
|
154
|
+
**P35. Выравнивание по одной из линий.** Каждый элемент выровнен по левому краю колонки, центру или правому краю чисел; «почти выровнено» запрещено.
|
|
155
|
+
→ Как: grid + `align-items`, а не margin-left; правые числа в таблицах; центр — только для коротких блоков.
|
|
156
|
+
✗ Ошибка: три карточки с разной высотой заголовков и «плавающими» кнопками.
|
|
157
|
+
|
|
158
|
+
**P36. Hairline вместо рамок.** Разделители 1px `--line` (в dark — `--line`), для групп — только горизонтальные линии, не «коробки».
|
|
159
|
+
→ Как: `.rule{border-top:var(--hairline)}`; в таблицах — линии строк, без вертикальной сетки.
|
|
160
|
+
✗ Ошибка: сетка 1px со всех сторон — интерфейс выглядит как Excel 2003.
|
|
161
|
+
|
|
162
|
+
## E. Глубина
|
|
163
|
+
|
|
164
|
+
**P37. Сначала бордер, потом тень.** Тень означает реальный уровень: dropdown, modal, sticky-элемент; статичная карточка — hairline.
|
|
165
|
+
→ Как: карточки — `border:var(--hairline)`; меню/модалки — `--shadow-md/lg`; не «тень на всём».
|
|
166
|
+
✗ Ошибка: 20 карточек с одинаковой большой тенью — «пластиковый» вид и потеря уровней.
|
|
167
|
+
|
|
168
|
+
**P38. Слоистые тени из 2 слоёв.** Малый offset + большой blur с низкой alpha; без чёрного 30–50%.
|
|
169
|
+
→ Как: `--shadow-sm/md/lg` из tokens.css; светлая тема — rgb(20 24 26 / .06–.35), тёмная — глубже.
|
|
170
|
+
✗ Ошибка: `box-shadow:0 0 30px rgba(0,0,0,.5)` — «тень из 2010».
|
|
171
|
+
|
|
172
|
+
**P39. Два уровня теней максимум.** Один для всплывающих, один для модальных; остальное — границы и фон.
|
|
173
|
+
→ Как: не смешивать 6 разных теней; в тёмной теме усилить alpha, а не размытие.
|
|
174
|
+
✗ Ошибка: тени разной силы на соседних компонентах — «грязь» под элементами.
|
|
175
|
+
|
|
176
|
+
**P40. Радиус по смыслу.** Контролы 8–12px, карточки 12–18px, модалки 16–20px, pill — только теги/чипы/аватары.
|
|
177
|
+
→ Как: `--radius-control` (8–12), `--radius-card` (11–18), `--radius-pill` для бейджей; не всё 24–32px.
|
|
178
|
+
✗ Ошибка: «rounded-3xl» на кнопках, полях и карточках — AI-шаблонный вид.
|
|
179
|
+
|
|
180
|
+
**P41. Фокус — кольцо, не тень.** 2px акцент + offset 2–3px, видимый на любом фоне.
|
|
181
|
+
→ Как: `:focus-visible{outline:2px solid var(--accent);outline-offset:3px}` или `box-shadow:var(--focus-ring)`.
|
|
182
|
+
✗ Ошибка: `outline:none` без замены — клавиатурная навигация «слепая».
|
|
183
|
+
|
|
184
|
+
## F. Motion
|
|
185
|
+
|
|
186
|
+
**P42. Длительность по типу действия.** 120–180ms — micro (hover, кнопки), 180–260ms — UI (табы, выпадашки), 280–400ms — overlay (модалки), 500–700ms — reveal при скролле.
|
|
187
|
+
→ Как: `--dur-fast`/`--dur`/`--dur-slow`/`--dur-reveal`; длиннее 400ms — только один раз при появлении секции.
|
|
188
|
+
✗ Ошибка: 600ms hover на кнопке — интерфейс «тормозит»; 80ms — движение не читается.
|
|
189
|
+
|
|
190
|
+
**P43. Один easing на интерфейс.** Стандарт — `cubic-bezier(.2,.7,.2,1)`; вход — ease-out, выход — ease-in.
|
|
191
|
+
→ Как: `--ease`, `--ease-out`; не смешивать bounce/elastic с деловым UI.
|
|
192
|
+
✗ Ошибка: у каждого компонента свой easing — движение «дёрганое».
|
|
193
|
+
|
|
194
|
+
**P44. Анимировать transform и opacity.** Не width/height/top/left — они дёргают layout.
|
|
195
|
+
→ Как: `translateY(12px)` + `opacity`; для раскрытия — `grid-template-rows` или scale, но аккуратно.
|
|
196
|
+
✗ Ошибка: анимация `height:auto` — скачки контента и лаги на мобильном.
|
|
197
|
+
|
|
198
|
+
**P45. Reveal — сдержанный.** translateY 12–16px, opacity 0→1, stagger 60–80ms, не больше 4–6 элементов; повторно не проигрывать.
|
|
199
|
+
→ Как: `.reveal` + `IntersectionObserver`, `data-delay` 1–5; отключать в reduced-motion.
|
|
200
|
+
✗ Ошибка: каждый абзац «влетает» с поворотом и задержкой 1.5s — цирк и ожидание.
|
|
201
|
+
|
|
202
|
+
**P46. Никаких бесконечных и декоративных анимаций.** Движение только в ответ на действие или появление контента.
|
|
203
|
+
→ Как: hover — фон/сдвиг 1–2px/цвет; не крутить фоновые градиенты, не «дышать» логотипом.
|
|
204
|
+
✗ Ошибка: пульсирующие блобы и бегущие полоски — отвлекают и жгут батарею.
|
|
205
|
+
|
|
206
|
+
**P47. prefers-reduced-motion — обязательно.** Отключить reveal, hover-сдвиги, parallax; scroll-behavior:auto.
|
|
207
|
+
→ Как: media-query из base.css уже есть; проверить, что контент виден без JS-анимации.
|
|
208
|
+
✗ Ошибка: при reduced-motion секции остаются с `opacity:0` — контент пропадает.
|
|
209
|
+
|
|
210
|
+
## G. Иконки, изображения, иллюстрации
|
|
211
|
+
|
|
212
|
+
**P48. Один набор иконок.** Inline SVG, stroke 1.5–1.6, размеры 20/24, скругления концов; эмодзи в UI запрещены.
|
|
213
|
+
→ Как: общий `<symbol>`-спрайт или повторяющийся паттерн; `stroke-linecap:round`, `stroke-linejoin:round`.
|
|
214
|
+
✗ Ошибка: смесь эмодзи, иконок с разной толщиной и «иконок-облачков» из разных наборов.
|
|
215
|
+
|
|
216
|
+
**P49. Иконка не заменяет текст.** В навигации и CTA — подпись; icon-only — только для очевидных действий (закрыть, поиск) с `aria-label`.
|
|
217
|
+
→ Как: `<button aria-label="Закрыть">…<svg aria-hidden="true">`; декоративные иконки — `aria-hidden`.
|
|
218
|
+
✗ Ошибка: ряд непонятных иконок без подписей; скринридер читает «button».
|
|
219
|
+
|
|
220
|
+
**P50. Изображения с фиксированными пропорциями.** 4:5, 3:2, 16:9, 1:1; `object-fit:cover`; `width/height` или `aspect-ratio` против layout shift.
|
|
221
|
+
→ Как: `aspect-ratio:16/9` + `object-fit:cover`; alt описывает смысл, декоративное — `alt=""`.
|
|
222
|
+
✗ Ошибка: фото «прыгает» при загрузке; alt = «image1.jpg».
|
|
223
|
+
|
|
224
|
+
**P51. Визуал строится из типографики и геометрии.** В AURORA нет внешних фото: SVG-диаграммы, монограммы, крупные цифры, номерные секции, бумажное зерно 2–3%.
|
|
225
|
+
→ Как: `--grain-opacity:.022`; SVG-графики с `currentColor`; монограмма = инициалы в hairline-рамке.
|
|
226
|
+
✗ Ошибка: стоковые улыбающиеся люди и «командные» фото — мгновенно дешёвый вид.
|
|
227
|
+
|
|
228
|
+
## H. Текст и микрокопирайт
|
|
229
|
+
|
|
230
|
+
**P52. Заголовок продаёт результат.** 3–8 слов, конкретная польза; не «Добро пожаловать» и не название отдела.
|
|
231
|
+
→ Как: «Запись к врачу за 2 минуты» вместо «Онлайн-запись»; проверить: понятно ли, что получит человек.
|
|
232
|
+
✗ Ошибка: «Инновационные решения для вашего здоровья» — ноль информации.
|
|
233
|
+
|
|
234
|
+
**P53. Конкретика вместо прилагательных.** Числа, сроки, имена, проценты; «качественный» и «профессиональный» — удалить.
|
|
235
|
+
→ Как: «94% заявок закрыты в SLA», «4 врача, 12 направлений»; источники цифр — если это демо, не выдумывать чрезмерно.
|
|
236
|
+
✗ Ошибка: «команда профессионалов с многолетним опытом» — не верифицируемо и не запоминается.
|
|
237
|
+
|
|
238
|
+
**P54. Кнопки — глагол + объект.** 1–3 слова, sentence case: «Записаться на приём», «Скачать отчёт»; не «Отправить» в одиночку и не CAPS.
|
|
239
|
+
→ Как: primary — действие; secondary — альтернатива; destructive — «Удалить заявку», с подтверждением.
|
|
240
|
+
✗ Ошибка: «OK», «Далее», «Отправить» без контекста; CAPS-кнопки в русском UI.
|
|
241
|
+
|
|
242
|
+
**P55. Ошибки объясняют и чинят.** Что случилось + что сделать + где: «Не удалось сохранить: нет соединения. Проверьте сеть и повторите».
|
|
243
|
+
→ Как: текст рядом с полем, `aria-invalid`, `aria-describedby`; не «Что-то пошло не так».
|
|
244
|
+
✗ Ошибка: toast «Error 500» без пути решения и без сохранения введённого.
|
|
245
|
+
|
|
246
|
+
**P56. Пустые состояния — часть дизайна.** Что здесь будет, почему пусто и один CTA; для ошибок — альтернативный путь.
|
|
247
|
+
→ Как: иконка/монограмма + 1–2 строки + кнопка; не пустой белый экран и не «Нет данных».
|
|
248
|
+
✗ Ошибка: таблица «No data» без объяснения, что делать дальше.
|
|
249
|
+
|
|
250
|
+
**P57. Русская типографика.** «Ёлочки», длинное тире, неразрывные пробелы перед единицами и после коротких предлогов; без lorem ipsum и англицизмов без нужды.
|
|
251
|
+
→ Как: «5 000 ₽», «с 9:00 до 18:00», «врач‑кардиолог»; проверить переносы и «сироты».
|
|
252
|
+
✗ Ошибка: "Lorem ipsum", кавычки “...”, дефис вместо тире, «5000 рублей» без разрядов.
|
|
253
|
+
|
|
254
|
+
## I. Состояния
|
|
255
|
+
|
|
256
|
+
**P58. Семь состояний у каждого интерактива.** default / hover / focus-visible / active / disabled / loading / error (для полей).
|
|
257
|
+
→ Как: показывать все в showcase; для кнопок — hover+focus+active+disabled+loading; поля — +error.
|
|
258
|
+
✗ Ошибка: только default и hover — интерфейс «оживает» непредсказуемо.
|
|
259
|
+
|
|
260
|
+
**P59. Hover — микроизменение без сдвига layout.** Фон на 4–6% темнее/светлее, бордер, сдвиг 1–2px; 160–200ms.
|
|
261
|
+
→ Как: `background:color-mix(in oklab,var(--ink) 5%,var(--surface))`; подчёркивание ссылки; не менять размеры.
|
|
262
|
+
✗ Ошибка: карточка «прыгает» на 8px и меняет высоту — layout дёргается.
|
|
263
|
+
|
|
264
|
+
**P60. Focus-visible виден всегда.** Не удалять outline без равноценной замены; фокус заметен на фоне любого цвета.
|
|
265
|
+
→ Как: `--focus-ring` (2px + offset); проверить Tab по всей странице.
|
|
266
|
+
✗ Ошибка: фокус только на кнопках, поля и ссылки «слепые».
|
|
267
|
+
|
|
268
|
+
**P61. Disabled — очевидно неактивный.** opacity 45–55%, `cursor:not-allowed`, без hover/тени; причина недоступности — текст рядом.
|
|
269
|
+
→ Как: `[disabled]{opacity:.5;pointer-events:none}` + подсказка «Сначала выберите врача».
|
|
270
|
+
✗ Ошибка: disabled-кнопка выглядит активной, а нажатие ничего не делает.
|
|
271
|
+
|
|
272
|
+
**P62. Loading повторяет геометрию.** Skeleton с теми же размерами/радиусами, shimmer 1.2–1.6s; spinner 16–20px локально, не на весь экран.
|
|
273
|
+
→ Как: skeleton-блоки по сетке контента; `aria-busy="true"`; не блокировать всю страницу ради одной кнопки.
|
|
274
|
+
✗ Ошибка: скелетон «не той» формы → контент прыгает при загрузке; вечный спиннер без текста.
|
|
275
|
+
|
|
276
|
+
**P63. Ошибка — рядом с источником.** Поле краснеет + текст ошибки + `aria-invalid`; не только цвет и не только toast.
|
|
277
|
+
→ Как: `input[aria-invalid="true"]{border-color:var(--danger)}`; ошибка под полем 12–13px.
|
|
278
|
+
✗ Ошибка: ошибки собраны вверху формы безымянным списком.
|
|
279
|
+
|
|
280
|
+
**P64. Empty / error / 403 / 404 — часть системы.** Стиль тот же, что у остальных экранов; есть объяснение и путь назад.
|
|
281
|
+
→ Как: переиспользовать `.empty`/alert-компоненты; в 404 — поиск/ссылки на разделы.
|
|
282
|
+
✗ Ошибка: страница 404 дефолтная браузерная или «белый экран».
|
|
283
|
+
|
|
284
|
+
## J. Адаптив и мобильная композиция
|
|
285
|
+
|
|
286
|
+
**P65. Мобильная версия — другая композиция, а не сжатый desktop.** Меняется порядок, размеры, видимость декора.
|
|
287
|
+
→ Как: stacking через `grid-template-columns:1fr`; hero — текст → CTA → proof → визуал; скрыть фоновую сетку.
|
|
288
|
+
✗ Ошибка: desktop-сетка, ужатая до 390px, с 12px текстом и горизонтальным скроллом.
|
|
289
|
+
|
|
290
|
+
**P66. Тач-цели ≥44px.** Минимум WCAG — 24px, практика Apple — 44px; отступ между целями ≥8px; важные действия — в thumb-зоне.
|
|
291
|
+
→ Как: `min-height:44px` у кнопок/ссылок меню; sticky CTA снизу на мобиле; не полагаться на hover.
|
|
292
|
+
✗ Ошибка: иконки 16px без padding — промахнуться легко даже на 390px.
|
|
293
|
+
|
|
294
|
+
**P67. Таблицы скроллятся внутри контейнера.** `.table-wrap{overflow-x:auto}` + sticky первая колонка; страница не должна «ехать».
|
|
295
|
+
→ Как: `min-width` таблицы, тень-подсказка у края, `overscroll-behavior-x:contain`.
|
|
296
|
+
✗ Ошибка: таблица расширяет body → горизонтальный скролл всей страницы.
|
|
297
|
+
|
|
298
|
+
**P68. clamp() для типографики и отступов.** Плавное масштабирование без десяти брейкпоинтов; input font-size ≥16px против iOS-зума.
|
|
299
|
+
→ Как: `font-size:clamp(1rem,1.2vw,1.125rem)`; на мобиле поля не 14px.
|
|
300
|
+
✗ Ошибка: фиксированные 64px заголовки на 390px → 2–3 строки и обрезка.
|
|
301
|
+
|
|
302
|
+
**P69. Проверка на 390/768/1440 и 200% zoom.** Нет overflow-x, обрезанного текста, «прыжков» layout; брейкпоинты AURORA: ≥1200, 768–1199, 390–767.
|
|
303
|
+
→ Как: `document.documentElement.scrollWidth > innerWidth` → искать виновника; zoom 200% для читаемости.
|
|
304
|
+
✗ Ошибка: проверка только на 1440 — на мобиле «половина сайта за краем».
|
|
305
|
+
|
|
306
|
+
## K. Тёмная тема
|
|
307
|
+
|
|
308
|
+
**P70. Тёмная тема — не инверсия.** Фон #0B–#14 (не #000), поверхности светлеют на 3–6% с уровнем, акцент светлее (L +0.15–0.2), тени глубже.
|
|
309
|
+
→ Как: `[data-theme="dark"]` уже задаёт палитру; не генерировать автоматически `filter:invert`.
|
|
310
|
+
✗ Ошибка: белый текст на чистом чёрном + кислотные акценты — «терминал», устают глаза.
|
|
311
|
+
|
|
312
|
+
**P71. Не чистый чёрный и не чистый белый.** Текст L≈0.93–0.95, фон L≈0.10–0.16; в AURORA `--ink:#F2EFE7`, `--bg:#0B0F0F`.
|
|
313
|
+
→ Как: тёплый/холодный оттенок сохранять в обеих темах (у AURORA бумажная теплота); не `#fff/#000`.
|
|
314
|
+
✗ Ошибка: `#FFFFFF` на `#000000` — максимальный контраст, но максимальная усталость.
|
|
315
|
+
|
|
316
|
+
**P72. Обе темы проверяются скриншотами.** Контраст AA, акцент читается, изображения/иллюстрации/градиенты не «ломаются», тени не исчезают.
|
|
317
|
+
→ Как: переключатель темы в шапке; скриншоты light+dark для каждой ключевой страницы.
|
|
318
|
+
✗ Ошибка: тёмная тема «на сдачу»: нечитаемые ссылки, белые SVG-подложки, тени-невидимки.
|
|
319
|
+
|
|
320
|
+
## L. Доступность
|
|
321
|
+
|
|
322
|
+
**P73. Семантика — каркас.** Landmarks (`header/nav/main/footer`), один H1, порядок заголовков без пропусков, skip-link, `lang="ru"`.
|
|
323
|
+
→ Как: семантические теги вместо div-кнопок; кнопка — `<button>`, ссылка — `<a>`; заголовки по уровням.
|
|
324
|
+
✗ Ошибка: `<div onclick>` вместо кнопки — недоступно с клавиатуры и скринридера.
|
|
325
|
+
|
|
326
|
+
**P74. Клавиатура — полный сценарий.** Tab-порядок логичен, фокус видим, модалка держит фокус и закрывается Escape, после закрытия фокус возвращается.
|
|
327
|
+
→ Как: focus trap (первый/последний элемент), `aria-modal="true"`, `role="dialog"`; вернуть фокус на инициатора.
|
|
328
|
+
✗ Ошибка: модалка, из которой Tab уходит на страницу за ней.
|
|
329
|
+
|
|
330
|
+
**P75. Формы доступны.** `<label for>` у каждого поля, ошибки программно связаны, `autocomplete`, `required` + понятные подсказки.
|
|
331
|
+
→ Как: не использовать placeholder вместо лейбла; видимый текст подсказки; `aria-describedby` на help/error.
|
|
332
|
+
✗ Ошибка: поле с подписью только внутри placeholder — при вводе контекст теряется.
|
|
333
|
+
|
|
334
|
+
**P76. Гейт качества.** axe: 0 critical/serious; reduced-motion; alt/aria; контраст AA. Это блокер сдачи, а не «пожелание».
|
|
335
|
+
→ Как: прогон `tools/design-qa/audit.mjs`; критичные нарушения исправляются до финального скриншота.
|
|
336
|
+
✗ Ошибка: «потом поправим доступность» — потом не наступает.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Проверено по токенам AURORA (можно ссылаться)
|
|
341
|
+
|
|
342
|
+
| Пара | Контраст | Вывод |
|
|
343
|
+
|---|---|---|
|
|
344
|
+
| `--ink` на `--bg` (light) | 15.8:1 | основной текст — отлично |
|
|
345
|
+
| `--ink-2` на `--bg` | 9.1:1 | body/lead — отлично |
|
|
346
|
+
| `--muted` на `--bg` | **4.28:1** | ниже AA для обычного текста → на `--bg` брать `--ink-2`, либо `--muted` только ≥18.7px bold |
|
|
347
|
+
| `--muted` на `--surface` | 4.83:1 | на белых панелях — ок |
|
|
348
|
+
| `--faint` на `--bg` | **2.35:1** | только декор (разделители, disabled-подписи), не смысловой текст |
|
|
349
|
+
| `--accent` на `--bg` (aurora) | 5.46:1 | ссылки/акцентный текст — ок |
|
|
350
|
+
| `--accent` на `--bg` (editorial / warm) | **4.47 / 4.19:1** | ниже AA → для текста `--accent-ink`, `--accent` — заливки/крупное |
|
|
351
|
+
| `--accent-contrast` на `--accent` | 6.16:1 (light), 8.95:1 (dark) | белый текст на кнопке — ок |
|
|
352
|
+
| `--line` / `--line-strong` на фоне | **1.3–1.9:1** | hairline-декор — ок; **границы полей ввода так нельзя** (нужно ≥3:1) → `color-mix(in oklab,var(--ink) 32%,transparent)` или `--muted` |
|
|
353
|
+
| `--copper` на `--bg` | 3.68:1 | только крупные акценты/иконки/линии, не мелкий текст |
|
|
354
|
+
| `--muted` на `--surface` (dark) | 5.95:1 | тёмная тема — ок |
|
|
355
|
+
|
|
356
|
+
## Источники и инструменты (проверены)
|
|
357
|
+
|
|
358
|
+
- [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) — контраст, тач-цели, reduced-motion.
|
|
359
|
+
- [Apple Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/) — тач-цели 44pt, типографика, motion.
|
|
360
|
+
- [Material Design 3](https://m3.material.io/) — elevation, tonal surfaces, motion-система.
|
|
361
|
+
- [Refactoring UI](https://refactoringui.com/) — иерархия, цвет, тени, пустые состояния.
|
|
362
|
+
- [Butterick’s Practical Typography](https://practicaltypography.com/) — длина строки, интерлиньяж, трекинг.
|
|
363
|
+
- [Every Layout](https://every-layout.dev/) — сетки/интро-раскладки на CSS.
|
|
364
|
+
- [Easings](https://easings.net/) — кривые, не выдумывать cubic-bezier.
|
|
365
|
+
- [OKLCH Color Picker](https://oklch.com/) — генерация оттенков в перцептивном пространстве.
|
|
366
|
+
- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) — проверка пар цветов.
|
|
367
|
+
- [Type Scale](https://type-scale.com/) — модульные шкалы.
|
|
368
|
+
- [Modern Font Stacks](https://modernfontstacks.com/) — системные стеки без внешних загрузок.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Stack Recipes — как встраивать AURORA в реальные проекты
|
|
2
|
+
|
|
3
|
+
> Принцип: **не переписывай проект, а перенеси токены и компоненты**. Сначала посмотри, что уже есть
|
|
4
|
+
> (тема, переменные, UI-кит), и замапь новое на существующее. Ничего не ломать — часть дизайна.
|
|
5
|
+
|
|
6
|
+
## Универсальный перенос (любой стек)
|
|
7
|
+
1. Скопируй из `assets/kit/assets/css/`: `tokens.css`, `base.css`, `fonts.css` (и при необходимости `components.css`).
|
|
8
|
+
2. Подключи первыми в каскаде: `tokens → base → components → styles проекта`.
|
|
9
|
+
3. Если в проекте уже есть CSS-переменные — замапь:
|
|
10
|
+
```css
|
|
11
|
+
:root{
|
|
12
|
+
--brand-accent: var(--accent);
|
|
13
|
+
--surface-page: var(--bg);
|
|
14
|
+
--text-primary: var(--ink);
|
|
15
|
+
--radius-md: var(--radius-card);
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
4. Проверь, что ни один компонент проекта не использует «магические» цвета — замени на токены постепенно.
|
|
19
|
+
5. Тёмная тема: переключай `data-theme` на `<html>`; в проекте может быть свой механизм (class/`prefers-color-scheme`) —
|
|
20
|
+
адаптируй, а не дублируй две системы.
|
|
21
|
+
|
|
22
|
+
## React + Vite (+ Tailwind, если есть)
|
|
23
|
+
- **Токены:** `src/styles/tokens.css` + `base.css` импортируются в `main.tsx`/`index.css`.
|
|
24
|
+
- **Tailwind v4:** в CSS вместо `tailwind.config`:
|
|
25
|
+
```css
|
|
26
|
+
@import "tailwindcss";
|
|
27
|
+
@theme {
|
|
28
|
+
--color-bg: var(--bg);
|
|
29
|
+
--color-surface: var(--surface);
|
|
30
|
+
--color-ink: var(--ink);
|
|
31
|
+
--color-accent: var(--accent);
|
|
32
|
+
--color-line: var(--line);
|
|
33
|
+
--font-display: var(--font-display);
|
|
34
|
+
--font-sans: var(--font-body);
|
|
35
|
+
--radius-card: var(--radius-card);
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
Тогда работают классы `bg-surface`, `text-ink`, `border-line`, `font-display`, `rounded-card`.
|
|
39
|
+
- **Компоненты:** один каталог `src/components/ui` (Button, Input, Select, Badge, Card, Table, Modal, Tabs,
|
|
40
|
+
Toast, EmptyState). Варианты — через пропсы/`data-variant`, состояния — `data-state`, не через десятки классов.
|
|
41
|
+
- **Тёмная тема:** `useEffect` ставит `data-theme` на `document.documentElement`, значение в `localStorage`,
|
|
42
|
+
первый рендер — из `prefers-color-scheme`.
|
|
43
|
+
- **Проверка:** `npm run dev` → `capture.mjs http://localhost:5173` (или нужный роут) + `audit.mjs`.
|
|
44
|
+
- **Тесты:** RTL — проверка доступных имён кнопок/полей, axe в Playwright/`vitest-axe`; скриншоты —
|
|
45
|
+
`toHaveScreenshot` для ключевых экранов (опционально, если проект уже на Playwright).
|
|
46
|
+
- **Не тащи** тяжёлые UI-библиотеки ради дизайна: сначала токены и свои 8–12 компонентов.
|
|
47
|
+
|
|
48
|
+
## Laravel + Blade
|
|
49
|
+
- **Стили:** `resources/css/tokens.css`, `base.css`, `fonts.css`; `resources/css/app.css` импортирует их;
|
|
50
|
+
`vite.config.js` уже собирает `app.css`. Шрифты — `resources/fonts/`, пути в `@font-face` относительные.
|
|
51
|
+
- **Layout:** `resources/views/layouts/app.blade.php` — `<html lang="ru" data-theme="{{ $theme ?? 'light' }}">`,
|
|
52
|
+
`@vite(['resources/css/app.css','resources/js/app.js'])`, skip-link, header/footer partials.
|
|
53
|
+
- **Blade-компоненты:** `resources/views/components/ui/button.blade.php`:
|
|
54
|
+
```blade
|
|
55
|
+
@props(['variant' => 'primary', 'size' => 'md', 'type' => 'button'])
|
|
56
|
+
<button type="{{ $type }}" {{ $attributes->class(['btn', "btn--$variant", "btn--$size"]) }}>
|
|
57
|
+
{{ $slot }}
|
|
58
|
+
</button>
|
|
59
|
+
```
|
|
60
|
+
Аналогично input/select/badge/card/table/empty/modal. Никаких inline-стилей.
|
|
61
|
+
- **Существующая вёрстка:** не заменяй весь шаблон. Добавь `resources/css/redesign.css` **после** старых стилей,
|
|
62
|
+
переопределяй только проблемные компоненты; проверь все основные страницы.
|
|
63
|
+
- **Проверка:** `npm run build`, `php artisan serve`, скриншоты ключевых страниц (логин, список, карточка,
|
|
64
|
+
формы, ошибки), обе темы. PHPUnit/фича-тесты не должны упасть — дизайн не меняет логику.
|
|
65
|
+
- **Blade-подводные камни:** экранирование в атрибутах, `@class([...])`, не ломать `old()`/`@error` в формах,
|
|
66
|
+
CSRF остаётся, не переносить формы на JS без причины.
|
|
67
|
+
|
|
68
|
+
## Bitrix / Aspro («Медицинский центр 3.0» и др.)
|
|
69
|
+
- **Где править:** только `local/` (свой шаблон/компоненты) или кастомные файлы шаблона сайта;
|
|
70
|
+
**не** трогать `/bitrix/` ядро и файлы маркетплейс-шаблона, которые перезапишутся обновлением.
|
|
71
|
+
- **CSS:** обычно `.../local/templates/<template>/styles/custom.css` или `template_styles.css`;
|
|
72
|
+
подключай токены через `init.php`/`<link>`; селекторы скоупи под контейнер страницы
|
|
73
|
+
(`.page-<name> .btn { ... }`), чтобы не сломать другие разделы и админку.
|
|
74
|
+
- **Шрифты:** положи в `local/templates/<template>/fonts/` и подключи `@font-face` с относительными путями;
|
|
75
|
+
не тяни с CDN, если сайт работает в закрытом контуре.
|
|
76
|
+
- **Кэш:** после правок CSS/шаблонов чистить кэш (`Настройки → Очистить кэш` или удалить
|
|
77
|
+
`/bitrix/cache/css/s1/<template>/`), иначе увидишь старое.
|
|
78
|
+
- **Проверка:** открыть живую страницу в браузере (desktop/mobile), проверить другие разделы (шапка/футер общие),
|
|
79
|
+
админку не задеть. Для локальных наработок — статический HTML-снимок страницы.
|
|
80
|
+
- **Аспро-подводные камни:** свои классы `.btn`, `.card`, `--palette-*`, вложенные `.wrapper`/`.maxwidth`;
|
|
81
|
+
проверяй каскад и `!important` (лучше без него), не ломай мобильное меню и попапы.
|
|
82
|
+
- **Контент:** заголовки h3 в анкетах/статьях не менять на h2 без необходимости — SEO-структура важна.
|
|
83
|
+
|
|
84
|
+
## Статический HTML (лендинг/прототип)
|
|
85
|
+
- Скопируй папку `assets/kit` → в проект; замени контент и бренд-акцент; оставь структуру и токены.
|
|
86
|
+
- Проверь `file://` (нет сборки): относительные пути, шрифты локально, никаких fetch/CDN.
|
|
87
|
+
- Дальше — `capture.mjs`/`audit.mjs`, скриншоты, правки по рубрике.
|
|
88
|
+
|
|
89
|
+
## Что считать «интеграцией» в отчёте
|
|
90
|
+
- Какие файлы добавлены/изменены (точные пути).
|
|
91
|
+
- Какие токены/переменные замаплены на существующую тему.
|
|
92
|
+
- Какие экраны проверены скриншотами (desktop/mobile, light/dark).
|
|
93
|
+
- Что не тронуто (логика, БД, роуты, чужие компоненты).
|