@teamix-evo/ui 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/README.md +184 -184
  2. package/manifest.json +680 -492
  3. package/package.json +20 -10
  4. package/src/components/accordion/accordion.meta.md +5 -4
  5. package/src/components/accordion/accordion.stories.tsx +14 -9
  6. package/src/components/accordion/accordion.tsx +104 -8
  7. package/src/components/affix/affix.meta.md +20 -2
  8. package/src/components/affix/affix.stories.tsx +102 -25
  9. package/src/components/affix/affix.tsx +79 -9
  10. package/src/components/alert/alert.meta.md +44 -13
  11. package/src/components/alert/alert.stories.tsx +66 -21
  12. package/src/components/alert/alert.tsx +81 -34
  13. package/src/components/alert-dialog/alert-dialog.meta.md +61 -16
  14. package/src/components/alert-dialog/alert-dialog.stories.tsx +145 -3
  15. package/src/components/alert-dialog/alert-dialog.tsx +60 -13
  16. package/src/components/anchor/anchor.meta.md +8 -3
  17. package/src/components/anchor/anchor.stories.tsx +3 -3
  18. package/src/components/anchor/anchor.tsx +2 -2
  19. package/src/components/app/app.meta.md +9 -4
  20. package/src/components/app/app.stories.tsx +9 -7
  21. package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -3
  22. package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
  23. package/src/components/auto-complete/auto-complete.meta.md +14 -6
  24. package/src/components/auto-complete/auto-complete.stories.tsx +47 -4
  25. package/src/components/auto-complete/auto-complete.tsx +119 -71
  26. package/src/components/avatar/avatar.meta.md +6 -7
  27. package/src/components/avatar/avatar.stories.tsx +21 -3
  28. package/src/components/avatar/avatar.tsx +24 -23
  29. package/src/components/badge/badge.meta.md +10 -9
  30. package/src/components/badge/badge.stories.tsx +2 -2
  31. package/src/components/badge/badge.tsx +9 -15
  32. package/src/components/breadcrumb/breadcrumb.meta.md +27 -7
  33. package/src/components/breadcrumb/breadcrumb.stories.tsx +127 -4
  34. package/src/components/breadcrumb/breadcrumb.tsx +22 -8
  35. package/src/components/button/button.meta.md +258 -21
  36. package/src/components/button/button.stories.tsx +549 -41
  37. package/src/components/button/button.tsx +335 -33
  38. package/src/components/button/demo/as-child.tsx +24 -0
  39. package/src/components/button/demo/basic.tsx +8 -0
  40. package/src/components/button/demo/block.tsx +16 -0
  41. package/src/components/button/demo/loading.tsx +19 -0
  42. package/src/components/button/demo/shapes.tsx +18 -0
  43. package/src/components/button/demo/sizes.tsx +19 -0
  44. package/src/components/button/demo/variants.tsx +19 -0
  45. package/src/components/button/demo/with-icon.tsx +20 -0
  46. package/src/components/calendar/calendar.meta.md +13 -3
  47. package/src/components/calendar/calendar.stories.tsx +6 -6
  48. package/src/components/calendar/calendar.tsx +73 -8
  49. package/src/components/card/card.meta.md +27 -5
  50. package/src/components/card/card.stories.tsx +42 -3
  51. package/src/components/card/card.tsx +146 -63
  52. package/src/components/carousel/carousel.meta.md +4 -3
  53. package/src/components/carousel/carousel.stories.tsx +11 -6
  54. package/src/components/cascader/cascader.meta.md +47 -17
  55. package/src/components/cascader/cascader.stories.tsx +22 -10
  56. package/src/components/cascader/cascader.tsx +428 -85
  57. package/src/components/checkbox/checkbox.meta.md +75 -7
  58. package/src/components/checkbox/checkbox.stories.tsx +161 -3
  59. package/src/components/checkbox/checkbox.tsx +77 -9
  60. package/src/components/collapsible/collapsible.meta.md +14 -6
  61. package/src/components/collapsible/collapsible.stories.tsx +10 -2
  62. package/src/components/collapsible/collapsible.tsx +93 -6
  63. package/src/components/color-picker/color-picker.meta.md +12 -7
  64. package/src/components/color-picker/color-picker.stories.tsx +86 -7
  65. package/src/components/color-picker/color-picker.tsx +20 -9
  66. package/src/components/command/command.meta.md +29 -13
  67. package/src/components/command/command.stories.tsx +4 -4
  68. package/src/components/command/command.tsx +19 -8
  69. package/src/components/context-menu/context-menu.meta.md +11 -8
  70. package/src/components/context-menu/context-menu.stories.tsx +11 -3
  71. package/src/components/context-menu/context-menu.tsx +21 -8
  72. package/src/components/data-table/data-table.meta.md +6 -5
  73. package/src/components/data-table/data-table.stories.tsx +13 -6
  74. package/src/components/data-table/data-table.tsx +2 -2
  75. package/src/components/date-picker/date-picker.meta.md +88 -19
  76. package/src/components/date-picker/date-picker.stories.tsx +55 -5
  77. package/src/components/date-picker/date-picker.tsx +1489 -91
  78. package/src/components/descriptions/descriptions.meta.md +10 -5
  79. package/src/components/descriptions/descriptions.stories.tsx +3 -3
  80. package/src/components/descriptions/descriptions.tsx +22 -14
  81. package/src/components/dialog/dialog.meta.md +76 -13
  82. package/src/components/dialog/dialog.stories.tsx +182 -20
  83. package/src/components/dialog/dialog.tsx +67 -15
  84. package/src/components/dialog/imperative.tsx +252 -0
  85. package/src/components/drawer/drawer.meta.md +33 -34
  86. package/src/components/drawer/drawer.stories.tsx +29 -12
  87. package/src/components/drawer/drawer.tsx +22 -113
  88. package/src/components/dropdown-menu/dropdown-menu.meta.md +78 -10
  89. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +88 -2
  90. package/src/components/dropdown-menu/dropdown-menu.tsx +24 -10
  91. package/src/components/ellipsis/ellipsis.meta.md +87 -0
  92. package/src/components/ellipsis/ellipsis.stories.tsx +72 -0
  93. package/src/components/ellipsis/ellipsis.tsx +153 -0
  94. package/src/components/empty/empty.meta.md +9 -4
  95. package/src/components/empty/empty.stories.tsx +4 -4
  96. package/src/components/empty/empty.tsx +10 -3
  97. package/src/components/field/field.meta.md +47 -9
  98. package/src/components/field/field.stories.tsx +385 -5
  99. package/src/components/field/field.tsx +263 -35
  100. package/src/components/filter-bar/filter-bar.meta.md +92 -0
  101. package/src/components/filter-bar/filter-bar.stories.tsx +1083 -0
  102. package/src/components/filter-bar/filter-bar.tsx +568 -0
  103. package/src/components/flex/flex.meta.md +54 -6
  104. package/src/components/flex/flex.stories.tsx +107 -20
  105. package/src/components/flex/flex.tsx +27 -4
  106. package/src/components/float-button/float-button.meta.md +8 -3
  107. package/src/components/float-button/float-button.stories.tsx +9 -7
  108. package/src/components/float-button/float-button.tsx +1 -1
  109. package/src/components/form/form.meta.md +39 -17
  110. package/src/components/form/form.stories.tsx +350 -3
  111. package/src/components/form/form.tsx +101 -35
  112. package/src/components/grid/grid.meta.md +7 -2
  113. package/src/components/grid/grid.stories.tsx +6 -4
  114. package/src/components/hover-card/hover-card.meta.md +20 -9
  115. package/src/components/hover-card/hover-card.stories.tsx +34 -5
  116. package/src/components/hover-card/hover-card.tsx +51 -13
  117. package/src/components/icon/DEVELOPMENT.md +809 -0
  118. package/src/components/icon/icon.meta.md +170 -0
  119. package/src/components/icon/icon.stories.tsx +344 -0
  120. package/src/components/icon/icon.tsx +248 -0
  121. package/src/components/image/image.meta.md +9 -4
  122. package/src/components/image/image.stories.tsx +3 -3
  123. package/src/components/image/image.tsx +6 -4
  124. package/src/components/input/demo/basic.tsx +12 -0
  125. package/src/components/input/demo/clearable.tsx +21 -0
  126. package/src/components/input/demo/show-count.tsx +18 -0
  127. package/src/components/input/demo/sizes.tsx +15 -0
  128. package/src/components/input/input.meta.md +39 -33
  129. package/src/components/input/input.stories.tsx +62 -35
  130. package/src/components/input/input.tsx +97 -98
  131. package/src/components/input-group/input-group.meta.md +54 -22
  132. package/src/components/input-group/input-group.stories.tsx +49 -16
  133. package/src/components/input-group/input-group.tsx +44 -8
  134. package/src/components/input-number/input-number.meta.md +64 -7
  135. package/src/components/input-number/input-number.stories.tsx +46 -8
  136. package/src/components/input-number/input-number.tsx +99 -26
  137. package/src/components/input-otp/input-otp.meta.md +4 -3
  138. package/src/components/input-otp/input-otp.stories.tsx +3 -3
  139. package/src/components/input-otp/input-otp.tsx +1 -1
  140. package/src/components/item/item.meta.md +8 -3
  141. package/src/components/item/item.stories.tsx +8 -5
  142. package/src/components/item/item.tsx +7 -6
  143. package/src/components/kbd/kbd.meta.md +13 -4
  144. package/src/components/kbd/kbd.stories.tsx +4 -4
  145. package/src/components/kbd/kbd.tsx +10 -5
  146. package/src/components/label/label.meta.md +18 -10
  147. package/src/components/label/label.stories.tsx +64 -6
  148. package/src/components/label/label.tsx +91 -19
  149. package/src/components/masonry/masonry.meta.md +8 -3
  150. package/src/components/masonry/masonry.stories.tsx +7 -5
  151. package/src/components/masonry/masonry.tsx +1 -0
  152. package/src/components/mentions/mentions.meta.md +36 -6
  153. package/src/components/mentions/mentions.stories.tsx +120 -6
  154. package/src/components/mentions/mentions.tsx +11 -5
  155. package/src/components/menubar/menubar.meta.md +30 -12
  156. package/src/components/menubar/menubar.stories.tsx +62 -2
  157. package/src/components/menubar/menubar.tsx +9 -9
  158. package/src/components/native-select/native-select.meta.md +8 -3
  159. package/src/components/native-select/native-select.stories.tsx +8 -5
  160. package/src/components/native-select/native-select.tsx +1 -1
  161. package/src/components/navigation-menu/navigation-menu.meta.md +19 -9
  162. package/src/components/navigation-menu/navigation-menu.stories.tsx +112 -9
  163. package/src/components/navigation-menu/navigation-menu.tsx +8 -4
  164. package/src/components/notification/notification.meta.md +52 -10
  165. package/src/components/notification/notification.stories.tsx +11 -9
  166. package/src/components/notification/notification.tsx +36 -21
  167. package/src/components/page-header/DEVELOPMENT.md +842 -0
  168. package/src/components/page-header/page-header.meta.md +208 -0
  169. package/src/components/page-header/page-header.stories.tsx +421 -0
  170. package/src/components/page-header/page-header.tsx +281 -0
  171. package/src/components/pagination/pagination.meta.md +140 -37
  172. package/src/components/pagination/pagination.stories.tsx +232 -10
  173. package/src/components/pagination/pagination.tsx +355 -63
  174. package/src/components/popconfirm/popconfirm.meta.md +9 -4
  175. package/src/components/popconfirm/popconfirm.stories.tsx +3 -4
  176. package/src/components/popconfirm/popconfirm.tsx +2 -2
  177. package/src/components/popover/popover.meta.md +62 -5
  178. package/src/components/popover/popover.stories.tsx +83 -7
  179. package/src/components/popover/popover.tsx +77 -28
  180. package/src/components/progress/progress.meta.md +38 -6
  181. package/src/components/progress/progress.stories.tsx +3 -3
  182. package/src/components/progress/progress.tsx +24 -16
  183. package/src/components/radio-group/radio-group.meta.md +79 -7
  184. package/src/components/radio-group/radio-group.stories.tsx +39 -3
  185. package/src/components/radio-group/radio-group.tsx +149 -18
  186. package/src/components/rate/rate.meta.md +35 -4
  187. package/src/components/rate/rate.stories.tsx +13 -5
  188. package/src/components/rate/rate.tsx +37 -10
  189. package/src/components/resizable/resizable.meta.md +7 -4
  190. package/src/components/resizable/resizable.stories.tsx +6 -6
  191. package/src/components/resizable/resizable.tsx +1 -1
  192. package/src/components/result/result.meta.md +7 -2
  193. package/src/components/result/result.stories.tsx +4 -8
  194. package/src/components/result/result.tsx +24 -15
  195. package/src/components/scroll-area/scroll-area.meta.md +4 -3
  196. package/src/components/scroll-area/scroll-area.stories.tsx +12 -4
  197. package/src/components/scroll-area/scroll-area.tsx +3 -3
  198. package/src/components/segmented/segmented.meta.md +7 -4
  199. package/src/components/segmented/segmented.stories.tsx +37 -8
  200. package/src/components/segmented/segmented.tsx +15 -7
  201. package/src/components/select/select.meta.md +197 -52
  202. package/src/components/select/select.stories.tsx +238 -63
  203. package/src/components/select/select.tsx +718 -171
  204. package/src/components/separator/separator.meta.md +4 -3
  205. package/src/components/separator/separator.stories.tsx +3 -3
  206. package/src/components/separator/separator.tsx +3 -7
  207. package/src/components/sheet/sheet.meta.md +32 -16
  208. package/src/components/sheet/sheet.stories.tsx +116 -10
  209. package/src/components/sheet/sheet.tsx +116 -29
  210. package/src/components/sidebar/sidebar.meta.md +37 -18
  211. package/src/components/sidebar/sidebar.stories.tsx +701 -29
  212. package/src/components/sidebar/sidebar.tsx +615 -142
  213. package/src/components/skeleton/skeleton.meta.md +4 -5
  214. package/src/components/skeleton/skeleton.stories.tsx +4 -4
  215. package/src/components/skeleton/skeleton.tsx +7 -7
  216. package/src/components/slider/slider.meta.md +57 -5
  217. package/src/components/slider/slider.stories.tsx +58 -6
  218. package/src/components/slider/slider.tsx +154 -13
  219. package/src/components/sonner/sonner.meta.md +58 -7
  220. package/src/components/sonner/sonner.stories.tsx +78 -5
  221. package/src/components/sonner/sonner.tsx +137 -8
  222. package/src/components/spinner/spinner.meta.md +62 -13
  223. package/src/components/spinner/spinner.stories.tsx +66 -14
  224. package/src/components/spinner/spinner.tsx +111 -9
  225. package/src/components/statistic/statistic.meta.md +7 -2
  226. package/src/components/statistic/statistic.stories.tsx +3 -7
  227. package/src/components/statistic/statistic.tsx +5 -6
  228. package/src/components/steps/steps.meta.md +18 -4
  229. package/src/components/steps/steps.stories.tsx +43 -3
  230. package/src/components/steps/steps.tsx +15 -12
  231. package/src/components/switch/switch.meta.md +51 -5
  232. package/src/components/switch/switch.stories.tsx +6 -6
  233. package/src/components/switch/switch.tsx +109 -41
  234. package/src/components/table/table.meta.md +17 -6
  235. package/src/components/table/table.stories.tsx +10 -5
  236. package/src/components/table/table.tsx +4 -4
  237. package/src/components/tabs/tabs.meta.md +38 -25
  238. package/src/components/tabs/tabs.stories.tsx +111 -25
  239. package/src/components/tabs/tabs.tsx +125 -54
  240. package/src/components/tag/tag.meta.md +105 -40
  241. package/src/components/tag/tag.stories.tsx +189 -16
  242. package/src/components/tag/tag.tsx +222 -21
  243. package/src/components/textarea/textarea.meta.md +35 -19
  244. package/src/components/textarea/textarea.stories.tsx +32 -6
  245. package/src/components/textarea/textarea.tsx +33 -9
  246. package/src/components/time-picker/time-picker.meta.md +124 -32
  247. package/src/components/time-picker/time-picker.stories.tsx +85 -15
  248. package/src/components/time-picker/time-picker.tsx +913 -61
  249. package/src/components/timeline/timeline.meta.md +14 -6
  250. package/src/components/timeline/timeline.stories.tsx +37 -7
  251. package/src/components/timeline/timeline.tsx +35 -14
  252. package/src/components/toggle/toggle.meta.md +5 -4
  253. package/src/components/toggle/toggle.stories.tsx +4 -4
  254. package/src/components/toggle/toggle.tsx +4 -3
  255. package/src/components/toggle-group/toggle-group.meta.md +5 -4
  256. package/src/components/toggle-group/toggle-group.stories.tsx +3 -3
  257. package/src/components/toggle-group/toggle-group.tsx +2 -2
  258. package/src/components/tooltip/tooltip.meta.md +55 -5
  259. package/src/components/tooltip/tooltip.stories.tsx +42 -5
  260. package/src/components/tooltip/tooltip.tsx +81 -21
  261. package/src/components/tour/tour.meta.md +9 -4
  262. package/src/components/tour/tour.stories.tsx +3 -3
  263. package/src/components/tour/tour.tsx +4 -4
  264. package/src/components/transfer/transfer.meta.md +11 -6
  265. package/src/components/transfer/transfer.stories.tsx +4 -8
  266. package/src/components/transfer/transfer.tsx +28 -21
  267. package/src/components/tree/tree.meta.md +63 -5
  268. package/src/components/tree/tree.stories.tsx +31 -12
  269. package/src/components/tree/tree.tsx +9 -8
  270. package/src/components/tree-select/tree-select.meta.md +59 -8
  271. package/src/components/tree-select/tree-select.stories.tsx +3 -3
  272. package/src/components/tree-select/tree-select.tsx +42 -7
  273. package/src/components/typography/typography.meta.md +61 -14
  274. package/src/components/typography/typography.stories.tsx +12 -11
  275. package/src/components/typography/typography.tsx +43 -28
  276. package/src/components/upload/upload.meta.md +49 -4
  277. package/src/components/upload/upload.stories.tsx +72 -12
  278. package/src/components/upload/upload.tsx +170 -37
  279. package/src/components/watermark/watermark.meta.md +7 -2
  280. package/src/components/watermark/watermark.stories.tsx +101 -9
  281. package/src/components/watermark/watermark.tsx +1 -0
  282. package/src/hooks/use-breakpoint.ts +117 -0
  283. package/src/hooks/use-debounce-callback.ts +52 -0
  284. package/src/hooks/use-mobile.ts +23 -0
  285. package/src/stories/theme-tokens.stories.tsx +747 -0
  286. package/src/utils/trigger-input.ts +53 -0
  287. package/src/components/button-group/button-group.meta.md +0 -92
  288. package/src/components/button-group/button-group.stories.tsx +0 -90
  289. package/src/components/button-group/button-group.tsx +0 -75
  290. package/src/components/combobox/combobox.meta.md +0 -93
  291. package/src/components/combobox/combobox.stories.tsx +0 -55
  292. package/src/components/combobox/combobox.tsx +0 -130
  293. package/src/components/space/space.meta.md +0 -94
  294. package/src/components/space/space.stories.tsx +0 -94
  295. package/src/components/space/space.tsx +0 -106
@@ -1,15 +1,18 @@
1
1
  ---
2
2
  id: timeline
3
3
  name: Timeline
4
+ displayName: 时间轴
4
5
  type: component
5
6
  category: data-display
6
7
  since: 0.1.0
7
- package: "@teamix-evo/ui"
8
+ package: '@teamix-evo/ui'
8
9
  ---
9
10
 
10
- # Timeline
11
+ # Timeline 时间轴
11
12
 
12
- 时间轴 — antd 独有补足。**等价 antd `Timeline`**。垂直时间流(操作历史 / 物流轨迹 / 进度记录),支持 `left` / `right` / `alternate` 三种布局、5 种圆点颜色、自定义圆点节点、反向、尾部 `pending` 占位(配 Spinner 表示进行中)。
13
+ 时间轴 — antd 独有补足。**等价 antd `Timeline`**。垂直时间流(操作历史 / 物流轨迹 / 进度记录),支持 `left` / `right` / `alternate` 三种布局、5 档圆点 color、自定义圆点节点、反向、尾部 `pending` 占位(配 Spinner 表示进行中)。
14
+
15
+ > **语义色 API**(见 [ADR 0021](../../../../../docs/adr/0021-semantic-color-api-unification.md)):圆点颜色用 `color`,5 档枚举 `default | primary | success | warning | destructive`(字面与 OpenTrek tokens 对齐,**不收 `info`**;如需信息色,用 `primary`)。
13
16
 
14
17
  ## When to use
15
18
 
@@ -24,6 +27,8 @@ package: "@teamix-evo/ui"
24
27
  - 数据表 → `Table` / `DataTable`
25
28
  - 不带时间属性的事件列表 → `List` / `Item` + `ItemGroup`
26
29
 
30
+ ## Props
31
+
27
32
  <!-- auto:props:begin -->
28
33
  | 名称 | 类型 | 默认值 | 必填 | 说明 |
29
34
  | --- | --- | --- | --- | --- |
@@ -33,6 +38,8 @@ package: "@teamix-evo/ui"
33
38
  | `pending` | `React.ReactNode` | – | – | 在尾部追加一个"未结束"占位(antd `pending` 并集) — 通常配 `<Spinner>` 显示加载中。 |
34
39
  <!-- auto:props:end -->
35
40
 
41
+ ## 依赖
42
+
36
43
  <!-- auto:deps:begin -->
37
44
  ### 同库依赖
38
45
 
@@ -51,8 +58,9 @@ _无 — 本组件不依赖任何 npm 包。_
51
58
 
52
59
  - **每项必须有 `children`** — `label` 仅用于时间 / 副标签(`left` 模式下也会渲染在主标题上方)
53
60
  - **`mode="alternate"`** 适合非密集长内容,适合两栏对照("时间 ↔ 事件")
54
- - **`color` 是语义色**:`error` 用于真错误,`success` 用于完成态;**不要**用 `warning` 表示"普通节点"
61
+ - **`color` 是语义色**:`destructive` 用于真错误,`success` 用于完成态;**不要**用 `warning` 表示“普通节点”
55
62
  - **自定义 `dot`**:用 lucide icon 节点,**尺寸控制在 12px(`size-3`)** 与默认圆点对齐
63
+ - **`selected: true`** 会将默认圆点换为 45° 旋转的小方块(`size-2.5 rotate-45`)+ primary 色 — 用于标记"当前 / 选中"节点;设了 `dot` 后不生效
56
64
  - **`pending`** 配 `<Spinner size="sm" />` 是经典组合 — 表示"流程未结束,有新事件在路上"
57
65
  - **`reverse`**:数据天然按时间升序时用,**不要**先在外面 reverse 数据再传(直接用 prop 更明确)
58
66
  - **节点 > 20 个**建议折叠为分页 / Collapsible — Timeline 长得过深会失去时间感
@@ -79,14 +87,14 @@ import { CheckCircle2 } from 'lucide-react';
79
87
  { children: '订单已创建', color: 'success' },
80
88
  { children: '正在打包', color: 'primary' },
81
89
  ]}
82
- pending={<><Spinner size="sm" tone="muted" /> 等待发货...</>}
90
+ pending={<><Spinner size="sm" color="muted" /> 等待发货...</>}
83
91
  />
84
92
 
85
93
  // 自定义 dot
86
94
  <Timeline
87
95
  items={[
88
96
  { children: '部署到 staging', dot: <CheckCircle2 className="size-3 text-emerald-500" /> },
89
- { children: '回滚到 v1.2', color: 'error' },
97
+ { children: '回滚到 v1.2', color: 'destructive' },
90
98
  ]}
91
99
  />
92
100
 
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { CheckCircle2 } from 'lucide-react';
3
3
  import { Timeline } from './timeline';
4
4
  import { Spinner } from '@/components/spinner/spinner';
@@ -11,7 +11,7 @@ const meta: Meta<typeof Timeline> = {
11
11
  docs: {
12
12
  description: {
13
13
  component:
14
- '时间轴 — 垂直时间流(操作历史 / 物流轨迹 / 进度记录)。3 种布局(left / right / alternate)+ 5 种圆点语义色 + 自定义 dot + pending 进行中占位。等价 antd `Timeline`。视觉走 OpenTrek tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
14
+ '时间轴 — 垂直时间流(操作历史 / 物流轨迹 / 进度记录)。3 种布局(left / right / alternate)+ 5 种圆点语义色(`color`,对齐 ADR 0021) + 自定义 dot + pending 进行中占位。等价 antd `Timeline`。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
15
15
  },
16
16
  },
17
17
  },
@@ -46,7 +46,7 @@ export const WithPending: Story = {
46
46
  ]}
47
47
  pending={
48
48
  <span className="inline-flex items-center gap-1">
49
- <Spinner size="sm" tone="muted" />
49
+ <Spinner size="sm" color="muted" />
50
50
  等待发货...
51
51
  </span>
52
52
  }
@@ -61,9 +61,15 @@ export const CustomDots: Story = {
61
61
  <div className="w-96">
62
62
  <Timeline
63
63
  items={[
64
- { children: '部署到 staging 成功', dot: <CheckCircle2 className="size-3 text-emerald-500" /> },
65
- { children: 'staging 验证通过', dot: <CheckCircle2 className="size-3 text-emerald-500" /> },
66
- { children: '回滚到 v1.2', color: 'error' },
64
+ {
65
+ children: '部署到 staging 成功',
66
+ dot: <CheckCircle2 className="size-3 text-emerald-500" />,
67
+ },
68
+ {
69
+ children: 'staging 验证通过',
70
+ dot: <CheckCircle2 className="size-3 text-emerald-500" />,
71
+ },
72
+ { children: '回滚到 v1.2', color: 'destructive' },
67
73
  ]}
68
74
  />
69
75
  </div>
@@ -94,7 +100,11 @@ export const Reverse: Story = {
94
100
  <Timeline
95
101
  reverse
96
102
  items={[
97
- { children: '订单已创建', label: '2026-05-01 10:00', color: 'default' },
103
+ {
104
+ children: '订单已创建',
105
+ label: '2026-05-01 10:00',
106
+ color: 'default',
107
+ },
98
108
  { children: '已发货', label: '2026-05-02 14:30', color: 'primary' },
99
109
  { children: '已签收', label: '2026-05-04 09:15', color: 'success' },
100
110
  ]}
@@ -102,3 +112,23 @@ export const Reverse: Story = {
102
112
  </div>
103
113
  ),
104
114
  };
115
+
116
+ export const Selected: Story = {
117
+ parameters: { controls: { disable: true } },
118
+ render: () => (
119
+ <div className="w-80">
120
+ <Timeline
121
+ items={[
122
+ { children: '订单已创建', label: '2026-05-01 10:00', color: 'default' },
123
+ {
124
+ children: '当前节点 — 选中后以方形 + primary 色区分',
125
+ label: '2026-05-02 14:30',
126
+ color: 'primary',
127
+ selected: true,
128
+ },
129
+ { children: '待处理', label: '2026-05-03 11:00', color: 'default' },
130
+ ]}
131
+ />
132
+ </div>
133
+ ),
134
+ };
@@ -7,14 +7,14 @@ export type TimelineDotColor =
7
7
  | 'primary'
8
8
  | 'success'
9
9
  | 'warning'
10
- | 'error';
10
+ | 'destructive';
11
11
 
12
12
  const dotColorMap: Record<TimelineDotColor, string> = {
13
13
  default: 'bg-muted-foreground',
14
14
  primary: 'bg-primary',
15
- success: 'bg-emerald-500',
16
- warning: 'bg-amber-500',
17
- error: 'bg-destructive',
15
+ success: 'bg-success',
16
+ warning: 'bg-warning',
17
+ destructive: 'bg-destructive',
18
18
  };
19
19
 
20
20
  export interface TimelineItem {
@@ -23,7 +23,7 @@ export interface TimelineItem {
23
23
  /** 左侧时间 / 标签(antd `label` 并集 — 仅 `mode="alternate"` / 左侧布局时显式渲染)。 */
24
24
  label?: React.ReactNode;
25
25
  /**
26
- * 圆点颜色(antd `color` 并集) — 也可传 `dot` 完全自定义。
26
+ * 圆点语义色(调色板) — 对齐 [ADR 0021](../../../../../docs/adr/0021-semantic-color-api-unification.md);也可传 `dot` 完全自定义。
27
27
  * @default "default"
28
28
  */
29
29
  color?: TimelineDotColor;
@@ -31,6 +31,11 @@ export interface TimelineItem {
31
31
  * 自定义圆点节点(antd `dot` 并集) — 传节点(如 icon)替换默认圆点。
32
32
  */
33
33
  dot?: React.ReactNode;
34
+ /**
35
+ * 标记该节点为选中状态 — 默认圆点会改为方形 + primary 色(不影响自定义 `dot`)。
36
+ * @default false
37
+ */
38
+ selected?: boolean;
34
39
  }
35
40
 
36
41
  export interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {
@@ -64,6 +69,13 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
64
69
  <span className="flex size-3 items-center justify-center text-primary">
65
70
  {it.dot}
66
71
  </span>
72
+ ) : it.selected ? (
73
+ <span
74
+ className={cn(
75
+ 'size-2.5 rotate-45 ring-2 ring-background',
76
+ dotColorMap[it.color ?? 'primary'],
77
+ )}
78
+ />
67
79
  ) : (
68
80
  <span
69
81
  className={cn(
@@ -81,7 +93,8 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
81
93
  >
82
94
  {finalItems.map((it, i) => {
83
95
  const isLast = i === finalItems.length - 1 && !pending;
84
- const sideRight = mode === 'right' || (mode === 'alternate' && i % 2 === 1);
96
+ const sideRight =
97
+ mode === 'right' || (mode === 'alternate' && i % 2 === 1);
85
98
  return (
86
99
  <li
87
100
  key={i}
@@ -90,13 +103,18 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
90
103
  mode === 'alternate'
91
104
  ? 'grid-cols-[1fr_auto_1fr]'
92
105
  : sideRight
93
- ? 'grid-cols-[1fr_auto]'
94
- : 'grid-cols-[auto_1fr]',
106
+ ? 'grid-cols-[1fr_auto]'
107
+ : 'grid-cols-[auto_1fr]',
95
108
  )}
96
109
  >
97
110
  {/* left slot */}
98
111
  {mode === 'alternate' || mode === 'right' ? (
99
- <div className={cn('min-w-0 text-sm', sideRight ? '' : 'text-right')}>
112
+ <div
113
+ className={cn(
114
+ 'min-w-0 text-xs',
115
+ sideRight ? '' : 'text-right',
116
+ )}
117
+ >
100
118
  {!sideRight ? it.children : it.label}
101
119
  </div>
102
120
  ) : null}
@@ -107,6 +125,7 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
107
125
  {!isLast ? (
108
126
  <span
109
127
  aria-hidden="true"
128
+ // eslint-disable-next-line teamix-evo/no-arbitrary-tw-value -- timeline connector extends to next item; calc(100% + 1.5rem) bridges the inter-item gap, not tokenizable.
110
129
  className="absolute top-3 h-[calc(100%+1.5rem)] w-px bg-border"
111
130
  />
112
131
  ) : null}
@@ -114,18 +133,20 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
114
133
 
115
134
  {/* right slot */}
116
135
  {mode === 'alternate' ? (
117
- <div className="min-w-0 text-sm">
136
+ <div className="min-w-0 text-xs">
118
137
  {sideRight ? it.children : it.label}
119
138
  </div>
120
139
  ) : mode === 'left' ? (
121
140
  <div className="min-w-0">
122
141
  {it.label ? (
123
- <div className="mb-0.5 text-xs text-muted-foreground">{it.label}</div>
142
+ <div className="mb-0.5 text-xs text-muted-foreground">
143
+ {it.label}
144
+ </div>
124
145
  ) : null}
125
- <div className="text-sm">{it.children}</div>
146
+ <div className="text-xs">{it.children}</div>
126
147
  </div>
127
148
  ) : (
128
- <div className="min-w-0 text-sm">
149
+ <div className="min-w-0 text-xs">
129
150
  {sideRight ? it.children : null}
130
151
  </div>
131
152
  )}
@@ -135,7 +156,7 @@ const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(
135
156
  {pending ? (
136
157
  <li className="grid grid-cols-[auto_1fr] items-start gap-3">
137
158
  <span className="size-3 rounded-full bg-muted-foreground/50 ring-2 ring-background" />
138
- <div className="text-sm text-muted-foreground">{pending}</div>
159
+ <div className="text-xs text-muted-foreground">{pending}</div>
139
160
  </li>
140
161
  ) : null}
141
162
  </ol>
@@ -2,12 +2,13 @@
2
2
  id: toggle
3
3
  name: Toggle
4
4
  type: component
5
- category: form
5
+ category: deprecated
6
6
  since: 0.1.0
7
- package: "@teamix-evo/ui"
7
+ package: '@teamix-evo/ui'
8
+ displayName: 切换按钮
8
9
  ---
9
10
 
10
- # Toggle
11
+ # Toggle 切换按钮
11
12
 
12
13
  二元状态按钮 — Radix Toggle 包装。**shadcn-only**(antd 无独立对标,与 Switch 形态不同)。
13
14
 
@@ -33,7 +34,7 @@ package: "@teamix-evo/ui"
33
34
  | 名称 | 类型 | 默认值 | 必填 | 说明 |
34
35
  | --- | --- | --- | --- | --- |
35
36
  | `variant` | `'default' \| 'outline'` | `"default"` | – | 视觉风格。 |
36
- | `size` | `'sm' \| 'default' \| 'lg'` | `"default"` | – | 尺寸。 |
37
+ | `size` | `'sm' \| 'md' \| 'default' \| 'lg'` | `"default"` | – | 尺寸。 |
37
38
  <!-- auto:props:end -->
38
39
 
39
40
  ## 依赖
@@ -1,16 +1,16 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import { Bold, Italic, Underline } from 'lucide-react';
3
3
  import { Toggle } from './toggle';
4
4
 
5
5
  const meta: Meta<typeof Toggle> = {
6
- title: '表单与输入 · Form/Toggle',
6
+ title: '废弃 · Deprecated/Toggle',
7
7
  component: Toggle,
8
8
  tags: ['autodocs'],
9
9
  parameters: {
10
10
  docs: {
11
11
  description: {
12
12
  component:
13
- '切换按钮 — 二状态 (开 / 关) 按钮,常用于富文本编辑器工具栏 (加粗 / 斜体 / 下划线) 等场景。Radix Toggle 实现, shadcn 专有(antd 未提供对应原子组件,antd 逻辑上以 Radio.Button + Switch 组合表达)。支持 `variant`(default / outline)与 `size`(sm / default / lg)。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
13
+ '⚠️ **已废弃** — 仅 Storybook 留档,不通过 manifest 对外发布。\n\n切换按钮 — 二状态 (开 / 关) 按钮,常用于富文本编辑器工具栏 (加粗 / 斜体 / 下划线) 等场景。Radix Toggle 实现, shadcn 专有(antd 未提供对应原子组件,antd 逻辑上以 Radio.Button + Switch 组合表达)。支持 `variant`(default / outline)与 `size`(sm / default / lg)。',
14
14
  },
15
15
  },
16
16
  },
@@ -51,7 +51,7 @@ export const Variants: Story = {
51
51
  export const Toolbar: Story = {
52
52
  parameters: { controls: { disable: true } },
53
53
  render: () => (
54
- <div className="flex items-center gap-1 rounded-md border p-1">
54
+ <div className="flex items-center gap-1 rounded-md border border-border p-1">
55
55
  <Toggle size="sm" aria-label="加粗">
56
56
  <Bold />
57
57
  </Toggle>
@@ -5,7 +5,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
5
5
  import { cn } from '@/utils/cn';
6
6
 
7
7
  const toggleVariants = cva(
8
- 'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
8
+ 'inline-flex cursor-pointer items-center justify-center gap-2 rounded-md text-xs font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
9
9
  {
10
10
  variants: {
11
11
  variant: {
@@ -15,11 +15,12 @@ const toggleVariants = cva(
15
15
  },
16
16
  size: {
17
17
  sm: 'h-8 px-2 min-w-8',
18
+ md: 'h-9 px-3 min-w-9',
18
19
  default: 'h-9 px-3 min-w-9',
19
20
  lg: 'h-10 px-4 min-w-10',
20
21
  },
21
22
  },
22
- defaultVariants: { variant: 'default', size: 'default' },
23
+ defaultVariants: { variant: 'default', size: 'md' },
23
24
  },
24
25
  );
25
26
 
@@ -35,7 +36,7 @@ export interface ToggleProps
35
36
  * 尺寸。
36
37
  * @default "default"
37
38
  */
38
- size?: 'sm' | 'default' | 'lg';
39
+ size?: 'sm' | 'md' | 'default' | 'lg';
39
40
  }
40
41
 
41
42
  const Toggle = React.forwardRef<
@@ -2,12 +2,13 @@
2
2
  id: toggle-group
3
3
  name: ToggleGroup
4
4
  type: component
5
- category: form
5
+ category: deprecated
6
6
  since: 0.1.0
7
- package: "@teamix-evo/ui"
7
+ package: '@teamix-evo/ui'
8
+ displayName: 切换按钮组
8
9
  ---
9
10
 
10
- # ToggleGroup
11
+ # ToggleGroup 切换按钮组
11
12
 
12
13
  切换按钮组 — Radix ToggleGroup,**单选(`type="single"`)+ 多选(`type="multiple"`)**。复用 Toggle 的 cva variants(default / outline)与 size。
13
14
 
@@ -31,7 +32,7 @@ package: "@teamix-evo/ui"
31
32
  | 名称 | 类型 | 默认值 | 必填 | 说明 |
32
33
  | --- | --- | --- | --- | --- |
33
34
  | `variant` | `'default' \| 'outline'` | `"default"` | – | 视觉风格,与同源的 [`Toggle`](../toggle/toggle.tsx) 保持一致。 |
34
- | `size` | `'sm' \| 'default' \| 'lg'` | `"default"` | – | 尺寸,与同源的 [`Toggle`](../toggle/toggle.tsx) 保持一致。 |
35
+ | `size` | `'sm' \| 'md' \| 'default' \| 'lg'` | `"default"` | – | 尺寸,与同源的 [`Toggle`](../toggle/toggle.tsx) 保持一致。 |
35
36
  | `className` | `string` | – | – | 容器 className,会与默认布局类合并。 |
36
37
  <!-- auto:props:end -->
37
38
 
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
2
  import {
3
3
  AlignLeft,
4
4
  AlignCenter,
@@ -11,14 +11,14 @@ import {
11
11
  import { ToggleGroup, ToggleGroupItem } from './toggle-group';
12
12
 
13
13
  const meta: Meta<typeof ToggleGroup> = {
14
- title: '表单与输入 · Form/ToggleGroup',
14
+ title: '废弃 · Deprecated/ToggleGroup',
15
15
  component: ToggleGroup,
16
16
  tags: ['autodocs'],
17
17
  parameters: {
18
18
  docs: {
19
19
  description: {
20
20
  component:
21
- '切换按钮组 — 一组二状态按钮的集合,可选单选 (`type="single"`) 或多选 (`type="multiple"`),常用于对齐方式 / 字体样式等工具栏场景。Radix ToggleGroup 实现,shadcn 专有(antd 以 `Radio.Group` + `Radio.Button` 表达单选、以菜单多选表达多选);`variant` / `size` 与 `Toggle` 保持一致。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
21
+ '⚠️ **已废弃** — 仅 Storybook 留档,不通过 manifest 对外发布。\n\n切换按钮组 — 一组二状态按钮的集合,可选单选 (`type="single"`) 或多选 (`type="multiple"`),常用于对齐方式 / 字体样式等工具栏场景。Radix ToggleGroup 实现,shadcn 专有(antd 以 `Radio.Group` + `Radio.Button` 表达单选、以菜单多选表达多选);`variant` / `size` 与 `Toggle` 保持一致。',
22
22
  },
23
23
  },
24
24
  },
@@ -7,7 +7,7 @@ import { toggleVariants } from '@/components/toggle/toggle';
7
7
 
8
8
  const ToggleGroupContext = React.createContext<
9
9
  VariantProps<typeof toggleVariants>
10
- >({ size: 'default', variant: 'default' });
10
+ >({ size: 'md', variant: 'default' });
11
11
 
12
12
  /**
13
13
  * ToggleGroup 自身的可定制属性。底层 type=`single`|`multiple` 与对应的
@@ -23,7 +23,7 @@ export interface ToggleGroupProps {
23
23
  * 尺寸,与同源的 [`Toggle`](../toggle/toggle.tsx) 保持一致。
24
24
  * @default "default"
25
25
  */
26
- size?: 'sm' | 'default' | 'lg';
26
+ size?: 'sm' | 'md' | 'default' | 'lg';
27
27
  /**
28
28
  * 容器 className,会与默认布局类合并。
29
29
  */
@@ -2,18 +2,28 @@
2
2
  id: tooltip
3
3
  name: Tooltip
4
4
  type: component
5
- category: feedback
5
+ category: data-display
6
6
  since: 0.1.0
7
- package: "@teamix-evo/ui"
7
+ package: '@teamix-evo/ui'
8
+ displayName: 文字提示
8
9
  ---
9
10
 
10
- # Tooltip
11
+ # Tooltip 文字提示
11
12
 
12
- 文字提示气泡 — Radix Tooltip + antd `arrow / placement(side)` 并集。
13
+ 文字提示气泡 — Radix Tooltip + antd `arrow / placement(side)` 并集 + cloud-design Balloon 双形态(`variant: default | light`)。
13
14
  **两种用法**:`<Tooltip title="...">{trigger}</Tooltip>` 一行包装,或拆分原子组件(`TooltipRoot/Trigger/Content`)精细控制。
14
15
 
15
16
  > **必须用 `<TooltipProvider>` 包裹**(通常在应用根),或在单 Tooltip 上传 `withProvider`。
16
17
 
18
+ ## 视觉变体
19
+
20
+ | variant | 背景 | 适用场景 |
21
+ | --------- | ----------------------------- | ------------------------------------------------- |
22
+ | `default` | 深色 + 浅色文字 | 图标按钮、列截断、工具栏 — 信息密度高、对比强 |
23
+ | `light` | 浅色 + 深色文字 + 边框 + 阴影 | 富文本提示、字段说明、与 Popover 调性接近的轻提示 |
24
+
25
+ 对应 cloud-design Balloon `type="primary"`(白色)/ `type="normal"`(深色)。
26
+
17
27
  ## When to use
18
28
 
19
29
  - 图标按钮的文字解释(无障碍 + 视觉提示)
@@ -36,6 +46,7 @@ package: "@teamix-evo/ui"
36
46
  | `children` | `React.ReactElement` | – | ✓ | 触发器(单个 ReactElement,asChild 透传)。 |
37
47
  | `title` | `React.ReactNode` | – | ✓ | 提示内容。 |
38
48
  | `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `"top"` | – | 弹出方向。 |
49
+ | `variant` | `'default' \| 'light'` | `"default"` | – | 视觉变体: - `default`:深色背景 + 浅色文字(信息密度高、对比强,适合图标按钮 / 列截断提示) - `light`:浅色背景 + 深色文字 + 边框 + 阴影(视觉更轻,贴近富内容卡片调性, 对齐 cloud-design Balloon `type="primary"`) |
39
50
  | `arrow` | `boolean` | `true` | – | 是否显示三角形箭头。 |
40
51
  | `delayDuration` | `number` | – | – | 显示延迟(ms),默认沿用 Provider 的 delayDuration。 |
41
52
  | `withProvider` | `boolean` | – | – | 强制传给 Provider 的 delayDuration(便于不挂 Provider 的场景)。 |
@@ -59,7 +70,7 @@ package: "@teamix-evo/ui"
59
70
  > 业务侧需要先 `pnpm add` / `npm install` 这些包。CLI 在 `ui add` 完成后会列出此提示。
60
71
 
61
72
  ```bash
62
- pnpm add @radix-ui/react-tooltip@^1.1.0
73
+ pnpm add @radix-ui/react-tooltip@^1.1.0 class-variance-authority@^0.7.0
63
74
  ```
64
75
  <!-- auto:deps:end -->
65
76
 
@@ -72,6 +83,8 @@ pnpm add @radix-ui/react-tooltip@^1.1.0
72
83
  - **`title` ≤ 1 行**:超过 1 行换 `HoverCard`
73
84
  - **图标按钮必配 Tooltip + aria-label**:不能只靠 Tooltip 而省略 aria-label,屏幕阅读器不一定触发
74
85
  - **`side` 选 `top` 通常最稳**:避免被屏幕边缘截断;Radix 自带翻转回避能力,但标注首选语义
86
+ - **变体选择**:默认深色(`default`)即可;只有需要承载图标 + 文字的轻提示、且周围已有大量深色元素时才选 `light`,避免与 `Popover` 视觉混淆
87
+ - **不要为 `light` 自行覆写 `bg-white`/`text-black`**:语义色走 `bg-popover`/`text-popover-foreground`,主题切换时才能跟随
75
88
 
76
89
  ## Examples
77
90
 
@@ -96,4 +109,41 @@ import { Settings } from 'lucide-react';
96
109
  <Tooltip title="向右弹出" side="right" arrow={false}>
97
110
  <Button variant="outline">悬浮我</Button>
98
111
  </Tooltip>
112
+
113
+ // 浅色变体(light)
114
+ <Tooltip title="浅色提示" variant="light">
115
+ <Button variant="outline">浅色</Button>
116
+ </Tooltip>
99
117
  ```
118
+
119
+ ## Balloon.Tooltip 形态 — 旧库 API → 新库映射
120
+
121
+ 旧库 cloud-design `Balloon.Tooltip`(以及 `Balloon triggerType="hover"`)在新库统一拆到 `Tooltip`。完整的 Balloon 拆解决策与 Props 总表见 [`popover.meta.md` "Balloon 形态” 章节](../popover/popover.meta.md);本表只列 Tooltip 主路径。
122
+
123
+ ### Props 映射表
124
+
125
+ | 旧库 `Balloon.Tooltip` / `Balloon hover` API | 新库等价写法 | 备注 |
126
+ | -------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------- |
127
+ | `trigger` | `<Tooltip>{element}</Tooltip>`(asChild 自动处理) | 与 Popover 统一 trigger 协议 |
128
+ | `children`(文本内容) | `title` prop | 重命名为 `title`,与 antd `Tooltip` 一致 |
129
+ | `align`(12 方向) | `side`(4 方向,Radix 范式) | Tooltip 只提供 4 方向,需要 12 方位请用 `<TooltipContent side={...} align={...}>` 拆分原子组件 |
130
+ | `type="normal"`(深色) | `variant="default"`(默认) | bg-primary + text-primary-foreground |
131
+ | `type="primary"`(浅色) | `variant="light"` | 边框 + bg-popover + shadow |
132
+ | `delay`(hover 延时) | `delayDuration` | 默认走 `TooltipProvider` 上的值 |
133
+ | `arrow=true`(默认) | `arrow={true}`(默认) | 一致 |
134
+ | `popupClassName` / `popupStyle` | `<TooltipContent className/style>`(拆原子用法) | `<Tooltip>` 包装器未透传,需拆到 TooltipContent |
135
+
136
+ ### 不修复清单
137
+
138
+ | 旧 API | 决策原因 |
139
+ | ------------------------------------- | ----------------------------------------------------------------------- |
140
+ | `triggerType="click"` 在 Tooltip 混用 | hover/click 语义不同 — click 走 [`Popover`](../popover/popover.meta.md) |
141
+ | 12 方向 prop 级支持 | shorthand `side` 足够覆盖 90% 场景;边缘对齐拆原子组件 + `align` |
142
+ | `safeNode` | Tooltip 不需要 — hover 离开即隐藏,无 click outside 语义 |
143
+ | `closable` | Tooltip 不需要 — 鼠标离开即隐藏;需手动关闭请用 Popover |
144
+
145
+ ### Tooltip 专项 AI 生成纪律(在通用纪律之上叠加)
146
+
147
+ - **不要用 Tooltip 装交互元素** — 需要点击/表单/链接 → 走 `Popover`(中量交互)/`HoverCard`(纯展示富内容)
148
+ - **外层必挑 `<TooltipProvider delayDuration={300}>`** — 高频 demo 在应用根一次安装,不要每个 Tooltip 独立 `withProvider`(除非是独立 story / 孤零页面)
149
+ - **`light` 变体只用于能够与 Popover 区分的轻提示** — 不要不分场景一套 light
@@ -1,17 +1,17 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import { Settings } from 'lucide-react';
1
+ import type { Meta, StoryObj } from '@storybook/react-vite';
2
+ import { Settings, Info } from 'lucide-react';
3
3
  import { Tooltip, TooltipProvider } from './tooltip';
4
4
  import { Button } from '@/components/button/button';
5
5
 
6
6
  const meta: Meta<typeof Tooltip> = {
7
- title: '反馈与浮层 · Feedback/Tooltip',
7
+ title: '数据展示 · Data Display/Tooltip',
8
8
  component: Tooltip,
9
9
  tags: ['autodocs'],
10
10
  parameters: {
11
11
  docs: {
12
12
  description: {
13
13
  component:
14
- '文字气泡提示 鼠标悬停或键盘聚焦元素时弹出的简短提示。Radix Tooltip 实现 + antd Tooltip 的并集能力:需 `TooltipProvider` 包裹(可设 `delayDuration`),通过 `side` / `arrow` / `title` 调整方位与尖角;适用于纯文本辅助说明,丰富交互请选 `Popover`。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/design`,无 mock。',
14
+ '文字提示 —— 鼠标悬停或键盘聚焦元素时弹出的简短文字解释。基于 Radix Tooltip 实现 + antd `Tooltip` 并集能力:`title` 文本、`side` 四向、`arrow` 尖角、`delayDuration` 延迟、`withProvider` 内联 Provider,新增 `variant`(default 深底 / light 白底)对齐 cloud-design Balloon 双形态。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/tokens`,无 mock。',
15
15
  },
16
16
  },
17
17
  },
@@ -20,10 +20,14 @@ const meta: Meta<typeof Tooltip> = {
20
20
  control: 'inline-radio',
21
21
  options: ['top', 'right', 'bottom', 'left'],
22
22
  },
23
+ variant: {
24
+ control: 'inline-radio',
25
+ options: ['default', 'light'],
26
+ },
23
27
  arrow: { control: 'boolean' },
24
28
  title: { control: 'text' },
25
29
  },
26
- args: { side: 'top', arrow: true, title: '设置' },
30
+ args: { side: 'top', variant: 'default', arrow: true, title: '设置' },
27
31
  decorators: [
28
32
  (Story) => (
29
33
  <TooltipProvider delayDuration={200}>
@@ -61,6 +65,39 @@ export const Sides: Story = {
61
65
  ),
62
66
  };
63
67
 
68
+ export const Variants: Story = {
69
+ name: 'Variants · default vs light',
70
+ parameters: { controls: { disable: true } },
71
+ render: () => (
72
+ <div className="flex items-center gap-6">
73
+ <Tooltip title="深色 tooltip(default)" variant="default">
74
+ <Button variant="outline">深色</Button>
75
+ </Tooltip>
76
+ <Tooltip title="浅色 tooltip(light) · 带边框与阴影" variant="light">
77
+ <Button variant="outline">浅色</Button>
78
+ </Tooltip>
79
+ </div>
80
+ ),
81
+ };
82
+
83
+ export const LightVariant: Story = {
84
+ name: 'Light variant 富文本',
85
+ parameters: { controls: { disable: true } },
86
+ render: () => (
87
+ <Tooltip
88
+ variant="light"
89
+ side="right"
90
+ title={
91
+ <span className="inline-flex items-center gap-1.5">
92
+ <Info className="size-3.5" /> 配额按账号每分钟计算
93
+ </span>
94
+ }
95
+ >
96
+ <Button variant="outline">规则说明</Button>
97
+ </Tooltip>
98
+ ),
99
+ };
100
+
64
101
  export const NoArrow: Story = {
65
102
  parameters: { controls: { disable: true } },
66
103
  render: () => (