过去大半年做 Compose Multiplatform 项目的时候,我一直在重复造轮子------表单、弹窗、表格、主题色切来切去。每次开新项目都要拷来拷去,烦了,就干脆抽了一个库出来。
这就是 Palette ,一个给 Compose Multiplatform 用的组件库,一套代码跑 Android、Desktop、iOS 三个平台。
GitHub: github.com/junerver/Pa...
先看一眼长什么样
以下都是实机截图:




有哪些东西
截至目前,大概 60 多个组件,分了五大类:
表单:按钮、复选框、单选框、开关、滑块、评分、输入框、搜索栏、数字输入、OTP 输入、选择器、级联选择、树选择、穿梭框、自动补全、@提及、颜色选择器、分段控制、日历、日期选择器、时间选择器、文件上传......你能想到的表单控件基本都cover了。
反馈:Loading、进度条、徽章、对话框、Toast / Message / Notification(三种消息提示,场景不同)、骨架屏、标签、弹出层、动作面板、右键菜单、警告提示、气泡确认、结果页、无限滚动、水印、悬浮按钮。
导航 :工具栏、固钉、回到顶部、页面头部、抽屉、菜单、标签页、面包屑、步骤条、命令面板(就是 VS Code 那种 Cmd+K)。
布局:行布局、边框容器、卡片、头像、折叠面板、栅格、间距。
数据展示:表格、数据网格、列表、描述列表、统计数值、时间线、树形控件、图片、轮播、分页、空状态、二维码/条形码、虚拟列表。
基本上做一个中后台或者管理端,拿来就能用。
主题系统才是重头戏
组件多不算本事,调样式方便才算。Palette 的主题系统是我花时间最多的地方。
一句代码换主题色
ini
val colors = PaletteColors.light().derive(
primary = Color(0xFF0057D9),
)
PaletteMaterialTheme(colors = colors) {
App()
}
derive() 会自动从你的主色推导出整套语义色(hover、pressed、disabled 等等),不用你一个个去配。暗色模式用 PaletteColors.dark() 同理。
不想每个按钮都调一遍?改全局默认值
大部分组件库的主题只能管颜色。Palette 做到了一级 Token 覆盖组件的所有主要样式面------颜色、圆角、字号、间距、透明度、动效、阴影,哪怕是一个按钮的禁用态透明度,都能在主题层一键改掉:
ini
val components = PaletteComponentThemes.default(colors = colors).let { base ->
base.copy(
button = base.button.copy(disabledAlpha = 0.56f),
card = base.card.copy(cornerRadius = 0.dp, elevation = 0.dp),
)
}
PaletteMaterialTheme(colors = colors, componentThemes = components) {
App()
}
全局改一次,所有实例生效,不用满项目改样式。

和 compose-hooks 搭配更香
Palette 内部已经接入了我的另一个项目 compose-hooks,把 React Hooks 那套状态管理搬到了 Compose:
scss
val (count, setCount) = useState(0)
val (visible, toggle) = useBoolean(false)
写起来比 mutableStateOf 清爽不少。如果你用 Compose Multiplatform,这两个库搭配基本覆盖了 UI 层所有需求。
怎么用
Gradle 加一行:
scss
dependencies {
implementation("xyz.junerver.compose:palette:0.1.0")
}
三行代码跑起来:
ini
PaletteMaterialTheme(darkTheme = false) {
Screen(title = "Hello Palette") {
// 你的内容
}
}
如果觉得默认样式不符合品牌色,参考上面的主题配置,几行代码搞定全局换肤。
支持范围
| 平台 | 版本 |
|---|---|
| Android | minSdk 24 |
| Desktop | JVM |
| iOS | arm64 / simulatorArm64 |
项目还比较早期(0.1.0),在持续迭代中,Star 收藏不迷路。
GitHub: github.com/junerver/Pa...