dsh-desktop-kit 0.0.0-stage → 2.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 +152 -2
- package/client.js +4101 -0
- package/cordis.patch.yml +5 -0
- package/docs/ARCHITECTURE.md +114 -0
- package/docs/COMPATIBILITY.md +61 -0
- package/docs/INSTALL.md +84 -0
- package/docs/PRIVACY.md +50 -0
- package/docs/ROADMAP.md +57 -0
- package/docs/TOKENS.md +118 -0
- package/docs/TROUBLESHOOTING.md +68 -0
- package/docs/images/hero.png +0 -0
- package/index.js +84 -0
- package/package.json +70 -4
- package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
- package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
- package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
- package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
- package/plugins/dsh-gkb-ru-ui/package.json +28 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -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-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -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/screenshots/01-settings-transfer-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -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/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
- package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
- package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
- package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
- package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
- package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
- package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
- package/plugins/dsh-skill-autopilot/index.js +444 -0
- package/plugins/dsh-skill-autopilot/package.json +19 -0
- package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
- package/plugins/dsh-token-lab/lib/client.js +504 -0
- package/plugins/dsh-token-lab/lib/index.js +275 -0
- package/plugins/dsh-token-lab/package.json +26 -0
- package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
- package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
- package/skills/code-review-checklist/SKILL.md +55 -0
- package/skills/content-writing/README.md +87 -0
- package/skills/content-writing/SKILL.md +85 -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/process.md +123 -0
- package/skills/content-writing/references/quick-recipes.md +99 -0
- package/skills/content-writing/references/rules.md +85 -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/sources.md +49 -0
- package/skills/content-writing/references/templates.md +291 -0
- package/skills/context-economy/SKILL.md +60 -0
- package/skills/context-economy/references/long-session.md +35 -0
- package/skills/context-economy/references/token-math.md +42 -0
- package/skills/context-economy/references/tool-recipes.md +34 -0
- package/skills/database-safety/SKILL.md +47 -0
- package/skills/debugging-playbook/SKILL.md +42 -0
- package/skills/design-critique/SKILL.md +65 -0
- package/skills/design-critique/references/a11y.md +25 -0
- package/skills/design-critique/references/diagnoses.md +33 -0
- package/skills/design-critique/references/quick-tests.md +30 -0
- package/skills/design-critique/references/report-template.md +63 -0
- package/skills/design-critique/references/rubric-fast.md +73 -0
- package/skills/dev-workflow/SKILL.md +48 -0
- package/skills/dev-workflow/references/definition-of-done.md +44 -0
- package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
- package/skills/dev-workflow/references/stages.md +67 -0
- package/skills/git-and-ci/SKILL.md +60 -0
- package/skills/pg-upgrade-verify/SKILL.md +67 -0
- package/skills/project-deep-dive/SKILL.md +45 -0
- package/skills/project-deep-dive/references/recon-commands.md +90 -0
- package/skills/project-deep-dive/references/section-templates.md +104 -0
- package/skills/project-deep-dive/references/tool-and-process.md +86 -0
- package/skills/project-memory-maintenance/SKILL.md +55 -0
- package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
- package/skills/project-memory-maintenance/references/journal-template.md +50 -0
- package/skills/project-memory-maintenance/references/section-rules.md +59 -0
- package/skills/release-and-deploy/SKILL.md +53 -0
- package/skills/requirements-and-planning/SKILL.md +49 -0
- package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
- package/skills/requirements-and-planning/references/process-steps.md +52 -0
- package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
- package/skills/security-review/SKILL.md +40 -0
- package/skills/seo/README.md +60 -0
- package/skills/seo/SKILL.md +77 -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/antipatterns.md +66 -0
- package/skills/seo/references/audit-checklist.md +319 -0
- package/skills/seo/references/content-seo.md +204 -0
- package/skills/seo/references/eeat-medical.md +219 -0
- package/skills/seo/references/measurement.md +250 -0
- package/skills/seo/references/on-page.md +214 -0
- package/skills/seo/references/page-templates.md +56 -0
- package/skills/seo/references/stack-recipes.md +695 -0
- package/skills/seo/references/structured-data.md +487 -0
- package/skills/seo/references/technical-seo.md +296 -0
- package/skills/service-desk-conventions/SKILL.md +52 -0
- package/skills/service-desk-db-safety/SKILL.md +63 -0
- package/skills/service-desk-release/SKILL.md +61 -0
- package/skills/service-desk-testing/SKILL.md +61 -0
- package/skills/service-desk-ui/SKILL.md +52 -0
- package/skills/skills-router/SKILL.md +53 -0
- package/skills/skills-router/references/applying-skills.md +25 -0
- package/skills/skills-router/references/routing-matrix.md +52 -0
- package/skills/testing-strategy/SKILL.md +52 -0
- package/skills/ui-design-system/SKILL.md +50 -0
- package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
- package/skills/ui-design-system/references/tokens-and-components.md +67 -0
- package/skills/ui-design-system/references/visual-qa.md +44 -0
- package/skills/web-research/SKILL.md +47 -0
- package/skills/web-research/references/answer-and-citations.md +60 -0
- package/skills/web-research/references/query-recipes.md +44 -0
- package/skills/wow-design/SKILL.md +89 -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 +252 -0
- package/skills/wow-design/references/critique-rubric.md +262 -0
- package/skills/wow-design/references/design-brief-template.md +48 -0
- package/skills/wow-design/references/inspiration.md +203 -0
- package/skills/wow-design/references/presets.md +99 -0
- package/skills/wow-design/references/principles.md +371 -0
- package/skills/wow-design/references/quick-presets.md +50 -0
- package/skills/wow-design/references/report-template.md +21 -0
- package/skills/wow-design/references/stack-recipes.md +96 -0
- package/skills/wow-design/references/visual-qa.md +82 -0
- package/skills/wow-design/references/wow-levers.md +43 -0
- package/tools/skill-cost.mjs +76 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wow-design
|
|
3
|
+
description: "Дизайн-директор: арт-направление, токены AURORA, композиция, типографика, петля скриншот-критики. Загружать до вёрстки."
|
|
4
|
+
whenToUse: "Любой новый или изменяемый UI: страница, лендинг, дашборд, форма, компоненты, темы, адаптив, «сделай красиво»."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# WOW-DESIGN — дизайн-директор
|
|
9
|
+
|
|
10
|
+
> Дорого и уместно с первого раза. Красота = ясность, иерархия, доверие; ВАУ без потери удобства.
|
|
11
|
+
|
|
12
|
+
## Контракт
|
|
13
|
+
1. **Арт-бриф до кода** (5–10 мин): аудитория, задача, 3 слова, 1–2 референса, анти-референс, пресет,
|
|
14
|
+
signature-деталь. Шаблон — `references/design-brief-template.md`.
|
|
15
|
+
2. **Кит AURORA**, не палитра с нуля: 5 пресетов, локальные Golos Text / Lora / Unbounded,
|
|
16
|
+
`assets/kit/assets/css/tokens.css`, `base.css`, `fonts.css`, `components.css`; бренд — только
|
|
17
|
+
`--accent*` и шрифт;
|
|
18
|
+
без CDN и внешних картинок.
|
|
19
|
+
3. **Только токены**, без 13/17/22px.
|
|
20
|
+
4. **Петля:** capture → `read_image` → рубрика → 5–10 правок с числами → capture;
|
|
21
|
+
**≥2 итерации, первый вариант не сдаётся**.
|
|
22
|
+
5. **Гейт:** рубрика ≥4.4/5 и все ≥4; axe 0 critical/serious; 390 без overflow; light/dark; клавиатура.
|
|
23
|
+
6. **Отчёт:** скриншоты + rationale.
|
|
24
|
+
|
|
25
|
+
## Бриф и пресет
|
|
26
|
+
`aurora` клиника/премиум — Lora, изумруд+медь · `graphite` SaaS/дашборд — Unbounded, мята ·
|
|
27
|
+
`editorial` медиа — Lora, вермильон · `warm` забота — Lora, терракота · `swiss` B2B — Golos 700, красный.
|
|
28
|
+
Signature — ровно одна: цифры, номерные секции, монограмма, вертикальный лейбл, необычный
|
|
29
|
+
разделитель, зерно.
|
|
30
|
+
Палитры и do/don't — `references/quick-presets.md`.
|
|
31
|
+
|
|
32
|
+
## Процесс
|
|
33
|
+
1. Бриф.
|
|
34
|
+
2. Токены; в чужой теме замапь переменные и добавь недостающие, не перекрашивай всё;
|
|
35
|
+
контраст 4.5:1 (крупный 3:1), фокус видим.
|
|
36
|
+
3. Сетка 12, контейнер 1200–1360; hero 7/5–8/4: kicker (капс 11–12px) → H1 `clamp(3rem,7vw,6rem)` →
|
|
37
|
+
lead ≤52ch → 2 CTA → 3–4 факта → типографический якорь (типографика/SVG, не сток-фото);
|
|
38
|
+
секции `clamp(64px,8vw,128px)`, hairline; карточки — только для равнозначных; данные —
|
|
39
|
+
tabular-nums, правые числа.
|
|
40
|
+
4. Семантика, один `h1`, `lang="ru"`; 7 состояний, формы с error + help; иконки SVG 1.5–1.6,
|
|
41
|
+
у кнопок-иконок `aria-label`; без эмодзи и Lorem.
|
|
42
|
+
5. `node ~/.dsh/skills/wow-design/assets/scripts/capture.mjs <file> --name <page> --out <dir>`;
|
|
43
|
+
`.../audit.mjs <file> --out <dir>`; правки до гейта.
|
|
44
|
+
6. 390: `.table-wrap`, тапы 40–44; Tab/Escape/focus, focus trap в модалках, alt; reduced-motion;
|
|
45
|
+
dark — отдельная палитра, AA.
|
|
46
|
+
7. Сдача: 1440/768/390 light/dark + rationale.
|
|
47
|
+
|
|
48
|
+
Числа ремесла (шкала, строка, тени, радиусы, motion, состояния) — `references/principles.md`.
|
|
49
|
+
|
|
50
|
+
## Рычаги и антипаттерны
|
|
51
|
+
3–5 из 8: типоконтраст, редакционная сетка, одна смелая деталь, материальность, точные данные,
|
|
52
|
+
микродетали, движение, копирайт-результат; детали — `references/wow-levers.md`.
|
|
53
|
+
Запрещено: фиолетовые градиенты, 3 одинаковые карточки, glassmorphism, эмодзи, радиусы 24–32,
|
|
54
|
+
Bootstrap/Shadcn-дефолт, центрированный hero с блобами, gradient-text, контраст <4.5, стоковые фото,
|
|
55
|
+
карусели. Полные 42 — `references/anti-patterns.md`.
|
|
56
|
+
|
|
57
|
+
## Стеки
|
|
58
|
+
React+Tailwind: CSS-переменные, `@theme`, `data-state`. Laravel: `tokens.css`, не ломать `old()`.
|
|
59
|
+
Bitrix: только `local/`, чистка кэша. Рецепты — `references/stack-recipes.md`.
|
|
60
|
+
|
|
61
|
+
## Нужно → файл → ≈токенов
|
|
62
|
+
| Нужно | Файл | ≈токенов |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| Бриф | `design-brief-template.md` | 0.9k |
|
|
65
|
+
| Пресеты | `quick-presets.md` / `presets.md` | 1.6k / 2.7k |
|
|
66
|
+
| 76 правил | `principles.md` | 11.5k |
|
|
67
|
+
| Рубрика | `critique-rubric.md` | 7.4k |
|
|
68
|
+
| Антипаттерны | `anti-patterns.md` | 9k |
|
|
69
|
+
| Референсы | `inspiration.md` | 7.9k |
|
|
70
|
+
| Стеки | `stack-recipes.md` | 2.3k |
|
|
71
|
+
| Visual QA | `visual-qa.md` | 1.7k |
|
|
72
|
+
| Рычаги | `wow-levers.md` | 1k |
|
|
73
|
+
| Отчёт | `report-template.md` | 0.4k |
|
|
74
|
+
|
|
75
|
+
Кит — `assets/kit/` (`showcase.html`, `pages/hospital.html`, `pages/dashboard.html`); нет проекта —
|
|
76
|
+
начни с эталонной страницы.
|
|
77
|
+
|
|
78
|
+
## Гейт
|
|
79
|
+
- [ ] Бриф и signature.
|
|
80
|
+
- [ ] 5 секунд: что это и куда нажать; один акцент.
|
|
81
|
+
- [ ] Типографика 60–72ch, tabular-nums; состояния, формы, empty/loading.
|
|
82
|
+
- [ ] Скриншоты 1440/768/390, light/dark.
|
|
83
|
+
- [ ] 390: overflow 0, тапы 40–44, ничего не обрезано.
|
|
84
|
+
- [ ] Dark — отдельная палитра, AA.
|
|
85
|
+
- [ ] Axe 0 critical/serious; клавиатура.
|
|
86
|
+
- [ ] Рубрика ≥4.4, все ≥4; антипаттернов нет.
|
|
87
|
+
|
|
88
|
+
Правка чужого UI — сначала `design-critique`, «до», P0→P1, минимальные правки, «до/после».
|
|
89
|
+
Отчёт — `references/report-template.md`.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# AURORA — дизайн-кит для WOW-UI
|
|
2
|
+
|
|
3
|
+
Дизайн-система для интерфейсов, которые должны выглядеть дорого и уместно **с первого раза**.
|
|
4
|
+
Пять пресетов, две темы, типографика Lora + Golos Text + Unbounded, полный набор компонентов
|
|
5
|
+
и три эталонные страницы. Чистый HTML5 + CSS + vanilla JS: **без сборки, CDN и внешних запросов**.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
projects/design-kit/
|
|
9
|
+
├── showcase.html # витрина дизайн-системы (главный артефакт)
|
|
10
|
+
├── pages/
|
|
11
|
+
│ ├── hospital.html # эталон: премиальный лендинг клиники (aurora)
|
|
12
|
+
│ └── dashboard.html # эталон: Service Desk, product UI (graphite, light/dark)
|
|
13
|
+
├── assets/
|
|
14
|
+
│ ├── css/
|
|
15
|
+
│ │ ├── tokens.css # токены: цвет/типографика/отступы/эффекты (Lead, не менять)
|
|
16
|
+
│ │ ├── fonts.css # @font-face локальных шрифтов (Lead, не менять)
|
|
17
|
+
│ │ ├── base.css # reset, сетка, типографика, утилиты (Lead, не менять)
|
|
18
|
+
│ │ ├── components.css # все компоненты и состояния (этот кит)
|
|
19
|
+
│ │ └── pages.css # стили эталонных страниц и витрины
|
|
20
|
+
│ ├── js/
|
|
21
|
+
│ │ └── kit.js # тема/пресет, reveal, tabs, модалка, меню, toast, демо-состояния
|
|
22
|
+
│ └── fonts/*.woff2 # Golos Text, Lora, Unbounded (OFL)
|
|
23
|
+
├── screenshots/ # скриншоты 1440/390, light/dark + full-page
|
|
24
|
+
└── README.md
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Быстрый старт
|
|
28
|
+
|
|
29
|
+
1. Откройте **`showcase.html` двойным кликом** — всё работает по `file://`, без сервера.
|
|
30
|
+
2. Оттуда — ссылки на `pages/hospital.html` и `pages/dashboard.html`.
|
|
31
|
+
3. Тема переключается кнопкой-«луной/солнцем» в шапке (запоминается в `localStorage`).
|
|
32
|
+
Пресеты на витрине — сегментированный переключатель `Aurora · Graphite · Editorial · Warm · Swiss`.
|
|
33
|
+
4. На эталонных страницах пресет закреплён: клиника — `aurora`, дашборд — `graphite`.
|
|
34
|
+
|
|
35
|
+
## Пресеты и темы
|
|
36
|
+
|
|
37
|
+
Пресет — атрибут `<html data-preset="...">`, тема — `<html data-theme="light|dark">`.
|
|
38
|
+
Все цвета/шрифты/радиусы/тени берутся из `tokens.css`.
|
|
39
|
+
|
|
40
|
+
| Пресет | Когда | Настроение | Display | Акцент |
|
|
41
|
+
|---|---|---|---|---|
|
|
42
|
+
| `aurora` | клиника, культура, премиум-сервис | тихая роскошь, тепло, доверие | Lora | изумруд `#0E6E5E` + медь |
|
|
43
|
+
| `graphite` | продукт, SaaS, дашборды | точность, плотность, контроль | Unbounded | мята/изумруд |
|
|
44
|
+
| `editorial` | медиа, истории, лендинги | журнал, характер | Lora | вермильон |
|
|
45
|
+
| `warm` | сервис для людей, забота | человечность, крем | Lora | терракота |
|
|
46
|
+
| `swiss` | строгий корпоративный, B2B | сетка, контраст | Golos 700 | красный |
|
|
47
|
+
|
|
48
|
+
Под бренд меняются **только** переменные акцента (см. `tokens.css`):
|
|
49
|
+
`--accent`, `--accent-hover`, `--accent-press`, `--accent-soft`, `--accent-ink`, `--accent-contrast`.
|
|
50
|
+
Правило: контраст `--accent` ↔ `--accent-contrast` ≥ 4.5:1; `--accent-ink` — текст на `*-soft`.
|
|
51
|
+
|
|
52
|
+
## Как переиспользовать
|
|
53
|
+
|
|
54
|
+
### 1. Подключите базовые файлы (в этом порядке)
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<link rel="stylesheet" href="assets/css/tokens.css">
|
|
58
|
+
<link rel="stylesheet" href="assets/css/fonts.css">
|
|
59
|
+
<link rel="stylesheet" href="assets/css/base.css">
|
|
60
|
+
<link rel="stylesheet" href="assets/css/components.css">
|
|
61
|
+
<!-- pages.css — только если нужны паттерны эталонных страниц -->
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 2. Размечайте компонентами
|
|
65
|
+
|
|
66
|
+
```html
|
|
67
|
+
<button class="btn btn--primary">Записаться</button>
|
|
68
|
+
<button class="btn btn--secondary btn--sm">Отмена</button>
|
|
69
|
+
|
|
70
|
+
<div class="field">
|
|
71
|
+
<label class="label" for="phone">Телефон</label>
|
|
72
|
+
<input class="input" id="phone" type="tel" placeholder="+7 (___) ___-__-__">
|
|
73
|
+
<span class="field__hint">Напомним за день до приёма.</span>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<span class="badge badge--success badge--dot">Решена</span>
|
|
77
|
+
<div class="card"><div class="card__body">…</div></div>
|
|
78
|
+
<div class="table-wrap"><table class="table">…</table></div>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Полный каталог классов — в оглавлении `components.css` (18 секций): кнопки, поля и формы,
|
|
82
|
+
бейджи/статусы, карточки/frame, таблицы, tabs, алерты, toast, модалка, меню/dropdown/tooltip,
|
|
83
|
+
крошки/пагинация/segmented, аватары/progress/skeleton/empty/timeline, KPI+sparkline,
|
|
84
|
+
каркас приложения (sidebar/topbar), hero-паттерны, списки и утилиты.
|
|
85
|
+
|
|
86
|
+
### 3. JS (только если нужны интерактивные состояния)
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<script src="assets/js/kit.js" defer></script>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Разметка «включает» поведение через data-атрибуты:
|
|
93
|
+
|
|
94
|
+
| Атрибут | Что делает |
|
|
95
|
+
|---|---|
|
|
96
|
+
| `data-theme-toggle` | переключатель светлой/тёмной темы |
|
|
97
|
+
| `data-preset-set="graphite"` | кнопка выбора пресета (на витрине) |
|
|
98
|
+
| `.reveal` + `data-delay="1..5"` | появление при скролле (stagger 60 ms) |
|
|
99
|
+
| `data-tabs` + `role="tab"/"tabpanel"` | tabs с клавиатурой (← → Home End) |
|
|
100
|
+
| `data-modal-open="#id"`, `data-modal-close` | модалка: Escape, focus trap, возврат фокуса |
|
|
101
|
+
| `data-nav-toggle="#nav"` + `.nav-scrim` | мобильное меню/drawer |
|
|
102
|
+
| `data-dropdown` + `data-dropdown-toggle` | dropdown-меню |
|
|
103
|
+
| `data-demo-loading`, `data-demo-toast` | демонстрация loading/toast (витрина) |
|
|
104
|
+
| `data-copy="значение"` | копирование значения в буфер + toast |
|
|
105
|
+
|
|
106
|
+
> **Почему не `<script type="module">`?** `kit.js` написан как ES2022-модуль (без импортов/экспортов),
|
|
107
|
+
> но подключается обычным `defer`-скриптом: Chrome блокирует внешние module-скрипты на `file://`,
|
|
108
|
+
> а страницы кита обязаны открываться двойным кликом. В ESM-проекте достаточно заменить тег на
|
|
109
|
+
> `type="module"` — код менять не нужно.
|
|
110
|
+
|
|
111
|
+
### 4. Иконки
|
|
112
|
+
|
|
113
|
+
Иконки — inline SVG-спрайт в начале `<body>` (stroke 1.6, 24×24), использование:
|
|
114
|
+
`<svg class="icon icon--sm" viewBox="0 0 24 24" aria-hidden="true"><use href="#i-search"/></svg>`.
|
|
115
|
+
Скопируйте нужные `<symbol>` в свою страницу. Никаких эмодзи и внешних иконочных шрифтов.
|
|
116
|
+
|
|
117
|
+
### 5. Токены, а не магические числа
|
|
118
|
+
|
|
119
|
+
Отступы — `--sp-1…--sp-14`, кегли — `--text-*`/`--display-*`, контейнер — `--container*`,
|
|
120
|
+
радиусы — `--radius-*`, тени — `--shadow-*`, движение — `--dur*`/`--ease*`.
|
|
121
|
+
Новые значения добавляйте в `tokens.css` своего проекта, а не в компоненты.
|
|
122
|
+
|
|
123
|
+
## Эталонные страницы
|
|
124
|
+
|
|
125
|
+
### `pages/hospital.html` — aurora
|
|
126
|
+
Utility-бар → sticky-навигация → асимметричный hero 7/5 (serif-H1, «печать» с лицензией,
|
|
127
|
+
proof-строка) → редакционный нумерованный список направлений 01–08 с hover-подсветкой →
|
|
128
|
+
«Путь пациента» (4 шага) → 3 карточки врачей с монограммами → доверие (лицензии/оборудование/
|
|
129
|
+
страховки) → новости → CTA-полоса → футер с юр. информацией. Без фото — только типографика, SVG и монограммы.
|
|
130
|
+
|
|
131
|
+
### `pages/dashboard.html` — graphite
|
|
132
|
+
Тёмный сайдбар 248 px → топбар (крошки, поиск с ⌘K, уведомления, профиль) → 4 KPI со sparkline
|
|
133
|
+
и дельтой → SVG area-график SLA + донат «SLA 94,2 %» → таблица заявок (sticky-заголовок,
|
|
134
|
+
tabular-nums, SLA-таймеры, hover-действия, скролл на мобильном) → лента активности → загрузка смены → пагинация.
|
|
135
|
+
Полноценная светлая и тёмная тема.
|
|
136
|
+
|
|
137
|
+
## Качество и проверки
|
|
138
|
+
|
|
139
|
+
- **axe critical/serious = 0** на всех трёх страницах (WCAG AA по контрасту текста; интерактив ≥ 24 px,
|
|
140
|
+
иконочные кнопки 44 px, focus-visible, aria, reduced-motion).
|
|
141
|
+
- **Нет горизонтального overflow** на 390 px; таблица скроллится внутри контейнера.
|
|
142
|
+
- Шрифты локальные, `document.fonts.status = loaded`; внешних запросов нет.
|
|
143
|
+
- Скриншоты снимаются готовыми инструментами из корня workspace:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name showcase --out projects/design-kit/screenshots
|
|
147
|
+
node tools/design-qa/audit.mjs projects/design-kit/showcase.html --name showcase
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
`capture` даёт 6 кадров: desktop 1440×900, tablet 768×1024, mobile 390×844 × light/dark
|
|
151
|
+
(full-page); `--no-full` — только первый экран. `audit` — axe + overflow + тапы + шрифты + консоль.
|
|
152
|
+
|
|
153
|
+
### Скриншоты в `screenshots/`
|
|
154
|
+
- `showcase-1440-light.png`, `showcase-1440-dark.png`, `showcase-390-light.png` — first impression
|
|
155
|
+
- `hospital-1440-light.png`, `hospital-1440-dark.png`, `hospital-390-light.png`
|
|
156
|
+
- `dashboard-1440-light.png`, `dashboard-1440-dark.png`, `dashboard-390-light.png`, `dashboard-390-dark.png`
|
|
157
|
+
- `<page>-desktop|tablet|mobile-light|dark.png` — full-page для каждой страницы (18 файлов)
|
|
158
|
+
|
|
159
|
+
### Самооценка по рубрике (`tmp/design-research/04-critique-rubric.md`)
|
|
160
|
+
|
|
161
|
+
| # | Критерий | Showcase | Hospital | Dashboard |
|
|
162
|
+
|---|---|---|---|---|
|
|
163
|
+
| К1 | Первое впечатление / концепция | 5 | 5 | 5 |
|
|
164
|
+
| К2 | Иерархия и маршрут взгляда | 4 | 5 | 5 |
|
|
165
|
+
| К3 | Типографика | 5 | 5 | 4 |
|
|
166
|
+
| К4 | Цвет и контраст | 4 | 5 | 5 |
|
|
167
|
+
| К5 | Сетка и ритм | 5 | 5 | 5 |
|
|
168
|
+
| К6 | Воздух и плотность | 5 | 5 | 4 |
|
|
169
|
+
| К7 | Компоненты и состояния | 5 | 4 | 5 |
|
|
170
|
+
| К8 | Консистентность | 5 | 5 | 5 |
|
|
171
|
+
| К9 | Детали и полировка | 4 | 4 | 4 |
|
|
172
|
+
| К10 | Адаптив и мобильный | 4 | 4 | 4 |
|
|
173
|
+
| К11 | Доступность | 5 | 5 | 5 |
|
|
174
|
+
| К12 | Оригинальность vs польза | 5 | 4 | 5 |
|
|
175
|
+
| | **Средневзвешенный балл** | **4.67** | **4.78** | **4.69** |
|
|
176
|
+
|
|
177
|
+
Порог DoD (≥ 4.4, ни один критерий < 4) выполнен; axe critical/serious = 0; overflow 390 = 0.
|
|
178
|
+
|
|
179
|
+
## Принципы (не нарушать)
|
|
180
|
+
|
|
181
|
+
- **Типографика — герой.** Display ↔ body ↔ служебный текст: контраст масштабов, строка 60–72 ch,
|
|
182
|
+
табличные цифры, капс-лейблы с трекингом.
|
|
183
|
+
- **Воздух — материал.** Секции 96–128 px, волосяные линии вместо рамок, асимметрия 7/5 и 8/4.
|
|
184
|
+
- **Один акцент.** Цвет работает на иерархию, а не на эффект; семантика статусов дублируется текстом.
|
|
185
|
+
- **Тени слоистые, радиусы по пресету**, не «всё rounded-3xl»; никакого стекла на каждом блоке.
|
|
186
|
+
- **Иконки — только inline SVG 1.5–1.6 px**, без эмодзи; фото и стоки не используются.
|
|
187
|
+
- **Motion 160–260 ms**, один easing, reveal 700 ms; `prefers-reduced-motion` уважается.
|
|
188
|
+
- **Копирайт — живой русский:** глаголы, конкретика, числа. Никаких «Инновационных решений» и Lorem ipsum.
|
|
189
|
+
- **Доступность:** контраст AA, focus-visible, aria, модалка с focus trap, тап-цели ≥ 24 px (иконочные — 44).
|
|
190
|
+
|
|
191
|
+
## Лицензии
|
|
192
|
+
|
|
193
|
+
Шрифты Golos Text, Lora, Unbounded — SIL Open Font License, файлы локальные
|
|
194
|
+
(`assets/fonts/LICENSE-*.txt`). Код кита можно свободно переиспользовать внутри проектов DSH.
|
|
195
|
+
Данные на эталонных страницах — вымышленные (демонстрационные), совпадения случайны.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
AURORA · BASE — reset, типографика, сетка, утилиты, эффекты
|
|
3
|
+
========================================================================== */
|
|
4
|
+
|
|
5
|
+
*,*::before,*::after{box-sizing:border-box}
|
|
6
|
+
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}
|
|
7
|
+
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
|
|
8
|
+
|
|
9
|
+
html,body{margin:0;padding:0}
|
|
10
|
+
body{
|
|
11
|
+
min-height:100svh;
|
|
12
|
+
background:var(--bg);
|
|
13
|
+
color:var(--ink);
|
|
14
|
+
font-family:var(--font-body);
|
|
15
|
+
font-size:var(--text-md);
|
|
16
|
+
font-weight:400;
|
|
17
|
+
line-height:var(--lh-relaxed);
|
|
18
|
+
letter-spacing:-.006em;
|
|
19
|
+
-webkit-font-smoothing:antialiased;
|
|
20
|
+
-moz-osx-font-smoothing:grayscale;
|
|
21
|
+
text-rendering:optimizeLegibility;
|
|
22
|
+
transition:background-color var(--dur-slow) var(--ease),color var(--dur-slow) var(--ease);
|
|
23
|
+
}
|
|
24
|
+
body::before{
|
|
25
|
+
content:"";position:fixed;inset:0;z-index:var(--z-toast);pointer-events:none;
|
|
26
|
+
opacity:var(--grain-opacity);
|
|
27
|
+
background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
28
|
+
mix-blend-mode:multiply;
|
|
29
|
+
}
|
|
30
|
+
[data-theme="dark"] body::before{mix-blend-mode:screen}
|
|
31
|
+
|
|
32
|
+
::selection{background:var(--selection-bg);color:var(--ink)}
|
|
33
|
+
:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:var(--radius-sm)}
|
|
34
|
+
:focus:not(:focus-visible){outline:none}
|
|
35
|
+
|
|
36
|
+
img,svg,video,canvas{display:block;max-width:100%}
|
|
37
|
+
img{height:auto}
|
|
38
|
+
button,input,select,textarea{font:inherit;color:inherit}
|
|
39
|
+
button{background:none;border:0;padding:0;cursor:pointer}
|
|
40
|
+
a{color:inherit;text-decoration-color:color-mix(in oklab,var(--accent) 45%,transparent);text-underline-offset:.22em;transition:color var(--dur) var(--ease),text-decoration-color var(--dur) var(--ease)}
|
|
41
|
+
a:hover{color:var(--accent-ink);text-decoration-color:var(--accent-ink)}
|
|
42
|
+
ul,ol{margin:0;padding:0;list-style:none}
|
|
43
|
+
hr{border:0;border-top:var(--hairline);margin:0}
|
|
44
|
+
::placeholder{color:var(--faint);opacity:1}
|
|
45
|
+
[hidden]{display:none!important}
|
|
46
|
+
|
|
47
|
+
/* ---- Типографика ---- */
|
|
48
|
+
h1,h2,h3,h4,h5,h6{margin:0;font-weight:600;line-height:var(--lh-snug);letter-spacing:-.015em;text-wrap:balance}
|
|
49
|
+
h1,h2{font-family:var(--font-display);font-weight:var(--display-weight);letter-spacing:var(--display-tracking);line-height:var(--lh-tight)}
|
|
50
|
+
p{margin:0}
|
|
51
|
+
strong,b{font-weight:600}
|
|
52
|
+
small{font-size:var(--text-sm)}
|
|
53
|
+
code,kbd,samp,pre{font-family:var(--font-mono);font-size:.9em}
|
|
54
|
+
.kbd{display:inline-flex;align-items:center;gap:2px;min-width:22px;height:22px;padding:0 6px;border:var(--hairline);border-bottom-width:2px;border-radius:5px;background:var(--surface-2);color:var(--muted);font-family:var(--font-mono);font-size:var(--text-2xs);line-height:1}
|
|
55
|
+
|
|
56
|
+
.display-xl{font-family:var(--font-display);font-weight:var(--display-weight);font-size:var(--display-xl);line-height:var(--lh-none);letter-spacing:var(--display-tracking)}
|
|
57
|
+
.display-l{font-family:var(--font-display);font-weight:var(--display-weight);font-size:var(--display-l);line-height:1.02;letter-spacing:var(--display-tracking)}
|
|
58
|
+
.display-m{font-family:var(--font-display);font-weight:var(--display-weight);font-size:var(--display-m);line-height:1.06;letter-spacing:var(--display-tracking)}
|
|
59
|
+
.display-s{font-family:var(--font-display);font-weight:var(--display-weight);font-size:var(--display-s);line-height:1.1;letter-spacing:var(--display-tracking)}
|
|
60
|
+
.lead{font-size:clamp(1.0625rem,1.35vw,1.25rem);line-height:1.6;color:var(--ink-2);max-width:var(--measure)}
|
|
61
|
+
.eyebrow{display:inline-flex;align-items:center;gap:10px;font-size:var(--text-xs);font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
|
|
62
|
+
.eyebrow::before{content:"";width:24px;height:1px;background:var(--accent)}
|
|
63
|
+
.eyebrow--plain::before{display:none}
|
|
64
|
+
.muted{color:var(--muted)}
|
|
65
|
+
.faint{color:var(--faint)}
|
|
66
|
+
.measure{max-width:var(--measure)}
|
|
67
|
+
.measure-narrow{max-width:var(--measure-narrow)}
|
|
68
|
+
.tnum{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
|
|
69
|
+
.serif{font-family:var(--font-display)}
|
|
70
|
+
.mono{font-family:var(--font-mono)}
|
|
71
|
+
.italic{font-style:italic}
|
|
72
|
+
.caps{text-transform:uppercase;letter-spacing:.12em;font-size:var(--text-xs);font-weight:600}
|
|
73
|
+
.text-balance{text-wrap:balance}
|
|
74
|
+
.text-pretty{text-wrap:pretty}
|
|
75
|
+
|
|
76
|
+
/* ---- Сетка / раскладка ---- */
|
|
77
|
+
.container{width:100%;max-width:var(--container);margin-inline:auto;padding-inline:var(--gutter)}
|
|
78
|
+
.container-wide{width:100%;max-width:var(--container-wide);margin-inline:auto;padding-inline:var(--gutter)}
|
|
79
|
+
.container-narrow{width:100%;max-width:var(--container-narrow);margin-inline:auto;padding-inline:var(--gutter)}
|
|
80
|
+
.section{padding-block:var(--section-y)}
|
|
81
|
+
.section--tight{padding-block:clamp(40px,5vw,72px)}
|
|
82
|
+
.section--flush-top{padding-top:0}
|
|
83
|
+
.section--surface{background:var(--surface)}
|
|
84
|
+
.section--alt{background:var(--bg-alt)}
|
|
85
|
+
.grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:var(--gap-inline)}
|
|
86
|
+
.grid-2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--gap-inline)}
|
|
87
|
+
.grid-3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--gap-inline)}
|
|
88
|
+
.stack{display:flex;flex-direction:column}
|
|
89
|
+
.stack-2{gap:var(--sp-2)} .stack-3{gap:var(--sp-3)} .stack-4{gap:var(--sp-4)}
|
|
90
|
+
.stack-5{gap:var(--sp-5)} .stack-6{gap:var(--sp-6)} .stack-7{gap:var(--sp-7)}
|
|
91
|
+
.stack-8{gap:var(--sp-8)} .stack-10{gap:var(--sp-10)}
|
|
92
|
+
.cluster{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-4)}
|
|
93
|
+
.cluster--tight{gap:var(--sp-2)}
|
|
94
|
+
.between{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-4)}
|
|
95
|
+
.center{display:flex;align-items:center;justify-content:center}
|
|
96
|
+
.full{width:100%}
|
|
97
|
+
.rule{border-top:var(--hairline)}
|
|
98
|
+
.rule--strong{border-top:1px solid var(--line-strong)}
|
|
99
|
+
|
|
100
|
+
.section-head{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,4fr);gap:var(--gap-inline);align-items:end;margin-bottom:clamp(32px,4vw,56px)}
|
|
101
|
+
.section-head .lead{max-width:52ch}
|
|
102
|
+
.section-head--center{grid-template-columns:1fr;justify-items:center;text-align:center}
|
|
103
|
+
.section-head--center .lead{max-width:60ch}
|
|
104
|
+
|
|
105
|
+
/* Асимметричные сплиты */
|
|
106
|
+
.split{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,5fr);gap:clamp(24px,4vw,64px);align-items:center}
|
|
107
|
+
.split--wide-left{grid-template-columns:minmax(0,8fr) minmax(0,4fr)}
|
|
108
|
+
.split--wide-right{grid-template-columns:minmax(0,4fr) minmax(0,8fr)}
|
|
109
|
+
.split--top{align-items:start}
|
|
110
|
+
|
|
111
|
+
/* Декоративная сетка-фон */
|
|
112
|
+
.grid-bg{position:relative;isolation:isolate}
|
|
113
|
+
.grid-bg::before{
|
|
114
|
+
content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;
|
|
115
|
+
background-image:linear-gradient(to right,var(--grid-line) 1px,transparent 1px);
|
|
116
|
+
background-size:calc(100% / 6) 100%;
|
|
117
|
+
mask-image:linear-gradient(to bottom,transparent,#000 18%,#000 82%,transparent);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* ---- Reveal on scroll ---- */
|
|
121
|
+
.reveal{opacity:0;transform:translateY(var(--reveal-shift));transition:opacity var(--dur-reveal) var(--ease-out),transform var(--dur-reveal) var(--ease-out)}
|
|
122
|
+
.reveal.is-in{opacity:1;transform:none}
|
|
123
|
+
.reveal[data-delay="1"]{transition-delay:60ms}
|
|
124
|
+
.reveal[data-delay="2"]{transition-delay:120ms}
|
|
125
|
+
.reveal[data-delay="3"]{transition-delay:180ms}
|
|
126
|
+
.reveal[data-delay="4"]{transition-delay:240ms}
|
|
127
|
+
.reveal[data-delay="5"]{transition-delay:300ms}
|
|
128
|
+
|
|
129
|
+
/* ---- Доступность ---- */
|
|
130
|
+
.sr-only{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
131
|
+
.skip-link{position:fixed;left:16px;top:-120px;z-index:var(--z-toast);padding:10px 16px;border-radius:var(--radius-control);background:var(--accent);color:var(--accent-contrast);font-weight:600;transition:top var(--dur) var(--ease)}
|
|
132
|
+
.skip-link:focus{top:16px;color:var(--accent-contrast)}
|
|
133
|
+
|
|
134
|
+
/* ---- Скроллбар ---- */
|
|
135
|
+
*{scrollbar-width:thin;scrollbar-color:var(--line-strong) transparent}
|
|
136
|
+
::-webkit-scrollbar{width:10px;height:10px}
|
|
137
|
+
::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:99px;border:2px solid var(--bg)}
|
|
138
|
+
::-webkit-scrollbar-track{background:transparent}
|
|
139
|
+
|
|
140
|
+
/* ---- Адаптив ---- */
|
|
141
|
+
@media (max-width:1024px){
|
|
142
|
+
.split,.split--wide-left,.split--wide-right{grid-template-columns:1fr;gap:clamp(24px,4vw,40px)}
|
|
143
|
+
.grid-3{grid-template-columns:repeat(2,minmax(0,1fr))}
|
|
144
|
+
.section-head{grid-template-columns:1fr;align-items:start}
|
|
145
|
+
}
|
|
146
|
+
@media (max-width:720px){
|
|
147
|
+
:root{--header-h:64px}
|
|
148
|
+
.grid-2,.grid-3{grid-template-columns:1fr}
|
|
149
|
+
.section-head{margin-bottom:32px}
|
|
150
|
+
.hide-mobile{display:none!important}
|
|
151
|
+
}
|
|
152
|
+
@media (prefers-reduced-motion:reduce){
|
|
153
|
+
*,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
|
|
154
|
+
.reveal{opacity:1;transform:none}
|
|
155
|
+
}
|
|
156
|
+
@media print{
|
|
157
|
+
body::before,.skip-link{display:none}
|
|
158
|
+
}
|