主题

浅色以纯白为底,深色以纯黑为底,或跟随系统设置。主题通过一个属性切换,无需深色变体。

主题的工作方式

每种颜色都是一个 CSS 变量,带有浅色值和深色值。当系统偏好深色,或元素带有 data-theme="dark" 时,使用深色值;data-theme="light" 强制使用浅色。组件从不使用 dark: 变体:令牌会自行切换。

选择主题

ThemeProvider 会记住用户的选择(跟随系统、浅色或深色),并在文档上设置 data-theme。ThemeMenu 是对应的控件;useTheme() 用于读取和设置(theme 是所选项,resolvedTheme 是实际显示的主题)。

import { Button, ThemeMenu, useTheme } from "@logicplanes/kaeso-ui";

export function ThemeControl() {
return <ThemeMenu />;
}

export function DarkModeOffer() {
const { resolvedTheme, setTheme } = useTheme();
if (resolvedTheme === "dark") return null;
return <Button onClick={() => setTheme("dark")}>Use dark mode</Button>;
}

使用另一种主题的区域

任何元素都可以切换其子树的主题。在带主题的区域内打开的浮层必须挂载到该区域内,否则会沿用页面的主题;为此请用 PortalContainer 包裹该区域。

import { Button, Menu, PortalContainer } from "@logicplanes/kaeso-ui";

export function DarkPreview() {
return (
  <div data-theme="dark" className="bg-panel text-fg">
    <PortalContainer>
      <Menu>
        <Menu.Trigger>
          <Button>Actions</Button>
        </Menu.Trigger>
        <Menu.Content>
          <Menu.Item>Rename</Menu.Item>
        </Menu.Content>
      </Menu>
    </PortalContainer>
  </div>
);
}

对比度与动效偏好

在 prefers-contrast: more 下,描边环改用更强的线条,次要文字变为主要文字。在 prefers-reduced-motion 下,变换会被移除,只保留透明度过渡。

不可调整的部分

没有可以更换的强调色,也没有可以调节的圆角:设计标识固定在令牌中。需要不同外观的产品应分叉令牌,而不是组件。