• 简体中文
  • 定制主题

    通过 ConfigProvider 设置组件的主题。通常只需调整主题色、基础圆角和控件高度,其余样式会自动配合。

    从几个设置开始

    在应用最外层放置 ConfigProvider,并引入一次组件样式:

    import { Button, ConfigProvider, Input } from '@sudden3/leaf-ui';
    import '@sudden3/leaf-ui/styles.css';
    
    export function App() {
      return (
        <ConfigProvider theme={{
          primaryColor: '#7654c6',
          borderRadius: 8,
          controlHeight: 34,
        }}>
          <Input aria-label="项目名称" placeholder="项目名称" />
          <Button>保存</Button>
        </ConfigProvider>
      );
    }

    未传入的选项使用默认值。悬停、按下、浅色背景和焦点颜色会跟随主题色,不需要分别配置。

    试试你的风格

    调整颜色、圆角、高度和外观,预览会立即更新。复制生成的 ConfigProvider 代码即可应用到自己的页面。

    LIVE PREVIEW实时预览
    LESS, BUT BETTER

    一点绿意,很多可能。

    从小小的交互开始,构建属于你的界面。

    Solid
    Soft
    Outline
    Ghost

    你的风格,你来定义

    几个设置,就能长成你喜欢的样子。

    主题色Primary color
    利落圆润
    外观Appearance
    紧凑宽松
    theme.tsx
    import { Button, ConfigProvider } from '@sudden3/leaf-ui';
    
    <ConfigProvider theme={{
      primaryColor: '#20834a',
      borderRadius: 10,
      controlHeight: 34,
      appearance: 'light',
    }}>
      <Button>保存</Button>
    </ConfigProvider>

    自动生成大小尺寸

    默认基础圆角为 10px,单行控件高度为 34px,字号为 14px。修改基础值后,其他尺寸会同步调整:

    基础设置自动生成的值默认结果
    borderRadius小圆角为基础值的 0.6 倍,大圆角为 1.6 倍6px / 16px
    controlHeight小尺寸减 6px,大尺寸加 6px28px / 40px
    fontSize小字号减 2px,大字号加 2px12px / 16px

    数字表示像素,也可以传入带单位的 CSS 长度。按钮、输入框和选择器共用这套尺寸,放在一起时保持一致。

    局部主题与嵌套

    ConfigProvider 可以包裹整个应用,也可以只包裹一个区域。内层只覆盖明确设置的选项:

    <ConfigProvider theme={{ primaryColor: '#20834a', controlHeight: 36 }}>
      <Button>默认区域</Button>
      <ConfigProvider theme={{ primaryColor: '#7654c6', borderRadius: 16 }}>
        <Button>活动区域</Button>
      </ConfigProvider>
    </ConfigProvider>

    浮层、Modal 和区域内的 message / confirm contextHolder 会继承相同的主题。语言通过 ConfigProvider 的 locale 单独设置。

    深色外观与动态切换

    使用 appearance 切换浅色与深色;主题是普通 React 属性,可以用状态动态更新:

    import { useState } from 'react';
    import { Button, ConfigProvider } from '@sudden3/leaf-ui';
    
    export function ThemeSwitch() {
      const [dark, setDark] = useState(false);
      return (
        <ConfigProvider theme={{ appearance: dark ? 'dark' : 'light' }}>
          <Button onClick={() => setDark(!dark)}>切换外观</Button>
        </ConfigProvider>
      );
    }

    深色外观会提供适合深色表面的文字、边框和状态色。显式设置的主题色保留原值;很浅的品牌色可以在高级配置中搭配 onPrimaryColor。

    有特殊需求时再覆盖

    theme.tokens 可以单独调整自动生成的尺寸、语义色、表面色、文字色、动效或浮层层级:

    import type { LeafTheme } from '@sudden3/leaf-ui';
    
    const theme: LeafTheme = {
      controlHeight: 36,
      borderRadius: 8,
      tokens: {
        controlHeightSm: 28,
        borderRadiusLg: 18,
        infoColor: '#1677ff',
        motionDuration: 200,
      },
    };

    手动设置的小 / 大尺寸优先于自动生成的值。嵌套配置按字段合并,包括 tokens;未覆盖的配置继续继承。完整选项见 LeafThemeTokens。

    motion: false 关闭过渡并暂停加载图标的旋转。系统的“减少动态效果”偏好仍会生效。

    在自己的组件中复用样式

    CSS 变量用于读取当前区域的主题,方便自己编写的组件与 Leaf UI 保持一致。调整库组件的主题时使用 ConfigProvider;在业务 CSS 中通过 var() 消费这些变量:

    <ConfigProvider theme={{ primaryColor: '#7654c6', borderRadius: 8 }}>
      <button className="product-button" type="button">自己的按钮</button>
      <Button>Leaf UI 按钮</Button>
    </ConfigProvider>
    .product-button {
      min-height: var(--leaf-control-height);
      padding: 0 14px;
      border: 0;
      border-radius: var(--leaf-radius);
      background: var(--leaf-color-primary);
      color: var(--leaf-color-on-primary);
      font-family: var(--leaf-font-family);
      font-size: var(--leaf-font-size);
      font-weight: var(--leaf-font-weight);
      cursor: pointer;
    }
    可读取的变量用途
    --leaf-color-primary / --leaf-color-on-primary主题背景与其上的文字
    --leaf-color-danger / --leaf-color-success / --leaf-color-warning / --leaf-color-info语义状态色
    --leaf-color-text / --leaf-color-text-muted主要 / 次要文字
    --leaf-color-surface / --leaf-color-surface-muted / --leaf-color-border表面与边框
    --leaf-radius / --leaf-radius-sm / --leaf-radius-lg基础 / 小 / 大圆角
    --leaf-control-height / --leaf-control-height-sm / --leaf-control-height-lg基础 / 小 / 大控件高度
    --leaf-font-family / --leaf-font-size / --leaf-font-weight字体、字号与字重
    --leaf-motion-duration / --leaf-motion-easing状态过渡

    业务组件需要位于相应的 ConfigProvider 区域内,才能读取该区域的主题。使用者只需引入编译好的 styles.css,无需安装 Sass。

    服务端渲染

    静态 CSS 与动态主题可以一起使用,不需要运行时生成 CSS。Next.js 与其他 SSR 框架的接入方法见 SSR 使用。