projects/org/ideal-shop/docs/DESIGN.md

DESIGN — Дизайн-система

Версия: 2.0.0
Дата: 2026-03-24


Базовый стиль

Этот документ описывает базовый стиль по умолчанию: Swiss + Commerce.
Стиль и цветовая схема меняются через ideal_theme.config.ymlTheme Generator.

Параметр По умолчанию Варианты
Стиль Swiss Swiss / Warm / Bold / Editorial
Схема Commerce Navy / Commerce / Warm / Premium / Fresh / Energy
Шапка RU RU / INTL / Minimal / Mega
Компоновка Shop Shop / Company / Blog / Landing / Portfolio

Философия

Минимализм + Конверсия + Скорость

Дизайн должен продавать, а не отвлекать. Каждый элемент ведёт к покупке.


Цветовая палитра

Формат: HSL — гибкость настройки оттенков, шкала 50-900

Brand (основные)

Токен HSL Использование
brand-500 hsl(220, 90%, 56%) Primary — кнопки, ссылки
brand-600 hsl(220, 90%, 48%) Hover состояние
brand-400 hsl(220, 90%, 64%) Фоны, бейджи

Gray (нейтральные)

Токен HSL Использование
gray-900 hsl(220, 30%, 12%) Основной текст
gray-700 hsl(220, 20%, 30%) Вторичный текст
gray-500 hsl(220, 10%, 50%) Подписи
gray-300 hsl(220, 15%, 80%) Границы
gray-100 hsl(220, 20%, 96%) Фоны секций
gray-50 hsl(220, 20%, 98%) Альт-фон

Semantic (семантические)

Токен HSL Использование
success hsl(142, 70%, 40%) Успех, в наличии
warning hsl(38, 95%, 50%) Внимание, мало
danger hsl(0, 80%, 50%) Ошибка, нет в наличии
info hsl(200, 80%, 50%) Информация

Цена

Состояние Токен
Обычная цена --color-text (gray-900)
Цена со скидкой --color-danger
Старая цена --color-text-muted + зачёркивание

CSS переменные

:root {
  /* Brand scale */
  --color-brand-50: hsl(220, 90%, 96%);
  --color-brand-100: hsl(220, 90%, 92%);
  --color-brand-200: hsl(220, 90%, 84%);
  --color-brand-300: hsl(220, 90%, 72%);
  --color-brand-400: hsl(220, 90%, 64%);
  --color-brand-500: hsl(220, 90%, 56%);  /* Primary */
  --color-brand-600: hsl(220, 90%, 48%);
  --color-brand-700: hsl(220, 90%, 40%);
  --color-brand-800: hsl(220, 90%, 32%);
  --color-brand-900: hsl(220, 90%, 24%);

  /* Gray scale */
  --color-gray-50: hsl(220, 20%, 98%);
  --color-gray-100: hsl(220, 20%, 96%);
  --color-gray-200: hsl(220, 20%, 90%);
  --color-gray-300: hsl(220, 15%, 80%);
  --color-gray-400: hsl(220, 10%, 65%);
  --color-gray-500: hsl(220, 10%, 50%);
  --color-gray-600: hsl(220, 15%, 40%);
  --color-gray-700: hsl(220, 20%, 30%);
  --color-gray-800: hsl(220, 25%, 20%);
  --color-gray-900: hsl(220, 30%, 12%);

  /* Semantic */
  --color-success: hsl(142, 70%, 40%);
  --color-warning: hsl(38, 95%, 50%);
  --color-danger: hsl(0, 80%, 50%);
  --color-info: hsl(200, 80%, 50%);

  /* Aliases */
  --color-text: var(--color-gray-900);
  --color-text-muted: var(--color-gray-500);
  --color-bg: white;
  --color-bg-alt: var(--color-gray-50);
  --color-border: var(--color-gray-200);
  --color-link: var(--color-brand-500);
  --color-link-hover: var(--color-brand-600);
}

Типографика

Шрифты

Назначение Шрифт Fallback
Заголовки System -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif
Текст System -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif
Код/Цена Mono ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace

Причина: Системные шрифты — быстрее загрузка, нативный вид

Размеры

Элемент Desktop Mobile Weight
H1 36px / 2.25rem 28px 700
H2 30px / 1.875rem 24px 700
H3 24px / 1.5rem 20px 600
H4 20px / 1.25rem 18px 600
Body 16px / 1rem 16px 400
Small 14px / 0.875rem 14px 400
Caption 12px / 0.75rem 12px 400
Price (large) 24px / 1.5rem 20px 700
Price (card) 18px / 1.125rem 16px 700

Line Height

Тип Значение
Заголовки 1.2
Текст 1.5
UI элементы 1.4

CSS

:root {
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;

  --font-size-xs: 0.75rem;    /* 12px */
  --font-size-sm: 0.875rem;   /* 14px */
  --font-size-base: 1rem;     /* 16px */
  --font-size-lg: 1.125rem;   /* 18px */
  --font-size-xl: 1.25rem;    /* 20px */
  --font-size-2xl: 1.5rem;    /* 24px */
  --font-size-3xl: 1.875rem;  /* 30px */
  --font-size-4xl: 2.25rem;   /* 36px */

  --font-weight-normal: 400;
  --font-weight-medium: 500;
  --font-weight-semibold: 600;
  --font-weight-bold: 700;

  --line-height-tight: 1.2;
  --line-height-normal: 1.5;
  --line-height-relaxed: 1.6;
}

Отступы и сетка

Spacing Scale

Токен Значение Использование
0 0
1 4px Минимальный
2 8px Внутри элементов
3 12px Между мелкими элементами
4 16px Стандартный
5 20px Между элементами
6 24px Между секциями
8 32px Большой
10 40px Между блоками
12 48px Секции
16 64px Крупные секции

Container

Breakpoint Max Width Padding
Mobile 100% 16px
Tablet (768px) 720px 24px
Desktop (1024px) 960px 24px
Large (1280px) 1200px 24px
XL (1536px) 1440px 24px
3XL (1920px) 1720px 32px

Grid

Breakpoint Columns Gap
Mobile 2 12px
Tablet 3 16px
Desktop 4 20px
Large 4-5 24px
3XL 5-6 24px

CSS

:root {
  --spacing-1: 0.25rem;  /* 4px */
  --spacing-2: 0.5rem;   /* 8px */
  --spacing-3: 0.75rem;  /* 12px */
  --spacing-4: 1rem;     /* 16px */
  --spacing-5: 1.25rem;  /* 20px */
  --spacing-6: 1.5rem;   /* 24px */
  --spacing-8: 2rem;     /* 32px */
  --spacing-10: 2.5rem;  /* 40px */
  --spacing-12: 3rem;    /* 48px */
  --spacing-16: 4rem;    /* 64px */

  --container-sm: 640px;
  --container-md: 768px;
  --container-lg: 1024px;
  --container-xl: 1280px;
  --container-2xl: 1536px;
  --container-3xl: 1720px;
}

Breakpoints

Название Ширина Устройства
xs <640px Телефоны (портрет)
sm ≥640px Телефоны (ландшафт)
md ≥768px Планшеты
lg ≥1024px Ноутбуки
xl ≥1280px Десктопы
2xl ≥1536px Большие экраны
3xl ≥1920px Full HD+

Mobile First

/* Mobile (default) */
.element { ... }

/* Tablet */
@media (min-width: 768px) { ... }

/* Desktop */
@media (min-width: 1024px) { ... }

/* Large */
@media (min-width: 1280px) { ... }

Компоненты

Кнопки (Bootstrap component — переопределяем через CSS-переменные)

Тип Фон Текст Использование
Primary var(--color-brand-500) white Главные действия
Secondary var(--color-gray-100) var(--color-text) Вторичные действия
Ghost transparent var(--color-brand-500) Ссылки-кнопки
Danger var(--color-danger) white Удаление
Размер Padding Font Size Height
sm 8px 16px 14px 32px
md 12px 24px 16px 44px
lg 16px 32px 18px 52px
┌─────────────────────────┐
│    В КОРЗИНУ            │  ← Primary, md
└─────────────────────────┘

┌─────────────────────────┐
│    Подробнее            │  ← Secondary, md
└─────────────────────────┘

Карточка товара

┌─────────────────────────┐
│ [−20%]             [♡]  │  ← Badges, Wishlist
│                         │
│   ┌───────────────┐     │
│   │               │     │  ← Фото 1:1
│   │    [ФОТО]     │     │
│   │               │     │
│   └───────────────┘     │
│                         │
│ Название товара         │  ← 14px, 2 строки max
│ в две строки            │
│                         │
│ 2 490 ₽                 │  ← 18px, bold, red
│ 3̶ ̶1̶0̶0̶ ̶₽̶                 │  ← 14px, gray, strike
│                         │
│ ┌─────────────────────┐ │
│ │   🛒 В КОРЗИНУ      │ │  ← Primary button
│ └─────────────────────┘ │
└─────────────────────────┘

Размеры:
- Ширина: 100% (в grid)
- Фото: aspect-ratio 1:1
- Padding: 12-16px
- Gap между элементами: 8-12px
- Border-radius: 8px
- Shadow (hover): 0 4px 12px rgba(0,0,0,0.1)

Формы (Bootstrap component — переопределяем через CSS-переменные)

Элемент Height Border Radius
Input 44px 1px #CBD5E1 6px
Select 44px 1px #CBD5E1 6px
Textarea auto 1px #CBD5E1 6px
Checkbox 20px 1px #CBD5E1 4px
Radio 20px 1px #CBD5E1 50%

Состояния:
| Состояние | Border | Background |
|-----------|--------|------------|
| Default | var(--color-border) | var(--color-bg) |
| Focus | var(--color-brand-500) | var(--color-bg) |
| Error | var(--color-danger) | var(--color-bg) |
| Disabled | var(--color-gray-200) | var(--color-gray-50) |

┌─────────────────────────────────┐
│ Телефон *                       │  ← Label
├─────────────────────────────────┤
│ +7 (999) 123-45-67              │  ← Input, 44px
└─────────────────────────────────┘
  Обязательное поле                   ← Helper/Error

Badges

Тип Фон Текст
Sale #EF4444 #FFFFFF
New #22C55E #FFFFFF
Hit #F59E0B #FFFFFF
Out #64748B #FFFFFF
Размер: padding 4px 8px, font-size 12px, border-radius 4px

Модальные окна (Bootstrap component)

┌─────────────────────────────────────┐
│ Заголовок                      [×] │
├─────────────────────────────────────┤
│                                     │
│ Контент модального окна             │
│                                     │
├─────────────────────────────────────┤
│           [Отмена] [Подтвердить]    │
└─────────────────────────────────────┘

Размеры:
- Max-width: 480px (sm), 640px (md), 800px (lg)
- Padding: 24px
- Border-radius: 12px
- Overlay: rgba(0,0,0,0.5)

Уведомления (Toast) (Bootstrap component)

┌─────────────────────────────────────┐
│ ✓ Товар добавлен в корзину    [×]  │
└─────────────────────────────────────┘

Позиция: top-right или bottom-center
Длительность: 3-5 секунд

Иконки

Рекомендуемые наборы

Набор Лицензия Ссылка
Lucide MIT lucide.dev
Heroicons MIT heroicons.com
Tabler Icons MIT tabler-icons.io

Размеры

Размер px Использование
xs 16px Inline, badges
sm 20px Кнопки, навигация
md 24px Стандартный
lg 32px Акценты
xl 48px Заголовки секций

Основные иконки

Действие Иконка
Корзина ShoppingCart
Поиск Search
Пользователь User
Сердце Heart
Меню Menu
Закрыть X
Плюс/Минус Plus / Minus
Стрелки ChevronLeft/Right/Down
Удалить Trash
Редактировать Pencil
Телефон Phone
Email Mail
Локация MapPin
Доставка Truck
Успех Check, CheckCircle
Ошибка AlertCircle
Инфо Info

Тени

Уровень Значение Использование
sm 0 1px 2px rgba(0,0,0,0.05) Легкое выделение
md 0 4px 6px rgba(0,0,0,0.1) Карточки
lg 0 10px 15px rgba(0,0,0,0.1) Модалки, dropdown
xl 0 20px 25px rgba(0,0,0,0.15) Попапы
:root {
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.1);
  --shadow-lg: 0 10px 15px rgba(0,0,0,0.1);
  --shadow-xl: 0 20px 25px rgba(0,0,0,0.15);
}

Скругления

Токен Значение Использование
none 0
sm 4px Бейджи, мелкие элементы
md 6px Инпуты, мелкие кнопки
lg 8px Карточки, кнопки
xl 12px Модалки, секции
full 9999px Круглые элементы
:root {
  --radius-sm: 4px;
  --radius-md: 6px;
  --radius-lg: 8px;
  --radius-xl: 12px;
  --radius-full: 9999px;
}

Анимации

Длительности

Токен Значение Использование
fast 150ms Hover, focus
normal 300ms Transitions
slow 500ms Модалки, drawer

Easing

Токен Значение
ease-in cubic-bezier(0.4, 0, 1, 1)
ease-out cubic-bezier(0, 0, 0.2, 1)
ease-in-out cubic-bezier(0.4, 0, 0.2, 1)
:root {
  --duration-fast: 150ms;
  --duration-normal: 300ms;
  --duration-slow: 500ms;

  --ease-in: cubic-bezier(0.4, 0, 1, 1);
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}

/* Пример */
.button {
  transition: background-color var(--duration-fast) var(--ease-in-out);
}

.card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-lg);
  transition: all var(--duration-normal) var(--ease-out);
}

Мобильная адаптация

Принципы

Правило Описание
Mobile First Сначала мобильные, потом desktop
Touch Friendly Min tap target 44×44px
Thumb Zone Важные кнопки внизу
No Hover Состояния без :hover

Навигация

Desktop Mobile
Полное меню Бургер → Drawer
Поиск строка Иконка → Раскрытие
Корзина dropdown Отдельная страница

Карточки товаров

Desktop Mobile
4 в ряд 2 в ряд
Hover эффекты Tap эффекты
Quick view Переход на страницу

Фильтры

Desktop Mobile
Sidebar слева Drawer снизу
Всегда видны По кнопке "Фильтры"

Checkout

Desktop Mobile
2 колонки 1 колонка
Все шаги видны Accordion / Steps

Z-Index

Слой Значение Элементы
Base 0 Контент
Dropdown 10 Выпадающие меню
Sticky 20 Фиксированный header
Drawer 30 Боковые панели
Modal 40 Модальные окна
Popover 50 Tooltips, popovers
Toast 60 Уведомления

Accessibility

Цветовой контраст

Тип Минимум
Текст (normal) 4.5:1
Текст (large) 3:1
UI компоненты 3:1

Фокус

:focus-visible {
  outline: 2px solid var(--color-brand-500);
  outline-offset: 2px;
}

ARIA

Компонент ARIA атрибуты
Modal role="dialog", aria-modal="true"
Drawer role="dialog", aria-label
Tab role="tablist", role="tab"
Accordion aria-expanded, aria-controls
Alert role="alert"

Dark Mode (V3, опционально)

Цвета

Light Dark
#FFFFFF (bg) #0F172A
#0F172A (text) #F8FAFC
#F1F5F9 (gray-100) #1E293B
#CBD5E1 (border) #334155

Реализация

@media (prefers-color-scheme: dark) {
  :root {
    --color-bg: #0F172A;
    --color-text: #F8FAFC;
    --color-gray-100: #1E293B;
    --color-border: #334155;
  }
}

/* Или через класс */
.dark {
  --color-bg: #0F172A;
  ...
}

Примеры страниц

Главная (above the fold)

┌─────────────────────────────────────────────────────────────────┐
 [Logo]  [Каталог ▼]  [____Поиск____]  📞 8-800  [🛒 3] [👤]     
├─────────────────────────────────────────────────────────────────┤
                                                                 
              ЗАГОЛОВОК БАННЕРА                                  
              Подзаголовок описание                              
              [  СМОТРЕТЬ КАТАЛОГ  ]                             
                                                                 
├─────────────────────────────────────────────────────────────────┤
  🚚 Доставка      💳 Оплата        Гарантия     🎁 Бонусы     
  за 1 день        удобная         качества        за покупки    
├─────────────────────────────────────────────────────────────────┤
  [Категория 1]   [Категория 2]   [Категория 3]   [Категория 4]  
                                                                 
└─────────────────────────────────────────────────────────────────┘

Чеклист


← CHECKLIST | THEME-SPEC → | BUILD-PLAN →

Версия: 2.1.0
Обновлено: 2026-03-24