跳到主要内容

主题层级

一个主题由三个独立的层级构建。理解这种划分,才能让主题在不触碰行为的情况下 改变整个应用的外观。

第 1 层:设计令牌

令牌是以 --st- 为前缀的语义 CSS 自定义属性。它们涵盖颜色、排版、间距、 圆角、边框、阴影、z-index 层、动效、控件大小、滚动条和聊天画布。

组件只引用令牌 —— 它们绝不会硬编码颜色、字体或间距值。在主题清单中覆盖 一个令牌会重新样式化使用它的每个组件:

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

令牌通过一个继承链解析:该模式的内置默认值,然后是父主题, 然后是主题本身。当没有深色覆盖时,深色模式回退到主题的浅色令牌。 完整契约请参阅设计令牌

第 2 层:组件皮肤

组件皮肤是通过稳定钩子重新样式化内置组件的 CSS。宿主发布 data-componentdata-partdata-roledata-state 属性; 主题样式化这些属性,绝不样式化生成的 CSS-module 类名:

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

皮肤通过级联层以固定顺序应用,用户覆盖层最后。除无障碍偏好层外, 主题 CSS 中禁止使用 !important。层顺序和钩子参考请参阅 组件皮肤

第 3 层:外壳布局

外壳布局是主要区域的组合:导航栏、管理面板和聊天工作区。它是声明式的, 在 theme.json 中表达 —— 绝不在 JavaScript 中:

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

有效的导航栏项目是 chatscharacterspersonaslorebooksbackgroundsai-settingspluginssettings 和可选的 menu-togglemain 组从顶部开始排列;bottom 固定在下边缘。你省略的 项目会按标准顺序被添加回来,因此主题无法意外隐藏"设置"并把用户锁在 恢复之外。

模仿其他界面

由于层级是不相交的,主题可以模仿一个完全不同的界面范式:

  • 控制台风格的主题改变令牌和皮肤,让导航栏、面板和按钮看起来像游戏界面。
  • 视觉小说主题重新样式化聊天视口、消息和角色头部,而聊天逻辑保持原样。
  • 移动应用主题使用声明式外壳布局重新排列导航栏和面板。

这些都不需要触碰聊天逻辑、数据或插件行为 —— 这正是主题表面可以整体替换 的原因。v1 不提供的一件事是外壳区域的自由形式重排;槽位可以被样式化和 填充,但不能移动。范围内的内容请参阅外壳契约