Перейти к основному содержимому

Уровни тем

Тема построена из трёх независимых уровней. Понимание разделения позволяет теме менять вид всего приложения, не затрагивая его поведение.

Уровень 1: дизайн-токены

Токены — это семантические CSS-кастомные свойства с префиксом --st-. Они покрывают цвета, типографику, отступы, радиусы, границы, тени, слои z-index, анимации, размеры элементов управления, скроллбары и холст чата.

Компоненты ссылаются только на токены — они никогда не захардкоживают цвет, шрифт или значение отступа. Переопределение токена в манифесте темы перестилизует каждый использующий его компонент:

{
"tokens": {
"dark": {
"color-accent": "#ff00aa",
"font-ui": "'Atkinson Hyperlegible', system-ui, sans-serif"
}
}
}

Токены разрешаются через цепочку наследования: встроенные значения по умолчанию для режима, затем родительские темы, затем сама тема. Тёмный режим переключается на светлые токены темы, когда тёмного оверрайда нет. Полный контракт см. в Дизайн-токены.

Уровень 2: скин компонентов

Скин компонентов — это CSS, перестилизующий встроенные компоненты через стабильные хуки. Хост публикует атрибуты data-component, data-part, data-role и data-state; тема стилизует эти атрибуты, а не генерируемые имена классов CSS-modules:

@layer theme {
[data-component='button'][data-variant='primary'] {
background: var(--st-color-accent);
}
}

Скин применяется через каскадные слои в фиксированном порядке, при этом слой пользовательских оверрайдов последний. !important запрещён в CSS темы, кроме слоя предпочтений доступности. О порядке слоёв и справочнике хуков см. Скин компонентов.

Уровень 3: макет оболочки

Макет оболочки — это композиция основных областей: навигационной панели, панелей управления и рабочего пространства чата. Он декларативен и выражается в theme.json — никогда в JavaScript:

{
"shellLayout": {
"navigationRail": {
"main": [
"menu-toggle",
"chats",
"characters",
"personas",
"lorebooks",
"backgrounds",
"ai-settings",
"plugins"
],
"bottom": ["settings"]
}
}
}

Допустимые элементы панели: chats, characters, personas, lorebooks, backgrounds, ai-settings, plugins, settings и необязательный menu-toggle. Группа main течёт сверху; bottom закреплена у нижнего края. Пропущенные элементы добавляются обратно в стандартном порядке, поэтому тема не может случайно скрыть Settings и заблокировать пользователю восстановление.

Имитация других интерфейсов

Поскольку уровни независимы, тема может имитировать совершенно другую парадигму интерфейса:

  • Консольная тема меняет токены и скины, делая панель, панели и кнопки похожими на игровой UI.
  • Тема визуальной новеллы перестилизует область просмотра чата, сообщения и заголовок персонажа, пока логика чата остаётся нетронутой.
  • Тема мобильного приложения использует декларативный макет оболочки, чтобы переупорядочить панель и панели.

Ни для одного из них не нужно трогать логику чата, данные или поведение плагинов — именно поэтому поверхность темы можно заменять целиком. Единственное, чего не предоставляет v1, — свободная перестановка областей оболочки: слоты стилизуются и заполняются, а не перемещаются. О том, что входит в область действия, см. Контракт оболочки.