组件

Toggle

一个 React 切换按钮,采用 Liquid Glass 选中滑块、可选标签与图标以及五种尺寸。

Toggle 内部渲染玻璃外壳、选中滑块、可选图标与标签,并通过 aria-pressed 暴露按下状态。

适合单个开/关操作。需要一组相关选项时,请使用 ToggleGroup。

基础示例

不传 pressed 时,Toggle 自己维护状态。defaultPressed 设置初始值;点击或按 Space/Enter 都会切换。

受控用法

传入 pressed 与 onPressedChange,由外部状态控制。回调还会收到事件详情。

Not pinned.

尺寸

支持 xs / sm / md / lg / xl,默认 md。高度、内边距、字号和图标尺寸会一起缩放。

纯图标

不传 label 时会渲染方形图标按钮。请使用 aria-label 提供可访问名称。

禁用

disabled 会停止指针与键盘交互,并淡化控件。

无障碍

组件提供 button 角色、aria-pressed、键盘激活与禁用行为。Space 或 Enter 切换当前控件。

存在 label 时,它会参与可访问名称;纯图标 Toggle 需要 aria-label 或 aria-labelledby。命名模式见可访问性指南。

API 参考

属性类型默认值说明
pressedboolean—受控的按下状态。
defaultPressedbooleanfalse非受控时的初始按下状态。
onPressedChange(pressed, details) => void—按下状态变化时调用。
disabledbooleanfalse禁用 Toggle。
valuestring—在 toggle group 内标识该 Toggle。
nativeButtonbooleantrue是否渲染原生 <button>。
renderReactElement | ((props, state) => ReactElement)—替换渲染的元素。
size"xs" | "sm" | "md" | "lg" | "xl""md"控件尺寸。
labelReactNode—渲染在控件内部的可见标签。
iconReactNode—标签前的装饰性图标。
classNamestring—合并到 Toggle 根元素的 Tailwind 类名。
styleCSSProperties—内联样式,合并到与 className 相同的元素。
ui{ root?: ClassValue; glass?: ClassValue; rim?: ClassValue; thumb?: ClassValue; content?: ClassValue; icon?: ClassValue; label?: ClassValue }—按 data-slot 组织的内部槽位类名。
refRef<HTMLButtonElement>—透传到渲染按钮的 ref。
属性说明
data-pressedToggle 按下时存在。
data-disabledToggle 禁用时存在。
data-slot标记内部部件(root、glass、rim、thumb、content、icon、label),用于样式选择。

主题

组件使用共享玻璃材质。可以在父级调整 --ui-glass-* token,用 className 控制布局,并通过 ui 按 data-slot 调整内部槽位。组件级数值位于 src/theme/toggle.ts。Token 分层与预设见主题指南。

相关组件

  • Toggle Group — 多个相关的 Toggle。
  • Button — 不需要保持按下状态的操作。
  • Switch — 立即生效的开关设置。