18 · 默认主题与外部风格¶
FlowUI 核心只维护 theme 一套默认设计,支持明暗两种模式。
组件的行为和默认外观都由 widget/ 维护;theme 只提供
全局设计 token。其他设计风格由独立模块提供,应用按需引入。
默认主题¶
启动窗口时显式选择主题:
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()),
由目标窗口的事件循环应用替换。默认明暗切换演示:
默认视觉规范¶
默认主题采用 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
覆盖单个实例。新增或修改组件时,应覆盖明暗主题、交互状态和样式覆盖。