@object-ui/components 3.1.5 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +21 -1
  3. package/dist/index.css +6339 -2
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +31896 -31523
  6. package/dist/index.umd.cjs +40 -40
  7. package/dist/{src → packages/components/src}/custom/empty.d.ts +12 -1
  8. package/dist/{src → packages/components/src}/custom/mobile-dialog-content.d.ts +1 -1
  9. package/dist/{src → packages/components/src}/renderers/action/action-bar.d.ts +12 -1
  10. package/dist/{src → packages/components/src}/ui/accordion.d.ts +1 -1
  11. package/dist/{src → packages/components/src}/ui/alert-dialog.d.ts +1 -1
  12. package/dist/packages/components/src/ui/aspect-ratio.d.ts +10 -0
  13. package/dist/{src → packages/components/src}/ui/avatar.d.ts +1 -1
  14. package/dist/{src → packages/components/src}/ui/button.d.ts +1 -1
  15. package/dist/packages/components/src/ui/chart.d.ts +56 -0
  16. package/dist/{src → packages/components/src}/ui/checkbox.d.ts +1 -1
  17. package/dist/{src → packages/components/src}/ui/collapsible.d.ts +8 -1
  18. package/dist/{src → packages/components/src}/ui/command.d.ts +2 -2
  19. package/dist/{src → packages/components/src}/ui/context-menu.d.ts +1 -1
  20. package/dist/{src → packages/components/src}/ui/dialog.d.ts +1 -1
  21. package/dist/{src → packages/components/src}/ui/drawer.d.ts +6 -10
  22. package/dist/{src → packages/components/src}/ui/dropdown-menu.d.ts +1 -1
  23. package/dist/{src → packages/components/src}/ui/form.d.ts +2 -2
  24. package/dist/{src → packages/components/src}/ui/hover-card.d.ts +1 -1
  25. package/dist/{src → packages/components/src}/ui/label.d.ts +1 -1
  26. package/dist/{src → packages/components/src}/ui/menubar.d.ts +1 -1
  27. package/dist/{src → packages/components/src}/ui/navigation-menu.d.ts +1 -1
  28. package/dist/{src → packages/components/src}/ui/popover.d.ts +1 -1
  29. package/dist/{src → packages/components/src}/ui/progress.d.ts +1 -1
  30. package/dist/{src → packages/components/src}/ui/radio-group.d.ts +1 -1
  31. package/dist/packages/components/src/ui/resizable.d.ts +7 -0
  32. package/dist/{src → packages/components/src}/ui/scroll-area.d.ts +1 -1
  33. package/dist/{src → packages/components/src}/ui/select.d.ts +1 -1
  34. package/dist/{src → packages/components/src}/ui/separator.d.ts +1 -1
  35. package/dist/{src → packages/components/src}/ui/sheet.d.ts +1 -2
  36. package/dist/{src → packages/components/src}/ui/sidebar.d.ts +1 -8
  37. package/dist/{src → packages/components/src}/ui/slider.d.ts +1 -1
  38. package/dist/{src → packages/components/src}/ui/switch.d.ts +1 -1
  39. package/dist/{src → packages/components/src}/ui/tabs.d.ts +1 -1
  40. package/dist/{src → packages/components/src}/ui/toast.d.ts +1 -1
  41. package/dist/{src → packages/components/src}/ui/toggle-group.d.ts +1 -1
  42. package/dist/{src → packages/components/src}/ui/toggle.d.ts +1 -1
  43. package/dist/{src → packages/components/src}/ui/tooltip.d.ts +1 -1
  44. package/package.json +68 -20
  45. package/.turbo/turbo-build.log +0 -64
  46. package/README_SHADCN_SYNC.md +0 -281
  47. package/TESTING.md +0 -335
  48. package/dist/src/ui/aspect-ratio.d.ts +0 -3
  49. package/dist/src/ui/chart.d.ts +0 -68
  50. package/dist/src/ui/resizable.d.ts +0 -14
  51. package/docs/FilterBuilder.md +0 -268
  52. package/metadata/Chart.component.yml +0 -30
  53. package/metadata/FilterBuilder.component.yml +0 -39
  54. package/metadata/GridLayout.component.yml +0 -27
  55. package/metadata/Menu.component.yml +0 -31
  56. package/metadata/ObjectForm.component.yml +0 -34
  57. package/metadata/ObjectGrid.component.yml +0 -72
  58. package/metadata/Page.component.yml +0 -24
  59. package/postcss.config.js +0 -14
  60. package/shadcn-components.json +0 -440
  61. package/src/SchemaRenderer.tsx +0 -28
  62. package/src/__tests__/PageRendererRegions.test.tsx +0 -668
  63. package/src/__tests__/README.md +0 -124
  64. package/src/__tests__/__snapshots__/snapshot-critical.test.tsx.snap +0 -811
  65. package/src/__tests__/__snapshots__/snapshot.test.tsx.snap +0 -327
  66. package/src/__tests__/accessibility.test.tsx +0 -137
  67. package/src/__tests__/action-bar.test.tsx +0 -206
  68. package/src/__tests__/api-consistency.test.tsx +0 -596
  69. package/src/__tests__/basic-renderers.test.tsx +0 -255
  70. package/src/__tests__/color-contrast.test.tsx +0 -212
  71. package/src/__tests__/complex-disclosure-renderers.test.tsx +0 -302
  72. package/src/__tests__/compliance.test.tsx +0 -72
  73. package/src/__tests__/config-field-renderer.test.tsx +0 -307
  74. package/src/__tests__/config-panel-renderer.test.tsx +0 -580
  75. package/src/__tests__/config-primitives.test.tsx +0 -106
  76. package/src/__tests__/edge-cases.test.tsx +0 -285
  77. package/src/__tests__/feedback-overlay-renderers.test.tsx +0 -349
  78. package/src/__tests__/filter-builder.test.tsx +0 -409
  79. package/src/__tests__/form-renderers.test.tsx +0 -364
  80. package/src/__tests__/layout-data-renderers.test.tsx +0 -340
  81. package/src/__tests__/mobile-accessibility.test.tsx +0 -120
  82. package/src/__tests__/navigation-overlay.test.tsx +0 -370
  83. package/src/__tests__/snapshot-critical.test.tsx +0 -317
  84. package/src/__tests__/snapshot.test.tsx +0 -205
  85. package/src/__tests__/test-utils.tsx +0 -190
  86. package/src/__tests__/use-config-draft.test.tsx +0 -295
  87. package/src/__tests__/view-compliance.test.tsx +0 -153
  88. package/src/__tests__/wcag-audit.test.tsx +0 -493
  89. package/src/custom/action-param-dialog.tsx +0 -264
  90. package/src/custom/button-group.tsx +0 -91
  91. package/src/custom/combobox.tsx +0 -104
  92. package/src/custom/config-field-renderer.tsx +0 -276
  93. package/src/custom/config-panel-renderer.tsx +0 -306
  94. package/src/custom/config-row.tsx +0 -50
  95. package/src/custom/date-picker.tsx +0 -61
  96. package/src/custom/empty.tsx +0 -112
  97. package/src/custom/field.tsx +0 -81
  98. package/src/custom/filter-builder.tsx +0 -418
  99. package/src/custom/index.ts +0 -21
  100. package/src/custom/input-group.tsx +0 -53
  101. package/src/custom/item.tsx +0 -201
  102. package/src/custom/kbd.tsx +0 -36
  103. package/src/custom/mobile-dialog-content.tsx +0 -67
  104. package/src/custom/native-select.tsx +0 -33
  105. package/src/custom/navigation-overlay.tsx +0 -334
  106. package/src/custom/section-header.tsx +0 -68
  107. package/src/custom/sort-builder.tsx +0 -129
  108. package/src/custom/spinner.tsx +0 -26
  109. package/src/custom/view-skeleton.tsx +0 -243
  110. package/src/custom/view-states.tsx +0 -153
  111. package/src/debug/DebugPanel.tsx +0 -313
  112. package/src/debug/__tests__/DebugPanel.test.tsx +0 -134
  113. package/src/debug/index.ts +0 -10
  114. package/src/hooks/use-config-draft.ts +0 -127
  115. package/src/hooks/use-mobile.tsx +0 -27
  116. package/src/index.css +0 -131
  117. package/src/index.ts +0 -47
  118. package/src/lib/use-sync-external-store-shim.ts +0 -10
  119. package/src/lib/use-sync-external-store-with-selector-shim.ts +0 -90
  120. package/src/lib/utils.tsx +0 -35
  121. package/src/new-components.test.ts +0 -73
  122. package/src/renderers/action/action-bar.tsx +0 -221
  123. package/src/renderers/action/action-button.tsx +0 -158
  124. package/src/renderers/action/action-group.tsx +0 -270
  125. package/src/renderers/action/action-icon.tsx +0 -150
  126. package/src/renderers/action/action-menu.tsx +0 -203
  127. package/src/renderers/action/index.ts +0 -19
  128. package/src/renderers/action/resolve-icon.ts +0 -35
  129. package/src/renderers/basic/button-group.tsx +0 -79
  130. package/src/renderers/basic/div.tsx +0 -60
  131. package/src/renderers/basic/html.tsx +0 -43
  132. package/src/renderers/basic/icon.tsx +0 -89
  133. package/src/renderers/basic/image.tsx +0 -49
  134. package/src/renderers/basic/index.ts +0 -18
  135. package/src/renderers/basic/navigation-menu.tsx +0 -81
  136. package/src/renderers/basic/pagination.tsx +0 -109
  137. package/src/renderers/basic/separator.tsx +0 -57
  138. package/src/renderers/basic/span.tsx +0 -63
  139. package/src/renderers/basic/text.tsx +0 -52
  140. package/src/renderers/complex/README-KANBAN.md +0 -208
  141. package/src/renderers/complex/TIMELINE.md +0 -353
  142. package/src/renderers/complex/__tests__/data-table-airtable-ux.test.tsx +0 -239
  143. package/src/renderers/complex/__tests__/data-table-batch-editing.test.tsx +0 -275
  144. package/src/renderers/complex/__tests__/data-table-cell-renderer.test.tsx +0 -120
  145. package/src/renderers/complex/__tests__/data-table-editing.test.tsx +0 -221
  146. package/src/renderers/complex/__tests__/data-table.test.ts +0 -76
  147. package/src/renderers/complex/carousel.tsx +0 -69
  148. package/src/renderers/complex/data-table.tsx +0 -1243
  149. package/src/renderers/complex/filter-builder.tsx +0 -77
  150. package/src/renderers/complex/index.ts +0 -16
  151. package/src/renderers/complex/resizable.tsx +0 -66
  152. package/src/renderers/complex/scroll-area.tsx +0 -58
  153. package/src/renderers/complex/table.tsx +0 -95
  154. package/src/renderers/data-display/alert.tsx +0 -46
  155. package/src/renderers/data-display/avatar.tsx +0 -38
  156. package/src/renderers/data-display/badge.tsx +0 -55
  157. package/src/renderers/data-display/breadcrumb.tsx +0 -61
  158. package/src/renderers/data-display/index.ts +0 -18
  159. package/src/renderers/data-display/kbd.tsx +0 -50
  160. package/src/renderers/data-display/list.tsx +0 -75
  161. package/src/renderers/data-display/statistic.tsx +0 -95
  162. package/src/renderers/data-display/table.tsx +0 -78
  163. package/src/renderers/data-display/tree-view.tsx +0 -176
  164. package/src/renderers/disclosure/accordion.tsx +0 -69
  165. package/src/renderers/disclosure/collapsible.tsx +0 -53
  166. package/src/renderers/disclosure/index.ts +0 -11
  167. package/src/renderers/disclosure/toggle-group.tsx +0 -79
  168. package/src/renderers/feedback/empty.tsx +0 -49
  169. package/src/renderers/feedback/index.ts +0 -16
  170. package/src/renderers/feedback/loading.tsx +0 -78
  171. package/src/renderers/feedback/progress.tsx +0 -29
  172. package/src/renderers/feedback/skeleton.tsx +0 -31
  173. package/src/renderers/feedback/sonner.tsx +0 -56
  174. package/src/renderers/feedback/spinner.tsx +0 -55
  175. package/src/renderers/feedback/toast.tsx +0 -59
  176. package/src/renderers/feedback/toaster.tsx +0 -23
  177. package/src/renderers/form/button.tsx +0 -103
  178. package/src/renderers/form/calendar.tsx +0 -34
  179. package/src/renderers/form/checkbox.tsx +0 -71
  180. package/src/renderers/form/combobox.tsx +0 -48
  181. package/src/renderers/form/command.tsx +0 -58
  182. package/src/renderers/form/date-picker.tsx +0 -84
  183. package/src/renderers/form/file-upload.tsx +0 -184
  184. package/src/renderers/form/form.tsx +0 -533
  185. package/src/renderers/form/index.ts +0 -26
  186. package/src/renderers/form/input-otp.tsx +0 -51
  187. package/src/renderers/form/input.tsx +0 -121
  188. package/src/renderers/form/label.tsx +0 -45
  189. package/src/renderers/form/radio-group.tsx +0 -63
  190. package/src/renderers/form/select.tsx +0 -94
  191. package/src/renderers/form/slider.tsx +0 -61
  192. package/src/renderers/form/switch.tsx +0 -48
  193. package/src/renderers/form/textarea.tsx +0 -76
  194. package/src/renderers/form/toggle.tsx +0 -42
  195. package/src/renderers/index.ts +0 -18
  196. package/src/renderers/layout/aspect-ratio.tsx +0 -51
  197. package/src/renderers/layout/card.tsx +0 -85
  198. package/src/renderers/layout/container.tsx +0 -122
  199. package/src/renderers/layout/flex.tsx +0 -132
  200. package/src/renderers/layout/grid.tsx +0 -178
  201. package/src/renderers/layout/index.ts +0 -19
  202. package/src/renderers/layout/page.tsx +0 -466
  203. package/src/renderers/layout/semantic.tsx +0 -48
  204. package/src/renderers/layout/stack.tsx +0 -132
  205. package/src/renderers/layout/tabs.tsx +0 -97
  206. package/src/renderers/navigation/header-bar.tsx +0 -118
  207. package/src/renderers/navigation/index.ts +0 -10
  208. package/src/renderers/navigation/sidebar.tsx +0 -208
  209. package/src/renderers/overlay/alert-dialog.tsx +0 -72
  210. package/src/renderers/overlay/context-menu.tsx +0 -100
  211. package/src/renderers/overlay/dialog.tsx +0 -77
  212. package/src/renderers/overlay/drawer.tsx +0 -77
  213. package/src/renderers/overlay/dropdown-menu.tsx +0 -99
  214. package/src/renderers/overlay/hover-card.tsx +0 -55
  215. package/src/renderers/overlay/index.ts +0 -18
  216. package/src/renderers/overlay/menubar.tsx +0 -76
  217. package/src/renderers/overlay/popover.tsx +0 -56
  218. package/src/renderers/overlay/sheet.tsx +0 -77
  219. package/src/renderers/overlay/tooltip.tsx +0 -67
  220. package/src/renderers/placeholders.tsx +0 -107
  221. package/src/stories/CRMApp.stories.tsx +0 -706
  222. package/src/stories/ConfigPanel.stories.tsx +0 -232
  223. package/src/stories/Guide.mdx +0 -55
  224. package/src/stories/MockedData.stories.tsx +0 -121
  225. package/src/stories/assets/accessibility.png +0 -0
  226. package/src/stories/assets/accessibility.svg +0 -1
  227. package/src/stories/assets/addon-library.png +0 -0
  228. package/src/stories/assets/assets.png +0 -0
  229. package/src/stories/assets/avif-test-image.avif +0 -0
  230. package/src/stories/assets/context.png +0 -0
  231. package/src/stories/assets/discord.svg +0 -1
  232. package/src/stories/assets/docs.png +0 -0
  233. package/src/stories/assets/figma-plugin.png +0 -0
  234. package/src/stories/assets/github.svg +0 -1
  235. package/src/stories/assets/share.png +0 -0
  236. package/src/stories/assets/styling.png +0 -0
  237. package/src/stories/assets/testing.png +0 -0
  238. package/src/stories/assets/theming.png +0 -0
  239. package/src/stories/assets/tutorials.svg +0 -1
  240. package/src/stories/assets/youtube.svg +0 -1
  241. package/src/stories/button.css +0 -30
  242. package/src/stories/header.css +0 -32
  243. package/src/stories/page.css +0 -68
  244. package/src/stories-json/Accessibility.mdx +0 -297
  245. package/src/stories-json/EdgeCases.stories.tsx +0 -160
  246. package/src/stories-json/GettingStarted.mdx +0 -89
  247. package/src/stories-json/Introduction.mdx +0 -127
  248. package/src/stories-json/accordion.stories.tsx +0 -43
  249. package/src/stories-json/aggrid.stories.tsx +0 -103
  250. package/src/stories-json/alert.stories.tsx +0 -39
  251. package/src/stories-json/aspect-ratio.stories.tsx +0 -34
  252. package/src/stories-json/avatar.stories.tsx +0 -38
  253. package/src/stories-json/badge.stories.tsx +0 -53
  254. package/src/stories-json/breadcrumb.stories.tsx +0 -30
  255. package/src/stories-json/button-group.stories.tsx +0 -43
  256. package/src/stories-json/button.stories.tsx +0 -73
  257. package/src/stories-json/calendar.stories.tsx +0 -85
  258. package/src/stories-json/card.stories.tsx +0 -48
  259. package/src/stories-json/carousel.stories.tsx +0 -33
  260. package/src/stories-json/charts.stories.tsx +0 -195
  261. package/src/stories-json/chatbot.stories.tsx +0 -248
  262. package/src/stories-json/code-editor.stories.tsx +0 -92
  263. package/src/stories-json/collapsible.stories.tsx +0 -40
  264. package/src/stories-json/controls.stories.tsx +0 -36
  265. package/src/stories-json/crm-live-data.stories.tsx +0 -154
  266. package/src/stories-json/dashboard.stories.tsx +0 -318
  267. package/src/stories-json/data-table.stories.tsx +0 -136
  268. package/src/stories-json/data_display_extras.stories.tsx +0 -102
  269. package/src/stories-json/date-picker.stories.tsx +0 -28
  270. package/src/stories-json/detail-view.stories.tsx +0 -258
  271. package/src/stories-json/dialog.stories.tsx +0 -43
  272. package/src/stories-json/feedback_extras.stories.tsx +0 -40
  273. package/src/stories-json/feedback_others.stories.tsx +0 -46
  274. package/src/stories-json/form-variants.stories.tsx +0 -210
  275. package/src/stories-json/form_advanced.stories.tsx +0 -117
  276. package/src/stories-json/form_extras.stories.tsx +0 -123
  277. package/src/stories-json/grid.stories.tsx +0 -56
  278. package/src/stories-json/icon.stories.tsx +0 -36
  279. package/src/stories-json/input.stories.tsx +0 -52
  280. package/src/stories-json/kanban.stories.tsx +0 -295
  281. package/src/stories-json/layout_extended.stories.tsx +0 -76
  282. package/src/stories-json/layout_flex.stories.tsx +0 -107
  283. package/src/stories-json/list-view.stories.tsx +0 -97
  284. package/src/stories-json/markdown.stories.tsx +0 -129
  285. package/src/stories-json/menus.stories.tsx +0 -63
  286. package/src/stories-json/metric-card.stories.tsx +0 -143
  287. package/src/stories-json/navigation-menu.stories.tsx +0 -37
  288. package/src/stories-json/object-aggrid-advanced.stories.tsx +0 -389
  289. package/src/stories-json/object-aggrid.stories.tsx +0 -252
  290. package/src/stories-json/object-form.stories.tsx +0 -130
  291. package/src/stories-json/object-gantt.stories.tsx +0 -114
  292. package/src/stories-json/object-grid.stories.tsx +0 -315
  293. package/src/stories-json/object-map.stories.tsx +0 -116
  294. package/src/stories-json/object-view.stories.tsx +0 -118
  295. package/src/stories-json/overlay_extras.stories.tsx +0 -113
  296. package/src/stories-json/overlay_others.stories.tsx +0 -76
  297. package/src/stories-json/page.stories.tsx +0 -55
  298. package/src/stories-json/reports.stories.tsx +0 -163
  299. package/src/stories-json/resizable.stories.tsx +0 -44
  300. package/src/stories-json/select.stories.tsx +0 -34
  301. package/src/stories-json/separator.stories.tsx +0 -41
  302. package/src/stories-json/sidebar.stories.tsx +0 -147
  303. package/src/stories-json/statistic.stories.tsx +0 -44
  304. package/src/stories-json/tabs.stories.tsx +0 -51
  305. package/src/stories-json/timeline.stories.tsx +0 -188
  306. package/src/stories-json/typography.stories.tsx +0 -45
  307. package/src/types/config-panel.ts +0 -101
  308. package/src/ui/accordion.tsx +0 -66
  309. package/src/ui/alert-dialog.tsx +0 -149
  310. package/src/ui/alert.tsx +0 -67
  311. package/src/ui/aspect-ratio.tsx +0 -15
  312. package/src/ui/avatar.tsx +0 -58
  313. package/src/ui/badge.tsx +0 -44
  314. package/src/ui/breadcrumb.tsx +0 -123
  315. package/src/ui/button.tsx +0 -66
  316. package/src/ui/calendar.tsx +0 -221
  317. package/src/ui/card.tsx +0 -87
  318. package/src/ui/carousel.tsx +0 -270
  319. package/src/ui/chart.tsx +0 -367
  320. package/src/ui/checkbox.tsx +0 -38
  321. package/src/ui/collapsible.tsx +0 -19
  322. package/src/ui/command.tsx +0 -161
  323. package/src/ui/context-menu.tsx +0 -208
  324. package/src/ui/dialog.tsx +0 -147
  325. package/src/ui/drawer.tsx +0 -126
  326. package/src/ui/dropdown-menu.tsx +0 -208
  327. package/src/ui/form.tsx +0 -186
  328. package/src/ui/hover-card.tsx +0 -37
  329. package/src/ui/index.ts +0 -56
  330. package/src/ui/input-otp.tsx +0 -79
  331. package/src/ui/input.tsx +0 -30
  332. package/src/ui/label.tsx +0 -34
  333. package/src/ui/menubar.tsx +0 -264
  334. package/src/ui/navigation-menu.tsx +0 -136
  335. package/src/ui/pagination.tsx +0 -125
  336. package/src/ui/popover.tsx +0 -39
  337. package/src/ui/progress.tsx +0 -36
  338. package/src/ui/radio-group.tsx +0 -52
  339. package/src/ui/resizable.tsx +0 -53
  340. package/src/ui/scroll-area.tsx +0 -56
  341. package/src/ui/select.tsx +0 -168
  342. package/src/ui/separator.tsx +0 -39
  343. package/src/ui/sheet.tsx +0 -151
  344. package/src/ui/sidebar.tsx +0 -866
  345. package/src/ui/skeleton.tsx +0 -23
  346. package/src/ui/slider.tsx +0 -40
  347. package/src/ui/sonner.tsx +0 -53
  348. package/src/ui/switch.tsx +0 -37
  349. package/src/ui/table.tsx +0 -125
  350. package/src/ui/tabs.tsx +0 -63
  351. package/src/ui/textarea.tsx +0 -30
  352. package/src/ui/toast.tsx +0 -137
  353. package/src/ui/toggle-group.tsx +0 -69
  354. package/src/ui/toggle.tsx +0 -53
  355. package/src/ui/tooltip.tsx +0 -38
  356. package/src/ui/typography.tsx +0 -85
  357. package/tsconfig.json +0 -19
  358. package/vite.config.ts +0 -70
  359. package/vitest.config.ts +0 -5
  360. /package/dist/{src → packages/components/src}/SchemaRenderer.d.ts +0 -0
  361. /package/dist/{src → packages/components/src}/custom/action-param-dialog.d.ts +0 -0
  362. /package/dist/{src → packages/components/src}/custom/button-group.d.ts +0 -0
  363. /package/dist/{src → packages/components/src}/custom/combobox.d.ts +0 -0
  364. /package/dist/{src → packages/components/src}/custom/config-field-renderer.d.ts +0 -0
  365. /package/dist/{src → packages/components/src}/custom/config-panel-renderer.d.ts +0 -0
  366. /package/dist/{src → packages/components/src}/custom/config-row.d.ts +0 -0
  367. /package/dist/{src → packages/components/src}/custom/date-picker.d.ts +0 -0
  368. /package/dist/{src → packages/components/src}/custom/field.d.ts +0 -0
  369. /package/dist/{src → packages/components/src}/custom/filter-builder.d.ts +0 -0
  370. /package/dist/{src → packages/components/src}/custom/index.d.ts +0 -0
  371. /package/dist/{src → packages/components/src}/custom/input-group.d.ts +0 -0
  372. /package/dist/{src → packages/components/src}/custom/item.d.ts +0 -0
  373. /package/dist/{src → packages/components/src}/custom/kbd.d.ts +0 -0
  374. /package/dist/{src → packages/components/src}/custom/native-select.d.ts +0 -0
  375. /package/dist/{src → packages/components/src}/custom/navigation-overlay.d.ts +0 -0
  376. /package/dist/{src → packages/components/src}/custom/section-header.d.ts +0 -0
  377. /package/dist/{src → packages/components/src}/custom/sort-builder.d.ts +0 -0
  378. /package/dist/{src → packages/components/src}/custom/spinner.d.ts +0 -0
  379. /package/dist/{src → packages/components/src}/custom/view-skeleton.d.ts +0 -0
  380. /package/dist/{src → packages/components/src}/custom/view-states.d.ts +0 -0
  381. /package/dist/{src → packages/components/src}/debug/DebugPanel.d.ts +0 -0
  382. /package/dist/{src → packages/components/src}/debug/index.d.ts +0 -0
  383. /package/dist/{src → packages/components/src}/hooks/use-config-draft.d.ts +0 -0
  384. /package/dist/{src → packages/components/src}/hooks/use-mobile.d.ts +0 -0
  385. /package/dist/{src → packages/components/src}/index.d.ts +0 -0
  386. /package/dist/{src → packages/components/src}/lib/use-sync-external-store-shim.d.ts +0 -0
  387. /package/dist/{src → packages/components/src}/lib/use-sync-external-store-with-selector-shim.d.ts +0 -0
  388. /package/dist/{src → packages/components/src}/lib/utils.d.ts +0 -0
  389. /package/dist/{src → packages/components/src}/renderers/action/action-button.d.ts +0 -0
  390. /package/dist/{src → packages/components/src}/renderers/action/action-group.d.ts +0 -0
  391. /package/dist/{src → packages/components/src}/renderers/action/action-icon.d.ts +0 -0
  392. /package/dist/{src → packages/components/src}/renderers/action/action-menu.d.ts +0 -0
  393. /package/dist/{src → packages/components/src}/renderers/action/index.d.ts +0 -0
  394. /package/dist/{src → packages/components/src}/renderers/action/resolve-icon.d.ts +0 -0
  395. /package/dist/{src → packages/components/src}/renderers/basic/button-group.d.ts +0 -0
  396. /package/dist/{src → packages/components/src}/renderers/basic/div.d.ts +0 -0
  397. /package/dist/{src → packages/components/src}/renderers/basic/html.d.ts +0 -0
  398. /package/dist/{src → packages/components/src}/renderers/basic/icon.d.ts +0 -0
  399. /package/dist/{src → packages/components/src}/renderers/basic/image.d.ts +0 -0
  400. /package/dist/{src → packages/components/src}/renderers/basic/index.d.ts +0 -0
  401. /package/dist/{src → packages/components/src}/renderers/basic/navigation-menu.d.ts +0 -0
  402. /package/dist/{src → packages/components/src}/renderers/basic/pagination.d.ts +0 -0
  403. /package/dist/{src → packages/components/src}/renderers/basic/separator.d.ts +0 -0
  404. /package/dist/{src → packages/components/src}/renderers/basic/span.d.ts +0 -0
  405. /package/dist/{src → packages/components/src}/renderers/basic/text.d.ts +0 -0
  406. /package/dist/{src → packages/components/src}/renderers/complex/carousel.d.ts +0 -0
  407. /package/dist/{src → packages/components/src}/renderers/complex/data-table.d.ts +0 -0
  408. /package/dist/{src → packages/components/src}/renderers/complex/filter-builder.d.ts +0 -0
  409. /package/dist/{src → packages/components/src}/renderers/complex/index.d.ts +0 -0
  410. /package/dist/{src → packages/components/src}/renderers/complex/resizable.d.ts +0 -0
  411. /package/dist/{src → packages/components/src}/renderers/complex/scroll-area.d.ts +0 -0
  412. /package/dist/{src → packages/components/src}/renderers/complex/table.d.ts +0 -0
  413. /package/dist/{src → packages/components/src}/renderers/data-display/alert.d.ts +0 -0
  414. /package/dist/{src → packages/components/src}/renderers/data-display/avatar.d.ts +0 -0
  415. /package/dist/{src → packages/components/src}/renderers/data-display/badge.d.ts +0 -0
  416. /package/dist/{src → packages/components/src}/renderers/data-display/breadcrumb.d.ts +0 -0
  417. /package/dist/{src → packages/components/src}/renderers/data-display/index.d.ts +0 -0
  418. /package/dist/{src → packages/components/src}/renderers/data-display/kbd.d.ts +0 -0
  419. /package/dist/{src → packages/components/src}/renderers/data-display/list.d.ts +0 -0
  420. /package/dist/{src → packages/components/src}/renderers/data-display/statistic.d.ts +0 -0
  421. /package/dist/{src → packages/components/src}/renderers/data-display/table.d.ts +0 -0
  422. /package/dist/{src → packages/components/src}/renderers/data-display/tree-view.d.ts +0 -0
  423. /package/dist/{src → packages/components/src}/renderers/disclosure/accordion.d.ts +0 -0
  424. /package/dist/{src → packages/components/src}/renderers/disclosure/collapsible.d.ts +0 -0
  425. /package/dist/{src → packages/components/src}/renderers/disclosure/index.d.ts +0 -0
  426. /package/dist/{src → packages/components/src}/renderers/disclosure/toggle-group.d.ts +0 -0
  427. /package/dist/{src → packages/components/src}/renderers/feedback/empty.d.ts +0 -0
  428. /package/dist/{src → packages/components/src}/renderers/feedback/index.d.ts +0 -0
  429. /package/dist/{src → packages/components/src}/renderers/feedback/loading.d.ts +0 -0
  430. /package/dist/{src → packages/components/src}/renderers/feedback/progress.d.ts +0 -0
  431. /package/dist/{src → packages/components/src}/renderers/feedback/skeleton.d.ts +0 -0
  432. /package/dist/{src → packages/components/src}/renderers/feedback/sonner.d.ts +0 -0
  433. /package/dist/{src → packages/components/src}/renderers/feedback/spinner.d.ts +0 -0
  434. /package/dist/{src → packages/components/src}/renderers/feedback/toast.d.ts +0 -0
  435. /package/dist/{src → packages/components/src}/renderers/feedback/toaster.d.ts +0 -0
  436. /package/dist/{src → packages/components/src}/renderers/form/button.d.ts +0 -0
  437. /package/dist/{src → packages/components/src}/renderers/form/calendar.d.ts +0 -0
  438. /package/dist/{src → packages/components/src}/renderers/form/checkbox.d.ts +0 -0
  439. /package/dist/{src → packages/components/src}/renderers/form/combobox.d.ts +0 -0
  440. /package/dist/{src → packages/components/src}/renderers/form/command.d.ts +0 -0
  441. /package/dist/{src → packages/components/src}/renderers/form/date-picker.d.ts +0 -0
  442. /package/dist/{src → packages/components/src}/renderers/form/file-upload.d.ts +0 -0
  443. /package/dist/{src → packages/components/src}/renderers/form/form.d.ts +0 -0
  444. /package/dist/{src → packages/components/src}/renderers/form/index.d.ts +0 -0
  445. /package/dist/{src → packages/components/src}/renderers/form/input-otp.d.ts +0 -0
  446. /package/dist/{src → packages/components/src}/renderers/form/input.d.ts +0 -0
  447. /package/dist/{src → packages/components/src}/renderers/form/label.d.ts +0 -0
  448. /package/dist/{src → packages/components/src}/renderers/form/radio-group.d.ts +0 -0
  449. /package/dist/{src → packages/components/src}/renderers/form/select.d.ts +0 -0
  450. /package/dist/{src → packages/components/src}/renderers/form/slider.d.ts +0 -0
  451. /package/dist/{src → packages/components/src}/renderers/form/switch.d.ts +0 -0
  452. /package/dist/{src → packages/components/src}/renderers/form/textarea.d.ts +0 -0
  453. /package/dist/{src → packages/components/src}/renderers/form/toggle.d.ts +0 -0
  454. /package/dist/{src → packages/components/src}/renderers/index.d.ts +0 -0
  455. /package/dist/{src → packages/components/src}/renderers/layout/aspect-ratio.d.ts +0 -0
  456. /package/dist/{src → packages/components/src}/renderers/layout/card.d.ts +0 -0
  457. /package/dist/{src → packages/components/src}/renderers/layout/container.d.ts +0 -0
  458. /package/dist/{src → packages/components/src}/renderers/layout/flex.d.ts +0 -0
  459. /package/dist/{src → packages/components/src}/renderers/layout/grid.d.ts +0 -0
  460. /package/dist/{src → packages/components/src}/renderers/layout/index.d.ts +0 -0
  461. /package/dist/{src → packages/components/src}/renderers/layout/page.d.ts +0 -0
  462. /package/dist/{src → packages/components/src}/renderers/layout/semantic.d.ts +0 -0
  463. /package/dist/{src → packages/components/src}/renderers/layout/stack.d.ts +0 -0
  464. /package/dist/{src → packages/components/src}/renderers/layout/tabs.d.ts +0 -0
  465. /package/dist/{src → packages/components/src}/renderers/navigation/header-bar.d.ts +0 -0
  466. /package/dist/{src → packages/components/src}/renderers/navigation/index.d.ts +0 -0
  467. /package/dist/{src → packages/components/src}/renderers/navigation/sidebar.d.ts +0 -0
  468. /package/dist/{src → packages/components/src}/renderers/overlay/alert-dialog.d.ts +0 -0
  469. /package/dist/{src → packages/components/src}/renderers/overlay/context-menu.d.ts +0 -0
  470. /package/dist/{src → packages/components/src}/renderers/overlay/dialog.d.ts +0 -0
  471. /package/dist/{src → packages/components/src}/renderers/overlay/drawer.d.ts +0 -0
  472. /package/dist/{src → packages/components/src}/renderers/overlay/dropdown-menu.d.ts +0 -0
  473. /package/dist/{src → packages/components/src}/renderers/overlay/hover-card.d.ts +0 -0
  474. /package/dist/{src → packages/components/src}/renderers/overlay/index.d.ts +0 -0
  475. /package/dist/{src → packages/components/src}/renderers/overlay/menubar.d.ts +0 -0
  476. /package/dist/{src → packages/components/src}/renderers/overlay/popover.d.ts +0 -0
  477. /package/dist/{src → packages/components/src}/renderers/overlay/sheet.d.ts +0 -0
  478. /package/dist/{src → packages/components/src}/renderers/overlay/tooltip.d.ts +0 -0
  479. /package/dist/{src → packages/components/src}/renderers/placeholders.d.ts +0 -0
  480. /package/dist/{src → packages/components/src}/types/config-panel.d.ts +0 -0
  481. /package/dist/{src → packages/components/src}/ui/alert.d.ts +0 -0
  482. /package/dist/{src → packages/components/src}/ui/badge.d.ts +0 -0
  483. /package/dist/{src → packages/components/src}/ui/breadcrumb.d.ts +0 -0
  484. /package/dist/{src → packages/components/src}/ui/calendar.d.ts +0 -0
  485. /package/dist/{src → packages/components/src}/ui/card.d.ts +0 -0
  486. /package/dist/{src → packages/components/src}/ui/carousel.d.ts +0 -0
  487. /package/dist/{src → packages/components/src}/ui/index.d.ts +0 -0
  488. /package/dist/{src → packages/components/src}/ui/input-otp.d.ts +0 -0
  489. /package/dist/{src → packages/components/src}/ui/input.d.ts +0 -0
  490. /package/dist/{src → packages/components/src}/ui/pagination.d.ts +0 -0
  491. /package/dist/{src → packages/components/src}/ui/skeleton.d.ts +0 -0
  492. /package/dist/{src → packages/components/src}/ui/sonner.d.ts +0 -0
  493. /package/dist/{src → packages/components/src}/ui/table.d.ts +0 -0
  494. /package/dist/{src → packages/components/src}/ui/textarea.d.ts +0 -0
  495. /package/dist/{src → packages/components/src}/ui/typography.d.ts +0 -0
@@ -1,866 +0,0 @@
1
- /**
2
- * ObjectUI
3
- * Copyright (c) 2024-present ObjectStack Inc.
4
- *
5
- * This source code is licensed under the MIT license found in the
6
- * LICENSE file in the root directory of this source tree.
7
- */
8
-
9
- "use client"
10
-
11
- import * as React from "react"
12
- import { Slot as SlotPrimitive } from "radix-ui"
13
- import { cva, type VariantProps } from "class-variance-authority"
14
- import { PanelLeft } from "lucide-react"
15
-
16
- import { useIsMobile } from "../hooks/use-mobile"
17
- import { cn } from "../lib/utils"
18
- import { Button } from "./button"
19
- import { Input } from "./input"
20
- import { Separator } from "./separator"
21
- import {
22
- Sheet,
23
- SheetContent,
24
- SheetDescription,
25
- SheetHeader,
26
- SheetTitle,
27
- } from "./sheet"
28
- import { Skeleton } from "./skeleton"
29
- import {
30
- Tooltip,
31
- TooltipContent,
32
- TooltipProvider,
33
- TooltipTrigger,
34
- } from "./tooltip"
35
-
36
- const SIDEBAR_COOKIE_NAME = "sidebar_state"
37
- const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
38
- const SIDEBAR_WIDTH = "16rem"
39
- const SIDEBAR_WIDTH_MOBILE = "18rem"
40
- const SIDEBAR_WIDTH_ICON = "3rem"
41
- const SIDEBAR_KEYBOARD_SHORTCUT = "b"
42
- const SIDEBAR_WIDTH_STORAGE_KEY = "sidebar_width"
43
- const SIDEBAR_MIN_WIDTH = 200 // px
44
- const SIDEBAR_MAX_WIDTH = 480 // px
45
- const SIDEBAR_DEFAULT_WIDTH_PX = 256 // 16rem in px
46
- const SIDEBAR_CLICK_THRESHOLD_PX = 5
47
-
48
- type SidebarContextProps = {
49
- state: "expanded" | "collapsed"
50
- open: boolean
51
- setOpen: (open: boolean) => void
52
- openMobile: boolean
53
- setOpenMobile: (open: boolean) => void
54
- isMobile: boolean
55
- toggleSidebar: () => void
56
- /** Current sidebar width in pixels (only used when resizable) */
57
- sidebarWidth: number | null
58
- /** Update sidebar width (only used when resizable) */
59
- setSidebarWidth: (width: number | null) => void
60
- }
61
-
62
- const SidebarContext = React.createContext<SidebarContextProps | null>(null)
63
-
64
- function useSidebar() {
65
- const context = React.useContext(SidebarContext)
66
- if (!context) {
67
- throw new Error("useSidebar must be used within a SidebarProvider.")
68
- }
69
-
70
- return context
71
- }
72
-
73
- const SidebarProvider = React.forwardRef<
74
- HTMLDivElement,
75
- React.ComponentProps<"div"> & {
76
- defaultOpen?: boolean
77
- open?: boolean
78
- onOpenChange?: (open: boolean) => void
79
- }
80
- >(
81
- (
82
- {
83
- defaultOpen = true,
84
- open: openProp,
85
- onOpenChange: setOpenProp,
86
- className,
87
- style,
88
- children,
89
- ...props
90
- },
91
- ref
92
- ) => {
93
- const isMobile = useIsMobile()
94
- const [openMobile, setOpenMobile] = React.useState(false)
95
-
96
- // Resizable sidebar width state (persisted to localStorage)
97
- const [sidebarWidth, setSidebarWidthState] = React.useState<number | null>(() => {
98
- try {
99
- const stored = localStorage.getItem(SIDEBAR_WIDTH_STORAGE_KEY)
100
- if (!stored) return null
101
- const value = Number(stored)
102
- if (isNaN(value)) return null
103
- return Math.max(SIDEBAR_MIN_WIDTH, Math.min(SIDEBAR_MAX_WIDTH, value))
104
- } catch { return null }
105
- })
106
- const setSidebarWidth = React.useCallback((width: number | null) => {
107
- setSidebarWidthState(width)
108
- try {
109
- if (width != null) {
110
- localStorage.setItem(SIDEBAR_WIDTH_STORAGE_KEY, String(width))
111
- } else {
112
- localStorage.removeItem(SIDEBAR_WIDTH_STORAGE_KEY)
113
- }
114
- } catch { /* ignore */ }
115
- }, [])
116
-
117
- // This is the internal state of the sidebar.
118
- // We use openProp and setOpenProp for control from outside the component.
119
- const [_open, _setOpen] = React.useState(defaultOpen)
120
- const open = openProp ?? _open
121
- const setOpen = React.useCallback(
122
- (value: boolean | ((value: boolean) => boolean)) => {
123
- const openState = typeof value === "function" ? value(open) : value
124
- if (setOpenProp) {
125
- setOpenProp(openState)
126
- } else {
127
- _setOpen(openState)
128
- }
129
-
130
- // This sets the cookie to keep the sidebar state.
131
- document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
132
- },
133
- [setOpenProp, open]
134
- )
135
-
136
- // Helper to toggle the sidebar.
137
- const toggleSidebar = React.useCallback(() => {
138
- return isMobile
139
- ? setOpenMobile((open) => !open)
140
- : setOpen((open) => !open)
141
- }, [isMobile, setOpen, setOpenMobile])
142
-
143
- // Adds a keyboard shortcut to toggle the sidebar.
144
- React.useEffect(() => {
145
- const handleKeyDown = (event: KeyboardEvent) => {
146
- if (
147
- event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
148
- (event.metaKey || event.ctrlKey)
149
- ) {
150
- event.preventDefault()
151
- toggleSidebar()
152
- }
153
- }
154
-
155
- window.addEventListener("keydown", handleKeyDown)
156
- return () => window.removeEventListener("keydown", handleKeyDown)
157
- }, [toggleSidebar])
158
-
159
- // We add a state so that we can do data-state="expanded" or "collapsed".
160
- // This makes it easier to style the sidebar with Tailwind classes.
161
- const state = open ? "expanded" : "collapsed"
162
-
163
- const contextValue = React.useMemo<SidebarContextProps>(
164
- () => ({
165
- state,
166
- open,
167
- setOpen,
168
- isMobile,
169
- openMobile,
170
- setOpenMobile,
171
- toggleSidebar,
172
- sidebarWidth,
173
- setSidebarWidth,
174
- }),
175
- [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, sidebarWidth, setSidebarWidth]
176
- )
177
-
178
- return (
179
- <SidebarContext.Provider value={contextValue}>
180
- <TooltipProvider delayDuration={0}>
181
- <div
182
- style={
183
- {
184
- "--sidebar-width": sidebarWidth ? `${sidebarWidth}px` : SIDEBAR_WIDTH,
185
- "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
186
- ...style,
187
- } as React.CSSProperties
188
- }
189
- className={cn(
190
- "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
191
- className
192
- )}
193
- ref={ref}
194
- {...props}
195
- >
196
- {children}
197
- </div>
198
- </TooltipProvider>
199
- </SidebarContext.Provider>
200
- )
201
- }
202
- )
203
- SidebarProvider.displayName = "SidebarProvider"
204
-
205
- const Sidebar = React.forwardRef<
206
- HTMLDivElement,
207
- React.ComponentProps<"div"> & {
208
- side?: "left" | "right"
209
- variant?: "sidebar" | "floating" | "inset"
210
- collapsible?: "offcanvas" | "icon" | "none"
211
- }
212
- >(
213
- (
214
- {
215
- side = "left",
216
- variant = "sidebar",
217
- collapsible = "offcanvas",
218
- className,
219
- children,
220
- ...props
221
- },
222
- ref
223
- ) => {
224
- const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
225
-
226
- if (collapsible === "none") {
227
- return (
228
- <div
229
- className={cn(
230
- "flex h-full w-[var(--sidebar-width)] flex-col bg-sidebar text-sidebar-foreground",
231
- className
232
- )}
233
- ref={ref}
234
- {...props}
235
- >
236
- {children}
237
- </div>
238
- )
239
- }
240
-
241
- if (isMobile) {
242
- return (
243
- <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
244
- <SheetContent
245
- data-sidebar="sidebar"
246
- data-mobile="true"
247
- className="w-[var(--sidebar-width)] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
248
- style={
249
- {
250
- "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
251
- } as React.CSSProperties
252
- }
253
- side={side}
254
- >
255
- <SheetHeader className="sr-only">
256
- <SheetTitle>Sidebar</SheetTitle>
257
- <SheetDescription>Displays the mobile sidebar.</SheetDescription>
258
- </SheetHeader>
259
- <div className="flex h-full w-full flex-col">{children}</div>
260
- </SheetContent>
261
- </Sheet>
262
- )
263
- }
264
-
265
- return (
266
- <div
267
- ref={ref}
268
- className="group peer hidden text-sidebar-foreground md:block"
269
- data-state={state}
270
- data-collapsible={state === "collapsed" ? collapsible : ""}
271
- data-variant={variant}
272
- data-side={side}
273
- >
274
- {/* This is what handles the sidebar gap on desktop */}
275
- <div
276
- className={cn(
277
- "relative w-[var(--sidebar-width)] bg-transparent transition-[width] duration-200 ease-linear",
278
- "group-data-[collapsible=offcanvas]:w-0",
279
- "group-data-[side=right]:rotate-180",
280
- variant === "floating" || variant === "inset"
281
- ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
282
- : "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]"
283
- )}
284
- />
285
- <div
286
- className={cn(
287
- "fixed inset-y-0 z-10 hidden h-svh w-[var(--sidebar-width)] transition-[left,right,width] duration-200 ease-linear md:flex",
288
- side === "left"
289
- ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
290
- : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
291
- // Adjust the padding for floating and inset variants.
292
- variant === "floating" || variant === "inset"
293
- ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
294
- : "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)] group-data-[side=left]:border-r group-data-[side=right]:border-l",
295
- className
296
- )}
297
- {...props}
298
- >
299
- <div
300
- data-sidebar="sidebar"
301
- className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
302
- >
303
- {children}
304
- </div>
305
- </div>
306
- </div>
307
- )
308
- }
309
- )
310
- Sidebar.displayName = "Sidebar"
311
-
312
- const SidebarTrigger = React.forwardRef<
313
- React.ElementRef<typeof Button>,
314
- React.ComponentProps<typeof Button>
315
- >(({ className, onClick, ...props }, ref) => {
316
- const { toggleSidebar } = useSidebar()
317
-
318
- return (
319
- <Button
320
- ref={ref}
321
- data-sidebar="trigger"
322
- variant="ghost"
323
- size="icon"
324
- className={cn("h-7 w-7", className)}
325
- onClick={(event) => {
326
- onClick?.(event)
327
- toggleSidebar()
328
- }}
329
- {...props}
330
- >
331
- <PanelLeft />
332
- <span className="sr-only">Toggle Sidebar</span>
333
- </Button>
334
- )
335
- })
336
- SidebarTrigger.displayName = "SidebarTrigger"
337
-
338
- const SidebarRail = React.forwardRef<
339
- HTMLButtonElement,
340
- React.ComponentProps<"button">
341
- >(({ className, ...props }, ref) => {
342
- const { toggleSidebar, setSidebarWidth } = useSidebar()
343
- const dragging = React.useRef(false)
344
- const startX = React.useRef(0)
345
- const startWidth = React.useRef(0)
346
-
347
- const handlePointerDown = React.useCallback((e: React.PointerEvent) => {
348
- // Only initiate resize on left mouse button
349
- if (e.button !== 0) return
350
- e.preventDefault()
351
- dragging.current = true
352
- startX.current = e.clientX
353
-
354
- // Get the current sidebar width from computed CSS variable
355
- const wrapper = (e.target as HTMLElement).closest('[style*="--sidebar-width"]') as HTMLElement | null
356
- startWidth.current = wrapper
357
- ? parseInt(getComputedStyle(wrapper).getPropertyValue('--sidebar-width')) || SIDEBAR_DEFAULT_WIDTH_PX
358
- : SIDEBAR_DEFAULT_WIDTH_PX
359
-
360
- const onPointerMove = (ev: PointerEvent) => {
361
- if (!dragging.current) return
362
- const delta = ev.clientX - startX.current
363
- const newWidth = Math.max(SIDEBAR_MIN_WIDTH, Math.min(SIDEBAR_MAX_WIDTH, startWidth.current + delta))
364
- setSidebarWidth(newWidth)
365
- }
366
-
367
- const onPointerUp = () => {
368
- dragging.current = false
369
- document.removeEventListener('pointermove', onPointerMove)
370
- document.removeEventListener('pointerup', onPointerUp)
371
- }
372
-
373
- document.addEventListener('pointermove', onPointerMove)
374
- document.addEventListener('pointerup', onPointerUp)
375
- }, [setSidebarWidth])
376
-
377
- const handleClick = React.useCallback((e: React.MouseEvent) => {
378
- // Only toggle on click (not at end of drag)
379
- if (Math.abs(e.clientX - startX.current) < SIDEBAR_CLICK_THRESHOLD_PX) {
380
- toggleSidebar()
381
- }
382
- }, [toggleSidebar])
383
-
384
- return (
385
- <button
386
- ref={ref}
387
- data-sidebar="rail"
388
- aria-label="Toggle Sidebar"
389
- tabIndex={-1}
390
- onPointerDown={handlePointerDown}
391
- onClick={handleClick}
392
- onDoubleClick={() => setSidebarWidth(null)}
393
- title="Drag to resize, click to toggle, double-click to reset"
394
- className={cn(
395
- "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
396
- "[[data-side=left]_&]:cursor-col-resize [[data-side=right]_&]:cursor-col-resize",
397
- "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
398
- "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
399
- "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
400
- "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
401
- className
402
- )}
403
- {...props}
404
- />
405
- )
406
- })
407
- SidebarRail.displayName = "SidebarRail"
408
-
409
- const SidebarInset = React.forwardRef<
410
- HTMLDivElement,
411
- React.ComponentProps<"main">
412
- >(({ className, ...props }, ref) => {
413
- return (
414
- <main
415
- ref={ref}
416
- className={cn(
417
- "relative flex min-w-0 w-full flex-1 flex-col bg-background overflow-hidden",
418
- "md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
419
- className
420
- )}
421
- {...props}
422
- />
423
- )
424
- })
425
- SidebarInset.displayName = "SidebarInset"
426
-
427
- const SidebarInput = React.forwardRef<
428
- React.ElementRef<typeof Input>,
429
- React.ComponentProps<typeof Input>
430
- >(({ className, ...props }, ref) => {
431
- return (
432
- <Input
433
- ref={ref}
434
- data-sidebar="input"
435
- className={cn(
436
- "h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
437
- className
438
- )}
439
- {...props}
440
- />
441
- )
442
- })
443
- SidebarInput.displayName = "SidebarInput"
444
-
445
- const SidebarHeader = React.forwardRef<
446
- HTMLDivElement,
447
- React.ComponentProps<"div">
448
- >(({ className, ...props }, ref) => {
449
- return (
450
- <div
451
- ref={ref}
452
- data-sidebar="header"
453
- className={cn("flex flex-col gap-2 p-2", className)}
454
- {...props}
455
- />
456
- )
457
- })
458
- SidebarHeader.displayName = "SidebarHeader"
459
-
460
- const SidebarFooter = React.forwardRef<
461
- HTMLDivElement,
462
- React.ComponentProps<"div">
463
- >(({ className, ...props }, ref) => {
464
- return (
465
- <div
466
- ref={ref}
467
- data-sidebar="footer"
468
- className={cn("flex flex-col gap-2 p-2", className)}
469
- {...props}
470
- />
471
- )
472
- })
473
- SidebarFooter.displayName = "SidebarFooter"
474
-
475
- const SidebarSeparator = React.forwardRef<
476
- HTMLDivElement,
477
- React.ComponentPropsWithoutRef<"div"> & {
478
- orientation?: "horizontal" | "vertical"
479
- decorative?: boolean
480
- }
481
- >(({ className, ...props }, ref) => {
482
- return (
483
- <Separator
484
- ref={ref}
485
- data-sidebar="separator"
486
- className={cn("mx-2 w-auto bg-sidebar-border", className)}
487
- {...props}
488
- />
489
- )
490
- })
491
- SidebarSeparator.displayName = "SidebarSeparator"
492
-
493
- const SidebarContent = React.forwardRef<
494
- HTMLDivElement,
495
- React.ComponentProps<"div">
496
- >(({ className, ...props }, ref) => {
497
- return (
498
- <div
499
- ref={ref}
500
- data-sidebar="content"
501
- className={cn(
502
- "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
503
- className
504
- )}
505
- {...props}
506
- />
507
- )
508
- })
509
- SidebarContent.displayName = "SidebarContent"
510
-
511
- const SidebarGroup = React.forwardRef<
512
- HTMLDivElement,
513
- React.ComponentProps<"div">
514
- >(({ className, ...props }, ref) => {
515
- return (
516
- <div
517
- ref={ref}
518
- data-sidebar="group"
519
- className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
520
- {...props}
521
- />
522
- )
523
- })
524
- SidebarGroup.displayName = "SidebarGroup"
525
-
526
- const SidebarGroupLabel = React.forwardRef<
527
- HTMLDivElement,
528
- React.ComponentProps<"div"> & { asChild?: boolean }
529
- >(({ className, asChild = false, ...props }, ref) => {
530
- const Comp = asChild ? SlotPrimitive.Slot : "div"
531
-
532
- return (
533
- <Comp
534
- ref={ref}
535
- data-sidebar="group-label"
536
- className={cn(
537
- "flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0 border-t border-border/30 pt-3 mt-2 first:border-t-0 first:pt-0 first:mt-0",
538
- "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
539
- className
540
- )}
541
- {...props}
542
- />
543
- )
544
- })
545
- SidebarGroupLabel.displayName = "SidebarGroupLabel"
546
-
547
- const SidebarGroupAction = React.forwardRef<
548
- HTMLButtonElement,
549
- React.ComponentProps<"button"> & { asChild?: boolean }
550
- >(({ className, asChild = false, ...props }, ref) => {
551
- const Comp = asChild ? SlotPrimitive.Slot : "button"
552
-
553
- return (
554
- <Comp
555
- ref={ref}
556
- data-sidebar="group-action"
557
- className={cn(
558
- "absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
559
- // Increases the hit area of the button on mobile.
560
- "after:absolute after:-inset-2 after:md:hidden",
561
- "group-data-[collapsible=icon]:hidden",
562
- className
563
- )}
564
- {...props}
565
- />
566
- )
567
- })
568
- SidebarGroupAction.displayName = "SidebarGroupAction"
569
-
570
- const SidebarGroupContent = React.forwardRef<
571
- HTMLDivElement,
572
- React.ComponentProps<"div">
573
- >(({ className, ...props }, ref) => (
574
- <div
575
- ref={ref}
576
- data-sidebar="group-content"
577
- className={cn("w-full text-sm", className)}
578
- {...props}
579
- />
580
- ))
581
- SidebarGroupContent.displayName = "SidebarGroupContent"
582
-
583
- const SidebarMenu = React.forwardRef<
584
- HTMLUListElement,
585
- React.ComponentProps<"ul">
586
- >(({ className, ...props }, ref) => (
587
- <ul
588
- ref={ref}
589
- data-sidebar="menu"
590
- className={cn("flex w-full min-w-0 flex-col gap-1", className)}
591
- {...props}
592
- />
593
- ))
594
- SidebarMenu.displayName = "SidebarMenu"
595
-
596
- const SidebarMenuItem = React.forwardRef<
597
- HTMLLIElement,
598
- React.ComponentProps<"li">
599
- >(({ className, ...props }, ref) => (
600
- <li
601
- ref={ref}
602
- data-sidebar="menu-item"
603
- className={cn("group/menu-item relative", className)}
604
- {...props}
605
- />
606
- ))
607
- SidebarMenuItem.displayName = "SidebarMenuItem"
608
-
609
- const sidebarMenuButtonVariants = cva(
610
- [
611
- "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding,color,background-color] duration-150",
612
- "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground",
613
- "disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50",
614
- "data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground",
615
- "data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground",
616
- "group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
617
- // Active indicator bar (3px left accent)
618
- "relative data-[active=true]:before:absolute data-[active=true]:before:left-0 data-[active=true]:before:top-1/2 data-[active=true]:before:-translate-y-1/2",
619
- "data-[active=true]:before:h-4 data-[active=true]:before:w-[3px] data-[active=true]:before:rounded-full data-[active=true]:before:bg-primary",
620
- ].join(" "),
621
- {
622
- variants: {
623
- variant: {
624
- default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
625
- outline:
626
- "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
627
- },
628
- size: {
629
- default: "h-8 text-sm",
630
- sm: "h-7 text-xs",
631
- lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
632
- },
633
- },
634
- defaultVariants: {
635
- variant: "default",
636
- size: "default",
637
- },
638
- }
639
- )
640
-
641
- const SidebarMenuButton = React.forwardRef<
642
- HTMLButtonElement,
643
- React.ComponentProps<"button"> & {
644
- asChild?: boolean
645
- isActive?: boolean
646
- tooltip?: string | React.ComponentProps<typeof TooltipContent>
647
- } & VariantProps<typeof sidebarMenuButtonVariants>
648
- >(
649
- (
650
- {
651
- asChild = false,
652
- isActive = false,
653
- variant = "default",
654
- size = "default",
655
- tooltip,
656
- className,
657
- ...props
658
- },
659
- ref
660
- ) => {
661
- const Comp = asChild ? SlotPrimitive.Slot : "button"
662
- const { isMobile, state } = useSidebar()
663
-
664
- const button = (
665
- <Comp
666
- ref={ref}
667
- data-sidebar="menu-button"
668
- data-size={size}
669
- data-active={isActive}
670
- className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
671
- {...props}
672
- />
673
- )
674
-
675
- if (!tooltip) {
676
- return button
677
- }
678
-
679
- if (typeof tooltip === "string") {
680
- tooltip = {
681
- children: tooltip,
682
- }
683
- }
684
-
685
- return (
686
- <Tooltip>
687
- <TooltipTrigger asChild>{button}</TooltipTrigger>
688
- <TooltipContent
689
- side="right"
690
- align="center"
691
- hidden={state !== "collapsed" || isMobile}
692
- {...tooltip}
693
- />
694
- </Tooltip>
695
- )
696
- }
697
- )
698
- SidebarMenuButton.displayName = "SidebarMenuButton"
699
-
700
- const SidebarMenuAction = React.forwardRef<
701
- HTMLButtonElement,
702
- React.ComponentProps<"button"> & {
703
- asChild?: boolean
704
- showOnHover?: boolean
705
- }
706
- >(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
707
- const Comp = asChild ? SlotPrimitive.Slot : "button"
708
-
709
- return (
710
- <Comp
711
- ref={ref}
712
- data-sidebar="menu-action"
713
- className={cn(
714
- "absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
715
- // Increases the hit area of the button on mobile.
716
- "after:absolute after:-inset-2 after:md:hidden",
717
- "peer-data-[size=sm]/menu-button:top-1",
718
- "peer-data-[size=default]/menu-button:top-1.5",
719
- "peer-data-[size=lg]/menu-button:top-2.5",
720
- "group-data-[collapsible=icon]:hidden",
721
- showOnHover &&
722
- "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-sidebar-accent-foreground md:opacity-0",
723
- className
724
- )}
725
- {...props}
726
- />
727
- )
728
- })
729
- SidebarMenuAction.displayName = "SidebarMenuAction"
730
-
731
- const SidebarMenuBadge = React.forwardRef<
732
- HTMLDivElement,
733
- React.ComponentProps<"div">
734
- >(({ className, ...props }, ref) => (
735
- <div
736
- ref={ref}
737
- data-sidebar="menu-badge"
738
- className={cn(
739
- "pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground",
740
- "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
741
- "peer-data-[size=sm]/menu-button:top-1",
742
- "peer-data-[size=default]/menu-button:top-1.5",
743
- "peer-data-[size=lg]/menu-button:top-2.5",
744
- "group-data-[collapsible=icon]:hidden",
745
- className
746
- )}
747
- {...props}
748
- />
749
- ))
750
- SidebarMenuBadge.displayName = "SidebarMenuBadge"
751
-
752
- const SidebarMenuSkeleton = React.forwardRef<
753
- HTMLDivElement,
754
- React.ComponentProps<"div"> & {
755
- showIcon?: boolean
756
- }
757
- >(({ className, showIcon = false, ...props }, ref) => {
758
- // Random width between 50 to 90%.
759
- const [width] = React.useState(() => `${Math.floor(Math.random() * 40) + 50}%`)
760
-
761
- return (
762
- <div
763
- ref={ref}
764
- data-sidebar="menu-skeleton"
765
- className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
766
- {...props}
767
- >
768
- {showIcon && (
769
- <Skeleton
770
- className="size-4 rounded-md"
771
- data-sidebar="menu-skeleton-icon"
772
- />
773
- )}
774
- <Skeleton
775
- className="h-4 max-w-[--skeleton-width] flex-1"
776
- data-sidebar="menu-skeleton-text"
777
- style={
778
- {
779
- "--skeleton-width": width,
780
- } as React.CSSProperties
781
- }
782
- />
783
- </div>
784
- )
785
- })
786
- SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"
787
-
788
- const SidebarMenuSub = React.forwardRef<
789
- HTMLUListElement,
790
- React.ComponentProps<"ul">
791
- >(({ className, ...props }, ref) => (
792
- <ul
793
- ref={ref}
794
- data-sidebar="menu-sub"
795
- className={cn(
796
- "mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
797
- "group-data-[collapsible=icon]:hidden",
798
- className
799
- )}
800
- {...props}
801
- />
802
- ))
803
- SidebarMenuSub.displayName = "SidebarMenuSub"
804
-
805
- const SidebarMenuSubItem = React.forwardRef<
806
- HTMLLIElement,
807
- React.ComponentProps<"li">
808
- >(({ ...props }, ref) => <li ref={ref} {...props} />)
809
- SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
810
-
811
- const SidebarMenuSubButton = React.forwardRef<
812
- HTMLAnchorElement,
813
- React.ComponentProps<"a"> & {
814
- asChild?: boolean
815
- size?: "sm" | "md"
816
- isActive?: boolean
817
- }
818
- >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
819
- const Comp = asChild ? SlotPrimitive.Slot : "a"
820
-
821
- return (
822
- <Comp
823
- ref={ref}
824
- data-sidebar="menu-sub-button"
825
- data-size={size}
826
- data-active={isActive}
827
- className={cn(
828
- "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
829
- "data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
830
- size === "sm" && "text-xs",
831
- size === "md" && "text-sm",
832
- "group-data-[collapsible=icon]:hidden",
833
- className
834
- )}
835
- {...props}
836
- />
837
- )
838
- })
839
- SidebarMenuSubButton.displayName = "SidebarMenuSubButton"
840
-
841
- export {
842
- Sidebar,
843
- SidebarContent,
844
- SidebarFooter,
845
- SidebarGroup,
846
- SidebarGroupAction,
847
- SidebarGroupContent,
848
- SidebarGroupLabel,
849
- SidebarHeader,
850
- SidebarInput,
851
- SidebarInset,
852
- SidebarMenu,
853
- SidebarMenuAction,
854
- SidebarMenuBadge,
855
- SidebarMenuButton,
856
- SidebarMenuItem,
857
- SidebarMenuSkeleton,
858
- SidebarMenuSub,
859
- SidebarMenuSubButton,
860
- SidebarMenuSubItem,
861
- SidebarProvider,
862
- SidebarRail,
863
- SidebarSeparator,
864
- SidebarTrigger,
865
- useSidebar,
866
- }