@teamix-evo/ui 0.1.1

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 (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +336 -0
  3. package/_data.json +12 -0
  4. package/manifest.json +1688 -0
  5. package/package.json +90 -0
  6. package/src/components/accordion/accordion.meta.md +87 -0
  7. package/src/components/accordion/accordion.stories.tsx +67 -0
  8. package/src/components/accordion/accordion.tsx +58 -0
  9. package/src/components/affix/affix.meta.md +80 -0
  10. package/src/components/affix/affix.stories.tsx +57 -0
  11. package/src/components/affix/affix.tsx +97 -0
  12. package/src/components/alert/alert.meta.md +101 -0
  13. package/src/components/alert/alert.stories.tsx +93 -0
  14. package/src/components/alert/alert.tsx +132 -0
  15. package/src/components/alert-dialog/alert-dialog.meta.md +107 -0
  16. package/src/components/alert-dialog/alert-dialog.stories.tsx +81 -0
  17. package/src/components/alert-dialog/alert-dialog.tsx +136 -0
  18. package/src/components/anchor/anchor.meta.md +87 -0
  19. package/src/components/anchor/anchor.stories.tsx +74 -0
  20. package/src/components/anchor/anchor.tsx +130 -0
  21. package/src/components/app/app.meta.md +86 -0
  22. package/src/components/app/app.stories.tsx +62 -0
  23. package/src/components/app/app.tsx +58 -0
  24. package/src/components/aspect-ratio/aspect-ratio.meta.md +81 -0
  25. package/src/components/aspect-ratio/aspect-ratio.stories.tsx +59 -0
  26. package/src/components/aspect-ratio/aspect-ratio.tsx +22 -0
  27. package/src/components/auto-complete/auto-complete.meta.md +102 -0
  28. package/src/components/auto-complete/auto-complete.stories.tsx +93 -0
  29. package/src/components/auto-complete/auto-complete.tsx +205 -0
  30. package/src/components/avatar/avatar.meta.md +94 -0
  31. package/src/components/avatar/avatar.stories.tsx +80 -0
  32. package/src/components/avatar/avatar.tsx +126 -0
  33. package/src/components/badge/badge.meta.md +119 -0
  34. package/src/components/badge/badge.stories.tsx +153 -0
  35. package/src/components/badge/badge.tsx +210 -0
  36. package/src/components/breadcrumb/breadcrumb.meta.md +107 -0
  37. package/src/components/breadcrumb/breadcrumb.stories.tsx +84 -0
  38. package/src/components/breadcrumb/breadcrumb.tsx +122 -0
  39. package/src/components/button/button.meta.md +98 -0
  40. package/src/components/button/button.stories.tsx +235 -0
  41. package/src/components/button/button.tsx +160 -0
  42. package/src/components/button-group/button-group.meta.md +92 -0
  43. package/src/components/button-group/button-group.stories.tsx +90 -0
  44. package/src/components/button-group/button-group.tsx +75 -0
  45. package/src/components/calendar/calendar.meta.md +118 -0
  46. package/src/components/calendar/calendar.stories.tsx +68 -0
  47. package/src/components/calendar/calendar.tsx +107 -0
  48. package/src/components/card/card.meta.md +117 -0
  49. package/src/components/card/card.stories.tsx +112 -0
  50. package/src/components/card/card.tsx +222 -0
  51. package/src/components/carousel/carousel.meta.md +117 -0
  52. package/src/components/carousel/carousel.stories.tsx +84 -0
  53. package/src/components/carousel/carousel.tsx +224 -0
  54. package/src/components/cascader/cascader.meta.md +110 -0
  55. package/src/components/cascader/cascader.stories.tsx +108 -0
  56. package/src/components/cascader/cascader.tsx +198 -0
  57. package/src/components/checkbox/checkbox.meta.md +99 -0
  58. package/src/components/checkbox/checkbox.stories.tsx +130 -0
  59. package/src/components/checkbox/checkbox.tsx +125 -0
  60. package/src/components/collapsible/collapsible.meta.md +80 -0
  61. package/src/components/collapsible/collapsible.stories.tsx +35 -0
  62. package/src/components/collapsible/collapsible.tsx +18 -0
  63. package/src/components/color-picker/color-picker.meta.md +84 -0
  64. package/src/components/color-picker/color-picker.stories.tsx +80 -0
  65. package/src/components/color-picker/color-picker.tsx +160 -0
  66. package/src/components/combobox/combobox.meta.md +93 -0
  67. package/src/components/combobox/combobox.stories.tsx +55 -0
  68. package/src/components/combobox/combobox.tsx +130 -0
  69. package/src/components/command/command.meta.md +104 -0
  70. package/src/components/command/command.stories.tsx +59 -0
  71. package/src/components/command/command.tsx +147 -0
  72. package/src/components/context-menu/context-menu.meta.md +90 -0
  73. package/src/components/context-menu/context-menu.stories.tsx +46 -0
  74. package/src/components/context-menu/context-menu.tsx +191 -0
  75. package/src/components/data-table/data-table.meta.md +149 -0
  76. package/src/components/data-table/data-table.stories.tsx +125 -0
  77. package/src/components/data-table/data-table.tsx +185 -0
  78. package/src/components/date-picker/date-picker.meta.md +106 -0
  79. package/src/components/date-picker/date-picker.stories.tsx +58 -0
  80. package/src/components/date-picker/date-picker.tsx +156 -0
  81. package/src/components/descriptions/descriptions.meta.md +78 -0
  82. package/src/components/descriptions/descriptions.stories.tsx +60 -0
  83. package/src/components/descriptions/descriptions.tsx +129 -0
  84. package/src/components/dialog/dialog.meta.md +105 -0
  85. package/src/components/dialog/dialog.stories.tsx +93 -0
  86. package/src/components/dialog/dialog.tsx +128 -0
  87. package/src/components/drawer/drawer.meta.md +96 -0
  88. package/src/components/drawer/drawer.stories.tsx +54 -0
  89. package/src/components/drawer/drawer.tsx +114 -0
  90. package/src/components/dropdown-menu/dropdown-menu.meta.md +103 -0
  91. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +112 -0
  92. package/src/components/dropdown-menu/dropdown-menu.tsx +195 -0
  93. package/src/components/empty/empty.meta.md +81 -0
  94. package/src/components/empty/empty.stories.tsx +46 -0
  95. package/src/components/empty/empty.tsx +47 -0
  96. package/src/components/field/field.meta.md +116 -0
  97. package/src/components/field/field.stories.tsx +117 -0
  98. package/src/components/field/field.tsx +164 -0
  99. package/src/components/flex/flex.meta.md +94 -0
  100. package/src/components/flex/flex.stories.tsx +112 -0
  101. package/src/components/flex/flex.tsx +122 -0
  102. package/src/components/float-button/float-button.meta.md +87 -0
  103. package/src/components/float-button/float-button.stories.tsx +78 -0
  104. package/src/components/float-button/float-button.tsx +143 -0
  105. package/src/components/form/form.meta.md +131 -0
  106. package/src/components/form/form.stories.tsx +122 -0
  107. package/src/components/form/form.tsx +194 -0
  108. package/src/components/grid/grid.meta.md +87 -0
  109. package/src/components/grid/grid.stories.tsx +99 -0
  110. package/src/components/grid/grid.tsx +130 -0
  111. package/src/components/hover-card/hover-card.meta.md +92 -0
  112. package/src/components/hover-card/hover-card.stories.tsx +68 -0
  113. package/src/components/hover-card/hover-card.tsx +29 -0
  114. package/src/components/image/image.meta.md +94 -0
  115. package/src/components/image/image.stories.tsx +55 -0
  116. package/src/components/image/image.tsx +138 -0
  117. package/src/components/input/input.meta.md +109 -0
  118. package/src/components/input/input.stories.tsx +117 -0
  119. package/src/components/input/input.tsx +213 -0
  120. package/src/components/input-group/input-group.meta.md +92 -0
  121. package/src/components/input-group/input-group.stories.tsx +88 -0
  122. package/src/components/input-group/input-group.tsx +107 -0
  123. package/src/components/input-number/input-number.meta.md +91 -0
  124. package/src/components/input-number/input-number.stories.tsx +87 -0
  125. package/src/components/input-number/input-number.tsx +210 -0
  126. package/src/components/input-otp/input-otp.meta.md +105 -0
  127. package/src/components/input-otp/input-otp.stories.tsx +65 -0
  128. package/src/components/input-otp/input-otp.tsx +97 -0
  129. package/src/components/item/item.meta.md +116 -0
  130. package/src/components/item/item.stories.tsx +113 -0
  131. package/src/components/item/item.tsx +171 -0
  132. package/src/components/kbd/kbd.meta.md +85 -0
  133. package/src/components/kbd/kbd.stories.tsx +70 -0
  134. package/src/components/kbd/kbd.tsx +81 -0
  135. package/src/components/label/label.meta.md +91 -0
  136. package/src/components/label/label.stories.tsx +87 -0
  137. package/src/components/label/label.tsx +66 -0
  138. package/src/components/masonry/masonry.meta.md +85 -0
  139. package/src/components/masonry/masonry.stories.tsx +66 -0
  140. package/src/components/masonry/masonry.tsx +59 -0
  141. package/src/components/mentions/mentions.meta.md +89 -0
  142. package/src/components/mentions/mentions.stories.tsx +75 -0
  143. package/src/components/mentions/mentions.tsx +237 -0
  144. package/src/components/menubar/menubar.meta.md +100 -0
  145. package/src/components/menubar/menubar.stories.tsx +81 -0
  146. package/src/components/menubar/menubar.tsx +232 -0
  147. package/src/components/native-select/native-select.meta.md +88 -0
  148. package/src/components/native-select/native-select.stories.tsx +80 -0
  149. package/src/components/native-select/native-select.tsx +54 -0
  150. package/src/components/navigation-menu/navigation-menu.meta.md +108 -0
  151. package/src/components/navigation-menu/navigation-menu.stories.tsx +112 -0
  152. package/src/components/navigation-menu/navigation-menu.tsx +125 -0
  153. package/src/components/notification/notification.meta.md +91 -0
  154. package/src/components/notification/notification.stories.tsx +96 -0
  155. package/src/components/notification/notification.tsx +84 -0
  156. package/src/components/pagination/pagination.meta.md +127 -0
  157. package/src/components/pagination/pagination.stories.tsx +62 -0
  158. package/src/components/pagination/pagination.tsx +285 -0
  159. package/src/components/popconfirm/popconfirm.meta.md +109 -0
  160. package/src/components/popconfirm/popconfirm.stories.tsx +76 -0
  161. package/src/components/popconfirm/popconfirm.tsx +134 -0
  162. package/src/components/popover/popover.meta.md +97 -0
  163. package/src/components/popover/popover.stories.tsx +82 -0
  164. package/src/components/popover/popover.tsx +55 -0
  165. package/src/components/progress/progress.meta.md +86 -0
  166. package/src/components/progress/progress.stories.tsx +75 -0
  167. package/src/components/progress/progress.tsx +195 -0
  168. package/src/components/radio-group/radio-group.meta.md +103 -0
  169. package/src/components/radio-group/radio-group.stories.tsx +77 -0
  170. package/src/components/radio-group/radio-group.tsx +78 -0
  171. package/src/components/rate/rate.meta.md +87 -0
  172. package/src/components/rate/rate.stories.tsx +81 -0
  173. package/src/components/rate/rate.tsx +153 -0
  174. package/src/components/resizable/resizable.meta.md +92 -0
  175. package/src/components/resizable/resizable.stories.tsx +104 -0
  176. package/src/components/resizable/resizable.tsx +56 -0
  177. package/src/components/result/result.meta.md +90 -0
  178. package/src/components/result/result.stories.tsx +71 -0
  179. package/src/components/result/result.tsx +91 -0
  180. package/src/components/scroll-area/scroll-area.meta.md +84 -0
  181. package/src/components/scroll-area/scroll-area.stories.tsx +41 -0
  182. package/src/components/scroll-area/scroll-area.tsx +51 -0
  183. package/src/components/segmented/segmented.meta.md +103 -0
  184. package/src/components/segmented/segmented.stories.tsx +101 -0
  185. package/src/components/segmented/segmented.tsx +138 -0
  186. package/src/components/select/select.meta.md +110 -0
  187. package/src/components/select/select.stories.tsx +100 -0
  188. package/src/components/select/select.tsx +188 -0
  189. package/src/components/separator/separator.meta.md +74 -0
  190. package/src/components/separator/separator.stories.tsx +71 -0
  191. package/src/components/separator/separator.tsx +104 -0
  192. package/src/components/sheet/sheet.meta.md +97 -0
  193. package/src/components/sheet/sheet.stories.tsx +82 -0
  194. package/src/components/sheet/sheet.tsx +139 -0
  195. package/src/components/sidebar/sidebar.meta.md +131 -0
  196. package/src/components/sidebar/sidebar.stories.tsx +82 -0
  197. package/src/components/sidebar/sidebar.tsx +351 -0
  198. package/src/components/skeleton/skeleton.meta.md +95 -0
  199. package/src/components/skeleton/skeleton.stories.tsx +79 -0
  200. package/src/components/skeleton/skeleton.tsx +144 -0
  201. package/src/components/slider/slider.meta.md +94 -0
  202. package/src/components/slider/slider.stories.tsx +69 -0
  203. package/src/components/slider/slider.tsx +86 -0
  204. package/src/components/sonner/sonner.meta.md +96 -0
  205. package/src/components/sonner/sonner.stories.tsx +91 -0
  206. package/src/components/sonner/sonner.tsx +40 -0
  207. package/src/components/space/space.meta.md +94 -0
  208. package/src/components/space/space.stories.tsx +94 -0
  209. package/src/components/space/space.tsx +106 -0
  210. package/src/components/spinner/spinner.meta.md +76 -0
  211. package/src/components/spinner/spinner.stories.tsx +71 -0
  212. package/src/components/spinner/spinner.tsx +64 -0
  213. package/src/components/statistic/statistic.meta.md +99 -0
  214. package/src/components/statistic/statistic.stories.tsx +71 -0
  215. package/src/components/statistic/statistic.tsx +197 -0
  216. package/src/components/steps/steps.meta.md +102 -0
  217. package/src/components/steps/steps.stories.tsx +75 -0
  218. package/src/components/steps/steps.tsx +170 -0
  219. package/src/components/switch/switch.meta.md +92 -0
  220. package/src/components/switch/switch.stories.tsx +75 -0
  221. package/src/components/switch/switch.tsx +101 -0
  222. package/src/components/table/table.meta.md +95 -0
  223. package/src/components/table/table.stories.tsx +75 -0
  224. package/src/components/table/table.tsx +122 -0
  225. package/src/components/tabs/tabs.meta.md +98 -0
  226. package/src/components/tabs/tabs.stories.tsx +70 -0
  227. package/src/components/tabs/tabs.tsx +119 -0
  228. package/src/components/tag/tag.meta.md +94 -0
  229. package/src/components/tag/tag.stories.tsx +77 -0
  230. package/src/components/tag/tag.tsx +185 -0
  231. package/src/components/textarea/textarea.meta.md +83 -0
  232. package/src/components/textarea/textarea.stories.tsx +63 -0
  233. package/src/components/textarea/textarea.tsx +113 -0
  234. package/src/components/time-picker/time-picker.meta.md +83 -0
  235. package/src/components/time-picker/time-picker.stories.tsx +59 -0
  236. package/src/components/time-picker/time-picker.tsx +94 -0
  237. package/src/components/timeline/timeline.meta.md +102 -0
  238. package/src/components/timeline/timeline.stories.tsx +104 -0
  239. package/src/components/timeline/timeline.tsx +147 -0
  240. package/src/components/toggle/toggle.meta.md +88 -0
  241. package/src/components/toggle/toggle.stories.tsx +66 -0
  242. package/src/components/toggle/toggle.tsx +53 -0
  243. package/src/components/toggle-group/toggle-group.meta.md +90 -0
  244. package/src/components/toggle-group/toggle-group.stories.tsx +83 -0
  245. package/src/components/toggle-group/toggle-group.tsx +78 -0
  246. package/src/components/tooltip/tooltip.meta.md +99 -0
  247. package/src/components/tooltip/tooltip.stories.tsx +71 -0
  248. package/src/components/tooltip/tooltip.tsx +93 -0
  249. package/src/components/tour/tour.meta.md +116 -0
  250. package/src/components/tour/tour.stories.tsx +66 -0
  251. package/src/components/tour/tour.tsx +242 -0
  252. package/src/components/transfer/transfer.meta.md +90 -0
  253. package/src/components/transfer/transfer.stories.tsx +68 -0
  254. package/src/components/transfer/transfer.tsx +251 -0
  255. package/src/components/tree/tree.meta.md +111 -0
  256. package/src/components/tree/tree.stories.tsx +109 -0
  257. package/src/components/tree/tree.tsx +367 -0
  258. package/src/components/tree-select/tree-select.meta.md +100 -0
  259. package/src/components/tree-select/tree-select.stories.tsx +80 -0
  260. package/src/components/tree-select/tree-select.tsx +171 -0
  261. package/src/components/typography/typography.meta.md +102 -0
  262. package/src/components/typography/typography.stories.tsx +115 -0
  263. package/src/components/typography/typography.tsx +245 -0
  264. package/src/components/upload/upload.meta.md +111 -0
  265. package/src/components/upload/upload.stories.tsx +75 -0
  266. package/src/components/upload/upload.tsx +265 -0
  267. package/src/components/watermark/watermark.meta.md +95 -0
  268. package/src/components/watermark/watermark.stories.tsx +78 -0
  269. package/src/components/watermark/watermark.tsx +165 -0
  270. package/src/utils/cn.ts +6 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Teamix Evo Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,336 @@
1
+ # @teamix-evo/ui
2
+
3
+ Source-injected UI components for Teamix Evo. Based on shadcn/ui, extended with antd-level capabilities (`loading` / `icon` / `shape` / `block` / `dashed` variant). Components are written as ready-to-use React source code; users install components via `teamix-evo ui add <id>`, the source is written to their project, and they own the code.
4
+
5
+ > **🤖 Working on this package?** Read [`AGENTS.md`](./AGENTS.md) (and [`CLAUDE.md`](./CLAUDE.md)) before adding or changing components. They lay out the design-philosophy references (`@teamix-evo/design`'s OpenTrek system), the AI compliance checklist, and the ui-side engineering constraints. New components MUST follow that guide.
6
+
7
+ ## Architecture
8
+
9
+ - **Source injection**: components ship as `.tsx` files, not as a runtime library. `npx teamix-evo ui add button` copies `button.tsx` into the user project under `aliases.components`.
10
+ - **First consumer of `@teamix-evo/design`**: the dev server imports OpenTrek tokens directly from the design package (`dev/index.css`), so components are previewed against the SAME tokens that ship to consumers — no mock values, single source of truth.
11
+ - **No variant**: brand differences are absorbed by `@teamix-evo/design` tokens (CSS variables). One UI package serves all design variants.
12
+ - **className contract**: components write `className="bg-primary"` (Tailwind v4 utility), which resolves to `var(--color-primary)` in v4 mode or `hsl(var(--primary))` in v3 mode. Semantic token names (`primary`, `destructive`, `muted`, ...) align with shadcn — see `@teamix-evo/design` for the token layer.
13
+ - **Imports**: source files use placeholder paths like `@/utils/cn`. The CLI rewrites these to user-configured aliases (e.g. `@/lib/utils`) at install time.
14
+ - **`updateStrategy: frozen`** is the default — once installed, the CLI never overwrites the file. Upgrades go through an AI + skill flow (v0.3, see PLAN §10.9).
15
+
16
+ ## Package layout
17
+
18
+ ```text
19
+ packages/ui/
20
+ ├── manifest.json # UiPackageManifest (flat entries, no variant)
21
+ ├── _data.json # Package-level metadata (default iconLibrary, aliases)
22
+ ├── tsconfig.json
23
+ ├── vite.config.ts # alias plugin (auto-picked by Storybook react-vite)
24
+ ├── .storybook/ # Storybook 8 config + globals.css importing design tokens
25
+ │ ├── main.ts
26
+ │ ├── preview.ts
27
+ │ └── globals.css
28
+ ├── scripts/
29
+ │ ├── validate-entries.ts
30
+ │ └── generate-meta.ts # ts-morph → Props table inside meta.md marker region
31
+ └── src/
32
+ ├── components/
33
+ │ └── button/
34
+ │ ├── button.tsx
35
+ │ ├── button.meta.md # AI-readable component intro (Props auto-generated)
36
+ │ └── button.stories.tsx (CSF 3.0)
37
+ └── utils/
38
+ └── cn.ts
39
+ ```
40
+
41
+ ## Scripts
42
+
43
+ - `pnpm validate` — schema check + source path existence + dependency-graph soundness
44
+ - `pnpm typecheck` — `tsc --noEmit` over `src` and `.storybook`
45
+ - `pnpm storybook` — open Storybook 8 dev server (auto-loads OpenTrek tokens via `.storybook/globals.css`)
46
+ - `pnpm build-storybook` — produce static docs site under `storybook-static/`
47
+ - `pnpm gen:meta` — regenerate `<id>.meta.md` Props tables from source JSDoc (ts-morph)
48
+ - `pnpm gen:check` — verify meta tables are in sync (used in CI)
49
+
50
+ ## Adding a new entry
51
+
52
+ 1. Create the source file(s) under `src/components/<id>/` (or `src/hooks/`, `src/utils/`, ...)
53
+ 2. Append an entry to `manifest.json` with `id`, `type`, `files[]`, `meta?`, `registryDependencies?`, `dependencies?`
54
+ 3. Run `pnpm validate`
55
+
56
+ Each component should ship a `<id>.meta.md` (frontmatter + Markdown). On install the CLI drops it at `.teamix-evo/design/components/<id>.meta.md`, where the design package's ai-rules can read it.
57
+
58
+ ---
59
+
60
+ ## Component Matrix (89 entries · 88 components + 1 util)
61
+
62
+ > 2026-05-16 校准 `manifest.json`,覆盖 **shadcn 60 件 ∪ antd v6 60 件** 的高频与中频集。
63
+ >
64
+ > **来源标记**:
65
+ >
66
+ > - **🅢** shadcn 原生 / shadcn 2025-10 新增原子(antd 体系无对应或仅有装饰对应)
67
+ > - **🅐** antd 独有补足(shadcn 体系无)
68
+ > - **🅢🅐** 两边都有,本库交付**功能并集**(能力 = shadcn ∪ antd)
69
+
70
+ ### 1. 基础原语 / Foundation(13 件)
71
+
72
+ 零依赖或仅依赖 `cn`,被后续大量组件依赖。
73
+
74
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
75
+ | --- | --- | --- | --- | --- |
76
+ | [cn](src/utils/cn.ts) | 类名合并工具 | cn | util | clsx + tailwind-merge,所有组件的 className 合并基础 |
77
+ | [button](src/components/button/) | 按钮 | Button | 🅢🅐 | shadcn Button + antd `loading` / `icon` / `shape` / `block` / `dashed` variant |
78
+ | [label](src/components/label/) | 表单标签 | Label | 🅢 | Radix Label,补 `required` / `disabled` 显式视觉(对齐 antd Form.Item label 部分) |
79
+ | [badge](src/components/badge/) | 徽标 | Badge | 🅢🅐 | 四种形态:文本徽标 / 数字气泡 / 红点 / 状态点(对齐 antd Badge) |
80
+ | [separator](src/components/separator/) | 分隔线 | Separator | 🅢🅐 | shadcn Separator + antd Divider 的 `dashed` / 中间装饰文本 |
81
+ | [skeleton](src/components/skeleton/) | 骨架屏 | Skeleton | 🅢🅐 | shadcn pulse + antd Avatar/Image/Button/Input/Paragraph 子家族 |
82
+ | [avatar](src/components/avatar/) | 头像 | Avatar | 🅢🅐 | Radix Avatar + antd `size` / `shape` / `Avatar.Group` |
83
+ | [progress](src/components/progress/) | 进度条 | Progress | 🅢🅐 | 线形 + 配套 `ProgressCircle` 环形(对齐 antd Progress) |
84
+ | [spinner](src/components/spinner/) | 加载指示器 | Spinner | 🅢🅐 | shadcn 2025-10 新增;4 档尺寸 + 4 档语义色(对齐 antd Spin 无遮罩版) |
85
+ | [kbd](src/components/kbd/) | 键位 | Kbd | 🅢 | shadcn 2025-10 新增;`Kbd` + `KbdGroup` 标注快捷键(antd 体系无) |
86
+ | [aspect-ratio](src/components/aspect-ratio/) | 等比容器 | AspectRatio | 🅢 | Radix AspectRatio,无 layout shift(antd 体系无) |
87
+ | [image](src/components/image/) | 图片 | Image | 🅐 | 自动加载占位 + 失败占位 + 点击预览(对齐 antd Image) |
88
+ | [tag](src/components/tag/) | 标签 | Tag | 🅐 | 关键词标签 + `closable` + 6 种语义色 + `CheckableTag(Group)`(对齐 antd Tag v6) |
89
+
90
+ ### 2. 布局与容器 / Layout & Container(9 件)
91
+
92
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
93
+ | --- | --- | --- | --- | --- |
94
+ | [space](src/components/space/) | 间距 | Space | 🅐 | 子项间距 / 对齐 / 换行 / split(对齐 antd Space) |
95
+ | [flex](src/components/flex/) | 弹性布局 | Flex | 🅐 | Tailwind flex 的语义封装,支持 `as` 语义标签(对齐 antd Flex v5.10+) |
96
+ | [grid](src/components/grid/) | 栅格 | Grid (Row + Col) | 🅐 | 24 栅格,CSS Grid 实现(对齐 antd Row + Col) |
97
+ | [masonry](src/components/masonry/) | 瀑布流 | Masonry | 🅐 | CSS column-count 0 JS 实现(对齐 antd Masonry v6.0) |
98
+ | [scroll-area](src/components/scroll-area/) | 滚动容器 | ScrollArea | 🅢 | Radix ScrollArea,跨浏览器一致滚动条(antd 体系无) |
99
+ | [resizable](src/components/resizable/) | 可拖拽分栏 | Resizable | 🅢🅐 | react-resizable-panels,VS Code / Figma 风格(对齐 antd Splitter v5.21+) |
100
+ | [card](src/components/card/) | 卡片 | Card | 🅢🅐 | + `hoverable` / `loading` / `Cover` / `Actions` / `Meta` / `CardAction`(2026-04 shadcn 新增子组件) |
101
+ | [item](src/components/item/) | 列表项 | Item | 🅢 | shadcn 2025-10 新增;5 槽 Media/Content/Title/Description/Actions + ItemGroup(替代旧 List.Item) |
102
+ | [descriptions](src/components/descriptions/) | 描述列表 | Descriptions | 🅐 | 键值对详情,items 数组驱动,bordered / span(对齐 antd Descriptions) |
103
+
104
+ ### 3. 表单与输入 / Form & Input(28 件)
105
+
106
+ #### 3.1 表单组装
107
+
108
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
109
+ | --- | --- | --- | --- | --- |
110
+ | [form](src/components/form/) | 表单 | Form | 🅢🅐 | react-hook-form + zod + shadcn 7 件套(对齐 antd Form) |
111
+ | [field](src/components/field/) | 字段抽象 | Field | 🅢 | shadcn 2025-10 新增;7 槽,可搭任何状态管理(对齐 antd Form.Item 的解耦版) |
112
+ | [input-group](src/components/input-group/) | 输入框组 | InputGroup | 🅢 | shadcn 2025-10 新增;复合插槽(对齐 antd Input 的 prefix/suffix/addon 集合) |
113
+ | [button-group](src/components/button-group/) | 按钮组 | ButtonGroup | 🅢🅐 | shadcn 2025-10 新增;Split Button / Toolbar(对齐 antd Space.Compact v6) |
114
+
115
+ #### 3.2 文本类输入
116
+
117
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
118
+ | --- | --- | --- | --- | --- |
119
+ | [input](src/components/input/) | 输入框 | Input | 🅢🅐 | + `prefix` / `suffix` / `clearable` / `showCount` / `addonBefore/After`(对齐 antd Input) |
120
+ | [textarea](src/components/textarea/) | 多行文本框 | Textarea | 🅢🅐 | + `autoSize` / `showCount`(对齐 antd Input.TextArea) |
121
+ | [input-number](src/components/input-number/) | 数字输入框 | InputNumber | 🅐 | 步进 + min/max 夹紧 + precision + 千分位 + null 空状态(对齐 antd InputNumber) |
122
+ | [input-otp](src/components/input-otp/) | 验证码输入 | InputOTP | 🅢🅐 | input-otp 库封装,登录 / 二步验证 / PIN(对齐 antd Input.OTP v5.21+) |
123
+ | [mentions](src/components/mentions/) | @ 提及输入 | Mentions | 🅐 | Textarea + @ 触发候选下拉,异步 onSearch(对齐 antd Mentions) |
124
+
125
+ #### 3.3 选择类(下拉 / 单选 / 多选)
126
+
127
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
128
+ | --- | --- | --- | --- | --- |
129
+ | [select](src/components/select/) | 选择器 | Select | 🅢🅐 | Radix Select(对齐 antd Select 单选) |
130
+ | [native-select](src/components/native-select/) | 原生选择器 | NativeSelect | 🅢 | shadcn 2025-10 新增;原生 `<select>`,移动端 / SSR 友好(antd 体系无) |
131
+ | [combobox](src/components/combobox/) | 可搜索选择器 | Combobox | 🅢 | Command + Popover,必选(value ∈ options)(对齐 antd Select showSearch) |
132
+ | [auto-complete](src/components/auto-complete/) | 自动完成 | AutoComplete | 🅐 | 自由输入 + 候选建议(value 可任意 string)(对齐 antd AutoComplete) |
133
+ | [cascader](src/components/cascader/) | 级联选择 | Cascader | 🅐 | 多级联动,叶子触发 / 中途可选(对齐 antd Cascader) |
134
+ | [tree-select](src/components/tree-select/) | 树形选择 | TreeSelect | 🅐 | Tree 嵌入 Popover,单选 / 多选(对齐 antd TreeSelect) |
135
+ | [checkbox](src/components/checkbox/) | 多选框 | Checkbox | 🅢🅐 | Radix 原生 indeterminate + Checkbox.Group(对齐 antd Checkbox) |
136
+ | [radio-group](src/components/radio-group/) | 单选组 | RadioGroup | 🅢🅐 | + `variant=button` 按钮组形态(对齐 antd Radio + Radio.Button) |
137
+ | [switch](src/components/switch/) | 开关 | Switch | 🅢🅐 | + `loading` / `checkedChildren` / `unCheckedChildren`(对齐 antd Switch) |
138
+ | [slider](src/components/slider/) | 滑动输入 | Slider | 🅢🅐 | 原生支持双滑块 + antd marks 刻度(对齐 antd Slider) |
139
+ | [toggle](src/components/toggle/) | 切换按钮 | Toggle | 🅢 | Radix Toggle,工具栏图标级开关(antd 体系无) |
140
+ | [toggle-group](src/components/toggle-group/) | 切换按钮组 | ToggleGroup | 🅢 | type=single \| multiple,与 RadioButton 互补(antd 体系无) |
141
+ | [segmented](src/components/segmented/) | 分段控制 | Segmented | 🅐 | iOS / macOS 风格紧凑互斥单选(对齐 antd Segmented v5.0+) |
142
+
143
+ #### 3.4 日期 / 时间 / 颜色 / 评分 / 文件
144
+
145
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
146
+ | --- | --- | --- | --- | --- |
147
+ | [calendar](src/components/calendar/) | 日历 | Calendar | 🅢🅐 | react-day-picker v9,单 / 多 / 范围(对齐 antd Calendar) |
148
+ | [date-picker](src/components/date-picker/) | 日期选择 | DatePicker | 🅢🅐 | Calendar + Popover 复合(对齐 antd DatePicker + RangePicker) |
149
+ | [time-picker](src/components/time-picker/) | 时间选择 | TimePicker | 🅐 | 原生 input[type=time],SSR safe(对齐 antd TimePicker) |
150
+ | [color-picker](src/components/color-picker/) | 颜色选择 | ColorPicker | 🅐 | 原生 color + alpha + hex + 预设色板(对齐 antd ColorPicker v5.5+) |
151
+ | [rate](src/components/rate/) | 评分 | Rate | 🅐 | 半星 / 清零 / 自定义图标(对齐 antd Rate) |
152
+ | [upload](src/components/upload/) | 上传 | Upload | 🅐 | 点击 + 拖拽双模式,内置 accept / maxCount / maxSize(对齐 antd Upload) |
153
+
154
+ ### 4. 数据展示 / Data Display(8 件)
155
+
156
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
157
+ | --- | --- | --- | --- | --- |
158
+ | [table](src/components/table/) | 基础表格 | Table | 🅢🅐 | 原生 HTML 元素薄包装(视觉骨架,无交互) |
159
+ | [data-table](src/components/data-table/) | 数据表 | DataTable | 🅢🅐 | TanStack Table + Table + SimplePagination(对齐 antd Table 完整) |
160
+ | [carousel](src/components/carousel/) | 轮播 | Carousel | 🅢🅐 | embla-carousel-react,单 / 多 / 循环 / 垂直(对齐 antd Carousel) |
161
+ | [statistic](src/components/statistic/) | 统计数值 | Statistic | 🅐 | KPI 展示 + 趋势 + 千分位 + 精度 + `Timer`(对齐 antd Statistic v5.25) |
162
+ | [tree](src/components/tree/) | 树形控件 | Tree | 🅐 | 递归,可展开 / 选 / 勾选(级联 + 半选)(对齐 antd Tree) |
163
+ | [timeline](src/components/timeline/) | 时间轴 | Timeline | 🅐 | 3 种布局 + 5 种圆点色 + pending 进行中(对齐 antd Timeline) |
164
+ | [typography](src/components/typography/) | 排版 | Title/Paragraph/Text/Link | 🅢🅐 | Prose 容器 + 子组件 + ellipsis/copyable/editable(对齐 antd Typography) |
165
+ | [transfer](src/components/transfer/) | 穿梭框 | Transfer | 🅐 | 双侧 List + 移动,targetKeys 单一真值(对齐 antd Transfer) |
166
+
167
+ ### 5. 反馈与浮层 / Feedback & Overlay(15 件)
168
+
169
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
170
+ | --- | --- | --- | --- | --- |
171
+ | [alert](src/components/alert/) | 警示条 | Alert | 🅢🅐 | + `type` / `showIcon` / `closable` / `banner`(对齐 antd Alert) |
172
+ | [dialog](src/components/dialog/) | 对话框 | Dialog | 🅢🅐 | Radix Dialog;Header / Footer / Title / Description(对齐 antd Modal) |
173
+ | [alert-dialog](src/components/alert-dialog/) | 确认对话框 | AlertDialog | 🅢🅐 | Radix AlertDialog;阻塞式 Action + Cancel(对齐 antd Modal.confirm) |
174
+ | [popconfirm](src/components/popconfirm/) | 气泡确认 | Popconfirm | 🅐 | 轻量确认,onConfirm Promise 自动 loading(对齐 antd Popconfirm) |
175
+ | [popover](src/components/popover/) | 浮层 | Popover | 🅢🅐 | + antd `arrow`(对齐 antd Popover) |
176
+ | [tooltip](src/components/tooltip/) | 文字提示 | Tooltip | 🅢🅐 | + `arrow` / `placement(side)` + 一行 wrapper API(对齐 antd Tooltip) |
177
+ | [hover-card](src/components/hover-card/) | 悬浮卡片 | HoverCard | 🅢 | hover 触发的富内容卡(@user 卡片 / 链接预览)(antd 体系无) |
178
+ | [sheet](src/components/sheet/) | 侧边面板 | Sheet | 🅢🅐 | Radix Dialog + side(对齐 antd Drawer top/right/left) |
179
+ | [drawer](src/components/drawer/) | 抽屉 | Drawer | 🅢 | vaul,iOS 风格底部可拖拽(对齐 antd Drawer placement=bottom 但加拖拽) |
180
+ | [sonner](src/components/sonner/) | 消息提示 | Toaster + toast | 🅢🅐 | sonner 包装;短文字 toast(对齐 antd message) |
181
+ | [notification](src/components/notification/) | 通知卡片 | notification | 🅐 | sonner toast.custom 二次封装;title + description 卡片(对齐 antd Notification) |
182
+ | [result](src/components/result/) | 结果页 | Result | 🅐 | 整页级反馈(成功 / 失败 / 404 / 403 / 500)(对齐 antd Result) |
183
+ | [empty](src/components/empty/) | 空状态 | Empty | 🅐 | 列表 / 表格 / 搜索为空时占位 + extra 行动按钮(对齐 antd Empty) |
184
+ | [tour](src/components/tour/) | 漫游引导 | Tour | 🅐 | 多步骤 spotlight + 卡片 + 步进(对齐 antd Tour v5.0+) |
185
+ | [watermark](src/components/watermark/) | 水印 | Watermark | 🅐 | SVG 平铺水印(前端视觉,不作安全防护)(对齐 antd Watermark v5.1+) |
186
+
187
+ ### 6. 导航 / Navigation(14 件)
188
+
189
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
190
+ | --- | --- | --- | --- | --- |
191
+ | [tabs](src/components/tabs/) | 标签页 | Tabs | 🅢🅐 | Radix Tabs + antd `type(line/card)` + extra(对齐 antd Tabs) |
192
+ | [accordion](src/components/accordion/) | 折叠面板 | Accordion | 🅢🅐 | 单 / 多展开(对齐 antd Collapse 的 accordion 模式) |
193
+ | [collapsible](src/components/collapsible/) | 单区折叠 | Collapsible | 🅢 | 单区域展开收起,Radix 薄包装(antd 体系无独立组件) |
194
+ | [breadcrumb](src/components/breadcrumb/) | 面包屑 | Breadcrumb | 🅢🅐 | + `separator` / `itemRender`(asChild 配路由)(对齐 antd Breadcrumb) |
195
+ | [pagination](src/components/pagination/) | 分页 | SimplePagination | 🅢🅐 | shadcn primitives + 高阶 SimplePagination(对齐 antd Pagination) |
196
+ | [steps](src/components/steps/) | 步骤条 | Steps | 🅐 | 多步流程,状态推导(wait/process/finish/error)(对齐 antd Steps) |
197
+ | [dropdown-menu](src/components/dropdown-menu/) | 下拉菜单 | DropdownMenu | 🅢🅐 | Radix 完整(Item/CheckboxItem/RadioItem/Sub/...)(对齐 antd Dropdown) |
198
+ | [context-menu](src/components/context-menu/) | 右键菜单 | ContextMenu | 🅢 | 与 DropdownMenu 形态一致,触发为右键(antd 体系无) |
199
+ | [menubar](src/components/menubar/) | 菜单栏 | Menubar | 🅢 | 应用顶部菜单栏(macOS 风格)(antd 体系无) |
200
+ | [navigation-menu](src/components/navigation-menu/) | 导航菜单 | NavigationMenu | 🅢 | 网站主导航(富 Content 面板)(antd 体系无独立组件) |
201
+ | [sidebar](src/components/sidebar/) | 侧边栏 | Sidebar | 🅢🅐 | shadcn 复合(Provider + Sidebar + Menu + Trigger)(对齐 antd Layout.Sider + Menu) |
202
+ | [anchor](src/components/anchor/) | 锚点 | Anchor | 🅐 | 长文档侧边锚点,IntersectionObserver 自动高亮(对齐 antd Anchor) |
203
+ | [affix](src/components/affix/) | 固钉 | Affix | 🅐 | 滚动吸顶 / 吸底,保留原占位(对齐 antd Affix) |
204
+ | [float-button](src/components/float-button/) | 悬浮按钮 | FloatButton | 🅐 | 悬浮按钮 + Group + BackTop(对齐 antd FloatButton v5.0,替代旧 BackTop) |
205
+
206
+ ### 7. 应用壳 / Application Shell(2 件)
207
+
208
+ | id | 中文名 | 英文 | 来源 | 关键能力 / antd 对应 |
209
+ | --- | --- | --- | --- | --- |
210
+ | [app](src/components/app/) | 应用容器 | App | 🅐 | 根容器,挂全局 Toaster + dir / lang(不接管主题)(对齐 antd App v5.1+) |
211
+ | [command](src/components/command/) | 命令面板 | Command | 🅢 | cmdk(Linear / Raycast 风格),Combobox 的底座(antd 体系无) |
212
+
213
+ ---
214
+
215
+ ## 功能重合分析
216
+
217
+ **结论:8 处相邻 family 经审视均无可合并项 — 每对组件在语义、API 或运行时上彼此正交。** 以下列出关键 family 与边界:
218
+
219
+ ### 1. Loading 类(3 件)— Spinner / Skeleton / Progress
220
+
221
+ | 组件 | 何时用 | 互斥点 |
222
+ | --- | --- | --- |
223
+ | Spinner | 时长未知、行内 / 占位旋转(请求中、按钮提交) | 不传达进度 |
224
+ | Skeleton | **结构占位**(段落 / 卡片 / 图片骨架),首屏加载时承接最终布局 | 不旋转,语义是"shape 占位"而非"动作中" |
225
+ | Progress | 时长可知(百分比),线形 / 环形 | 数字驱动,不可空 |
226
+
227
+ **不可合并**:三种用户感知的 affordance 完全不同。
228
+
229
+ ### 2. Toast / 通知类(2 件)— sonner / notification
230
+
231
+ | 组件 | 何时用 | 互斥点 |
232
+ | --- | --- | --- |
233
+ | `toast()` (来自 sonner) | 短文字反馈("已保存"/"网络异常重试中") — 对齐 antd `message` | 无标题,单行 |
234
+ | `notification.success(...)` | 标题 + 描述 + 状态图标卡片 — 对齐 antd `Notification` | 多行结构,适合"操作完成详情" |
235
+
236
+ **已共用 sonner runtime**:Notification 内部就是 `sonner.toast.custom`,**已经是同源**,各自 entry 只是给消费方更清晰的 API surface — 实质代码无重复。
237
+
238
+ ### 3. Modal / Overlay 阻塞类(6 件)— Dialog / AlertDialog / Popconfirm / Sheet / Drawer / Tour
239
+
240
+ | 组件 | 何时用 | 互斥点 |
241
+ | --- | --- | --- |
242
+ | Dialog | 通用模态,自由内容 | 中性,需自填语义 |
243
+ | AlertDialog | **不可逆 / 高风险** 二次确认(注销 / 删库) | 强 Action + Cancel,无 X 关闭 |
244
+ | Popconfirm | **低风险** 行内 / 行末轻量确认(删一行 / 忽略一条) | 锚定触发器,不阻塞页面 |
245
+ | Sheet | 侧边滑出,4 方向(antd `Drawer placement`) | 基于 Radix Dialog |
246
+ | Drawer | 底部可拖拽(iOS 风格) | 基于 vaul,**主打移动端** |
247
+ | Tour | 多步引导(spotlight + 步进) | 时间性 + 跨步骤状态 |
248
+
249
+ **Sheet ↔ Drawer 的边界值得详细说明**(下文「合并建议」单列)。
250
+
251
+ ### 4. 透明覆盖层(3 件)— Tooltip / Popover / HoverCard
252
+
253
+ | 组件 | 触发 | 内容 | 互斥点 |
254
+ | --- | --- | --- | --- |
255
+ | Tooltip | hover(延迟) | **纯文本提示** | 不可交互 |
256
+ | Popover | **click** | **可交互复合内容** | 通常带 trigger 按钮 |
257
+ | HoverCard | hover(延迟) | **富 ReactNode**(头像卡 / 链接预览) | 内容静态,可点击但不"激活" |
258
+
259
+ **不可合并**:触发方式 × 交互性 = 4 个象限,3 件覆盖 3 象限(剩 click + 纯文本 = AlertDialog)。
260
+
261
+ ### 5. 选择类下拉(7 件)— Select / NativeSelect / Combobox / AutoComplete / TreeSelect / Cascader / Segmented
262
+
263
+ | 组件 | value 域 | 候选呈现 | 互斥点 |
264
+ | --- | --- | --- | --- |
265
+ | Select | options 之一 | Radix popup | **必选**,无搜索 |
266
+ | NativeSelect | options 之一 | 原生 picker | **0 JS**,SSR / 移动端友好 |
267
+ | Combobox | options 之一 | Command + Popover | **必选 + 搜索** |
268
+ | AutoComplete | **任意字符串** | 自渲下拉 | **可自由输入**,候选是建议 |
269
+ | TreeSelect | options 之一(支持多选) | Tree 嵌入 Popover | **层级结构** |
270
+ | Cascader | 路径数组 | 多列面板 | **级联,每层下钻** |
271
+ | Segmented | options 之一 | inline 按钮组 | **2~5 档紧凑互斥** |
272
+
273
+ **不可合并**:value 形态 × 候选呈现 = 7 个独立场景。
274
+
275
+ ### 6. 互斥单选可视化(4 件)— RadioGroup / Segmented / ToggleGroup(single)/ Tabs
276
+
277
+ | 组件 | 主场景 | 互斥点 |
278
+ | --- | --- | --- |
279
+ | RadioGroup | **表单字段**(性别 / 偏好) | 标准 radio 圆点 |
280
+ | Segmented | **视图切换 / 时段档**(日/周/月) | 紧凑分段,iOS 风格 |
281
+ | ToggleGroup(single) | **工具栏图标按钮**(B/I/U / 左/中/右) | 图标级,可切换 multiple |
282
+ | Tabs | **页面 / 卡片内的切换** | 内容区域跟随切换 |
283
+
284
+ **不可合并**:视觉语义和上下文不同,虽然底层都是"互斥单选"。
285
+
286
+ ### 7. 容器 / 卡片 / 空状态(4 件)— Card / Item / Empty / Result
287
+
288
+ | 组件 | 颗粒度 | 互斥点 |
289
+ | --- | --- | --- |
290
+ | Card | **完整业务卡片**(Header/Cover/Content/Footer/Actions) | 多 section |
291
+ | Item | **列表 / 卡片单元行**(Media + Content + Actions 5 槽) | 嵌入容器使用,取代旧 List.Item |
292
+ | Empty | **空状态占位** | 含插画 + extra 行动按钮 |
293
+ | Result | **整页级反馈**(成功 / 失败 / 404 / 403 / 500) | 占据 viewport,含状态码与建议 |
294
+
295
+ **不可合并**:颗粒度从「单元 → 卡片 → 占位 → 整页」是清晰梯度。
296
+
297
+ ### 8. 表单字段抽象(2 件)— Form / Field
298
+
299
+ | 组件 | 状态管理 | 互斥点 |
300
+ | --- | --- | --- |
301
+ | Form(FormField + FormItem + ...) | **强绑 react-hook-form + zod** | 与 RHF schema 深度耦合 |
302
+ | Field(FieldLabel + FieldError + ...) | **不绑** — 跟 Server Actions / TanStack Form / 原生 form 都能搭 | 仅 UI 抽象 |
303
+
304
+ **不可合并**:Form 是"RHF 流派的快速通道",Field 是"通用 UI 槽"。共存是有意为之。
305
+
306
+ ---
307
+
308
+ ## 合并建议
309
+
310
+ | 候选合并 | 建议 | 理由 |
311
+ | --- | --- | --- |
312
+ | **Sheet ↔ Drawer** | ❌ **保持分离** | Sheet 走 Radix Dialog(轻、4 方向、桌面端);Drawer 走 vaul(重、仅底部、可拖拽手势、iOS 风格)。**两种不同的库 + 不同的 UX 范式**,业务侧按场景选 |
313
+ | **Spinner ↔ Skeleton ↔ Progress** | ❌ **保持分离** | 三种 affordance 互斥(见 §1) |
314
+ | **Tooltip ↔ Popover ↔ HoverCard** | ❌ **保持分离** | 触发 × 交互性 4 象限(见 §4) |
315
+ | **Select ↔ Combobox ↔ AutoComplete** | ❌ **保持分离** | value 域(必选 / 自由) × 是否搜索 = 4 类(见 §5) |
316
+ | **RadioGroup ↔ Segmented ↔ ToggleGroup ↔ Tabs** | ❌ **保持分离** | 视觉语义不同(表单 / 视图切换 / 工具栏 / 页面切换) |
317
+ | **Form ↔ Field** | ❌ **保持分离** | 状态管理绑定差异(见 §8) |
318
+ | **toast() ↔ notification** | ✅ **已合并 runtime** | 都基于 sonner;notification 是 sonner.toast.custom 的二次封装,**已是同源不同表层** |
319
+ | **Pagination ↔ SimplePagination** | ✅ **已合并 entry** | 在同一 `pagination` entry 内导出 shadcn primitives + 高阶 SimplePagination |
320
+ | **Tree ↔ TreeSelect** | ✅ **依赖关系已表达** | TreeSelect 在 `registryDependencies` 中声明 Tree,装 TreeSelect 时 Tree 会被连带装入(无重复源码) |
321
+ | **resizable ↔ Splitter(antd)** | ✅ **已 alias** | resizable description 已标 "等价 antd `Splitter`(v5.21+)" |
322
+
323
+ ### 删除 / 替代记录
324
+
325
+ - ~~**list**~~ — antd v6 已 deprecated(2026-04 PR #54182),官方推荐用 Flex/Grid + Card。**已从本库删除**,通用列表项请用 `Item + ItemGroup`(shadcn 2025-10 新)
326
+ - ~~**Card.Grid**~~ — antd 老 Card 子组件,本库未实现;统一改用 `Grid (Row/Col)` 或 Tailwind grid
327
+ - ~~**Dropdown.Button**~~ — antd v6 已移除,改用 `ButtonGroup` + `DropdownMenu` 组合
328
+
329
+ ### 暂不实现(待用户需求触发)
330
+
331
+ | 组件 | 来源 | 暂缓理由 |
332
+ | --- | --- | --- |
333
+ | Chart | 🅢🅐(shadcn 2026-03 升 Recharts v3 / antd Plot) | 用户指示暂跳过 |
334
+ | QRCode | 🅐(antd v5.1+) | 需引入 `qrcode.react` 依赖,用户暂跳过 |
335
+ | Direction Provider | 🅢(shadcn 2026-01 新) | RTL provider,无业务需求暂缓 |
336
+ | BorderBeam | 🅐(antd v6.4 装饰类) | 装饰组件,优先级低 |
package/_data.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "package": "@teamix-evo/ui",
3
+ "displayName": "Teamix Evo UI",
4
+ "description": "Source-injected UI components — shadcn implementation with antd-level capabilities.",
5
+ "iconLibrary": "lucide",
6
+ "defaultAliases": {
7
+ "components": "src/components/ui",
8
+ "hooks": "src/hooks",
9
+ "utils": "src/lib/utils",
10
+ "lib": "src/lib"
11
+ }
12
+ }