# Tactile UI 组件库 Tactile UI 是 Planet 内部抽出的可移植 React 控件层。它来自 Admin Next 的按钮、开关、滚动条和 tooltip 收口,但组件本身不依赖 Admin Next、AntD、Radix、Tailwind 或 `an-*` class。目标是先在仓库内稳定使用,后续可以作为独立 npm 包发布。 ## 设计目标 - **轻触感**:默认控件使用白色或主题表面、细边框和外部投影,接近 Docs 主题滑块的轻微立体感,不使用大色块或发光效果。 - **可移植**:组件 class 使用 `tui-*` 前缀,样式集中在 `frontend/src/components/tactile-ui/styles.css`。 - **低依赖**:组件只假设 React/React DOM;图标预设当前使用 `lucide-react`,调用方也可以传自定义 React 节点。 - **主题友好**:默认样式通过 CSS variables 暴露,Planet 可以在 Admin Next 或其它页面按主题覆盖 token。 - **语义清楚**:无歧义操作优先 icon-only + tooltip;保存、确认、创建、执行这类强意图操作可以保留文字。 ## 导入 仓库内使用: ```tsx import { TactileButton, TactileSwitch, ControlGroup } from '@/components/tactile-ui' import '@/components/tactile-ui/styles.css' ``` 未来拆包后建议导入形式: ```tsx import { TactileButton, TactileSwitch } from '@planet/tactile-ui' import '@planet/tactile-ui/styles.css' ``` ## 主题 Token 核心 token 在 CSS 中以 `--tui-*` 暴露。业务主题只需要覆盖变量,不应直接重写组件内部 class。 ```css :root { --tui-surface: #ffffff; --tui-surface-raised-hover: #f8fbff; --tui-border-soft: #d6dfeb; --tui-border-hover: #b8c6d9; --tui-text: #0f172a; --tui-primary: #2563eb; --tui-danger: #dc2626; } [data-theme='dark'] { --tui-surface: #111827; --tui-text: #e5edf8; } ``` 组件还支持通过 `tactile` prop 传入局部尺寸、圆角、背景、边框和阴影参数。局部参数适合少量特殊按钮;全局视觉应优先走 CSS variables。 ## `TactileButton` 按钮组件覆盖普通按钮、图标按钮、强意图按钮和链接式按钮。 常用 props: | Prop | 说明 | | --- | --- | | `variant` | `neutral`、`primary`、`danger`、`subtle`、`ghost` | | `size` | `sm`、`md`、`lg`、`icon` | | `shape` | `square`、`pill` | | `icon` | 预设图标名称或自定义 React 节点 | | `iconOnly` | 图标按钮固定尺寸,并要求提供 `tooltip` 或 `aria-label` | | `tooltip` | 通过 portal 渲染,默认避开光标位置 | | `loading` | 禁用按钮并暴露 `aria-disabled` | | `tactile` | 覆盖宽高、圆角、阴影、背景和深色模式变量 | ```tsx 保存 ``` `variant="neutral"` 的默认按钮是白色触感按钮。彩色按钮仍应保留外部投影和统一高度,不应在业务 CSS 中手写新的阴影体系。 ## 图标预设 预设图标由 `tactileIconPresets` 统一维护,业务页面通过语义名称调用,避免每个页面随意选择图标。 常用语义: | 名称 | 用途 | | --- | --- | | `refresh` | 刷新数据 | | `save` | 保存 | | `delete` | 删除 | | `trigger` / `collect` | 触发采集 | | `start` / `play` | 启动 | | `stop` | 停止 | | `connect` / `test` | 连接或连通性测试 | | `guide` | 凭证教程 | | `generate` | AI 生成 | | `reset` | 恢复默认 | | `detail` | 查看详情 | | `copy` | 复制 | | `upload` | 上传 | 如果预设不足,可以直接传 React 节点: ```tsx