@teamix-evo/ui 0.4.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 (511) hide show
  1. package/README.md +46 -50
  2. package/manifest.json +406 -653
  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 -466
  273. package/src/components/calendar/calendar.meta.md +0 -128
  274. package/src/components/calendar/calendar.stories.tsx +0 -68
  275. package/src/components/calendar/calendar.tsx +0 -172
  276. package/src/components/card/card.meta.md +0 -139
  277. package/src/components/card/card.stories.tsx +0 -151
  278. package/src/components/card/card.tsx +0 -306
  279. package/src/components/carousel/carousel.meta.md +0 -118
  280. package/src/components/carousel/carousel.stories.tsx +0 -89
  281. package/src/components/carousel/carousel.tsx +0 -224
  282. package/src/components/cascader/cascader.meta.md +0 -140
  283. package/src/components/cascader/cascader.stories.tsx +0 -120
  284. package/src/components/cascader/cascader.tsx +0 -548
  285. package/src/components/checkbox/checkbox.meta.md +0 -167
  286. package/src/components/checkbox/checkbox.stories.tsx +0 -288
  287. package/src/components/checkbox/checkbox.tsx +0 -195
  288. package/src/components/collapsible/collapsible.meta.md +0 -88
  289. package/src/components/collapsible/collapsible.stories.tsx +0 -43
  290. package/src/components/collapsible/collapsible.tsx +0 -105
  291. package/src/components/color-picker/color-picker.meta.md +0 -89
  292. package/src/components/color-picker/color-picker.stories.tsx +0 -159
  293. package/src/components/color-picker/color-picker.tsx +0 -171
  294. package/src/components/command/command.meta.md +0 -120
  295. package/src/components/command/command.stories.tsx +0 -59
  296. package/src/components/command/command.tsx +0 -158
  297. package/src/components/context-menu/context-menu.meta.md +0 -93
  298. package/src/components/context-menu/context-menu.stories.tsx +0 -54
  299. package/src/components/context-menu/context-menu.tsx +0 -204
  300. package/src/components/data-table/data-table.meta.md +0 -150
  301. package/src/components/data-table/data-table.stories.tsx +0 -132
  302. package/src/components/data-table/data-table.tsx +0 -185
  303. package/src/components/date-picker/date-picker.meta.md +0 -175
  304. package/src/components/date-picker/date-picker.stories.tsx +0 -108
  305. package/src/components/date-picker/date-picker.tsx +0 -1554
  306. package/src/components/descriptions/descriptions.meta.md +0 -83
  307. package/src/components/descriptions/descriptions.stories.tsx +0 -60
  308. package/src/components/descriptions/descriptions.tsx +0 -137
  309. package/src/components/dialog/dialog.meta.md +0 -168
  310. package/src/components/dialog/dialog.stories.tsx +0 -255
  311. package/src/components/dialog/dialog.tsx +0 -180
  312. package/src/components/dialog/imperative.tsx +0 -252
  313. package/src/components/drawer/drawer.meta.md +0 -95
  314. package/src/components/drawer/drawer.stories.tsx +0 -71
  315. package/src/components/drawer/drawer.tsx +0 -23
  316. package/src/components/dropdown-menu/dropdown-menu.meta.md +0 -171
  317. package/src/components/dropdown-menu/dropdown-menu.stories.tsx +0 -198
  318. package/src/components/dropdown-menu/dropdown-menu.tsx +0 -209
  319. package/src/components/ellipsis/ellipsis.meta.md +0 -87
  320. package/src/components/ellipsis/ellipsis.stories.tsx +0 -72
  321. package/src/components/ellipsis/ellipsis.tsx +0 -153
  322. package/src/components/empty/empty.meta.md +0 -86
  323. package/src/components/empty/empty.stories.tsx +0 -46
  324. package/src/components/empty/empty.tsx +0 -54
  325. package/src/components/field/field.meta.md +0 -154
  326. package/src/components/field/field.stories.tsx +0 -497
  327. package/src/components/field/field.tsx +0 -392
  328. package/src/components/filter-bar/filter-bar.meta.md +0 -92
  329. package/src/components/filter-bar/filter-bar.stories.tsx +0 -1086
  330. package/src/components/filter-bar/filter-bar.tsx +0 -568
  331. package/src/components/flex/flex.meta.md +0 -142
  332. package/src/components/flex/flex.stories.tsx +0 -199
  333. package/src/components/flex/flex.tsx +0 -145
  334. package/src/components/float-button/float-button.meta.md +0 -92
  335. package/src/components/float-button/float-button.stories.tsx +0 -80
  336. package/src/components/float-button/float-button.tsx +0 -143
  337. package/src/components/form/form.meta.md +0 -153
  338. package/src/components/form/form.stories.tsx +0 -472
  339. package/src/components/form/form.tsx +0 -260
  340. package/src/components/grid/grid.meta.md +0 -92
  341. package/src/components/grid/grid.stories.tsx +0 -101
  342. package/src/components/grid/grid.tsx +0 -130
  343. package/src/components/hover-card/hover-card.meta.md +0 -103
  344. package/src/components/hover-card/hover-card.stories.tsx +0 -97
  345. package/src/components/hover-card/hover-card.tsx +0 -67
  346. package/src/components/icon/DEVELOPMENT.md +0 -809
  347. package/src/components/icon/icon.meta.md +0 -170
  348. package/src/components/icon/icon.stories.tsx +0 -344
  349. package/src/components/icon/icon.tsx +0 -248
  350. package/src/components/image/image.meta.md +0 -99
  351. package/src/components/image/image.stories.tsx +0 -55
  352. package/src/components/image/image.tsx +0 -140
  353. package/src/components/input/input.meta.md +0 -115
  354. package/src/components/input/input.stories.tsx +0 -144
  355. package/src/components/input/input.tsx +0 -212
  356. package/src/components/input-group/input-group.meta.md +0 -124
  357. package/src/components/input-group/input-group.stories.tsx +0 -121
  358. package/src/components/input-group/input-group.tsx +0 -143
  359. package/src/components/input-number/input-number.meta.md +0 -148
  360. package/src/components/input-number/input-number.stories.tsx +0 -125
  361. package/src/components/input-number/input-number.tsx +0 -283
  362. package/src/components/input-otp/input-otp.meta.md +0 -106
  363. package/src/components/input-otp/input-otp.stories.tsx +0 -65
  364. package/src/components/input-otp/input-otp.tsx +0 -97
  365. package/src/components/item/item.meta.md +0 -121
  366. package/src/components/item/item.stories.tsx +0 -116
  367. package/src/components/item/item.tsx +0 -172
  368. package/src/components/kbd/kbd.meta.md +0 -94
  369. package/src/components/kbd/kbd.stories.tsx +0 -70
  370. package/src/components/kbd/kbd.tsx +0 -86
  371. package/src/components/label/label.meta.md +0 -99
  372. package/src/components/label/label.stories.tsx +0 -145
  373. package/src/components/label/label.tsx +0 -138
  374. package/src/components/masonry/masonry.meta.md +0 -90
  375. package/src/components/masonry/masonry.stories.tsx +0 -68
  376. package/src/components/masonry/masonry.tsx +0 -60
  377. package/src/components/mentions/mentions.meta.md +0 -119
  378. package/src/components/mentions/mentions.stories.tsx +0 -189
  379. package/src/components/mentions/mentions.tsx +0 -243
  380. package/src/components/menubar/menubar.meta.md +0 -118
  381. package/src/components/menubar/menubar.stories.tsx +0 -141
  382. package/src/components/menubar/menubar.tsx +0 -232
  383. package/src/components/native-select/native-select.meta.md +0 -93
  384. package/src/components/native-select/native-select.stories.tsx +0 -83
  385. package/src/components/native-select/native-select.tsx +0 -54
  386. package/src/components/navigation-menu/navigation-menu.meta.md +0 -118
  387. package/src/components/navigation-menu/navigation-menu.stories.tsx +0 -215
  388. package/src/components/navigation-menu/navigation-menu.tsx +0 -129
  389. package/src/components/notification/notification.meta.md +0 -133
  390. package/src/components/notification/notification.stories.tsx +0 -98
  391. package/src/components/notification/notification.tsx +0 -99
  392. package/src/components/page-header/DEVELOPMENT.md +0 -842
  393. package/src/components/page-header/page-header.meta.md +0 -210
  394. package/src/components/page-header/page-header.stories.tsx +0 -428
  395. package/src/components/page-header/page-header.tsx +0 -284
  396. package/src/components/page-shell/page-shell.meta.md +0 -116
  397. package/src/components/page-shell/page-shell.stories.tsx +0 -149
  398. package/src/components/page-shell/page-shell.tsx +0 -115
  399. package/src/components/pagination/pagination.meta.md +0 -230
  400. package/src/components/pagination/pagination.stories.tsx +0 -284
  401. package/src/components/pagination/pagination.tsx +0 -567
  402. package/src/components/popconfirm/popconfirm.meta.md +0 -114
  403. package/src/components/popconfirm/popconfirm.stories.tsx +0 -75
  404. package/src/components/popconfirm/popconfirm.tsx +0 -134
  405. package/src/components/popover/popover.meta.md +0 -154
  406. package/src/components/popover/popover.stories.tsx +0 -158
  407. package/src/components/popover/popover.tsx +0 -104
  408. package/src/components/progress/progress.meta.md +0 -118
  409. package/src/components/progress/progress.stories.tsx +0 -75
  410. package/src/components/progress/progress.tsx +0 -203
  411. package/src/components/radio-group/radio-group.meta.md +0 -175
  412. package/src/components/radio-group/radio-group.stories.tsx +0 -113
  413. package/src/components/radio-group/radio-group.tsx +0 -209
  414. package/src/components/rate/rate.meta.md +0 -118
  415. package/src/components/rate/rate.stories.tsx +0 -89
  416. package/src/components/rate/rate.tsx +0 -180
  417. package/src/components/resizable/resizable.meta.md +0 -95
  418. package/src/components/resizable/resizable.stories.tsx +0 -104
  419. package/src/components/resizable/resizable.tsx +0 -56
  420. package/src/components/result/result.meta.md +0 -95
  421. package/src/components/result/result.stories.tsx +0 -67
  422. package/src/components/result/result.tsx +0 -100
  423. package/src/components/scroll-area/scroll-area.meta.md +0 -85
  424. package/src/components/scroll-area/scroll-area.stories.tsx +0 -49
  425. package/src/components/scroll-area/scroll-area.tsx +0 -51
  426. package/src/components/segmented/segmented.meta.md +0 -106
  427. package/src/components/segmented/segmented.stories.tsx +0 -130
  428. package/src/components/segmented/segmented.tsx +0 -146
  429. package/src/components/select/select.meta.md +0 -255
  430. package/src/components/select/select.stories.tsx +0 -275
  431. package/src/components/select/select.tsx +0 -735
  432. package/src/components/separator/separator.meta.md +0 -75
  433. package/src/components/separator/separator.stories.tsx +0 -71
  434. package/src/components/separator/separator.tsx +0 -100
  435. package/src/components/sheet/sheet.meta.md +0 -113
  436. package/src/components/sheet/sheet.stories.tsx +0 -188
  437. package/src/components/sheet/sheet.tsx +0 -226
  438. package/src/components/sidebar/sidebar.meta.md +0 -151
  439. package/src/components/sidebar/sidebar.tsx +0 -853
  440. package/src/components/skeleton/skeleton.meta.md +0 -94
  441. package/src/components/skeleton/skeleton.stories.tsx +0 -79
  442. package/src/components/skeleton/skeleton.tsx +0 -144
  443. package/src/components/slider/slider.meta.md +0 -146
  444. package/src/components/slider/slider.stories.tsx +0 -121
  445. package/src/components/slider/slider.tsx +0 -227
  446. package/src/components/sonner/sonner.meta.md +0 -147
  447. package/src/components/sonner/sonner.stories.tsx +0 -164
  448. package/src/components/sonner/sonner.tsx +0 -169
  449. package/src/components/spinner/spinner.meta.md +0 -125
  450. package/src/components/spinner/spinner.stories.tsx +0 -123
  451. package/src/components/spinner/spinner.tsx +0 -166
  452. package/src/components/statistic/statistic.meta.md +0 -104
  453. package/src/components/statistic/statistic.stories.tsx +0 -67
  454. package/src/components/steps/steps.meta.md +0 -116
  455. package/src/components/steps/steps.stories.tsx +0 -115
  456. package/src/components/steps/steps.tsx +0 -173
  457. package/src/components/switch/switch.meta.md +0 -138
  458. package/src/components/switch/switch.stories.tsx +0 -75
  459. package/src/components/switch/switch.tsx +0 -169
  460. package/src/components/table/table.meta.md +0 -106
  461. package/src/components/table/table.stories.tsx +0 -80
  462. package/src/components/table/table.tsx +0 -124
  463. package/src/components/tabs/tabs.meta.md +0 -111
  464. package/src/components/tabs/tabs.stories.tsx +0 -156
  465. package/src/components/tabs/tabs.tsx +0 -190
  466. package/src/components/tag/tag.meta.md +0 -159
  467. package/src/components/tag/tag.stories.tsx +0 -250
  468. package/src/components/tag/tag.tsx +0 -386
  469. package/src/components/textarea/textarea.meta.md +0 -99
  470. package/src/components/textarea/textarea.stories.tsx +0 -89
  471. package/src/components/textarea/textarea.tsx +0 -137
  472. package/src/components/time-picker/time-picker.meta.md +0 -175
  473. package/src/components/time-picker/time-picker.stories.tsx +0 -129
  474. package/src/components/time-picker/time-picker.tsx +0 -946
  475. package/src/components/timeline/timeline.meta.md +0 -110
  476. package/src/components/timeline/timeline.stories.tsx +0 -134
  477. package/src/components/timeline/timeline.tsx +0 -168
  478. package/src/components/toggle/toggle.meta.md +0 -89
  479. package/src/components/toggle/toggle.stories.tsx +0 -66
  480. package/src/components/toggle/toggle.tsx +0 -54
  481. package/src/components/toggle-group/toggle-group.meta.md +0 -91
  482. package/src/components/toggle-group/toggle-group.stories.tsx +0 -83
  483. package/src/components/toggle-group/toggle-group.tsx +0 -78
  484. package/src/components/tooltip/tooltip.meta.md +0 -149
  485. package/src/components/tooltip/tooltip.stories.tsx +0 -108
  486. package/src/components/tooltip/tooltip.tsx +0 -153
  487. package/src/components/tour/tour.meta.md +0 -121
  488. package/src/components/tour/tour.stories.tsx +0 -66
  489. package/src/components/tour/tour.tsx +0 -242
  490. package/src/components/transfer/transfer.meta.md +0 -95
  491. package/src/components/transfer/transfer.stories.tsx +0 -64
  492. package/src/components/transfer/transfer.tsx +0 -258
  493. package/src/components/tree/tree.meta.md +0 -169
  494. package/src/components/tree/tree.stories.tsx +0 -128
  495. package/src/components/tree/tree.tsx +0 -368
  496. package/src/components/tree-select/tree-select.meta.md +0 -151
  497. package/src/components/tree-select/tree-select.stories.tsx +0 -80
  498. package/src/components/tree-select/tree-select.tsx +0 -206
  499. package/src/components/typography/typography.meta.md +0 -149
  500. package/src/components/typography/typography.stories.tsx +0 -116
  501. package/src/components/typography/typography.tsx +0 -260
  502. package/src/components/upload/upload.meta.md +0 -156
  503. package/src/components/upload/upload.stories.tsx +0 -135
  504. package/src/components/upload/upload.tsx +0 -398
  505. package/src/components/watermark/watermark.meta.md +0 -100
  506. package/src/components/watermark/watermark.stories.tsx +0 -170
  507. package/src/components/watermark/watermark.tsx +0 -166
  508. package/src/hooks/use-breakpoint.ts +0 -117
  509. package/src/hooks/use-debounce-callback.ts +0 -52
  510. package/src/stories/theme-tokens.stories.tsx +0 -747
  511. package/src/utils/trigger-input.ts +0 -57
@@ -0,0 +1,290 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Boxes, BookOpen, Cloud, Layers, List, LayoutGrid } from 'lucide-react';
3
+ import {
4
+ PageHeader,
5
+ PageHeaderNav,
6
+ PageHeaderContent,
7
+ PageHeaderHeading,
8
+ PageHeaderTitle,
9
+ PageHeaderDescription,
10
+ PageHeaderActions,
11
+ PageHeaderFooter,
12
+ } from './index';
13
+ import {
14
+ Breadcrumb,
15
+ BreadcrumbList,
16
+ BreadcrumbItem,
17
+ BreadcrumbLink,
18
+ BreadcrumbSeparator,
19
+ BreadcrumbPage,
20
+ } from '@/components/breadcrumb';
21
+ import { Button } from '@/components/button';
22
+ import { Tag } from '@/components/tag';
23
+ import { Statistic } from '@/components/statistic';
24
+ import {
25
+ Descriptions,
26
+ DescriptionsContent,
27
+ DescriptionsItem,
28
+ DescriptionsLabel,
29
+ } from '@/components/descriptions';
30
+ import { ToggleGroup, ToggleGroupItem } from '@/components/toggle-group';
31
+ import { Separator } from '@/components/separator';
32
+
33
+ const meta: Meta<typeof PageHeader> = {
34
+ title: '导航 · Navigation/PageHeader 页头',
35
+ component: PageHeader,
36
+ tags: ['autodocs'],
37
+ };
38
+ export default meta;
39
+
40
+ type Story = StoryObj<typeof meta>;
41
+
42
+ /** 完整版页头:面包屑 + 帮助链接 + 返回 + 主图标 + 标题(含 ⓘ) + 描述 + 多操作 + 底部信息。 */
43
+ export const Default: Story = {
44
+ render: () => (
45
+ <PageHeader>
46
+ <PageHeaderNav>
47
+ <Breadcrumb>
48
+ <BreadcrumbList>
49
+ <BreadcrumbItem>
50
+ <BreadcrumbLink href="#">首页</BreadcrumbLink>
51
+ </BreadcrumbItem>
52
+ <BreadcrumbSeparator />
53
+ <BreadcrumbItem>
54
+ <BreadcrumbLink href="#">实例列表</BreadcrumbLink>
55
+ </BreadcrumbItem>
56
+ <BreadcrumbSeparator />
57
+ <BreadcrumbItem>
58
+ <BreadcrumbPage>实例详情</BreadcrumbPage>
59
+ </BreadcrumbItem>
60
+ </BreadcrumbList>
61
+ </Breadcrumb>
62
+ <div className="flex items-center gap-4">
63
+ <a
64
+ href="#"
65
+ className="inline-flex items-center gap-1 text-muted-foreground hover:text-foreground"
66
+ >
67
+ <BookOpen className="size-3.5" aria-hidden="true" />
68
+ 帮助文档
69
+ </a>
70
+ <a href="#" className="text-muted-foreground hover:text-foreground">
71
+ 切换实例
72
+ </a>
73
+ </div>
74
+ </PageHeaderNav>
75
+ <PageHeaderContent>
76
+ <div className="flex flex-col">
77
+ <PageHeaderHeading goBack onBack={() => alert('返回')}>
78
+ <span
79
+ aria-hidden="true"
80
+ className="flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-primary-foreground"
81
+ >
82
+ <Boxes className="size-5" />
83
+ </span>
84
+ <PageHeaderTitle tooltip="该实例为生产环境,建议谨慎操作。">
85
+ 页面标题
86
+ </PageHeaderTitle>
87
+ <Tag variant="solid" color="success" size="lg">
88
+ 标签一
89
+ </Tag>
90
+ <Tag variant="solid" color="primary" size="lg">
91
+ 标签二
92
+ </Tag>
93
+ <Tag variant="solid" color="destructive" size="lg">
94
+ 标签三
95
+ </Tag>
96
+ </PageHeaderHeading>
97
+ <PageHeaderDescription>
98
+ 页面描述页面描述页面描述页面描述页面描述页面描述页面描述
99
+ </PageHeaderDescription>
100
+ </div>
101
+ <PageHeaderActions>
102
+ <Button variant="outline">普通按钮</Button>
103
+ <Button>主要按钮</Button>
104
+ </PageHeaderActions>
105
+ </PageHeaderContent>
106
+ </PageHeader>
107
+ ),
108
+ };
109
+
110
+ /** 带数据概览:右侧使用 Statistic 组件展示 KPI 指标。 */
111
+ export const WithStatistic: Story = {
112
+ render: () => (
113
+ <PageHeader>
114
+ <PageHeaderContent>
115
+ <div className="flex flex-col">
116
+ <PageHeaderHeading>
117
+ <PageHeaderTitle>页面标题</PageHeaderTitle>
118
+ </PageHeaderHeading>
119
+ <PageHeaderDescription>
120
+ 页面描述页面描述页面描述页面描述页面描述页面描述页面描述
121
+ </PageHeaderDescription>
122
+ </div>
123
+ <div className="flex items-center gap-6">
124
+ <Statistic title="总数" value={456} valueClassName="text-base" />
125
+ <Statistic title="运行中" value={324} valueClassName="text-base" />
126
+ <Statistic title="已暂停" value={46} valueClassName="text-base" />
127
+ <Statistic
128
+ title="停止"
129
+ value={14}
130
+ valueClassName="text-base text-destructive"
131
+ />
132
+ <Statistic title="回收站" value={8} valueClassName="text-base" />
133
+ </div>
134
+ </PageHeaderContent>
135
+ </PageHeader>
136
+ ),
137
+ };
138
+
139
+ /** 带描述列表:底部使用 Descriptions 组件展示项目详细信息。 */
140
+ export const WithDescriptions: Story = {
141
+ render: () => (
142
+ <PageHeader>
143
+ <PageHeaderContent>
144
+ <div className="flex flex-col">
145
+ <PageHeaderHeading>
146
+ <PageHeaderTitle>项目详情</PageHeaderTitle>
147
+ </PageHeaderHeading>
148
+ <PageHeaderDescription>
149
+ 查看项目完整信息与最新状态。
150
+ </PageHeaderDescription>
151
+ </div>
152
+ <PageHeaderActions>
153
+ <Button variant="outline">普通按钮</Button>
154
+ <Button>主要按钮</Button>
155
+ </PageHeaderActions>
156
+ </PageHeaderContent>
157
+ <PageHeaderFooter>
158
+ <Descriptions column={3}>
159
+ <DescriptionsItem>
160
+ <DescriptionsLabel>项目名称</DescriptionsLabel>
161
+ <DescriptionsContent>Teamix Evo</DescriptionsContent>
162
+ </DescriptionsItem>
163
+ <DescriptionsItem>
164
+ <DescriptionsLabel>负责人</DescriptionsLabel>
165
+ <DescriptionsContent>张三</DescriptionsContent>
166
+ </DescriptionsItem>
167
+ <DescriptionsItem>
168
+ <DescriptionsLabel>状态</DescriptionsLabel>
169
+ <DescriptionsContent>进行中</DescriptionsContent>
170
+ </DescriptionsItem>
171
+ <DescriptionsItem>
172
+ <DescriptionsLabel>创建时间</DescriptionsLabel>
173
+ <DescriptionsContent>2024-01-01</DescriptionsContent>
174
+ </DescriptionsItem>
175
+ <DescriptionsItem>
176
+ <DescriptionsLabel>更新时间</DescriptionsLabel>
177
+ <DescriptionsContent>2024-06-01</DescriptionsContent>
178
+ </DescriptionsItem>
179
+ <DescriptionsItem>
180
+ <DescriptionsLabel>描述</DescriptionsLabel>
181
+ <DescriptionsContent>面向 AI Coding 的研发套件</DescriptionsContent>
182
+ </DescriptionsItem>
183
+ </Descriptions>
184
+ </PageHeaderFooter>
185
+ </PageHeader>
186
+ ),
187
+ };
188
+
189
+ /** 带视图切换:标题旁使用 ToggleGroup 切换视图模式。 */
190
+ export const WithViewToggle: Story = {
191
+ render: () => (
192
+ <PageHeader>
193
+ <PageHeaderNav>
194
+ <Breadcrumb>
195
+ <BreadcrumbList>
196
+ <BreadcrumbItem>
197
+ <BreadcrumbLink href="#">首页</BreadcrumbLink>
198
+ </BreadcrumbItem>
199
+ <BreadcrumbSeparator />
200
+ <BreadcrumbItem>
201
+ <BreadcrumbLink href="#">二级标题</BreadcrumbLink>
202
+ </BreadcrumbItem>
203
+ <BreadcrumbSeparator />
204
+ <BreadcrumbItem>
205
+ <BreadcrumbLink href="#">三级标题</BreadcrumbLink>
206
+ </BreadcrumbItem>
207
+ <BreadcrumbSeparator />
208
+ <BreadcrumbItem>
209
+ <BreadcrumbPage>当前</BreadcrumbPage>
210
+ </BreadcrumbItem>
211
+ </BreadcrumbList>
212
+ </Breadcrumb>
213
+ </PageHeaderNav>
214
+ <PageHeaderContent>
215
+ <PageHeaderHeading goBack onBack={() => alert('返回')}>
216
+ <PageHeaderTitle>页面标题</PageHeaderTitle>
217
+ <ToggleGroup type="single" defaultValue="list" spacing={0}>
218
+ <ToggleGroupItem value="card" aria-label="卡片视图">
219
+ <Layers className="size-4" />
220
+ </ToggleGroupItem>
221
+ <ToggleGroupItem value="list" aria-label="列表视图">
222
+ <List className="size-4" />
223
+ </ToggleGroupItem>
224
+ <ToggleGroupItem value="grid" aria-label="网格视图">
225
+ <LayoutGrid className="size-4" />
226
+ </ToggleGroupItem>
227
+ </ToggleGroup>
228
+ </PageHeaderHeading>
229
+ </PageHeaderContent>
230
+ </PageHeader>
231
+ ),
232
+ };
233
+
234
+ /** 右侧装饰图版本:无操作按钮,右侧用 lucide icon(Cloud)放大 + 半透明作背景插画。 */
235
+ export const WithBackgroundIllustration: Story = {
236
+ render: () => (
237
+ <PageHeader>
238
+ <Cloud
239
+ aria-hidden="true"
240
+ className="pointer-events-none absolute top-0 right-0 size-24 text-primary/10"
241
+ />
242
+ <PageHeaderNav>
243
+ <Breadcrumb>
244
+ <BreadcrumbList>
245
+ <BreadcrumbItem>
246
+ <BreadcrumbLink href="#">首页</BreadcrumbLink>
247
+ </BreadcrumbItem>
248
+ <BreadcrumbSeparator />
249
+ <BreadcrumbItem>
250
+ <BreadcrumbPage>云服务概览</BreadcrumbPage>
251
+ </BreadcrumbItem>
252
+ </BreadcrumbList>
253
+ </Breadcrumb>
254
+ </PageHeaderNav>
255
+ <PageHeaderContent>
256
+ <div className="flex flex-col">
257
+ <PageHeaderHeading>
258
+ <span
259
+ aria-hidden="true"
260
+ className="flex size-8 shrink-0 items-center justify-center rounded-md bg-primary text-primary-foreground"
261
+ >
262
+ <Boxes className="size-5" />
263
+ </span>
264
+ <PageHeaderTitle>云服务概览</PageHeaderTitle>
265
+ </PageHeaderHeading>
266
+ <PageHeaderDescription>
267
+ 管理您的云资源、查看实例运行状态与计费明细。
268
+ </PageHeaderDescription>
269
+ </div>
270
+ </PageHeaderContent>
271
+ </PageHeader>
272
+ ),
273
+ };
274
+
275
+ /** 带返回按钮的详情页头。 */
276
+ export const WithGoBack: Story = {
277
+ render: () => (
278
+ <PageHeader>
279
+ <PageHeaderContent>
280
+ <PageHeaderHeading goBack onBack={() => alert('返回')}>
281
+ <PageHeaderTitle>详情页标题</PageHeaderTitle>
282
+ </PageHeaderHeading>
283
+ <PageHeaderActions>
284
+ <Button>操作</Button>
285
+ </PageHeaderActions>
286
+ </PageHeaderContent>
287
+ <PageHeaderDescription>补充描述信息。</PageHeaderDescription>
288
+ </PageHeader>
289
+ ),
290
+ };
@@ -0,0 +1,119 @@
1
+ /**
2
+ * 页面骨架 PageShell
3
+ *
4
+ * 页面级布局壳,组合 header + sidebar + 主区三个 slot,
5
+ * 覆盖全屏、仅顶部、仅左导、顶部+左导四种页面形态。
6
+ *
7
+ * @when
8
+ * - 搭建应用级页面布局(管理后台、控制台)
9
+ * - 需要 header + sidebar + content 三栏组合
10
+ * - 需要可切换的页面背景色
11
+ *
12
+ * 组合结构:PageShell > header(slot) + sidebar(slot) + children
13
+ */
14
+ 'use client';
15
+
16
+ import * as React from 'react';
17
+
18
+ import { cn } from '@/lib/utils';
19
+ import { SidebarInset, SidebarProvider } from '@/components/sidebar';
20
+
21
+ export type PageShellBackground =
22
+ | 'background'
23
+ | 'muted'
24
+ | 'card'
25
+ | 'sidebar'
26
+ | 'accent';
27
+
28
+ const BG_CLASS: Record<PageShellBackground, string> = {
29
+ background: 'bg-background',
30
+ muted: 'bg-muted',
31
+ card: 'bg-card',
32
+ sidebar: 'bg-sidebar',
33
+ accent: 'bg-accent',
34
+ };
35
+
36
+ export interface PageShellProps extends React.ComponentProps<'div'> {
37
+ /** 顶部条 slot — 通常是 Navbar / TopBar,不传则不渲染顶部 */
38
+ header?: React.ReactNode;
39
+ /** 左侧 slot — 通常是 Sidebar 组件,不传则不渲染侧边栏 */
40
+ sidebar?: React.ReactNode;
41
+ /** 主区内容 */
42
+ children: React.ReactNode;
43
+ /**
44
+ * 主区背景,走 shadcn 语义槽枚举
45
+ * @default "background"
46
+ */
47
+ background?: PageShellBackground;
48
+ /**
49
+ * sidebar 宽度,透传 SidebarProvider 的 --sidebar-width
50
+ * @default "14rem"
51
+ */
52
+ sidebarWidth?: string;
53
+ }
54
+
55
+ function PageShell({
56
+ header,
57
+ sidebar,
58
+ children,
59
+ background = 'background',
60
+ sidebarWidth = '14rem',
61
+ className,
62
+ style,
63
+ ...props
64
+ }: PageShellProps) {
65
+ const bgClass = BG_CLASS[background];
66
+
67
+ if (!sidebar) {
68
+ return (
69
+ <div
70
+ data-slot="page-shell"
71
+ className={cn('flex min-h-svh w-full flex-col', className)}
72
+ style={style}
73
+ {...props}
74
+ >
75
+ {header}
76
+ <main
77
+ data-slot="page-shell-content"
78
+ className={cn('flex-1 overflow-y-auto', bgClass)}
79
+ >
80
+ {children}
81
+ </main>
82
+ </div>
83
+ );
84
+ }
85
+
86
+ return (
87
+ <SidebarProvider
88
+ data-slot="page-shell"
89
+ // SidebarProvider 默认 wrapper 是 `flex min-h-svh`(row);
90
+ // PageShell 需要 column 排列(header 在上,sidebar+主区在下),故 `!flex-col` 覆盖。
91
+ // 高度策略:保留 SidebarProvider 默认 `min-h-svh` 让 wrapper 真实页面下撑满 viewport,
92
+ // 这样 OpPageContainer 等内嵌容器的 `flex-1` 链路能拿到稳定高度全高渲染。
93
+ // 受限容器(如 storybook `LayoutSandbox`)通过外级注入 `min-height: 0; height: 100%` 重置。
94
+ // 说明:传入的 sidebar 如果是默认 collapsible="offcanvas",其内部使用 `position: fixed`、
95
+ // 高度 100svh,适用于全屏页面;在受限容器中需使用 `collapsible="none"` 退出 fixed 布局。
96
+ className={cn('!flex-col', className)}
97
+ style={
98
+ {
99
+ '--sidebar-width': sidebarWidth,
100
+ ...style,
101
+ } as React.CSSProperties
102
+ }
103
+ {...props}
104
+ >
105
+ {header}
106
+ <div className="flex w-full flex-1 min-h-0">
107
+ {sidebar}
108
+ <SidebarInset
109
+ data-slot="page-shell-content"
110
+ className={cn('!min-h-0 overflow-y-auto', bgClass)}
111
+ >
112
+ {children}
113
+ </SidebarInset>
114
+ </div>
115
+ </SidebarProvider>
116
+ );
117
+ }
118
+
119
+ export { PageShell };
@@ -0,0 +1,115 @@
1
+ # PageShell
2
+
3
+ > 本文件由 `pnpm gen:meta` 自动生成,**请勿手动编辑**。
4
+
5
+ ## 描述
6
+
7
+ 页面骨架 PageShell
8
+ 页面级布局壳,组合 header + sidebar + 主区三个 slot,
9
+ 覆盖全屏、仅顶部、仅左导、顶部+左导四种页面形态。
10
+
11
+ ## 使用场景
12
+
13
+ - 搭建应用级页面布局(管理后台、控制台)
14
+ - 需要 header + sidebar + content 三栏组合
15
+ - 需要可切换的页面背景色
16
+ - 组合结构:PageShell > header(slot) + sidebar(slot) + children
17
+
18
+ ## Props
19
+
20
+ | 名称 | 类型 | 默认值 | 必填 | 说明 |
21
+ | --- | --- | --- | --- | --- |
22
+ | `header` | `React.ReactNode` | – | – | 顶部条 slot — 通常是 Navbar / TopBar,不传则不渲染顶部 |
23
+ | `sidebar` | `React.ReactNode` | – | – | 左侧 slot — 通常是 Sidebar 组件,不传则不渲染侧边栏 |
24
+ | `children` | `React.ReactNode` | – | ✓ | 主区内容 |
25
+ | `background` | `PageShellBackground` | `"background"` | – | 主区背景,走 shadcn 语义槽枚举 |
26
+ | `sidebarWidth` | `string` | `"14rem"` | – | sidebar 宽度,透传 SidebarProvider 的 --sidebar-width |
27
+
28
+ ## 示例
29
+
30
+ ### HeaderOnly
31
+
32
+ 仅顶部条 + 主区。
33
+
34
+ ```tsx
35
+ <PageShell
36
+ header={
37
+ <div className="flex h-12 items-center border-b border-border px-4">
38
+ <span className="text-xs text-muted-foreground">Header</span>
39
+ </div>
40
+ }
41
+ className="h-64 rounded-md border border-border"
42
+ >
43
+ <div className="p-4">
44
+ <span className="text-xs text-muted-foreground">主区内容</span>
45
+ </div>
46
+ </PageShell>
47
+ ```
48
+
49
+ ### Fullscreen
50
+
51
+ 全屏模式(无 header 无 sidebar)。
52
+
53
+ ```tsx
54
+ <PageShell className="h-64 rounded-md border border-border">
55
+ <div className="flex h-full items-center justify-center">
56
+ <span className="text-xs text-muted-foreground">全屏内容</span>
57
+ </div>
58
+ </PageShell>
59
+ ```
60
+
61
+ ### MutedBackground
62
+
63
+ 使用 muted 背景色。
64
+
65
+ ```tsx
66
+ <PageShell
67
+ background="muted"
68
+ header={
69
+ <div className="flex h-12 items-center border-b border-border bg-background px-4">
70
+ <span className="text-xs text-muted-foreground">Header</span>
71
+ </div>
72
+ }
73
+ className="h-64 rounded-md border border-border"
74
+ >
75
+ <div className="p-4">
76
+ <span className="text-xs text-muted-foreground">muted 背景主区</span>
77
+ </div>
78
+ </PageShell>
79
+ ```
80
+
81
+ ### WithSidebar
82
+
83
+ 带左侧 Sidebar 的页面骨架。 Storybook 受限容器内使用 `collapsible="none"` 的内联 Sidebar; 真实业务页面建议用全屏布局 + 默认 offcanvas 折叠形态。
84
+
85
+ ```tsx
86
+ <PageShell
87
+ sidebar={<SidebarNav />}
88
+ className="h-96 rounded-md border border-border overflow-hidden"
89
+ >
90
+ <div className="p-4">
91
+ <span className="text-xs text-muted-foreground">主区内容</span>
92
+ </div>
93
+ </PageShell>
94
+ ```
95
+
96
+ ### HeaderWithSidebar
97
+
98
+ 顶部 Header + 左侧 Sidebar 的组合形态。
99
+
100
+ ```tsx
101
+ <PageShell
102
+ header={
103
+ <div className="flex h-12 shrink-0 items-center border-b border-border bg-background px-4">
104
+ <span className="text-xs text-muted-foreground">Header</span>
105
+ </div>
106
+ }
107
+ sidebar={<SidebarNav />}
108
+ background="muted"
109
+ className="h-96 rounded-md border border-border overflow-hidden"
110
+ >
111
+ <div className="p-4">
112
+ <span className="text-xs text-muted-foreground">主区内容</span>
113
+ </div>
114
+ </PageShell>
115
+ ```
@@ -0,0 +1,154 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import {
3
+ HomeIcon,
4
+ InboxIcon,
5
+ CalendarIcon,
6
+ SearchIcon,
7
+ SettingsIcon,
8
+ } from 'lucide-react';
9
+ import {
10
+ Sidebar,
11
+ SidebarContent,
12
+ SidebarGroup,
13
+ SidebarGroupContent,
14
+ SidebarGroupLabel,
15
+ SidebarHeader,
16
+ SidebarMenu,
17
+ SidebarMenuButton,
18
+ SidebarMenuItem,
19
+ } from '@/components/sidebar';
20
+ import { PageShell } from './index';
21
+
22
+ const meta: Meta<typeof PageShell> = {
23
+ title: '布局 · Layout/PageShell 页面骨架',
24
+ component: PageShell,
25
+ tags: ['autodocs'],
26
+ };
27
+ export default meta;
28
+
29
+ type Story = StoryObj<typeof meta>;
30
+
31
+ /** 仅顶部条 + 主区。 */
32
+ export const HeaderOnly: Story = {
33
+ render: () => (
34
+ <PageShell
35
+ header={
36
+ <div className="flex h-12 items-center border-b border-border px-4">
37
+ <span className="text-xs text-muted-foreground">Header</span>
38
+ </div>
39
+ }
40
+ className="h-64 rounded-md border border-border"
41
+ >
42
+ <div className="p-4">
43
+ <span className="text-xs text-muted-foreground">主区内容</span>
44
+ </div>
45
+ </PageShell>
46
+ ),
47
+ };
48
+
49
+ /** 全屏模式(无 header 无 sidebar)。 */
50
+ export const Fullscreen: Story = {
51
+ render: () => (
52
+ <PageShell className="h-64 rounded-md border border-border">
53
+ <div className="flex h-full items-center justify-center">
54
+ <span className="text-xs text-muted-foreground">全屏内容</span>
55
+ </div>
56
+ </PageShell>
57
+ ),
58
+ };
59
+
60
+ /** 使用 muted 背景色。 */
61
+ export const MutedBackground: Story = {
62
+ render: () => (
63
+ <PageShell
64
+ background="muted"
65
+ header={
66
+ <div className="flex h-12 items-center border-b border-border bg-background px-4">
67
+ <span className="text-xs text-muted-foreground">Header</span>
68
+ </div>
69
+ }
70
+ className="h-64 rounded-md border border-border"
71
+ >
72
+ <div className="p-4">
73
+ <span className="text-xs text-muted-foreground">muted 背景主区</span>
74
+ </div>
75
+ </PageShell>
76
+ ),
77
+ };
78
+
79
+ const navItems = [
80
+ { title: '首页', icon: HomeIcon },
81
+ { title: '收件箱', icon: InboxIcon },
82
+ { title: '日历', icon: CalendarIcon },
83
+ { title: '搜索', icon: SearchIcon },
84
+ { title: '设置', icon: SettingsIcon },
85
+ ];
86
+
87
+ function SidebarNav() {
88
+ return (
89
+ <Sidebar
90
+ collapsible="none"
91
+ className="h-full border-r border-sidebar-border"
92
+ >
93
+ <SidebarHeader>
94
+ <span className="px-2 text-sm font-medium">应用名称</span>
95
+ </SidebarHeader>
96
+ <SidebarContent>
97
+ <SidebarGroup>
98
+ <SidebarGroupLabel>导航</SidebarGroupLabel>
99
+ <SidebarGroupContent>
100
+ <SidebarMenu>
101
+ {navItems.map((item) => (
102
+ <SidebarMenuItem key={item.title}>
103
+ <SidebarMenuButton>
104
+ <item.icon />
105
+ <span>{item.title}</span>
106
+ </SidebarMenuButton>
107
+ </SidebarMenuItem>
108
+ ))}
109
+ </SidebarMenu>
110
+ </SidebarGroupContent>
111
+ </SidebarGroup>
112
+ </SidebarContent>
113
+ </Sidebar>
114
+ );
115
+ }
116
+
117
+ /**
118
+ * 带左侧 Sidebar 的页面骨架。
119
+ *
120
+ * Storybook 受限容器内使用 `collapsible="none"` 的内联 Sidebar;
121
+ * 真实业务页面建议用全屏布局 + 默认 offcanvas 折叠形态。
122
+ */
123
+ export const WithSidebar: Story = {
124
+ render: () => (
125
+ <PageShell
126
+ sidebar={<SidebarNav />}
127
+ className="h-96 rounded-md border border-border overflow-hidden"
128
+ >
129
+ <div className="p-4">
130
+ <span className="text-xs text-muted-foreground">主区内容</span>
131
+ </div>
132
+ </PageShell>
133
+ ),
134
+ };
135
+
136
+ /** 顶部 Header + 左侧 Sidebar 的组合形态。 */
137
+ export const HeaderWithSidebar: Story = {
138
+ render: () => (
139
+ <PageShell
140
+ header={
141
+ <div className="flex h-12 shrink-0 items-center border-b border-border bg-background px-4">
142
+ <span className="text-xs text-muted-foreground">Header</span>
143
+ </div>
144
+ }
145
+ sidebar={<SidebarNav />}
146
+ background="muted"
147
+ className="h-96 rounded-md border border-border overflow-hidden"
148
+ >
149
+ <div className="p-4">
150
+ <span className="text-xs text-muted-foreground">主区内容</span>
151
+ </div>
152
+ </PageShell>
153
+ ),
154
+ };