跳转至

18 · 默认主题与外部风格

FlowUI 核心只维护 theme 一套默认设计,支持明暗两种模式。 组件的行为和默认外观都由 widget/ 维护;theme 只提供 全局设计 token。其他设计风格由独立模块提供,应用按需引入。

默认主题

import "github.com/qianniancn/flowui/theme"

启动窗口时显式选择主题:

ui.Run(ui.NewProgram(Model{}, Update, View),
    window.Theme(theme.Light()), // 深色模式用 theme.Dark()
    window.Title("FlowUI"),
    window.Size(900, 640),
)

theme.Light() 和 theme.Dark() 提供默认设计 token,可以直接交给窗口。 theme.New / theme.NewDark 根据种子定制同一套默认外观,也能直接用作窗口主题; 组件包负责从 token 构建默认外观。 组件的默认尺寸、圆角和内部间距由各自的 widget 包维护,通过 .Style(...) 和部件声明覆盖。共享颜色、字体、阴影和动效策略仍由 theme 提供。 运行时在应用的消息处理路径中调用 application.SetTheme("main", theme.Dark()), 由目标窗口的事件循环应用替换。默认明暗切换演示:

go run ./examples/showcase

默认视觉规范

默认主题采用 Indigo 强调色、Slate 灰阶、细边框和柔色选中态, 用表面层次区分区域。普通按钮、输入框和卡片不使用投影;菜单、弹窗等浮层保留柔和阴影。 调色板使用实色表面,不依赖 React 或 CSS。

角色 浅色 深色
窗口背景 #FCFCFD #111113
卡片 / 浮层 #FFFFFF #18191B
字段背景 #FFFFFF #121314
正文 #1C2024 #EDEEF0
强调色 #3E63DD #3E63DD
字段边框 #CDCED6 #43484E

按钮和输入框的小号 / 常规 / 大号高 24 / 32 / 40dp,边框 1dp。 按钮圆角为 3 / 4 / 6dp,卡片为 8dp,对话框为 12dp。 正文字号为 14sp,展示页标题为 17 / 22sp。常规开关为 35×20dp, 白色手柄为 18dp;滑块使用 8dp 轨道和 16dp 白色圆形手柄。 表格常规行高 36dp,下划线标签页高 40dp。列表和表格选中项使用柔和的强调色背景。 带边框字段在悬停时加深描边;聚焦时保持底色并叠加柔和的强调色光晕,不再加粗边框。 Select / ComboBox 的选项面板与 DatePicker 日历使用 1dp 边框和菜单级分层阴影,与表单表面形成明确的浮层关系。

Windows 默认按 Segoe UI, Microsoft YaHei UI, sans-serif 选择界面字体, 为中英文提供匹配的行高,避免通用字体回退导致控件中的文字明显偏上。

默认浅色主题

默认深色主题

浮层效果:浅色对话框、 深色对话框。图片来自 Windows 上真实渲染的展示页, 可在仓库根目录运行 go run ./examples/showcase 后按明暗主题截图更新。

自定义颜色与尺寸

改主色时从种子构造主题,让颜色、状态色与语义角色一起派生:

seed := theme.DefaultSeed()
seed.Primary = color.NRGBA{R: 0x10, G: 0xb9, B: 0x81, A: 0xff}
active := theme.New(seed) // 深色使用 theme.NewDark(seed)
name := input.New("name").Style(style.Style{}.Radius(8))

theme 导入 github.com/qianniancn/flowui/theme,color 来自标准库 image/color; input 和 style 分别导入对应的组件包。 把 active 传给 window.Theme(active)。字体等全局设置可通过选定主题之后的 window.CustomizeTheme 调整;组件尺寸和外观由 widget 实例控制。 需要重新派生配色时修改种子,或通过 UseSemantic 设置完整的语义颜色。

theme.Light() / theme.Dark() 使用默认靛蓝及红、绿、琥珀反馈色。 theme.New(seed) / theme.NewDark(seed) 保留传入的品牌色,并套用相同的表面、尺寸和状态规则; 填充文字会根据底色选择黑色或白色;少数状态色会做轻微调整,以保持文字对比度。 theme.DefaultSeed() 包含默认配色与动效, 因此 theme.New(theme.DefaultSeed()) 与 theme.Light() 一致。

默认外观与验证

每个组件的默认外观和对应测试位于 widget 的组件目录, widget/base 负责不带外观的行为。通过主题 token 调整共享值,通过组件样式 API 覆盖单个实例。新增或修改组件时,应覆盖明暗主题、交互状态和样式覆盖。