Skip to content

Button 按钮 ​

基础操作按钮。触发即时操作,支持类型、尺寸、加载、禁用、图标与国风花纹底。

契约源:lh-ui-core/specs/button.json · 黄金用例:cases/button.json(8 条,已翻译为 JVM 单测 + Compose UI Test)

类型 ​

六种类型决定底色与文字色。

9:41Button 类型

HTML 模拟预览(Android / Compose 外观),非真机渲染

kotlin
LhButton(type = LhButtonType.Primary, onClick = {}) { Text("主要按钮") }

尺寸 ​

三档尺寸映射到 button.height / paddingHorizontal / fontSize / iconSize 令牌。

9:41Button 尺寸

HTML 模拟预览(Android / Compose 外观),非真机渲染

状态 ​

禁用与加载中都不触发 onClick;两者共存时按禁用优先处理(黄金用例 disabled-precedes-loading)。

9:41Button 状态

HTML 模拟预览(Android / Compose 外观),非真机渲染

图标与花纹底 ​

图标名按本地图标体系解析(LhButtonIcons,当前支持 search / refresh / check / close,未登记名不绘制)。 花纹底消费 color.decoration 令牌,叠在底色之上、文字之下,不影响对比度。

9:41图标与花纹

HTML 模拟预览(Android / Compose 外观),非真机渲染

明暗主题 ​

切换站点右上角主题,模拟器手机框内的按钮颜色即变;真机通过 LhTheme(isDark = true) 切换。

9:41暗色按钮

HTML 模拟预览(Android / Compose 外观),非真机渲染;明/暗值全部取自 core 令牌快照

API ​

Props ​

属性说明类型默认值
onClick点击回调;disabled 或 loading 为 true 时不触发() -> Unit—
modifier修饰符ModifierModifier
type按钮类型,决定底色与文字色LhButtonTypeDefault
size按钮尺寸,映射到尺寸令牌LhButtonSizeMedium
disabled是否禁用Booleanfalse
loading是否加载中(显示指示器,不触发 onClick)Booleanfalse
icon图标名(本地图标体系解析)String?null
bgPattern是否绘制国风花纹底纹Booleanfalse
content按钮文字内容(spec 的 default 插槽)@Composable () -> Unit—

LhButtonType ​

值底色文字色
Defaultcolor.background.defaultcolor.text.primary
Primarycolor.primary.defaultcolor.onPrimary
Successcolor.success.defaultcolor.onPrimary
Warningcolor.warning.defaultcolor.onPrimary
Dangercolor.danger.defaultcolor.onPrimary
Infocolor.info.defaultcolor.onPrimary

LhButtonSize ​

值heightpaddingHorizontalfontSizeiconSize
Smallbutton.height.small(32dp)button.paddingHorizontal.small(16dp)button.fontSize.small(13sp)button.iconSize.small(16dp)
Mediumbutton.height.medium(40dp)button.paddingHorizontal.medium(20dp)button.fontSize.medium(14sp)button.iconSize.medium(18dp)
Largebutton.height.large(48dp)button.paddingHorizontal.large(24dp)button.fontSize.large(16sp)button.iconSize.large(20dp)

禁用态覆盖:底色 color.disabled.bg、文字 color.disabled.text、描边 color.disabled.border。

令牌对照 ​

按钮消费的令牌(与 specs/button.json 的 tokenRefs 逐条对齐):

令牌用途
button.height.{small,medium,large}三档高度
button.paddingHorizontal.{small,medium,large}三档横向内边距
button.fontSize.{small,medium,large}三档字号
button.iconSize.{small,medium,large}三档图标尺寸
button.borderRadius / button.borderWidth圆角(跟随 radius.base)与描边宽度
button.fontWeight字重(跟随 typography.fontWeight.primary)
color.primary.default / color.onPrimary主色类型底/文字
color.{success,warning,danger,info}.default语义类型底色
color.background.default / color.text.primary / color.border.base默认类型底/文字/描边
color.disabled.{bg,text,border}禁用态三色
color.decoration花纹底纹色
shadow.lighter默认类型 elevation
motion.duration.fast / motion.easing.easeInOut按压反馈动效

黄金用例对照 ​

cases/button.json 的 8 条断言与本地测试的对应关系:

case id断言本地测试
click-emits-onclick点击触发 onClick ×1LhButtonTest.click_emits_onClick(Compose UI Test)
disabled-blocks-click禁用态不触发LhButtonTest.disabled_blocks_click
loading-blocks-click加载态不触发LhButtonTest.loading_blocks_click
disabled-precedes-loading禁用优先LhButtonTest.disabled_precedes_loading_blocks_click + LhButtonDefaultsTest.disabled_precedes_loading
default-type-renders-text默认类型渲染文字LhButtonDefaultsTest.default_type_uses_neutral_tokens
primary-type-uses-primary-tokens主色类型消费主色令牌LhButtonDefaultsTest.primary_type_uses_primary_tokens
small-size-uses-small-tokens小号消费 small 尺寸令牌LhButtonDefaultsTest.small_size_uses_small_tokens
bgpattern-uses-decoration-token花纹底消费装饰色LhButtonDefaultsTest.bgPattern_uses_decoration_token
icon-renders-icon-command已登记图标名渲染矢量;未登记名不绘制LhButtonDefaultsTest.icon_renders_registered_vector + unknown_icon_name_resolves_to_null
bash
./gradlew :components:button:test                        # JVM 部分
./gradlew :components:button:connectedAndroidTest        # 交互部分(需设备)