Skip to main content

Макеты

Этот документ охватывает компоненты макетов уровня 3 в архитектуре @ui8kit/core: DashLayout, LayoutBlock и SplitBlock. Это компоненты уровня шаблонов (организмы), которые организуют UI-компоненты уровня 2 и примитивы уровня 1 в структурные макеты страниц. Эта страница фокусируется на паттернах композиции макетов, системах хуков контента и особых соображениях при создании структур приложений. Для базовых примитивов макетов (Grid, Flex, Stack) см. Базовые компоненты.
Для UI-компонентов, используемых внутри макетов, см. UI-компоненты.
Для деталей API и справки по пропсам см. API компонентов макетов.

Обзор архитектуры макетов

Система макетов работает на самом высоком архитектурном уровне, компонуя UI-компоненты и примитивы в полные структуры страниц. Три компонента макетов служат различным структурным целям:
Источники: src/layouts/DashLayout.tsx1-99 src/layouts/LayoutBlock.tsx1-389 src/layouts/SplitBlock.tsx1-145 README.md147-168

DashLayout - Шаблон дашборда

DashLayout предоставляет полную структуру дашборда с изменяемыми панелями, навигационным заголовком и сворачиваемой боковой панелью. Он использует react-resizable-panels для интерактивного управления панелями.

Структура компонента

Ключевые интерфейсы и пропсы

Детали реализации

Компонент Dashboard в src/layouts/DashLayout.tsx64-91 организует макет:
  1. Navbar рендерится вверху с переключателем темы в src/layouts/DashLayout.tsx34-49
  2. PanelGroup с direction="horizontal" создает изменяемый макет в src/layouts/DashLayout.tsx75-88
  3. Panel компоненты определяют боковую панель (20% по умолчанию, диапазон 10-40%) и область контента (80% по умолчанию, минимум 50%) в src/layouts/DashLayout.tsx76-86
  4. PanelResizeHandle обеспечивает интерактивное изменение размера в src/layouts/DashLayout.tsx80
  5. Container оборачивает основной контент с адаптивным размером в src/layouts/DashLayout.tsx84

Паттерн использования

Макет автоматически сохраняет размеры панелей через autoSaveId="dashlayout-panels" в src/layouts/DashLayout.tsx75 Источники: src/layouts/DashLayout.tsx1-99 README.md155-168

LayoutBlock - Гибкие секции контента

LayoutBlock - это универсальный компонент макета, который рендерит секции контента с тремя режимами макета (grid, flex, stack) и мощной системой хуков контента для динамического рендеринга.

Режимы макета и конфигурация

Система хуков контента

Система хуков контента в src/layouts/LayoutBlock.tsx22-30 позволяет заменить любую часть рендерящегося контента:

Рендереры по умолчанию

Компонент предоставляет рендереры по умолчанию в src/layouts/LayoutBlock.tsx123-227:

Пропсы конфигурации

Структура данных контента

Пропс content в src/layouts/LayoutBlock.tsx61-77 следует этой схеме:

Рендеринг режимов макета

Логика рендеринга в src/layouts/LayoutBlock.tsx298-353 выбирает соответствующий компонент макета:
Каждый макет оборачивает элементы в соответствующий примитивный компонент с атрибутами data-class для таргетинга DOM в src/layouts/LayoutBlock.tsx320-348

Примеры использования

Grid с карточками:
Flex с кастомными хуками:
Источники: src/layouts/LayoutBlock.tsx1-389 README.md149-154

SplitBlock - Двухколоночный разделенный макет

SplitBlock создает двухколоночные макеты с гибкими медиа и контентными секциями, обычно используемые для героических секций, демонстрации функций и комбинаций контента/изображений.

Режимы макета

Система хуков контента

Подобно LayoutBlock, SplitBlock поддерживает хуки контента в src/layouts/SplitBlock.tsx11-15:

API слотов

API слотов в src/layouts/SplitBlock.tsx36-42 предоставляет именованные переопределения:
Разрешение медиа-слота в src/layouts/SplitBlock.tsx91 приоритизирует переопределения слотов над прямыми пропсами.

Пропсы конфигурации

Логика рендеринга макета

Логика рендеринга в src/layouts/SplitBlock.tsx94-136 создает два различных макета: Режим Container (splitSection=false) в src/layouts/SplitBlock.tsx96-111:
  • Оборачивает grid в адаптивный Container
  • Применяет пропсы containerSize и padding
  • Подходит для стандартных секций страниц
Режим на всю ширину (splitSection=true) в src/layouts/SplitBlock.tsx115-135:
  • Grid непосредственно после Block без контейнера
  • Использует data-class="split-grid" для идентификации в src/layouts/SplitBlock.tsx129
  • Применяет flex-1 items-center для высоты на весь viewport

Порядок колонок

Порядок колонок определяется пропсом leftMedia в src/layouts/SplitBlock.tsx106-107 и src/layouts/SplitBlock.tsx131-132:
  • leftMedia=true: [mediaSection, contentSection]
  • leftMedia=false: [contentSection, mediaSection]

Примеры использования

Базовый Split с медиа:
С хуками контента:
Hero на всю ширину:
Источники: src/layouts/SplitBlock.tsx1-145 README.md149-154

Интеграция с примитивами макетов

Компоненты макетов активно используют примитивы уровня 1 для структуры. Понимание этих примитивов важно для работы с макетами.

Компонент Grid

Используется LayoutBlock (режим grid) и SplitBlock для макетов CSS Grid:
Общие конфигурации Grid:
  • cols="1-2-3" - Адаптивные 1/2/3 колонки
  • cols="2" - Фиксированные 2 колонки
  • gap="lg" - Большой промежуток между элементами
  • align="center" - Центрировать элементы вертикально

Компонент Stack

Используется LayoutBlock (режим stack) и внутри контентных секций для вертикальных макетов:

Компонент Block

Все компоненты макетов используют Block как корневой семантический контейнер:
Пропс component в src/layouts/DashLayout.tsx16 src/layouts/DashLayout.tsx36 и src/layouts/DashLayout.tsx74 обеспечивает семантическую HTML структуру (<section>, <nav>, <aside>, <main>). Источники: src/layouts/LayoutBlock.tsx3-16 src/layouts/SplitBlock.tsx3-8 src/layouts/DashLayout.tsx2

Паттерны композиции

Компоненты макетов следуют специфическим паттернам композиции для построения сложных структур.

Паттерн 1: Вложенная композиция макетов

Макеты могут быть вложены для создания сложных структур страниц:
Пример:

Паттерн 2: Управление контейнером

Макеты используют компонент Container для адаптивного контроля ширины:

Паттерн 3: Переопределение хука контента

Система хуков контента обеспечивает прогрессивное улучшение:
Цепочка fallback:
  1. Проверить наличие кастомного contentHooks.item в src/layouts/LayoutBlock.tsx302
  2. Откатиться к рендереру по умолчанию в src/layouts/LayoutBlock.tsx285
  3. Применить умолчания специфичные для макета в src/layouts/LayoutBlock.tsx230-254

Паттерн 4: Переопределения на основе слотов

Слоты SplitBlock предоставляют целенаправленную кастомизацию без полных хуков контента:
Разрешение в src/layouts/SplitBlock.tsx91 приоритизирует слоты над прямыми пропсами.

Паттерн 5: Рендеринг на основе данных

Макеты принимают структурированные данные и рендерят автоматически:
Конвейер рендеринга в src/layouts/LayoutBlock.tsx288-361 обрабатывает:
  1. Рендеринг заголовка из content.badge/title/description
  2. Итерацию и рендеринг элементов из content.items
  3. Обертку макета на основе режима layout
Источники: src/layouts/LayoutBlock.tsx256-386 src/layouts/SplitBlock.tsx67-143 src/layouts/DashLayout.tsx64-91

Особые соображения

Семантическая HTML структура

Компоненты макетов обеспечивают семантическую HTML5 структуру: Это обеспечивает доступность и SEO соответствие без дополнительной конфигурации.

Атрибуты Data-Class

Все макеты применяют атрибуты data-class для консистентного таргетинга DOM: Это обеспечивает надежное тестирование и стилизацию без зависимости от className.

Адаптивное поведение

Макеты обрабатывают адаптивный дизайн через пропсы вариантов: Адаптивные колонки Grid:
  • cols="1-2-3" создает брейкпоинты мобильная→планшет→десктоп
  • Автоматически сворачивается в 1 колонку на мобильных
  • Масштабируется до 2 колонок на планшете (md:)
  • Расширяется до 3 колонок на десктопе (lg:)
Адаптивный размер Container:
  • containerSize="lg" применяет max-w-7xl с корректировками брейкпоинтов
  • Автоматически добавляет горизонтальный padding на мобильных
  • Центрирует контент с mx="auto"
Изменение размера панелей (DashLayout):

Соображения производительности

Управление ключами элементов: Компонент LayoutBlock требует уникальный id в элементах контента в src/layouts/LayoutBlock.tsx66 для эффективной reconciliation React. Ключи применяются в src/layouts/LayoutBlock.tsx306 Возможности мемоизации: Хуки и рендереры контента оцениваются при каждом рендере. Для дорогих вычислений оберните в useMemo:
Сохранение состояния панели: DashLayout автоматически сохраняет размеры панелей в localStorage через react-resizable-panels, уменьшая сдвиг макета при перезагрузке.

Внешние зависимости

Они перечислены как peer зависимости и должны быть установлены отдельно при использовании макетов. Источники: src/layouts/DashLayout.tsx4 src/layouts/LayoutBlock.tsx366-383 src/layouts/SplitBlock.tsx94-136

Примеры использования

Приложение дашборд

Полный дашборд с навигацией, изменяемыми панелями и контентными секциями:

Маркетинговая целевая страница

Hero секция с разделенным макетом и сеткой функций:

Макет статьи с насыщенным контентом

Макет Stack с кастомными хуками контента для богатого контента:
Источники: README.md36-168 src/layouts/DashLayout.tsx53-96 src/layouts/LayoutBlock.tsx256-389 src/layouts/SplitBlock.tsx67-143