@qijenchen/design-system 0.1.0-beta.10

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 (507) hide show
  1. package/README.md +163 -0
  2. package/dist/components/Accordion/accordion.d.ts +37 -0
  3. package/dist/components/Accordion/accordion.d.ts.map +1 -0
  4. package/dist/components/Accordion/accordion.js +78 -0
  5. package/dist/components/Accordion/accordion.js.map +1 -0
  6. package/dist/components/Alert/alert.d.ts +47 -0
  7. package/dist/components/Alert/alert.d.ts.map +1 -0
  8. package/dist/components/Alert/alert.js +132 -0
  9. package/dist/components/Alert/alert.js.map +1 -0
  10. package/dist/components/AppShell/_demo-helpers.d.ts +49 -0
  11. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -0
  12. package/dist/components/AppShell/app-shell.d.ts +76 -0
  13. package/dist/components/AppShell/app-shell.d.ts.map +1 -0
  14. package/dist/components/AppShell/app-shell.js +214 -0
  15. package/dist/components/AppShell/app-shell.js.map +1 -0
  16. package/dist/components/AspectRatio/aspect-ratio.d.ts +40 -0
  17. package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -0
  18. package/dist/components/AspectRatio/aspect-ratio.js +23 -0
  19. package/dist/components/AspectRatio/aspect-ratio.js.map +1 -0
  20. package/dist/components/Avatar/avatar.d.ts +85 -0
  21. package/dist/components/Avatar/avatar.d.ts.map +1 -0
  22. package/dist/components/Avatar/avatar.js +195 -0
  23. package/dist/components/Avatar/avatar.js.map +1 -0
  24. package/dist/components/Badge/badge.d.ts +43 -0
  25. package/dist/components/Badge/badge.d.ts.map +1 -0
  26. package/dist/components/Badge/badge.js +69 -0
  27. package/dist/components/Badge/badge.js.map +1 -0
  28. package/dist/components/Breadcrumb/breadcrumb.d.ts +163 -0
  29. package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -0
  30. package/dist/components/Breadcrumb/breadcrumb.js +300 -0
  31. package/dist/components/Breadcrumb/breadcrumb.js.map +1 -0
  32. package/dist/components/BulkActionBar/bulk-action-bar.d.ts +46 -0
  33. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -0
  34. package/dist/components/BulkActionBar/bulk-action-bar.js +78 -0
  35. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -0
  36. package/dist/components/Button/button-group.d.ts +49 -0
  37. package/dist/components/Button/button-group.d.ts.map +1 -0
  38. package/dist/components/Button/button-group.js +46 -0
  39. package/dist/components/Button/button-group.js.map +1 -0
  40. package/dist/components/Button/button.d.ts +203 -0
  41. package/dist/components/Button/button.d.ts.map +1 -0
  42. package/dist/components/Button/button.js +309 -0
  43. package/dist/components/Button/button.js.map +1 -0
  44. package/dist/components/Calendar/calendar.d.ts +81 -0
  45. package/dist/components/Calendar/calendar.d.ts.map +1 -0
  46. package/dist/components/Calendar/calendar.js +282 -0
  47. package/dist/components/Calendar/calendar.js.map +1 -0
  48. package/dist/components/Carousel/carousel.d.ts +61 -0
  49. package/dist/components/Carousel/carousel.d.ts.map +1 -0
  50. package/dist/components/Carousel/carousel.js +276 -0
  51. package/dist/components/Carousel/carousel.js.map +1 -0
  52. package/dist/components/Chart/chart.d.ts +94 -0
  53. package/dist/components/Chart/chart.d.ts.map +1 -0
  54. package/dist/components/Chart/chart.js +233 -0
  55. package/dist/components/Chart/chart.js.map +1 -0
  56. package/dist/components/Checkbox/checkbox-group.d.ts +58 -0
  57. package/dist/components/Checkbox/checkbox-group.d.ts.map +1 -0
  58. package/dist/components/Checkbox/checkbox-group.js +28 -0
  59. package/dist/components/Checkbox/checkbox-group.js.map +1 -0
  60. package/dist/components/Checkbox/checkbox.d.ts +73 -0
  61. package/dist/components/Checkbox/checkbox.d.ts.map +1 -0
  62. package/dist/components/Checkbox/checkbox.js +125 -0
  63. package/dist/components/Checkbox/checkbox.js.map +1 -0
  64. package/dist/components/Chip/chip.d.ts +54 -0
  65. package/dist/components/Chip/chip.d.ts.map +1 -0
  66. package/dist/components/Chip/chip.js +224 -0
  67. package/dist/components/Chip/chip.js.map +1 -0
  68. package/dist/components/CircularProgress/circular-progress.d.ts +40 -0
  69. package/dist/components/CircularProgress/circular-progress.d.ts.map +1 -0
  70. package/dist/components/CircularProgress/circular-progress.js +118 -0
  71. package/dist/components/CircularProgress/circular-progress.js.map +1 -0
  72. package/dist/components/Coachmark/coachmark.d.ts +100 -0
  73. package/dist/components/Coachmark/coachmark.d.ts.map +1 -0
  74. package/dist/components/Coachmark/coachmark.js +107 -0
  75. package/dist/components/Coachmark/coachmark.js.map +1 -0
  76. package/dist/components/Combobox/combobox.d.ts +150 -0
  77. package/dist/components/Combobox/combobox.d.ts.map +1 -0
  78. package/dist/components/Combobox/combobox.js +595 -0
  79. package/dist/components/Combobox/combobox.js.map +1 -0
  80. package/dist/components/Command/command.d.ts +106 -0
  81. package/dist/components/Command/command.d.ts.map +1 -0
  82. package/dist/components/Command/command.js +123 -0
  83. package/dist/components/Command/command.js.map +1 -0
  84. package/dist/components/DataTable/active-editor-controller.d.ts +66 -0
  85. package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -0
  86. package/dist/components/DataTable/cell-registry.d.ts +37 -0
  87. package/dist/components/DataTable/cell-registry.d.ts.map +1 -0
  88. package/dist/components/DataTable/cell-registry.js +377 -0
  89. package/dist/components/DataTable/cell-registry.js.map +1 -0
  90. package/dist/components/DataTable/column-types.d.ts +145 -0
  91. package/dist/components/DataTable/column-types.d.ts.map +1 -0
  92. package/dist/components/DataTable/column-types.js +17 -0
  93. package/dist/components/DataTable/column-types.js.map +1 -0
  94. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +49 -0
  95. package/dist/components/DataTable/data-table-column-visibility-panel.d.ts.map +1 -0
  96. package/dist/components/DataTable/data-table-filter-panel.d.ts +30 -0
  97. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -0
  98. package/dist/components/DataTable/data-table-interaction-layer.d.ts +78 -0
  99. package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -0
  100. package/dist/components/DataTable/data-table-interaction-layer.js +220 -0
  101. package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -0
  102. package/dist/components/DataTable/data-table-sort-manager.d.ts +19 -0
  103. package/dist/components/DataTable/data-table-sort-manager.d.ts.map +1 -0
  104. package/dist/components/DataTable/data-table.d.ts +181 -0
  105. package/dist/components/DataTable/data-table.d.ts.map +1 -0
  106. package/dist/components/DataTable/data-table.js +1851 -0
  107. package/dist/components/DataTable/data-table.js.map +1 -0
  108. package/dist/components/DataTable/filter-operators.d.ts +116 -0
  109. package/dist/components/DataTable/filter-operators.d.ts.map +1 -0
  110. package/dist/components/DataTable/filter-tree.d.ts +66 -0
  111. package/dist/components/DataTable/filter-tree.d.ts.map +1 -0
  112. package/dist/components/DataTable/lib/column-meta.d.ts +49 -0
  113. package/dist/components/DataTable/lib/column-meta.d.ts.map +1 -0
  114. package/dist/components/DateGrid/date-grid.d.ts +61 -0
  115. package/dist/components/DateGrid/date-grid.d.ts.map +1 -0
  116. package/dist/components/DateGrid/date-grid.js +168 -0
  117. package/dist/components/DateGrid/date-grid.js.map +1 -0
  118. package/dist/components/DatePicker/date-picker.d.ts +119 -0
  119. package/dist/components/DatePicker/date-picker.d.ts.map +1 -0
  120. package/dist/components/DatePicker/date-picker.js +743 -0
  121. package/dist/components/DatePicker/date-picker.js.map +1 -0
  122. package/dist/components/DescriptionList/description-list.d.ts +60 -0
  123. package/dist/components/DescriptionList/description-list.d.ts.map +1 -0
  124. package/dist/components/DescriptionList/description-list.js +77 -0
  125. package/dist/components/DescriptionList/description-list.js.map +1 -0
  126. package/dist/components/Dialog/dialog.d.ts +54 -0
  127. package/dist/components/Dialog/dialog.d.ts.map +1 -0
  128. package/dist/components/Dialog/dialog.js +151 -0
  129. package/dist/components/Dialog/dialog.js.map +1 -0
  130. package/dist/components/DropdownMenu/dropdown-menu.d.ts +111 -0
  131. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -0
  132. package/dist/components/DropdownMenu/dropdown-menu.js +288 -0
  133. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -0
  134. package/dist/components/Empty/empty.d.ts +40 -0
  135. package/dist/components/Empty/empty.d.ts.map +1 -0
  136. package/dist/components/Empty/empty.js +66 -0
  137. package/dist/components/Empty/empty.js.map +1 -0
  138. package/dist/components/Field/field-context.d.ts +77 -0
  139. package/dist/components/Field/field-context.d.ts.map +1 -0
  140. package/dist/components/Field/field-context.js +37 -0
  141. package/dist/components/Field/field-context.js.map +1 -0
  142. package/dist/components/Field/field-types.d.ts +5 -0
  143. package/dist/components/Field/field-types.d.ts.map +1 -0
  144. package/dist/components/Field/field-types.js +13 -0
  145. package/dist/components/Field/field-types.js.map +1 -0
  146. package/dist/components/Field/field-wrapper.d.ts +17 -0
  147. package/dist/components/Field/field-wrapper.d.ts.map +1 -0
  148. package/dist/components/Field/field-wrapper.js +252 -0
  149. package/dist/components/Field/field-wrapper.js.map +1 -0
  150. package/dist/components/Field/field.d.ts +127 -0
  151. package/dist/components/Field/field.d.ts.map +1 -0
  152. package/dist/components/Field/field.js +295 -0
  153. package/dist/components/Field/field.js.map +1 -0
  154. package/dist/components/FieldControlGroup/field-control-group.d.ts +74 -0
  155. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -0
  156. package/dist/components/FieldControlGroup/field-control-group.js +62 -0
  157. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -0
  158. package/dist/components/FileItem/file-item.d.ts +44 -0
  159. package/dist/components/FileItem/file-item.d.ts.map +1 -0
  160. package/dist/components/FileItem/file-item.js +202 -0
  161. package/dist/components/FileItem/file-item.js.map +1 -0
  162. package/dist/components/FileUpload/file-upload.d.ts +97 -0
  163. package/dist/components/FileUpload/file-upload.d.ts.map +1 -0
  164. package/dist/components/FileUpload/file-upload.js +231 -0
  165. package/dist/components/FileUpload/file-upload.js.map +1 -0
  166. package/dist/components/FileViewer/file-viewer-types.d.ts +73 -0
  167. package/dist/components/FileViewer/file-viewer-types.d.ts.map +1 -0
  168. package/dist/components/FileViewer/file-viewer.d.ts +82 -0
  169. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -0
  170. package/dist/components/FileViewer/file-viewer.js +752 -0
  171. package/dist/components/FileViewer/file-viewer.js.map +1 -0
  172. package/dist/components/FileViewer/image-renderer.d.ts +9 -0
  173. package/dist/components/FileViewer/image-renderer.d.ts.map +1 -0
  174. package/dist/components/FileViewer/image-renderer.js +165 -0
  175. package/dist/components/FileViewer/image-renderer.js.map +1 -0
  176. package/dist/components/HoverCard/hover-card.d.ts +30 -0
  177. package/dist/components/HoverCard/hover-card.d.ts.map +1 -0
  178. package/dist/components/HoverCard/hover-card.js +61 -0
  179. package/dist/components/HoverCard/hover-card.js.map +1 -0
  180. package/dist/components/Input/input.d.ts +72 -0
  181. package/dist/components/Input/input.d.ts.map +1 -0
  182. package/dist/components/Input/input.js +148 -0
  183. package/dist/components/Input/input.js.map +1 -0
  184. package/dist/components/LinkInput/link-input.d.ts +46 -0
  185. package/dist/components/LinkInput/link-input.d.ts.map +1 -0
  186. package/dist/components/LinkInput/link-input.js +215 -0
  187. package/dist/components/LinkInput/link-input.js.map +1 -0
  188. package/dist/components/Menu/menu-item.d.ts +83 -0
  189. package/dist/components/Menu/menu-item.d.ts.map +1 -0
  190. package/dist/components/Menu/menu-item.js +209 -0
  191. package/dist/components/Menu/menu-item.js.map +1 -0
  192. package/dist/components/NameCard/name-card.d.ts +85 -0
  193. package/dist/components/NameCard/name-card.d.ts.map +1 -0
  194. package/dist/components/NameCard/name-card.js +153 -0
  195. package/dist/components/NameCard/name-card.js.map +1 -0
  196. package/dist/components/Notice/notice.d.ts +69 -0
  197. package/dist/components/Notice/notice.d.ts.map +1 -0
  198. package/dist/components/Notice/notice.js +121 -0
  199. package/dist/components/Notice/notice.js.map +1 -0
  200. package/dist/components/NumberInput/number-input.d.ts +57 -0
  201. package/dist/components/NumberInput/number-input.d.ts.map +1 -0
  202. package/dist/components/NumberInput/number-input.js +131 -0
  203. package/dist/components/NumberInput/number-input.js.map +1 -0
  204. package/dist/components/OverflowIndicator/overflow-indicator.d.ts +23 -0
  205. package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -0
  206. package/dist/components/OverflowIndicator/overflow-indicator.js +111 -0
  207. package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -0
  208. package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts +57 -0
  209. package/dist/components/PeoplePicker/avatar-stack-overflow.d.ts.map +1 -0
  210. package/dist/components/PeoplePicker/avatar-stack-overflow.js +35 -0
  211. package/dist/components/PeoplePicker/avatar-stack-overflow.js.map +1 -0
  212. package/dist/components/PeoplePicker/people-picker-helpers.d.ts +7 -0
  213. package/dist/components/PeoplePicker/people-picker-helpers.d.ts.map +1 -0
  214. package/dist/components/PeoplePicker/people-picker-helpers.js +25 -0
  215. package/dist/components/PeoplePicker/people-picker-helpers.js.map +1 -0
  216. package/dist/components/PeoplePicker/people-picker.d.ts +77 -0
  217. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -0
  218. package/dist/components/PeoplePicker/people-picker.js +263 -0
  219. package/dist/components/PeoplePicker/people-picker.js.map +1 -0
  220. package/dist/components/PeoplePicker/person-display.d.ts +66 -0
  221. package/dist/components/PeoplePicker/person-display.d.ts.map +1 -0
  222. package/dist/components/PeoplePicker/person-display.js +203 -0
  223. package/dist/components/PeoplePicker/person-display.js.map +1 -0
  224. package/dist/components/Popover/popover.d.ts +50 -0
  225. package/dist/components/Popover/popover.d.ts.map +1 -0
  226. package/dist/components/Popover/popover.js +113 -0
  227. package/dist/components/Popover/popover.js.map +1 -0
  228. package/dist/components/ProgressBar/progress-bar.d.ts +37 -0
  229. package/dist/components/ProgressBar/progress-bar.d.ts.map +1 -0
  230. package/dist/components/ProgressBar/progress-bar.js +86 -0
  231. package/dist/components/ProgressBar/progress-bar.js.map +1 -0
  232. package/dist/components/RadioGroup/radio-group.d.ts +78 -0
  233. package/dist/components/RadioGroup/radio-group.d.ts.map +1 -0
  234. package/dist/components/RadioGroup/radio-group.js +153 -0
  235. package/dist/components/RadioGroup/radio-group.js.map +1 -0
  236. package/dist/components/Rating/rating.d.ts +46 -0
  237. package/dist/components/Rating/rating.d.ts.map +1 -0
  238. package/dist/components/Rating/rating.js +179 -0
  239. package/dist/components/Rating/rating.js.map +1 -0
  240. package/dist/components/ScrollArea/scroll-area.d.ts +45 -0
  241. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -0
  242. package/dist/components/ScrollArea/scroll-area.js +65 -0
  243. package/dist/components/ScrollArea/scroll-area.js.map +1 -0
  244. package/dist/components/SegmentedControl/segmented-control.d.ts +102 -0
  245. package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -0
  246. package/dist/components/SegmentedControl/segmented-control.js +171 -0
  247. package/dist/components/SegmentedControl/segmented-control.js.map +1 -0
  248. package/dist/components/Select/select.d.ts +102 -0
  249. package/dist/components/Select/select.d.ts.map +1 -0
  250. package/dist/components/Select/select.js +435 -0
  251. package/dist/components/Select/select.js.map +1 -0
  252. package/dist/components/SelectMenu/select-menu.d.ts +103 -0
  253. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -0
  254. package/dist/components/SelectMenu/select-menu.js +239 -0
  255. package/dist/components/SelectMenu/select-menu.js.map +1 -0
  256. package/dist/components/SelectionControl/selection-item.d.ts +69 -0
  257. package/dist/components/SelectionControl/selection-item.d.ts.map +1 -0
  258. package/dist/components/SelectionControl/selection-item.js +142 -0
  259. package/dist/components/SelectionControl/selection-item.js.map +1 -0
  260. package/dist/components/Separator/separator.d.ts +17 -0
  261. package/dist/components/Separator/separator.d.ts.map +1 -0
  262. package/dist/components/Separator/separator.js +39 -0
  263. package/dist/components/Separator/separator.js.map +1 -0
  264. package/dist/components/Sheet/sheet.d.ts +56 -0
  265. package/dist/components/Sheet/sheet.d.ts.map +1 -0
  266. package/dist/components/Sheet/sheet.js +145 -0
  267. package/dist/components/Sheet/sheet.js.map +1 -0
  268. package/dist/components/Sidebar/sidebar.d.ts +195 -0
  269. package/dist/components/Sidebar/sidebar.d.ts.map +1 -0
  270. package/dist/components/Sidebar/sidebar.js +826 -0
  271. package/dist/components/Sidebar/sidebar.js.map +1 -0
  272. package/dist/components/Skeleton/skeleton.d.ts +16 -0
  273. package/dist/components/Skeleton/skeleton.d.ts.map +1 -0
  274. package/dist/components/Skeleton/skeleton.js +30 -0
  275. package/dist/components/Skeleton/skeleton.js.map +1 -0
  276. package/dist/components/Slider/slider.d.ts +48 -0
  277. package/dist/components/Slider/slider.d.ts.map +1 -0
  278. package/dist/components/Slider/slider.js +108 -0
  279. package/dist/components/Slider/slider.js.map +1 -0
  280. package/dist/components/Steps/steps.d.ts +71 -0
  281. package/dist/components/Steps/steps.d.ts.map +1 -0
  282. package/dist/components/Steps/steps.js +583 -0
  283. package/dist/components/Steps/steps.js.map +1 -0
  284. package/dist/components/Switch/switch.d.ts +112 -0
  285. package/dist/components/Switch/switch.d.ts.map +1 -0
  286. package/dist/components/Switch/switch.js +179 -0
  287. package/dist/components/Switch/switch.js.map +1 -0
  288. package/dist/components/Tabs/tabs.d.ts +104 -0
  289. package/dist/components/Tabs/tabs.d.ts.map +1 -0
  290. package/dist/components/Tabs/tabs.js +316 -0
  291. package/dist/components/Tabs/tabs.js.map +1 -0
  292. package/dist/components/Tag/tag.d.ts +86 -0
  293. package/dist/components/Tag/tag.d.ts.map +1 -0
  294. package/dist/components/Tag/tag.js +172 -0
  295. package/dist/components/Tag/tag.js.map +1 -0
  296. package/dist/components/Textarea/textarea.d.ts +74 -0
  297. package/dist/components/Textarea/textarea.d.ts.map +1 -0
  298. package/dist/components/Textarea/textarea.js +224 -0
  299. package/dist/components/Textarea/textarea.js.map +1 -0
  300. package/dist/components/TimePicker/time-columns.d.ts +46 -0
  301. package/dist/components/TimePicker/time-columns.d.ts.map +1 -0
  302. package/dist/components/TimePicker/time-columns.js +173 -0
  303. package/dist/components/TimePicker/time-columns.js.map +1 -0
  304. package/dist/components/TimePicker/time-picker.d.ts +94 -0
  305. package/dist/components/TimePicker/time-picker.d.ts.map +1 -0
  306. package/dist/components/TimePicker/time-picker.js +253 -0
  307. package/dist/components/TimePicker/time-picker.js.map +1 -0
  308. package/dist/components/Toast/toast.d.ts +61 -0
  309. package/dist/components/Toast/toast.d.ts.map +1 -0
  310. package/dist/components/Toast/toast.js +76 -0
  311. package/dist/components/Toast/toast.js.map +1 -0
  312. package/dist/components/Tooltip/tooltip.d.ts +20 -0
  313. package/dist/components/Tooltip/tooltip.d.ts.map +1 -0
  314. package/dist/components/Tooltip/tooltip.js +53 -0
  315. package/dist/components/Tooltip/tooltip.js.map +1 -0
  316. package/dist/components/TreeView/tree-view.d.ts +166 -0
  317. package/dist/components/TreeView/tree-view.d.ts.map +1 -0
  318. package/dist/components/TreeView/tree-view.js +617 -0
  319. package/dist/components/TreeView/tree-view.js.map +1 -0
  320. package/dist/hooks/use-controllable.d.ts +16 -0
  321. package/dist/hooks/use-controllable.d.ts.map +1 -0
  322. package/dist/hooks/use-controllable.js +26 -0
  323. package/dist/hooks/use-controllable.js.map +1 -0
  324. package/dist/hooks/use-is-narrow-viewport.d.ts +2 -0
  325. package/dist/hooks/use-is-narrow-viewport.d.ts.map +1 -0
  326. package/dist/hooks/use-is-narrow-viewport.js +19 -0
  327. package/dist/hooks/use-is-narrow-viewport.js.map +1 -0
  328. package/dist/hooks/use-is-touch-device.d.ts +8 -0
  329. package/dist/hooks/use-is-touch-device.d.ts.map +1 -0
  330. package/dist/hooks/use-is-touch-device.js +16 -0
  331. package/dist/hooks/use-is-touch-device.js.map +1 -0
  332. package/dist/hooks/use-overflow-items.d.ts +124 -0
  333. package/dist/hooks/use-overflow-items.d.ts.map +1 -0
  334. package/dist/hooks/use-overflow-items.js +97 -0
  335. package/dist/hooks/use-overflow-items.js.map +1 -0
  336. package/dist/index.d.ts +74 -0
  337. package/dist/index.d.ts.map +1 -0
  338. package/dist/index.js +371 -0
  339. package/dist/index.js.map +1 -0
  340. package/dist/lib/drag-visual.d.ts +158 -0
  341. package/dist/lib/drag-visual.d.ts.map +1 -0
  342. package/dist/lib/drag-visual.js +96 -0
  343. package/dist/lib/drag-visual.js.map +1 -0
  344. package/dist/lib/i18n/i18n-context.d.ts +105 -0
  345. package/dist/lib/i18n/i18n-context.d.ts.map +1 -0
  346. package/dist/lib/multi-select-ordering.d.ts +54 -0
  347. package/dist/lib/multi-select-ordering.d.ts.map +1 -0
  348. package/dist/lib/multi-select-ordering.js +13 -0
  349. package/dist/lib/multi-select-ordering.js.map +1 -0
  350. package/dist/lib/utils.d.ts +12 -0
  351. package/dist/lib/utils.d.ts.map +1 -0
  352. package/dist/lib/utils.js +79 -0
  353. package/dist/lib/utils.js.map +1 -0
  354. package/dist/patterns/element-anatomy/item-anatomy.d.ts +370 -0
  355. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -0
  356. package/dist/patterns/element-anatomy/item-anatomy.js +272 -0
  357. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -0
  358. package/dist/patterns/header-canonical/chrome-header.d.ts +80 -0
  359. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -0
  360. package/dist/patterns/header-canonical/chrome-header.js +75 -0
  361. package/dist/patterns/header-canonical/chrome-header.js.map +1 -0
  362. package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts +101 -0
  363. package/dist/patterns/horizontal-overflow/horizontal-overflow.d.ts.map +1 -0
  364. package/dist/patterns/horizontal-overflow/horizontal-overflow.js +105 -0
  365. package/dist/patterns/horizontal-overflow/horizontal-overflow.js.map +1 -0
  366. package/dist/patterns/overlay-surface/overlay-surface.d.ts +28 -0
  367. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -0
  368. package/dist/patterns/overlay-surface/overlay-surface.js +85 -0
  369. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -0
  370. package/dist/patterns/resize-handle/resize-handle.d.ts +102 -0
  371. package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -0
  372. package/dist/patterns/resize-handle/resize-handle.js +74 -0
  373. package/dist/patterns/resize-handle/resize-handle.js.map +1 -0
  374. package/dist/react-day-picker.css +457 -0
  375. package/dist/stories-helpers/anatomy/anatomy-utils.d.ts +40 -0
  376. package/dist/stories-helpers/anatomy/anatomy-utils.d.ts.map +1 -0
  377. package/dist/tokens/elevation/overlay-geometry.d.ts +12 -0
  378. package/dist/tokens/elevation/overlay-geometry.d.ts.map +1 -0
  379. package/dist/tokens/elevation/overlay-geometry.js +7 -0
  380. package/dist/tokens/elevation/overlay-geometry.js.map +1 -0
  381. package/dist/tokens/motion/motion.d.ts +15 -0
  382. package/dist/tokens/motion/motion.d.ts.map +1 -0
  383. package/dist/tokens/motion/motion.js +9 -0
  384. package/dist/tokens/motion/motion.js.map +1 -0
  385. package/dist/tokens/uiSize/icon-size.d.ts +53 -0
  386. package/dist/tokens/uiSize/icon-size.d.ts.map +1 -0
  387. package/package.json +92 -0
  388. package/src/README.md +32 -0
  389. package/src/components/Accordion/accordion.tsx +104 -0
  390. package/src/components/Alert/alert.tsx +188 -0
  391. package/src/components/AppShell/_demo-helpers.tsx +198 -0
  392. package/src/components/AppShell/app-shell.tsx +364 -0
  393. package/src/components/AspectRatio/aspect-ratio.tsx +58 -0
  394. package/src/components/Avatar/avatar.tsx +368 -0
  395. package/src/components/Badge/badge.tsx +104 -0
  396. package/src/components/Breadcrumb/breadcrumb.tsx +619 -0
  397. package/src/components/BulkActionBar/bulk-action-bar.tsx +156 -0
  398. package/src/components/Button/button-group.tsx +96 -0
  399. package/src/components/Button/button.tsx +539 -0
  400. package/src/components/Calendar/calendar.tsx +411 -0
  401. package/src/components/Carousel/carousel.tsx +371 -0
  402. package/src/components/Chart/chart.tsx +376 -0
  403. package/src/components/Checkbox/checkbox-group.tsx +94 -0
  404. package/src/components/Checkbox/checkbox.tsx +237 -0
  405. package/src/components/Chip/chip.tsx +359 -0
  406. package/src/components/CircularProgress/circular-progress.tsx +204 -0
  407. package/src/components/Coachmark/coachmark.tsx +255 -0
  408. package/src/components/Combobox/combobox.tsx +826 -0
  409. package/src/components/Command/command.tsx +187 -0
  410. package/src/components/DataTable/active-editor-controller.ts +72 -0
  411. package/src/components/DataTable/cell-registry.tsx +520 -0
  412. package/src/components/DataTable/column-types.ts +180 -0
  413. package/src/components/DataTable/data-table-column-visibility-panel.tsx +261 -0
  414. package/src/components/DataTable/data-table-filter-panel.tsx +813 -0
  415. package/src/components/DataTable/data-table-interaction-layer.tsx +483 -0
  416. package/src/components/DataTable/data-table-sort-manager.tsx +210 -0
  417. package/src/components/DataTable/data-table.css +165 -0
  418. package/src/components/DataTable/data-table.tsx +2924 -0
  419. package/src/components/DataTable/filter-operators.ts +225 -0
  420. package/src/components/DataTable/filter-tree.ts +313 -0
  421. package/src/components/DataTable/lib/column-meta.ts +79 -0
  422. package/src/components/DateGrid/date-grid.tsx +209 -0
  423. package/src/components/DatePicker/date-picker.tsx +1114 -0
  424. package/src/components/DescriptionList/description-list.tsx +141 -0
  425. package/src/components/Dialog/dialog.tsx +267 -0
  426. package/src/components/DropdownMenu/dropdown-menu.tsx +475 -0
  427. package/src/components/Empty/empty.tsx +108 -0
  428. package/src/components/Field/field-context.ts +136 -0
  429. package/src/components/Field/field-types.ts +52 -0
  430. package/src/components/Field/field-wrapper.tsx +348 -0
  431. package/src/components/Field/field.tsx +535 -0
  432. package/src/components/FieldControlGroup/field-control-group.tsx +136 -0
  433. package/src/components/FileItem/file-item.tsx +322 -0
  434. package/src/components/FileUpload/file-upload.tsx +326 -0
  435. package/src/components/FileViewer/file-viewer-types.ts +76 -0
  436. package/src/components/FileViewer/file-viewer.tsx +1065 -0
  437. package/src/components/FileViewer/image-renderer.tsx +256 -0
  438. package/src/components/HoverCard/hover-card.tsx +79 -0
  439. package/src/components/Input/input.tsx +233 -0
  440. package/src/components/LinkInput/link-input.tsx +304 -0
  441. package/src/components/Menu/menu-item.tsx +334 -0
  442. package/src/components/NameCard/name-card.tsx +319 -0
  443. package/src/components/Notice/notice.tsx +196 -0
  444. package/src/components/NumberInput/number-input.tsx +203 -0
  445. package/src/components/OverflowIndicator/overflow-indicator.tsx +156 -0
  446. package/src/components/PeoplePicker/avatar-stack-overflow.ts +100 -0
  447. package/src/components/PeoplePicker/people-picker-helpers.ts +76 -0
  448. package/src/components/PeoplePicker/people-picker.tsx +455 -0
  449. package/src/components/PeoplePicker/person-display.tsx +358 -0
  450. package/src/components/Popover/popover.tsx +183 -0
  451. package/src/components/ProgressBar/progress-bar.tsx +157 -0
  452. package/src/components/README.md +58 -0
  453. package/src/components/RadioGroup/radio-group.tsx +261 -0
  454. package/src/components/Rating/rating.tsx +295 -0
  455. package/src/components/ScrollArea/scroll-area.tsx +110 -0
  456. package/src/components/SegmentedControl/segmented-control.tsx +304 -0
  457. package/src/components/Select/select.tsx +658 -0
  458. package/src/components/SelectMenu/select-menu.tsx +430 -0
  459. package/src/components/SelectionControl/selection-item.tsx +261 -0
  460. package/src/components/Separator/separator.tsx +48 -0
  461. package/src/components/Sheet/sheet.tsx +240 -0
  462. package/src/components/Sidebar/sidebar.tsx +1280 -0
  463. package/src/components/Skeleton/skeleton.tsx +35 -0
  464. package/src/components/Slider/slider.tsx +158 -0
  465. package/src/components/Steps/steps.tsx +850 -0
  466. package/src/components/Switch/switch.tsx +285 -0
  467. package/src/components/Tabs/tabs.tsx +515 -0
  468. package/src/components/Tag/tag.tsx +246 -0
  469. package/src/components/Textarea/textarea.tsx +280 -0
  470. package/src/components/TimePicker/time-columns.tsx +260 -0
  471. package/src/components/TimePicker/time-picker.tsx +419 -0
  472. package/src/components/Toast/toast.tsx +129 -0
  473. package/src/components/Tooltip/tooltip.tsx +68 -0
  474. package/src/components/TreeView/tree-view.tsx +1031 -0
  475. package/src/hooks/use-controllable.ts +40 -0
  476. package/src/hooks/use-is-narrow-viewport.ts +19 -0
  477. package/src/hooks/use-is-touch-device.ts +21 -0
  478. package/src/hooks/use-overflow-items.ts +256 -0
  479. package/src/index.ts +85 -0
  480. package/src/lib/README.md +82 -0
  481. package/src/lib/drag-visual.ts +272 -0
  482. package/src/lib/i18n/README.md +60 -0
  483. package/src/lib/i18n/i18n-context.tsx +129 -0
  484. package/src/lib/multi-select-ordering.ts +61 -0
  485. package/src/lib/utils.ts +93 -0
  486. package/src/patterns/README.md +67 -0
  487. package/src/patterns/element-anatomy/item-anatomy.tsx +744 -0
  488. package/src/patterns/header-canonical/chrome-header.tsx +175 -0
  489. package/src/patterns/header-canonical/header-canonical.css +27 -0
  490. package/src/patterns/horizontal-overflow/horizontal-overflow.tsx +217 -0
  491. package/src/patterns/overlay-surface/overlay-surface.tsx +191 -0
  492. package/src/patterns/resize-handle/resize-handle.tsx +188 -0
  493. package/src/stories-helpers/anatomy/anatomy-utils.tsx +64 -0
  494. package/src/styles/preset.css +31 -0
  495. package/src/styles/tokens.css +35 -0
  496. package/src/tokens/README.md +53 -0
  497. package/src/tokens/color/primitives.css +429 -0
  498. package/src/tokens/color/semantic.css +539 -0
  499. package/src/tokens/elevation/overlay-geometry.ts +13 -0
  500. package/src/tokens/layoutSpace/layoutSpace.css +36 -0
  501. package/src/tokens/motion/motion.css +30 -0
  502. package/src/tokens/motion/motion.ts +17 -0
  503. package/src/tokens/opacity/opacity.css +23 -0
  504. package/src/tokens/radius/radius.css +19 -0
  505. package/src/tokens/typography/typography.css +118 -0
  506. package/src/tokens/uiSize/icon-size.ts +52 -0
  507. package/src/tokens/uiSize/uiSize.css +125 -0
@@ -0,0 +1,826 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
5
+ import { cva } from "class-variance-authority";
6
+ import { ChevronDown, PanelLeft } from "lucide-react";
7
+ import { useIsNarrowViewport } from "../../hooks/use-is-narrow-viewport.js";
8
+ import { cn } from "../../lib/utils.js";
9
+ import { Badge } from "../Badge/badge.js";
10
+ import { Button } from "../Button/button.js";
11
+ import { Input } from "../Input/input.js";
12
+ import { ScrollArea } from "../ScrollArea/scroll-area.js";
13
+ import { Separator } from "../Separator/separator.js";
14
+ import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from "../Sheet/sheet.js";
15
+ import { Skeleton } from "../Skeleton/skeleton.js";
16
+ import { ChromeHeader } from "../../patterns/header-canonical/chrome-header.js";
17
+ import { Tooltip, TooltipTrigger, TooltipContent } from "../Tooltip/tooltip.js";
18
+ import { ItemInlineActionButton, ItemInlineAction, AVATAR_SIZE, ICON_SIZE, RowSizeProvider, ROW_PADDING_BY_SIZE, ItemIcon, ItemLabel, getUniformPrefixSlotStyle } from "../../patterns/element-anatomy/item-anatomy.js";
19
+ const SIDEBAR_COOKIE_NAME = "sidebar_state";
20
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
21
+ const SIDEBAR_KEYBOARD_SHORTCUT = "b";
22
+ const SidebarContext = React.createContext(null);
23
+ function useSidebar() {
24
+ const context = React.useContext(SidebarContext);
25
+ if (!context) {
26
+ throw new Error("useSidebar must be used within a SidebarProvider.");
27
+ }
28
+ return context;
29
+ }
30
+ const SidebarProvider = React.forwardRef(
31
+ // code-quality-allow: long-function — SidebarProvider 整合 dual-state(open + activeId)+ mobile sync + keyboard handler + context memo + style binding。拆 sub-fn 會打斷 React state binding chain + Context provider 順序語意(M21 prop variant test:拆分降低可讀性,單 fn 內 state lifecycle 一目了然)。當前 97 < cap 200。
32
+ ({
33
+ defaultOpen = true,
34
+ open: openProp,
35
+ onOpenChange: setOpenProp,
36
+ size = "md",
37
+ activeId: activeIdProp,
38
+ defaultActiveId,
39
+ onActiveChange,
40
+ uniformPrefix = false,
41
+ className,
42
+ style,
43
+ children,
44
+ ...props
45
+ }, ref) => {
46
+ const [_activeId, _setActiveId] = React.useState(defaultActiveId);
47
+ const activeId = activeIdProp ?? _activeId;
48
+ const setActiveId = React.useCallback(
49
+ (id) => {
50
+ if (activeIdProp === void 0) _setActiveId(id);
51
+ onActiveChange == null ? void 0 : onActiveChange(id);
52
+ },
53
+ [activeIdProp, onActiveChange]
54
+ );
55
+ const isMobile = useIsNarrowViewport();
56
+ const [openMobile, setOpenMobile] = React.useState(false);
57
+ const [_open, _setOpen] = React.useState(defaultOpen);
58
+ const open = openProp ?? _open;
59
+ const setOpen = React.useCallback(
60
+ (value) => {
61
+ const openState = typeof value === "function" ? value(open) : value;
62
+ if (setOpenProp) {
63
+ setOpenProp(openState);
64
+ } else {
65
+ _setOpen(openState);
66
+ }
67
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
68
+ },
69
+ [setOpenProp, open]
70
+ );
71
+ const toggleSidebar = React.useCallback(() => {
72
+ return isMobile ? setOpenMobile((o) => !o) : setOpen((o) => !o);
73
+ }, [isMobile, setOpen, setOpenMobile]);
74
+ React.useEffect(() => {
75
+ const handleKeyDown = (event) => {
76
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
77
+ event.preventDefault();
78
+ toggleSidebar();
79
+ }
80
+ };
81
+ window.addEventListener("keydown", handleKeyDown);
82
+ return () => window.removeEventListener("keydown", handleKeyDown);
83
+ }, [toggleSidebar]);
84
+ const state = open ? "expanded" : "collapsed";
85
+ const contextValue = React.useMemo(
86
+ () => ({
87
+ state,
88
+ open,
89
+ setOpen,
90
+ isMobile,
91
+ openMobile,
92
+ setOpenMobile,
93
+ toggleSidebar,
94
+ size,
95
+ activeId,
96
+ setActiveId
97
+ }),
98
+ [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, size, activeId, setActiveId]
99
+ );
100
+ const slotStyle = getUniformPrefixSlotStyle(size);
101
+ const slotValue = slotStyle["--item-prefix-slot"];
102
+ const wrapperStyle = React.useMemo(
103
+ () => ({
104
+ "--item-icon-size": `${ICON_SIZE[size]}px`,
105
+ "--item-avatar-size": `${AVATAR_SIZE.inline[size]}px`,
106
+ ...uniformPrefix ? { "--mixed-prefix-slot": slotValue } : {},
107
+ ...style
108
+ }),
109
+ [size, uniformPrefix, slotValue, style]
110
+ );
111
+ return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(RowSizeProvider, { value: size, children: /* @__PURE__ */ jsx(
112
+ "div",
113
+ {
114
+ style: wrapperStyle,
115
+ className: cn(
116
+ "group/sidebar-wrapper flex min-h-svh w-full",
117
+ // CSS :has() 偵測 — 只在 uniformPrefix=true(預設)時掛
118
+ // mixing detected → 同時把 --item-icon-size cascade 到 slot 寬(`!` important 蓋
119
+ // 過 wrapperStyle inline,讓 collapsed pl 公式知道「ItemPrefix wrapper 被撐到
120
+ // 24,effective prefix width = 24 非 16」)。
121
+ uniformPrefix && "has-[[data-prefix-type=icon]]:has-[[data-prefix-type=avatar]]:[--item-prefix-slot:var(--mixed-prefix-slot)] has-[[data-prefix-type=icon]]:has-[[data-prefix-type=avatar]]:![--item-icon-size:var(--mixed-prefix-slot)]",
122
+ className
123
+ ),
124
+ ref,
125
+ ...props,
126
+ children
127
+ }
128
+ ) }) });
129
+ }
130
+ );
131
+ SidebarProvider.displayName = "SidebarProvider";
132
+ const Sidebar = React.forwardRef(
133
+ ({
134
+ side = "left",
135
+ collapsible = "offcanvas",
136
+ viewportInsetTop,
137
+ className,
138
+ children,
139
+ ...props
140
+ }, ref) => {
141
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
142
+ const insetStyle = viewportInsetTop ? { top: viewportInsetTop, height: `calc(100svh - ${viewportInsetTop})` } : void 0;
143
+ if (collapsible === "none") {
144
+ return /* @__PURE__ */ jsx(
145
+ "div",
146
+ {
147
+ className: cn(
148
+ "flex h-full w-[var(--sidebar-width)] flex-col bg-surface text-foreground",
149
+ className
150
+ ),
151
+ ref,
152
+ ...props,
153
+ children
154
+ }
155
+ );
156
+ }
157
+ if (isMobile) {
158
+ return /* @__PURE__ */ jsx(Sheet, { open: openMobile, onOpenChange: setOpenMobile, ...props, children: /* @__PURE__ */ jsxs(
159
+ SheetContent,
160
+ {
161
+ "data-sidebar": "sidebar",
162
+ "data-mobile": "true",
163
+ className: "w-[var(--sidebar-width)] bg-surface p-0 text-foreground [&>button]:hidden",
164
+ style: {
165
+ "--sidebar-width": "var(--sidebar-width-mobile)"
166
+ },
167
+ side,
168
+ children: [
169
+ /* @__PURE__ */ jsxs(SheetHeader, { className: "sr-only", children: [
170
+ /* @__PURE__ */ jsx(SheetTitle, { children: "Sidebar" }),
171
+ /* @__PURE__ */ jsx(SheetDescription, { children: "Displays the mobile sidebar." })
172
+ ] }),
173
+ /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col", children })
174
+ ]
175
+ }
176
+ ) });
177
+ }
178
+ return /* @__PURE__ */ jsxs(
179
+ "div",
180
+ {
181
+ ref,
182
+ className: "group peer hidden shrink-0 text-foreground md:block",
183
+ "data-state": state,
184
+ "data-collapsible": state === "collapsed" ? collapsible : "",
185
+ "data-side": side,
186
+ children: [
187
+ /* @__PURE__ */ jsx(
188
+ "div",
189
+ {
190
+ className: cn(
191
+ "relative w-[var(--sidebar-width)] min-w-[var(--sidebar-width-min)] bg-transparent transition-[width,min-width] duration-200 ease-linear motion-reduce:duration-0",
192
+ "group-data-[collapsible=offcanvas]:!w-0 group-data-[collapsible=offcanvas]:!min-w-0",
193
+ "group-data-[side=right]:rotate-180",
194
+ "group-data-[collapsible=icon]:!w-[var(--sidebar-width-icon)] group-data-[collapsible=icon]:!min-w-0"
195
+ )
196
+ }
197
+ ),
198
+ /* @__PURE__ */ jsx(
199
+ "div",
200
+ {
201
+ style: insetStyle,
202
+ className: cn(
203
+ // 2026-05-20 v3:`inset-y-0 h-svh` → 可被 viewportInsetTop prop override(per AppShell primary-header)
204
+ !viewportInsetTop && "inset-y-0 h-svh",
205
+ // 2026-05-21 v9 fix(per user 「右側分隔線跑去哪 + sidebar 寬度沒正確變化」):
206
+ // 補 `overflow-x-hidden` — C* refactor 主機制(outer narrows to sidebar-width-icon
207
+ // 時 clip inner 272px overflow,visual right border 顯示,主內容不被遮)。原 C*
208
+ // commit 漏加 className 只 comment 提及。
209
+ "overflow-x-hidden",
210
+ "fixed z-10 hidden w-[var(--sidebar-width)] min-w-[var(--sidebar-width-min)] transition-[left,right,width,min-width] duration-200 ease-linear motion-reduce:duration-0 md:flex",
211
+ "group-data-[collapsible=icon]:!min-w-0",
212
+ side === "left" ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]" : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
213
+ "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]",
214
+ "group-data-[side=left]:border-r group-data-[side=left]:border-divider",
215
+ "group-data-[side=right]:border-l group-data-[side=right]:border-divider",
216
+ className
217
+ ),
218
+ ...props,
219
+ children: /* @__PURE__ */ jsx(
220
+ "div",
221
+ {
222
+ "data-sidebar": "sidebar",
223
+ style: { width: "var(--sidebar-width)", minWidth: "var(--sidebar-width)" },
224
+ className: "flex h-full shrink-0 flex-col bg-surface",
225
+ children
226
+ }
227
+ )
228
+ }
229
+ )
230
+ ]
231
+ }
232
+ );
233
+ }
234
+ );
235
+ Sidebar.displayName = "Sidebar";
236
+ const SidebarTrigger = React.forwardRef(({ className, onClick, ...props }, ref) => {
237
+ const { toggleSidebar } = useSidebar();
238
+ return /* @__PURE__ */ jsx(
239
+ Button,
240
+ {
241
+ ref,
242
+ "data-sidebar": "trigger",
243
+ variant: "text",
244
+ size: "sm",
245
+ iconOnly: true,
246
+ startIcon: PanelLeft,
247
+ "aria-label": "Toggle Sidebar",
248
+ className,
249
+ onClick: (event) => {
250
+ onClick == null ? void 0 : onClick(event);
251
+ toggleSidebar();
252
+ },
253
+ ...props
254
+ }
255
+ );
256
+ });
257
+ SidebarTrigger.displayName = "SidebarTrigger";
258
+ const SidebarInput = React.forwardRef(({ className, ...props }, ref) => {
259
+ return /* @__PURE__ */ jsx(
260
+ Input,
261
+ {
262
+ ref,
263
+ "data-sidebar": "input",
264
+ className: cn("w-full", className),
265
+ ...props
266
+ }
267
+ );
268
+ });
269
+ SidebarInput.displayName = "SidebarInput";
270
+ const SidebarHeader = React.forwardRef(({ className, withTabs, tabsSlot, ...props }, ref) => {
271
+ return (
272
+ // 2026-05-21 v9 — restore main behavior(per user「不應該調整原本的樣式,只有說收起來的時候
273
+ // 要調整 header logo 的位置使其與其下 icon 水平置中」):
274
+ // - Expanded mode:ChromeHeader default `px-loose`(16px L+R),avatar 跟 menu icon 對齊
275
+ // - Collapsed mode:`!px-0 !justify-center` 拿掉 padding + 內容置中,WorkspaceBrand text
276
+ // 已 `group-data-[collapsible=icon]:hidden`,collapsed 只剩 avatar 24px,centered in 48px
277
+ // square → avatar.center = 24 = menu icon center.x ✓
278
+ // 完全 match main 行為(v7 leadingRail / v8 -ml-1 surgical 全撤回)。
279
+ /* @__PURE__ */ jsx(
280
+ ChromeHeader,
281
+ {
282
+ ref,
283
+ withTabs,
284
+ tabsSlot,
285
+ "data-sidebar": "header",
286
+ className: cn(
287
+ // 2026-05-21 v14 — rail-derived collapsed padding,full SSOT cascade(per user directive
288
+ // 「avatar尺寸、menu item padding、menu icon尺寸任一變動都要正確連動」+ codex Layer B
289
+ // 比稿共識):
290
+ //
291
+ // 公式 derivation(rail-centered geometric identity):
292
+ // avatar.cx = pl + avatar/2 = (sidebar-width-icon - avatar)/2 + avatar/2 = sidebar-width-icon/2
293
+ // menu icon.cx = loose + icon-size/2
294
+ // sidebar-width-icon = 2*loose + icon-size → sidebar-width-icon/2 = loose + icon-size/2 ✓
295
+ //
296
+ // → 任何 avatar / loose / icon-size 改值,公式自動對齊 menu icon 中心(rail 幾何恆等)。
297
+ //
298
+ // SSOT 連動鏈:
299
+ // --layout-space-loose (density token) ─┐
300
+ // --sidebar-menu-icon-size ├→ --sidebar-width-icon (calc cascade)
301
+ // └→ 公式自動跟 ✓
302
+ // --chrome-header-avatar-size (header-canonical.css local token):公式 var 引用,
303
+ // JS 端透過 WorkspaceBrand RowSizeProvider value="md"
304
+ // + AVATAR_SIZE.inline.md spec-coupled 共識 sync。
305
+ //
306
+ // Numerical equivalence to v13 `loose-4` 公式(verified):
307
+ // md density: (48-24)/2 = 12 = loose-4 = 12 ✓ identical
308
+ // lg density: (64-24)/2 = 20 = loose-4 = 20 ✓ identical
309
+ // → v14 upgrade 純 SSOT chain robustness,0 視覺改變。
310
+ "group-data-[collapsible=icon]:!pl-[calc((var(--sidebar-width-icon)-var(--chrome-header-avatar-size))/2)]",
311
+ "group-data-[collapsible=icon]:!pr-0",
312
+ "transition-[padding] duration-200 ease-linear motion-reduce:duration-0",
313
+ className
314
+ ),
315
+ ...props
316
+ }
317
+ )
318
+ );
319
+ });
320
+ SidebarHeader.displayName = "SidebarHeader";
321
+ const SidebarFooter = React.forwardRef(({ className, ...props }, ref) => {
322
+ return /* @__PURE__ */ jsx(
323
+ "div",
324
+ {
325
+ ref,
326
+ "data-sidebar": "footer",
327
+ className: cn(
328
+ "flex shrink-0 flex-col py-2 border-t border-divider",
329
+ className
330
+ ),
331
+ ...props
332
+ }
333
+ );
334
+ });
335
+ SidebarFooter.displayName = "SidebarFooter";
336
+ const SidebarSeparator = React.forwardRef(({ className, ...props }, ref) => {
337
+ return /* @__PURE__ */ jsx(
338
+ Separator,
339
+ {
340
+ ref,
341
+ "data-sidebar": "separator",
342
+ className: cn(
343
+ "mx-[var(--layout-space-loose)] w-auto bg-divider",
344
+ className
345
+ ),
346
+ ...props
347
+ }
348
+ );
349
+ });
350
+ SidebarSeparator.displayName = "SidebarSeparator";
351
+ const SidebarContent = React.forwardRef(({ className, children, ...props }, ref) => {
352
+ return /* @__PURE__ */ jsx(
353
+ "div",
354
+ {
355
+ ref,
356
+ "data-sidebar": "content",
357
+ className: cn(
358
+ "flex min-h-0 flex-1 flex-col",
359
+ className
360
+ ),
361
+ ...props,
362
+ children: /* @__PURE__ */ jsx(ScrollArea, { className: "flex-1", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col", children }) })
363
+ }
364
+ );
365
+ });
366
+ SidebarContent.displayName = "SidebarContent";
367
+ const SidebarGroupContext = React.createContext(null);
368
+ function useSidebarGroup() {
369
+ return React.useContext(SidebarGroupContext);
370
+ }
371
+ const SidebarGroup = React.forwardRef(({ className, collapsible = false, defaultOpen = true, open, onOpenChange, children, ...props }, ref) => {
372
+ const contextValue = React.useMemo(
373
+ () => ({ collapsible }),
374
+ [collapsible]
375
+ );
376
+ const baseClass = cn(
377
+ "relative flex w-full min-w-0 flex-col py-2",
378
+ "[&+&]:before:absolute [&+&]:before:top-0 [&+&]:before:left-[var(--layout-space-loose)] [&+&]:before:right-[var(--layout-space-loose)] [&+&]:before:h-px [&+&]:before:bg-divider [&+&]:before:content-['']",
379
+ className
380
+ );
381
+ if (!collapsible) {
382
+ return /* @__PURE__ */ jsx(SidebarGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx("div", { ref, "data-sidebar": "group", className: baseClass, ...props, children }) });
383
+ }
384
+ return /* @__PURE__ */ jsx(SidebarGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
385
+ CollapsiblePrimitive.Root,
386
+ {
387
+ ref,
388
+ "data-sidebar": "group",
389
+ defaultOpen,
390
+ open,
391
+ onOpenChange,
392
+ className: baseClass,
393
+ ...props,
394
+ children
395
+ }
396
+ ) });
397
+ });
398
+ SidebarGroup.displayName = "SidebarGroup";
399
+ const SidebarGroupContent = React.forwardRef(({ className, ...props }, ref) => {
400
+ const group = useSidebarGroup();
401
+ if (group == null ? void 0 : group.collapsible) {
402
+ return /* @__PURE__ */ jsx(
403
+ CollapsiblePrimitive.Content,
404
+ {
405
+ "data-sidebar": "group-content",
406
+ className: cn("w-full overflow-hidden", className),
407
+ ...props,
408
+ children: /* @__PURE__ */ jsx("div", { ref, children: props.children })
409
+ }
410
+ );
411
+ }
412
+ return /* @__PURE__ */ jsx(
413
+ "div",
414
+ {
415
+ ref,
416
+ "data-sidebar": "group-content",
417
+ className: cn("w-full", className),
418
+ ...props
419
+ }
420
+ );
421
+ });
422
+ SidebarGroupContent.displayName = "SidebarGroupContent";
423
+ const sidebarGroupLabelVariants = cva(
424
+ [
425
+ // items-start 對齊 item-layout 規則(跟 SidebarMenuButton / TreeItem / MenuItem 一致)
426
+ "flex w-full items-start gap-2",
427
+ "px-[var(--layout-space-loose)]",
428
+ "font-medium text-fg-muted",
429
+ "cursor-default select-none pointer-events-none outline-none",
430
+ // icon 模式:display:none 硬隱藏(跟 SidebarMenuButton label span 一致的策略)
431
+ "group-data-[collapsible=icon]:hidden"
432
+ ],
433
+ {
434
+ variants: {
435
+ // 消費 ROW_PADDING_BY_SIZE SSOT(跟 SidebarMenuButton / MenuItem / TreeItem 一致)
436
+ size: ROW_PADDING_BY_SIZE
437
+ },
438
+ defaultVariants: { size: "md" }
439
+ }
440
+ );
441
+ const SidebarGroupLabel = React.forwardRef(({ className, asChild = false, size: sizeProp, children, toggleAriaLabel = "展開或收合", ...props }, ref) => {
442
+ const { size: contextSize } = useSidebar();
443
+ const size = sizeProp ?? contextSize;
444
+ const group = useSidebarGroup();
445
+ if (group == null ? void 0 : group.collapsible) {
446
+ return /* @__PURE__ */ jsxs(
447
+ "div",
448
+ {
449
+ ref,
450
+ "data-sidebar": "group-label",
451
+ role: "presentation",
452
+ className: cn(
453
+ sidebarGroupLabelVariants({ size }),
454
+ // Single-line group header:改用 items-center 讓 chevron button(16×16)跟 text 垂直精確置中。
455
+ // cva base 的 `items-start` 是 multi-line safety,單行 header 用不到,明確覆寫成 center。
456
+ "!items-center",
457
+ className
458
+ ),
459
+ ...props,
460
+ children: [
461
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children }),
462
+ /* @__PURE__ */ jsx(CollapsiblePrimitive.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
463
+ ItemInlineActionButton,
464
+ {
465
+ icon: ChevronDown,
466
+ "aria-label": toggleAriaLabel,
467
+ className: "pointer-events-auto ml-auto",
468
+ iconClassName: "transition-transform duration-150 motion-reduce:duration-0 [[data-state=open]_&]:rotate-180"
469
+ }
470
+ ) })
471
+ ]
472
+ }
473
+ );
474
+ }
475
+ const Comp = asChild ? Slot : "div";
476
+ return /* @__PURE__ */ jsx(
477
+ Comp,
478
+ {
479
+ ref,
480
+ "data-sidebar": "group-label",
481
+ role: "presentation",
482
+ className: cn(sidebarGroupLabelVariants({ size }), className),
483
+ ...props,
484
+ children
485
+ }
486
+ );
487
+ });
488
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
489
+ const SidebarGroupAction = React.forwardRef(({ className, asChild = false, ...props }, ref) => {
490
+ const Comp = asChild ? Slot : "button";
491
+ return /* @__PURE__ */ jsx(
492
+ Comp,
493
+ {
494
+ ref,
495
+ "data-sidebar": "group-action",
496
+ className: cn(
497
+ "absolute right-[var(--layout-space-loose)] top-2 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-fg-muted outline-none ring-ring transition-colors hover:bg-neutral-hover hover:text-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
498
+ "after:absolute after:-inset-2 after:md:hidden",
499
+ "group-data-[collapsible=icon]:hidden",
500
+ className
501
+ ),
502
+ ...props
503
+ }
504
+ );
505
+ });
506
+ SidebarGroupAction.displayName = "SidebarGroupAction";
507
+ const SidebarMenu = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
508
+ "ul",
509
+ {
510
+ ref,
511
+ "data-sidebar": "menu",
512
+ className: cn("flex w-full min-w-0 flex-col", className),
513
+ ...props
514
+ }
515
+ ));
516
+ SidebarMenu.displayName = "SidebarMenu";
517
+ const SidebarMenuItem = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
518
+ "li",
519
+ {
520
+ ref,
521
+ "data-sidebar": "menu-item",
522
+ className: cn("group/menu-item relative", className),
523
+ ...props
524
+ }
525
+ ));
526
+ SidebarMenuItem.displayName = "SidebarMenuItem";
527
+ const sidebarMenuButtonVariants = cva(
528
+ [
529
+ "peer/menu-button group/menu-button",
530
+ // items-start(跟 TreeItem / MenuItem 一致的 item-layout 規則):
531
+ // 多行 label 時 prefix 留在第一行不飄移。
532
+ // 單行 label 時(我們的預設情境,truncate = line-clamp-1),效果跟 items-center 完全相同,
533
+ // 因為 prefix 被包在 `h-[1lh] flex items-center` 容器,強制對齊第一行文字中線。
534
+ "flex w-full items-start gap-2 text-left overflow-hidden",
535
+ "px-[var(--layout-space-loose)]",
536
+ "font-medium text-fg-secondary",
537
+ "cursor-pointer select-none outline-none",
538
+ // 2026-05-21 v4 C* refactor(per codex M31 Layer C 比稿 final architecture):
539
+ // 撤回所有 `group-data-[collapsible=icon]:*` overrides。Sidebar outer overflow-x:hidden
540
+ // 自動 clip menu button 右側 label / badge / action,左側 icon 自然顯示在 sidebar-width-icon
541
+ // range 內。Row geometry 永遠 stable(px-loose + items-start + gap-2 + height auto),
542
+ // 無 discrete property switch → 無 fly / 無 flutter / 無 jitter。
543
+ //
544
+ // Label/badge/action 自然存在 DOM(a11y screen reader 仍讀到),只是 outer clip 視覺消失。
545
+ // Tooltip 仍在 collapsed state 顯示(per L1043-1055 既有 hidden 條件)。
546
+ //
547
+ // 對齊 MUI MiniDrawer + shadcn canonical(width morph + overflow clip + row geometry 不變)。
548
+ "transition-[background-color,color] duration-200 ease-linear motion-reduce:duration-0",
549
+ "hover:bg-neutral-hover hover:text-foreground",
550
+ "focus-visible:bg-neutral-hover focus-visible:text-foreground",
551
+ "disabled:pointer-events-none disabled:opacity-disabled",
552
+ "aria-disabled:pointer-events-none aria-disabled:opacity-disabled",
553
+ "data-[active=true]:bg-neutral-selected data-[active=true]:text-foreground",
554
+ "group-has-[[data-sidebar=menu-action]]/menu-item:pr-8",
555
+ // 2026-05-21 v5 restore label display:none(user 抓「label 沒消失」):
556
+ // C* outer overflow-x:hidden 理論 clip,但 label.x=40 在 sidebar-width-icon=48 內 → 首字
557
+ // 部分可見。display:none 是 instant 切換非 main animation,跟 C* 「不用 display:none 做主
558
+ // 動畫」不衝突(label 不參與 width 動畫,純 final state)。對齊 shadcn canonical。
559
+ "group-data-[collapsible=icon]:[&_[data-sidebar=menu-label]]:hidden",
560
+ // 2026-05-22 Approach 9 — 收合時所有 prefix center 鎖回 rail center
561
+ // (--sidebar-width-icon/2 = GlobalHeader toggle geometry SSOT)。
562
+ // 公式: pl = (rail - prefix-width) / 2,prefix-width 由 SidebarProvider 注入的
563
+ // --item-icon-size / --item-avatar-size CSS var(JS const mirror)提供。
564
+ // 任何 row size(sm/md/lg)× density(md/lg)× prefix type(icon/avatar)6 cell 全對齊。
565
+ "group-data-[collapsible=icon]:has-[[data-prefix-type=icon]]:!pl-[calc((var(--sidebar-width-icon)-var(--item-icon-size))/2)]",
566
+ "group-data-[collapsible=icon]:has-[[data-prefix-type=avatar]]:!pl-[calc((var(--sidebar-width-icon)-var(--item-avatar-size))/2)]"
567
+ ],
568
+ {
569
+ variants: {
570
+ // size:消費 ROW_PADDING_BY_SIZE SSOT(item-anatomy.tsx)+ Sidebar-specific collapsed height
571
+ // 前為 3 cva(menu / sidebar / tree)重複同一 py 公式,drift risk 已知。
572
+ // 改用 shared SSOT 後 formula 改一處全同步。
573
+ size: {
574
+ // 2026-05-21 v4 C*:撤回 `group-data-[collapsible=icon]:!h-[...]` height lock
575
+ // (per codex Layer C — row height 永遠 stable,collapsed 只 outer clip 視覺)
576
+ sm: ROW_PADDING_BY_SIZE.sm,
577
+ md: ROW_PADDING_BY_SIZE.md,
578
+ lg: ROW_PADDING_BY_SIZE.lg
579
+ },
580
+ variant: {
581
+ /** 預設 — 導覽 item,參與 single-selection */
582
+ default: "",
583
+ /**
584
+ * Meta 命令 row(例:「查看更多」「載入更多」「Show all」「+ 新增專案」)。
585
+ *
586
+ * 語意上**不是導覽目的地**,是 section 底部的命令。規格:
587
+ * - 文字從 `text-fg-secondary` 退到 `text-fg-muted`(視覺重量下沉,hover 才升到 foreground)
588
+ * - **不該參與 single-selection**:不傳 `id`,TS 階段提醒;執行階段傳了也不會 active
589
+ * - `font-medium` 降為 `font-normal`(更輕,signal「這不是 primary 導覽」)
590
+ * - 世界級對照:Linear "Show N more"、Notion "Show N more"、Slack "Show more"、
591
+ * Gmail Labels "More"
592
+ */
593
+ meta: [
594
+ "font-normal text-fg-muted",
595
+ // meta variant 不該有 active 態;即使誤傳 isActive 也不啟動
596
+ "data-[active=true]:bg-transparent data-[active=true]:text-fg-muted"
597
+ ]
598
+ }
599
+ },
600
+ defaultVariants: { size: "md", variant: "default" }
601
+ }
602
+ );
603
+ const SidebarMenuButton = React.forwardRef(
604
+ ({
605
+ asChild = false,
606
+ id,
607
+ isActive: isActiveProp,
608
+ size: sizeProp,
609
+ variant = "default",
610
+ startIcon: StartIcon,
611
+ tooltip,
612
+ inlineActions,
613
+ inlineActionsSlot,
614
+ actionsReveal = false,
615
+ className,
616
+ children,
617
+ onClick,
618
+ ...props
619
+ }, ref) => {
620
+ const Comp = asChild ? Slot : "button";
621
+ const { isMobile, state, size: contextSize, activeId, setActiveId } = useSidebar();
622
+ const size = sizeProp ?? contextSize;
623
+ const isMeta = variant === "meta";
624
+ const isActive = isMeta ? false : isActiveProp ?? (id !== void 0 && activeId === id);
625
+ const handleClick = React.useCallback(
626
+ (e) => {
627
+ if (!isMeta && id !== void 0) setActiveId(id);
628
+ onClick == null ? void 0 : onClick(e);
629
+ },
630
+ [isMeta, id, setActiveId, onClick]
631
+ );
632
+ const content = asChild ? children : /* @__PURE__ */ jsxs(Fragment, { children: [
633
+ StartIcon && /* @__PURE__ */ jsx(ItemIcon, { icon: StartIcon }),
634
+ /* @__PURE__ */ jsx(ItemLabel, { children })
635
+ ] });
636
+ const hasSlot = !!inlineActionsSlot;
637
+ const hasActions = hasSlot || !!inlineActions && inlineActions.length > 0;
638
+ const iconSz = ICON_SIZE[size ?? "md"];
639
+ const n = hasSlot ? 1 : (inlineActions == null ? void 0 : inlineActions.length) ?? 0;
640
+ const suffixContentWidth = n > 0 ? n * iconSz + (n - 1) * 8 : 0;
641
+ const buttonPaddingRight = hasActions ? `calc(var(--layout-space-loose) + ${suffixContentWidth}px + 0.5rem)` : void 0;
642
+ const button = /* @__PURE__ */ jsx(
643
+ Comp,
644
+ {
645
+ ref,
646
+ "data-sidebar": "menu-button",
647
+ "data-active": isActive,
648
+ className: cn(sidebarMenuButtonVariants({ size, variant }), className),
649
+ style: hasActions ? { paddingRight: buttonPaddingRight } : void 0,
650
+ onClick: handleClick,
651
+ ...props,
652
+ children: content
653
+ }
654
+ );
655
+ const suffixNode = hasActions ? /* @__PURE__ */ jsx(
656
+ "span",
657
+ {
658
+ "data-sidebar": "menu-inline-actions",
659
+ className: cn(
660
+ "absolute top-1/2 -translate-y-1/2 flex items-center gap-2",
661
+ "right-[var(--layout-space-loose)]",
662
+ // Icon 模式隱藏(跟 SidebarMenuBadge / SidebarMenuAction 一致)
663
+ "group-data-[collapsible=icon]:hidden",
664
+ // hover-reveal:滑鼠 hover 或鍵盤 focus(但不是 mouse click 的 focus)時顯示。
665
+ // 用 `:has(:focus-visible)` 而非 `:focus-within`——focus-within 會被
666
+ // mouse click 觸發,導致 click 之後 actions 永久顯示直到焦點移走;
667
+ // focus-visible 只在鍵盤 tab 時啟動,mouse click 不會觸發,符合使用者直覺。
668
+ actionsReveal === "hover" && "opacity-0 group-hover/menu-item:opacity-100 group-has-[:focus-visible]/menu-item:opacity-100 transition-opacity duration-150"
669
+ ),
670
+ children: hasSlot ? inlineActionsSlot : inlineActions.map((action, i) => /* @__PURE__ */ jsx(ItemInlineAction, { action }, action.label + i))
671
+ }
672
+ ) : null;
673
+ const buttonWithTooltip = tooltip ? (() => {
674
+ const tooltipProps = typeof tooltip === "string" ? { children: tooltip } : tooltip;
675
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
676
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
677
+ /* @__PURE__ */ jsx(
678
+ TooltipContent,
679
+ {
680
+ side: "right",
681
+ align: "center",
682
+ hidden: state !== "collapsed" || isMobile,
683
+ ...tooltipProps
684
+ }
685
+ )
686
+ ] });
687
+ })() : button;
688
+ if (!suffixNode) return buttonWithTooltip;
689
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
690
+ buttonWithTooltip,
691
+ suffixNode
692
+ ] });
693
+ }
694
+ );
695
+ SidebarMenuButton.displayName = "SidebarMenuButton";
696
+ const SidebarMenuAction = React.forwardRef(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
697
+ const Comp = asChild ? Slot : "button";
698
+ return /* @__PURE__ */ jsx(
699
+ Comp,
700
+ {
701
+ ref,
702
+ "data-sidebar": "menu-action",
703
+ className: cn(
704
+ "absolute right-[var(--layout-space-loose)] top-1/2 -translate-y-1/2 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-fg-muted outline-none ring-ring transition-colors hover:bg-neutral-hover hover:text-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
705
+ "after:absolute after:-inset-2 after:md:hidden",
706
+ "group-data-[collapsible=icon]:hidden",
707
+ showOnHover && "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-foreground md:opacity-0",
708
+ className
709
+ ),
710
+ ...props
711
+ }
712
+ );
713
+ });
714
+ SidebarMenuAction.displayName = "SidebarMenuAction";
715
+ const SidebarMenuBadge = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
716
+ Badge,
717
+ {
718
+ ref,
719
+ "data-sidebar": "menu-badge",
720
+ className: cn(
721
+ "pointer-events-none absolute right-[var(--layout-space-loose)] top-1/2 -translate-y-1/2",
722
+ "group-data-[collapsible=icon]:hidden",
723
+ className
724
+ ),
725
+ ...props
726
+ }
727
+ ));
728
+ SidebarMenuBadge.displayName = "SidebarMenuBadge";
729
+ const sidebarMenuSkeletonVariants = cva(
730
+ [
731
+ "flex items-start gap-2",
732
+ "px-[var(--layout-space-loose)]"
733
+ ],
734
+ {
735
+ variants: {
736
+ // 消費 ROW_PADDING_BY_SIZE SSOT + skeleton-icon size modifier(Sidebar-specific)
737
+ // 注:skeleton 無文字,typography class 雖被帶入但無害,保持公式一處同步
738
+ size: {
739
+ sm: [ROW_PADDING_BY_SIZE.sm, "[&>[data-sidebar=menu-skeleton-icon]]:size-4"],
740
+ md: [ROW_PADDING_BY_SIZE.md, "[&>[data-sidebar=menu-skeleton-icon]]:size-4"],
741
+ lg: [ROW_PADDING_BY_SIZE.lg, "[&>[data-sidebar=menu-skeleton-icon]]:size-5"]
742
+ }
743
+ },
744
+ defaultVariants: { size: "md" }
745
+ }
746
+ );
747
+ const SidebarMenuSkeleton = React.forwardRef(({ className, showIcon = false, size: sizeProp, ...props }, ref) => {
748
+ const { size: contextSize } = useSidebar();
749
+ const size = sizeProp ?? contextSize;
750
+ const width = React.useMemo(() => {
751
+ return `${Math.floor(Math.random() * 40) + 50}%`;
752
+ }, []);
753
+ return /* @__PURE__ */ jsxs(
754
+ "div",
755
+ {
756
+ ref,
757
+ "data-sidebar": "menu-skeleton",
758
+ className: cn(sidebarMenuSkeletonVariants({ size }), className),
759
+ ...props,
760
+ children: [
761
+ showIcon && /* @__PURE__ */ jsx(
762
+ Skeleton,
763
+ {
764
+ className: "rounded-md shrink-0",
765
+ "data-sidebar": "menu-skeleton-icon"
766
+ }
767
+ ),
768
+ /* @__PURE__ */ jsx(
769
+ Skeleton,
770
+ {
771
+ className: "h-4 max-w-[var(--skeleton-width)] flex-1",
772
+ "data-sidebar": "menu-skeleton-text",
773
+ style: {
774
+ "--skeleton-width": width
775
+ }
776
+ }
777
+ )
778
+ ]
779
+ }
780
+ );
781
+ });
782
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
783
+ const sidebarMeta = {
784
+ component: "Sidebar",
785
+ family: null,
786
+ // non-family composite / overlay / layout
787
+ variants: {
788
+ default: { when: "標準導覽 row,參與 single-selection" },
789
+ meta: { when: "Section 底部命令 row(Show more / 新增),不參與 selection" }
790
+ },
791
+ sizes: {
792
+ sm: { px: 28, when: "次導覽 / 設定頁 / 緊湊空間" },
793
+ md: { px: 32, when: "預設 — 應用程式主導覽" },
794
+ lg: { px: 36, when: "重要主導覽 / icon-prominent workspace switcher" }
795
+ },
796
+ states: ["default", "hover", "active", "focus-visible", "disabled"],
797
+ tokens: {
798
+ bg: ["bg-neutral-hover", "bg-surface", "bg-transparent"],
799
+ fg: ["text-fg-muted", "text-fg-secondary", "text-foreground"],
800
+ ring: ["ring-ring"]
801
+ },
802
+ defaultSize: "md"
803
+ };
804
+ export {
805
+ Sidebar,
806
+ SidebarContent,
807
+ SidebarFooter,
808
+ SidebarGroup,
809
+ SidebarGroupAction,
810
+ SidebarGroupContent,
811
+ SidebarGroupLabel,
812
+ SidebarHeader,
813
+ SidebarInput,
814
+ SidebarMenu,
815
+ SidebarMenuAction,
816
+ SidebarMenuBadge,
817
+ SidebarMenuButton,
818
+ SidebarMenuItem,
819
+ SidebarMenuSkeleton,
820
+ SidebarProvider,
821
+ SidebarSeparator,
822
+ SidebarTrigger,
823
+ sidebarMeta,
824
+ useSidebar
825
+ };
826
+ //# sourceMappingURL=sidebar.js.map