# PhotoPlaces Twilight — Дизайн-система > **photoplaces_twilight** — концепция дизайна, вдохновлённая магией сумерек: когда golden hour переходит в blue hour, и каждый кадр наполнен тёплым светом и креативностью. ## 1. АНАЛИЗ ПРОЕКТА ### Что это PhotoPlaces Twilight — маркетплейс фотолокаций. Пользователи находят места и студии для фотосъёмок, бронируют, общаются с фотографами. ### Целевая аудитория - **Фотографы** (25-40 лет): ищут новые локации, хотят впечатлить клиентов - **Владельцы студий/локаций**: хотят привлечь клиентов, показать пространство - **Заказчики съёмок** (20-35 лет): свадьбы, любительские, коммерческие съёмки ### Эмоциональный посыл 1. **Вдохновение** — хочется снимать, открывать новые места 2. **Надёжность** — можно доверять бронирование 3. **Профессионализм** — серьёзный подход к фотосъёмке 4. **Открытость** — дружелюбное сообщество ### Ключевые ценности Вдохновение • Надёжность • Красота • Сообщество ### Визуальный характер **Современный минимализм с акцентом на визуальный контент.** Фотографии — главные герои. Интерфейс — рамка, которая не отвлекает. ### Философия Twilight - **Golden Hour** — тёплые янтарные акценты (secondary `#F59E0B`) - **Blue Hour** — глубокий индиго как основной цвет (primary `#6366F1`) - **Ночной контраст** — чистый минимализм на тёмном фоне - **Магия момента** — каждое фото как произведение искусства --- ## 2. ЦВЕТОВАЯ ПАЛИТРА ### Философия Twilight Тёмная тема — идеальный фон для фотографий (как ночное небо). Акцентный цвет — индиго-фиолетовый, который ассоциируется с креативностью и вечерним blue hour. Тёплый янтарный secondary — отсылка к golden hour. ### Primary: Индиго-фиолетовый | Формат | Значение | |--------|----------| | Hex | `#6366F1` | | RGB | `rgb(99, 102, 241)` | | HSL | `hsl(239, 84%, 67%)` | **Почему именно этот:** - Ассоциируется с креативностью и вечерним светом (golden hour → blue hour) - Хорошо читается на тёмном фоне - Отличается от типичного зелёного/синего в конкурентах - Работает как для CTA, так и для акцентов ### Secondary: Тёплый янтарный | Формат | Значение | |--------|----------| | Hex | `#F59E0B` | | RGB | `rgb(245, 158, 11)` | | HSL | `hsl(38, 92%, 50%)` | **Назначение:** бейджи, рейтинг, избранные, премиум-метки ### Accent: Бирюзовый | Формат | Значение | |--------|----------| | Hex | `#06B6D4` | | RGB | `rgb(6, 182, 212)` | | HSL | `hsl(189, 94%, 43%)` | **Назначение:** ссылки, интерактивные элементы, ховер-состояния ### Neutrals (тёмная тема) | Токен | Hex | Назначение | |-------|-----|------------| | `--bg` | `#09090B` | Основной фон | | `--bg-elevated` | `#18181B` | Поверхности (карточки, модалки) | | `--bg-hover` | `#27272A` | Ховер-состояния | | `--border` | `#3F3F46` | Границы, разделители | | `--border-subtle` | `#27272A` | Мягкие границы | | `--text-primary` | `#FAFAFA` | Основной текст | | `--text-secondary` | `#A1A1AA` | Вторичный текст | | `--text-muted` | `#71717A` | Приглушённый текст | ### Neutrals (светлая тема) | Токен | Hex | Назначение | |-------|-----|------------| | `--bg` | `#FAFAFA` | Основной фон | | `--bg-elevated` | `#FFFFFF` | Поверхности | | `--bg-hover` | `#F4F4F5` | Ховер-состояния | | `--border` | `#E4E4E7` | Границы | | `--border-subtle` | `#F4F4F5` | Мягкие границы | | `--text-primary` | `#18181B` | Основной текст | | `--text-secondary` | `#52525B` | Вторичный текст | | `--text-muted` | `#A1A1AA` | Приглушённый текст | ### Functional Colors | Состояние | Hex | Назначение | |-----------|-----|------------| | `--success` | `#22C55E` | Успешные действия, подтверждения | | `--warning` | `#F59E0B` | Предупреждения, ожидание | | `--error` | `#EF4444` | Ошибки, удаление | | `--info` | `#3B82F6` | Информационные сообщения | ### Accessibility (контрастные пары) | Комбинация | Ratio | WCAG | |------------|-------|------| | `#FAFAFA` на `#09090B` | 19.3:1 | AAA ✓ | | `#6366F1` на `#09090B` | 6.8:1 | AA ✓ | | `#A1A1AA` на `#09090B` | 7.2:1 | AA ✓ | | `#18181B` на `#FAFAFA` | 19.3:1 | AAA ✓ | | `#6366F1` на `#FFFFFF` | 4.7:1 | AA ✓ | --- ## 3. ТИПОГРАФИКА ### Шрифты | Роль | Шрифт | Обоснование | |------|-------|-------------| | **Заголовки** | Inter | Геометрический, чистый, отлично читается на экране | | **Основной текст** | Inter | Единообразие, хорошая читаемость | | **Mono** | JetBrains Mono | Для кода, ID, технической информации | Почему Inter: - Бесплатный (Google Fonts) - Оптимизирован для экранов - Отличная поддержка кириллицы - Множество начертаний (от Thin до Black) ### Масштабная шкала | Токен | Размер | Line-height | Letter-spacing | Использование | |-------|--------|-------------|----------------|---------------| | `--text-xs` | 12px | 16px | 0.01em | Метки, капшены | | `--text-sm` | 14px | 20px | 0.01em | Small text, описания | | `--text-base` | 16px | 24px | 0em | Основной текст | | `--text-lg` | 18px | 28px | -0.01em | Крупный body text | | `--text-xl` | 20px | 28px | -0.01em | h5, h4 | | `--text-2xl` | 24px | 32px | -0.02em | h3 | | `--text-3xl` | 30px | 36px | -0.02em | h2 | | `--text-4xl` | 36px | 40px | -0.03em | h1 | | `--text-5xl` | 48px | 48px | -0.03em | Hero заголовки | ### Иерархия текста ``` Hero (text-5xl, font-bold) └── Подзаголовок (text-lg, text-secondary) Раздел (text-3xl, font-semibold) └── Описание (text-base, text-secondary) Карточка заголовок (text-xl, font-medium) └── Карточка описание (text-sm, text-secondary) Метка (text-xs, font-medium, uppercase, tracking-wider) └── Значение (text-base, font-semibold) ``` --- ## 4. СЕТКА И ОТСТУПЫ ### Базовая единица: 4px ### Spacing Scale | Токен | Значение | Использование | |-------|----------|---------------| | `--space-0` | 0px | Нет отступа | | `--space-0.5` | 2px | Минимальный зазор | | `--space-1` | 4px | Минимальный отступ | | `--space-1.5` | 6px | Between иконок | | `--space-2` | 8px | Внутренний padding кнопок | | `--space-3` | 12px | Between элементов в строке | | `--space-4` | 16px | Стандартный padding | | `--space-5` | 20px | Между секциями | | `--space-6` | 24px | Карточки, блоки | | `--space-8` | 32px | Между группами | | `--space-10` | 40px | Отступы секций | | `--space-12` | 48px | Крупные разделители | | `--space-16` | 64px | Hero-секции | | `--space-20` | 80px | Между страницами | ### Сетка | Параметр | Значение | |----------|----------| | Колонки (desktop) | 12 | | Колонки (tablet) | 8 | | Колонки (mobile) | 4 | | Gutter | 24px (desktop), 16px (mobile) | | Max-width | 1280px | | Padding | 32px (desktop), 16px (mobile) | ### Breakpoints | Имя | Минимальная ширина | Описание | |-----|-------------------|----------| | `sm` | 640px | Мобильный (альбом) | | `md` | 768px | Планшет | | `lg` | 1024px | Десктоп | | `xl` | 1280px | Широкий десктоп | | `2xl` | 1536px | Экстрабольшой | ### Border Radius | Токен | Значение | Использование | |-------|----------|---------------| | `--radius-sm` | 6px | Кнопки, инпуты | | `--radius-md` | 8px | Карточки, модалки | | `--radius-lg` | 12px | Крупные блоки | | `--radius-xl` | 16px | Hero-элементы | | `--radius-2xl` | 24px | Аватары, круглые элементы | | `--radius-full` | 9999px | Пилюли, бейджи | ### Shadows (тёмная тема) | Токен | Значение | |-------|----------| | `--shadow-sm` | `0 1px 2px rgba(0,0,0,0.4)` | | `--shadow-md` | `0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px rgba(0,0,0,0.3)` | | `--shadow-lg` | `0 10px 15px -3px rgba(0,0,0,0.4), 0 4px 6px rgba(0,0,0,0.3)` | | `--shadow-xl` | `0 20px 25px -5px rgba(0,0,0,0.4), 0 8px 10px rgba(0,0,0,0.3)` | | `--shadow-glow` | `0 0 20px rgba(99,102,241,0.3)` | ### Shadows (светлая тема) | Токен | Значение | |-------|----------| | `--shadow-sm` | `0 1px 2px rgba(0,0,0,0.05)` | | `--shadow-md` | `0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px rgba(0,0,0,0.06)` | | `--shadow-lg` | `0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px rgba(0,0,0,0.05)` | | `--shadow-xl` | `0 20px 25px -5px rgba(0,0,0,0.1), 0 8px 10px rgba(0,0,0,0.04)` | --- ## 5. КОМПОНЕНТЫ --- ### Button #### Описание Основной интерактивный элемент. Визуально — чистый, с чёткими состояниями. #### Variants **Primary** ```css background: var(--primary); color: white; font-weight: 600; ``` **Secondary** ```css background: transparent; border: 1px solid var(--border); color: var(--text-primary); ``` **Ghost** ```css background: transparent; color: var(--text-secondary); ``` **Danger** ```css background: var(--error); color: white; ``` #### Размеры | Размер | Высота | Padding | Шрифт | Border-radius | |--------|--------|---------|-------|---------------| | `sm` | 32px | 8px 12px | 13px | 6px | | `md` | 40px | 10px 16px | 14px | 8px | | `lg` | 48px | 12px 24px | 16px | 8px | | `xl` | 56px | 16px 32px | 18px | 12px | #### Состояния | Состояние | Изменение | |-----------|-----------| | Default | Базовый вид | | Hover | `brightness(1.1)`, `transform: translateY(-1px)` | | Active | `brightness(0.95)`, `transform: translateY(0)` | | Focus | `outline: 2px solid var(--primary)`, `outline-offset: 2px` | | Disabled | `opacity: 0.5`, `cursor: not-allowed` | | Loading | Спиннер вместо текста, `pointer-events: none` | #### Tailwind-классы ```tsx // Primary ``` #### Доступность - `role="article"` или `
` - `alt` для изображений - `aria-label` для кнопок действий --- ### Badge / Tag #### Описание Метки для категорий, статусов, тегов. #### Варианты | Вариант | Цвет | Использование | |---------|------|---------------| | Default | `bg-zinc-800 text-zinc-300` | Обычные теги | | Primary | `bg-indigo-500/20 text-indigo-400` | Основные категории | | Success | `bg-emerald-500/20 text-emerald-400` | Доступно, подтверждено | | Warning | `bg-amber-500/20 text-amber-400` | Ожидание, на модерации | | Error | `bg-red-500/20 text-red-400` | Ошибка, отменено | #### Tailwind-классы ```tsx Студия ``` --- ### Modal / Dialog #### Описание Модальное окно для форм, подтверждений, детальной информации. #### Размеры | Размер | Ширина | Описание | |--------|--------|----------| | `sm` | 400px | Подтверждения, простые формы | | `md` | 500px | Формы входа/регистрации | | `lg` | 640px | Сложные формы, детали | | `xl` | 800px | Полноэкранный просмотр | #### Визуал ``` ┌─────────────────────────────────────────┐ │ Заголовок [X закрыть]│ ├─────────────────────────────────────────┤ │ │ │ Содержимое │ │ │ ├─────────────────────────────────────────┤ │ [Отмена] [Действие] │ └─────────────────────────────────────────┘ ``` #### Tailwind-классы ```tsx // Backdrop
// Modal
{/* Header */}

Заголовок

{/* Content */}
Содержимое
{/* Footer */}
``` #### Доступность - `role="dialog"` - `aria-modal="true"` - `aria-labelledby` для заголовка - Фокус внутри модалки (focus trap) - Закрытие по Escape --- ### Navigation (Header) #### Описание Верхняя навигация с лого, ссылками и действиями пользователя. #### Визуал ``` ┌─────────────────────────────────────────────────────────────┐ │ PhotoPlaces Twilight Локации Студии Фотографы [Войти] │ └─────────────────────────────────────────────────────────────┘ ``` #### Tailwind-классы ```tsx
{/* Logo */} PhotoPlaces Twilight {/* Nav Links */} {/* Actions */}
``` --- ### Footer #### Описание Подвал сайта с ссылками, копирайтом, соцсетями. #### Tailwind-классы ```tsx
{/* Колонка 1: О проекте */}

PhotoPlaces Twilight

Маркетплейс фотолокаций

{/* Колонка 2: Навигация */}

Навигация

{/* Колонка 3: Контакты */}

Контакты

{/* Колонка 4: Соцсети */}

Соцсети

© 2024 PhotoPlaces Twilight. Все права защищены.

``` --- ### Toast / Notification #### Описание Всплывающие уведомления о результатах действий. #### Варианты | Тип | Иконка | Цвет | Пример | |-----|--------|------|--------| | Success | CheckCircle | `text-emerald-400` | "Локация добавлена" | | Error | XCircle | `text-red-400` | "Ошибка сервера" | | Warning | AlertTriangle | `text-amber-400` | "Проверьте данные" | | Info | Info | `text-blue-400` | "Отправлена заявка" | #### Tailwind-классы ```tsx

Локация успешно добавлена!

``` --- ### Tabs #### Описание Переключение между секциями или вкладками. #### Tailwind-классы ```tsx
``` --- ### Tooltip / Popover #### Описание Вспомогательная информация при наведении. #### Tailwind-классы ```tsx
Подсказка
``` --- ### Table #### Описание Таблица данных для админки, списков бронирований. #### Tailwind-классы ```tsx
Название Статус Дата
Название Активно 01.01.2024
``` --- ## 6. АНИМАЦИИ И ПЕРЕХОДЫ ### Длительность | Токен | Значение | Использование | |-------|----------|---------------| | `--duration-fast` | 100ms | Hover-эффекты, color transitions | | `--duration-normal` | 200ms | Toggle, appearance | | `--duration-slow` | 300ms | Modal, dropdown | | `--duration-slower` | 500ms | Page transitions, complex | ### Кривые | Токен | Значение | Использование | |-------|----------|---------------| | `--ease-default` | `cubic-bezier(0.4, 0, 0.2, 1)` | Стандартные переходы | | `--ease-in` | `cubic-bezier(0.4, 0, 1, 1)` | Уход элементов | | `--ease-out` | `cubic-bezier(0, 0, 0.2, 1)` | Появление элементов | | `--ease-spring` | `cubic-bezier(0.34, 1.56, 0.64, 1)` | Bounce-эффекты | ### Примеры анимаций ```css /* Появление модалки */ @keyframes modal-in { from { opacity: 0; transform: translate(-50%, -50%) scale(0.95); } to { opacity: 1; transform: translate(-50%, -50%) scale(1); } } /* Slide-in toast */ @keyframes toast-in { from { opacity: 0; transform: translateY(100%); } to { opacity: 1; transform: translateY(0); } } /* Shimmer для skeleton */ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .skeleton { background: linear-gradient( 90deg, var(--bg-elevated) 25%, var(--bg-hover) 50%, var(--bg-elevated) 75% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; } ``` --- ## 7. ПРАВИЛА И ПРИНЦИПЫ ### 1. Content First (Контент важнее декора) Фотографии — главные герои. Интерфейс обрамляет, но не перетягивает внимание. **Плохо:** Яркие рамки вокруг фото, мигающие кнопки, слишком много цвета **Хорошо:** Фото занимает 70% карточки, UI — тихий фон --- ### 2. Clarity Over Cleverness (Понятность важнее красивости) Пользователь должен понимать, что делать, без инструкций. **Плохо:** Кнопка-иконка без подписи,神秘ные жесты **Хорошо:** "Забронировать" вместо просто иконки корзины --- ### 3. Accessible by Default (Доступность не опциональность) Каждый элемент должен работать для всех пользователей. **Плохо:** Серый текст на сером фоне, нет фокуса, нет aria **Хорошо:** Контраст 4.5:1, видимый фокус, семантический HTML --- ### 4. Consistent Rhythm (Единый ритм) Отступы, размеры, анимации следуют единой системе. **Плохо:** Разные отступы в карточках, рандомные размеры шрифтов **Хорошо:** Везде spacing-4, text-sm для описаний, radius-lg для карточек --- ### 5. Progressive Disclosure (Показывай по необходимости) Не перегружай интерфейс. Показывай детали по мере необходимости. **Плохо:** Вся форма бронирования на главной **Хорошо:** Сначала карточка → клик → модалка с формой --- ## 8. ТОКЕНЫ ДЛЯ FIGMA ### JSON-структура (Tokens Studio) > PhotoPlaces Twilight Design Tokens ```json { "colors": { "primary": { "50": "#EEF2FF", "100": "#E0E7FF", "200": "#C7D2FE", "300": "#A5B4FC", "400": "#818CF8", "500": "#6366F1", "600": "#4F46E5", "700": "#4338CA", "800": "#3730A3", "900": "#312E81" }, "secondary": { "500": "#F59E0B", "600": "#D97706" }, "accent": { "500": "#06B6D4", "600": "#0891B2" }, "neutral": { "50": "#FAFAFA", "100": "#F4F4F5", "200": "#E4E4E7", "300": "#D4D4D8", "400": "#A1A1AA", "500": "#71717A", "600": "#52525B", "700": "#3F3F46", "800": "#27272A", "900": "#18181B", "950": "#09090B" }, "success": { "500": "#22C55E" }, "warning": { "500": "#F59E0B" }, "error": { "500": "#EF4444" }, "info": { "500": "#3B82F6" } }, "typography": { "fontFamily": { "heading": "Inter, sans-serif", "body": "Inter, sans-serif", "mono": "JetBrains Mono, monospace" }, "fontSize": { "xs": { "value": "12px", "lineHeight": "16px" }, "sm": { "value": "14px", "lineHeight": "20px" }, "base": { "value": "16px", "lineHeight": "24px" }, "lg": { "value": "18px", "lineHeight": "28px" }, "xl": { "value": "20px", "lineHeight": "28px" }, "2xl": { "value": "24px", "lineHeight": "32px" }, "3xl": { "value": "30px", "lineHeight": "36px" }, "4xl": { "value": "36px", "lineHeight": "40px" }, "5xl": { "value": "48px", "lineHeight": "48px" } }, "fontWeight": { "normal": "400", "medium": "500", "semibold": "600", "bold": "700" } }, "spacing": { "0": "0px", "0.5": "2px", "1": "4px", "1.5": "6px", "2": "8px", "3": "12px", "4": "16px", "5": "20px", "6": "24px", "8": "32px", "10": "40px", "12": "48px", "16": "64px", "20": "80px" }, "borderRadius": { "sm": "6px", "md": "8px", "lg": "12px", "xl": "16px", "2xl": "24px", "full": "9999px" }, "boxShadow": { "sm": "0 1px 2px rgba(0,0,0,0.4)", "md": "0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px rgba(0,0,0,0.3)", "lg": "0 10px 15px -3px rgba(0,0,0,0.4), 0 4px 6px rgba(0,0,0,0.3)", "xl": "0 20px 25px -5px rgba(0,0,0,0.4), 0 8px 10px rgba(0,0,0,0.3)", "glow": "0 0 20px rgba(99,102,241,0.3)" }, "duration": { "fast": "100ms", "normal": "200ms", "slow": "300ms", "slower": "500ms" } } ``` --- ## 9. CSS-ПЕРЕМЕННЫЕ ```css /* PhotoPlaces Twilight Design System */ :root { /* ========== LIGHT THEME ========== */ --bg: #FAFAFA; --bg-elevated: #FFFFFF; --bg-hover: #F4F4F5; --border: #E4E4E7; --border-subtle: #F4F4F5; --text-primary: #18181B; --text-secondary: #52525B; --text-muted: #A1A1AA; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.05); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px rgba(0,0,0,0.06); --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px rgba(0,0,0,0.05); } [data-theme="dark"] { /* ========== DARK THEME ========== */ --bg: #09090B; --bg-elevated: #18181B; --bg-hover: #27272A; --border: #3F3F46; --border-subtle: #27272A; --text-primary: #FAFAFA; --text-secondary: #A1A1AA; --text-muted: #71717A; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.4); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px rgba(0,0,0,0.3); --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.4), 0 4px 6px rgba(0,0,0,0.3); } :root { /* ========== COLORS ========== */ --primary: #6366F1; --primary-hover: #4F46E5; --secondary: #F59E0B; --accent: #06B6D4; /* Functional */ --success: #22C55E; --warning: #F59E0B; --error: #EF4444; --info: #3B82F6; /* ========== TYPOGRAPHY ========== */ --font-heading: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; /* ========== SPACING ========== */ --space-0: 0px; --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px; --space-12: 48px; --space-16: 64px; --space-20: 80px; /* ========== BORDER RADIUS ========== */ --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --radius-xl: 16px; --radius-2xl: 24px; --radius-full: 9999px; /* ========== TRANSITIONS ========== */ --duration-fast: 100ms; --duration-normal: 200ms; --duration-slow: 300ms; --duration-slower: 500ms; --ease-default: cubic-bezier(0.4, 0, 0.2, 1); --ease-in: cubic-bezier(0.4, 0, 1, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1); --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); } ``` --- ## 10. TAILWIND CONFIG ```javascript // tailwind.config.js // PhotoPlaces Twilight Design System /** @type {import('tailwindcss').Config} */ module.exports = { content: ['./src/**/*.{ts,tsx}'], darkMode: ['class', '[data-theme="dark"]'], theme: { extend: { colors: { primary: { 50: '#EEF2FF', 100: '#E0E7FF', 200: '#C7D2FE', 300: '#A5B4FC', 400: '#818CF8', 500: '#6366F1', 600: '#4F46E5', 700: '#4338CA', 800: '#3730A3', 900: '#312E81', }, secondary: { 500: '#F59E0B', 600: '#D97706', }, accent: { 500: '#06B6D4', 600: '#0891B2', }, }, fontFamily: { heading: ['Inter', 'sans-serif'], body: ['Inter', 'sans-serif'], mono: ['JetBrains Mono', 'monospace'], }, fontSize: { 'xs': ['12px', { lineHeight: '16px' }], 'sm': ['14px', { lineHeight: '20px' }], 'base': ['16px', { lineHeight: '24px' }], 'lg': ['18px', { lineHeight: '28px' }], 'xl': ['20px', { lineHeight: '28px' }], '2xl': ['24px', { lineHeight: '32px' }], '3xl': ['30px', { lineHeight: '36px' }], '4xl': ['36px', { lineHeight: '40px' }], '5xl': ['48px', { lineHeight: '48px' }], }, spacing: { '0.5': '2px', '1.5': '6px', '18': '72px', '88': '352px', }, borderRadius: { 'sm': '6px', 'md': '8px', 'lg': '12px', 'xl': '16px', '2xl': '24px', }, boxShadow: { 'glow': '0 0 20px rgba(99,102,241,0.3)', 'glow-lg': '0 0 40px rgba(99,102,241,0.4)', }, animation: { 'fade-in': 'fade-in 0.2s ease-out', 'slide-up': 'slide-up 0.3s ease-out', 'slide-down': 'slide-down 0.3s ease-out', 'scale-in': 'scale-in 0.2s ease-out', }, keyframes: { 'fade-in': { '0%': { opacity: '0' }, '100%': { opacity: '1' }, }, 'slide-up': { '0%': { transform: 'translateY(10px)', opacity: '0' }, '100%': { transform: 'translateY(0)', opacity: '1' }, }, 'slide-down': { '0%': { transform: 'translateY(-10px)', opacity: '0' }, '100%': { transform: 'translateY(0)', opacity: '1' }, }, 'scale-in': { '0%': { transform: 'scale(0.95)', opacity: '0' }, '100%': { transform: 'scale(1)', opacity: '1' }, }, }, }, }, plugins: [ require('tailwindcss-animate'), ], } ```