Архитектура UI-кита
Архитектура UI-кита (@lowcode/ui-kit)
Как устроена библиотека компонентов: тема, примитивы, layout-блоки и их роль в редакторе.
🎯 Задача страницы
Эта страница описывает архитектуру пакета @lowcode/ui-kit:
- какую роль он играет в общей системе;
- как устроены слои темы, примитивов и layout-компонентов;
- как используется Tailwind CSS;
- как UI-кит интегрируется в
builder-web; - где искать код и как добавлять новые компоненты.
1. Роль @lowcode/ui-kit в общей архитектуре
@lowcode/ui-kit — это общая библиотека React-компонентов для всей платформы:
- задаёт визуальный стиль редактора (
builder-web) и других UI-частей; - предоставляет темизацию (light/dark) через
ThemeProvider; - содержит набор примитивов (
Button,Input,Select, и т.п.); - предоставляет layout-компоненты для построения каркаса редактора
(
AppShell,Sidebar,PropsPanel,CanvasContainer,PreviewContainer); - не содержит бизнес-логики и ничего не знает про DSL / проекты / API.
Высокоуровневая схема взаимодействия:
graph TD
subgraph UI
BW[builder-web]
RH[runtime-host UI]
end
subgraph UIKIT[@lowcode/ui-kit]
THEME[ThemeProvider<br/>+ токены тем]
PRIM[Примитивы<br/>(Button, Input, ...)]
LAYOUT[Layout-компоненты<br/>(AppShell, Sidebar, ...)]
end
BW --> UIKIT
RH --> UIKIT
UIKIT --> THEME
UIKIT --> PRIM
UIKIT --> LAYOUT
Все компоненты builder-web строятся поверх @lowcode/ui-kit, а не реализуют стили самостоятельно.
2. Общая структура пакета
Высокоуровневая структура packages/ui-kit:
packages/ui-kit/
src/
index.ts ← публичный API пакета
theme/ ← система темы (light/dark)
ThemeTypes.ts
tokens.ts
ThemeProvider.tsx
components/
primitives/ ← базовые контролы
Button.tsx
Input.tsx
Textarea.tsx
Checkbox.tsx
Switch.tsx
Select.tsx
Badge.tsx
Spinner.tsx
layout/ ← layout- и editor-паттерны
AppShell.tsx
AppHeader.tsx
Sidebar.tsx
PropsPanel.tsx
Panel.tsx
Card.tsx
ScrollArea.tsx
CanvasContainer.tsx
PreviewContainer.tsx
styles/
base.css ← слой Tailwind (base/components/utilities)
utils/
cn.ts ← helper для склейки классов
- Все публичные сущности реэкспортируются из
src/index.ts. - Типы и функции, попадающие в документацию typedoc, задокументированы через JSDoc/Typedoc-комментарии на русском.
Основные точки входа в reference-документации:
- общий обзор пакета —
@lowcode/ui-kit; - модуль темы —
theme; - примитивы —
components/primitives; - layout —
components/layout.
3. Система тем и ThemeProvider
3.1. Типы и токены темы
Базовые типы и набор токенов описаны в:
ThemeName— имя темы ("light" | "dark");ThemeTokens— семантические цветовые токены для одной темы;lightTheme,darkTheme,DEFAULT_THEME_NAME— экспортируются изtokens.ts.
Архитектурно тема описывается семантическими цветами (background, surface, text, primary, danger и т.п.), а не “сырыми” токенами Tailwind.
3.2. ThemeProvider и жизненный цикл темы
Компонент ThemeProvider:
-
хранит текущую тему в React-состоянии;
-
при инициализации читает выбранную тему из
localStorage; -
синхронизирует изменения темы обратно в
localStorage; -
выставляет:
- атрибут
data-theme="light" | "dark"на корневойdiv, - класс
darkпри активной тёмной теме;
- атрибут
-
через это Tailwind получает возможность применять
dark:-классы.
Хук useTheme предоставляет интерфейс:
themeName: ThemeName— текущее имя темы;theme: ThemeTokens— объект токенов темы;setTheme(name: ThemeName)— установка конкретной темы;toggleTheme()— переключение между light/dark.
Использование:
<ThemeProvider>
<App />
</ThemeProvider>
4. Примитивы
Примитивы UI-кита описаны в модуле components/primitives.
Сюда входят:
Все они используют Tailwind-классы и полностью совместимы с темизацией.
5. Layout-компоненты
components/layout содержит компоненты каркаса редактора:
Эти компоненты образуют каркас для builder-web, но остаются независимыми от DSL.
6. Tailwind и сборка CSS
ui-kit не компилирует Tailwind сам. Он лишь поставляет:
-
src/styles/base.cssс:@tailwind base;
@tailwind components;
@tailwind utilities; -
React-компоненты, использующие Tailwind-классы.
Генерацию CSS выполняет host-приложение (builder-web).
Tailwind в builder-web видит классы UI-кита благодаря настройке:
content: ['./src/**/*.{ts,tsx}', '../../packages/ui-kit/src/**/*.{ts,tsx}'];
Это позволяет ui-kit оставаться полностью headless и переиспользуемым.
7. Где искать ключевые части кода
| Компонент / слой | Путь | Reference-документация |