diff --git a/00-overview.md b/00-overview.md
index a2e6370..e4e0e67 100644
--- a/00-overview.md
+++ b/00-overview.md
@@ -24,7 +24,8 @@ Encode premium web design taste into reusable patterns so LLMs can generate prof
| 🎯 Landing | 25 patterns | ✅ Complete |
| 🎬 Blender Pipeline | 1 pipeline spec | ✅ Complete |
| ⚙️ Deterministic Gen | 1 methodology | ✅ Complete |
-| **Total** | **82 patterns + assets** | **✅ Complete** |
+| 🏢 Brand Design Systems | 74 brands (147 DESIGN.md) | ✅ Complete |
+| **Total** | **82 patterns + 74 brand systems + assets** | **✅ Complete** |
## 📁 Structure
@@ -84,6 +85,17 @@ wow-design-wiki/
│ ├── media/00-media-prompts.md
│ ├── psychology/00-psychology-prompts.md
│ └── system/00-system-prompts.md
+├── design-systems/
+│ ├── airbnb/
+│ │ ├── DESIGN.md (brand analysis: colors, typography, components)
+│ │ └── README.md
+│ ├── stripe/
+│ │ ├── DESIGN.md
+│ │ └── README.md
+│ ├── ... (72 more brands)
+│ └── zapier/
+│ ├── DESIGN.md
+│ └── README.md
└── assets/
├── icons/
│ ├── carbon/ (2673 SVG icons, 2.5 MB)
diff --git a/concepts/accessibility-standards.md b/concepts/accessibility-standards.md
new file mode 100644
index 0000000..4f77627
--- /dev/null
+++ b/concepts/accessibility-standards.md
@@ -0,0 +1,63 @@
+---
+title: Accessibility (WCAG) Standards
+description: Web accessibility guidelines for premium design.
+tags: [accessibility, wcag, contrast, screen-reader, keyboard]
+---
+
+# Accessibility (WCAG) Standards
+
+## WCAG 2.1 Level AA Requirements
+
+### 1. Perceivable
+- Text alternatives for non-text content
+- Captions for multimedia
+- Content adaptable (1 column, no scroll)
+- Color contrast: 4.5:1 (normal), 3:1 (large)
+
+### 2. Operable
+- Keyboard accessible
+- Enough time to read/use
+- No flashing >3 times/second
+- Navigable (skip links, headings, focus)
+
+### 3. Understandable
+- Readable text
+- Predictable navigation
+- Input assistance (labels, placeholders)
+
+### 4. Robust
+- Compatible with assistive tech
+- Valid HTML
+- ARIA labels where needed
+
+## Focus Management
+
+```css
+:focus-visible {
+ outline: 2px solid var(--accent-primary);
+ outline-offset: 2px;
+ border-radius: 2px;
+}
+```
+
+## Screen Reader Patterns
+
+```html
+
+Skip to content
+
+
+
+
+...
+
+
+
+
Loading...
+```
+
+## Anti-Patterns
+- Never rely on color alone
+- Never remove focus outlines without replacement
+- Never use `display: none` for hiding content that should be accessible
+- Never skip heading hierarchy (h1 → h2 → h3)
diff --git a/concepts/animation-physics.md b/concepts/animation-physics.md
new file mode 100644
index 0000000..7d21f5a
--- /dev/null
+++ b/concepts/animation-physics.md
@@ -0,0 +1,62 @@
+---
+title: Animation Physics & Easing
+description: Natural-feeling animations that follow physical principles.
+tags: [animation, physics, easing, motion, motion-design]
+---
+
+# Animation Physics & Easing
+
+## Easing Curves
+
+### ease-out (default)
+```
+cubic-bezier(0.25, 0.1, 0.25, 1.0)
+```
+- Use for: entrances, hovers, reveals
+- Feel: snappy, confident
+
+### ease-in-out
+```
+cubic-bezier(0.4, 0.0, 0.2, 1.0)
+```
+- Use for: page transitions, modals
+- Feel: smooth, balanced
+
+### spring (natural bounce)
+```
+cubic-bezier(0.34, 1.56, 0.64, 1.0)
+```
+- Use for: magnetic buttons, pull-to-refresh
+- Feel: lively, tactile
+
+## Duration Scale
+
+| Context | Duration | Use Case |
+|---------|----------|----------|
+| Fast | 150ms | Icon hover, tooltip |
+| Normal | 300ms | Button hover, card lift |
+| Slow | 500ms | Page transitions, modals |
+| Epic | 800ms | Hero section reveals |
+
+## Stagger Timing
+
+```
+stagger = 0.06s - 0.12s per element
+```
+- Grid items: 0.08s
+- List items: 0.06s
+- Navigation: 0.05s
+
+## Physics Rules
+
+1. **Objects don't start at max speed** — always ease-out
+2. **Heavier elements move slower** — scale duration with size
+3. **Movement creates momentum** — add overshoot for spring effects
+4. **Elements react to each other** — chain animations logically
+5. **Silence matters** — pause between animation sequences
+
+## Anti-Patterns
+- Never use linear easing (feels robotic)
+- Never animate everything at once (stagger!)
+- Never exceed 500ms for micro-interactions
+- Never ignore `prefers-reduced-motion`
diff --git a/concepts/ant-design-chinese-systems.md b/concepts/ant-design-chinese-systems.md
new file mode 100644
index 0000000..00ffade
--- /dev/null
+++ b/concepts/ant-design-chinese-systems.md
@@ -0,0 +1,60 @@
+---
+title: Ant Design and Chinese Enterprise Design Systems
+created: 2026-06-02
+updated: 2026-06-02
+type: concept
+tags: [web-design, design-system, chinese-design]
+sources:
+ - raw/articles/web-design-research.md
+ - https://ant.design/
+ - https://tdesign.tencent.com/
+confidence: high
+---
+
+# Ant Design и Китайские Enterprise-дизайн системы
+
+## Ant Design (Ant Group / Alibaba)
+Самая популярная enterprise-дизайн система в мире (после Material Design).
+
+### 5 принципов Ant Design
+1. **Proximity** — близость: связанные элементы группируются
+2. **Alignment** — выравнивание: создаёт визуальный порядок
+3. **Contrast** — контраст: выделяет важное
+4. **Repetition** — повторение: создаёт единообразие
+5. **Consistency** — последовательность: основа доверия
+
+### Ценности дизайн-языка
+- **Natural** — естественность: интеракции, следующие физическому миру
+- **Certain** — определённость: предсказуемое поведение интерфейса
+- **Meaningful** — осмысленность: каждый элемент служит цели
+- **Growing** — рост: система развивается с пользователем
+
+### Техническая база
+- React-компоненты (TypeScript)
+- Design Tokens (CSS Variables)
+- 70+ компонентов
+- Темы: светлая, тёмная, кастомная
+- i18n (включая 50+ языков)
+
+## TDesign (Tencent)
+Китайская альтернатива Ant Design от Tencent.
+
+### Особенности
+- Vue 3, React, Angular, Mobile — 4 фреймворка сразу
+- 500+ компонентов (один из самых больших наборов)
+- Цветовая система на основе оттенков (10 ступеней на цвет)
+- Адаптивная: desktop → mobile одной библиотекой
+- Полностью открытая (MIT)
+
+## Общие черты китайских дизайн-систем
+- Высокая плотность контента (по умолчанию compact mode)
+- Вертикальная ориентация (узкие экраны — стандарт)
+- Многоцветность (богатые палитры, градиенты)
+- Enterprise-first (мощные таблицы, фильтры, дашборды)
+- Анимация как часть дизайна (микро-взаимодействия обязательны)
+
+## Применение для российских сайтов
+- взять систему токенов и компонентный подход
+- использовать compact mode для информативных дашбордов
+- кастомизировать цвета под российский рынок (не ярко-красный, а приглушённый)
+- анимации умеренно — для РФ важнее скорость загрузки (медленный интернет в регионах)
diff --git a/concepts/apple-hig-principles.md b/concepts/apple-hig-principles.md
new file mode 100644
index 0000000..be23bc3
--- /dev/null
+++ b/concepts/apple-hig-principles.md
@@ -0,0 +1,48 @@
+---
+title: Apple HIG Design Principles
+created: 2026-06-02
+updated: 2026-06-02
+type: concept
+tags: [web-design, ux]
+sources:
+ - https://developer.apple.com/design/human-interface-guidelines/
+ - https://applemagazine.com/apple-human-interface-blueprint/
+confidence: high
+---
+
+# Apple Human Interface Guidelines — Ключевые принципы
+
+## 3 столпа философии дизайна Apple
+
+### Clarity (Ясность)
+Контент — король. UI-элементы не должны конкурировать с контентом.
+- Чистая типографика, достаточный размер шрифта
+- Минимум декоративных элементов
+- Иконки должны быть простыми и узнаваемыми
+- Цвет используется осмысленно — для акцентов, а не украшения
+
+### Deference (Уважение)
+Интерфейс служит контенту, а не наоборот.
+- Прозрачные панели, blur-эффекты создают ощущение контекста
+- UI-элементы исчезают, когда не нужны
+- Анимация лишь поддерживает взаимодействие, не доминирует
+
+### Depth (Глубина)
+Визуальная иерархия через слои и движение.
+- Параллакс, тени, наслоение создают иллюзию трёхмерности
+- Реалистичное движение помогает понимать, откуда пришёл элемент
+- Navigate через жесты (swipe back) — физическая метафора
+
+## Практические правила Apple HIG
+1. **Aesthetic Integrity** — визуальный стиль соответствует функции (игровой UI ≠ корпоративный UI)
+2. **Consistency** — стандартные жесты, паттерны, иконки по всей платформе
+3. **Direct Manipulation** — пользователь управляет объектами напрямую (слайдер, перетаскивание)
+4. **Feedback** — каждое действие получает отклик
+5. **Metaphors** — виртуальные объекты ведут себя как физические (перелистывание страниц)
+6. **User Control** — пользователь инициирует действия, а не система
+
+## Применение к веб-дизайну (не iOS)
+- **Clarity**: использовать крупные заголовки, чёткую типографику, минимум UI-шума
+- **Deference**: контентные секции с прозрачными разделителями, CTA под контент
+- **Depth**: плавные page-transitions, hover-эффекты с тенью, cascade-слои
+- **Aesthetic Integrity**: стиль под цель — для лендинга больше пространства, для магазина — плотнее
diff --git a/concepts/checkout-ux-baymard.md b/concepts/checkout-ux-baymard.md
new file mode 100644
index 0000000..ba08d38
--- /dev/null
+++ b/concepts/checkout-ux-baymard.md
@@ -0,0 +1,45 @@
+---
+title: Checkout UX Research (Baymard)
+created: 2026-06-02
+updated: 2026-06-02
+type: concept
+tags: [web-design, ux, conversion]
+sources:
+ - https://baymard.com/blog/current-state-of-checkout-ux
+ - https://baymard.com/lists/cart-abandonment-rate
+confidence: high
+---
+
+# Checkout UX Research — Baymard Institute
+
+## Контекст
+Baymard Institute — независимый датский исследовательский институт.
+Проанализировали 326 топовых e-commerce сайтов, тысячи аннотированных скриншотов.
+
+## Ключевые цифры
+- **65%** топовых e-commerce сайтов показывают «посредственный» или худший UX в checkout
+- **$260 млрд** — восстановимый объём брошенных корзин в год
+- **11 ключевых проблем** в checkout (обновлено 2025–2026)
+
+## Топ-3 проблемы checkout (Baymard 2025–2026)
+
+### 1. Слишком строгие требования к паролю (65% сайтов ошибаются)
+Сложные требования к паролю вызывают до **19% отказов** от оформления у существующих пользователей (не могут войти).
+**Решение**: минимум требований — 6-8 символов. Использовать magic links, 2FA вместо сложных паролей.
+
+### 2. «Дата доставки» вместо «Скорости доставки» (48% ошибаются)
+Пользователя интересует: «Когда я получу заказ?», а не «Скорость доставки».
+**Решение**: показывать конкретную дату вместо «2-5 рабочих дней».
+Пример: «Заказ прибудет во вторник, 8 июня» вместо «Standard: 4-7 Business Days».
+
+### 3. Излишняя сложность регистрации
+Принуждение к созданию аккаунта — одна из главных причин бросания корзины.
+**Решение**: Guest checkout как опция по умолчанию. Account creation опционально или после покупки.
+
+## Практические выводы (адаптировано для российского рынка)
+- Guest checkout — обязателен (в РФ особенно: пользователи не доверяют регистрации)
+- Показывать реальную дату доставки по адресу (через API СДЭК/Почты)
+- Минимум обязательных полей в форме
+- Индикатор прогресса (шаг 1 из 3)
+- Безопасность: иконка замка, https, логотипы платёжных систем
+- НЕ просить подтверждение email до завершения оплаты
diff --git a/concepts/clarity-vs-creativity.md b/concepts/clarity-vs-creativity.md
new file mode 100644
index 0000000..a04a529
--- /dev/null
+++ b/concepts/clarity-vs-creativity.md
@@ -0,0 +1,41 @@
+---
+title: Clarity vs Creativity
+created: 2026-06-02
+updated: 2026-06-02
+type: concept
+tags: [web-design, clarity-vs-creativity]
+sources:
+ - raw/articles/crawford-conversion-principles.md
+ - raw/articles/crawford-15-tips.md
+ - raw/articles/crawford-26-lessons.md
+confidence: high
+---
+
+# Clarity vs Creativity — Ясность vs Креативность
+
+## Центральный принцип Crawford
+> **Clarity beats design every time.**
+> Уродливые сайты генерируют миллионы. Красивые — ноль конверсий.
+> Разница в ясности.
+
+## Homepage за 2 секунды
+Пользователь должен понять:
+1. Что это?
+2. Для кого?
+3. Что делать?
+
+Если нет — сайт провален, независимо от красоты дизайна.
+
+## Когда креативность оправдана
+- Когда она усиливает ясность, а не заменяет её
+- В брендинге, анимациях, деталях
+- В дизайн-системах творческих индустрий
+
+## Когда креативность вредит
+- Анимация ради анимации
+- Нестандартная навигация
+- Сложные визуалы, замедляющие понимание
+- Жаргон вместо ясного текста
+
+## Принцип: Consistency beats cleverness
+Скучная, но последовательная система победит умную, но хаотичную.
diff --git a/concepts/color-theory.md b/concepts/color-theory.md
new file mode 100644
index 0000000..5b00b5b
--- /dev/null
+++ b/concepts/color-theory.md
@@ -0,0 +1,60 @@
+---
+title: Color Theory for Web
+description: Understanding color harmony, contrast, and psychological impact.
+tags: [color, theory, psychology, contrast, harmony]
+---
+
+# Color Theory for Web
+
+## Color Harmony Models
+
+### Monochromatic (Safe)
+- Single hue with tints/shades
+- Use: backgrounds, subtle UI
+- Example: `#0a0a0a` → `#1a1a1a` → `#2a2a2a`
+
+### Analogous (Natural)
+- Colors next to each other on wheel
+- Use: gradients, section backgrounds
+- Example: `#6366f1` → `#8b5cf6` → `#a78bfa`
+
+### Complementary (Bold)
+- Opposite colors on wheel
+- Use: CTAs, accent elements
+- Example: `#6366f1` + `#f59e0b`
+
+### Triadic (Vibrant)
+- Three colors 120° apart
+- Use: feature cards, badges
+- Example: `#6366f1` + `#10b981` + `#f59e0b`
+
+## Color Roles
+
+| Role | Ratio | Purpose | Example |
+|------|-------|---------|---------|
+| Background | 60% | Canvas | `#0a0a0a` |
+| Surface | 30% | Cards, sections | `#111111` |
+| Accent | 10% | CTA, links, highlights | `#6366f1` |
+
+## WCAG Contrast Ratios
+
+| Level | Ratio | Use Case |
+|-------|-------|----------|
+| AA Normal | 4.5:1 | Body text (16px) |
+| AA Large | 3:1 | Headings, icons >24px |
+| AAA | 7:1 | Critical information |
+
+## Psychological Color Mapping
+
+- **Blue (#6366f1)**: Trust, technology, reliability
+- **Green (#10b981)**: Success, growth, action
+- **Orange (#f59e0b)**: Warning, urgency, attention
+- **Red (#ef4444)**: Error, danger, delete
+- **Purple (#8b5cf6)**: Creativity, premium, AI
+- **Cyan (#06b6d4)**: Innovation, futuristic, data
+
+## Anti-Patterns
+- Never use more than 3 accent colors
+- Never put accent color on text without checking contrast
+- Never use pure `#000000` or `#ffffff`
+- Never ignore dark/light mode variants
diff --git a/concepts/customer-journey-mapping.md b/concepts/customer-journey-mapping.md
new file mode 100644
index 0000000..fdeea16
--- /dev/null
+++ b/concepts/customer-journey-mapping.md
@@ -0,0 +1,63 @@
+---
+title: Customer Journey Mapping
+description: Designing for each stage of the user's decision process.
+tags: [journey, mapping, UX, conversion, funnel]
+---
+
+# Customer Journey Mapping
+
+## 6 Stages of Customer Journey
+
+### 1. Awareness
+- **Goal:** Capture attention
+- **Design:** Hero with bold statement
+- **Metrics:** Time on page, scroll depth
+
+### 2. Interest
+- **Goal:** Engage with content
+- **Design:** Problem metrics, social proof
+- **Metrics:** Scroll depth, section engagement
+
+### 3. Consideration
+- **Goal:** Evaluate solution
+- **Design:** Feature comparison, pricing
+- **Metrics:** Pricing page views, CTA clicks
+
+### 4. Evaluation
+- **Goal:** Build trust
+- **Design:** Testimonials, case studies
+- **Metrics:** Trust signal clicks, form fills
+
+### 5. Decision
+- **Goal:** Convert
+- **Design:** CTA above the fold, guarantee
+- **Metrics:** Conversion rate, form submissions
+
+### 6. Retention
+- **Goal:** Keep engaged
+- **Design:** Onboarding, newsletter signup
+- **Metrics:** Activation rate, engagement
+
+## Landing Page Journey Flow
+
+```
+Hero (Awareness)
+ ↓
+Problem (Interest)
+ ↓
+Solution (Consideration)
+ ↓
+Features (Evaluation)
+ ↓
+Social Proof (Trust)
+ ↓
+Pricing (Decision)
+ ↓
+CTA (Conversion)
+```
+
+## Anti-Patterns
+- Don't put pricing before social proof
+- Don't ask for too much information upfront
+- Don't hide CTA below the fold
+- Don't skip mobile experience
diff --git a/concepts/dark-mode-design.md b/concepts/dark-mode-design.md
new file mode 100644
index 0000000..118a0e3
--- /dev/null
+++ b/concepts/dark-mode-design.md
@@ -0,0 +1,57 @@
+---
+title: Dark Mode Design Patterns
+description: Best practices for dark-themed premium websites.
+tags: [design, dark-mode, accessibility, patterns]
+---
+
+# Dark Mode Design Patterns
+
+## Core Principles
+
+### 1. Not Pure Black
+- Background: `#0a0a0a` or `#111111` (not `#000000`)
+- Pure black causes eye strain on OLED
+- Subtle gradient: `#0a0a0a` → `#0f0f0f`
+
+### 2. Surface Hierarchy
+- Layer 1 (bg): `#0a0a0a`
+- Layer 2 (cards): `#111111`
+- Layer 3 (elevated): `#1a1a1a`
+- Elevation via lighter shade, not shadow
+
+### 3. Text Colors
+- Primary: `#f5f5f5` (90% white)
+- Secondary: `#a0a0a0` (60% white)
+- Muted: `#666666` (40% white)
+- Never use pure `#ffffff` (too harsh)
+
+### 4. Border Treatment
+- Use `rgba(255,255,255,0.08)` for subtle borders
+- Hover states: `rgba(255,255,255,0.15)`
+- Focus states: `accent-color` ring
+
+### 5. Accent Colors
+- Lighter variants work better on dark
+- `#6366f1` → `#818cf8` for hover
+- Ensure 3:1 contrast ratio for accents
+
+## CSS Implementation
+```css
+:root {
+ --bg-primary: #0a0a0a;
+ --bg-surface: #111111;
+ --bg-elevated: #1a1a1a;
+ --text-primary: #f5f5f5;
+ --text-secondary: #a0a0a0;
+ --text-muted: #666666;
+ --border-subtle: rgba(255,255,255,0.08);
+ --accent-primary: #6366f1;
+ --accent-hover: #818cf8;
+}
+```
+
+## Anti-Patterns
+- Never use pure `#000000` background
+- Never use pure `#ffffff` text
+- Never rely on shadows for elevation in dark mode
+- Never skip contrast checking (WCAG AA minimum)
diff --git a/concepts/design-principles.md b/concepts/design-principles.md
new file mode 100644
index 0000000..dd9a350
--- /dev/null
+++ b/concepts/design-principles.md
@@ -0,0 +1,37 @@
+---
+title: Design Principles for Conversion
+description: Core design principles that drive conversions on premium landing pages.
+tags: [design, conversion, psychology, principles]
+---
+
+# Design Principles for Conversion
+
+## 1. Visual Hierarchy
+- Size = importance (H1 > H2 > Body > Caption)
+- Color = action (CTA buttons should be most contrasting)
+- Whitespace = focus (isolate key elements)
+
+## 2. Fitt's Law
+- Make CTAs large and easily clickable
+- Place important actions within thumb reach on mobile
+- Use 48x48px minimum touch targets
+
+## 3. Hick's Law
+- Simplify choices on first view
+- Progressive disclosure: show more on interaction
+- Limit CTA buttons to 1-2 per section
+
+## 4. Weber-Fechner Law
+- Gradual changes feel natural
+- Animations should be smooth (ease-in-out)
+- Incremental reveal builds anticipation
+
+## 5. Von Restorff Effect
+- Stand-out elements are remembered
+- Use accent color for primary CTA
+- Unique visual treatment for key metrics
+
+## Anti-Patterns
+- Don't use accent color for everything
+- Don't make all headings the same size
+- Don't cram content — respect whitespace
diff --git a/concepts/design-systems.md b/concepts/design-systems.md
new file mode 100644
index 0000000..ce06e1a
--- /dev/null
+++ b/concepts/design-systems.md
@@ -0,0 +1,49 @@
+---
+title: Brand Identity Design
+description: Building consistent brand identity across web presence.
+tags: [brand, identity, logo, colors, typography, consistency]
+---
+
+# Brand Identity Design
+
+## Brand Elements Hierarchy
+
+### 1. Logo
+- Primary: Full logo with wordmark
+- Secondary: Icon-only for favicons
+- Monochrome: For dark/light backgrounds
+- Minimum size: 32px height
+
+### 2. Color Palette
+```
+Brand Colors:
+├── Primary: #6366f1
+├── Secondary: #8b5cf6
+├── Accent: #10b981
+└── Neutrals: #f5f5f5, #a0a0a0, #666666, #111111
+```
+
+### 3. Typography
+- Display font: For headings
+- Body font: For content
+- Max 2 type families per brand
+
+### 4. Imagery Style
+- Photography: Consistent lighting, mood
+- Illustrations: Flat, isometric, or abstract
+- Icons: 2px stroke, consistent style
+
+## Brand Voice Guidelines
+
+| Channel | Tone | Example |
+|---------|------|---------|
+| Website | Professional, clear | "Simplify your workflow" |
+| Social | Conversational | "Try it out today!" |
+| Email | Personal, direct | "Hi John, we noticed..." |
+| Support | Empathetic, helpful | "Let's figure this out together" |
+
+## Anti-Patterns
+- Never use more than 2 primary colors
+- Never change fonts without approval
+- Never stretch or distort logo
+- Never ignore brand guidelines
diff --git a/concepts/dots-mocr.md b/concepts/dots-mocr.md
new file mode 100644
index 0000000..5daabda
--- /dev/null
+++ b/concepts/dots-mocr.md
@@ -0,0 +1,108 @@
+---
+title: dots.mocr — Multimodal OCR
+created: 2026-06-15
+updated: 2026-06-15
+type: concept
+tags: [ocr, inference, local-llm, pdf, parsing]
+confidence: high
+---
+
+# dots.mocr — Multimodal OCR
+
+**dots.mocr** — мультимодальная OCR-модель от [[xiaohongshu]] (小红书, rednote-hilab), 3B параметров на базе Qwen3-VL-4B. Распознаёт текст на русском, английском, китайском и других языках. Парсит PDF и изображения в структурированные данные (JSON + Markdown + визуализация).
+
+- Репозиторий: https://github.com/rednote-hilab/dots.mocr
+- Модель: https://huggingface.co/rednote-hilab/dots.mocr
+- arXiv: https://arxiv.org/abs/2603.13032
+
+## Сетап
+
+**Директория:** `/home/nik/workspace/dots.mocr/`
+
+**Окружение:** Python 3.12 (через `uv`), `.venv/`
+
+**Зависимости:** PyTorch 2.7+ cu128, vLLM 0.23, transformers 4.57, PyMuPDF, flash-attn
+
+```yaml
+GPU: RTX 3080 Ti (12GB) — выделена под dots.mocr
+CUDA_VISIBLE_DEVICES=1 (через враппер run_vllm_gpu1.py)
+Порт: 8000
+max_model_len: 16384 (ограничение VRAM)
+```
+
+## Запуск
+
+### 1. Сервер vLLM
+
+```bash
+cd ~/workspace/dots.mocr
+source .venv/bin/activate
+python run_vllm_gpu1.py
+```
+
+Грузится ~50 сек, после этого отвечает на порту 8000.
+
+### 2. Парсинг PDF/изображения
+
+```bash
+# Базовый запуск
+python3 dots_mocr/parser.py file.pdf --port 8000 --model_name model \
+ --num_thread 8 --max_completion_tokens 12000
+
+# Только текст (чистый md, без layout-разметки и base64-картинок) — быстрее
+python3 dots_mocr/parser.py file.pdf --port 8000 --model_name model \
+ --num_thread 8 --max_completion_tokens 12000 --prompt prompt_ocr
+
+# Или через скрипт-помощник
+./parse.sh file.pdf --output ./results --prompt prompt_ocr
+```
+
+### 3. Получение результатов
+
+```
+results/ИмяФайла/
+├── ИмяФайла_page_0.md # Markdown страницы
+├── ИмяФайла_page_0.jpg # Визуализация с bbox
+├── ИмяФайла_page_0.json # Layout JSON (если не prompt_ocr)
+└── ИмяФайла_page_1.md
+```
+
+### 4. Склейка всех страниц и очистка
+
+```bash
+cd results/Папка
+cat *_page_*.md > Итог.md
+# Удалить base64-изображения (актуально для prompt_layout_all_en)
+sed -e 's/!\[.*\](data:image[^)]*)//g' -e '/^[[:space:]]*$/d' Итог.md > Итог_clean.md
+```
+
+## Режимы (промпты)
+
+| Промпт | Описание | Скорость |
+|---|---|---|
+| `prompt_layout_all_en` | Layout + текст + таблицы HTML + формулы LaTeX | ~20-30 с/стр |
+| `prompt_ocr` | **Только текст** (без layout-разметки) | **~2-5 с/стр** ✅ |
+| `prompt_layout_only_en` | Только детекция блоков (без текста) | быстро |
+| `prompt_grounding_ocr` | OCR в заданном bbox | среднее |
+| `prompt_web_parsing` | Парсинг веб-страниц | среднее |
+| `prompt_scene_spotting` | Поиск текста на сцене | среднее |
+| `prompt_image_to_svg` | Конвертация графики в SVG | среднее |
+| `prompt_general` | Free-form QA (с --custom_prompt) | среднее |
+
+## Особенности
+
+- **prompt_ocr** работает в **10 раз быстрее** full layout и выдаёт чистый Markdown без base64-вставок для картинок. Рекомендуется для анализа текстовых документов.
+- Для сложных PDF с таблицами, формулами и многостраничной вёрсткой — `prompt_layout_all_en` даёт полную картину (HTML таблицы, LaTeX формулы).
+- Большие "Picture" элементы (декоративные блоки, фоны) могут содержать текст — `prompt_ocr` вытаскивает и его.
+- `max_model_len=16384` — ограничение из-за 12GB VRAM. Для одного PDF-листа хватает.
+
+## Проблемы
+
+- vLLM v0.23 использует V1 engine с multiprocessing spawn, который сбрасывает `CUDA_VISIBLE_DEVICES`. Решение: враппер `run_vllm_gpu1.py` с `os.environ` + `if __name__ == "__main__"`.
+- При `--gpu-memory-utilization > 0.9` может не хватить памяти для KV-кэша — падает на инициализации.
+- **Порт 8000** — не конфликтует с llama-server (порт 8080).
+
+## Связанное
+
+- [[russian-ocr]] — Tesseract + RapidOCR на CPU (альтернатива без GPU)
+- [[local-llm]] — общая инфраструктура локальных LLM
diff --git a/concepts/hyperframes-reels.md b/concepts/hyperframes-reels.md
new file mode 100644
index 0000000..d0343fd
--- /dev/null
+++ b/concepts/hyperframes-reels.md
@@ -0,0 +1,414 @@
+---
+title: HyperFrames — Создание Reels из HTML
+created: 2026-06-12
+updated: 2026-06-12
+type: concept
+tags: [hyperframes, video, reels, gsap, tiktok]
+sources:
+ - concepts/web-psychology.md
+ - concepts/micro-interactions.md
+confidence: high
+---
+
+# HyperFrames — Создание профессиональных Reels из HTML
+
+> **Формула:** HTML + GSAP анимации + Edge-TTS = готовый Reels без видеоредакторов
+>
+> *Инструкция для LLM-агента: создавай Reels через HyperFrames — пиши HTML, линтируй, рендери MP4.*
+
+---
+
+## Фаза 0: Подготовка
+
+### 0.1. Проверка окружения
+
+```bash
+node --version # нужен 22+
+ffmpeg -version # нужен 6.1.1+
+npx hyperframes doctor # проверка окружения
+```
+
+**Требования:** Node.js 22+, FFmpeg 6.1.1+, Chromium (скачивается автоматически при первом рендере).
+
+### 0.2. Структура проекта
+
+```
+reels-project/
+├── index.html # МАСТЕР: root-контейнер, без
+├── compositions/
+│ ├── 01-hook.html # Хук (0–3s): решает, смотреть или нет
+│ ├── 02-intro.html # Интро (3–8s)
+│ ├── 03-content.html # Контент (8–20s)
+│ ├── 04-cta.html # CTA (20–30s): призыв к действию
+│ └── 05-outro.html # Финал (25–30s): логотип + подписка
+├── assets/
+│ ├── narration.mp3 # Озвучка (Edge-TTS предпочтительно)
+│ └── bg-music.mp3 # Фоновая музыка (тихо, -20dB)
+└── lib/
+ └── gsap.min.js # Локальная копия GSAP (CDN = 404 в headless)
+```
+
+### 0.3. Разрешение для Reels
+
+**1080×1920 (портрет, 9:16)** — стандарт для Reels/TikTok/Shorts.
+
+```css
+html, body { width: 1080px; height: 1920px; overflow: hidden; }
+```
+
+---
+
+## Фаза 1: Написание композиции
+
+### 1.1. Базовая структура (inline, без вложенных сцен)
+
+```html
+
+
+
+
+
+
+
+
+ Как создать Reels
+
+
+
+
+
+```
+
+### 1.2. Правило трёх
+
+Каждая композиция должна содержать:
+- ✅ **Root:** `data-composition-id` + `data-width` + `data-height`
+- ✅ **Timed Elements:** `class="clip"` + `data-start` + `data-duration` + `data-track-index`
+- ✅ **Animations:** `gsap.timeline({ paused: true })` + регистрация на `window.__timelines`
+
+### 1.3. Обязательные атрибуты
+
+| Атрибут | Обязательный | Описание |
+|---|---|---|
+| `class="clip"` | Да | Элемент — клип видео |
+| `data-start` | Да | Секунда начала |
+| `data-duration` | Да | Длительность в секундах |
+| `data-track-index` | Да | Трек/слой (уникальный для каждого клипа) |
+| `data-type` | Нет | Тип элемента (`text`, `audio`, `clip`) |
+
+**НЕ НАДО:** `data-duration` на clip НЕ нужен — длительность управляется GSAP-таймлайном.
+
+### 1.4. Цветовая схема (проверенная)
+
+```css
+background: #0a0820; /* Глубокий тёмно-синий */
+text: #fff; /* Белый текст */
+accent: #00ff88; /* Зелёный акцент */
+secondary: #8800ff; /* Фиолетовый */
+muted: #888; /* Серый для подписей */
+```
+
+### 1.5. Шрифты
+
+```html
+
+```
+
+| Шрифт | Где |
+|-------|-----|
+| **Inter** | Заголовки, текст, CTA (мин 40px для мобильного) |
+| **JetBrains Mono** | Код, цифры, технические блоки |
+
+---
+
+## Фаза 2: Режиссура Reels
+
+### 2.1. Золотое правило: Hook первые 3 секунды
+
+> **В Reels зритель скроллит каждые 0.5 секунды. Первые 3 секунды = жизнь видео.**
+
+**Лучшие паттерны хуков (ранг):**
+1. **Blur-in** — текст из размытия `blur(15px)` за 0.6s → `blur(0px)`
+2. **Крупный заголовок** — `font-size: 72px`, акцентный цвет, fade-up
+3. **Glitch** — `steps(1)` + RGB-сплит (для tech-аудитории)
+
+```javascript
+// Blur-in хук (самый надёжный)
+tl.from('.hook-text', {
+ opacity: 0, y: 60, filter: 'blur(15px)',
+ duration: 0.6, ease: 'power3.out'
+}, 0);
+```
+
+### 2.2. Каденция текста
+
+> **1 фраза = 1 слайд. Средняя скорость русской речи: ~3 слова/сек.**
+
+```
+Хук: "HTML в Reels за 30 сек" → 3s
+Интро: "Без видеоредакторов" → 3s
+Контент: "HyperFrames = HTML → MP4" → 4s
+Контент: "Пишите HTML, рендерите" → 4s
+CTA: "Подпишись для туториалов" → 3s
+Итого: 17s (минимум 20–30s для алгоритма)
+```
+
+### 2.3. Оптимальная длина
+
+| Длина | Назначение | Сцен |
+|---|---|---|
+| 15–20s | Вирусный хук, тизер | 3–4 |
+| 25–30s | Туториал (стандарт) | 5–7 |
+| 35–45s | Глубокий разбор | 8–10 |
+
+### 2.4. Эффекты для Reels (ранжированы)
+
+**Подходит:**
+- **Blur reveal** — универсальный, профессиональный
+- **Кинетическая типографика** — по слову, держит внимание
+- **Счётчик** — `onUpdate` обновляет `textContent`
+- **Lower Thirds** — имя + бейдж + описание
+- **SVG прогресс-кольцо** — метрики, проценты
+- **Пульсирующая CTA** — `boxShadow` yoyo-repeat
+
+**НЕ подходит для Reels:**
+- Глитч — слишком агрессивный
+- 3D параллакс — отвлекает от текста
+- RGB-сплит — на мобильном barely заметен
+
+### 2.5. Аудио = 50% успеха
+
+```bash
+# Edge-TTS (предпочтительно)
+edge-tts --text "Текст озвучки" --voice ru-RU-DmitryNeural --write-media assets/narration.mp3
+
+# Проверка длительности
+ffprobe -v error -show_entries format=duration \
+ -of default=noprint_wrappers=1:nokey=1 assets/narration.mp3
+```
+
+**Голоса:**
+| Голос | Тип |
+|-------|-----|
+| `ru-RU-DmitryNeural` | Мужской, нейтральный |
+| `ru-RU-SvetlanaNeural` | Женский, тёплый |
+| `ru-RU-SergeyNeural` | Мужской, энергичный |
+
+---
+
+## Фаза 3: Готовые паттерны (copy-paste)
+
+### Паттерн 1: Счётчик
+
+```html
+0
+```
+
+```javascript
+let counter = { val: 0 };
+tl.to(counter, {
+ val: 10000,
+ duration: 2,
+ ease: 'power2.out',
+ onUpdate: () => {
+ document.querySelector('.stat-number').textContent =
+ Math.floor(counter.val).toLocaleString();
+ }
+}, 0.5);
+```
+
+### Паттерн 2: Lower Thirds
+
+```html
+
+
HYPERFRAMES
+
+
HTML → MP4
+
+```
+
+```javascript
+tl.from('.lt-name', { x: -40, opacity: 0, duration: 0.4, ease: 'power2.out' }, 0.3);
+tl.from('.lt-line', { scaleX: 0, transformOrigin: 'left', duration: 0.3 }, 0.5);
+tl.from('.lt-desc', { x: -30, opacity: 0, duration: 0.4, ease: 'power2.out' }, 0.6);
+```
+
+### Паттерн 3: SVG прогресс-кольцо
+
+```html
+
+```
+
+```javascript
+tl.to('.ring', { strokeDashoffset: 0, duration: 2, ease: 'power2.out' }, 0.5);
+```
+
+### Паттерн 4: Пульсирующая CTA
+
+```html
+ПОДПИШИСЬ
+```
+
+```javascript
+tl.to('.cta-button', {
+ boxShadow: '0 0 40px rgba(0,255,136,0.6)',
+ duration: 0.3, yoyo: true, repeat: 3
+}, 1);
+```
+
+### Паттерн 5: Кинетическая типографика
+
+```html
+
+ КАЖДОЕ
+ СЛОВО
+
+```
+
+```javascript
+document.querySelectorAll('.word').forEach((word, i) => {
+ tl.from(word, {
+ y: 80, opacity: 0, filter: 'blur(15px)',
+ duration: 0.6, ease: 'power3.out'
+ }, i * 0.25);
+});
+```
+
+### Паттерн 6: Детерминированные частицы (canvas)
+
+```javascript
+function mulberry32(a) {
+ return function() {
+ a |= 0; a = a + 0x6D2B79F5 | 0;
+ var t = Math.imul(a ^ a >>> 15, 1 | a);
+ t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
+ }
+}
+const rng = mulberry32(42); // всегда одинаковый результат
+```
+
+> **НИКОГДА** `Math.random()` в canvas — рендер будет не детерминированным.
+
+---
+
+## Фаза 4: Рендер и экспорт
+
+### 4.1. Команды
+
+```bash
+npx hyperframes lint # ОБЯЗАТЕЛЬНО: проверка
+npx hyperframes preview # Порт 3003, HMR
+npx hyperframes render --quality high --workers 1 --output reels.mp4
+```
+
+### 4.2. Параметры рендера
+
+| Параметр | Значение | Описание |
+|---|---|---|
+| `--quality` | `draft`, `standard`, `high` | draft = без аудио, standard/high = с аудио |
+| `--workers` | `1` | Для тяжёлых композиций — ТОЛЬКО 1 |
+| `-f` | `30` | FPS. 30 достаточно для Reels |
+
+### 4.3. Микширование narration
+
+```bash
+# Без перекодирования видео (мгновенно)
+ffmpeg -y -i reels.mp4 -i assets/narration.mp3 \
+ -c:v copy -c:a aac -b:a 192k -shortest \
+ -map 0:v:0 -map 1:a:0 \
+ -movflags +faststart \
+ reels-final.mp4
+```
+
+### 4.4. Проверка результата
+
+```bash
+# Поток
+ffprobe -v error -show_entries stream=codec_type,codec_name reels-final.mp4
+# Ожидаемо: video/h264 + audio/aac
+```
+
+---
+
+## Фаза 5: Типичные ошибки
+
+### Ошибка 1: Видео обрезается короче narration
+**Решение:** добавить `tl.set({}, {}, DURATION)` в конец таймлайна.
+
+### Ошибка 2: `gsap_infinite_repeat`
+**Причина:** `repeat: -1` ломает детерминированный рендер.
+**Решение:** `repeat: N` (конечное число).
+
+### Ошибка 3: Canvas в screenshot mode
+**Причина:** raw `requestAnimationFrame()` в inline `
+```
+
+❌ `
+
+```
+
+## 2. CSS Animated Illustration
+
+```css
+.illustration {
+ width: 200px;
+ height: 200px;
+ background: conic-gradient(from 0deg, #6366f1, #ec4899, #6366f1);
+ border-radius: 50%;
+ animation: spin 4s linear infinite;
+}
+@keyframes spin {
+ to { transform: rotate(360deg); }
+}
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| Без fallback | SVG fallback |
+| Без `prefers-reduced-motion` | Уважать настройки |
diff --git a/media/blender-pipeline.md b/media/blender-pipeline.md
new file mode 100644
index 0000000..fecb38e
--- /dev/null
+++ b/media/blender-pipeline.md
@@ -0,0 +1,222 @@
+# Blender Pipeline — Figma → PatternGen → 3D Compositing
+
+> Полный конвейер от Figma-дизайна до 3D-compositing в Blender.
+> Основано на [patterngen-oss](https://github.com/halfof8/patterngen-oss) workflow.
+
+## Обзор
+
+```
+Figma (artboard 1920×1080)
+ ↓ Plugin "PatternGen Scene Export"
+Scene JSON (titles as 2× PNG data URLs + colors + seed)
+ ↓ Load в PatternGen web app
+Procedural pattern generation (Canvas 2D)
+ ↓ EXPORT (JSZip + FileSaver)
+ZIP: scene_titles/*.png, scene_patterns/*.png, scene_dots/*.png
+ ↓ Blender addon "PatternGen Importer"
+3 emissive planes с alpha-blending → Cycles/Eevee render
+```
+
+---
+
+## Этап 1: Figma → Scene JSON
+
+### Подготовка артборда
+
+- Frame размер: **1920×1080 px** (Full HD)
+- Grid: **20 px** (Layout Grid → Grid → 20 px)
+- Каждый title — top-level child frame, размеры кратны 20
+- Название фрейма = `sceneName` (префикс для экспорта)
+- Цвета: любые (плагин сканирует fills/strokes)
+
+### Экспорт
+
+1. Выбрать один или несколько фреймов 1920×1080
+2. **Plugins → Development → PatternGen Scene Export**
+3. **Export Selected Frames**
+4. Результат: `_patterngen.json`
+
+### Структура JSON
+
+```json
+{
+ "sceneName": "My Title",
+ "seed": 123456789, // 31-bit integer, determinism
+ "colors": ["#FF0000", "#00FF00", "#0000FF"], // detected colors
+ "titles": [
+ {
+ "id": "title_1",
+ "x": 100, // snapped to 20px grid
+ "y": 200,
+ "w": 400,
+ "h": 100,
+ "img": "data:image/png;base64,..." // 2× retina PNG
+ }
+ ],
+ "defaults": {
+ "durationMs": 6000,
+ "density": 10,
+ "proximity": 2,
+ "stagger": 3,
+ "theme": "dark"
+ }
+}
+```
+
+### Что экспортируется
+
+- **Titles**: 2× PNG (retina), data URL, позиции snapped к сетке
+- **Color set**: уникальные цвета fills/strokes (кроме #000 и #FFF)
+- **Seed**: 31-bit integer — детерминированная генерация паттернов
+- **Scene defaults**: продолжительность, плотность, proximity, stagger, тема
+
+---
+
+## Этап 2: PatternGen Web App
+
+### Загрузка
+
+1. Открыть PatternGen (localhost:5173)
+2. Кнопка **LOAD** → выбрать `*_patterngen.json`
+3. Паттерны генерируются **детерминированно по seed**
+4. Сцена сразу готова к **PLAY**
+
+### Ручное редактирование
+
+- **Drag & Drop** PNG/JPG изображений на canvas (snap to 20 px grid)
+- **Drag** для перемещения, drag off canvas для удаления
+- **+ ADD COLOR** — до 3 кастомных цветов (color picker)
+- Клик по swatch — toggle on/off
+
+### Параметры
+
+| Параметр | Диапазон | Описание |
+|-------------|---------|----------|
+| **Density** | 1–20 | Количество паттерн-элементов |
+| **Proximity** | 1–20 | Минимальное расстояние от titles |
+| **Stagger** | 0–5 | Разброс animation delay |
+| **Grid** | toggle | 20 px reference grid |
+| **Theme** | dark/light | UI theme |
+
+---
+
+## Этап 3: Экспорт PNG-секвенций
+
+### Формат ZIP
+
+```
+scene_pattern_gen.zip
+├── titles/
+│ scene_titles_00000.png
+│ scene_titles_000001.png
+│ ...
+├── patterns/
+│ scene_patterns_00000.png
+│ ...
+└── dots/
+ scene_dots_00000.png
+ ...
+```
+
+### Параметры экспорта
+
+- **Scale**: 4× (EXPORT_SCALE = 4 → 7680×4320px)
+- **FPS**: 24
+- **Фон**: прозрачный (RGBA)
+- **Слои**: 3 отдельных (titles, patterns, dots)
+
+### Фазы рендера
+
+```
+titles: durationMs (1×) — plays once
+patterns: durationMs (1×) — plays once
+dots: 4000ms loop — infinite loop
+```
+
+### Easing при экспорте
+
+Выбирается один из 7 типов:
+`linear`, `easeIn`, `easeOut`, `easeInOut`, `easeInCubic`, `easeOutCubic`, `easeInOutCubic`
+
+---
+
+## Этап 4: Blender Import
+
+### Установка
+
+1. Blender → **Edit → Preferences → Add-ons → Install…**
+2. Выбрать `patterngen_importer.py`
+3. Поставить галочку для активации
+4. Открыть N-panel → вкладка **PatternGen**
+
+### Импорт сцены
+
+1. Установить **Scene Folder** на распакованную папку
+2. Кнопка **Import Scene Folders**
+3. Три planes создаются в origin
+
+### Конфигурация слоёв
+
+| Layer | Cyclic | Location (m) | Rotation | Scale |
+|-------|--------|-------------|----------|-------|
+| titles | off | (0, 0, 0) | 90° на X | 6×6×6 |
+| patterns | off | (0, 0.1, 0) | 90° на X | 6×6×6 |
+| dots | **on** | (0, 0.2, 0) | 90° на X | 6×6×6 |
+
+### Node Tree материалов
+
+```
+Image Texture (SEQUENCE, auto-refresh ON)
+ Color ─┬─► Principled BSDF › Base Color
+ └─► Principled BSDF › Emission Color (strength = 1)
+ Alpha ───► Principled BSDF › Alpha
+```
+
+### Image Sequence настройки
+
+- **Start Frame**: 0
+- **Frames**: количество PNG в папке
+- **Offset**: 0
+- **Auto Refresh**: ON
+- **Cyclic**: ON для `dots`, OFF для `titles`/`patterns`
+
+### Sync Start Frame
+
+1. Выбрать plane(s) (Shift+click или A для всех)
+2. В секции **Sync Start Frame** ввести новое значение
+3. **Apply to Selected** — все image-sequence текстуры обновлены
+
+### Замечания
+
+- **Blend Method**: `BLEND` (alpha renders clean в Eevee/Cycles)
+- При артефактах сортировки переключить на `HASHED`
+- Повторный импорт создаёт дубликаты (`.001`, `.002`) — удалить вручную
+- Отступ 0.1m между слоями — только для предотвращения z-fighting
+- Plane scale настроен по aspect ratio изображения (16:9)
+
+---
+
+## Полный конвейер в цифрах
+
+| Параметр | Значение |
+|----------|---------|
+| Canvas | 1920×1080 |
+| Export Scale | 4× (7680×4320) |
+| FPS | 24 |
+| Grid | 20 px |
+| Duration | 6000ms (default) |
+| Dots Loop | 4000ms |
+| Cycle | 4× duration = 24s |
+| Patterns | 7 animation types |
+| Colors | 2 fixed + 3 custom max |
+| Export Layers | 3 (titles, patterns, dots) |
+
+---
+
+## Референсы кода
+
+- `figma-plugin/README.md` — Figma plugin setup, export format
+- `blender-addon/README.md` — Blender addon installation, node tree
+- `src/export/exporter.ts` — PNG sequence export, JSZip, FileSaver
+- `src/engine/timeline.ts` — Phase 1/2/3 timing, dots loop
+- `src/types.ts` — CANVAS_W/H, EXPORT_SCALE, FPS, GRID_SIZE
diff --git a/media/image-parallax.md b/media/image-parallax.md
new file mode 100644
index 0000000..3487882
--- /dev/null
+++ b/media/image-parallax.md
@@ -0,0 +1,62 @@
+---
+name: media/image-parallax
+title: Image Parallax
+description: Images moving at different scroll speeds. Creates depth.
+tags: [media, parallax, image, scroll, depth]
+source: apple.com, amppz.com, brad.co, godly.website
+---
+
+# Image Parallax
+
+## CSS-only реализация
+
+```css
+.parallax-section {
+ height: 100vh;
+ overflow: hidden;
+ position: relative;
+}
+
+.parallax-image {
+ position: absolute;
+ top: -20%;
+ left: 0;
+ width: 100%;
+ height: 140%;
+ background: url('/parallax.jpg') center/cover;
+ will-change: transform;
+}
+```
+
+```javascript
+window.addEventListener('scroll', () => {
+ const scrolled = window.scrollY;
+ const parallax = document.querySelector('.parallax-image');
+ if (parallax) {
+ parallax.style.transform = `translateY(${scrolled * 0.5}px)`;
+ }
+});
+```
+
+## GSAP версия
+
+```javascript
+gsap.to('.parallax-image', {
+ yPercent: 50,
+ ease: 'none',
+ scrollTrigger: {
+ trigger: '.parallax-section',
+ start: 'top bottom',
+ end: 'bottom top',
+ scrub: true
+ }
+});
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| Без `will-change` | `will-change: transform` |
+| `scrub: 0` | `scrub: 1` |
+| Без `prefers-reduced-motion` | Отключать на мобильных |
diff --git a/media/svg-animation.md b/media/svg-animation.md
new file mode 100644
index 0000000..dc00511
--- /dev/null
+++ b/media/svg-animation.md
@@ -0,0 +1,57 @@
+---
+name: media/svg-animation
+title: SVG Animation & Icon Motion
+description: Animated SVG icons, paths, and illustrations.
+tags: [media, svg, animation, icon, motion]
+source: raycast.com, linear.app, brad.co, amppz.com
+---
+
+# SVG Animation
+
+## 1. Path Draw Animation
+
+```html
+
+```
+
+```css
+.icon-path {
+ stroke-dasharray: 30;
+ stroke-dashoffset: 30;
+ animation: draw 0.5s ease forwards;
+}
+@keyframes draw {
+ to { stroke-dashoffset: 0; }
+}
+```
+
+## 2. Morphing SVG
+
+```html
+
+```
+
+## 3. Icon Hover
+
+```css
+.icon {
+ transition: transform 0.3s ease;
+}
+.icon:hover {
+ transform: scale(1.2) rotate(10deg);
+}
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| Без viewBox | Всегда viewBox |
+| Без `stroke-dashoffset` | Использовать для path |
+| 500ms+ анимация | 0.3–0.5s |
diff --git a/media/video-mask.md b/media/video-mask.md
new file mode 100644
index 0000000..64fa802
--- /dev/null
+++ b/media/video-mask.md
@@ -0,0 +1,316 @@
+---
+name: media/video-mask
+title: Video Background with Mask & Clip
+description: Video displayed inside shapes, text, or masks. Creates striking visual impact.
+tags: [media, video, mask, clip, effect, wow]
+source: amppz.com, brad.co, godly.website, linear.app
+---
+
+# Video Background with Mask & Clip
+
+## Что это
+Видео, отображаемое не как прямоугольник, а внутри формы: маски, обрезка по тексту, SVG-маски. Создаёт премиальный wow-эффект.
+
+## Типы масок для видео
+
+### 1. Text Mask (видео внутри текста)
+```html
+
+```
+
+```css
+.text-mask-video {
+ font-size: clamp(4rem, 12vw, 10rem);
+ font-weight: 900;
+ line-height: 1;
+ background: url('/video-preview.mp4') center/cover;
+ -webkit-mask-image: text;
+ mask-image: text;
+ -webkit-mask-repeat: no-repeat;
+ mask-repeat: no-repeat;
+ -webkit-mask-position: center;
+ mask-position: center;
+ -webkit-mask-size: contain;
+ mask-size: contain;
+ color: #0a0a0a; /* fallback color */
+ margin: 0 auto;
+}
+```
+
+### 2. Circle Mask (видео в круге)
+```html
+
+
+
+```
+
+```css
+.video-circle {
+ width: 400px;
+ height: 400px;
+ border-radius: 50%;
+ overflow: hidden;
+ border: 2px solid rgba(255, 255, 255, 0.1);
+}
+
+.video-circle video {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ /* Увеличиваем чтобы заполнить круг */
+ transform: scale(1.2);
+}
+```
+
+### 3. SVG Mask (произвольная форма)
+```html
+
+
+
+
+
+```
+
+```css
+.video-masked {
+ width: 300px;
+ height: 300px;
+}
+
+.video-masked video {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+```
+
+### 4. Clip-path Polygon
+```css
+.video-polygon {
+ clip-path: polygon(20% 0%, 80% 0%, 100% 50%, 80% 100%, 20% 100%, 0% 50%);
+ overflow: hidden;
+}
+
+.video-polygon video {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+```
+
+### 5. Video as Hero Background
+```html
+
+
+
+
Заголовок поверх видео
+
+
+```
+
+```css
+.hero-video-bg {
+ position: relative;
+ min-height: 100vh;
+ overflow: hidden;
+}
+
+.hero-video-bg video {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ min-width: 100%;
+ min-height: 100%;
+ width: auto;
+ height: auto;
+ transform: translate(-50%, -50%);
+ object-fit: cover;
+ z-index: 0;
+}
+
+.hero-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 1;
+}
+
+.hero-content {
+ position: relative;
+ z-index: 2;
+ max-width: 800px;
+ margin: 0 auto;
+ padding: 120px 24px;
+ text-align: center;
+}
+```
+
+## Performance-Optimized Video Setup
+
+### WebM + MP4 Fallback
+```html
+
+```
+
+```css
+.video-fallback {
+ display: none;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+/* Показываем fallback если видео не загрузилось */
+video:not(:success) + .video-fallback {
+ display: block;
+}
+```
+
+### Responsive Video Sizing
+```css
+.video-responsive {
+ width: 100%;
+ aspect-ratio: 16 / 9;
+ object-fit: cover;
+}
+
+@media (max-width: 768px) {
+ .video-responsive {
+ aspect-ratio: 9 / 16;
+ }
+}
+```
+
+## Lazy Loading Video
+
+```html
+
+
+```
+
+```javascript
+// IntersectionObserver для ленивой загрузки
+const videoObserver = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ const video = entry.target;
+ video.src = video.dataset.src;
+ video.load();
+ videoObserver.unobserve(video);
+ }
+ });
+}, {
+ rootMargin: '200px'
+});
+
+document.querySelectorAll('.video-lazy').forEach(video => {
+ videoObserver.observe(video);
+});
+```
+
+## Video with Noise Overlay (premium feel)
+```html
+
+```
+
+```css
+.noise-overlay {
+ position: absolute;
+ inset: 0;
+ background-image: url('/noise.png');
+ background-size: 256px 256px;
+ opacity: 0.03;
+ mix-blend-mode: overlay;
+ pointer-events: none;
+}
+
+.gradient-overlay {
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(
+ 180deg,
+ transparent 0%,
+ rgba(10, 10, 10, 0.3) 50%,
+ rgba(10, 10, 10, 0.9) 100%
+ );
+ pointer-events: none;
+}
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `.mp4` без `.webm` fallback | WebM + MP4 + poster fallback |
+| Без `preload="metadata"` | `preload="metadata"` + lazy load |
+| Видео > 10MB | Сжать до < 5MB (HandBrake) |
+| Без `playsinline` на мобильных | Всегда `playsinline` для iOS |
+| Без poster | Всегда `poster` как fallback |
+| Звук | Никогда не включать звук на автоплеер |
+
+## Compression Pipeline
+
+```bash
+# HandBrake CLI — сжатие видео для веба
+HandBrakeCLI -i input.mp4 -o output.webm \
+ --format webm \
+ -e libvpx-vp9 \
+ -q 25 \
+ --width 1920 \
+ --max-height 1080 \
+ --two-pass \
+ --turbo 2
+
+# FFmpeg — альтернатива
+ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1500k \
+ -c:a libopus -b:a 128k -f webm output.webm
+```
+
+## CV Service Validation
+
+```bash
+# Проверить performance (video loading impact)
+curl -s -X POST http://localhost:8001/design/analyze-dom \
+ -H "Content-Type: application/json" \
+ -d '{"html": "...", "full_analysis": false}' | python3 -c "
+import sys, json
+d = json.load(sys.stdin)
+perf = d['analyzers'].get('performance', {})
+print(f\"Performance: {perf.get('score', 'N/A')}/10\")
+print(f\" LCP: {perf.get('lcp_impact', 'N/A')}\")
+print(f\" Largest Element: {perf.get('largest_element', 'N/A')}\")
+"
+```
+
+Ожидается: `performance` > 7 (video должен быть оптимизирован).
diff --git a/motion/animated-gradient.md b/motion/animated-gradient.md
new file mode 100644
index 0000000..30b2a91
--- /dev/null
+++ b/motion/animated-gradient.md
@@ -0,0 +1,320 @@
+---
+name: motion/animated-gradient
+title: Animated Gradient Background
+description: Smoothly shifting color gradients for backgrounds, buttons, and text. Creates premium, living feel.
+tags: [motion, gradient, animation, background, glassmorphism]
+source: stripe.com, raycast.com, resend.com, linear.app
+---
+
+# Animated Gradient Background
+
+## Что это
+Анимированные градиентные фоны, которые плавно перетекают друг в друга. Один из ключевых паттернов Stripe.com и современных SaaS-лендингов. Создаёт ощущение "живого" дизайна.
+
+## Типы анимированных градиентов
+
+### 1. Stripe-Style (shifting color flow)
+```css
+.gradient-bg {
+ background: linear-gradient(
+ 135deg,
+ #6366f1,
+ #8b5cf6,
+ #ec4899,
+ #f43f5e,
+ #6366f1
+ );
+ background-size: 400% 400%;
+ animation: gradient-shift 15s ease infinite;
+}
+
+@keyframes gradient-shift {
+ 0% { background-position: 0% 50%; }
+ 25% { background-position: 100% 50%; }
+ 50% { background-position: 100% 100%; }
+ 75% { background-position: 0% 100%; }
+ 100% { background-position: 0% 50%; }
+}
+```
+
+### 2. Radial Pulse (расширяющийся круг)
+```css
+.gradient-pulse {
+ background: radial-gradient(
+ circle at 30% 30%,
+ rgba(99, 102, 241, 0.15),
+ transparent 50%
+ );
+ animation: pulse 8s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% {
+ transform: scale(1);
+ opacity: 0.5;
+ }
+ 50% {
+ transform: scale(1.2);
+ opacity: 0.8;
+ }
+}
+```
+
+### 3. Mesh Gradient (несколько источников)
+```css
+.mesh-gradient {
+ background:
+ radial-gradient(ellipse at 20% 80%, rgba(99, 102, 241, 0.15), transparent 50%),
+ radial-gradient(ellipse at 80% 20%, rgba(236, 72, 153, 0.15), transparent 50%),
+ radial-gradient(ellipse at 50% 50%, rgba(139, 92, 246, 0.1), transparent 50%);
+ background-size: 100% 100%;
+ animation: mesh-move 20s ease-in-out infinite alternate;
+}
+
+@keyframes mesh-move {
+ 0% {
+ background-position: 0% 0%, 100% 100%, 50% 50%;
+ }
+ 100% {
+ background-position: 100% 100%, 0% 0%, 60% 40%;
+ }
+}
+```
+
+### 4. Gradient Border (подвижная рамка)
+```css
+.gradient-border {
+ position: relative;
+ border-radius: 20px;
+ padding: 2px; /* border width */
+ background: linear-gradient(90deg, #6366f1, #ec4899, #f43f5e, #6366f1);
+ background-size: 300% 100%;
+ animation: border-gradient 4s linear infinite;
+}
+
+.gradient-border::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ border-radius: 18px;
+ background: #0a0a0a;
+ z-index: -1;
+}
+
+@keyframes border-gradient {
+ 0% { background-position: 0% 50%; }
+ 100% { background-position: 100% 50%; }
+}
+```
+
+## Glassmorphism Card (Stripe style)
+
+```css
+.glass-card {
+ position: relative;
+ background: rgba(255, 255, 255, 0.03);
+ backdrop-filter: blur(20px);
+ -webkit-backdrop-filter: blur(20px);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 20px;
+ overflow: hidden;
+}
+
+.glass-card::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(
+ 135deg,
+ rgba(255, 255, 255, 0.05) 0%,
+ transparent 50%
+ );
+ pointer-events: none;
+}
+```
+
+## Hero Gradient Background (Stripe.com style)
+
+```html
+
+
+
+
+
+
Your text here
+
+
+```
+
+```css
+.hero-gradient {
+ position: relative;
+ min-height: 60vh;
+ overflow: hidden;
+ background: #0a0a0a;
+}
+
+.gradient-orb {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(80px);
+ opacity: 0.4;
+ animation: orb-float 20s ease-in-out infinite;
+}
+
+.orb-1 {
+ width: 600px;
+ height: 600px;
+ background: radial-gradient(circle, #6366f1, transparent 70%);
+ top: -20%;
+ left: -10%;
+ animation-delay: 0s;
+}
+
+.orb-2 {
+ width: 500px;
+ height: 500px;
+ background: radial-gradient(circle, #ec4899, transparent 70%);
+ bottom: -20%;
+ right: -5%;
+ animation-delay: -5s;
+}
+
+.orb-3 {
+ width: 400px;
+ height: 400px;
+ background: radial-gradient(circle, #10b981, transparent 70%);
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ animation-delay: -10s;
+}
+
+@keyframes orb-float {
+ 0%, 100% {
+ transform: translate(0, 0) scale(1);
+ }
+ 25% {
+ transform: translate(50px, -30px) scale(1.1);
+ }
+ 50% {
+ transform: translate(-30px, 50px) scale(0.95);
+ }
+ 75% {
+ transform: translate(30px, 30px) scale(1.05);
+ }
+}
+```
+
+## Animated Button Gradient
+
+```css
+.btn-gradient-animated {
+ position: relative;
+ padding: 14px 28px;
+ border: none;
+ border-radius: 12px;
+ font-weight: 600;
+ color: white;
+ cursor: pointer;
+ overflow: hidden;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.btn-gradient-animated::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(
+ 120deg,
+ #6366f1,
+ #8b5cf6,
+ #ec4899,
+ #f43f5e,
+ #6366f1
+ );
+ background-size: 300% 100%;
+ animation: btn-gradient 6s ease infinite;
+}
+
+.btn-gradient-animated:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 30px rgba(99, 102, 241, 0.3);
+}
+
+@keyframes btn-gradient {
+ 0% { background-position: 0% 50%; }
+ 50% { background-position: 100% 50%; }
+ 100% { background-position: 0% 50%; }
+}
+```
+
+## Color Palettes
+
+### Indie/SaaS (Stripe/Linear style)
+```css
+--grad-indigo: #6366f1;
+--grad-purple: #8b5cf6;
+--grad-pink: #ec4899;
+--grad-rose: #f43f5e;
+--grad-cyan: #06b6d4;
+```
+
+### Warm (Resend style)
+```css
+--grad-orange: #f97316;
+--grad-yellow: #eab308;
+--grad-red: #ef4444;
+--grad-pink: #ec4899;
+```
+
+### Cool (Raycast style)
+```css
+--grad-blue: #3b82f6;
+--grad-cyan: #06b6d4;
+--grad-teal: #14b8a6;
+--grad-green: #10b981;
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `animation: 3s` — слишком быстро (мозг не успевает) | `animation: 15–30s` — медленное плавное движение |
+| Яркие цвета `#ff0000` | Приглушённые `rgba(99,102,241,0.15)` |
+| Без `filter: blur()` на орбах | `blur(80–120px)` для мягких переходов |
+| Без `prefers-reduced-motion` | Уважать настройки пользователя |
+| Градиент на тексте без fallback | Всегда `-webkit-background-clip` |
+
+## Performance
+
+```css
+/* ✅ Good — CSS animation (GPU accelerated) */
+.gradient-bg {
+ animation: gradient-shift 15s ease infinite;
+ will-change: background-position;
+}
+
+/* ❌ Bad — JS animation (main thread) */
+element.animate([
+ { backgroundPosition: '0% 50%' },
+ { backgroundPosition: '100% 50%' }
+], { duration: 15000, iterations: Infinity });
+```
+
+## CV Service Validation
+
+```bash
+# Проверить визуальную гармонию градиентов
+curl -s -X POST http://localhost:8001/design/analyze \
+ -H "Content-Type: application/json" \
+ -d '{"image_base64": "...", "full_analysis": false}' | python3 -c "
+import sys, json
+d = json.load(sys.stdin)
+color = d['dimensions'].get('color_harmony', {})
+print(f\"Color Harmony: {color.get('score', 'N/A')}/10\")
+print(f\" Palette: {color.get('palette', 'N/A')}\")
+"
+```
+
+Ожидается: `color_harmony` > 6.
diff --git a/motion/hover-micro-interaction.md b/motion/hover-micro-interaction.md
new file mode 100644
index 0000000..a3e83f5
--- /dev/null
+++ b/motion/hover-micro-interaction.md
@@ -0,0 +1,145 @@
+---
+name: motion/hover-micro-interaction
+title: Hover Micro-interactions
+description: Subtle animations on hover: scale, shadow, border glow, color shift.
+tags: [motion, hover, micro-interaction, subtle, premium]
+source: linear.app, raycast.com, stripe.com, resend.com
+---
+
+# Hover Micro-interactions
+
+## Что это
+Микровзаимодействия при наведении: плавные изменения масштаба, тени, свечения бордера, цветового сдвига. Создают ощущение живого интерфейса.
+
+## Типы hover-эффектов
+
+### 1. Card Lift + Shadow
+```css
+.card {
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+.card:hover {
+ transform: translateY(-4px);
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
+}
+```
+
+### 2. Border Glow
+```css
+.card {
+ border: 1px solid var(--color-border);
+ transition: border-color 0.3s ease;
+}
+.card:hover {
+ border-color: var(--color-accent);
+ box-shadow: 0 0 20px rgba(99, 102, 241, 0.2);
+}
+```
+
+### 3. Image Zoom
+```css
+.image-wrapper {
+ overflow: hidden;
+ border-radius: 16px;
+}
+.image-wrapper img {
+ transition: transform 0.5s ease;
+}
+.image-wrapper:hover img {
+ transform: scale(1.05);
+}
+```
+
+### 4. Text Color Shift
+```css
+.link {
+ color: var(--color-text-secondary);
+ position: relative;
+ transition: color 0.3s ease;
+}
+.link:hover {
+ color: var(--color-accent);
+}
+.link::after {
+ content: '';
+ position: absolute;
+ bottom: -2px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background: var(--color-accent);
+ transition: width 0.3s ease;
+}
+.link:hover::after {
+ width: 100%;
+}
+```
+
+### 5. Icon Rotation/Swing
+```css
+.icon {
+ transition: transform 0.3s ease;
+}
+.icon:hover {
+ transform: rotate(15deg) scale(1.1);
+}
+```
+
+## Magnetic Hover (Enhanced)
+
+```css
+.hover-magnetic {
+ transition: transform 0.2s ease;
+}
+.hover-magnetic:hover {
+ transform: scale(1.02);
+}
+```
+
+```javascript
+document.querySelectorAll('.hover-magnetic').forEach(el => {
+ el.addEventListener('mousemove', (e) => {
+ const rect = el.getBoundingClientRect();
+ const x = (e.clientX - rect.left) / rect.width - 0.5;
+ const y = (e.clientY - rect.top) / rect.height - 0.5;
+ el.style.transform = `perspective(500px) rotateY(${x * 10}deg) rotateX(${-y * 10}deg) scale(1.02)`;
+ });
+ el.addEventListener('mouseleave', () => {
+ el.style.transform = 'perspective(500px) rotateY(0) rotateX(0) scale(1)';
+ });
+});
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `transform: scale(1.2)` — слишком резко | `transform: scale(1.02–1.05)` |
+| Без `transition` | `transition: all 0.3s ease` |
+| Без `will-change` на тяжёлых | `will-change: transform` |
+| Hover на touch-устройствах | `@media (hover: hover)` |
+
+## Mobile Detection
+
+```css
+@media (hover: none) {
+ .hover-effect:hover {
+ transform: none;
+ }
+}
+```
+
+## CV Service Validation
+
+```bash
+curl -s -X POST http://localhost:8001/design/analyze \
+ -H "Content-Type: application/json" \
+ -d '{"image_base64": "...", "full_analysis": false}' | python3 -c "
+import sys, json
+d = json.load(sys.stdin)
+motion = d['dimensions'].get('motion_quality', {})
+print(f\"Motion Quality: {motion.get('score', 'N/A')}/10\")
+"
+```
+
+Ожидается: `motion_quality` > 6.
diff --git a/motion/magnetic-button.md b/motion/magnetic-button.md
new file mode 100644
index 0000000..68f1a86
--- /dev/null
+++ b/motion/magnetic-button.md
@@ -0,0 +1,151 @@
+---
+name: motion/magnetic-button
+title: Magnetic Button Effect
+description: Buttons that follow cursor within radius. Creates premium tactile feel.
+tags: [motion, magnetic, button, micro-interaction, premium]
+source: raycast.com, linear.app, brad.co, amppz.com
+---
+
+# Magnetic Button Effect
+
+## Что это
+Кнопки и элементы, которые притягиваются к курсору мыши в пределах радиуса. Создаёт ощущение тактильности и премиальности.
+
+## Параметры
+
+| Параметр | Значение |
+|----------|----------|
+| **Radius** | 60–100px |
+| **Strength** | 0.1–0.3 |
+| **Easing** | `cubic-bezier(0.25, 0.1, 0.25, 1)` |
+| **Duration** | 0.3s |
+
+## Реализация
+
+```html
+
+```
+
+```css
+.magnetic-btn {
+ padding: 16px 32px;
+ background: var(--color-accent);
+ color: white;
+ border: none;
+ border-radius: 12px;
+ font-size: 1rem;
+ font-weight: 600;
+ cursor: pointer;
+ position: relative;
+ transition: transform 0.3s cubic-bezier(0.25, 0.1, 0.25, 1);
+}
+```
+
+```javascript
+class MagneticButton {
+ constructor(element, strength = 0.2, radius = 80) {
+ this.el = element;
+ this.strength = strength;
+ this.radius = radius;
+ this.rect = element.getBoundingClientRect();
+ this.isHovering = false;
+ this.animationId = null;
+ this.pos = { x: 0, y: 0 };
+ this.target = { x: 0, y: 0 };
+
+ this.init();
+ }
+
+ init() {
+ this.el.addEventListener('mouseenter', (e) => {
+ this.isHovering = true;
+ this.rect = this.el.getBoundingClientRect();
+ });
+
+ this.el.addEventListener('mouseleave', () => {
+ this.isHovering = false;
+ this.target = { x: 0, y: 0 };
+ this.animate();
+ });
+
+ this.el.addEventListener('mousemove', (e) => {
+ const x = e.clientX - this.rect.left - this.rect.width / 2;
+ const y = e.clientY - this.rect.top - this.rect.height / 2;
+ this.target = { x: x * this.strength, y: y * this.strength };
+ });
+
+ this.animate();
+ }
+
+ animate() {
+ if (this.isHovering) {
+ this.pos.x += (this.target.x - this.pos.x) * 0.1;
+ this.pos.y += (this.target.y - this.pos.y) * 0.1;
+ } else {
+ this.pos.x *= 0.9;
+ this.pos.y *= 0.9;
+ }
+
+ this.el.style.transform = `translate(${this.pos.x}px, ${this.pos.y}px)`;
+ this.animationId = requestAnimationFrame(() => this.animate());
+ }
+
+ destroy() {
+ cancelAnimationFrame(this.animationId);
+ }
+}
+
+// Usage
+document.querySelectorAll('.magnetic-btn').forEach(el => {
+ new MagneticButton(el);
+});
+```
+
+## Варианты силы притяжения
+
+```javascript
+// Слабое (для текста)
+new MagneticButton(el, 0.1, 60);
+
+// Среднее (для кнопок)
+new MagneticButton(el, 0.2, 80);
+
+// Сильное (для крупных элементов)
+new MagneticButton(el, 0.3, 100);
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `strength: 0.5` — слишком резко | `strength: 0.1–0.3` |
+| Без `mouseleave` сброса | Всегда сбрасывать в 0,0 |
+| Без `requestAnimationFrame` | Использовать RAF |
+| На мобильных без mouse | Проверять `matchMedia('(pointer: fine)')` |
+
+## Mobile Fallback
+
+```javascript
+if (window.matchMedia('(pointer: fine)').matches) {
+ document.querySelectorAll('.magnetic-btn').forEach(el => {
+ new MagneticButton(el);
+ });
+}
+// На мобильных — просто hover-эффект
+```
+
+## CV Service Validation
+
+```bash
+# Проверить micro-interactions
+curl -s -X POST http://localhost:8001/design/analyze \
+ -H "Content-Type: application/json" \
+ -d '{"image_base64": "...", "full_analysis": false}' | python3 -c "
+import sys, json
+d = json.load(sys.stdin)
+motion = d['dimensions'].get('motion_quality', {})
+print(f\"Motion Quality: {motion.get('score', 'N/A')}/10\")
+"
+```
+
+Ожидается: `motion_quality` > 6.
diff --git a/motion/page-transitions.md b/motion/page-transitions.md
new file mode 100644
index 0000000..9e79de8
--- /dev/null
+++ b/motion/page-transitions.md
@@ -0,0 +1,119 @@
+---
+name: motion/page-transitions
+title: Page Transitions & Scroll Animations
+description: Smooth page transitions, section reveals, and scroll-triggered animations.
+tags: [motion, page-transition, scroll, reveal, animation]
+source: linear.app, raycast.com, brad.co, amppz.com
+---
+
+# Page Transitions & Scroll Animations
+
+## Что это
+Анимации при переходе между страницами и появление секций при скролле.
+
+## 1. Section Reveal on Scroll
+
+```javascript
+const sections = document.querySelectorAll('.reveal-section');
+const observer = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add('revealed');
+ observer.unobserve(entry.target);
+ }
+ });
+}, { threshold: 0.1, rootMargin: '0px 0px -10% 0px' });
+
+sections.forEach(section => observer.observe(section));
+```
+
+```css
+.reveal-section {
+ opacity: 0;
+ transform: translateY(40px);
+ transition: opacity 0.8s ease, transform 0.8s ease;
+}
+.reveal-section.revealed {
+ opacity: 1;
+ transform: translateY(0);
+}
+```
+
+## 2. Staggered Children Reveal
+
+```javascript
+const sections = document.querySelectorAll('.stagger-section');
+const observer = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ if (entry.isIntersecting) {
+ entry.target.querySelectorAll('.stagger-child').forEach((child, i) => {
+ setTimeout(() => {
+ child.classList.add('revealed');
+ }, i * 100);
+ });
+ observer.unobserve(entry.target);
+ }
+ });
+}, { threshold: 0.1 });
+
+sections.forEach(section => observer.observe(section));
+```
+
+```css
+.stagger-child {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: all 0.6s ease;
+}
+.stagger-child.revealed {
+ opacity: 1;
+ transform: translateY(0);
+}
+```
+
+## 3. Page Transition (SPA style)
+
+```css
+.page {
+ position: fixed;
+ inset: 0;
+ opacity: 0;
+ transform: scale(1.05);
+ transition: all 0.4s ease;
+ pointer-events: none;
+ z-index: 0;
+}
+.page.active {
+ opacity: 1;
+ transform: scale(1);
+ pointer-events: all;
+ z-index: 1;
+}
+.page.exit {
+ opacity: 0;
+ transform: scale(0.95);
+}
+```
+
+## 4. Smooth Scroll Snap
+
+```css
+.snap-scroll {
+ scroll-snap-type: y mandatory;
+ overflow-y: auto;
+ height: 100vh;
+}
+.snap-section {
+ scroll-snap-align: start;
+ min-height: 100vh;
+}
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `transition: 0.1s` — слишком быстро | `transition: 0.6–1s` |
+| Без `IntersectionObserver` | Использовать observer |
+| Без `prefers-reduced-motion` | Уважать настройки |
+| Без `will-change` | `will-change: transform, opacity` |
diff --git a/motion/parallax-scroll.md b/motion/parallax-scroll.md
new file mode 100644
index 0000000..ab920f7
--- /dev/null
+++ b/motion/parallax-scroll.md
@@ -0,0 +1,142 @@
+---
+name: motion/parallax-scroll
+title: Parallax Depth Effect
+description: Multi-layer scrolling with different speeds. Creates 3D depth perception.
+tags: [motion, parallax, depth, scroll, 3d, premium]
+source: apple.com, linear.app, amppz.com, brad.co
+---
+
+# Parallax Depth Effect
+
+## Что это
+Многослойный скролл с разной скоростью — создаёт ощущение глубины и 3D-пространства.
+
+## Параметры
+
+| Параметр | Значение |
+|----------|----------|
+| **Foreground speed** | 1x (обычный скролл) |
+| **Midground speed** | 0.5x–0.7x |
+| **Background speed** | 0.1x–0.3x |
+
+## CSS-реализация (простая)
+
+```css
+.parallax-section {
+ position: relative;
+ height: 100vh;
+ overflow: hidden;
+}
+
+.parallax-layer {
+ position: absolute;
+ width: 100%;
+ height: 120%;
+ top: -10%;
+}
+
+.parallax-layer.background {
+ z-index: 1;
+}
+.parallax-layer.midground {
+ z-index: 2;
+ transform: translateY(10%);
+}
+.parallax-layer.foreground {
+ z-index: 3;
+ transform: translateY(20%);
+}
+```
+
+## GSAP ScrollTrigger (рекомендуется)
+
+```javascript
+import gsap from 'gsap';
+import { ScrollTrigger } from 'gsap/ScrollTrigger';
+
+gsap.registerPlugin(ScrollTrigger);
+
+// Background slow
+gsap.to('.parallax-bg', {
+ yPercent: 30,
+ ease: 'none',
+ scrollTrigger: {
+ trigger: '.parallax-section',
+ start: 'top bottom',
+ end: 'bottom top',
+ scrub: true
+ }
+});
+
+// Midground medium
+gsap.to('.parallax-mid', {
+ yPercent: 50,
+ ease: 'none',
+ scrollTrigger: {
+ trigger: '.parallax-section',
+ start: 'top bottom',
+ end: 'bottom top',
+ scrub: true
+ }
+});
+
+// Foreground fast
+gsap.to('.parallax-fg', {
+ yPercent: 80,
+ ease: 'none',
+ scrollTrigger: {
+ trigger: '.parallax-section',
+ start: 'top bottom',
+ end: 'bottom top',
+ scrub: true
+ }
+});
+```
+
+## Intersection Observer (лёгкий вариант)
+
+```javascript
+const layers = document.querySelectorAll('.parallax-layer');
+const observer = new IntersectionObserver((entries) => {
+ entries.forEach(entry => {
+ const speed = parseFloat(entry.target.dataset.speed || 0.1);
+ const rect = entry.target.getBoundingClientRect();
+ const scrollPercent = window.scrollY / (window.innerHeight + rect.height);
+ entry.target.style.transform = `translateY(${scrollPercent * speed * 100}%)`;
+ });
+}, { threshold: 0.1 });
+
+layers.forEach(layer => observer.observe(layer));
+```
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| Без `prefers-reduced-motion` | Уважать настройки пользователя |
+| `yPercent: 100` — слишком резко | `yPercent: 30–50` |
+| Без `scrub: true` | `scrub: 1` для плавности |
+|太重ых элементов | SVG/градиенты вместо фото |
+
+## Mobile
+
+```css
+@media (prefers-reduced-motion: reduce) {
+ .parallax-layer {
+ transform: none !important;
+ }
+}
+```
+
+## CV Service Validation
+
+```bash
+curl -s -X POST http://localhost:8001/design/analyze \
+ -H "Content-Type: application/json" \
+ -d '{"image_base64": "...", "full_analysis": false}' | python3 -c "
+import sys, json
+d = json.load(sys.stdin)
+motion = d['dimensions'].get('motion_quality', {})
+print(f\"Motion Quality: {motion.get('score', 'N/A')}/10\")
+"
+```
diff --git a/motion/pattern-animations.md b/motion/pattern-animations.md
new file mode 100644
index 0000000..ee02943
--- /dev/null
+++ b/motion/pattern-animations.md
@@ -0,0 +1,213 @@
+# Pattern Animations — 7 типов процедурных анимаций
+
+> Основано на реализациях из [patterngen-oss](https://github.com/halfof8/patterngen-oss).
+> 7 анимационных типов для SVG-паттернов, рендерящихся через Canvas 2D с таймлайном.
+
+## Обзор
+
+Каждый паттерн — это SVG-файл 40×40 px, который анимируется одним из 7 типов.
+Рендер происходит на Canvas 2D с 4× масштабированием (EXPORT_SCALE = 4).
+Базовый кадр 1920×1080, сетка 20 px, FPS = 24.
+
+## Таймлайн
+
+```
+Фаза 1 (0 — durationMs): Title reveal (half-reveal с easing)
+Фаза 2 (durationMs — 2×): Patterns reveal + squares reveal (staggered)
+Фаза 3 (2× — 4× durationMs): Patterns hold + dots pulsation (loop 4s)
+Цикл: repeat cycle = 4 × durationMs
+```
+
+---
+
+## 1. Dots — fade-in с stagger
+
+Каждый SVG-элемент проявляется индивидуально с рандомной задержкой.
+
+**Механика:**
+```
+dotP = max(0, min(1, (progress - stagger * 0.6) / 0.4))
+globalAlpha = dotP
+```
+
+**Использование:**
+- Мягкое проявление множества мелких элементов
+- Звёздные/точечные паттерны, частицы, текстуры
+- Элементы с `stagger` из SVG (случайный при парсинге)
+
+**Параметры:**
+- `stagger` определяет задержку: 0 = мгновенно, 5 = максимальный разброс
+- Визуально: элементы появляются поочерёдно, создавая «волну»
+
+---
+
+## 2. Capsule — рост из центра по длинной оси
+
+Каждый элемент масштабируется от центра вдоль своей более длинной оси.
+
+**Механика:**
+```
+elP = max(0, min(1, (progress - stagger * 0.3) / 0.7))
+
+if (w >= h) {
+ // горизонтальный: ширина растёт, высота стоит
+ animW = w * elP
+ animX = cx - animW / 2
+} else {
+ // вертикальный: высота растёт, ширина стоит
+ animH = h * elP
+ animY = cy - animH / 2
+}
+```
+
+**Использование:**
+- Анимация линий, полос, разделителей
+- Эффект «заполнения» вдоль направления
+- Элементы с rotation поддерживаются (через rotate transform)
+
+---
+
+## 3. Circle — pie-fill clockwise reveal
+
+Полное SVG-изображение проявляется секторально, как таймер.
+
+**Механика:**
+```
+cx = size / 2
+cy = size / 2
+startAngle = -PI / 2
+endAngle = startAngle + PI * 2 * progress
+
+ctx.arc(cx, cy, size, startAngle, endAngle)
+ctx.drawImage(img, 0, 0, size, size)
+```
+
+**Использование:**
+- Круговые паттерны, диаграммы, радары
+- Прогресс-индикаторы, loading-анимации
+- Полное изображение, не по-элементно
+
+---
+
+## 4. Arrow — slide up снизу
+
+Полное изображение физически сдвигается вверх из-за нижнего края.
+
+**Механика:**
+```
+offset = size * (1 - progress)
+ctx.drawImage(img, 0, offset, size, size)
+```
+
+**Использование:**
+- Элементы «влетают» снизу
+- Эффект подъёма, выдвижения
+- Подходит для контрастных паттернов на тёмном фоне
+
+---
+
+## 5. Square — scale down 1.6× → 1×
+
+Изображение масштабируется от 1.6× до 1× (на 60% больше до нормального).
+
+**Механика:**
+```
+s = 1 + (1 - progress) * 0.6
+cx = size / 2
+cy = size / 2
+ctx.translate(cx, cy)
+ctx.scale(s, s)
+ctx.translate(-cx, -cy)
+ctx.drawImage(img, 0, 0, size, size)
+```
+
+**Использование:**
+- Резкий акцент, «взрывное» проявление
+- Привлечение внимания к паттерну
+- Квадратные/крестообразные элементы
+
+---
+
+## 6. Stripes — slide-in слева направо
+
+Каждая полоса (элемент) сдвигается сверху вниз, сортировка по X.
+
+**Механика:**
+```
+sorted = shapes.sort((a, b) => a.x - b.x)
+stripeStart = (i / n) * 0.5
+stripeP = max(0, min(1, (progress - stripeStart) / 0.5))
+slideOffset = (1 - stripeP) * -size
+ctx.translate(0, slideOffset)
+```
+
+**Использование:**
+- Полосатые паттерны, штрих-код текстуры
+- Горизонтальные линии, решётки
+- Эффект «сканирования» слева направо
+
+---
+
+## 7. Cross — scale down 1.6× → 1×
+
+Тот же алгоритм, что и `square`, но для крестообразных элементов.
+Разница исключительно в семантике и визуальном контексте.
+
+**Механика:**
+```
+// identical to square
+s = 1 + (1 - progress) * 0.6
+ctx.scale(s, s)
+```
+
+---
+
+## Easing функции
+
+| Название | Формула |
+|---------------|---------|
+| `linear` | `t` |
+| `easeIn` | `t²` |
+| `easeOut` | `t(2-t)` |
+| `easeInOut` | `2t²` при t<0.5, `-1+(4-2t)t` при t≥0.5 |
+| `easeInCubic` | `t³` |
+| `easeOutCubic`| `1-(1-t)³` |
+| `easeInOutCubic` | `4t³` при t<0.5, `1-(-2t+2)³/2` при t≥0.5 |
+
+---
+
+## SVG Spec
+
+Каждый SVG-паттерн должен соответствовать формату:
+
+```xml
+
+```
+
+**Правила:**
+1. Размер: 40×40 px (viewBox 0 0 40 40)
+2. Фон: `` (переокрашивается в runtime)
+3.Foreground: `fill="black"` и/или `stroke="black"` (переокрашивается)
+4. Тег `` игнорируется при парсинге
+5. Вложенные `` обрабатываются рекурсивно
+6. Анимация определяется типом анимации, не структурой SVG
+
+**Поддерживаемые теги:** ``, ``, ``
+
+**Transform:** `rotate(angle, ox, oy)` — угол поворота и точка вращения.
+
+---
+
+## Референсы кода
+
+- `src/engine/animations.ts` — 7 switch-касов для каждого animType
+- `src/engine/timeline.ts` — фаза titles → patterns → dots (цикл 4× duration)
+- `src/engine/easing.ts` — 7 easing функций
+- `src/core/patterns.ts` — парсинг SVG, colorizeSvg, svgToImage
+- `src/export/exporter.ts` — экспорт PNG-секвенций (titles, patterns, dots)
+- `src/types.ts` — PatternAnimType, SvgShapeInfo, PatternDef
diff --git a/motion/procedural-patterns.md b/motion/procedural-patterns.md
new file mode 100644
index 0000000..3a4c94f
--- /dev/null
+++ b/motion/procedural-patterns.md
@@ -0,0 +1,229 @@
+---
+name: motion/procedural-patterns
+title: Procedural Pattern Generator
+description: Canvas-based procedural generation of animated patterns around title elements. Uses occupancy grid, BFS proximity map, and seeded RNG for deterministic layout.
+tags: [motion, procedural, pattern, canvas, generation, animation, title-card]
+source: github.com/halfof8/patterngen-oss
+---
+
+# Procedural Pattern Generator
+
+## Что это
+
+Инструментарий для автоматического создания анимированных заставок с процедурно размещёнными паттернами вокруг заголовков. Состоит из трёх компонентов:
+
+1. **Web App** (React + Canvas 2D) — основной генератор
+2. **Figma Plugin** — импорт дизайна из Figma
+3. **Blender Add-on** — импорт PNG-последовательностей как emissive planes
+
+Пайплайн: Figma → Web App (генерация) → PNG-последовательности → Blender (композиция).
+
+## Алгоритм размещения
+
+### 1. Occupancy Grid
+Сетка 20px на 1920×1080 (96×54 ячеек). Title-элементы занимают ячейки, помечая их как занятые.
+
+```typescript
+class GridOccupancy {
+ private cells: boolean[][]; // GRID_ROWS × GRID_COLS
+
+ markRect(x, y, w, h) { /* occupy cells */ }
+ isBlockFree(col, row, spanCols, spanRows) { /* collision check */ }
+ findFreeBlocks(spanCols, spanRows, align) { /* find valid positions */ }
+}
+```
+
+### 2. BFS Proximity Map
+BFS от всех title-элементов к каждой ячейке сетки. Определяет «зону влияния» — где паттерны могут появляться относительно заголовка.
+
+```typescript
+function buildProximityMap(titles): number[][] {
+ const dist: number[][] = fill(Infinity);
+ // BFS from all title edges
+ while (queue.length > 0) {
+ const [cx, cy] = queue.shift();
+ for (const [dx, dy] of neighbors) {
+ const nd = dist[cy+dy][cx+dx];
+ if (nd > dist[cy][cx] + 1) {
+ dist[cy+dy][cx+dx] = dist[cy][cx] + 1;
+ queue.push([cx+dx, cy+dy]);
+ }
+ }
+ }
+}
+```
+
+### 3. Seeded Placement
+Deterministic RNG (mulberry32). Same seed = identical layout.
+
+```typescript
+function mulberry32(seed) {
+ let state = seed >>> 0;
+ return () => {
+ state = (state + 0x6D2B79F5) >>> 0;
+ let t = state;
+ t = Math.imul(t ^ (t >>> 15), t | 1);
+ t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+ };
+}
+```
+
+## 7 типов анимации паттернов
+
+| Тип | Эффект | CSS/Canvas |
+|-----|--------|------------|
+| `dots` | Поэлементный fade-in со stagger | `globalAlpha` per shape |
+| `capsule` | Рост от центра по длинной оси | Clip rect grow |
+| `circle` | Pie-fill по часовой | Arc + clip |
+| `arrow` | Slide up снизу | `translateY` offset |
+| `square` | Scale 1.6× → 1× | `scale()` transform |
+| `stripes` | Полосы slide-in staggered | Y-offset per stripe |
+| `cross` | Scale 1.6× → 1× | `scale()` transform |
+
+## Timeline: 3 фазы
+
+```
+0──────────→ durationMs ──────────→ 2×durationMs ──────────→ 4×durationMs (loop)
+ │ ФАЗА 1 │ ФАЗА 2 │ ФАЗА 3 │
+ │ Title reveal │ Pattern reveal │ Dots pulse │
+ │ half-reveal из центра │ clip-side reveal │ sin wave │
+```
+
+```typescript
+// Фазовая логика timeline
+function evaluate(elapsedMs, durationMs, titles, patterns, dots, easing) {
+ // Phase 1: Title reveal (0→1×)
+ const titleT = Math.min(1, elapsedMs / durationMs);
+ const titleEased = applyEasing(titleT, easing); // half-reveal
+
+ // Phase 2: Pattern reveal (1×→2×)
+ const cycleMs = afterTitle % (4 * durationMs);
+
+ // Phase 3: Dots pulse (2×→4×)
+ const holdMs = cycleMs - durationMs;
+ const pulse = 0.15 + 0.85 * (0.5 + 0.5 * Math.sin(2π * speed * t + phase));
+}
+```
+
+## Color System
+
+```typescript
+function getPairsForColor(primary: string): ColorPair[] {
+ const lum = luminance(r, g, b);
+ const dark = mixRGB(primary, #000000, 0.45);
+ const light = mixRGB(primary, #FFFFFF, 0.35);
+
+ if (lum > 0.5) {
+ return [
+ { bg: primary, fg: '#000000' },
+ { bg: dark, fg: primary },
+ { bg: primary, fg: dark },
+ ];
+ }
+ // inverted for dark colors
+}
+```
+
+Конвенция SVG-паттернов (40×40): `fill="white"` = фон (перекрашивается runtime), `fill="black"` / `stroke="black"` = foreground.
+
+## Figma Plugin
+
+Экспортирует фреймы 1920×1080 в JSON. Каждый слой экспортируется как 2× PNG, цвета автодетектятся.
+
+```javascript
+// code.js — экспорт слоя
+bytes = await child.exportAsync({
+ format: 'PNG',
+ constraint: { type: 'SCALE', value: 2 },
+});
+
+// Автодетект цветов
+collectUsedColors(node, usedColors); // BFS по иерархии
+```
+
+## Blender Add-on
+
+Импорт ZIP с 3 PNG-последовательностями (titles, patterns, dots) как emissive planes:
+
+```python
+# Создаёт plane с aspect-ratio из разрешения PNG
+plane.scale = (6.0, 6.0, 6.0)
+plane.rotation_euler = (90°, 0, 0)
+
+# Emissive shader node graph
+tex.image.source = 'SEQUENCE'
+tex.image_user.use_cyclic = cyclic # dots = True
+nt.links.new(tex.outputs['Color'], bsdf.inputs['Emission'])
+nt.links.new(tex.outputs['Alpha'], bsdf.inputs['Alpha'])
+```
+
+## Ключевые параметры
+
+| Параметр | Диапазон | Описание |
+|----------|----------|----------|
+| density | 1–20 | Количество паттернов (формула: `3 + 40 × (d/10)²`) |
+| proximity | 1–20 | Зона влияния от title (maxRadius = `2 + proximity × 2.5`) |
+| stagger | 0–5 | Stagger window: `(stagger/5) × 0.8` |
+| durationMs | 100–20000 | Длительность фазы |
+| EXPORT_SCALE | 4 | Рендер в 4× разрешении |
+| FPS | 24 | Частота кадров |
+
+## Anti-patterns
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| Паттерны накладываются на title | BFS proximity map ограничивает placement |
+| Без collision detection | Occupancy grid предотвращает наложения |
+| Рандомная расстановка | Seeded RNG — детерминизм для итераций |
+| Паттерны без анимации | 7 типов анимации с clip-side |
+| Фиксированные цвета | Алгоритмическая генерация color pairs |
+| Рендер без bg/fg разделения | white→bg, black→fg runtime colorize |
+| 1 кадр = 1 экспорт | Layer export: titles/patterns/dots separately |
+
+## Где используется
+
+- **patterngen-oss** (github.com/halfof8/patterngen-oss) — open-source референс
+- Title cards в motion design
+- Анимированные фоны лендингов
+- Procedural patterns для социальных сетей
+- Генерация фоновых текстур для 3D-композиций в Blender
+
+## CV Service Validation
+
+Процедурные паттерны рендерятся на Canvas 2D — это клиентская генерация, не серверная. Для валидации дизайна страницы с pattern-генератором:
+
+```bash
+curl -X POST http://localhost:8001/design/full-analysis \
+ -H "Content-Type: application/json" \
+ -d '{"html": "", "full_analysis": true}'
+```
+
+**Особенности:** Canvas-элементы не оцениваются по semantic HTML — паттерны — это визуальный слой. Оценивается обёртка (header, sidebar, controls).
+
+## Технические детали
+
+```
+Структура проекта:
+├── src/store.ts # Zustand store — 373 строки, вся бизнес-логика
+├── src/core/
+│ ├── patterns.ts # Load SVG, colorize (white→bg, black→fg)
+│ ├── colors.ts # getPairsForColor, luminance-based
+│ ├── grid.ts # GridOccupancy + snapToGrid(20px)
+│ ├── placement.ts # generatePlacement — BFS + occupancy
+│ └── rng.ts # mulberry32 seeded RNG
+├── src/engine/
+│ ├── animations.ts # 7 анимаций (drawAnimatedPattern)
+│ ├── easing.ts # 7 easing функций
+│ └── timeline.ts # evaluate() — фазовая логика
+├── src/export/
+│ ├── renderer.ts # renderFrame() — canvas layer compositing
+│ └── exporter.ts # exportAll() → ZIP with 3 layers × 24fps
+├── figma-plugin/
+│ ├── code.js # Figma sandbox export
+│ └── ui.html # Plugin UI
+└── blender-addon/
+ └── patterngen_importer.py # Blender 3.4+ operator
+```
+
+**Зависимости:** React 18, Zustand 5, JSZip, FileSaver, Vite
diff --git a/motion/staggered-reveal.md b/motion/staggered-reveal.md
new file mode 100644
index 0000000..3d8057c
--- /dev/null
+++ b/motion/staggered-reveal.md
@@ -0,0 +1,187 @@
+---
+name: motion/staggered-reveal
+title: Staggered Element Reveal
+description: Cascading entrance animations where elements appear sequentially. Used on Linear, Raycast, Linear.app hero sections.
+tags: [motion, gsap, scrolltrigger, entrance, stagger]
+source: linear.app, raycast.com, godly.website top 50
+---
+
+# Staggered Element Reveal
+
+## Что это
+Последовательное появление элементов с нарастающей задержкой. Создаёт ощущение "потока" и профессионализма. Элементы появляются не все сразу, а каскадом с интервалом.
+
+## Где используется
+- Hero-секции Linear, Raycast, Resend
+- Feature-блоки с иконками
+- Списки преимуществ
+- Карточки с услугами
+
+## Ключевые параметры
+
+| Параметр | Значение | Почему |
+|----------|----------|--------|
+| `stagger` | `0.08–0.12` | Оптимальный ритм — не слишком быстро, не медленно |
+| `duration` | `0.6–0.8s` | Достаточное время для заметности |
+| `ease` | `power3.out` | Плавное замедление, ощущение "приземления" |
+| `delay` | `0.2–0.3` | Задержка перед началом каскада |
+| `from opacity` | `0.8` | Не полная прозрачность, чтобы не было "прыжка" |
+| `from translateY` | `20–30px` | Элементы "влетают" снизу |
+
+## Референсы
+
+### Linear Hero
+```
+1. Logo появляется → 0.3s задержка
+2. H1 появляется (line by line) → stagger 0.1s
+3. Подзаголовок → 0.4s задержка
+4. CTA кнопка → 0.6s задержка
+5. Декоративные элементы → 0.8s задержка
+```
+
+### Resend Feature Grid
+```
+- Карточки появляются с задержкой 0.08s друг за другом
+- Каждая карточка: fade + slide up 15px
+- Hover на карточку: scale 1.02 + shadow
+```
+
+## Реализация
+
+```javascript
+// GSAP + ScrollTrigger
+import gsap from 'gsap';
+import { ScrollTrigger } from 'gsap/ScrollTrigger';
+
+gsap.registerPlugin(ScrollTrigger);
+
+// 1. Базовый stagger-ревеал
+gsap.from('.stagger-item', {
+ opacity: 0,
+ y: 30,
+ duration: 0.7,
+ stagger: 0.08,
+ ease: 'power3.out',
+ delay: 0.3,
+ scrollTrigger: {
+ trigger: '.stagger-section',
+ start: 'top 80%',
+ toggleActions: 'play none none none'
+ }
+});
+
+// 2. Stagger для карточек
+gsap.from('.feature-card', {
+ opacity: 0,
+ y: 25,
+ scale: 0.97,
+ duration: 0.6,
+ stagger: 0.06,
+ ease: 'power2.out',
+ scrollTrigger: {
+ trigger: '.features-grid',
+ start: 'top 85%'
+ }
+});
+
+// 3. Stagger для текстовых строк
+gsap.from('.hero-line', {
+ opacity: 0,
+ y: 40,
+ duration: 0.8,
+ stagger: 0.12,
+ ease: 'power3.out',
+ delay: 0.2
+});
+
+// 4. Line-by-line reveal для заголовка
+const lines = document.querySelectorAll('.hero h1 .line');
+gsap.from(lines, {
+ opacity: 0,
+ y: 50,
+ rotateX: -15,
+ duration: 0.8,
+ stagger: 0.15,
+ ease: 'power3.out',
+ delay: 0.3
+});
+```
+
+## CSS подготовка
+
+```css
+.stagger-item {
+ /* Начальное состояние до анимации */
+ opacity: 0;
+ transform: translateY(30px);
+ will-change: opacity, transform;
+}
+
+/* Альтернатива: CSS-only для простых случаев */
+@keyframes fadeUp {
+ from {
+ opacity: 0;
+ transform: translateY(25px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.stagger-item {
+ opacity: 0;
+ animation: fadeUp 0.6s ease forwards;
+}
+
+.stagger-item:nth-child(1) { animation-delay: 0.1s; }
+.stagger-item:nth-child(2) { animation-delay: 0.18s; }
+.stagger-item:nth-child(3) { animation-delay: 0.26s; }
+.stagger-item:nth-child(4) { animation-delay: 0.34s; }
+.stagger-item:nth-child(5) { animation-delay: 0.42s; }
+.stagger-item:nth-child(6) { animation-delay: 0.5s; }
+```
+
+## Anti-patterns (Чего НЕ делать)
+
+| ❌ Плохо | ✅ Хорошо |
+|----------|-----------|
+| `stagger: 0.02` — слишком быстро, "мигание" | `stagger: 0.08` — чёткий ритм |
+| `stagger: 0.3` — слишком медленно, скучно | `stagger: 0.06–0.12` — оптимально |
+| Все элементы `opacity: 0 → 1` | `opacity: 0.8 → 1` + `y: 20 → 0` |
+| Без `will-change` | `will-change: opacity, transform` |
+| Без `stagger` (все сразу) | Каскадное появление |
+
+## Performance
+
+```javascript
+// ✅ GPU accelerated
+gsap.from('.item', { opacity: 0, y: 20, transform: 'translateY(20px)' });
+
+// ❌ Bad — заставляет layout
+gsap.from('.item', { marginLeft: '20px' });
+gsap.from('.item', { top: '20px', left: '20px' });
+```
+
+## Validation (CV Service)
+```bash
+# После рендеринга страницы
+curl -s -X POST http://localhost:8001/design/analyze-dom \
+ -H "Content-Type: application/json" \
+ -d '{"html": "...", "full_analysis": false}' | python3 -m json.tool
+```
+
+Проверить:
+- `performance` score > 8 — анимации только на `transform` и `opacity`
+- `ux_heuristics` score > 6 — анимации не мешают навигации
+- `wcag_compliance` — анимация имеет `prefers-reduced-motion` фоллбэк
+
+```css
+@media (prefers-reduced-motion: reduce) {
+ .stagger-item {
+ opacity: 1 !important;
+ transform: none !important;
+ animation: none !important;
+ }
+}
+```
diff --git a/prompts/00-master-prompt.md b/prompts/00-master-prompt.md
new file mode 100644
index 0000000..2268d64
--- /dev/null
+++ b/prompts/00-master-prompt.md
@@ -0,0 +1,67 @@
+---
+name: 00-master-prompt
+title: Master LLM Prompt — Premium Design Generation
+description: Universal prompt for generating premium web pages using wiki patterns.
+version: 1.0.0
+---
+
+# Master LLM Prompt for Premium Design Generation
+
+## System Prompt
+
+```
+You are an elite frontend designer and developer. You create award-winning, high-converting landing pages using modern HTML, CSS, and vanilla JavaScript.
+
+Design principles:
+1. Premium dark theme (#0a0a0a background, #111111 surfaces)
+2. Accent color: #6366f1 (indigo)
+3. Typography: Inter font, 1.25 scale ratio
+4. Spacing: 4-128px scale (4,8,12,16,20,24,32,40,48,64,80,96,128)
+5. Motion: 0.3s ease-out for hovers, 0.6s ease for reveals
+6. Accessibility: WCAG AA minimum, skip-link, focus-visible
+7. Mobile-first: breakpoints at 768px, 1024px
+
+Always use these CSS custom properties:
+--color-bg: #0a0a0a
+--color-surface: #111111
+--color-surface-hover: #1a1a1a
+--color-border: rgba(255,255,255,0.06)
+--color-border-hover: rgba(255,255,255,0.12)
+--color-text-primary: #f5f5f5
+--color-text-secondary: #b0b0b0
+--color-accent: #6366f1
+--color-accent-hover: #818cf8
+--ease-out: cubic-bezier(0.4, 0, 0.2, 1)
+--duration-normal: 300ms
+
+Generate complete, production-ready HTML files with:
+- Semantic HTML5 (, ,