主题
每一种颜色、圆角、间距与阴影都来自 Token。选择一个基础灰阶、一个强调色和圆角,所有组件(包括原生 ArkUI 组件)都会实时更新。
预设与强调色
内置预设与 shadcn v4 的基础色一致:neutral(默认)、zinc、slate、stone、gray;强调色叠加在预设之上,只改变 primary / ring / sidebar-primary:blue、green、orange、red、rose、violet、yellow。
SparkUI.themes.usePreset('zinc'); // 基础灰阶(保留强调色与覆盖项,如圆角)
SparkUI.themes.useAccent('violet'); // 强调色;'none' = shadcn 默认的单色
SparkUI.themes.setMode('dark'); // 'light' | 'dark' | 'system'
SparkUI.themes.toggleDark();
SparkUI.themes.setVariable('--radius', '0.75rem');在网页预览中试试(下面的选择器作用于本站所有预览,数值由 Presets.ets 自动生成):
网页近似预览,真机效果以 HarmonyOS 渲染为准。
基础灰阶只会微调中性色(背景、边框、弱化文字)的色相——和 shadcn 一样克制;强调色改变 primary 与 ring。
加载 shadcn / tweakcn 主题
SparkUI 的主题文件就是 CSS 的一个子集::root {}、.dark {}、@size(compact|medium|expanded|large) {}、--var: value; 与注释。shadcn / tweakcn 的导出可以原样粘贴:@theme、@layer、@import、@custom-variant、其他选择器与非自定义属性会被识别并以 info 诊断跳过。oklch、hsl、rgb、hex 会被精确换算。
:root {
--radius: 0.5rem;
--primary: oklch(0.546 0.245 262.881);
--primary-foreground: oklch(0.97 0.014 254.604);
}
.dark {
--primary: oklch(0.623 0.214 259.815);
}
@size(compact) {
:root { --radius: 0.375rem; }
}const r1 = SparkUI.themes.loadString(cssText); // CSS 子集或 JSON(自动识别)
const r2 = SparkUI.themes.loadRawfile('themes/brand.css'); // resources/rawfile 下的文件
const r3 = SparkUI.themes.loadFile(sandboxPath);
const r4 = await SparkUI.themes.loadUrl('https://…/theme.css'); // 需要 ohos.permission.INTERNET
if (!r1.ok) {
r1.diagnostics.forEach((d: ThemeDiagnostic) => console.warn(d.message));
}
SparkUI.themes.exportCss(); // 当前生效的主题(预设 + 覆盖项)加载永不抛异常:缺失或非法的 Token 回退到所叠加的预设,问题以诊断(error / warning / info)返回。
状态色与组件 Token
- 状态色是真正的语义 Token:
--success、--warning、--info及其-foreground。 - 全局旋钮
--border-width控制所有带边框组件的边框粗细。 - 组件 Token 形如
--<component>-<property>:--card-background、--button-radius、--button-outline-background、--button-height-sm……未设置时组件使用自身的 shadcn 配方。 - 单个实例用
tokens参数覆盖:
网页近似预览,真机效果以 HarmonyOS 渲染为准。
- 全局设置时与其它变量一样(
setVariable,或用loadString加载theme.css)。状态徽章与提示读取语义状态色 Token:
网页近似预览,真机效果以 HarmonyOS 渲染为准。
原生组件
SparkProvider 会把 Token 同步到系统主题(WithTheme / ThemeControl),因此原生 Toggle、TextInput 等也会跟随强调色与明暗模式。