@teamix-evo/ui 0.2.0 → 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 (282) hide show
  1. package/README.md +184 -184
  2. package/manifest.json +680 -492
  3. package/package.json +15 -9
  4. package/src/components/accordion/accordion.meta.md +5 -9
  5. package/src/components/accordion/accordion.stories.tsx +3 -3
  6. package/src/components/accordion/accordion.tsx +104 -8
  7. package/src/components/affix/affix.meta.md +21 -12
  8. package/src/components/affix/affix.stories.tsx +101 -26
  9. package/src/components/affix/affix.tsx +79 -9
  10. package/src/components/alert/alert.meta.md +52 -26
  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 +48 -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 +10 -14
  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 +10 -14
  20. package/src/components/app/app.stories.tsx +6 -6
  21. package/src/components/aspect-ratio/aspect-ratio.meta.md +4 -8
  22. package/src/components/aspect-ratio/aspect-ratio.stories.tsx +3 -3
  23. package/src/components/auto-complete/auto-complete.meta.md +19 -20
  24. package/src/components/auto-complete/auto-complete.stories.tsx +44 -3
  25. package/src/components/auto-complete/auto-complete.tsx +119 -71
  26. package/src/components/avatar/avatar.meta.md +9 -22
  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 +14 -18
  30. package/src/components/badge/badge.stories.tsx +2 -2
  31. package/src/components/badge/badge.tsx +2 -2
  32. package/src/components/breadcrumb/breadcrumb.meta.md +29 -20
  33. package/src/components/breadcrumb/breadcrumb.stories.tsx +120 -5
  34. package/src/components/breadcrumb/breadcrumb.tsx +22 -8
  35. package/src/components/button/button.meta.md +261 -29
  36. package/src/components/button/button.stories.tsx +549 -41
  37. package/src/components/button/button.tsx +335 -33
  38. package/src/components/calendar/calendar.meta.md +19 -14
  39. package/src/components/calendar/calendar.stories.tsx +5 -5
  40. package/src/components/calendar/calendar.tsx +73 -8
  41. package/src/components/card/card.meta.md +31 -34
  42. package/src/components/card/card.stories.tsx +34 -3
  43. package/src/components/card/card.tsx +146 -63
  44. package/src/components/carousel/carousel.meta.md +10 -14
  45. package/src/components/carousel/carousel.stories.tsx +1 -1
  46. package/src/components/cascader/cascader.meta.md +43 -22
  47. package/src/components/cascader/cascader.stories.tsx +13 -2
  48. package/src/components/cascader/cascader.tsx +427 -84
  49. package/src/components/checkbox/checkbox.meta.md +74 -24
  50. package/src/components/checkbox/checkbox.stories.tsx +160 -2
  51. package/src/components/checkbox/checkbox.tsx +77 -9
  52. package/src/components/collapsible/collapsible.meta.md +7 -6
  53. package/src/components/collapsible/collapsible.stories.tsx +2 -2
  54. package/src/components/collapsible/collapsible.tsx +93 -6
  55. package/src/components/color-picker/color-picker.meta.md +16 -20
  56. package/src/components/color-picker/color-picker.stories.tsx +86 -7
  57. package/src/components/color-picker/color-picker.tsx +19 -9
  58. package/src/components/command/command.meta.md +7 -11
  59. package/src/components/command/command.stories.tsx +4 -4
  60. package/src/components/command/command.tsx +18 -7
  61. package/src/components/context-menu/context-menu.meta.md +5 -25
  62. package/src/components/context-menu/context-menu.stories.tsx +4 -4
  63. package/src/components/context-menu/context-menu.tsx +21 -8
  64. package/src/components/data-table/data-table.meta.md +14 -18
  65. package/src/components/data-table/data-table.stories.tsx +1 -1
  66. package/src/components/data-table/data-table.tsx +2 -2
  67. package/src/components/date-picker/date-picker.meta.md +90 -41
  68. package/src/components/date-picker/date-picker.stories.tsx +55 -5
  69. package/src/components/date-picker/date-picker.tsx +1489 -91
  70. package/src/components/descriptions/descriptions.meta.md +12 -16
  71. package/src/components/descriptions/descriptions.stories.tsx +2 -2
  72. package/src/components/descriptions/descriptions.tsx +22 -14
  73. package/src/components/dialog/dialog.meta.md +67 -17
  74. package/src/components/dialog/dialog.stories.tsx +182 -20
  75. package/src/components/dialog/dialog.tsx +67 -15
  76. package/src/components/dialog/imperative.tsx +252 -0
  77. package/src/components/drawer/drawer.meta.md +27 -39
  78. package/src/components/drawer/drawer.stories.tsx +29 -12
  79. package/src/components/drawer/drawer.tsx +22 -114
  80. package/src/components/dropdown-menu/dropdown-menu.meta.md +64 -24
  81. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +81 -3
  82. package/src/components/dropdown-menu/dropdown-menu.tsx +24 -10
  83. package/src/components/ellipsis/ellipsis.meta.md +87 -0
  84. package/src/components/ellipsis/ellipsis.stories.tsx +72 -0
  85. package/src/components/ellipsis/ellipsis.tsx +153 -0
  86. package/src/components/empty/empty.meta.md +10 -14
  87. package/src/components/empty/empty.stories.tsx +3 -3
  88. package/src/components/empty/empty.tsx +10 -3
  89. package/src/components/field/field.meta.md +46 -25
  90. package/src/components/field/field.stories.tsx +380 -3
  91. package/src/components/field/field.tsx +263 -35
  92. package/src/components/filter-bar/filter-bar.meta.md +92 -0
  93. package/src/components/filter-bar/filter-bar.stories.tsx +1083 -0
  94. package/src/components/filter-bar/filter-bar.tsx +568 -0
  95. package/src/components/flex/flex.meta.md +59 -20
  96. package/src/components/flex/flex.stories.tsx +65 -10
  97. package/src/components/flex/flex.tsx +27 -4
  98. package/src/components/float-button/float-button.meta.md +10 -29
  99. package/src/components/float-button/float-button.stories.tsx +6 -6
  100. package/src/components/form/form.meta.md +31 -52
  101. package/src/components/form/form.stories.tsx +350 -3
  102. package/src/components/form/form.tsx +101 -35
  103. package/src/components/grid/grid.meta.md +4 -24
  104. package/src/components/grid/grid.stories.tsx +2 -2
  105. package/src/components/hover-card/hover-card.meta.md +9 -10
  106. package/src/components/hover-card/hover-card.stories.tsx +29 -4
  107. package/src/components/hover-card/hover-card.tsx +51 -13
  108. package/src/components/icon/DEVELOPMENT.md +809 -0
  109. package/src/components/icon/icon.meta.md +170 -0
  110. package/src/components/icon/icon.stories.tsx +344 -0
  111. package/src/components/icon/icon.tsx +248 -0
  112. package/src/components/image/image.meta.md +14 -18
  113. package/src/components/image/image.stories.tsx +3 -3
  114. package/src/components/image/image.tsx +2 -0
  115. package/src/components/input/demo/sizes.tsx +2 -2
  116. package/src/components/input/input.meta.md +44 -43
  117. package/src/components/input/input.stories.tsx +62 -35
  118. package/src/components/input/input.tsx +96 -101
  119. package/src/components/input-group/input-group.meta.md +53 -39
  120. package/src/components/input-group/input-group.stories.tsx +49 -16
  121. package/src/components/input-group/input-group.tsx +43 -8
  122. package/src/components/input-number/input-number.meta.md +68 -20
  123. package/src/components/input-number/input-number.stories.tsx +33 -6
  124. package/src/components/input-number/input-number.tsx +79 -20
  125. package/src/components/input-otp/input-otp.meta.md +8 -20
  126. package/src/components/input-otp/input-otp.stories.tsx +3 -3
  127. package/src/components/input-otp/input-otp.tsx +1 -1
  128. package/src/components/item/item.meta.md +8 -26
  129. package/src/components/item/item.stories.tsx +3 -3
  130. package/src/components/item/item.tsx +7 -6
  131. package/src/components/kbd/kbd.meta.md +7 -19
  132. package/src/components/kbd/kbd.stories.tsx +4 -4
  133. package/src/components/kbd/kbd.tsx +8 -4
  134. package/src/components/label/label.meta.md +21 -18
  135. package/src/components/label/label.stories.tsx +64 -6
  136. package/src/components/label/label.tsx +91 -19
  137. package/src/components/masonry/masonry.meta.md +8 -12
  138. package/src/components/masonry/masonry.stories.tsx +4 -4
  139. package/src/components/mentions/mentions.meta.md +42 -21
  140. package/src/components/mentions/mentions.stories.tsx +120 -6
  141. package/src/components/mentions/mentions.tsx +10 -5
  142. package/src/components/menubar/menubar.meta.md +4 -8
  143. package/src/components/menubar/menubar.stories.tsx +55 -3
  144. package/src/components/menubar/menubar.tsx +9 -9
  145. package/src/components/native-select/native-select.meta.md +7 -11
  146. package/src/components/native-select/native-select.stories.tsx +4 -4
  147. package/src/components/native-select/native-select.tsx +1 -1
  148. package/src/components/navigation-menu/navigation-menu.meta.md +4 -8
  149. package/src/components/navigation-menu/navigation-menu.stories.tsx +106 -3
  150. package/src/components/navigation-menu/navigation-menu.tsx +6 -3
  151. package/src/components/notification/notification.meta.md +41 -8
  152. package/src/components/notification/notification.stories.tsx +9 -9
  153. package/src/components/notification/notification.tsx +34 -19
  154. package/src/components/page-header/DEVELOPMENT.md +842 -0
  155. package/src/components/page-header/page-header.meta.md +208 -0
  156. package/src/components/page-header/page-header.stories.tsx +421 -0
  157. package/src/components/page-header/page-header.tsx +281 -0
  158. package/src/components/pagination/pagination.meta.md +122 -50
  159. package/src/components/pagination/pagination.stories.tsx +227 -11
  160. package/src/components/pagination/pagination.tsx +355 -63
  161. package/src/components/popconfirm/popconfirm.meta.md +19 -23
  162. package/src/components/popconfirm/popconfirm.stories.tsx +2 -2
  163. package/src/components/popconfirm/popconfirm.tsx +1 -1
  164. package/src/components/popover/popover.meta.md +64 -12
  165. package/src/components/popover/popover.stories.tsx +83 -7
  166. package/src/components/popover/popover.tsx +77 -28
  167. package/src/components/progress/progress.meta.md +43 -26
  168. package/src/components/progress/progress.stories.tsx +2 -2
  169. package/src/components/progress/progress.tsx +19 -11
  170. package/src/components/radio-group/radio-group.meta.md +78 -11
  171. package/src/components/radio-group/radio-group.stories.tsx +38 -2
  172. package/src/components/radio-group/radio-group.tsx +149 -18
  173. package/src/components/rate/rate.meta.md +41 -19
  174. package/src/components/rate/rate.stories.tsx +2 -2
  175. package/src/components/rate/rate.tsx +37 -10
  176. package/src/components/resizable/resizable.meta.md +4 -12
  177. package/src/components/resizable/resizable.stories.tsx +5 -5
  178. package/src/components/resizable/resizable.tsx +1 -1
  179. package/src/components/result/result.meta.md +10 -14
  180. package/src/components/result/result.stories.tsx +2 -2
  181. package/src/components/result/result.tsx +21 -12
  182. package/src/components/scroll-area/scroll-area.meta.md +4 -8
  183. package/src/components/scroll-area/scroll-area.stories.tsx +5 -5
  184. package/src/components/segmented/segmented.meta.md +15 -17
  185. package/src/components/segmented/segmented.stories.tsx +3 -3
  186. package/src/components/segmented/segmented.tsx +15 -7
  187. package/src/components/select/select.meta.md +199 -67
  188. package/src/components/select/select.stories.tsx +238 -63
  189. package/src/components/select/select.tsx +718 -171
  190. package/src/components/separator/separator.meta.md +10 -14
  191. package/src/components/separator/separator.stories.tsx +2 -2
  192. package/src/components/separator/separator.tsx +3 -7
  193. package/src/components/sheet/sheet.meta.md +26 -21
  194. package/src/components/sheet/sheet.stories.tsx +116 -10
  195. package/src/components/sheet/sheet.tsx +116 -29
  196. package/src/components/sidebar/sidebar.meta.md +28 -38
  197. package/src/components/sidebar/sidebar.stories.tsx +696 -29
  198. package/src/components/sidebar/sidebar.tsx +615 -142
  199. package/src/components/skeleton/skeleton.meta.md +7 -31
  200. package/src/components/skeleton/skeleton.stories.tsx +3 -3
  201. package/src/components/skeleton/skeleton.tsx +7 -7
  202. package/src/components/slider/slider.meta.md +60 -13
  203. package/src/components/slider/slider.stories.tsx +58 -6
  204. package/src/components/slider/slider.tsx +154 -13
  205. package/src/components/sonner/sonner.meta.md +54 -8
  206. package/src/components/sonner/sonner.stories.tsx +79 -11
  207. package/src/components/sonner/sonner.tsx +137 -8
  208. package/src/components/spinner/spinner.meta.md +57 -21
  209. package/src/components/spinner/spinner.stories.tsx +66 -14
  210. package/src/components/spinner/spinner.tsx +111 -9
  211. package/src/components/statistic/statistic.meta.md +14 -30
  212. package/src/components/statistic/statistic.stories.tsx +1 -1
  213. package/src/components/statistic/statistic.tsx +4 -5
  214. package/src/components/steps/steps.meta.md +20 -15
  215. package/src/components/steps/steps.stories.tsx +37 -2
  216. package/src/components/steps/steps.tsx +15 -12
  217. package/src/components/switch/switch.meta.md +56 -15
  218. package/src/components/switch/switch.stories.tsx +5 -5
  219. package/src/components/switch/switch.tsx +59 -13
  220. package/src/components/table/table.meta.md +3 -7
  221. package/src/components/table/table.stories.tsx +1 -1
  222. package/src/components/table/table.tsx +4 -4
  223. package/src/components/tabs/tabs.meta.md +40 -32
  224. package/src/components/tabs/tabs.stories.tsx +104 -26
  225. package/src/components/tabs/tabs.tsx +125 -54
  226. package/src/components/tag/tag.meta.md +104 -68
  227. package/src/components/tag/tag.stories.tsx +183 -15
  228. package/src/components/tag/tag.tsx +222 -21
  229. package/src/components/textarea/textarea.meta.md +42 -31
  230. package/src/components/textarea/textarea.stories.tsx +32 -6
  231. package/src/components/textarea/textarea.tsx +32 -8
  232. package/src/components/time-picker/time-picker.meta.md +119 -50
  233. package/src/components/time-picker/time-picker.stories.tsx +65 -33
  234. package/src/components/time-picker/time-picker.tsx +889 -101
  235. package/src/components/timeline/timeline.meta.md +16 -17
  236. package/src/components/timeline/timeline.stories.tsx +24 -4
  237. package/src/components/timeline/timeline.tsx +32 -12
  238. package/src/components/toggle/toggle.meta.md +8 -12
  239. package/src/components/toggle/toggle.stories.tsx +4 -4
  240. package/src/components/toggle/toggle.tsx +4 -3
  241. package/src/components/toggle-group/toggle-group.meta.md +10 -14
  242. package/src/components/toggle-group/toggle-group.stories.tsx +3 -3
  243. package/src/components/toggle-group/toggle-group.tsx +2 -2
  244. package/src/components/tooltip/tooltip.meta.md +63 -18
  245. package/src/components/tooltip/tooltip.stories.tsx +42 -5
  246. package/src/components/tooltip/tooltip.tsx +81 -21
  247. package/src/components/tour/tour.meta.md +16 -20
  248. package/src/components/tour/tour.stories.tsx +3 -3
  249. package/src/components/tour/tour.tsx +3 -3
  250. package/src/components/transfer/transfer.meta.md +18 -22
  251. package/src/components/transfer/transfer.stories.tsx +2 -2
  252. package/src/components/transfer/transfer.tsx +28 -21
  253. package/src/components/tree/tree.meta.md +67 -22
  254. package/src/components/tree/tree.stories.tsx +1 -1
  255. package/src/components/tree/tree.tsx +9 -8
  256. package/src/components/tree-select/tree-select.meta.md +59 -23
  257. package/src/components/tree-select/tree-select.stories.tsx +2 -2
  258. package/src/components/tree-select/tree-select.tsx +42 -7
  259. package/src/components/typography/typography.meta.md +61 -39
  260. package/src/components/typography/typography.stories.tsx +14 -9
  261. package/src/components/typography/typography.tsx +38 -25
  262. package/src/components/upload/upload.meta.md +61 -25
  263. package/src/components/upload/upload.stories.tsx +69 -3
  264. package/src/components/upload/upload.tsx +170 -37
  265. package/src/components/watermark/watermark.meta.md +15 -19
  266. package/src/components/watermark/watermark.stories.tsx +98 -8
  267. package/src/hooks/use-breakpoint.ts +117 -0
  268. package/src/hooks/use-debounce-callback.ts +52 -0
  269. package/src/hooks/use-mobile.ts +23 -0
  270. package/src/stories/theme-tokens.stories.tsx +747 -0
  271. package/src/utils/trigger-input.ts +53 -0
  272. package/src/components/button-group/button-group.meta.md +0 -101
  273. package/src/components/button-group/button-group.stories.tsx +0 -93
  274. package/src/components/button-group/button-group.tsx +0 -75
  275. package/src/components/combobox/combobox.meta.md +0 -102
  276. package/src/components/combobox/combobox.stories.tsx +0 -55
  277. package/src/components/combobox/combobox.tsx +0 -130
  278. package/src/components/input/demo/addon.tsx +0 -15
  279. package/src/components/input/demo/with-prefix-suffix.tsx +0 -19
  280. package/src/components/space/space.meta.md +0 -103
  281. package/src/components/space/space.stories.tsx +0 -108
  282. package/src/components/space/space.tsx +0 -106
@@ -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`。',
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: () => (
@@ -1,14 +1,51 @@
1
1
  import * as React from 'react';
2
2
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
3
+ import { cva, type VariantProps } from 'class-variance-authority';
3
4
 
4
5
  import { cn } from '@/utils/cn';
5
6
 
6
7
  const TooltipProvider = TooltipPrimitive.Provider;
7
8
  const TooltipRoot = TooltipPrimitive.Root;
8
- const TooltipTrigger = TooltipPrimitive.Trigger;
9
+ const TooltipTrigger = React.forwardRef<
10
+ React.ElementRef<typeof TooltipPrimitive.Trigger>,
11
+ React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Trigger>
12
+ >(({ className, ...props }, ref) => (
13
+ <TooltipPrimitive.Trigger
14
+ ref={ref}
15
+ className={cn('cursor-pointer', className)}
16
+ {...props}
17
+ />
18
+ ));
19
+ TooltipTrigger.displayName = TooltipPrimitive.Trigger.displayName;
20
+
21
+ const tooltipContentVariants = cva(
22
+ 'z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
23
+ {
24
+ variants: {
25
+ variant: {
26
+ default: 'bg-primary text-primary-foreground shadow-md',
27
+ light:
28
+ 'border border-border bg-popover text-popover-foreground shadow-md',
29
+ },
30
+ },
31
+ defaultVariants: {
32
+ variant: 'default',
33
+ },
34
+ },
35
+ );
36
+
37
+ /** 箭头填充色与变体一一对应。 */
38
+ const arrowFillByVariant: Record<
39
+ NonNullable<VariantProps<typeof tooltipContentVariants>['variant']>,
40
+ string
41
+ > = {
42
+ default: 'fill-primary',
43
+ light: 'fill-popover',
44
+ };
9
45
 
10
46
  export interface TooltipContentProps
11
- extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {
47
+ extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,
48
+ VariantProps<typeof tooltipContentVariants> {
12
49
  /**
13
50
  * 是否显示三角形箭头(antd `arrow` 并集)。
14
51
  * @default true
@@ -19,24 +56,37 @@ export interface TooltipContentProps
19
56
  const TooltipContent = React.forwardRef<
20
57
  React.ElementRef<typeof TooltipPrimitive.Content>,
21
58
  TooltipContentProps
22
- >(({ className, sideOffset = 4, arrow = true, children, ...props }, ref) => (
23
- <TooltipPrimitive.Portal>
24
- <TooltipPrimitive.Content
25
- ref={ref}
26
- sideOffset={sideOffset}
27
- className={cn(
28
- 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
29
- className,
30
- )}
31
- {...props}
32
- >
33
- {children}
34
- {arrow ? (
35
- <TooltipPrimitive.Arrow className="fill-primary" width={8} height={4} />
36
- ) : null}
37
- </TooltipPrimitive.Content>
38
- </TooltipPrimitive.Portal>
39
- ));
59
+ >(
60
+ (
61
+ {
62
+ className,
63
+ sideOffset = 4,
64
+ arrow = true,
65
+ variant = 'default',
66
+ children,
67
+ ...props
68
+ },
69
+ ref,
70
+ ) => (
71
+ <TooltipPrimitive.Portal>
72
+ <TooltipPrimitive.Content
73
+ ref={ref}
74
+ sideOffset={sideOffset}
75
+ className={cn(tooltipContentVariants({ variant }), className)}
76
+ {...props}
77
+ >
78
+ {children}
79
+ {arrow ? (
80
+ <TooltipPrimitive.Arrow
81
+ className={arrowFillByVariant[variant ?? 'default']}
82
+ width={8}
83
+ height={4}
84
+ />
85
+ ) : null}
86
+ </TooltipPrimitive.Content>
87
+ </TooltipPrimitive.Portal>
88
+ ),
89
+ );
40
90
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
41
91
 
42
92
  // ─── Convenience wrapper(antd-style 一行调用)──────────────────────────────
@@ -52,6 +102,14 @@ export interface TooltipProps
52
102
  title: React.ReactNode;
53
103
  /** 弹出方向。 @default "top" */
54
104
  side?: 'top' | 'right' | 'bottom' | 'left';
105
+ /**
106
+ * 视觉变体:
107
+ * - `default`:深色背景 + 浅色文字(信息密度高、对比强,适合图标按钮 / 列截断提示)
108
+ * - `light`:浅色背景 + 深色文字 + 边框 + 阴影(视觉更轻,贴近富内容卡片调性,
109
+ * 对齐 cloud-design Balloon `type="primary"`)
110
+ * @default "default"
111
+ */
112
+ variant?: 'default' | 'light';
55
113
  /** 是否显示三角形箭头。 @default true */
56
114
  arrow?: boolean;
57
115
  /** 显示延迟(ms),默认沿用 Provider 的 delayDuration。 */
@@ -64,6 +122,7 @@ const Tooltip: React.FC<TooltipProps> = ({
64
122
  children,
65
123
  title,
66
124
  side = 'top',
125
+ variant = 'default',
67
126
  arrow = true,
68
127
  delayDuration,
69
128
  withProvider = false,
@@ -72,7 +131,7 @@ const Tooltip: React.FC<TooltipProps> = ({
72
131
  const inner = (
73
132
  <TooltipRoot delayDuration={delayDuration} {...rootProps}>
74
133
  <TooltipTrigger asChild>{children}</TooltipTrigger>
75
- <TooltipContent side={side} arrow={arrow}>
134
+ <TooltipContent side={side} variant={variant} arrow={arrow}>
76
135
  {title}
77
136
  </TooltipContent>
78
137
  </TooltipRoot>
@@ -90,4 +149,5 @@ export {
90
149
  TooltipRoot,
91
150
  TooltipTrigger,
92
151
  TooltipContent,
152
+ tooltipContentVariants,
93
153
  };
@@ -2,7 +2,7 @@
2
2
  id: tour
3
3
  name: Tour
4
4
  type: component
5
- category: feedback
5
+ category: deprecated
6
6
  since: 0.1.0
7
7
  package: '@teamix-evo/ui'
8
8
  displayName: 新手引导
@@ -28,33 +28,30 @@ displayName: 新手引导
28
28
  ## Props
29
29
 
30
30
  <!-- auto:props:begin -->
31
-
32
- | 名称 | 类型 | 默认值 | 必填 | 说明 |
33
- | -------------- | --------------------------- | ------- | ---- | -------------------------------------- |
34
- | `steps` | `TourStep[]` | – | | 步骤列表(antd `steps` 并集)。 |
35
- | `open` | `boolean` | | – | 受控 open 状态。 |
36
- | `defaultOpen` | `boolean` | `false` | – | uncontrolled 初值。 |
37
- | `onOpenChange` | `(open: boolean) => void` | – | | open 变化回调。 |
38
- | `current` | `number` | – | – | 当前步骤索引(受控)。 |
39
- | `onChange` | `(current: number) => void` | – | – | 步骤变化回调。 |
40
- | `onFinish` | `() => void` | – | – | 完成时回调(走到最后一步且点击"完成")。 |
41
- | `onClose` | `() => void` | – | | 关闭回调(任意时刻点 X / mask)。 |
42
- | `mask` | `boolean` | `true` | – | 是否显示遮罩(antd `mask` 并集)。 |
43
-
31
+ | 名称 | 类型 | 默认值 | 必填 | 说明 |
32
+ | --- | --- | --- | --- | --- |
33
+ | `steps` | `TourStep[]` | | | 步骤列表(antd `steps` 并集)。 |
34
+ | `open` | `boolean` | – | | 受控 open 状态。 |
35
+ | `defaultOpen` | `boolean` | `false` | – | uncontrolled 初值。 |
36
+ | `onOpenChange` | `(open: boolean) => void` | | – | open 变化回调。 |
37
+ | `current` | `number` | | – | 当前步骤索引(受控)。 |
38
+ | `onChange` | `(current: number) => void` | – | – | 步骤变化回调。 |
39
+ | `onFinish` | `() => void` | – | – | 完成时回调(走到最后一步且点击"完成")。 |
40
+ | `onClose` | `() => void` | – | – | 关闭回调(任意时刻点 X / mask)。 |
41
+ | `mask` | `boolean` | `true` | – | 是否显示遮罩(antd `mask` 并集)。 |
44
42
  <!-- auto:props:end -->
45
43
 
46
44
  ## 依赖
47
45
 
48
46
  <!-- auto:deps:begin -->
49
-
50
47
  ### 同库依赖
51
48
 
52
49
  > `teamix-evo ui add tour` 时,以下 entry 会被自动连带安装(无需手动 add)。
53
50
 
54
- | Entry | 类型 | 描述 |
55
- | -------- | --------- | --------------------------------------------------------------------------------------- |
56
- | `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
57
- | `button` | component | 通用按钮 — shadcn 实现 + antd 功能扩展(loading / icon / shape / block / dashed variant) |
51
+ | Entry | 类型 | 描述 |
52
+ | --- | --- | --- |
53
+ | `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
54
+ | `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
58
55
 
59
56
  ### npm 依赖
60
57
 
@@ -63,7 +60,6 @@ displayName: 新手引导
63
60
  ```bash
64
61
  pnpm add lucide-react@^0.460.0
65
62
  ```
66
-
67
63
  <!-- auto:deps:end -->
68
64
 
69
65
  ## AI 生成纪律
@@ -1,17 +1,17 @@
1
1
  import * as React from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
3
  import { Tour } from './tour';
4
4
  import { Button } from '@/components/button/button';
5
5
 
6
6
  const meta: Meta<typeof Tour> = {
7
- title: '反馈与浮层 · Feedback/Tour',
7
+ title: '废弃 · Deprecated/Tour',
8
8
  component: Tour,
9
9
  tags: ['autodocs'],
10
10
  parameters: {
11
11
  docs: {
12
12
  description: {
13
13
  component:
14
- '新手引导 — 多步骤 spotlight + 卡片 + 步进按钮。帮助新用户首次进入页面时了解关键功能位置。等价 antd `Tour`(v5.0+)。业务侧自管“是否首次访问”。',
14
+ '⚠️ **已废弃** — 仅 Storybook 留档,不通过 manifest 对外发布。\n\n新手引导 — 多步骤 spotlight + 卡片 + 步进按钮。帮助新用户首次进入页面时了解关键功能位置。等价 antd `Tour`(v5.0+)。业务侧自管“是否首次访问”。',
15
15
  },
16
16
  },
17
17
  },
@@ -188,7 +188,7 @@ const Tour: React.FC<TourProps> = ({
188
188
  <div
189
189
  role="dialog"
190
190
  className={cn(
191
- 'absolute w-80 rounded-md border bg-popover p-4 text-popover-foreground shadow-xl',
191
+ 'absolute w-80 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-xl',
192
192
  )}
193
193
  style={cardStyle}
194
194
  >
@@ -198,13 +198,13 @@ const Tour: React.FC<TourProps> = ({
198
198
  type="button"
199
199
  aria-label="关闭"
200
200
  onClick={close}
201
- className="text-muted-foreground transition-colors hover:text-foreground"
201
+ className="cursor-pointer text-muted-foreground transition-colors hover:text-foreground"
202
202
  >
203
203
  <X className="size-4" />
204
204
  </button>
205
205
  </div>
206
206
  {cur.description ? (
207
- <div className="mt-2 text-sm text-muted-foreground">
207
+ <div className="mt-2 text-xs text-muted-foreground">
208
208
  {cur.description}
209
209
  </div>
210
210
  ) : null}
@@ -3,7 +3,7 @@ id: transfer
3
3
  name: Transfer
4
4
  displayName: 穿梭框
5
5
  type: component
6
- category: data-display
6
+ category: data-entry
7
7
  since: 0.1.0
8
8
  package: '@teamix-evo/ui'
9
9
  ---
@@ -26,35 +26,32 @@ package: '@teamix-evo/ui'
26
26
  ## Props
27
27
 
28
28
  <!-- auto:props:begin -->
29
-
30
- | 名称 | 类型 | 默认值 | 必填 | 说明 |
31
- | ------------ | ----------------------------------------- | ---------------- | ---- | ------------------------------------------------------------ |
32
- | `dataSource` | `TransferItem[]` | – | ✓ | 全部数据源(左+右合集)。 |
33
- | `targetKeys` | `string[]` | – | | 受控:已"穿梭到右侧"的 key 集合(antd `targetKeys` 并集)。 |
34
- | `onChange` | `(next: string[]) => void` | – | | 右侧集合变化回调。 |
35
- | `titles` | `[React.ReactNode, React.ReactNode]` | `["源", "目标"]` | – | 两侧标题(antd `titles` 并集) — `[左, 右]`。 |
36
- | `showSearch` | `boolean` | `false` | – | 启用搜索(antd `showSearch` 并集) — 两侧各一个输入框。 |
37
- | `render` | `(item: TransferItem) => React.ReactNode` | – | – | 自定义渲染单项(antd `render` 并集) — 默认渲染 `item.title`。 |
38
- | `disabled` | `boolean` | | – | 整体禁用。 |
39
- | `listHeight` | `number` | `280` | – | 单侧高度(像素)。 |
40
- | `className` | `string` | – | – | – |
41
-
29
+ | 名称 | 类型 | 默认值 | 必填 | 说明 |
30
+ | --- | --- | --- | --- | --- |
31
+ | `dataSource` | `TransferItem[]` | | | 全部数据源(左+右合集)。 |
32
+ | `targetKeys` | `string[]` | – | ✓ | 受控:已"穿梭到右侧"的 key 集合(antd `targetKeys` 并集)。 |
33
+ | `onChange` | `(next: string[]) => void` | – | | 右侧集合变化回调。 |
34
+ | `titles` | `[React.ReactNode, React.ReactNode]` | `["源", "目标"]` | – | 两侧标题(antd `titles` 并集) — `[左, 右]`。 |
35
+ | `showSearch` | `boolean` | `false` | – | 启用搜索(antd `showSearch` 并集) — 两侧各一个输入框。 |
36
+ | `render` | `(item: TransferItem) => React.ReactNode` | | – | 自定义渲染单项(antd `render` 并集) — 默认渲染 `item.title`。 |
37
+ | `disabled` | `boolean` | – | – | 整体禁用。 |
38
+ | `listHeight` | `number` | `280` | – | 单侧高度(像素)。 |
39
+ | `className` | `string` | | – | |
42
40
  <!-- auto:props:end -->
43
41
 
44
42
  ## 依赖
45
43
 
46
44
  <!-- auto:deps:begin -->
47
-
48
45
  ### 同库依赖
49
46
 
50
47
  > `teamix-evo ui add transfer` 时,以下 entry 会被自动连带安装(无需手动 add)。
51
48
 
52
- | Entry | 类型 | 描述 |
53
- | ---------- | --------- | ----------------------------------------------------------------------------------------------- |
54
- | `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
55
- | `button` | component | 通用按钮 — shadcn 实现 + antd 功能扩展(loading / icon / shape / block / dashed variant) |
56
- | `checkbox` | component | 复选框 — Radix Checkbox(原生 indeterminate)+ antd Checkbox.Group(options 数组驱动) |
57
- | `input` | component | 文本输入shadcn 简洁基底 + antd prefix/suffix/clearable/showCount/addonBefore/addonAfter/size |
49
+ | Entry | 类型 | 描述 |
50
+ | --- | --- | --- |
51
+ | `cn` | util | Tailwind className 合并工具(clsx + tailwind-merge) |
52
+ | `button` | component | 通用按钮 — shadcn 实现 + cloud-design 能力并集(loading / icon / shape / block / dashed variant / color 语义双 prop / disabledTooltip)。同文件合一导出 ButtonGroup + ButtonGroupText(等价 antd Space.Compact + cd SplitButton)。 |
53
+ | `checkbox` | component | 复选框 — Radix Checkbox(原生 indeterminate)+ antd Checkbox.Group(options 数组驱动) |
54
+ | `input` | component | 单行文本输入clearable / showCount / size(sm 24 / md 32 / lg 36,与 Button 同档)/ error 四档内建能力。前缀/后缀/addon 等复合形态已拆出独立 InputGroup;多行已拆出独立 Textarea |
58
55
 
59
56
  ### npm 依赖
60
57
 
@@ -63,7 +60,6 @@ package: '@teamix-evo/ui'
63
60
  ```bash
64
61
  pnpm add lucide-react@^0.460.0
65
62
  ```
66
-
67
63
  <!-- auto:deps:end -->
68
64
 
69
65
  ## AI 生成纪律
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react';
2
+ import type { Meta, StoryObj } from '@storybook/react-vite';
3
3
  import { Transfer, type TransferItem } from './transfer';
4
4
 
5
5
  const meta: Meta<typeof Transfer> = {
6
- title: '数据展示 · Data Display/Transfer',
6
+ title: '数据录入 · Data Entry/Transfer',
7
7
  component: Transfer,
8
8
  tags: ['autodocs'],
9
9
  parameters: {
@@ -120,33 +120,39 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
120
120
  query: string,
121
121
  setQuery: (v: string) => void,
122
122
  ) => {
123
- const selectableKeys = visible.filter((i) => !i.disabled).map((i) => i.key);
123
+ const selectableKeys = visible
124
+ .filter((i) => !i.disabled)
125
+ .map((i) => i.key);
124
126
  const allChecked =
125
- selectableKeys.length > 0 && selectableKeys.every((k) => checked.includes(k));
127
+ selectableKeys.length > 0 &&
128
+ selectableKeys.every((k) => checked.includes(k));
126
129
  const someChecked =
127
130
  !allChecked && selectableKeys.some((k) => checked.includes(k));
128
131
  const toggleAll = (value: boolean) => {
129
- if (value) setChecked(Array.from(new Set([...checked, ...selectableKeys])));
132
+ if (value)
133
+ setChecked(Array.from(new Set([...checked, ...selectableKeys])));
130
134
  else setChecked(checked.filter((k) => !selectableKeys.includes(k)));
131
135
  };
132
136
 
133
137
  return (
134
- <div className="flex w-56 flex-col overflow-hidden rounded-md border bg-card text-sm">
135
- <div className="flex items-center justify-between gap-2 border-b px-3 py-2">
138
+ <div className="flex w-56 flex-col overflow-hidden rounded-md border border-border bg-card text-xs">
139
+ <div className="flex items-center justify-between gap-2 border-b border-b-border bg-muted/40 px-3 py-2">
136
140
  <label className="flex items-center gap-2">
137
141
  <Checkbox
138
- checked={allChecked ? true : someChecked ? 'indeterminate' : false}
142
+ checked={
143
+ allChecked ? true : someChecked ? 'indeterminate' : false
144
+ }
139
145
  disabled={disabled || selectableKeys.length === 0}
140
146
  onCheckedChange={(c) => toggleAll(c === true)}
141
147
  />
142
- <span className="text-xs text-muted-foreground">
148
+ <span className="text-xs text-muted-foreground tabular-nums">
143
149
  {checked.length}/{items.length}
144
150
  </span>
145
151
  </label>
146
- <span className="text-xs font-medium">{title}</span>
152
+ <span className="text-xs font-medium text-foreground">{title}</span>
147
153
  </div>
148
154
  {showSearch ? (
149
- <div className="border-b p-2">
155
+ <div className="border-b border-b-border p-2">
150
156
  <div className="relative">
151
157
  <Search className="absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" />
152
158
  <Input
@@ -175,8 +181,9 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
175
181
  <li key={item.key}>
176
182
  <label
177
183
  className={cn(
178
- 'flex items-center gap-2 px-3 py-1.5',
179
- !itemDisabled && 'cursor-pointer hover:bg-accent',
184
+ 'flex items-center gap-2 px-3 py-1.5 transition-colors',
185
+ !itemDisabled && 'cursor-pointer hover:bg-accent/50',
186
+ !itemDisabled && isChecked && 'bg-accent/40',
180
187
  itemDisabled && 'cursor-not-allowed opacity-50',
181
188
  )}
182
189
  >
@@ -185,7 +192,8 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
185
192
  disabled={itemDisabled}
186
193
  onCheckedChange={(c) => {
187
194
  if (c === true) setChecked([...checked, item.key]);
188
- else setChecked(checked.filter((k) => k !== item.key));
195
+ else
196
+ setChecked(checked.filter((k) => k !== item.key));
189
197
  }}
190
198
  />
191
199
  <span className="min-w-0 flex-1 truncate">
@@ -202,10 +210,7 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
202
210
  };
203
211
 
204
212
  return (
205
- <div
206
- ref={ref}
207
- className={cn('flex items-center gap-3', className)}
208
- >
213
+ <div ref={ref} className={cn('flex items-center gap-3', className)}>
209
214
  {renderPane(
210
215
  titles[0],
211
216
  leftItems,
@@ -215,22 +220,24 @@ const Transfer = React.forwardRef<HTMLDivElement, TransferProps>(
215
220
  leftQuery,
216
221
  setLeftQuery,
217
222
  )}
218
- <div className="flex flex-col gap-2">
223
+ <div className="flex flex-col gap-1.5">
219
224
  <Button
220
- size="icon"
225
+ size="sm"
221
226
  variant="outline"
222
227
  disabled={disabled || leftChecked.length === 0}
223
228
  onClick={moveRight}
224
229
  aria-label="移动到右侧"
225
- icon={<ChevronRight />}
230
+ className="size-7 p-0"
231
+ icon={<ChevronRight className="size-3.5" />}
226
232
  />
227
233
  <Button
228
- size="icon"
234
+ size="sm"
229
235
  variant="outline"
230
236
  disabled={disabled || rightChecked.length === 0}
231
237
  onClick={moveLeft}
232
238
  aria-label="移动到左侧"
233
- icon={<ChevronLeft />}
239
+ className="size-7 p-0"
240
+ icon={<ChevronLeft className="size-3.5" />}
234
241
  />
235
242
  </div>
236
243
  {renderPane(