@teamix-evo/ui 0.3.0 → 0.5.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 (520) hide show
  1. package/README.md +46 -50
  2. package/manifest.json +420 -647
  3. package/package.json +15 -34
  4. package/src/_design-system/theme-tokens/stories.tsx +1474 -0
  5. package/src/components/accordion/index.tsx +139 -0
  6. package/src/components/accordion/meta.md +162 -0
  7. package/src/components/accordion/stories.tsx +145 -0
  8. package/src/components/affix/index.tsx +149 -0
  9. package/src/components/affix/meta.md +23 -0
  10. package/src/components/affix/stories.tsx +70 -0
  11. package/src/components/alert/index.tsx +220 -0
  12. package/src/components/alert/meta.md +133 -0
  13. package/src/components/alert/stories.tsx +126 -0
  14. package/src/components/alert-dialog/index.tsx +282 -0
  15. package/src/components/alert-dialog/meta.md +86 -0
  16. package/src/components/alert-dialog/stories.tsx +163 -0
  17. package/src/components/avatar/index.tsx +159 -0
  18. package/src/components/avatar/meta.md +242 -0
  19. package/src/components/avatar/stories.tsx +241 -0
  20. package/src/components/badge/index.tsx +299 -0
  21. package/src/components/badge/meta.md +237 -0
  22. package/src/components/badge/stories.tsx +275 -0
  23. package/src/components/breadcrumb/index.tsx +137 -0
  24. package/src/components/breadcrumb/meta.md +64 -0
  25. package/src/components/breadcrumb/stories.tsx +86 -0
  26. package/src/components/button/index.tsx +202 -0
  27. package/src/components/button/meta.md +209 -0
  28. package/src/components/button/stories.tsx +215 -0
  29. package/src/components/button-group/index.tsx +211 -0
  30. package/src/components/button-group/meta.md +190 -0
  31. package/src/components/button-group/stories.tsx +182 -0
  32. package/src/components/calendar/index.tsx +240 -0
  33. package/src/components/calendar/meta.md +36 -0
  34. package/src/components/calendar/stories.tsx +36 -0
  35. package/src/components/card/index.tsx +262 -0
  36. package/src/components/card/meta.md +194 -0
  37. package/src/components/card/stories.tsx +202 -0
  38. package/src/components/carousel/index.tsx +481 -0
  39. package/src/components/carousel/meta.md +208 -0
  40. package/src/components/carousel/stories.tsx +271 -0
  41. package/src/components/cascader-select/index.tsx +308 -0
  42. package/src/components/cascader-select/meta.md +28 -0
  43. package/src/components/cascader-select/stories.tsx +118 -0
  44. package/src/components/checkbox/index.tsx +208 -0
  45. package/src/components/checkbox/meta.md +166 -0
  46. package/src/components/checkbox/stories.tsx +206 -0
  47. package/src/components/collapsible/index.tsx +72 -0
  48. package/src/components/collapsible/meta.md +87 -0
  49. package/src/components/collapsible/stories.tsx +97 -0
  50. package/src/components/color-picker/index.tsx +677 -0
  51. package/src/components/color-picker/meta.md +83 -0
  52. package/src/components/color-picker/stories.tsx +172 -0
  53. package/src/components/combobox/index.tsx +687 -0
  54. package/src/components/combobox/meta.md +83 -0
  55. package/src/components/combobox/stories.tsx +179 -0
  56. package/src/components/command/index.tsx +238 -0
  57. package/src/components/command/meta.md +48 -0
  58. package/src/components/command/stories.tsx +83 -0
  59. package/src/components/data-table/index.tsx +1537 -0
  60. package/src/components/data-table/meta.md +107 -0
  61. package/src/components/data-table/stories.tsx +1234 -0
  62. package/src/components/date-picker/index.tsx +1492 -0
  63. package/src/components/date-picker/meta.md +103 -0
  64. package/src/components/date-picker/stories.tsx +125 -0
  65. package/src/components/descriptions/index.tsx +535 -0
  66. package/src/components/descriptions/meta.md +104 -0
  67. package/src/components/descriptions/stories.tsx +389 -0
  68. package/src/components/dialog/index.tsx +255 -0
  69. package/src/components/dialog/meta.md +244 -0
  70. package/src/components/dialog/stories.tsx +330 -0
  71. package/src/components/dropdown-menu/index.tsx +301 -0
  72. package/src/components/dropdown-menu/meta.md +93 -0
  73. package/src/components/dropdown-menu/stories.tsx +124 -0
  74. package/src/components/empty/index.tsx +431 -0
  75. package/src/components/empty/meta.md +274 -0
  76. package/src/components/empty/stories.tsx +278 -0
  77. package/src/components/field/index.tsx +374 -0
  78. package/src/components/field/meta.md +283 -0
  79. package/src/components/field/stories.tsx +327 -0
  80. package/src/components/filter-bar/index.tsx +976 -0
  81. package/src/components/filter-bar/meta.md +57 -0
  82. package/src/components/filter-bar/stories.tsx +496 -0
  83. package/src/components/float-button/index.tsx +163 -0
  84. package/src/components/float-button/meta.md +73 -0
  85. package/src/components/float-button/stories.tsx +68 -0
  86. package/src/components/form/index.tsx +218 -0
  87. package/src/components/form/meta.md +16 -0
  88. package/src/components/form/stories.tsx +301 -0
  89. package/src/components/hover-card/index.tsx +103 -0
  90. package/src/components/hover-card/meta.md +71 -0
  91. package/src/components/hover-card/stories.tsx +107 -0
  92. package/src/components/icon/index.tsx +225 -0
  93. package/src/components/icon/meta.md +102 -0
  94. package/src/components/icon/stories.tsx +127 -0
  95. package/src/components/image/index.tsx +147 -0
  96. package/src/components/image/meta.md +55 -0
  97. package/src/components/image/stories.tsx +48 -0
  98. package/src/components/input/index.tsx +63 -0
  99. package/src/components/input/meta.md +57 -0
  100. package/src/components/input/stories.tsx +66 -0
  101. package/src/components/input-group/index.tsx +292 -0
  102. package/src/components/input-group/meta.md +108 -0
  103. package/src/components/input-group/stories.tsx +258 -0
  104. package/src/components/input-ip/index.tsx +288 -0
  105. package/src/components/input-ip/meta.md +48 -0
  106. package/src/components/input-ip/stories.tsx +69 -0
  107. package/src/components/input-number/index.tsx +360 -0
  108. package/src/components/input-number/meta.md +156 -0
  109. package/src/components/input-number/stories.tsx +187 -0
  110. package/src/components/item/index.tsx +368 -0
  111. package/src/components/item/meta.md +395 -0
  112. package/src/components/item/stories.tsx +432 -0
  113. package/src/components/label/index.tsx +44 -0
  114. package/src/components/label/meta.md +68 -0
  115. package/src/components/label/stories.tsx +64 -0
  116. package/src/components/mentions/index.tsx +369 -0
  117. package/src/components/mentions/meta.md +118 -0
  118. package/src/components/mentions/stories.tsx +153 -0
  119. package/src/components/menubar/index.tsx +313 -0
  120. package/src/components/menubar/meta.md +52 -0
  121. package/src/components/menubar/stories.tsx +99 -0
  122. package/src/components/navigation-menu/index.tsx +216 -0
  123. package/src/components/navigation-menu/meta.md +66 -0
  124. package/src/components/navigation-menu/stories.tsx +137 -0
  125. package/src/components/page-header/index.tsx +218 -0
  126. package/src/components/page-header/meta.md +211 -0
  127. package/src/components/page-header/stories.tsx +290 -0
  128. package/src/components/page-shell/index.tsx +119 -0
  129. package/src/components/page-shell/meta.md +115 -0
  130. package/src/components/page-shell/stories.tsx +154 -0
  131. package/src/components/pagination/index.tsx +580 -0
  132. package/src/components/pagination/meta.md +39 -0
  133. package/src/components/pagination/stories.tsx +319 -0
  134. package/src/components/popconfirm/index.tsx +477 -0
  135. package/src/components/popconfirm/meta.md +164 -0
  136. package/src/components/popconfirm/stories.tsx +231 -0
  137. package/src/components/popover/index.tsx +181 -0
  138. package/src/components/popover/meta.md +97 -0
  139. package/src/components/popover/stories.tsx +169 -0
  140. package/src/components/progress/index.tsx +176 -0
  141. package/src/components/progress/meta.md +95 -0
  142. package/src/components/progress/stories.tsx +115 -0
  143. package/src/components/radio-group/index.tsx +78 -0
  144. package/src/components/radio-group/meta.md +137 -0
  145. package/src/components/radio-group/stories.tsx +285 -0
  146. package/src/components/rate/index.tsx +284 -0
  147. package/src/components/rate/meta.md +63 -0
  148. package/src/components/rate/stories.tsx +107 -0
  149. package/src/components/resizable/index.tsx +122 -0
  150. package/src/components/resizable/meta.md +142 -0
  151. package/src/components/resizable/stories.tsx +105 -0
  152. package/src/components/scroll-area/index.tsx +83 -0
  153. package/src/components/scroll-area/meta.md +85 -0
  154. package/src/components/scroll-area/stories.tsx +82 -0
  155. package/src/components/select/index.tsx +325 -0
  156. package/src/components/select/meta.md +183 -0
  157. package/src/components/select/stories.tsx +210 -0
  158. package/src/components/separator/index.tsx +51 -0
  159. package/src/components/separator/meta.md +68 -0
  160. package/src/components/separator/stories.tsx +53 -0
  161. package/src/components/sheet/index.tsx +293 -0
  162. package/src/components/sheet/meta.md +226 -0
  163. package/src/components/sheet/stories.tsx +405 -0
  164. package/src/components/sidebar/index.tsx +715 -0
  165. package/src/components/sidebar/meta.md +14 -0
  166. package/src/components/sidebar/{sidebar.stories.tsx → stories.tsx} +250 -330
  167. package/src/components/skeleton/index.tsx +415 -0
  168. package/src/components/skeleton/meta.md +210 -0
  169. package/src/components/skeleton/stories.tsx +197 -0
  170. package/src/components/slider/index.tsx +222 -0
  171. package/src/components/slider/meta.md +125 -0
  172. package/src/components/slider/stories.tsx +109 -0
  173. package/src/components/sonner/index.tsx +149 -0
  174. package/src/components/sonner/meta.md +156 -0
  175. package/src/components/sonner/stories.tsx +285 -0
  176. package/src/components/spinner/index.tsx +335 -0
  177. package/src/components/spinner/meta.md +172 -0
  178. package/src/components/spinner/stories.tsx +197 -0
  179. package/src/components/statistic/{statistic.tsx → index.tsx} +25 -26
  180. package/src/components/statistic/meta.md +94 -0
  181. package/src/components/statistic/stories.tsx +85 -0
  182. package/src/components/steps/index.tsx +500 -0
  183. package/src/components/steps/meta.md +245 -0
  184. package/src/components/steps/stories.tsx +287 -0
  185. package/src/components/switch/index.tsx +175 -0
  186. package/src/components/switch/meta.md +107 -0
  187. package/src/components/switch/stories.tsx +154 -0
  188. package/src/components/table/index.tsx +350 -0
  189. package/src/components/table/meta.md +148 -0
  190. package/src/components/table/stories.tsx +189 -0
  191. package/src/components/tabs/index.tsx +379 -0
  192. package/src/components/tabs/meta.md +244 -0
  193. package/src/components/tabs/stories.tsx +312 -0
  194. package/src/components/tag/index.tsx +774 -0
  195. package/src/components/tag/meta.md +256 -0
  196. package/src/components/tag/stories.tsx +431 -0
  197. package/src/components/textarea/index.tsx +62 -0
  198. package/src/components/textarea/meta.md +77 -0
  199. package/src/components/textarea/stories.tsx +112 -0
  200. package/src/components/time-picker/index.tsx +887 -0
  201. package/src/components/time-picker/meta.md +102 -0
  202. package/src/components/time-picker/stories.tsx +125 -0
  203. package/src/components/timeline/index.tsx +422 -0
  204. package/src/components/timeline/meta.md +352 -0
  205. package/src/components/timeline/stories.tsx +369 -0
  206. package/src/components/toggle/index.tsx +74 -0
  207. package/src/components/toggle/meta.md +76 -0
  208. package/src/components/toggle/stories.tsx +66 -0
  209. package/src/components/toggle-group/index.tsx +167 -0
  210. package/src/components/toggle-group/meta.md +141 -0
  211. package/src/components/toggle-group/stories.tsx +124 -0
  212. package/src/components/tooltip/index.tsx +144 -0
  213. package/src/components/tooltip/meta.md +186 -0
  214. package/src/components/tooltip/stories.tsx +212 -0
  215. package/src/components/transfer/index.tsx +639 -0
  216. package/src/components/transfer/meta.md +76 -0
  217. package/src/components/transfer/stories.tsx +221 -0
  218. package/src/components/tree/index.tsx +764 -0
  219. package/src/components/tree/meta.md +96 -0
  220. package/src/components/tree/stories.tsx +385 -0
  221. package/src/components/tree/utils.ts +269 -0
  222. package/src/components/tree-select/index.tsx +400 -0
  223. package/src/components/tree-select/meta.md +78 -0
  224. package/src/components/tree-select/stories.tsx +234 -0
  225. package/src/components/typography/index.tsx +290 -0
  226. package/src/components/typography/meta.md +151 -0
  227. package/src/components/typography/stories.tsx +151 -0
  228. package/src/components/upload/index.tsx +858 -0
  229. package/src/components/upload/meta.md +122 -0
  230. package/src/components/upload/stories.tsx +261 -0
  231. package/src/components/watermark/index.tsx +152 -0
  232. package/src/components/watermark/meta.md +67 -0
  233. package/src/components/watermark/stories.tsx +59 -0
  234. package/src/hooks/use-mobile.ts +9 -11
  235. package/src/lib/color.ts +243 -0
  236. package/src/{utils/cn.ts → lib/utils.ts} +1 -1
  237. package/src/components/accordion/accordion.meta.md +0 -88
  238. package/src/components/accordion/accordion.stories.tsx +0 -72
  239. package/src/components/accordion/accordion.tsx +0 -154
  240. package/src/components/affix/affix.meta.md +0 -98
  241. package/src/components/affix/affix.stories.tsx +0 -134
  242. package/src/components/affix/affix.tsx +0 -167
  243. package/src/components/alert/alert.meta.md +0 -132
  244. package/src/components/alert/alert.stories.tsx +0 -138
  245. package/src/components/alert/alert.tsx +0 -179
  246. package/src/components/alert-dialog/alert-dialog.meta.md +0 -152
  247. package/src/components/alert-dialog/alert-dialog.stories.tsx +0 -223
  248. package/src/components/alert-dialog/alert-dialog.tsx +0 -183
  249. package/src/components/anchor/anchor.meta.md +0 -92
  250. package/src/components/anchor/anchor.stories.tsx +0 -74
  251. package/src/components/anchor/anchor.tsx +0 -130
  252. package/src/components/app/app.meta.md +0 -91
  253. package/src/components/app/app.stories.tsx +0 -64
  254. package/src/components/app/app.tsx +0 -58
  255. package/src/components/aspect-ratio/aspect-ratio.meta.md +0 -82
  256. package/src/components/aspect-ratio/aspect-ratio.stories.tsx +0 -59
  257. package/src/components/aspect-ratio/aspect-ratio.tsx +0 -22
  258. package/src/components/auto-complete/auto-complete.meta.md +0 -110
  259. package/src/components/auto-complete/auto-complete.stories.tsx +0 -136
  260. package/src/components/auto-complete/auto-complete.tsx +0 -253
  261. package/src/components/avatar/avatar.meta.md +0 -93
  262. package/src/components/avatar/avatar.stories.tsx +0 -98
  263. package/src/components/avatar/avatar.tsx +0 -127
  264. package/src/components/badge/badge.meta.md +0 -120
  265. package/src/components/badge/badge.stories.tsx +0 -153
  266. package/src/components/badge/badge.tsx +0 -204
  267. package/src/components/breadcrumb/breadcrumb.meta.md +0 -127
  268. package/src/components/breadcrumb/breadcrumb.stories.tsx +0 -207
  269. package/src/components/breadcrumb/breadcrumb.tsx +0 -136
  270. package/src/components/button/button.meta.md +0 -335
  271. package/src/components/button/button.stories.tsx +0 -743
  272. package/src/components/button/button.tsx +0 -462
  273. package/src/components/button/demo/as-child.tsx +0 -24
  274. package/src/components/button/demo/basic.tsx +0 -8
  275. package/src/components/button/demo/block.tsx +0 -16
  276. package/src/components/button/demo/loading.tsx +0 -19
  277. package/src/components/button/demo/shapes.tsx +0 -18
  278. package/src/components/button/demo/sizes.tsx +0 -19
  279. package/src/components/button/demo/variants.tsx +0 -19
  280. package/src/components/button/demo/with-icon.tsx +0 -20
  281. package/src/components/calendar/calendar.meta.md +0 -128
  282. package/src/components/calendar/calendar.stories.tsx +0 -68
  283. package/src/components/calendar/calendar.tsx +0 -172
  284. package/src/components/card/card.meta.md +0 -139
  285. package/src/components/card/card.stories.tsx +0 -151
  286. package/src/components/card/card.tsx +0 -305
  287. package/src/components/carousel/carousel.meta.md +0 -118
  288. package/src/components/carousel/carousel.stories.tsx +0 -89
  289. package/src/components/carousel/carousel.tsx +0 -224
  290. package/src/components/cascader/cascader.meta.md +0 -140
  291. package/src/components/cascader/cascader.stories.tsx +0 -120
  292. package/src/components/cascader/cascader.tsx +0 -541
  293. package/src/components/checkbox/checkbox.meta.md +0 -167
  294. package/src/components/checkbox/checkbox.stories.tsx +0 -288
  295. package/src/components/checkbox/checkbox.tsx +0 -193
  296. package/src/components/collapsible/collapsible.meta.md +0 -88
  297. package/src/components/collapsible/collapsible.stories.tsx +0 -43
  298. package/src/components/collapsible/collapsible.tsx +0 -105
  299. package/src/components/color-picker/color-picker.meta.md +0 -89
  300. package/src/components/color-picker/color-picker.stories.tsx +0 -159
  301. package/src/components/color-picker/color-picker.tsx +0 -171
  302. package/src/components/command/command.meta.md +0 -120
  303. package/src/components/command/command.stories.tsx +0 -59
  304. package/src/components/command/command.tsx +0 -158
  305. package/src/components/context-menu/context-menu.meta.md +0 -93
  306. package/src/components/context-menu/context-menu.stories.tsx +0 -54
  307. package/src/components/context-menu/context-menu.tsx +0 -204
  308. package/src/components/data-table/data-table.meta.md +0 -150
  309. package/src/components/data-table/data-table.stories.tsx +0 -132
  310. package/src/components/data-table/data-table.tsx +0 -185
  311. package/src/components/date-picker/date-picker.meta.md +0 -175
  312. package/src/components/date-picker/date-picker.stories.tsx +0 -108
  313. package/src/components/date-picker/date-picker.tsx +0 -1554
  314. package/src/components/descriptions/descriptions.meta.md +0 -83
  315. package/src/components/descriptions/descriptions.stories.tsx +0 -60
  316. package/src/components/descriptions/descriptions.tsx +0 -137
  317. package/src/components/dialog/dialog.meta.md +0 -168
  318. package/src/components/dialog/dialog.stories.tsx +0 -255
  319. package/src/components/dialog/dialog.tsx +0 -180
  320. package/src/components/dialog/imperative.tsx +0 -252
  321. package/src/components/drawer/drawer.meta.md +0 -95
  322. package/src/components/drawer/drawer.stories.tsx +0 -71
  323. package/src/components/drawer/drawer.tsx +0 -23
  324. package/src/components/dropdown-menu/dropdown-menu.meta.md +0 -171
  325. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +0 -198
  326. package/src/components/dropdown-menu/dropdown-menu.tsx +0 -209
  327. package/src/components/ellipsis/ellipsis.meta.md +0 -87
  328. package/src/components/ellipsis/ellipsis.stories.tsx +0 -72
  329. package/src/components/ellipsis/ellipsis.tsx +0 -153
  330. package/src/components/empty/empty.meta.md +0 -86
  331. package/src/components/empty/empty.stories.tsx +0 -46
  332. package/src/components/empty/empty.tsx +0 -54
  333. package/src/components/field/field.meta.md +0 -154
  334. package/src/components/field/field.stories.tsx +0 -497
  335. package/src/components/field/field.tsx +0 -392
  336. package/src/components/filter-bar/filter-bar.meta.md +0 -92
  337. package/src/components/filter-bar/filter-bar.stories.tsx +0 -1083
  338. package/src/components/filter-bar/filter-bar.tsx +0 -568
  339. package/src/components/flex/flex.meta.md +0 -142
  340. package/src/components/flex/flex.stories.tsx +0 -199
  341. package/src/components/flex/flex.tsx +0 -145
  342. package/src/components/float-button/float-button.meta.md +0 -92
  343. package/src/components/float-button/float-button.stories.tsx +0 -80
  344. package/src/components/float-button/float-button.tsx +0 -143
  345. package/src/components/form/form.meta.md +0 -153
  346. package/src/components/form/form.stories.tsx +0 -469
  347. package/src/components/form/form.tsx +0 -260
  348. package/src/components/grid/grid.meta.md +0 -92
  349. package/src/components/grid/grid.stories.tsx +0 -101
  350. package/src/components/grid/grid.tsx +0 -130
  351. package/src/components/hover-card/hover-card.meta.md +0 -103
  352. package/src/components/hover-card/hover-card.stories.tsx +0 -97
  353. package/src/components/hover-card/hover-card.tsx +0 -67
  354. package/src/components/icon/DEVELOPMENT.md +0 -809
  355. package/src/components/icon/icon.meta.md +0 -170
  356. package/src/components/icon/icon.stories.tsx +0 -344
  357. package/src/components/icon/icon.tsx +0 -248
  358. package/src/components/image/image.meta.md +0 -99
  359. package/src/components/image/image.stories.tsx +0 -55
  360. package/src/components/image/image.tsx +0 -140
  361. package/src/components/input/demo/basic.tsx +0 -12
  362. package/src/components/input/demo/clearable.tsx +0 -21
  363. package/src/components/input/demo/show-count.tsx +0 -18
  364. package/src/components/input/demo/sizes.tsx +0 -15
  365. package/src/components/input/input.meta.md +0 -115
  366. package/src/components/input/input.stories.tsx +0 -144
  367. package/src/components/input/input.tsx +0 -212
  368. package/src/components/input-group/input-group.meta.md +0 -124
  369. package/src/components/input-group/input-group.stories.tsx +0 -121
  370. package/src/components/input-group/input-group.tsx +0 -143
  371. package/src/components/input-number/input-number.meta.md +0 -148
  372. package/src/components/input-number/input-number.stories.tsx +0 -125
  373. package/src/components/input-number/input-number.tsx +0 -283
  374. package/src/components/input-otp/input-otp.meta.md +0 -106
  375. package/src/components/input-otp/input-otp.stories.tsx +0 -65
  376. package/src/components/input-otp/input-otp.tsx +0 -97
  377. package/src/components/item/item.meta.md +0 -121
  378. package/src/components/item/item.stories.tsx +0 -116
  379. package/src/components/item/item.tsx +0 -172
  380. package/src/components/kbd/kbd.meta.md +0 -94
  381. package/src/components/kbd/kbd.stories.tsx +0 -70
  382. package/src/components/kbd/kbd.tsx +0 -86
  383. package/src/components/label/label.meta.md +0 -99
  384. package/src/components/label/label.stories.tsx +0 -145
  385. package/src/components/label/label.tsx +0 -138
  386. package/src/components/masonry/masonry.meta.md +0 -90
  387. package/src/components/masonry/masonry.stories.tsx +0 -68
  388. package/src/components/masonry/masonry.tsx +0 -60
  389. package/src/components/mentions/mentions.meta.md +0 -119
  390. package/src/components/mentions/mentions.stories.tsx +0 -189
  391. package/src/components/mentions/mentions.tsx +0 -243
  392. package/src/components/menubar/menubar.meta.md +0 -118
  393. package/src/components/menubar/menubar.stories.tsx +0 -141
  394. package/src/components/menubar/menubar.tsx +0 -232
  395. package/src/components/native-select/native-select.meta.md +0 -93
  396. package/src/components/native-select/native-select.stories.tsx +0 -83
  397. package/src/components/native-select/native-select.tsx +0 -54
  398. package/src/components/navigation-menu/navigation-menu.meta.md +0 -118
  399. package/src/components/navigation-menu/navigation-menu.stories.tsx +0 -215
  400. package/src/components/navigation-menu/navigation-menu.tsx +0 -129
  401. package/src/components/notification/notification.meta.md +0 -133
  402. package/src/components/notification/notification.stories.tsx +0 -98
  403. package/src/components/notification/notification.tsx +0 -99
  404. package/src/components/page-header/DEVELOPMENT.md +0 -842
  405. package/src/components/page-header/page-header.meta.md +0 -208
  406. package/src/components/page-header/page-header.stories.tsx +0 -421
  407. package/src/components/page-header/page-header.tsx +0 -281
  408. package/src/components/pagination/pagination.meta.md +0 -230
  409. package/src/components/pagination/pagination.stories.tsx +0 -284
  410. package/src/components/pagination/pagination.tsx +0 -577
  411. package/src/components/popconfirm/popconfirm.meta.md +0 -114
  412. package/src/components/popconfirm/popconfirm.stories.tsx +0 -75
  413. package/src/components/popconfirm/popconfirm.tsx +0 -134
  414. package/src/components/popover/popover.meta.md +0 -154
  415. package/src/components/popover/popover.stories.tsx +0 -158
  416. package/src/components/popover/popover.tsx +0 -104
  417. package/src/components/progress/progress.meta.md +0 -118
  418. package/src/components/progress/progress.stories.tsx +0 -75
  419. package/src/components/progress/progress.tsx +0 -203
  420. package/src/components/radio-group/radio-group.meta.md +0 -175
  421. package/src/components/radio-group/radio-group.stories.tsx +0 -113
  422. package/src/components/radio-group/radio-group.tsx +0 -209
  423. package/src/components/rate/rate.meta.md +0 -118
  424. package/src/components/rate/rate.stories.tsx +0 -89
  425. package/src/components/rate/rate.tsx +0 -180
  426. package/src/components/resizable/resizable.meta.md +0 -95
  427. package/src/components/resizable/resizable.stories.tsx +0 -104
  428. package/src/components/resizable/resizable.tsx +0 -56
  429. package/src/components/result/result.meta.md +0 -95
  430. package/src/components/result/result.stories.tsx +0 -67
  431. package/src/components/result/result.tsx +0 -100
  432. package/src/components/scroll-area/scroll-area.meta.md +0 -85
  433. package/src/components/scroll-area/scroll-area.stories.tsx +0 -49
  434. package/src/components/scroll-area/scroll-area.tsx +0 -51
  435. package/src/components/segmented/segmented.meta.md +0 -106
  436. package/src/components/segmented/segmented.stories.tsx +0 -130
  437. package/src/components/segmented/segmented.tsx +0 -146
  438. package/src/components/select/select.meta.md +0 -255
  439. package/src/components/select/select.stories.tsx +0 -275
  440. package/src/components/select/select.tsx +0 -735
  441. package/src/components/separator/separator.meta.md +0 -75
  442. package/src/components/separator/separator.stories.tsx +0 -71
  443. package/src/components/separator/separator.tsx +0 -100
  444. package/src/components/sheet/sheet.meta.md +0 -113
  445. package/src/components/sheet/sheet.stories.tsx +0 -188
  446. package/src/components/sheet/sheet.tsx +0 -226
  447. package/src/components/sidebar/sidebar.meta.md +0 -150
  448. package/src/components/sidebar/sidebar.tsx +0 -824
  449. package/src/components/skeleton/skeleton.meta.md +0 -94
  450. package/src/components/skeleton/skeleton.stories.tsx +0 -79
  451. package/src/components/skeleton/skeleton.tsx +0 -144
  452. package/src/components/slider/slider.meta.md +0 -146
  453. package/src/components/slider/slider.stories.tsx +0 -121
  454. package/src/components/slider/slider.tsx +0 -227
  455. package/src/components/sonner/sonner.meta.md +0 -147
  456. package/src/components/sonner/sonner.stories.tsx +0 -164
  457. package/src/components/sonner/sonner.tsx +0 -169
  458. package/src/components/spinner/spinner.meta.md +0 -125
  459. package/src/components/spinner/spinner.stories.tsx +0 -123
  460. package/src/components/spinner/spinner.tsx +0 -166
  461. package/src/components/statistic/statistic.meta.md +0 -104
  462. package/src/components/statistic/statistic.stories.tsx +0 -67
  463. package/src/components/steps/steps.meta.md +0 -116
  464. package/src/components/steps/steps.stories.tsx +0 -115
  465. package/src/components/steps/steps.tsx +0 -173
  466. package/src/components/switch/switch.meta.md +0 -138
  467. package/src/components/switch/switch.stories.tsx +0 -75
  468. package/src/components/switch/switch.tsx +0 -169
  469. package/src/components/table/table.meta.md +0 -106
  470. package/src/components/table/table.stories.tsx +0 -80
  471. package/src/components/table/table.tsx +0 -122
  472. package/src/components/tabs/tabs.meta.md +0 -111
  473. package/src/components/tabs/tabs.stories.tsx +0 -156
  474. package/src/components/tabs/tabs.tsx +0 -190
  475. package/src/components/tag/tag.meta.md +0 -159
  476. package/src/components/tag/tag.stories.tsx +0 -250
  477. package/src/components/tag/tag.tsx +0 -386
  478. package/src/components/textarea/textarea.meta.md +0 -99
  479. package/src/components/textarea/textarea.stories.tsx +0 -89
  480. package/src/components/textarea/textarea.tsx +0 -137
  481. package/src/components/time-picker/time-picker.meta.md +0 -175
  482. package/src/components/time-picker/time-picker.stories.tsx +0 -129
  483. package/src/components/time-picker/time-picker.tsx +0 -946
  484. package/src/components/timeline/timeline.meta.md +0 -110
  485. package/src/components/timeline/timeline.stories.tsx +0 -134
  486. package/src/components/timeline/timeline.tsx +0 -168
  487. package/src/components/toggle/toggle.meta.md +0 -89
  488. package/src/components/toggle/toggle.stories.tsx +0 -66
  489. package/src/components/toggle/toggle.tsx +0 -54
  490. package/src/components/toggle-group/toggle-group.meta.md +0 -91
  491. package/src/components/toggle-group/toggle-group.stories.tsx +0 -83
  492. package/src/components/toggle-group/toggle-group.tsx +0 -78
  493. package/src/components/tooltip/tooltip.meta.md +0 -149
  494. package/src/components/tooltip/tooltip.stories.tsx +0 -108
  495. package/src/components/tooltip/tooltip.tsx +0 -153
  496. package/src/components/tour/tour.meta.md +0 -121
  497. package/src/components/tour/tour.stories.tsx +0 -66
  498. package/src/components/tour/tour.tsx +0 -242
  499. package/src/components/transfer/transfer.meta.md +0 -95
  500. package/src/components/transfer/transfer.stories.tsx +0 -64
  501. package/src/components/transfer/transfer.tsx +0 -258
  502. package/src/components/tree/tree.meta.md +0 -169
  503. package/src/components/tree/tree.stories.tsx +0 -128
  504. package/src/components/tree/tree.tsx +0 -368
  505. package/src/components/tree-select/tree-select.meta.md +0 -151
  506. package/src/components/tree-select/tree-select.stories.tsx +0 -80
  507. package/src/components/tree-select/tree-select.tsx +0 -206
  508. package/src/components/typography/typography.meta.md +0 -149
  509. package/src/components/typography/typography.stories.tsx +0 -116
  510. package/src/components/typography/typography.tsx +0 -260
  511. package/src/components/upload/upload.meta.md +0 -156
  512. package/src/components/upload/upload.stories.tsx +0 -135
  513. package/src/components/upload/upload.tsx +0 -398
  514. package/src/components/watermark/watermark.meta.md +0 -100
  515. package/src/components/watermark/watermark.stories.tsx +0 -170
  516. package/src/components/watermark/watermark.tsx +0 -166
  517. package/src/hooks/use-breakpoint.ts +0 -117
  518. package/src/hooks/use-debounce-callback.ts +0 -52
  519. package/src/stories/theme-tokens.stories.tsx +0 -747
  520. package/src/utils/trigger-input.ts +0 -53
@@ -1,1083 +0,0 @@
1
- import * as React from 'react';
2
- import type { Meta, StoryObj } from '@storybook/react-vite';
3
- import { useForm, FormProvider } from 'react-hook-form';
4
- import { zodResolver } from '@hookform/resolvers/zod';
5
- import { z } from 'zod';
6
- import {
7
- FilterBar,
8
- FilterBarSearch,
9
- FilterBarTrigger,
10
- FilterBarPanel,
11
- FilterBarActions,
12
- FilterBarPreset,
13
- } from './filter-bar';
14
- import {
15
- FormField,
16
- FormItem,
17
- FormLabel,
18
- FormControl,
19
- FormMessage,
20
- } from '@/components/form/form';
21
- import { Input } from '@/components/input/input';
22
- import { Select } from '@/components/select/select';
23
- import {
24
- DatePicker,
25
- DateRangePicker,
26
- } from '@/components/date-picker/date-picker';
27
- import type { DateRange } from 'react-day-picker';
28
- import { Switch } from '@/components/switch/switch';
29
- import { Checkbox } from '@/components/checkbox/checkbox';
30
- import { CheckboxGroup } from '@/components/checkbox/checkbox';
31
- import { RadioGroup } from '@/components/radio-group/radio-group';
32
- import { Button } from '@/components/button/button';
33
-
34
- // ─── Meta ────────────────────────────────────────────────────────────────────
35
-
36
- const meta: Meta<typeof FilterBar> = {
37
- title: '数据录入 · Data Entry/FilterBar',
38
- component: FilterBar,
39
- tags: ['autodocs'],
40
- parameters: {
41
- layout: 'fullscreen',
42
- docs: {
43
- description: {
44
- component:
45
- '筛选栏 —— 面向 Table/List 的筛选表单变体,行内实时筛选 + 可折叠高级面板栅格布局。Radix Collapsible 实现面板展开收起 + react-hook-form 表单状态管理 + Grid 栅格面板布局;对齐 SAP Fiori FilterBar 的 basic/advanced 双模式,补齐 antd-pro QueryFilter 的 inline/panel 实时触发与防抖能力:`form` / `defaultExpanded` / `onFilter` / `onReset` / `filterDebounce` / `columns`。视觉走 OpenTrek semantic tokens,所有样式来自 `@teamix-evo/tokens`,无 mock。',
46
- },
47
- },
48
- },
49
- };
50
-
51
- export default meta;
52
- type Story = StoryObj<typeof FilterBar>;
53
-
54
- // ─── Story: InlineFilter ─────────────────────────────────────────────────────
55
-
56
- export const InlineFilter: Story = {
57
- name: '行内筛选(实时触发)',
58
- render: () => {
59
- const form = useForm({
60
- defaultValues: { keyword: '', status: '', enabled: false },
61
- });
62
- const [result, setResult] = React.useState<Record<string, any>>({});
63
-
64
- return (
65
- <div className="w-full space-y-4 p-6">
66
- <FormProvider {...form}>
67
- <FilterBar form={form} onFilter={setResult}>
68
- <FilterBarSearch>
69
- <FormField
70
- control={form.control}
71
- name="keyword"
72
- render={({ field }) => (
73
- <FormItem className="flex-row items-center gap-2">
74
- <FormControl>
75
- <Input
76
- placeholder="搜索关键词..."
77
- className="w-48"
78
- {...field}
79
- />
80
- </FormControl>
81
- </FormItem>
82
- )}
83
- />
84
- <FormField
85
- control={form.control}
86
- name="status"
87
- render={({ field }) => (
88
- <FormItem className="flex-row items-center gap-2">
89
- <FormControl>
90
- <Select
91
- options={[
92
- { value: 'running', label: '运行中' },
93
- { value: 'stopped', label: '已停止' },
94
- { value: 'error', label: '异常' },
95
- ]}
96
- placeholder="状态"
97
- value={field.value}
98
- onChange={field.onChange}
99
- className="w-36"
100
- />
101
- </FormControl>
102
- </FormItem>
103
- )}
104
- />
105
- <FormField
106
- control={form.control}
107
- name="enabled"
108
- render={({ field }) => (
109
- <FormItem className="flex-row items-center gap-2">
110
- <FormLabel className="text-xs">仅显示启用</FormLabel>
111
- <FormControl>
112
- <Switch
113
- checked={field.value}
114
- onCheckedChange={field.onChange}
115
- size="sm"
116
- />
117
- </FormControl>
118
- </FormItem>
119
- )}
120
- />
121
- </FilterBarSearch>
122
- </FilterBar>
123
- </FormProvider>
124
- {Object.keys(result).length > 0 && (
125
- <pre className="rounded-md bg-muted p-3 text-xs">
126
- onFilter: {JSON.stringify(result, null, 2)}
127
- </pre>
128
- )}
129
- </div>
130
- );
131
- },
132
- };
133
-
134
- // ─── Story: WithPanel ────────────────────────────────────────────────────────
135
-
136
- export const WithPanel: Story = {
137
- name: '行内 + 可展开面板',
138
- render: () => {
139
- const form = useForm({
140
- defaultValues: {
141
- keyword: '',
142
- region: '',
143
- org: '',
144
- dateRange: undefined as DateRange | undefined,
145
- tagGroup: '',
146
- instanceId: '',
147
- cpu: '',
148
- },
149
- });
150
- const [result, setResult] = React.useState<Record<string, any>>({});
151
-
152
- return (
153
- <div className="w-full space-y-4 p-6">
154
- <FormProvider {...form}>
155
- <FilterBar
156
- form={form}
157
- onFilter={setResult}
158
- onReset={() => setResult({})}
159
- >
160
- <FilterBarSearch autoFilter={false}>
161
- <FormField
162
- control={form.control}
163
- name="keyword"
164
- render={({ field }) => (
165
- <FormItem className="flex-row items-center gap-2">
166
- <FormControl>
167
- <Input
168
- placeholder="实例 ID / 名称"
169
- className="w-56"
170
- {...field}
171
- />
172
- </FormControl>
173
- </FormItem>
174
- )}
175
- />
176
- <FilterBarTrigger />
177
- </FilterBarSearch>
178
- <FilterBarPanel columns={3}>
179
- <FormField
180
- control={form.control}
181
- name="dateRange"
182
- render={({ field }) => (
183
- <FormItem>
184
- <FormLabel>起止时间</FormLabel>
185
- <FormControl>
186
- <DateRangePicker
187
- value={field.value}
188
- onChange={field.onChange}
189
- placeholders={['起始日期', '结束日期']}
190
- />
191
- </FormControl>
192
- </FormItem>
193
- )}
194
- />
195
- <FormField
196
- control={form.control}
197
- name="org"
198
- render={({ field }) => (
199
- <FormItem>
200
- <FormLabel>组织</FormLabel>
201
- <FormControl>
202
- <Select
203
- options={[
204
- { value: 'dev', label: '研发部' },
205
- { value: 'ops', label: '运维部' },
206
- { value: 'test', label: '测试部' },
207
- ]}
208
- placeholder="请选择"
209
- value={field.value}
210
- onChange={field.onChange}
211
- />
212
- </FormControl>
213
- </FormItem>
214
- )}
215
- />
216
- <FormField
217
- control={form.control}
218
- name="tagGroup"
219
- render={({ field }) => (
220
- <FormItem>
221
- <FormLabel>标签选择组</FormLabel>
222
- <FormControl>
223
- <Select
224
- options={[
225
- { value: 'web', label: 'Web 应用' },
226
- { value: 'api', label: 'API 服务' },
227
- { value: 'db', label: '数据库' },
228
- { value: 'cache', label: '缓存' },
229
- ]}
230
- placeholder="请选择或输入标签键或标签值"
231
- searchable
232
- value={field.value}
233
- onChange={field.onChange}
234
- />
235
- </FormControl>
236
- </FormItem>
237
- )}
238
- />
239
- <FormField
240
- control={form.control}
241
- name="region"
242
- render={({ field }) => (
243
- <FormItem>
244
- <FormLabel>区域</FormLabel>
245
- <FormControl>
246
- <Select
247
- options={[
248
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
249
- { value: 'cn-shanghai', label: '华东2(上海)' },
250
- { value: 'cn-beijing', label: '华北2(北京)' },
251
- { value: 'cn-shenzhen', label: '华南1(深圳)' },
252
- ]}
253
- placeholder="请选择"
254
- value={field.value}
255
- onChange={field.onChange}
256
- />
257
- </FormControl>
258
- </FormItem>
259
- )}
260
- />
261
- <FormField
262
- control={form.control}
263
- name="instanceId"
264
- render={({ field }) => (
265
- <FormItem>
266
- <FormLabel>实例 ID</FormLabel>
267
- <FormControl>
268
- <Input placeholder="输入实例 ID" {...field} />
269
- </FormControl>
270
- </FormItem>
271
- )}
272
- />
273
- <FormField
274
- control={form.control}
275
- name="cpu"
276
- render={({ field }) => (
277
- <FormItem>
278
- <FormLabel>CPU</FormLabel>
279
- <FormControl>
280
- <Input placeholder="输入 CPU 核数" {...field} />
281
- </FormControl>
282
- </FormItem>
283
- )}
284
- />
285
- <FilterBarActions />
286
- </FilterBarPanel>
287
- </FilterBar>
288
- </FormProvider>
289
- {Object.keys(result).length > 0 && (
290
- <pre className="rounded-md bg-muted p-3 text-xs">
291
- onFilter: {JSON.stringify(result, null, 2)}
292
- </pre>
293
- )}
294
- </div>
295
- );
296
- },
297
- };
298
-
299
- // ─── Story: PurePanel ────────────────────────────────────────────────────────
300
-
301
- export const PurePanel: Story = {
302
- name: '纯面板模式(默认展开)',
303
- render: () => {
304
- const form = useForm({
305
- defaultValues: {
306
- startDate: undefined as Date | undefined,
307
- org: '',
308
- resourceGroup: [] as string[],
309
- region: '',
310
- instanceId: '',
311
- enableMonitor: false,
312
- },
313
- });
314
- const [result, setResult] = React.useState<Record<string, any>>({});
315
-
316
- return (
317
- <div className="w-full space-y-4 p-6">
318
- <FormProvider {...form}>
319
- <FilterBar
320
- form={form}
321
- defaultExpanded
322
- onFilter={setResult}
323
- onReset={() => setResult({})}
324
- >
325
- <FilterBarPanel columns={3}>
326
- <FormField
327
- control={form.control}
328
- name="startDate"
329
- render={({ field }) => (
330
- <FormItem>
331
- <FormLabel required>起始日期</FormLabel>
332
- <FormControl>
333
- <DatePicker
334
- value={field.value}
335
- onChange={field.onChange}
336
- placeholder="选择日期"
337
- />
338
- </FormControl>
339
- </FormItem>
340
- )}
341
- />
342
- <FormField
343
- control={form.control}
344
- name="org"
345
- render={({ field }) => (
346
- <FormItem>
347
- <FormLabel required>组织</FormLabel>
348
- <FormControl>
349
- <Select
350
- options={[
351
- { value: 'dev', label: '研发部' },
352
- { value: 'ops', label: '运维部' },
353
- { value: 'test', label: '测试部' },
354
- { value: 'product', label: '产品部' },
355
- ]}
356
- placeholder="请选择"
357
- value={field.value}
358
- onChange={field.onChange}
359
- />
360
- </FormControl>
361
- </FormItem>
362
- )}
363
- />
364
- <FormField
365
- control={form.control}
366
- name="resourceGroup"
367
- render={({ field }) => (
368
- <FormItem>
369
- <FormLabel>资源集</FormLabel>
370
- <FormControl>
371
- <CheckboxGroup
372
- options={[
373
- { value: 'ecs', label: 'ECS' },
374
- { value: 'rds', label: 'RDS' },
375
- { value: 'oss', label: 'OSS' },
376
- { value: 'slb', label: 'SLB' },
377
- ]}
378
- value={field.value}
379
- onChange={field.onChange}
380
- />
381
- </FormControl>
382
- </FormItem>
383
- )}
384
- />
385
- <FormField
386
- control={form.control}
387
- name="region"
388
- render={({ field }) => (
389
- <FormItem>
390
- <FormLabel>区域</FormLabel>
391
- <FormControl>
392
- <RadioGroup
393
- orientation="horizontal"
394
- className="flex flex-row gap-4"
395
- options={[
396
- { value: 'cn-hangzhou', label: '杭州' },
397
- { value: 'cn-shanghai', label: '上海' },
398
- { value: 'cn-beijing', label: '北京' },
399
- ]}
400
- value={field.value}
401
- onValueChange={field.onChange}
402
- />
403
- </FormControl>
404
- </FormItem>
405
- )}
406
- />
407
- <FormField
408
- control={form.control}
409
- name="instanceId"
410
- render={({ field }) => (
411
- <FormItem>
412
- <FormLabel>实例 ID</FormLabel>
413
- <FormControl>
414
- <Input placeholder="输入实例 ID" {...field} />
415
- </FormControl>
416
- </FormItem>
417
- )}
418
- />
419
- <FormField
420
- control={form.control}
421
- name="enableMonitor"
422
- render={({ field }) => (
423
- <FormItem>
424
- <FormLabel>启用监控</FormLabel>
425
- <FormControl>
426
- <Switch
427
- checked={field.value}
428
- onCheckedChange={field.onChange}
429
- />
430
- </FormControl>
431
- </FormItem>
432
- )}
433
- />
434
- <FilterBarActions />
435
- </FilterBarPanel>
436
- </FilterBar>
437
- </FormProvider>
438
- {Object.keys(result).length > 0 && (
439
- <pre className="rounded-md bg-muted p-3 text-xs">
440
- onFilter: {JSON.stringify(result, null, 2)}
441
- </pre>
442
- )}
443
- </div>
444
- );
445
- },
446
- };
447
-
448
- // ─── Story: PresetUsage ──────────────────────────────────────────────────────
449
-
450
- export const PresetUsage: Story = {
451
- name: 'FilterBarPreset 快捷用法',
452
- render: () => {
453
- const form = useForm({
454
- defaultValues: {
455
- keyword: '',
456
- status: '',
457
- dateRange: undefined as DateRange | undefined,
458
- org: '',
459
- region: '',
460
- enableHA: false,
461
- },
462
- });
463
- const [result, setResult] = React.useState<Record<string, any>>({});
464
-
465
- const inlineFields = (
466
- <>
467
- <FormField
468
- control={form.control}
469
- name="keyword"
470
- render={({ field }) => (
471
- <FormItem className="flex-row items-center gap-2">
472
- <FormControl>
473
- <Input placeholder="搜索..." className="w-48" {...field} />
474
- </FormControl>
475
- </FormItem>
476
- )}
477
- />
478
- <FormField
479
- control={form.control}
480
- name="status"
481
- render={({ field }) => (
482
- <FormItem className="flex-row items-center gap-2">
483
- <FormControl>
484
- <Select
485
- options={[
486
- { value: 'active', label: '活跃' },
487
- { value: 'inactive', label: '非活跃' },
488
- { value: 'archived', label: '已归档' },
489
- ]}
490
- placeholder="全部状态"
491
- value={field.value}
492
- onChange={field.onChange}
493
- className="w-36"
494
- />
495
- </FormControl>
496
- </FormItem>
497
- )}
498
- />
499
- </>
500
- );
501
-
502
- const panelFields = (
503
- <>
504
- <FormField
505
- control={form.control}
506
- name="dateRange"
507
- render={({ field }) => (
508
- <FormItem>
509
- <FormLabel>起止时间</FormLabel>
510
- <FormControl>
511
- <DateRangePicker
512
- value={field.value}
513
- onChange={field.onChange}
514
- placeholders={['起始日期', '结束日期']}
515
- />
516
- </FormControl>
517
- </FormItem>
518
- )}
519
- />
520
- <FormField
521
- control={form.control}
522
- name="org"
523
- render={({ field }) => (
524
- <FormItem>
525
- <FormLabel>组织</FormLabel>
526
- <FormControl>
527
- <Select
528
- options={[
529
- { value: 'dev', label: '研发部' },
530
- { value: 'ops', label: '运维部' },
531
- { value: 'test', label: '测试部' },
532
- ]}
533
- placeholder="请选择"
534
- value={field.value}
535
- onChange={field.onChange}
536
- />
537
- </FormControl>
538
- </FormItem>
539
- )}
540
- />
541
- <FormField
542
- control={form.control}
543
- name="region"
544
- render={({ field }) => (
545
- <FormItem>
546
- <FormLabel>区域</FormLabel>
547
- <FormControl>
548
- <Select
549
- options={[
550
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
551
- { value: 'cn-shanghai', label: '华东2(上海)' },
552
- { value: 'cn-beijing', label: '华北2(北京)' },
553
- ]}
554
- placeholder="请选择"
555
- value={field.value}
556
- onChange={field.onChange}
557
- />
558
- </FormControl>
559
- </FormItem>
560
- )}
561
- />
562
- <FormField
563
- control={form.control}
564
- name="enableHA"
565
- render={({ field }) => (
566
- <FormItem>
567
- <FormLabel>高可用</FormLabel>
568
- <FormControl>
569
- <Switch
570
- checked={field.value}
571
- onCheckedChange={field.onChange}
572
- checkedChildren="开"
573
- unCheckedChildren="关"
574
- />
575
- </FormControl>
576
- </FormItem>
577
- )}
578
- />
579
- </>
580
- );
581
-
582
- return (
583
- <div className="w-full space-y-4 p-6">
584
- <FormProvider {...form}>
585
- <FilterBarPreset
586
- form={form}
587
- inlineFields={inlineFields}
588
- panelFields={panelFields}
589
- columns={3}
590
- onFilter={setResult}
591
- onReset={() => setResult({})}
592
- />
593
- </FormProvider>
594
- {Object.keys(result).length > 0 && (
595
- <pre className="rounded-md bg-muted p-3 text-xs">
596
- onFilter: {JSON.stringify(result, null, 2)}
597
- </pre>
598
- )}
599
- </div>
600
- );
601
- },
602
- };
603
-
604
- // ─── Story: WithValidation ───────────────────────────────────────────────────
605
-
606
- const filterSchema = z.object({
607
- keyword: z.string().optional(),
608
- org: z.string().min(1, '请选择组织'),
609
- region: z.string().optional(),
610
- agreeTerms: z.literal(true, {
611
- errorMap: () => ({ message: '请勾选同意条款' }),
612
- }),
613
- });
614
-
615
- export const WithValidation: Story = {
616
- name: '带 Zod 校验',
617
- render: () => {
618
- const form = useForm<z.infer<typeof filterSchema>>({
619
- resolver: zodResolver(filterSchema),
620
- defaultValues: {
621
- keyword: '',
622
- org: '',
623
- region: '',
624
- agreeTerms: false as unknown as true,
625
- },
626
- });
627
- const [result, setResult] = React.useState<Record<string, any>>({});
628
-
629
- return (
630
- <div className="w-full space-y-4 p-6">
631
- <FormProvider {...form}>
632
- <FilterBar
633
- form={form}
634
- defaultExpanded
635
- onFilter={setResult}
636
- onReset={() => setResult({})}
637
- >
638
- <FilterBarPanel columns={3}>
639
- <FormField
640
- control={form.control}
641
- name="keyword"
642
- render={({ field }) => (
643
- <FormItem>
644
- <FormLabel>关键词</FormLabel>
645
- <FormControl>
646
- <Input placeholder="搜索..." {...field} />
647
- </FormControl>
648
- </FormItem>
649
- )}
650
- />
651
- <FormField
652
- control={form.control}
653
- name="org"
654
- render={({ field }) => (
655
- <FormItem>
656
- <FormLabel required>组织</FormLabel>
657
- <FormControl>
658
- <Select
659
- options={[
660
- { value: 'dev', label: '研发部' },
661
- { value: 'ops', label: '运维部' },
662
- { value: 'test', label: '测试部' },
663
- ]}
664
- placeholder="必填"
665
- value={field.value}
666
- onChange={field.onChange}
667
- error={!!form.formState.errors.org}
668
- />
669
- </FormControl>
670
- <FormMessage />
671
- </FormItem>
672
- )}
673
- />
674
- <FormField
675
- control={form.control}
676
- name="region"
677
- render={({ field }) => (
678
- <FormItem>
679
- <FormLabel>区域</FormLabel>
680
- <FormControl>
681
- <Select
682
- options={[
683
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
684
- { value: 'cn-shanghai', label: '华东2(上海)' },
685
- { value: 'cn-beijing', label: '华北2(北京)' },
686
- ]}
687
- placeholder="可选"
688
- value={field.value}
689
- onChange={field.onChange}
690
- />
691
- </FormControl>
692
- </FormItem>
693
- )}
694
- />
695
- <FormField
696
- control={form.control}
697
- name="agreeTerms"
698
- render={({ field }) => (
699
- <FormItem>
700
- <div className="flex items-center gap-2">
701
- <FormControl>
702
- <Checkbox
703
- checked={field.value}
704
- onCheckedChange={field.onChange}
705
- />
706
- </FormControl>
707
- <FormLabel>同意数据使用条款</FormLabel>
708
- </div>
709
- <FormMessage />
710
- </FormItem>
711
- )}
712
- />
713
- <FilterBarActions />
714
- </FilterBarPanel>
715
- </FilterBar>
716
- </FormProvider>
717
- {Object.keys(result).length > 0 && (
718
- <pre className="rounded-md bg-muted p-3 text-xs">
719
- onFilter: {JSON.stringify(result, null, 2)}
720
- </pre>
721
- )}
722
- </div>
723
- );
724
- },
725
- };
726
-
727
- // ─── Story: Responsive ──────────────────────────────────────────────────────
728
-
729
- export const Responsive: Story = {
730
- name: '响应式多栏(responsiveColumns)',
731
- parameters: {
732
- docs: {
733
- description: {
734
- story:
735
- '传入 `responsiveColumns` 后面板切换为 CSS Grid 响应式布局。5 档断点对齐设计规范 §4.1: `base` <432 / `xs` ≥432 / `s` ≥672 / `m` ≥944 / `l` ≥1200 / `xl` ≥1600。拖动 viewport 观察 1 → 2 → 4 列切换。',
736
- },
737
- },
738
- },
739
- render: () => {
740
- const form = useForm({
741
- defaultValues: {
742
- keyword: '',
743
- org: '',
744
- region: '',
745
- status: '',
746
- instanceId: '',
747
- cpu: '',
748
- },
749
- });
750
- const [result, setResult] = React.useState<Record<string, any>>({});
751
-
752
- return (
753
- <div className="w-full space-y-4 p-6">
754
- <FormProvider {...form}>
755
- <FilterBar
756
- form={form}
757
- defaultExpanded
758
- onFilter={setResult}
759
- onReset={() => setResult({})}
760
- >
761
- <FilterBarPanel
762
- responsiveColumns={{ base: 1, xs: 2, m: 3, l: 4 }}
763
- >
764
- <FormField
765
- control={form.control}
766
- name="keyword"
767
- render={({ field }) => (
768
- <FormItem>
769
- <FormLabel>关键词</FormLabel>
770
- <FormControl>
771
- <Input placeholder="输入关键词" {...field} />
772
- </FormControl>
773
- </FormItem>
774
- )}
775
- />
776
- <FormField
777
- control={form.control}
778
- name="org"
779
- render={({ field }) => (
780
- <FormItem>
781
- <FormLabel>组织</FormLabel>
782
- <FormControl>
783
- <Select
784
- options={[
785
- { value: 'dev', label: '研发部' },
786
- { value: 'ops', label: '运维部' },
787
- { value: 'test', label: '测试部' },
788
- ]}
789
- placeholder="请选择"
790
- value={field.value}
791
- onChange={field.onChange}
792
- />
793
- </FormControl>
794
- </FormItem>
795
- )}
796
- />
797
- <FormField
798
- control={form.control}
799
- name="region"
800
- render={({ field }) => (
801
- <FormItem>
802
- <FormLabel>区域</FormLabel>
803
- <FormControl>
804
- <Select
805
- options={[
806
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
807
- { value: 'cn-shanghai', label: '华东2(上海)' },
808
- { value: 'cn-beijing', label: '华北2(北京)' },
809
- ]}
810
- placeholder="请选择"
811
- value={field.value}
812
- onChange={field.onChange}
813
- />
814
- </FormControl>
815
- </FormItem>
816
- )}
817
- />
818
- <FormField
819
- control={form.control}
820
- name="status"
821
- render={({ field }) => (
822
- <FormItem>
823
- <FormLabel>状态</FormLabel>
824
- <FormControl>
825
- <Select
826
- options={[
827
- { value: 'running', label: '运行中' },
828
- { value: 'stopped', label: '已停止' },
829
- { value: 'error', label: '异常' },
830
- ]}
831
- placeholder="请选择"
832
- value={field.value}
833
- onChange={field.onChange}
834
- />
835
- </FormControl>
836
- </FormItem>
837
- )}
838
- />
839
- <FormField
840
- control={form.control}
841
- name="instanceId"
842
- render={({ field }) => (
843
- <FormItem>
844
- <FormLabel>实例 ID</FormLabel>
845
- <FormControl>
846
- <Input placeholder="输入实例 ID" {...field} />
847
- </FormControl>
848
- </FormItem>
849
- )}
850
- />
851
- <FormField
852
- control={form.control}
853
- name="cpu"
854
- render={({ field }) => (
855
- <FormItem>
856
- <FormLabel>CPU</FormLabel>
857
- <FormControl>
858
- <Input placeholder="输入 CPU 核数" {...field} />
859
- </FormControl>
860
- </FormItem>
861
- )}
862
- />
863
- <FilterBarActions />
864
- </FilterBarPanel>
865
- </FilterBar>
866
- </FormProvider>
867
- {Object.keys(result).length > 0 && (
868
- <pre className="rounded-md bg-muted p-3 text-xs">
869
- onFilter: {JSON.stringify(result, null, 2)}
870
- </pre>
871
- )}
872
- </div>
873
- );
874
- },
875
- };
876
-
877
- // ─── Story: RightAligned ─────────────────────────────────────────────────
878
- export const RightAligned: Story = {
879
- name: 'Label 右对齐(labelAlign="right")',
880
- parameters: {
881
- docs: {
882
- description: {
883
- story:
884
- '`labelAlign="right"` 将面板内所有 `<label>` 右对齐,适用于表单式筛选区。结合 `inputMaxWidth` 可得到经典右对齐表单视觉。',
885
- },
886
- },
887
- },
888
- render: () => {
889
- const form = useForm({
890
- defaultValues: { keyword: '', org: '', region: '', status: '' },
891
- });
892
- const [result, setResult] = React.useState<Record<string, any>>({});
893
-
894
- return (
895
- <div className="w-full space-y-4 p-6">
896
- <FormProvider {...form}>
897
- <FilterBar
898
- form={form}
899
- defaultExpanded
900
- labelAlign="right"
901
- onFilter={setResult}
902
- onReset={() => setResult({})}
903
- >
904
- <FilterBarPanel columns={2}>
905
- <FormField
906
- control={form.control}
907
- name="keyword"
908
- render={({ field }) => (
909
- <FormItem>
910
- <FormLabel>关键词</FormLabel>
911
- <FormControl>
912
- <Input placeholder="输入关键词" {...field} />
913
- </FormControl>
914
- </FormItem>
915
- )}
916
- />
917
- <FormField
918
- control={form.control}
919
- name="org"
920
- render={({ field }) => (
921
- <FormItem>
922
- <FormLabel>组织</FormLabel>
923
- <FormControl>
924
- <Select
925
- options={[
926
- { value: 'dev', label: '研发部' },
927
- { value: 'ops', label: '运维部' },
928
- ]}
929
- placeholder="请选择"
930
- value={field.value}
931
- onChange={field.onChange}
932
- />
933
- </FormControl>
934
- </FormItem>
935
- )}
936
- />
937
- <FormField
938
- control={form.control}
939
- name="region"
940
- render={({ field }) => (
941
- <FormItem>
942
- <FormLabel>区域</FormLabel>
943
- <FormControl>
944
- <Select
945
- options={[
946
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
947
- { value: 'cn-beijing', label: '华北2(北京)' },
948
- ]}
949
- placeholder="请选择"
950
- value={field.value}
951
- onChange={field.onChange}
952
- />
953
- </FormControl>
954
- </FormItem>
955
- )}
956
- />
957
- <FormField
958
- control={form.control}
959
- name="status"
960
- render={({ field }) => (
961
- <FormItem>
962
- <FormLabel>运行状态</FormLabel>
963
- <FormControl>
964
- <Select
965
- options={[
966
- { value: 'running', label: '运行中' },
967
- { value: 'stopped', label: '已停止' },
968
- ]}
969
- placeholder="请选择"
970
- value={field.value}
971
- onChange={field.onChange}
972
- />
973
- </FormControl>
974
- </FormItem>
975
- )}
976
- />
977
- <FilterBarActions />
978
- </FilterBarPanel>
979
- </FilterBar>
980
- </FormProvider>
981
- {Object.keys(result).length > 0 && (
982
- <pre className="rounded-md bg-muted p-3 text-xs">
983
- onFilter: {JSON.stringify(result, null, 2)}
984
- </pre>
985
- )}
986
- </div>
987
- );
988
- },
989
- };
990
-
991
- // ─── Story: WithMaxWidth ─────────────────────────────────────────────────
992
- export const WithMaxWidth: Story = {
993
- name: '输入域最大宽度(inputMaxWidth)',
994
- parameters: {
995
- docs: {
996
- description: {
997
- story:
998
- '`inputMaxWidth` 为面板内每个输入域设置最大宽度(默认多栏 400px / 双栏 600px)。本例显式约束为 320px,防止输入域过宽。',
999
- },
1000
- },
1001
- },
1002
- render: () => {
1003
- const form = useForm({
1004
- defaultValues: { keyword: '', org: '', region: '' },
1005
- });
1006
- const [result, setResult] = React.useState<Record<string, any>>({});
1007
-
1008
- return (
1009
- <div className="w-full space-y-4 p-6">
1010
- <FormProvider {...form}>
1011
- <FilterBar
1012
- form={form}
1013
- defaultExpanded
1014
- inputMaxWidth={320}
1015
- onFilter={setResult}
1016
- onReset={() => setResult({})}
1017
- >
1018
- <FilterBarPanel columns={3}>
1019
- <FormField
1020
- control={form.control}
1021
- name="keyword"
1022
- render={({ field }) => (
1023
- <FormItem>
1024
- <FormLabel>关键词</FormLabel>
1025
- <FormControl>
1026
- <Input placeholder="输入关键词" {...field} />
1027
- </FormControl>
1028
- </FormItem>
1029
- )}
1030
- />
1031
- <FormField
1032
- control={form.control}
1033
- name="org"
1034
- render={({ field }) => (
1035
- <FormItem>
1036
- <FormLabel>组织</FormLabel>
1037
- <FormControl>
1038
- <Select
1039
- options={[
1040
- { value: 'dev', label: '研发部' },
1041
- { value: 'ops', label: '运维部' },
1042
- ]}
1043
- placeholder="请选择"
1044
- value={field.value}
1045
- onChange={field.onChange}
1046
- />
1047
- </FormControl>
1048
- </FormItem>
1049
- )}
1050
- />
1051
- <FormField
1052
- control={form.control}
1053
- name="region"
1054
- render={({ field }) => (
1055
- <FormItem>
1056
- <FormLabel>区域</FormLabel>
1057
- <FormControl>
1058
- <Select
1059
- options={[
1060
- { value: 'cn-hangzhou', label: '华东1(杭州)' },
1061
- { value: 'cn-shanghai', label: '华东2(上海)' },
1062
- ]}
1063
- placeholder="请选择"
1064
- value={field.value}
1065
- onChange={field.onChange}
1066
- />
1067
- </FormControl>
1068
- </FormItem>
1069
- )}
1070
- />
1071
- <FilterBarActions />
1072
- </FilterBarPanel>
1073
- </FilterBar>
1074
- </FormProvider>
1075
- {Object.keys(result).length > 0 && (
1076
- <pre className="rounded-md bg-muted p-3 text-xs">
1077
- onFilter: {JSON.stringify(result, null, 2)}
1078
- </pre>
1079
- )}
1080
- </div>
1081
- );
1082
- },
1083
- };