跳到主要内容

设计令牌

设计令牌是承载应用中所有视觉值的语义变量。组件引用它们;主题覆盖它们; 没有什么是硬编码的。

令牌契约

每个令牌都是一个以 --st- 为前缀的 CSS 自定义属性,每个令牌名都是 @neotavern/theme-sdk 中版本化契约的一部分。宿主为浅色和深色模式提供默认值, 因此即使主题没有定义任何令牌,每个令牌也总是可以解析。

规范的令牌组是:

  • 文本颜色 —— color-text-primarycolor-text-secondarycolor-text-mutedcolor-text-inversecolor-text-link
  • 表面 —— color-surface-primarycolor-surface-secondarycolor-surface-tertiarycolor-surface-overlaycolor-surface-canvascolor-surface-elevated
  • 强调和状态 —— color-accentcolor-accent-hovercolor-accent-textcolor-accent-softcolor-accent-soft-textcolor-bordercolor-border-strongcolor-successcolor-warningcolor-dangercolor-info
  • 聊天消息 markdown —— color-message-quotecolor-message-emphasiscolor-message-codecolor-message-code-bg
  • 排版 —— font-uifont-mono、从 font-size-2xsfont-size-2xlline-height-body、从 font-weight-normalfont-weight-bold
  • 间距 —— 从 space-2xsspace-3xl
  • 圆角和边框 —— radius-controlradius-cardradius-overlayradius-panelradius-roundradius-insetborder-width
  • 高度(阴影) —— shadow-cardshadow-softshadow-focusshadow-overlay
  • 层(z-index) —— layer-baselayer-raisedlayer-panellayer-plugin-overlaylayer-plugin-chromelayer-dropdownlayer-modallayer-notification
  • 动效 —— motion-duration-fastmotion-duration-normalmotion-duration-slowmotion-easing-standardeffect-glass-blur
  • 控件大小 —— control-heightcontrol-height-largecontrol-height-smcontrol-height-xscontrol-height-2xscontrol-hit-minswitch-widthswitch-heightswitch-thumb-sizemenu-min-widthdialog-max-widthdialog-max-heighttextarea-min-heightspinner-size
  • 面板和内容大小 —— size-panel-max-heightsize-content-max-heightsize-chat-column-max
  • 视口限制 —— overlay-width-limitoverlay-height-limitdialog-sheet-height
  • 滚动条 —— scrollbar-widthscrollbar-radiusscrollbar-track-bgscrollbar-thumb-bgscrollbar-thumb-hover-bgscrollbar-fade-durationscrollbar-fade-easingscrollbar-hide-delay
  • 应用外壳大小 —— shell-rail-widthshell-panel-widthshell-panel-min-widthshell-panel-max-width
  • 聊天画布 —— chat-wallpaper-imagechat-wallpaper-positionchat-wallpaper-sizechat-wallpaper-overlaychat-wallpaper-blurcustom-wallpaper-overlay-alpha
  • 聊天排版度量 —— chat-markdown-column-widthchat-message-blockchat-message-inline
  • 用户可调旋钮 —— custom-glass-blurcustom-ui-opacity

覆盖令牌

主题覆盖名称的任何子集。值会被校验:它们必须是安全的非空 CSS 值, {}; 等构造会被拒绝。

{
"tokens": {
"dark": {
"color-accent": "#e38a62",
"shadow-card": "0 1px 2px rgba(0, 0, 0, 0.35)"
}
}
}

如果用户选择了聊天背景,应用会在工作区根上设置一个用于壁纸图像的作用域 自定义属性;位置、大小、覆盖和模糊仍然是主题的令牌。

解析规则

令牌按以下顺序解析,后者胜出:

  1. 活动模式的内置默认值。
  2. 父主题链,根在前。
  3. 主题本身。

当没有深色覆盖时,深色模式回退到主题的浅色令牌,因此仅浅色的主题在深色 模式下仍然有效。@neotavern/theme-sdk 中的 resolveTokensbuildThemeVariables 函数实现这一点,宿主把结果作为 CSS 变量写到 document.documentElement 上。

组件不得硬编码的内容

样式契约禁止在内置 UI 的任何地方使用硬编码值,同样的规则也适用于主题 不得依赖的内容:

  • 数字 font-weight、以 px 为单位的 font-size 和原始 border-radius
  • 数字 z-index 值 —— 使用 layer-* 令牌。
  • 40px44px52px32px36px 等控件大小。
  • 主题 CSS 中的 !important,除非在无障碍偏好层中。
  • 布局规则:坐标、网格和 flex 方案、断点和区域顺序不是令牌契约的一部分。 断点来自注册表(VIEWPORT_BREAKPOINTSCONTAINER_BREAKPOINTS), 移动外壳区域不在 v1 范围内。

卡片列表的网格方案等内容几何是一个明确的例外:它不受令牌契约的覆盖。 主题重新样式化所需的一切都可以通过令牌、钩子和声明式外壳布局获得。 生成的主题 SDK 参考记录了精确的 TokenName 列表。