One UI

主题定制

One UI 始终包含不可覆盖的内置 default 主题。oneTheme.init() 可以注册多套全局主题,每套自定义主题都会按 colors、typography、border 和 radius 分组,从内置 default 深度继承未填写的字段。

初始化多套主题

import { OneButton, oneTheme } from '@geektech/one';

oneTheme.init({
  defaultTheme: 'brand',
  themes: {
    brand: {
      colors: { primary: '#326bff', primaryHover: '#2457dc' },
      typography: { fontFamily: 'Inter, sans-serif', lineHeight: '1.6' },
      border: { color: '#cbd5e1', width: '1px', style: 'solid' },
      radius: { sm: '4px', md: '8px', lg: '12px' },
    },
    night: {
      colors: { surface: '#101510', text: '#f4f8f4', muted: '#a8b3aa' },
    },
  },
});

const defaultButton = new OneButton({ children: ['默认主题'] });
const nightButton = new OneButton({ children: ['夜间主题'] });
defaultButton.on('click', () => oneTheme.switch('default'));
nightButton.on('click', () => oneTheme.switch('night'));
console.log(oneTheme.currentTheme);

初始化会立即应用 defaultTheme;再次调用 init() 会替换此前注册的自定义主题。oneTheme.switch() 只接受已注册名称,并在成功写入全部变量后更新 currentTheme。

作用域、错误与持久化

主题服务只作用于全局 document.documentElement,不提供局部主题容器。配置字段、名称或 CSS 值无效时抛出 OneThemeConfigError;切换到未知名称时抛出 OneThemeNotFoundError;没有浏览器根节点时抛出 OneThemeEnvironmentError。失败操作不会改变当前主题。

读取 CSS 回退值

原有的扁平 ONE_THEME_DEFAULTS 仍用于读取组件 CSS 的默认回退值;嵌套的 ONE_DEFAULT_THEME 则描述完整内置主题。

import { ONE_THEME_DEFAULTS } from '@geektech/one';

const primaryColor = ONE_THEME_DEFAULTS.colorPrimary;
const cardRadius = ONE_THEME_DEFAULTS.radiusMd;

主题 token

One UI 运行时 CSS 变量
名称签名说明
--one-color-primaryFallback: #5fd956主按钮默认背景色。
--one-color-primary-hoverFallback: #4bc944主按钮 hover 背景色。
--one-color-primary-contrastFallback: #162018主按钮文本对比色;默认与两种主色背景均满足 WCAG AA。
--one-color-secondaryFallback: #ffffff次按钮默认背景色。
--one-color-secondary-hoverFallback: #d9e8d6次按钮 hover 背景色。
--one-color-secondary-contrastFallback: #162018次按钮文本对比色。
--one-color-dangerFallback: #b83232危险按钮与无效输入框的默认强调色。
--one-color-danger-hoverFallback: #9f2d2d危险按钮 hover 背景色。
--one-color-danger-contrastFallback: #ffffff危险按钮文本对比色;默认与两种危险背景均满足 WCAG AA。
--one-color-surfaceFallback: #ffffff输入框、卡片与次按钮使用的基础表面色。
--one-color-textFallback: #162018组件主要文本色。
--one-color-borderFallback: #d9e8d6输入框与卡片使用的基础边框色。
--one-color-focusFallback: #2f7c39按钮与输入框的键盘焦点色。
--one-radius-mdFallback: 8px按钮和输入框的默认圆角。
--one-radius-lgFallback: 8px卡片与 Dialog 等大型表面的圆角。
--one-space-smFallback: 8px按钮 gap 的共享间距 fallback。
--one-space-lgFallback: 16px卡片区域 padding 的共享间距 fallback。
--one-font-size-smFallback: 12px小尺寸按钮和输入框的字号。
--one-font-size-mdFallback: 14px中尺寸按钮和输入框的字号。
--one-font-size-lgFallback: 16px大尺寸按钮和输入框的字号。
--one-font-familyFallback: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif全部 One UI 组件使用的字体栈。
--one-line-heightFallback: 1.5全部 One UI 组件使用的基础行高。
--one-border-widthFallback: 1px普通组件边框与分隔线使用的全局宽度。
--one-border-styleFallback: solid普通组件边框与分隔线使用的全局样式。
--one-shadow-cardFallback: 0 12px 30px rgba(32, 74, 38, 0.1)卡片阴影的共享 fallback。
--one-color-infoFallback: #2563eb信息反馈的强调色。
--one-color-successFallback: #2f7c39成功反馈的强调色。
--one-color-warningFallback: #9a6700警告反馈的强调色。
--one-color-overlayFallback: rgba(22, 32, 24, 0.48)Dialog 遮罩背景色。
--one-color-mutedFallback: #647268反馈组件的次要文本色。
--one-radius-smFallback: 4pxTooltip 的紧凑圆角。
--one-space-xsFallback: 4px反馈内容的最小共享间距。
--one-space-mdFallback: 12pxAlert 与 Message 的中等共享间距。
--one-shadow-overlayFallback: 0 18px 48px rgba(22, 32, 24, 0.2)Message、Dialog 与 Tooltip 的浮层阴影。
--one-z-index-dialogFallback: 1000Dialog 默认层级。
--one-z-index-messageFallback: 1100Message 默认层级。
--one-z-index-tooltipFallback: 1200Tooltip 默认层级。
--one-alert-gapFallback: var(--one-space-sm, 8px)Alert 图标、正文和操作之间的间距。
--one-alert-paddingFallback: var(--one-space-md, 12px)Alert 内边距。
--one-alert-colorFallback: var(--one-color-text, #162018)Alert 主要文本色。
--one-alert-backgroundFallback: var(--one-color-surface, #ffffff)Alert 背景色。
--one-alert-border-colorFallback: var(--one-color-border, #d9e8d6)Alert 默认边框色。
--one-alert-radiusFallback: var(--one-radius-md, 8px)Alert 圆角。
--one-tooltip-backgroundFallback: var(--one-color-text, #162018)Tooltip 气泡背景色。
--one-tooltip-arrow-xFallback: 50%Tooltip 垂直方向气泡的箭头横坐标。
--one-tooltip-arrow-yFallback: 50%Tooltip 水平方向气泡的箭头纵坐标。
--one-button-gapFallback: var(--one-space-sm, 8px)按钮图标、spinner 与文本之间的组件级 gap override。
--one-button-padding-smFallback: 4px 12px小尺寸按钮的组件级 padding override。
--one-button-padding-mdFallback: 8px 16px中尺寸按钮的组件级 padding override。
--one-button-padding-lgFallback: 12px 16px大尺寸按钮的组件级 padding override。
--one-input-colorFallback: var(--one-color-text, #162018)输入框文本色的组件级 override。
--one-input-backgroundFallback: var(--one-color-surface, #ffffff)输入框默认背景色的组件级 override。
--one-input-border-colorFallback: var(--one-color-border, #d9e8d6)输入框默认边框色的组件级 override。
--one-input-disabled-backgroundFallback: var(--one-color-surface, #ffffff)禁用输入框背景色的组件级 override。
--one-input-focus-border-colorFallback: var(--one-color-focus, #2f7c39)输入框获得键盘焦点时的边框色 override。
--one-input-padding-smFallback: 4px 8px小尺寸输入框的组件级 padding override。
--one-input-padding-mdFallback: 8px 12px中尺寸输入框的组件级 padding override。
--one-input-padding-lgFallback: 12px 16px大尺寸输入框的组件级 padding override。
--one-card-colorFallback: var(--one-color-text, #162018)卡片文本色的组件级 override。
--one-card-backgroundFallback: var(--one-color-surface, #ffffff)卡片背景色的组件级 override。
--one-card-border-colorFallback: var(--one-color-border, #d9e8d6)卡片外框及 header/footer 分隔线的组件级 override。
--one-card-radiusFallback: var(--one-radius-lg, 8px)卡片圆角的组件级 override。
--one-card-shadowFallback: var(--one-shadow-card, 0 12px 30px rgba(32, 74, 38, 0.1))卡片阴影的组件级 override。
--one-card-header-paddingFallback: var(--one-space-lg, 16px)卡片 header 区域的组件级 padding override。
--one-card-body-paddingFallback: var(--one-space-lg, 16px)卡片 body 区域的组件级 padding override。
--one-card-footer-paddingFallback: var(--one-space-lg, 16px)卡片 footer 区域的组件级 padding override。

全局 CSS 变量覆盖

:root {
  --one-color-primary: #326bff;
  --one-radius-md: 12px;
}

局部 CSS 变量覆盖

这只是现有 CSS 变量覆盖能力,不会创建可由 oneTheme 管理或切换的局部主题。

.checkout-panel {
  --one-color-primary: #7c3aed;
  --one-shadow-card: none;
}