@goplusvn/core 0.1.0 → 0.1.2

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 (591) hide show
  1. package/package.json +31 -175
  2. package/src/assets/erp_wallpaper.png +0 -0
  3. package/src/assets/goeat_logo.png +0 -0
  4. package/src/audit/audit-manager.ts +139 -0
  5. package/src/audit/index.ts +11 -0
  6. package/src/audit/memory-audit-logger.ts +86 -0
  7. package/src/audit/types.ts +50 -0
  8. package/src/auth/auth-service.ts +97 -0
  9. package/src/auth/index.ts +266 -0
  10. package/src/code-generation/index.ts +69 -0
  11. package/src/configs/auth-routes.ts +17 -0
  12. package/src/configs/crud.ts +136 -0
  13. package/src/configs/data/navigations.ts +781 -0
  14. package/src/configs/data/oauth-links.ts +10 -0
  15. package/src/configs/entities/material-categories.config.ts +125 -0
  16. package/src/configs/i18n.ts +12 -0
  17. package/src/configs/index.ts +26 -0
  18. package/src/configs/status.ts +25 -0
  19. package/src/configs/themes.ts +100 -0
  20. package/src/crud/components/crud-bulk-actions.tsx +91 -0
  21. package/src/crud/components/crud-card-view.tsx +241 -0
  22. package/src/crud/components/crud-context.tsx +122 -0
  23. package/src/crud/components/crud-delete-dialog.tsx +145 -0
  24. package/src/crud/components/crud-dialog.tsx +406 -0
  25. package/src/crud/components/crud-empty-state.tsx +104 -0
  26. package/src/crud/components/crud-export-button.tsx +170 -0
  27. package/src/crud/components/crud-field-renderer.tsx +653 -0
  28. package/src/crud/components/crud-filter-chips.tsx +102 -0
  29. package/src/crud/components/crud-filters/checkbox-filter.tsx +97 -0
  30. package/src/crud/components/crud-filters/datetime-filter.tsx +83 -0
  31. package/src/crud/components/crud-filters/filter-builder.tsx +66 -0
  32. package/src/crud/components/crud-filters/index.tsx +76 -0
  33. package/src/crud/components/crud-filters/radio-filter.tsx +86 -0
  34. package/src/crud/components/crud-filters/select-filter.tsx +141 -0
  35. package/src/crud/components/crud-filters/text-filter.tsx +86 -0
  36. package/src/crud/components/crud-form.tsx +642 -0
  37. package/src/crud/components/crud-import-dialog.tsx +440 -0
  38. package/src/crud/components/crud-infinite-scroll.tsx +116 -0
  39. package/src/crud/components/crud-page.tsx +1017 -0
  40. package/src/crud/components/crud-provider.tsx +277 -0
  41. package/src/crud/components/crud-row-actions.tsx +189 -0
  42. package/src/crud/components/crud-search.tsx +82 -0
  43. package/src/crud/components/crud-sheet.tsx +336 -0
  44. package/src/crud/components/crud-table-skeleton.tsx +26 -0
  45. package/src/crud/components/crud-table-toolbar.tsx +91 -0
  46. package/src/crud/components/crud-table.tsx +352 -0
  47. package/src/crud/components/crud-virtual-table.tsx +55 -0
  48. package/src/crud/components/index.tsx +20 -0
  49. package/src/crud/crud-filters/checkbox-filter.tsx +87 -0
  50. package/src/crud/crud-filters/datetime-filter.tsx +82 -0
  51. package/src/crud/crud-filters/filter-builder.tsx +64 -0
  52. package/src/crud/crud-filters/index.tsx +78 -0
  53. package/src/crud/crud-filters/radio-filter.tsx +79 -0
  54. package/src/crud/crud-filters/select-filter.tsx +148 -0
  55. package/src/crud/crud-filters/text-filter.tsx +81 -0
  56. package/src/crud/index.ts +43 -0
  57. package/src/crud/lib/crud-service.test.ts +334 -0
  58. package/src/crud/lib/crud-service.ts +358 -0
  59. package/src/crud/lib/crud-utils.test.ts +354 -0
  60. package/src/crud/lib/crud-utils.ts +299 -0
  61. package/src/crud/lib/crud-validator.ts +247 -0
  62. package/src/crud/lib/data-loader.ts +234 -0
  63. package/src/crud/lib/field-calculator.ts +241 -0
  64. package/src/crud/lib/field-formatter.ts +240 -0
  65. package/src/crud/lib/import-export-service.test.ts +290 -0
  66. package/src/crud/lib/import-export-service.ts +352 -0
  67. package/src/crud/lib/import-server-utils.ts +109 -0
  68. package/src/crud/lib/lazy-loader.ts +241 -0
  69. package/src/crud/lib/parse-filters.ts +85 -0
  70. package/src/crud/lib/permissions.ts +52 -0
  71. package/src/crud/lib/serialize-config.ts +60 -0
  72. package/src/crud/lib/stream-loader.ts +145 -0
  73. package/src/crud/lib/translate-config.ts +335 -0
  74. package/src/crud/lib/types.ts +11 -0
  75. package/src/crud/pages/entity-crud-page.tsx +144 -0
  76. package/src/crud/server.ts +8 -0
  77. package/src/home/constants.tsx +142 -0
  78. package/src/home/feature-showcase.tsx +171 -0
  79. package/src/home/home-page.tsx +191 -0
  80. package/src/home/hooks/index.ts +1 -0
  81. package/src/home/hooks/useWidgetPreferences.ts +167 -0
  82. package/src/home/index.ts +33 -0
  83. package/src/home/quick-access-dialog.tsx +271 -0
  84. package/src/home/quick-access-menu.tsx +267 -0
  85. package/src/home/types.ts +140 -0
  86. package/src/home/welcome-card.tsx +92 -0
  87. package/src/home/widget-container.tsx +258 -0
  88. package/src/home/widgets/base-widget.tsx +200 -0
  89. package/src/home/widgets/customers-widget.tsx +74 -0
  90. package/src/home/widgets/index.ts +6 -0
  91. package/src/home/widgets/orders-widget.tsx +87 -0
  92. package/src/home/widgets/revenue-widget.tsx +71 -0
  93. package/src/home/widgets/stock-widget.tsx +109 -0
  94. package/src/hooks/index.tsx +598 -0
  95. package/src/hooks/use-tenant.test.tsx +30 -0
  96. package/src/hooks/use-tenant.ts +5 -0
  97. package/src/index.ts +17 -0
  98. package/src/infrastructure/__tests__/architecture-verification.spec.ts +103 -0
  99. package/src/infrastructure/api-service.ts +317 -0
  100. package/src/infrastructure/cache/cache-manager.ts +107 -0
  101. package/src/infrastructure/cache/cache.ts +120 -0
  102. package/src/infrastructure/cache/index.ts +8 -0
  103. package/src/infrastructure/cache/types.ts +48 -0
  104. package/src/infrastructure/cron/cron-manager.ts +239 -0
  105. package/src/infrastructure/cron/index.ts +6 -0
  106. package/src/infrastructure/cron/types.ts +41 -0
  107. package/src/infrastructure/event-bus/event-bus.ts +145 -0
  108. package/src/infrastructure/event-bus/index.ts +2 -0
  109. package/src/infrastructure/event-bus/types.ts +22 -0
  110. package/src/infrastructure/index.ts +32 -0
  111. package/src/infrastructure/lock/decorators.ts +67 -0
  112. package/src/infrastructure/lock/index.ts +2 -0
  113. package/src/infrastructure/lock/lock-manager.ts +33 -0
  114. package/src/infrastructure/logger/index.ts +2 -0
  115. package/src/infrastructure/logger/logger.ts +96 -0
  116. package/src/infrastructure/logger/types.ts +25 -0
  117. package/src/layout/index.tsx +185 -0
  118. package/src/navigation/index.ts +91 -0
  119. package/src/notification/index.ts +14 -0
  120. package/src/notification/notification-service.ts +120 -0
  121. package/src/notification/storage/in-memory.ts +56 -0
  122. package/src/notification/storage/index.ts +1 -0
  123. package/src/notification/types.ts +51 -0
  124. package/src/organization/branch-service.ts +299 -0
  125. package/src/organization/branches.config.ts +154 -0
  126. package/src/organization/index.ts +5 -0
  127. package/src/plugin/apps-registry.ts +97 -0
  128. package/src/plugin/index.ts +5 -0
  129. package/src/plugin/types.ts +41 -0
  130. package/src/providers/index.tsx +109 -0
  131. package/src/providers/tenant-provider.tsx +45 -0
  132. package/src/rbac/components/roles/role-card.tsx +158 -0
  133. package/src/rbac/components/roles/role-stats-cards.tsx +29 -0
  134. package/src/rbac/components/roles/role-toolbar.tsx +123 -0
  135. package/src/rbac/hooks/use-role-operations.ts +159 -0
  136. package/src/rbac/hooks/use-roles-data.ts +59 -0
  137. package/src/rbac/index.ts +297 -0
  138. package/src/rbac/lib/permission-helpers.ts +63 -0
  139. package/src/rbac/pages/action-list-page.tsx +25 -0
  140. package/src/rbac/pages/resource-list-page.tsx +25 -0
  141. package/src/rbac/pages/role-list-page.tsx +378 -0
  142. package/src/rbac/permission-service.ts +140 -0
  143. package/src/rbac/permissions.ts +135 -0
  144. package/src/rbac/resource-service.ts +115 -0
  145. package/src/rbac/resource-validator.ts +119 -0
  146. package/src/rbac/role-service.ts +165 -0
  147. package/src/rbac/server.ts +16 -0
  148. package/src/rbac/types.ts +38 -0
  149. package/src/schemas/action.schema.ts +66 -0
  150. package/src/schemas/branch.schema.ts +52 -0
  151. package/src/schemas/coming-soon-schema.ts +9 -0
  152. package/src/schemas/company.schema.ts +44 -0
  153. package/src/schemas/forgot-passward-schema.ts +9 -0
  154. package/src/schemas/index.ts +30 -0
  155. package/src/schemas/material-category.schema.ts +43 -0
  156. package/src/schemas/material-pricing.schema.ts +74 -0
  157. package/src/schemas/material.schema.ts +76 -0
  158. package/src/schemas/materials.ts +52 -0
  159. package/src/schemas/new-passward-schema.ts +15 -0
  160. package/src/schemas/partner-company.schema.ts +149 -0
  161. package/src/schemas/register-schema.ts +36 -0
  162. package/src/schemas/resource.schema.ts +133 -0
  163. package/src/schemas/role.schema.ts +11 -0
  164. package/src/schemas/sign-in-schema.ts +24 -0
  165. package/src/schemas/supplier-pricing.schema.ts +15 -0
  166. package/src/schemas/supplier.schema.ts +120 -0
  167. package/src/schemas/system-category-group.schema.ts +67 -0
  168. package/src/schemas/system-category.schema.ts +77 -0
  169. package/src/schemas/system-config.schema.ts +118 -0
  170. package/src/schemas/uom.schema.ts +75 -0
  171. package/src/schemas/user-supplier.schema.ts +179 -0
  172. package/src/schemas/user.schema.ts +18 -0
  173. package/src/schemas/verify-email-schema.ts +9 -0
  174. package/src/schemas/warehouse.schema.ts +49 -0
  175. package/src/system/components/categories/category-list.tsx +529 -0
  176. package/src/system/components/categories/category-manager.tsx +89 -0
  177. package/src/system/components/categories/group-sidebar.tsx +308 -0
  178. package/src/system/components/settings/setting-dialogs.tsx +197 -0
  179. package/src/system/components/settings/setting-field.tsx +291 -0
  180. package/src/system/components/settings/setting-form-dialog.tsx +308 -0
  181. package/src/system/components/settings/settings-groups.ts +80 -0
  182. package/src/system/components/settings/settings-search.tsx +71 -0
  183. package/src/system/components/settings/settings-section.tsx +74 -0
  184. package/src/system/components/settings/settings-sidebar.tsx +81 -0
  185. package/src/system/constants.ts +3 -0
  186. package/src/system/index.ts +150 -0
  187. package/src/system/job-manager.ts +176 -0
  188. package/src/system/pages/components/categories/category-list.tsx +537 -0
  189. package/src/system/pages/components/categories/category-manager.tsx +90 -0
  190. package/src/system/pages/components/categories/group-sidebar.tsx +311 -0
  191. package/src/system/pages/components/settings/sales-rules-settings.tsx +222 -0
  192. package/src/system/pages/components/settings/setting-dialogs.tsx +197 -0
  193. package/src/system/pages/components/settings/setting-field.tsx +292 -0
  194. package/src/system/pages/components/settings/setting-form-dialog.tsx +308 -0
  195. package/src/system/pages/components/settings/settings-groups.ts +87 -0
  196. package/src/system/pages/components/settings/settings-page.tsx +372 -0
  197. package/src/system/pages/components/settings/settings-search.tsx +71 -0
  198. package/src/system/pages/components/settings/settings-section.tsx +74 -0
  199. package/src/system/pages/components/settings/settings-sidebar.tsx +81 -0
  200. package/src/system/pages/components/settings/system-settings.tsx +244 -0
  201. package/src/system/pages/system-category-page.tsx +15 -0
  202. package/src/system/pages/system-settings-page.tsx +380 -0
  203. package/src/system/schemas/system-category-group.schema.ts +46 -0
  204. package/src/system/schemas/system-category.schema.ts +56 -0
  205. package/src/system/services/settings-service.ts +127 -0
  206. package/src/system/services/system-category-service.ts +63 -0
  207. package/src/system/types.ts +45 -0
  208. package/src/types/index.ts +703 -0
  209. package/src/ui/auth/auth-layout.tsx +135 -0
  210. package/src/ui/auth/forgot-password-form.tsx +98 -0
  211. package/src/ui/auth/index.tsx +7 -0
  212. package/src/ui/auth/new-password-form.tsx +107 -0
  213. package/src/ui/auth/oauth-links.tsx +30 -0
  214. package/src/ui/auth/register-form.tsx +202 -0
  215. package/src/ui/auth/sign-in-form.tsx +238 -0
  216. package/src/ui/auth/verify-email-form.tsx +104 -0
  217. package/src/ui/crud/index.tsx +10 -0
  218. package/src/ui/data-display/accordion.tsx +65 -0
  219. package/src/ui/data-display/aspect-ratio.tsx +11 -0
  220. package/src/ui/data-display/avatar.tsx +163 -0
  221. package/src/ui/data-display/bento-grid.tsx +77 -0
  222. package/src/ui/data-display/carousel.tsx +249 -0
  223. package/src/ui/data-display/chart.tsx +363 -0
  224. package/src/ui/data-display/code-block-highlight.tsx +54 -0
  225. package/src/ui/data-display/collapsible.tsx +42 -0
  226. package/src/ui/data-display/compact-stat-bar.tsx +149 -0
  227. package/src/ui/data-display/data-table/data-table-context.tsx +255 -0
  228. package/src/ui/data-display/data-table/data-table-empty-state.tsx +133 -0
  229. package/src/ui/data-display/data-table/data-table-skeleton.tsx +145 -0
  230. package/src/ui/data-display/data-table/data-table-toolbar.tsx +353 -0
  231. package/src/ui/data-display/data-table/data-table.tsx +597 -0
  232. package/src/ui/data-display/data-table/index.ts +44 -0
  233. package/src/ui/data-display/data-table-column-header.tsx +75 -0
  234. package/src/ui/data-display/data-table-pagination.tsx +130 -0
  235. package/src/ui/data-display/data-table-view-options.tsx +59 -0
  236. package/src/ui/data-display/formatted-number-input.tsx +210 -0
  237. package/src/ui/data-display/highlight.tsx +20 -0
  238. package/src/ui/data-display/hover-card.tsx +48 -0
  239. package/src/ui/data-display/index.tsx +50 -0
  240. package/src/ui/data-display/iphone-15-pro.tsx +114 -0
  241. package/src/ui/data-display/kanban/index.ts +4 -0
  242. package/src/ui/data-display/kanban/kanban-board.tsx +192 -0
  243. package/src/ui/data-display/kanban/kanban-column.tsx +74 -0
  244. package/src/ui/data-display/kanban/kanban-item.tsx +50 -0
  245. package/src/ui/data-display/kanban/kanban-types.ts +21 -0
  246. package/src/ui/data-display/kpi-card.tsx +68 -0
  247. package/src/ui/data-display/media-grid.tsx +110 -0
  248. package/src/ui/data-display/safari.tsx +175 -0
  249. package/src/ui/data-display/show-more-text.tsx +55 -0
  250. package/src/ui/data-display/tabs.tsx +68 -0
  251. package/src/ui/data-display/timeline.tsx +256 -0
  252. package/src/ui/feedback/alert.tsx +60 -0
  253. package/src/ui/feedback/context-menu.tsx +245 -0
  254. package/src/ui/feedback/drawer.tsx +132 -0
  255. package/src/ui/feedback/error-dialog.tsx +273 -0
  256. package/src/ui/feedback/index.tsx +183 -0
  257. package/src/ui/feedback/progress.tsx +32 -0
  258. package/src/ui/feedback/sheet.tsx +148 -0
  259. package/src/ui/feedback/sonner.tsx +36 -0
  260. package/src/ui/forms/command.tsx +157 -0
  261. package/src/ui/forms/date-picker.tsx +73 -0
  262. package/src/ui/forms/date-range-picker.tsx +76 -0
  263. package/src/ui/forms/date-time-picker.tsx +109 -0
  264. package/src/ui/forms/editor/editor-menu-bar.tsx +394 -0
  265. package/src/ui/forms/editor/index.tsx +130 -0
  266. package/src/ui/forms/editor/multi-select-example.tsx +1234 -0
  267. package/src/ui/forms/emoji-picker.tsx +109 -0
  268. package/src/ui/forms/file-dropzone.tsx +169 -0
  269. package/src/ui/forms/file-thumbnail.tsx +29 -0
  270. package/src/ui/forms/index.tsx +201 -0
  271. package/src/ui/forms/input-file.tsx +99 -0
  272. package/src/ui/forms/input-group.tsx +46 -0
  273. package/src/ui/forms/input-otp.tsx +81 -0
  274. package/src/ui/forms/input-phone.tsx +172 -0
  275. package/src/ui/forms/input-spin.tsx +116 -0
  276. package/src/ui/forms/input-tags.tsx +219 -0
  277. package/src/ui/forms/input-time.tsx +42 -0
  278. package/src/ui/forms/multi-select.tsx +629 -0
  279. package/src/ui/forms/multiple-date-picker.tsx +74 -0
  280. package/src/ui/forms/radio-group.tsx +42 -0
  281. package/src/ui/forms/rating.tsx +158 -0
  282. package/src/ui/forms/time-picker.tsx +57 -0
  283. package/src/ui/index.tsx +17 -0
  284. package/src/ui/layout/animated-list.tsx +77 -0
  285. package/src/ui/layout/animated-sidebar.tsx +294 -0
  286. package/src/ui/layout/command-menu.tsx +355 -0
  287. package/src/ui/layout/customizer.tsx +324 -0
  288. package/src/ui/layout/footer.tsx +43 -0
  289. package/src/ui/layout/full-screen-toggle.tsx +52 -0
  290. package/src/ui/layout/header-breadcrumb.tsx +77 -0
  291. package/src/ui/layout/horizontal-layout-header.tsx +83 -0
  292. package/src/ui/layout/horizontal-layout.tsx +50 -0
  293. package/src/ui/layout/index.tsx +25 -0
  294. package/src/ui/layout/language-dropdown.tsx +103 -0
  295. package/src/ui/layout/logo.tsx +63 -0
  296. package/src/ui/layout/main-layout.tsx +57 -0
  297. package/src/ui/layout/mode-dropdown.tsx +58 -0
  298. package/src/ui/layout/notification-dropdown.tsx +127 -0
  299. package/src/ui/layout/page-tabs.tsx +306 -0
  300. package/src/ui/layout/route-cache.tsx +214 -0
  301. package/src/ui/layout/sidebar-group-icon-menu.tsx +195 -0
  302. package/src/ui/layout/sidebar.tsx +279 -0
  303. package/src/ui/layout/tab-content-cache.tsx +201 -0
  304. package/src/ui/layout/tab-navigation-provider.tsx +536 -0
  305. package/src/ui/layout/toggle-mobile-sidebar.tsx +33 -0
  306. package/src/ui/layout/top-bar-header-menubar.tsx +412 -0
  307. package/src/ui/layout/user-dropdown.tsx +188 -0
  308. package/src/ui/layout/vertical-layout-header.tsx +65 -0
  309. package/src/ui/layout/vertical-layout.tsx +47 -0
  310. package/src/ui/management/audit-log-page.tsx +209 -0
  311. package/src/ui/management/cache-management.tsx +349 -0
  312. package/src/ui/management/index.ts +3 -0
  313. package/src/ui/management/job-management.tsx +308 -0
  314. package/src/ui/pages/not-found.tsx +30 -0
  315. package/src/ui/primitives/badge.tsx +66 -0
  316. package/src/ui/primitives/breadcrumb.tsx +103 -0
  317. package/src/ui/primitives/button.tsx +129 -0
  318. package/src/ui/primitives/calendar.tsx +74 -0
  319. package/src/ui/primitives/card.tsx +86 -0
  320. package/src/ui/primitives/checkbox.tsx +31 -0
  321. package/src/ui/primitives/client.ts +30 -0
  322. package/src/ui/primitives/combobox.tsx +290 -0
  323. package/src/ui/primitives/dialog.tsx +121 -0
  324. package/src/ui/primitives/dropdown-menu.tsx +239 -0
  325. package/src/ui/primitives/dynamic-icon.tsx +24 -0
  326. package/src/ui/primitives/index.tsx +134 -0
  327. package/src/ui/primitives/input-number.tsx +131 -0
  328. package/src/ui/primitives/input.tsx +22 -0
  329. package/src/ui/primitives/keyboard.tsx +23 -0
  330. package/src/ui/primitives/label.tsx +24 -0
  331. package/src/ui/primitives/menubar.tsx +262 -0
  332. package/src/ui/primitives/navigation-menu.tsx +157 -0
  333. package/src/ui/primitives/pagination.tsx +118 -0
  334. package/src/ui/primitives/popover.tsx +56 -0
  335. package/src/ui/primitives/prefetch-link.tsx +60 -0
  336. package/src/ui/primitives/resizable.tsx +59 -0
  337. package/src/ui/primitives/scroll-area.tsx +63 -0
  338. package/src/ui/primitives/select.tsx +172 -0
  339. package/src/ui/primitives/separator.tsx +51 -0
  340. package/src/ui/primitives/sidebar.tsx +844 -0
  341. package/src/ui/primitives/slider.tsx +27 -0
  342. package/src/ui/primitives/status-badge.tsx +47 -0
  343. package/src/ui/primitives/sticky-layout.tsx +50 -0
  344. package/src/ui/primitives/switch.tsx +29 -0
  345. package/src/ui/primitives/table.tsx +116 -0
  346. package/src/ui/primitives/tabs.tsx +55 -0
  347. package/src/ui/primitives/toggle-group.tsx +70 -0
  348. package/src/ui/primitives/toggle.tsx +47 -0
  349. package/src/ui/primitives/tooltip.tsx +59 -0
  350. package/src/user/components/dangerous-zone.tsx +34 -0
  351. package/src/user/components/delete-account-form.tsx +40 -0
  352. package/src/user/components/index.ts +4 -0
  353. package/src/user/components/profile-info-form.tsx +390 -0
  354. package/src/user/components/profile-info.tsx +32 -0
  355. package/src/user/components/unified-profile-dialog.tsx +1019 -0
  356. package/src/user/components/user-stats.tsx +27 -0
  357. package/src/user/components/user-toolbar.tsx +137 -0
  358. package/src/user/components/users-card-view.tsx +253 -0
  359. package/src/user/index.ts +11 -0
  360. package/src/user/pages/user-list-page.tsx +234 -0
  361. package/src/user/pages/users-client-page.tsx +385 -0
  362. package/src/user/profile-page.tsx +19 -0
  363. package/src/user/schemas.ts +68 -0
  364. package/src/user/types.ts +34 -0
  365. package/src/user/user-service.ts +538 -0
  366. package/src/utils/index.ts +906 -0
  367. package/src/workflow/activity-timeline.tsx +412 -0
  368. package/src/workflow/approval-workflow.tsx +31 -0
  369. package/src/workflow/index.ts +2 -0
  370. package/dist/audit/index.d.mts +0 -115
  371. package/dist/audit/index.d.ts +0 -115
  372. package/dist/audit/index.js +0 -204
  373. package/dist/audit/index.js.map +0 -1
  374. package/dist/audit/index.mjs +0 -200
  375. package/dist/audit/index.mjs.map +0 -1
  376. package/dist/auth/index.d.mts +0 -86
  377. package/dist/auth/index.d.ts +0 -86
  378. package/dist/auth/index.js +0 -210
  379. package/dist/auth/index.js.map +0 -1
  380. package/dist/auth/index.mjs +0 -198
  381. package/dist/auth/index.mjs.map +0 -1
  382. package/dist/button-1dWvP9Ib.d.mts +0 -30
  383. package/dist/button-1dWvP9Ib.d.ts +0 -30
  384. package/dist/calendar-2QzdEo1z.d.mts +0 -20
  385. package/dist/calendar-2QzdEo1z.d.ts +0 -20
  386. package/dist/code-generation/index.d.mts +0 -30
  387. package/dist/code-generation/index.d.ts +0 -30
  388. package/dist/code-generation/index.js +0 -31
  389. package/dist/code-generation/index.js.map +0 -1
  390. package/dist/code-generation/index.mjs +0 -28
  391. package/dist/code-generation/index.mjs.map +0 -1
  392. package/dist/configs/index.d.mts +0 -175
  393. package/dist/configs/index.d.ts +0 -175
  394. package/dist/configs/index.js +0 -254
  395. package/dist/configs/index.js.map +0 -1
  396. package/dist/configs/index.mjs +0 -233
  397. package/dist/configs/index.mjs.map +0 -1
  398. package/dist/crud/index.d.mts +0 -646
  399. package/dist/crud/index.d.ts +0 -646
  400. package/dist/crud/index.js +0 -11772
  401. package/dist/crud/index.js.map +0 -1
  402. package/dist/crud/index.mjs +0 -11665
  403. package/dist/crud/index.mjs.map +0 -1
  404. package/dist/crud/server.d.mts +0 -20
  405. package/dist/crud/server.d.ts +0 -20
  406. package/dist/crud/server.js +0 -123
  407. package/dist/crud/server.js.map +0 -1
  408. package/dist/crud/server.mjs +0 -120
  409. package/dist/crud/server.mjs.map +0 -1
  410. package/dist/data-table-skeleton-12NA8Mjx.d.mts +0 -39
  411. package/dist/data-table-skeleton-12NA8Mjx.d.ts +0 -39
  412. package/dist/dialog-bKfjZMTd.d.mts +0 -22
  413. package/dist/dialog-bKfjZMTd.d.ts +0 -22
  414. package/dist/dynamic-icon-DrGIiu2N.d.mts +0 -10
  415. package/dist/dynamic-icon-DrGIiu2N.d.ts +0 -10
  416. package/dist/home/index.d.mts +0 -269
  417. package/dist/home/index.d.ts +0 -269
  418. package/dist/home/index.js +0 -1678
  419. package/dist/home/index.js.map +0 -1
  420. package/dist/home/index.mjs +0 -1635
  421. package/dist/home/index.mjs.map +0 -1
  422. package/dist/hooks/index.d.mts +0 -7
  423. package/dist/hooks/index.d.ts +0 -7
  424. package/dist/hooks/index.js +0 -8316
  425. package/dist/hooks/index.js.map +0 -1
  426. package/dist/hooks/index.mjs +0 -8255
  427. package/dist/hooks/index.mjs.map +0 -1
  428. package/dist/index-50hpiPrV.d.ts +0 -116
  429. package/dist/index-B9zQVEVi.d.mts +0 -116
  430. package/dist/index.d.mts +0 -5
  431. package/dist/index.d.ts +0 -5
  432. package/dist/index.js +0 -123
  433. package/dist/index.js.map +0 -1
  434. package/dist/index.mjs +0 -118
  435. package/dist/index.mjs.map +0 -1
  436. package/dist/infrastructure/index.d.mts +0 -423
  437. package/dist/infrastructure/index.d.ts +0 -423
  438. package/dist/infrastructure/index.js +0 -633
  439. package/dist/infrastructure/index.js.map +0 -1
  440. package/dist/infrastructure/index.mjs +0 -619
  441. package/dist/infrastructure/index.mjs.map +0 -1
  442. package/dist/label-DWTEkNPo.d.ts +0 -226
  443. package/dist/label-LPpdcoBx.d.mts +0 -226
  444. package/dist/layout/index.d.mts +0 -48
  445. package/dist/layout/index.d.ts +0 -48
  446. package/dist/layout/index.js +0 -117
  447. package/dist/layout/index.js.map +0 -1
  448. package/dist/layout/index.mjs +0 -90
  449. package/dist/layout/index.mjs.map +0 -1
  450. package/dist/navigation/index.d.mts +0 -16
  451. package/dist/navigation/index.d.ts +0 -16
  452. package/dist/navigation/index.js +0 -53
  453. package/dist/navigation/index.js.map +0 -1
  454. package/dist/navigation/index.mjs +0 -50
  455. package/dist/navigation/index.mjs.map +0 -1
  456. package/dist/notification/index.d.mts +0 -105
  457. package/dist/notification/index.d.ts +0 -105
  458. package/dist/notification/index.js +0 -278
  459. package/dist/notification/index.js.map +0 -1
  460. package/dist/notification/index.mjs +0 -274
  461. package/dist/notification/index.mjs.map +0 -1
  462. package/dist/organization/index.d.mts +0 -99
  463. package/dist/organization/index.d.ts +0 -99
  464. package/dist/organization/index.js +0 -360
  465. package/dist/organization/index.js.map +0 -1
  466. package/dist/organization/index.mjs +0 -352
  467. package/dist/organization/index.mjs.map +0 -1
  468. package/dist/plugin/index.d.mts +0 -83
  469. package/dist/plugin/index.d.ts +0 -83
  470. package/dist/plugin/index.js +0 -86
  471. package/dist/plugin/index.js.map +0 -1
  472. package/dist/plugin/index.mjs +0 -84
  473. package/dist/plugin/index.mjs.map +0 -1
  474. package/dist/providers/index.d.mts +0 -25
  475. package/dist/providers/index.d.ts +0 -25
  476. package/dist/providers/index.js +0 -84
  477. package/dist/providers/index.js.map +0 -1
  478. package/dist/providers/index.mjs +0 -77
  479. package/dist/providers/index.mjs.map +0 -1
  480. package/dist/rbac/index.d.mts +0 -226
  481. package/dist/rbac/index.d.ts +0 -226
  482. package/dist/rbac/index.js +0 -4784
  483. package/dist/rbac/index.js.map +0 -1
  484. package/dist/rbac/index.mjs +0 -4722
  485. package/dist/rbac/index.mjs.map +0 -1
  486. package/dist/rbac/permissions.d.mts +0 -26
  487. package/dist/rbac/permissions.d.ts +0 -26
  488. package/dist/rbac/permissions.js +0 -94
  489. package/dist/rbac/permissions.js.map +0 -1
  490. package/dist/rbac/permissions.mjs +0 -90
  491. package/dist/rbac/permissions.mjs.map +0 -1
  492. package/dist/rbac/server.d.mts +0 -1
  493. package/dist/rbac/server.d.ts +0 -1
  494. package/dist/rbac/server.js +0 -128
  495. package/dist/rbac/server.js.map +0 -1
  496. package/dist/rbac/server.mjs +0 -124
  497. package/dist/rbac/server.mjs.map +0 -1
  498. package/dist/schemas/index.d.mts +0 -1257
  499. package/dist/schemas/index.d.ts +0 -1257
  500. package/dist/schemas/index.js +0 -572
  501. package/dist/schemas/index.js.map +0 -1
  502. package/dist/schemas/index.mjs +0 -523
  503. package/dist/schemas/index.mjs.map +0 -1
  504. package/dist/server-QuYCTa89.d.mts +0 -83
  505. package/dist/server-QuYCTa89.d.ts +0 -83
  506. package/dist/sonner-C74GlRDQ.d.mts +0 -71
  507. package/dist/sonner-C74GlRDQ.d.ts +0 -71
  508. package/dist/status-BOXZgIqX.d.mts +0 -12
  509. package/dist/status-BOXZgIqX.d.ts +0 -12
  510. package/dist/system/index.d.mts +0 -77
  511. package/dist/system/index.d.ts +0 -77
  512. package/dist/system/index.js +0 -102
  513. package/dist/system/index.js.map +0 -1
  514. package/dist/system/index.mjs +0 -100
  515. package/dist/system/index.mjs.map +0 -1
  516. package/dist/tabs-C6FfBwPY.d.mts +0 -18
  517. package/dist/tabs-C6FfBwPY.d.ts +0 -18
  518. package/dist/tenant-provider-B8eC_Wpb.d.mts +0 -27
  519. package/dist/tenant-provider-B8eC_Wpb.d.ts +0 -27
  520. package/dist/types/index.d.mts +0 -469
  521. package/dist/types/index.d.ts +0 -469
  522. package/dist/types/index.js +0 -25
  523. package/dist/types/index.js.map +0 -1
  524. package/dist/types/index.mjs +0 -21
  525. package/dist/types/index.mjs.map +0 -1
  526. package/dist/ui/auth.d.mts +0 -39
  527. package/dist/ui/auth.d.ts +0 -39
  528. package/dist/ui/auth.js +0 -4941
  529. package/dist/ui/auth.js.map +0 -1
  530. package/dist/ui/auth.mjs +0 -4896
  531. package/dist/ui/auth.mjs.map +0 -1
  532. package/dist/ui/crud.d.mts +0 -2
  533. package/dist/ui/crud.d.ts +0 -2
  534. package/dist/ui/crud.js +0 -4
  535. package/dist/ui/crud.js.map +0 -1
  536. package/dist/ui/crud.mjs +0 -3
  537. package/dist/ui/crud.mjs.map +0 -1
  538. package/dist/ui/data-display.d.mts +0 -596
  539. package/dist/ui/data-display.d.ts +0 -596
  540. package/dist/ui/data-display.js +0 -5307
  541. package/dist/ui/data-display.js.map +0 -1
  542. package/dist/ui/data-display.mjs +0 -5212
  543. package/dist/ui/data-display.mjs.map +0 -1
  544. package/dist/ui/feedback.d.mts +0 -55
  545. package/dist/ui/feedback.d.ts +0 -55
  546. package/dist/ui/feedback.js +0 -2608
  547. package/dist/ui/feedback.js.map +0 -1
  548. package/dist/ui/feedback.mjs +0 -2526
  549. package/dist/ui/feedback.mjs.map +0 -1
  550. package/dist/ui/forms.d.mts +0 -309
  551. package/dist/ui/forms.d.ts +0 -309
  552. package/dist/ui/forms.js +0 -4656
  553. package/dist/ui/forms.js.map +0 -1
  554. package/dist/ui/forms.mjs +0 -4571
  555. package/dist/ui/forms.mjs.map +0 -1
  556. package/dist/ui/index.d.mts +0 -331
  557. package/dist/ui/index.d.ts +0 -331
  558. package/dist/ui/index.js +0 -16953
  559. package/dist/ui/index.js.map +0 -1
  560. package/dist/ui/index.mjs +0 -16598
  561. package/dist/ui/index.mjs.map +0 -1
  562. package/dist/ui/primitives/client.d.mts +0 -61
  563. package/dist/ui/primitives/client.d.ts +0 -61
  564. package/dist/ui/primitives/client.js +0 -3408
  565. package/dist/ui/primitives/client.js.map +0 -1
  566. package/dist/ui/primitives/client.mjs +0 -3256
  567. package/dist/ui/primitives/client.mjs.map +0 -1
  568. package/dist/ui/primitives.d.mts +0 -113
  569. package/dist/ui/primitives.d.ts +0 -113
  570. package/dist/ui/primitives.js +0 -3356
  571. package/dist/ui/primitives.js.map +0 -1
  572. package/dist/ui/primitives.mjs +0 -3227
  573. package/dist/ui/primitives.mjs.map +0 -1
  574. package/dist/user/index.d.mts +0 -228
  575. package/dist/user/index.d.ts +0 -228
  576. package/dist/user/index.js +0 -4306
  577. package/dist/user/index.js.map +0 -1
  578. package/dist/user/index.mjs +0 -4260
  579. package/dist/user/index.mjs.map +0 -1
  580. package/dist/utils/index.d.mts +0 -205
  581. package/dist/utils/index.d.ts +0 -205
  582. package/dist/utils/index.js +0 -574
  583. package/dist/utils/index.js.map +0 -1
  584. package/dist/utils/index.mjs +0 -514
  585. package/dist/utils/index.mjs.map +0 -1
  586. package/dist/workflow/index.d.mts +0 -40
  587. package/dist/workflow/index.d.ts +0 -40
  588. package/dist/workflow/index.js +0 -3710
  589. package/dist/workflow/index.js.map +0 -1
  590. package/dist/workflow/index.mjs +0 -3677
  591. package/dist/workflow/index.mjs.map +0 -1
@@ -0,0 +1,844 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Slot } from "@radix-ui/react-slot";
5
+ import type { VariantProps } from "class-variance-authority";
6
+ import { cva } from "class-variance-authority";
7
+ import { PanelLeft } from "lucide-react";
8
+
9
+ import { useMobile } from "../../hooks"; // Exported from core/hooks
10
+ import { cn } from "../../utils";
11
+ import { Button } from "./button";
12
+ import { Sheet, SheetContent, SheetTitle } from "../feedback";
13
+ import {
14
+ Tooltip,
15
+ TooltipContent,
16
+ TooltipProvider,
17
+ TooltipTrigger,
18
+ } from "./tooltip";
19
+
20
+ const SIDEBAR_COOKIE_NAME = "sidebar:state";
21
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
22
+ const SIDEBAR_WIDTH = "16rem";
23
+ const SIDEBAR_WIDTH_MOBILE = "18rem"; // slightly wider on mobile? or same.
24
+ const SIDEBAR_WIDTH_ICON = "3rem";
25
+ const SIDEBAR_KEYBOARD_SHORTCUT = "b";
26
+
27
+ type SidebarContext = {
28
+ state: "expanded" | "collapsed";
29
+ open: boolean;
30
+ setOpen: (open: boolean) => void;
31
+ openMobile: boolean;
32
+ setOpenMobile: (open: boolean) => void;
33
+ isMobile: boolean;
34
+ toggleSidebar: () => void;
35
+ // Hover expand
36
+ hoverOpen: boolean;
37
+ setHoverOpen: (open: boolean) => void;
38
+ isHoverExpanded: boolean;
39
+ };
40
+
41
+ const SidebarContext = React.createContext<SidebarContext | null>(null);
42
+
43
+ function useSidebar() {
44
+ const context = React.useContext(SidebarContext);
45
+ if (!context) {
46
+ throw new Error("useSidebar must be used within a SidebarProvider.");
47
+ }
48
+ return context;
49
+ }
50
+
51
+ const SidebarProvider = React.forwardRef<
52
+ HTMLDivElement,
53
+ React.ComponentProps<"div"> & {
54
+ defaultOpen?: boolean;
55
+ open?: boolean;
56
+ onOpenChange?: (open: boolean) => void;
57
+ storageKey?: string;
58
+ }
59
+ >(
60
+ (
61
+ {
62
+ defaultOpen = false,
63
+ open: openProp,
64
+ onOpenChange: setOpenProp,
65
+ className,
66
+ style,
67
+ children,
68
+ ...props
69
+ },
70
+ ref,
71
+ ) => {
72
+ const isMobile = useMobile();
73
+ const [openMobile, setOpenMobile] = React.useState(false);
74
+ // Hover expand state
75
+ const [hoverOpen, setHoverOpen] = React.useState(false);
76
+
77
+ // Internal state for desktop
78
+ const [_open, _setOpen] = React.useState(defaultOpen);
79
+ const open = openProp ?? _open;
80
+ const setOpen = React.useCallback(
81
+ (value: boolean | ((value: boolean) => boolean)) => {
82
+ if (setOpenProp) {
83
+ return setOpenProp(typeof value === "function" ? value(open) : value);
84
+ }
85
+ _setOpen(value);
86
+ // Store cookie/localstorage if needed
87
+ // document.cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
88
+ },
89
+ [setOpenProp, open],
90
+ );
91
+
92
+ // Toggle sidebar
93
+ const toggleSidebar = React.useCallback(() => {
94
+ return isMobile
95
+ ? setOpenMobile((open) => !open)
96
+ : setOpen((open) => !open);
97
+ }, [isMobile, setOpen, setOpenMobile]);
98
+
99
+ // Keyboard shortcut
100
+ React.useEffect(() => {
101
+ const handleKeyDown = (event: KeyboardEvent) => {
102
+ if (
103
+ event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
104
+ (event.metaKey || event.ctrlKey)
105
+ ) {
106
+ event.preventDefault();
107
+ toggleSidebar();
108
+ }
109
+ };
110
+
111
+ window.addEventListener("keydown", handleKeyDown);
112
+ return () => window.removeEventListener("keydown", handleKeyDown);
113
+ }, [toggleSidebar]);
114
+
115
+ const state = open ? "expanded" : "collapsed";
116
+ // Check if sidebar is expanded due to hover (only when collapsed)
117
+ const isHoverExpanded = !open && hoverOpen;
118
+
119
+ const contextValue = React.useMemo<SidebarContext>(
120
+ () => ({
121
+ state,
122
+ open,
123
+ setOpen,
124
+ isMobile,
125
+ openMobile,
126
+ setOpenMobile,
127
+ toggleSidebar,
128
+ hoverOpen,
129
+ setHoverOpen,
130
+ isHoverExpanded,
131
+ }),
132
+ [
133
+ state,
134
+ open,
135
+ setOpen,
136
+ isMobile,
137
+ openMobile,
138
+ setOpenMobile,
139
+ toggleSidebar,
140
+ hoverOpen,
141
+ setHoverOpen,
142
+ isHoverExpanded,
143
+ ],
144
+ );
145
+
146
+ return (
147
+ <SidebarContext.Provider value={contextValue}>
148
+ <TooltipProvider delayDuration={0}>
149
+ <div
150
+ style={
151
+ {
152
+ "--sidebar-width": SIDEBAR_WIDTH,
153
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
154
+ ...style,
155
+ } as React.CSSProperties
156
+ }
157
+ className={cn(
158
+ "group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
159
+ className,
160
+ )}
161
+ ref={ref}
162
+ {...props}
163
+ >
164
+ {children}
165
+ </div>
166
+ </TooltipProvider>
167
+ </SidebarContext.Provider>
168
+ );
169
+ },
170
+ );
171
+ SidebarProvider.displayName = "SidebarProvider";
172
+
173
+ const Sidebar = React.forwardRef<
174
+ HTMLDivElement,
175
+ React.ComponentProps<"div"> & {
176
+ side?: "left" | "right";
177
+ variant?: "sidebar" | "floating" | "inset";
178
+ collapsible?: "offcanvas" | "icon" | "none";
179
+ hoverExpandEnabled?: boolean;
180
+ }
181
+ >(
182
+ (
183
+ {
184
+ side = "left",
185
+ variant = "sidebar",
186
+ collapsible = "offcanvas",
187
+ hoverExpandEnabled = true,
188
+ className,
189
+ children,
190
+ ...props
191
+ },
192
+ ref,
193
+ ) => {
194
+ const {
195
+ isMobile,
196
+ state,
197
+ openMobile,
198
+ setOpenMobile,
199
+ setHoverOpen,
200
+ isHoverExpanded,
201
+ } = useSidebar();
202
+
203
+ // Handlers for hover expand
204
+ const handleMouseEnter = React.useCallback(() => {
205
+ if (
206
+ hoverExpandEnabled &&
207
+ state === "collapsed" &&
208
+ collapsible === "icon"
209
+ ) {
210
+ setHoverOpen(true);
211
+ }
212
+ }, [hoverExpandEnabled, state, collapsible, setHoverOpen]);
213
+
214
+ const handleMouseLeave = React.useCallback(() => {
215
+ if (hoverExpandEnabled) {
216
+ setHoverOpen(false);
217
+ }
218
+ }, [hoverExpandEnabled, setHoverOpen]);
219
+
220
+ if (collapsible === "none") {
221
+ return (
222
+ <div
223
+ className={cn(
224
+ "flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground",
225
+ className,
226
+ )}
227
+ ref={ref}
228
+ {...props}
229
+ >
230
+ {children}
231
+ </div>
232
+ );
233
+ }
234
+
235
+ if (isMobile) {
236
+ return (
237
+ <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
238
+ <SheetContent
239
+ data-sidebar="sidebar"
240
+ data-mobile="true"
241
+ className="w-(--sidebar-width) bg-background p-0 text-foreground [&>button]:hidden"
242
+ style={
243
+ {
244
+ "--sidebar-width": SIDEBAR_WIDTH_MOBILE,
245
+ } as React.CSSProperties
246
+ }
247
+ side={side}
248
+ >
249
+ <SheetTitle className="sr-only">Mobile Menu</SheetTitle>
250
+ <div className="flex h-full w-full flex-col">{children}</div>
251
+ </SheetContent>
252
+ </Sheet>
253
+ );
254
+ }
255
+
256
+ // Determine effective state for styling
257
+ const effectiveState = isHoverExpanded ? "hover-expanded" : state;
258
+
259
+ return (
260
+ <div
261
+ ref={ref}
262
+ className={cn(
263
+ "group peer hidden md:block transition-colors duration-200",
264
+ // Blue bg + white text when collapsed, white bg + dark text when expanded/hover
265
+ state === "collapsed" && !isHoverExpanded
266
+ ? "text-sidebar-foreground"
267
+ : "text-foreground",
268
+ )}
269
+ data-state={state}
270
+ data-hover-expanded={isHoverExpanded}
271
+ data-collapsible={state === "collapsed" ? collapsible : ""}
272
+ data-variant={variant}
273
+ data-side={side}
274
+ onMouseEnter={handleMouseEnter}
275
+ onMouseLeave={handleMouseLeave}
276
+ >
277
+ {/* Sidebar Gap - keeps layout stable, doesn't expand on hover */}
278
+ <div
279
+ className={cn(
280
+ "duration-200 relative h-svh w-(--sidebar-width) bg-transparent transition-[width] ease-linear",
281
+ "group-data-[collapsible=offcanvas]:w-0",
282
+ "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
283
+ variant === "floating" || variant === "inset"
284
+ ? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_2px)]"
285
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon)",
286
+ )}
287
+ />
288
+ {/* Sidebar Content - expands on hover */}
289
+ <div
290
+ className={cn(
291
+ "duration-200 fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] ease-linear md:flex",
292
+ side === "left"
293
+ ? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
294
+ : "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
295
+ // Adjustments for collapsible=icon
296
+ variant === "floating" || variant === "inset"
297
+ ? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_8px)] group-data-[collapsible=icon]:px-2.5"
298
+ : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[collapsible=icon]:border-r group-data-[collapsible=icon]:px-0",
299
+ // Hover expand - override icon width to full width on hover
300
+ "group-data-[hover-expanded=true]:!w-(--sidebar-width) group-data-[hover-expanded=true]:shadow-xl group-data-[hover-expanded=true]:z-[100]",
301
+ className,
302
+ )}
303
+ {...props}
304
+ >
305
+ <div
306
+ data-sidebar="sidebar"
307
+ className={cn(
308
+ "flex h-full w-full flex-col border-r transition-colors duration-200",
309
+ // Blue background when collapsed, white when expanded/hover
310
+ "group-data-[state=collapsed]:bg-sidebar group-data-[state=collapsed]:border-sidebar-border",
311
+ "group-data-[state=expanded]:bg-background group-data-[state=expanded]:border-border",
312
+ "group-data-[hover-expanded=true]:!bg-background group-data-[hover-expanded=true]:!border-border",
313
+ "group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow",
314
+ )}
315
+ >
316
+ {children}
317
+ </div>
318
+ </div>
319
+ </div>
320
+ );
321
+ },
322
+ );
323
+ Sidebar.displayName = "Sidebar";
324
+
325
+ const SidebarTrigger = React.forwardRef<
326
+ React.ElementRef<typeof Button>,
327
+ React.ComponentProps<typeof Button>
328
+ >(({ className, onClick, ...props }, ref) => {
329
+ const { toggleSidebar } = useSidebar();
330
+
331
+ return (
332
+ <Button
333
+ ref={ref}
334
+ data-sidebar="trigger"
335
+ variant="ghost"
336
+ size="icon"
337
+ className={cn("h-7 w-7", className)}
338
+ onClick={(event) => {
339
+ onClick?.(event);
340
+ toggleSidebar();
341
+ }}
342
+ {...props}
343
+ >
344
+ <PanelLeft />
345
+ <span className="sr-only">Toggle Sidebar</span>
346
+ </Button>
347
+ );
348
+ });
349
+ SidebarTrigger.displayName = "SidebarTrigger";
350
+
351
+ const SidebarRail = React.forwardRef<
352
+ HTMLButtonElement,
353
+ React.ComponentProps<"button">
354
+ >(({ className, ...props }, ref) => {
355
+ const { toggleSidebar } = useSidebar();
356
+
357
+ return (
358
+ <button
359
+ ref={ref}
360
+ data-sidebar="rail"
361
+ aria-label="Toggle Sidebar"
362
+ tabIndex={-1}
363
+ onClick={toggleSidebar}
364
+ title="Toggle Sidebar"
365
+ className={cn(
366
+ "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",
367
+ "[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
368
+ "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
369
+ "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
370
+ "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
371
+ "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
372
+ className,
373
+ )}
374
+ {...props}
375
+ />
376
+ );
377
+ });
378
+ SidebarRail.displayName = "SidebarRail";
379
+
380
+ const SidebarInset = React.forwardRef<
381
+ HTMLDivElement,
382
+ React.ComponentProps<"main">
383
+ >(({ className, ...props }, ref) => {
384
+ return (
385
+ <main
386
+ ref={ref}
387
+ className={cn(
388
+ "relative flex min-h-svh flex-1 flex-col bg-muted/40 transition-[margin] duration-200 ease-linear",
389
+ "peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
390
+ className,
391
+ )}
392
+ {...props}
393
+ />
394
+ );
395
+ });
396
+ SidebarInset.displayName = "SidebarInset";
397
+
398
+ const SidebarInput = React.forwardRef<
399
+ React.ElementRef<"input">,
400
+ React.ComponentProps<"input">
401
+ >(({ className, ...props }, ref) => {
402
+ return (
403
+ <input
404
+ ref={ref}
405
+ data-sidebar="input"
406
+ className={cn(
407
+ "flex h-8 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sidebar-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
408
+ className,
409
+ )}
410
+ {...props}
411
+ />
412
+ );
413
+ });
414
+ SidebarInput.displayName = "SidebarInput";
415
+
416
+ const SidebarHeader = React.forwardRef<
417
+ HTMLDivElement,
418
+ React.ComponentProps<"div">
419
+ >(({ className, ...props }, ref) => {
420
+ return (
421
+ <div
422
+ ref={ref}
423
+ data-sidebar="header"
424
+ className={cn("flex flex-col gap-2 p-2", className)}
425
+ {...props}
426
+ />
427
+ );
428
+ });
429
+ SidebarHeader.displayName = "SidebarHeader";
430
+
431
+ const SidebarFooter = React.forwardRef<
432
+ HTMLDivElement,
433
+ React.ComponentProps<"div">
434
+ >(({ className, ...props }, ref) => {
435
+ return (
436
+ <div
437
+ ref={ref}
438
+ data-sidebar="footer"
439
+ className={cn("flex flex-col gap-2 p-2", className)}
440
+ {...props}
441
+ />
442
+ );
443
+ });
444
+ SidebarFooter.displayName = "SidebarFooter";
445
+
446
+ const SidebarSeparator = React.forwardRef<
447
+ React.ElementRef<"div">,
448
+ React.ComponentProps<"div">
449
+ >(({ className, ...props }, ref) => {
450
+ return (
451
+ <div
452
+ ref={ref}
453
+ data-sidebar="separator"
454
+ className={cn("mx-2 h-[1px] w-auto bg-sidebar-border", className)}
455
+ {...props}
456
+ />
457
+ );
458
+ });
459
+ SidebarSeparator.displayName = "SidebarSeparator";
460
+
461
+ const SidebarContent = React.forwardRef<
462
+ HTMLDivElement,
463
+ React.ComponentProps<"div">
464
+ >(({ className, ...props }, ref) => {
465
+ return (
466
+ <div
467
+ ref={ref}
468
+ data-sidebar="content"
469
+ className={cn(
470
+ "flex min-h-0 flex-1 flex-col gap-2 overflow-auto",
471
+ // Hide overflow when collapsed, but show when hover-expanded
472
+ "group-data-[collapsible=icon]:overflow-hidden group-data-[hover-expanded=true]:!overflow-auto",
473
+ className,
474
+ )}
475
+ {...props}
476
+ />
477
+ );
478
+ });
479
+ SidebarContent.displayName = "SidebarContent";
480
+
481
+ const SidebarGroup = React.forwardRef<
482
+ HTMLDivElement,
483
+ React.ComponentProps<"div">
484
+ >(({ className, ...props }, ref) => {
485
+ return (
486
+ <div
487
+ ref={ref}
488
+ data-sidebar="group"
489
+ className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
490
+ {...props}
491
+ />
492
+ );
493
+ });
494
+ SidebarGroup.displayName = "SidebarGroup";
495
+
496
+ const SidebarGroupLabel = React.forwardRef<
497
+ HTMLDivElement,
498
+ React.ComponentProps<"div"> & { asChild?: boolean }
499
+ >(({ className, asChild = false, ...props }, ref) => {
500
+ const Comp = asChild ? Slot : "div";
501
+
502
+ return (
503
+ <Comp
504
+ ref={ref}
505
+ data-sidebar="group-label"
506
+ className={cn(
507
+ "duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-bold text-primary uppercase tracking-wider outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
508
+ // Hide when collapsed, show when hover-expanded
509
+ "group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
510
+ "group-data-[hover-expanded=true]:!mt-0 group-data-[hover-expanded=true]:!opacity-100",
511
+ className,
512
+ )}
513
+ {...props}
514
+ />
515
+ );
516
+ });
517
+ SidebarGroupLabel.displayName = "SidebarGroupLabel";
518
+
519
+ const SidebarGroupAction = React.forwardRef<
520
+ HTMLButtonElement,
521
+ React.ComponentProps<"button"> & { asChild?: boolean }
522
+ >(({ className, asChild = false, ...props }, ref) => {
523
+ const Comp = asChild ? Slot : "button";
524
+
525
+ return (
526
+ <Comp
527
+ ref={ref}
528
+ data-sidebar="group-action"
529
+ className={cn(
530
+ "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",
531
+ // Increases the hit area of the button on mobile.
532
+ "after:absolute after:-inset-2 after:md:hidden",
533
+ "group-data-[collapsible=icon]:hidden",
534
+ className,
535
+ )}
536
+ {...props}
537
+ />
538
+ );
539
+ });
540
+ SidebarGroupAction.displayName = "SidebarGroupAction";
541
+
542
+ const SidebarGroupContent = React.forwardRef<
543
+ HTMLDivElement,
544
+ React.ComponentProps<"div">
545
+ >(({ className, ...props }, ref) => {
546
+ return (
547
+ <div
548
+ ref={ref}
549
+ data-sidebar="group-content"
550
+ className={cn("w-full text-sm", className)}
551
+ {...props}
552
+ />
553
+ );
554
+ });
555
+ SidebarGroupContent.displayName = "SidebarGroupContent";
556
+
557
+ const SidebarMenu = React.forwardRef<
558
+ HTMLUListElement,
559
+ React.ComponentProps<"ul">
560
+ >(({ className, ...props }, ref) => {
561
+ return (
562
+ <ul
563
+ ref={ref}
564
+ data-sidebar="menu"
565
+ className={cn("flex w-full min-w-0 flex-col gap-1", className)}
566
+ {...props}
567
+ />
568
+ );
569
+ });
570
+ SidebarMenu.displayName = "SidebarMenu";
571
+
572
+ const SidebarMenuItem = React.forwardRef<
573
+ HTMLLIElement,
574
+ React.ComponentProps<"li">
575
+ >(({ className, ...props }, ref) => {
576
+ return (
577
+ <li
578
+ ref={ref}
579
+ data-sidebar="menu-item"
580
+ className={cn("group/menu-item relative", className)}
581
+ {...props}
582
+ />
583
+ );
584
+ });
585
+ SidebarMenuItem.displayName = "SidebarMenuItem";
586
+
587
+ const sidebarMenuButtonVariants = cva(
588
+ // Base styles + hover-expand overrides
589
+ "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] 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 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 group-data-[hover-expanded=true]:!size-auto group-data-[hover-expanded=true]:!w-full group-data-[hover-expanded=true]:!p-2",
590
+ {
591
+ variants: {
592
+ variant: {
593
+ default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
594
+ outline:
595
+ "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))]",
596
+ },
597
+ size: {
598
+ default: "h-8 text-sm",
599
+ sm: "h-7 text-xs",
600
+ lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
601
+ },
602
+ isActive: {
603
+ true: "bg-primary/10 text-primary font-bold",
604
+ },
605
+ },
606
+ defaultVariants: {
607
+ variant: "default",
608
+ size: "default",
609
+ },
610
+ },
611
+ );
612
+
613
+ const SidebarMenuButton = React.forwardRef<
614
+ HTMLButtonElement,
615
+ React.ComponentProps<"button"> & {
616
+ asChild?: boolean;
617
+ isActive?: boolean;
618
+ tooltip?: string | React.ComponentProps<typeof TooltipContent>;
619
+ } & VariantProps<typeof sidebarMenuButtonVariants>
620
+ >(
621
+ (
622
+ {
623
+ asChild = false,
624
+ isActive = false,
625
+ variant = "default",
626
+ size = "default",
627
+ tooltip,
628
+ className,
629
+ ...props
630
+ },
631
+ ref,
632
+ ) => {
633
+ const Comp = asChild ? Slot : "button";
634
+ const { isMobile, state } = useSidebar();
635
+
636
+ const button = (
637
+ <Comp
638
+ ref={ref}
639
+ data-sidebar="menu-button"
640
+ data-size={size}
641
+ data-active={isActive}
642
+ className={cn(
643
+ sidebarMenuButtonVariants({ variant, size, isActive }),
644
+ className,
645
+ )}
646
+ {...props}
647
+ />
648
+ );
649
+
650
+ if (!tooltip) {
651
+ return button;
652
+ }
653
+
654
+ if (typeof tooltip === "string") {
655
+ tooltip = {
656
+ children: tooltip,
657
+ };
658
+ }
659
+
660
+ return (
661
+ <Tooltip>
662
+ <TooltipTrigger asChild>{button}</TooltipTrigger>
663
+ <TooltipContent
664
+ side="right"
665
+ align="center"
666
+ hidden={state !== "collapsed" || isMobile}
667
+ {...tooltip}
668
+ />
669
+ </Tooltip>
670
+ );
671
+ },
672
+ );
673
+ SidebarMenuButton.displayName = "SidebarMenuButton";
674
+
675
+ const SidebarMenuAction = React.forwardRef<
676
+ HTMLButtonElement,
677
+ React.ComponentProps<"button"> & { asChild?: boolean; showOnHover?: boolean }
678
+ >(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
679
+ const Comp = asChild ? Slot : "button";
680
+
681
+ return (
682
+ <Comp
683
+ ref={ref}
684
+ data-sidebar="menu-action"
685
+ className={cn(
686
+ "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 [&>svg]:size-4 [&>svg]:shrink-0",
687
+ // Increases the hit area of the button on mobile.
688
+ "after:absolute after:-inset-2 after:md:hidden",
689
+ "peer-data-[size=sm]/menu-button:top-1",
690
+ "peer-data-[size=default]/menu-button:top-1.5",
691
+ "peer-data-[size=lg]/menu-button:top-2.5",
692
+ "group-data-[collapsible=icon]:hidden",
693
+ showOnHover &&
694
+ "group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0",
695
+ className,
696
+ )}
697
+ {...props}
698
+ />
699
+ );
700
+ });
701
+ SidebarMenuAction.displayName = "SidebarMenuAction";
702
+
703
+ const SidebarMenuBadge = React.forwardRef<
704
+ HTMLDivElement,
705
+ React.ComponentProps<"div">
706
+ >(({ className, ...props }, ref) => {
707
+ return (
708
+ <div
709
+ ref={ref}
710
+ data-sidebar="menu-badge"
711
+ className={cn(
712
+ "pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none",
713
+ "peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
714
+ "peer-data-[size=sm]/menu-button:top-1",
715
+ "peer-data-[size=default]/menu-button:top-1.5",
716
+ "peer-data-[size=lg]/menu-button:top-2.5",
717
+ "group-data-[collapsible=icon]:hidden",
718
+ className,
719
+ )}
720
+ {...props}
721
+ />
722
+ );
723
+ });
724
+ SidebarMenuBadge.displayName = "SidebarMenuBadge";
725
+
726
+ const SidebarMenuSkeleton = React.forwardRef<
727
+ HTMLDivElement,
728
+ React.ComponentProps<"div"> & {
729
+ showIcon?: boolean;
730
+ }
731
+ >(({ className, showIcon = false, ...props }, ref) => {
732
+ // Random width between 50 to 90%.
733
+ const width = React.useMemo(() => {
734
+ return `${Math.floor(Math.random() * 40) + 50}%`;
735
+ }, []);
736
+
737
+ return (
738
+ <div
739
+ ref={ref}
740
+ data-sidebar="menu-skeleton"
741
+ className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
742
+ {...props}
743
+ >
744
+ {showIcon && (
745
+ <div
746
+ className="size-4 rounded-md animate-pulse bg-muted"
747
+ data-sidebar="menu-skeleton-icon"
748
+ />
749
+ )}
750
+ <div
751
+ className="h-4 flex-1 max-w-[--skeleton-width] animate-pulse bg-muted rounded-full"
752
+ data-sidebar="menu-skeleton-text"
753
+ style={
754
+ {
755
+ "--skeleton-width": width,
756
+ } as React.CSSProperties
757
+ }
758
+ />
759
+ </div>
760
+ );
761
+ });
762
+ SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
763
+
764
+ const SidebarMenuSub = React.forwardRef<
765
+ HTMLUListElement,
766
+ React.ComponentProps<"ul">
767
+ >(({ className, ...props }, ref) => {
768
+ return (
769
+ <ul
770
+ ref={ref}
771
+ data-sidebar="menu-sub"
772
+ className={cn(
773
+ "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",
774
+ // Hide when collapsed, show when hover-expanded
775
+ "group-data-[collapsible=icon]:hidden group-data-[hover-expanded=true]:!flex",
776
+ className,
777
+ )}
778
+ {...props}
779
+ />
780
+ );
781
+ });
782
+ SidebarMenuSub.displayName = "SidebarMenuSub";
783
+
784
+ const SidebarMenuSubItem = React.forwardRef<
785
+ HTMLLIElement,
786
+ React.ComponentProps<"li">
787
+ >(({ ...props }, ref) => <li ref={ref} {...props} />);
788
+ SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
789
+
790
+ const SidebarMenuSubButton = React.forwardRef<
791
+ HTMLAnchorElement,
792
+ React.ComponentProps<"a"> & {
793
+ asChild?: boolean;
794
+ size?: "sm" | "md";
795
+ isActive?: boolean;
796
+ }
797
+ >(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
798
+ const Comp = asChild ? Slot : "a";
799
+
800
+ return (
801
+ <Comp
802
+ ref={ref}
803
+ data-sidebar="menu-sub-button"
804
+ data-size={size}
805
+ data-active={isActive}
806
+ className={cn(
807
+ "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 text-xs",
808
+ "data-[active=true]:bg-primary/15 data-[active=true]:!text-primary data-[active=true]:font-bold",
809
+ size === "sm" && "text-xs",
810
+ size === "md" && "text-sm",
811
+ className,
812
+ )}
813
+ {...props}
814
+ />
815
+ );
816
+ });
817
+ SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
818
+
819
+ export {
820
+ Sidebar,
821
+ SidebarContent,
822
+ SidebarFooter,
823
+ SidebarGroup,
824
+ SidebarGroupAction,
825
+ SidebarGroupContent,
826
+ SidebarGroupLabel,
827
+ SidebarHeader,
828
+ SidebarInput,
829
+ SidebarInset,
830
+ SidebarMenu,
831
+ SidebarMenuAction,
832
+ SidebarMenuBadge,
833
+ SidebarMenuButton,
834
+ SidebarMenuItem,
835
+ SidebarMenuSkeleton,
836
+ SidebarMenuSub,
837
+ SidebarMenuSubButton,
838
+ SidebarMenuSubItem,
839
+ SidebarProvider,
840
+ SidebarRail,
841
+ SidebarSeparator,
842
+ SidebarTrigger,
843
+ useSidebar,
844
+ };