betterstart-cli 0.0.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 (369) hide show
  1. package/README.md +5 -0
  2. package/dist/assets/adapters/next/integrations/mailchimp/actions/mailchimp.ts +38 -0
  3. package/dist/assets/adapters/next/integrations/mailchimp/integration.ts +33 -0
  4. package/dist/assets/adapters/next/integrations/r2/actions/r2.ts +77 -0
  5. package/dist/assets/adapters/next/integrations/r2/integration.ts +39 -0
  6. package/dist/assets/adapters/next/integrations/resend/actions/resend.ts +138 -0
  7. package/dist/assets/adapters/next/integrations/resend/integration.ts +36 -0
  8. package/dist/assets/adapters/next/plugins/blog/plugin.ts +17 -0
  9. package/dist/assets/adapters/next/plugins/blog/schemas/posts.json +169 -0
  10. package/dist/assets/adapters/next/templates/init/admin-globals.css +677 -0
  11. package/dist/assets/adapters/next/templates/init/api/auth-route.ts +3 -0
  12. package/dist/assets/adapters/next/templates/init/api/upload-route.ts +132 -0
  13. package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +32 -0
  14. package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +23 -0
  15. package/dist/assets/adapters/next/templates/init/components/layouts/admin-providers.tsx +33 -0
  16. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-rsc.tsx +8 -0
  17. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-skeleton.tsx +10 -0
  18. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +11 -0
  19. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link.tsx +12 -0
  20. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu-skeleton.tsx +15 -0
  21. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +90 -0
  22. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar.tsx +78 -0
  23. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +44 -0
  24. package/dist/assets/adapters/next/templates/init/components/layouts/content-skeleton.tsx +44 -0
  25. package/dist/assets/adapters/next/templates/init/components/layouts/sidebar-branding.tsx +41 -0
  26. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +139 -0
  27. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +236 -0
  28. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +67 -0
  29. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +104 -0
  30. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +68 -0
  31. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +75 -0
  32. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +111 -0
  33. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/plain-code-fallback.tsx +11 -0
  34. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +125 -0
  35. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +108 -0
  36. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +184 -0
  37. package/dist/assets/adapters/next/templates/init/components/shared/entity-metadata.tsx +93 -0
  38. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +55 -0
  39. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +80 -0
  40. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-button.tsx +74 -0
  41. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +48 -0
  42. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +79 -0
  43. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +222 -0
  44. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +56 -0
  45. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +83 -0
  46. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +148 -0
  47. package/dist/assets/adapters/next/templates/init/components/shared/media/media-empty-state.tsx +45 -0
  48. package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +129 -0
  49. package/dist/assets/adapters/next/templates/init/components/shared/media/media-gallery-dialog.tsx +182 -0
  50. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-item.tsx +56 -0
  51. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +114 -0
  52. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid.tsx +44 -0
  53. package/dist/assets/adapters/next/templates/init/components/shared/media/media-preview.tsx +69 -0
  54. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +139 -0
  55. package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +46 -0
  56. package/dist/assets/adapters/next/templates/init/components/shared/search-input.tsx +88 -0
  57. package/dist/assets/adapters/next/templates/init/components/shared/sort-indicator.tsx +24 -0
  58. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +242 -0
  59. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-drag-overlay-item.tsx +15 -0
  60. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-item.tsx +32 -0
  61. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-types.ts +9 -0
  62. package/dist/assets/adapters/next/templates/init/data/navigation.ts +43 -0
  63. package/dist/assets/adapters/next/templates/init/drizzle.config.ts +36 -0
  64. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-blockquote.ts +251 -0
  65. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-code-block.ts +258 -0
  66. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-color-highlight.ts +347 -0
  67. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-media-insertion.ts +59 -0
  68. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-mobile-toolbar.ts +17 -0
  69. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-slash-menu.ts +116 -0
  70. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +638 -0
  71. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-table-add-controls.ts +174 -0
  72. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +288 -0
  73. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading-dropdown-menu.ts +127 -0
  74. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading.ts +269 -0
  75. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-is-breakpoint.ts +32 -0
  76. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-link-popover.ts +278 -0
  77. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +199 -0
  78. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list.ts +290 -0
  79. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-mark.ts +199 -0
  80. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-menu-navigation.ts +221 -0
  81. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-tiptap-editor.ts +46 -0
  82. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-undo-redo.ts +169 -0
  83. package/dist/assets/adapters/next/templates/init/hooks/use-admin-theme.tsx +74 -0
  84. package/dist/assets/adapters/next/templates/init/hooks/use-copy-to-clipboard.ts +48 -0
  85. package/dist/assets/adapters/next/templates/init/hooks/use-dev-mode-integration.ts +43 -0
  86. package/dist/assets/adapters/next/templates/init/hooks/use-entity-versions.ts +32 -0
  87. package/dist/assets/adapters/next/templates/init/hooks/use-failed-image-url.ts +21 -0
  88. package/dist/assets/adapters/next/templates/init/hooks/use-local-storage.ts +46 -0
  89. package/dist/assets/adapters/next/templates/init/hooks/use-media-filters-bar.ts +72 -0
  90. package/dist/assets/adapters/next/templates/init/hooks/use-media.ts +102 -0
  91. package/dist/assets/adapters/next/templates/init/hooks/use-mobile.ts +19 -0
  92. package/dist/assets/adapters/next/templates/init/hooks/use-page-boundary-blur-visibility.ts +59 -0
  93. package/dist/assets/adapters/next/templates/init/hooks/use-page-scroll-threshold.ts +27 -0
  94. package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +315 -0
  95. package/dist/assets/adapters/next/templates/init/hooks/use-upload.ts +321 -0
  96. package/dist/assets/adapters/next/templates/init/hooks/use-users.ts +12 -0
  97. package/dist/assets/adapters/next/templates/init/lib/actions/auth/auth.ts +58 -0
  98. package/dist/assets/adapters/next/templates/init/lib/actions/auth/client.ts +12 -0
  99. package/dist/assets/adapters/next/templates/init/lib/actions/auth/middleware.ts +46 -0
  100. package/dist/assets/adapters/next/templates/init/lib/actions/email/form-delivery.ts +72 -0
  101. package/dist/assets/adapters/next/templates/init/lib/actions/email/index.ts +4 -0
  102. package/dist/assets/adapters/next/templates/init/lib/actions/email/is-email-delivery-configured.ts +5 -0
  103. package/dist/assets/adapters/next/templates/init/lib/actions/email/none.ts +24 -0
  104. package/dist/assets/adapters/next/templates/init/lib/actions/email/provider.ts +6 -0
  105. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-email.ts +6 -0
  106. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-password-reset-email.ts +10 -0
  107. package/dist/assets/adapters/next/templates/init/lib/actions/email/types.ts +25 -0
  108. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/get-entity-versions.ts +48 -0
  109. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/index.ts +10 -0
  110. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-create-entity-version.ts +43 -0
  111. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-delete-entity-versions.ts +19 -0
  112. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/types.ts +26 -0
  113. package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-all-form-settings.ts +21 -0
  114. package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-form-settings.ts +27 -0
  115. package/dist/assets/adapters/next/templates/init/lib/actions/forms/index.ts +9 -0
  116. package/dist/assets/adapters/next/templates/init/lib/actions/forms/test-form-webhook.ts +40 -0
  117. package/dist/assets/adapters/next/templates/init/lib/actions/forms/types.ts +26 -0
  118. package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +40 -0
  119. package/dist/assets/adapters/next/templates/init/lib/actions/media/create-media.ts +39 -0
  120. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media-bulk.ts +29 -0
  121. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media.ts +22 -0
  122. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-id.ts +18 -0
  123. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-ids.ts +25 -0
  124. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +71 -0
  125. package/dist/assets/adapters/next/templates/init/lib/actions/media/index.ts +14 -0
  126. package/dist/assets/adapters/next/templates/init/lib/actions/media/types.ts +31 -0
  127. package/dist/assets/adapters/next/templates/init/lib/actions/media/update-media.ts +35 -0
  128. package/dist/assets/adapters/next/templates/init/lib/actions/profile/index.ts +4 -0
  129. package/dist/assets/adapters/next/templates/init/lib/actions/profile/invalidate-users-cache.ts +14 -0
  130. package/dist/assets/adapters/next/templates/init/lib/actions/profile/is-email-configured.ts +7 -0
  131. package/dist/assets/adapters/next/templates/init/lib/actions/profile/types.ts +4 -0
  132. package/dist/assets/adapters/next/templates/init/lib/actions/profile/update-email.ts +57 -0
  133. package/dist/assets/adapters/next/templates/init/lib/actions/storage/index.ts +2 -0
  134. package/dist/assets/adapters/next/templates/init/lib/actions/storage/local.ts +31 -0
  135. package/dist/assets/adapters/next/templates/init/lib/actions/storage/provider.ts +6 -0
  136. package/dist/assets/adapters/next/templates/init/lib/actions/storage/save-upload.ts +11 -0
  137. package/dist/assets/adapters/next/templates/init/lib/actions/storage/types.ts +18 -0
  138. package/dist/assets/adapters/next/templates/init/lib/actions/upload/index.ts +9 -0
  139. package/dist/assets/adapters/next/templates/init/lib/actions/upload/types.ts +17 -0
  140. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-file.ts +11 -0
  141. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-files.ts +92 -0
  142. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-image-from-url.ts +22 -0
  143. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-media-from-url.ts +133 -0
  144. package/dist/assets/adapters/next/templates/init/lib/actions/users/create-user.ts +55 -0
  145. package/dist/assets/adapters/next/templates/init/lib/actions/users/delete-user.ts +24 -0
  146. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-users.ts +49 -0
  147. package/dist/assets/adapters/next/templates/init/lib/actions/users/index.ts +12 -0
  148. package/dist/assets/adapters/next/templates/init/lib/actions/users/types.ts +43 -0
  149. package/dist/assets/adapters/next/templates/init/lib/actions/users/update-user-role.ts +28 -0
  150. package/dist/assets/adapters/next/templates/init/lib/db/client.ts +13 -0
  151. package/dist/assets/adapters/next/templates/init/lib/db/core/schema.ts +160 -0
  152. package/dist/assets/adapters/next/templates/init/lib/db/schema.ts +1 -0
  153. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/index.ts +19 -0
  154. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.local.ts +2 -0
  155. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +9 -0
  156. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/registry.ts +55 -0
  157. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/runner.ts +51 -0
  158. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/types.ts +39 -0
  159. package/dist/assets/adapters/next/templates/init/pages/account-layout.tsx +11 -0
  160. package/dist/assets/adapters/next/templates/init/pages/account-shell-rsc.tsx +30 -0
  161. package/dist/assets/adapters/next/templates/init/pages/admin-layout.tsx +24 -0
  162. package/dist/assets/adapters/next/templates/init/pages/auth-gate-rsc.tsx +6 -0
  163. package/dist/assets/adapters/next/templates/init/pages/authenticated-layout.tsx +18 -0
  164. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +121 -0
  165. package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +124 -0
  166. package/dist/assets/adapters/next/templates/init/pages/forgot-password-page-skeleton.tsx +24 -0
  167. package/dist/assets/adapters/next/templates/init/pages/forgot-password-page.tsx +21 -0
  168. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +131 -0
  169. package/dist/assets/adapters/next/templates/init/pages/login-page-rsc.tsx +14 -0
  170. package/dist/assets/adapters/next/templates/init/pages/login-page-skeleton.tsx +26 -0
  171. package/dist/assets/adapters/next/templates/init/pages/login-page.tsx +21 -0
  172. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +273 -0
  173. package/dist/assets/adapters/next/templates/init/pages/media/media-page-skeleton.tsx +7 -0
  174. package/dist/assets/adapters/next/templates/init/pages/media/media-page.tsx +11 -0
  175. package/dist/assets/adapters/next/templates/init/pages/minimal-account-shell.tsx +25 -0
  176. package/dist/assets/adapters/next/templates/init/pages/profile/profile-form.tsx +281 -0
  177. package/dist/assets/adapters/next/templates/init/pages/profile/profile-page.tsx +31 -0
  178. package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +161 -0
  179. package/dist/assets/adapters/next/templates/init/pages/reset-password-page-skeleton.tsx +26 -0
  180. package/dist/assets/adapters/next/templates/init/pages/reset-password-page.tsx +21 -0
  181. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +170 -0
  182. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +221 -0
  183. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +172 -0
  184. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +91 -0
  185. package/dist/assets/adapters/next/templates/init/pages/users/users-page-content.tsx +25 -0
  186. package/dist/assets/adapters/next/templates/init/pages/users/users-page-skeleton.tsx +7 -0
  187. package/dist/assets/adapters/next/templates/init/pages/users/users-page.tsx +11 -0
  188. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +221 -0
  189. package/dist/assets/adapters/next/templates/init/types/auth.ts +71 -0
  190. package/dist/assets/adapters/next/templates/init/types/index.ts +108 -0
  191. package/dist/assets/adapters/next/templates/init/types/navigation.ts +11 -0
  192. package/dist/assets/adapters/next/templates/init/types/table-meta.ts +14 -0
  193. package/dist/assets/adapters/next/templates/init/utils/auth/roles.ts +17 -0
  194. package/dist/assets/adapters/next/templates/init/utils/date/date.ts +90 -0
  195. package/dist/assets/adapters/next/templates/init/utils/dev-mode/code-block-height.ts +9 -0
  196. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-rich-extensions.ts +824 -0
  197. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor.ts +316 -0
  198. package/dist/assets/adapters/next/templates/init/utils/editor/editor-view.ts +19 -0
  199. package/dist/assets/adapters/next/templates/init/utils/editor/markdown.ts +542 -0
  200. package/dist/assets/adapters/next/templates/init/utils/editor/node-attrs.ts +25 -0
  201. package/dist/assets/adapters/next/templates/init/utils/editor/slash-commands.ts +148 -0
  202. package/dist/assets/adapters/next/templates/init/utils/editor/source-media.ts +11 -0
  203. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls.ts +91 -0
  204. package/dist/assets/adapters/next/templates/init/utils/editor/table-bubble.ts +172 -0
  205. package/dist/assets/adapters/next/templates/init/utils/editor/table-input.ts +5 -0
  206. package/dist/assets/adapters/next/templates/init/utils/editor/task-item.ts +19 -0
  207. package/dist/assets/adapters/next/templates/init/utils/editor/tiptap.ts +991 -0
  208. package/dist/assets/adapters/next/templates/init/utils/email/form-delivery.ts +104 -0
  209. package/dist/assets/adapters/next/templates/init/utils/media/fallback.ts +37 -0
  210. package/dist/assets/adapters/next/templates/init/utils/media/media.ts +91 -0
  211. package/dist/assets/adapters/next/templates/init/utils/media/query.ts +96 -0
  212. package/dist/assets/adapters/next/templates/init/utils/navigation/order.ts +6 -0
  213. package/dist/assets/adapters/next/templates/init/utils/navigation/sidebar.ts +26 -0
  214. package/dist/assets/adapters/next/templates/init/utils/page/boundary.ts +32 -0
  215. package/dist/assets/adapters/next/templates/init/utils/seo/seo.ts +90 -0
  216. package/dist/assets/adapters/next/templates/init/utils/shared/cn.ts +6 -0
  217. package/dist/assets/adapters/next/templates/init/utils/storage/local.ts +9 -0
  218. package/dist/assets/adapters/next/templates/init/utils/table/table.ts +10 -0
  219. package/dist/assets/adapters/next/templates/init/utils/text/text.ts +4 -0
  220. package/dist/assets/adapters/next/templates/init/utils/theme/system.ts +6 -0
  221. package/dist/assets/adapters/next/templates/init/utils/upload/remote.ts +55 -0
  222. package/dist/assets/adapters/next/templates/init/utils/upload/upload.ts +26 -0
  223. package/dist/assets/adapters/next/templates/init/utils/user/user.ts +11 -0
  224. package/dist/assets/adapters/next/templates/init/utils/validation/validation.ts +114 -0
  225. package/dist/assets/adapters/next/templates/init/utils/webhook/webhook.ts +28 -0
  226. package/dist/assets/shared-assets/react-admin/custom/content-editor/editor-toolbar.tsx +25 -0
  227. package/dist/assets/shared-assets/react-admin/custom/content-editor/horizontal-rule-button.tsx +22 -0
  228. package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +142 -0
  229. package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +118 -0
  230. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +80 -0
  231. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-button.tsx +22 -0
  232. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-editor-controls.tsx +117 -0
  233. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +59 -0
  234. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover.tsx +6 -0
  235. package/dist/assets/shared-assets/react-admin/custom/content-editor/media-gallery-block.tsx +31 -0
  236. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +56 -0
  237. package/dist/assets/shared-assets/react-admin/custom/content-editor/mode-toggle-button.tsx +29 -0
  238. package/dist/assets/shared-assets/react-admin/custom/content-editor/remove-table-part-icon.tsx +17 -0
  239. package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +105 -0
  240. package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +65 -0
  241. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +52 -0
  242. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +360 -0
  243. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-add-controls.tsx +46 -0
  244. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +290 -0
  245. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +116 -0
  246. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-extension/node-background-extension.ts +138 -0
  247. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts +10 -0
  248. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/index.tsx +1 -0
  249. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node-extension.ts +117 -0
  250. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node.tsx +63 -0
  251. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/index.tsx +1 -0
  252. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node-extension.ts +11 -0
  253. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +168 -0
  254. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/task-item-node/task-item-node-extension.tsx +142 -0
  255. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +114 -0
  256. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/index.tsx +1 -0
  257. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +112 -0
  258. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/index.tsx +1 -0
  259. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +185 -0
  260. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/index.tsx +1 -0
  261. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-button.tsx +40 -0
  262. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content.tsx +130 -0
  263. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +98 -0
  264. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-color-button.tsx +75 -0
  265. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-colors.ts +24 -0
  266. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/index.tsx +1 -0
  267. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +65 -0
  268. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/control-options.ts +27 -0
  269. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +35 -0
  270. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +119 -0
  271. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/index.tsx +1 -0
  272. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/index.tsx +1 -0
  273. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-button.tsx +39 -0
  274. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-content.tsx +13 -0
  275. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +90 -0
  276. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-main.tsx +96 -0
  277. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-popover.tsx +121 -0
  278. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/index.tsx +1 -0
  279. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +44 -0
  280. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +115 -0
  281. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/index.tsx +1 -0
  282. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +117 -0
  283. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/index.tsx +1 -0
  284. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +115 -0
  285. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +70 -0
  286. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +216 -0
  287. package/dist/assets/shared-assets/react-admin/custom/dynamic-list-field.tsx +111 -0
  288. package/dist/assets/shared-assets/react-admin/custom/gallery-field.tsx +124 -0
  289. package/dist/assets/shared-assets/react-admin/custom/gallery-thumbnail.tsx +39 -0
  290. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +377 -0
  291. package/dist/assets/shared-assets/react-admin/custom/icons-column-skeleton.tsx +16 -0
  292. package/dist/assets/shared-assets/react-admin/custom/icons-data.ts +8 -0
  293. package/dist/assets/shared-assets/react-admin/custom/logo.tsx +115 -0
  294. package/dist/assets/shared-assets/react-admin/custom/media-gallery-field.tsx +182 -0
  295. package/dist/assets/shared-assets/react-admin/custom/page-skeleton.tsx +11 -0
  296. package/dist/assets/shared-assets/react-admin/custom/placeholder-card.tsx +34 -0
  297. package/dist/assets/shared-assets/react-admin/custom/placeholder.tsx +25 -0
  298. package/dist/assets/shared-assets/react-admin/custom/progressive-blur.tsx +62 -0
  299. package/dist/assets/shared-assets/react-admin/custom/sortable-gallery-item.tsx +68 -0
  300. package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +107 -0
  301. package/dist/assets/shared-assets/react-admin/dependencies.ts +73 -0
  302. package/dist/assets/shared-assets/react-admin/schema.json +1670 -0
  303. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +86 -0
  304. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +178 -0
  305. package/dist/assets/shared-assets/react-admin/ui/alert.tsx +72 -0
  306. package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +9 -0
  307. package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +95 -0
  308. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +48 -0
  309. package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +99 -0
  310. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +76 -0
  311. package/dist/assets/shared-assets/react-admin/ui/button.tsx +66 -0
  312. package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +184 -0
  313. package/dist/assets/shared-assets/react-admin/ui/card.tsx +94 -0
  314. package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +239 -0
  315. package/dist/assets/shared-assets/react-admin/ui/chart.tsx +336 -0
  316. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +28 -0
  317. package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +21 -0
  318. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +272 -0
  319. package/dist/assets/shared-assets/react-admin/ui/command.tsx +180 -0
  320. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +243 -0
  321. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +141 -0
  322. package/dist/assets/shared-assets/react-admin/ui/direction.tsx +20 -0
  323. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +119 -0
  324. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +253 -0
  325. package/dist/assets/shared-assets/react-admin/ui/empty.tsx +93 -0
  326. package/dist/assets/shared-assets/react-admin/ui/field.tsx +234 -0
  327. package/dist/assets/shared-assets/react-admin/ui/form.tsx +172 -0
  328. package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +37 -0
  329. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +134 -0
  330. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +85 -0
  331. package/dist/assets/shared-assets/react-admin/ui/input.tsx +18 -0
  332. package/dist/assets/shared-assets/react-admin/ui/item.tsx +180 -0
  333. package/dist/assets/shared-assets/react-admin/ui/kbd.tsx +26 -0
  334. package/dist/assets/shared-assets/react-admin/ui/label.tsx +20 -0
  335. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +259 -0
  336. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +54 -0
  337. package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +159 -0
  338. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +111 -0
  339. package/dist/assets/shared-assets/react-admin/ui/popover.tsx +75 -0
  340. package/dist/assets/shared-assets/react-admin/ui/progress.tsx +30 -0
  341. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +43 -0
  342. package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +41 -0
  343. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +54 -0
  344. package/dist/assets/shared-assets/react-admin/ui/select.tsx +183 -0
  345. package/dist/assets/shared-assets/react-admin/ui/separator.tsx +27 -0
  346. package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +129 -0
  347. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +688 -0
  348. package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +13 -0
  349. package/dist/assets/shared-assets/react-admin/ui/slider.tsx +53 -0
  350. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +45 -0
  351. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +15 -0
  352. package/dist/assets/shared-assets/react-admin/ui/switch.tsx +32 -0
  353. package/dist/assets/shared-assets/react-admin/ui/table.tsx +101 -0
  354. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +79 -0
  355. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +17 -0
  356. package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +85 -0
  357. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +45 -0
  358. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +51 -0
  359. package/dist/chunk-MUZQCVQA.js +306 -0
  360. package/dist/chunk-MUZQCVQA.js.map +1 -0
  361. package/dist/cli.d.ts +2 -0
  362. package/dist/cli.js +23437 -0
  363. package/dist/cli.js.map +1 -0
  364. package/dist/index.d.ts +90 -0
  365. package/dist/index.js +8 -0
  366. package/dist/index.js.map +1 -0
  367. package/dist/template-reader-YKWE2C7O.js +13 -0
  368. package/dist/template-reader-YKWE2C7O.js.map +1 -0
  369. package/package.json +74 -0
@@ -0,0 +1,688 @@
1
+ 'use client'
2
+
3
+ import { Button } from '@admin/components/ui/button'
4
+ import { Input } from '@admin/components/ui/input'
5
+ import { Separator } from '@admin/components/ui/separator'
6
+ import {
7
+ Sheet,
8
+ SheetContent,
9
+ SheetDescription,
10
+ SheetHeader,
11
+ SheetTitle
12
+ } from '@admin/components/ui/sheet'
13
+ import { Skeleton } from '@admin/components/ui/skeleton'
14
+ import { Tooltip, TooltipContent, TooltipTrigger } from '@admin/components/ui/tooltip'
15
+ import { useIsMobile } from '@admin/hooks/use-mobile'
16
+ import { cn } from '@admin/utils/shared/cn'
17
+ import { cva, type VariantProps } from 'class-variance-authority'
18
+ import { PanelLeftIcon } from 'lucide-react'
19
+ import { Slot } from 'radix-ui'
20
+ import * as React from 'react'
21
+
22
+ const SIDEBAR_COOKIE_NAME = 'sidebar_state'
23
+ const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
24
+ const SIDEBAR_WIDTH = '16rem'
25
+ const SIDEBAR_WIDTH_MOBILE = '18rem'
26
+ const SIDEBAR_WIDTH_ICON = '3rem'
27
+ const SIDEBAR_KEYBOARD_SHORTCUT = 'b'
28
+
29
+ type SidebarCookieStore = {
30
+ set: (options: { name: string; value: string; path: string; expires: number }) => Promise<void>
31
+ }
32
+
33
+ type WindowWithCookieStore = Window & {
34
+ cookieStore?: SidebarCookieStore
35
+ }
36
+
37
+ type SidebarContextProps = {
38
+ state: 'expanded' | 'collapsed'
39
+ open: boolean
40
+ setOpen: (open: boolean) => void
41
+ openMobile: boolean
42
+ setOpenMobile: (open: boolean) => void
43
+ isMobile: boolean
44
+ toggleSidebar: () => void
45
+ }
46
+
47
+ const SidebarContext = React.createContext<SidebarContextProps | null>(null)
48
+
49
+ function useSidebar() {
50
+ const context = React.useContext(SidebarContext)
51
+ if (!context) {
52
+ throw new Error('useSidebar must be used within a SidebarProvider.')
53
+ }
54
+
55
+ return context
56
+ }
57
+
58
+ function SidebarProvider({
59
+ defaultOpen = true,
60
+ open: openProp,
61
+ onOpenChange: setOpenProp,
62
+ className,
63
+ style,
64
+ children,
65
+ ...props
66
+ }: React.ComponentProps<'div'> & {
67
+ defaultOpen?: boolean
68
+ open?: boolean
69
+ onOpenChange?: (open: boolean) => void
70
+ }) {
71
+ const isMobile = useIsMobile()
72
+ const [openMobile, setOpenMobile] = React.useState(false)
73
+
74
+ // This is the internal state of the sidebar.
75
+ // We use openProp and setOpenProp for control from outside the component.
76
+ const [_open, _setOpen] = React.useState(defaultOpen)
77
+ const open = openProp ?? _open
78
+ const setOpen = React.useCallback(
79
+ (value: boolean | ((value: boolean) => boolean)) => {
80
+ const openState = typeof value === 'function' ? value(open) : value
81
+ if (setOpenProp) {
82
+ setOpenProp(openState)
83
+ } else {
84
+ _setOpen(openState)
85
+ }
86
+
87
+ const cookieStore = (window as WindowWithCookieStore).cookieStore
88
+ void cookieStore?.set({
89
+ name: SIDEBAR_COOKIE_NAME,
90
+ value: String(openState),
91
+ path: '/',
92
+ expires: Date.now() + SIDEBAR_COOKIE_MAX_AGE * 1000
93
+ })
94
+ },
95
+ [setOpenProp, open]
96
+ )
97
+
98
+ // Helper to toggle the sidebar.
99
+ const toggleSidebar = React.useCallback(() => {
100
+ return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open)
101
+ }, [isMobile, setOpen])
102
+
103
+ // Adds a keyboard shortcut to toggle the sidebar.
104
+ React.useEffect(() => {
105
+ const handleKeyDown = (event: KeyboardEvent) => {
106
+ if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
107
+ event.preventDefault()
108
+ toggleSidebar()
109
+ }
110
+ }
111
+
112
+ window.addEventListener('keydown', handleKeyDown)
113
+ return () => window.removeEventListener('keydown', handleKeyDown)
114
+ }, [toggleSidebar])
115
+
116
+ // We add a state so that we can do data-state="expanded" or "collapsed".
117
+ // This makes it easier to style the sidebar with Tailwind classes.
118
+ const state = open ? 'expanded' : 'collapsed'
119
+
120
+ const contextValue = React.useMemo<SidebarContextProps>(
121
+ () => ({
122
+ state,
123
+ open,
124
+ setOpen,
125
+ isMobile,
126
+ openMobile,
127
+ setOpenMobile,
128
+ toggleSidebar
129
+ }),
130
+ [state, open, setOpen, isMobile, openMobile, toggleSidebar]
131
+ )
132
+
133
+ return (
134
+ <SidebarContext.Provider value={contextValue}>
135
+ <div
136
+ data-slot="sidebar-wrapper"
137
+ style={
138
+ {
139
+ '--sidebar-width': SIDEBAR_WIDTH,
140
+ '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
141
+ ...style
142
+ } as React.CSSProperties
143
+ }
144
+ className={cn(
145
+ 'group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar',
146
+ className
147
+ )}
148
+ {...props}
149
+ >
150
+ {children}
151
+ </div>
152
+ </SidebarContext.Provider>
153
+ )
154
+ }
155
+
156
+ function Sidebar({
157
+ side = 'left',
158
+ variant = 'sidebar',
159
+ collapsible = 'offcanvas',
160
+ className,
161
+ children,
162
+ dir,
163
+ ...props
164
+ }: React.ComponentProps<'div'> & {
165
+ side?: 'left' | 'right'
166
+ variant?: 'sidebar' | 'floating' | 'inset'
167
+ collapsible?: 'offcanvas' | 'icon' | 'none'
168
+ }) {
169
+ const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
170
+
171
+ if (collapsible === 'none') {
172
+ return (
173
+ <div
174
+ data-slot="sidebar"
175
+ className={cn(
176
+ 'flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground',
177
+ className
178
+ )}
179
+ {...props}
180
+ >
181
+ {children}
182
+ </div>
183
+ )
184
+ }
185
+
186
+ if (isMobile) {
187
+ return (
188
+ <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
189
+ <SheetContent
190
+ dir={dir}
191
+ data-sidebar="sidebar"
192
+ data-slot="sidebar"
193
+ data-mobile="true"
194
+ className="w-(--sidebar-width) bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
195
+ style={
196
+ {
197
+ '--sidebar-width': SIDEBAR_WIDTH_MOBILE
198
+ } as React.CSSProperties
199
+ }
200
+ side={side}
201
+ >
202
+ <SheetHeader className="sr-only">
203
+ <SheetTitle>Sidebar</SheetTitle>
204
+ <SheetDescription>Displays the mobile sidebar.</SheetDescription>
205
+ </SheetHeader>
206
+ <div className="flex h-full w-full flex-col">{children}</div>
207
+ </SheetContent>
208
+ </Sheet>
209
+ )
210
+ }
211
+
212
+ return (
213
+ <div
214
+ className="group peer hidden text-sidebar-foreground md:block"
215
+ data-state={state}
216
+ data-collapsible={state === 'collapsed' ? collapsible : ''}
217
+ data-variant={variant}
218
+ data-side={side}
219
+ data-slot="sidebar"
220
+ >
221
+ {/* This is what handles the sidebar gap on desktop */}
222
+ <div
223
+ data-slot="sidebar-gap"
224
+ className={cn(
225
+ 'relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear',
226
+ 'group-data-[collapsible=offcanvas]:w-0',
227
+ 'group-data-[side=right]:rotate-180',
228
+ {
229
+ 'group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]':
230
+ variant === 'floating' || variant === 'inset',
231
+ 'group-data-[collapsible=icon]:w-(--sidebar-width-icon)':
232
+ variant !== 'floating' && variant !== 'inset'
233
+ }
234
+ )}
235
+ />
236
+ <div
237
+ data-slot="sidebar-container"
238
+ data-side={side}
239
+ className={cn(
240
+ 'fixed inset-y-0 border-border/80 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex',
241
+ // Adjust the padding for floating and inset variants.
242
+ variant === 'floating' || variant === 'inset'
243
+ ? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'
244
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',
245
+ className
246
+ )}
247
+ {...props}
248
+ >
249
+ <div
250
+ data-sidebar="sidebar"
251
+ data-slot="sidebar-inner"
252
+ className="flex size-full flex-col bg-sidebar group-data-[variant=floating]:rounded-full group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border"
253
+ >
254
+ {children}
255
+ </div>
256
+ </div>
257
+ </div>
258
+ )
259
+ }
260
+
261
+ function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {
262
+ const { toggleSidebar } = useSidebar()
263
+
264
+ return (
265
+ <Button
266
+ data-sidebar="trigger"
267
+ data-slot="sidebar-trigger"
268
+ variant="ghost"
269
+ size="icon-sm"
270
+ className={cn(className)}
271
+ onClick={(event) => {
272
+ onClick?.(event)
273
+ toggleSidebar()
274
+ }}
275
+ {...props}
276
+ >
277
+ <PanelLeftIcon />
278
+ <span className="sr-only">Toggle Sidebar</span>
279
+ </Button>
280
+ )
281
+ }
282
+
283
+ function SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {
284
+ const { toggleSidebar } = useSidebar()
285
+
286
+ return (
287
+ <button
288
+ data-sidebar="rail"
289
+ data-slot="sidebar-rail"
290
+ aria-label="Toggle Sidebar"
291
+ tabIndex={-1}
292
+ onClick={toggleSidebar}
293
+ title="Toggle Sidebar"
294
+ className={cn(
295
+ 'absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2',
296
+ 'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',
297
+ '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',
298
+ 'group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar',
299
+ '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',
300
+ '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',
301
+ className
302
+ )}
303
+ {...props}
304
+ />
305
+ )
306
+ }
307
+
308
+ function SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {
309
+ return (
310
+ <main
311
+ data-slot="sidebar-inset"
312
+ className={cn(
313
+ 'relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-lg md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
314
+ className
315
+ )}
316
+ {...props}
317
+ />
318
+ )
319
+ }
320
+
321
+ function SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {
322
+ return (
323
+ <Input
324
+ data-slot="sidebar-input"
325
+ data-sidebar="input"
326
+ className={cn('h-8 w-full bg-background shadow-none', className)}
327
+ {...props}
328
+ />
329
+ )
330
+ }
331
+
332
+ function SidebarHeader({ className, ...props }: React.ComponentProps<'div'>) {
333
+ return (
334
+ <div
335
+ data-slot="sidebar-header"
336
+ data-sidebar="header"
337
+ className={cn('flex flex-col gap-2 p-2 [--radius:var(--radius-xl)]', className)}
338
+ {...props}
339
+ />
340
+ )
341
+ }
342
+
343
+ function SidebarFooter({ className, ...props }: React.ComponentProps<'div'>) {
344
+ return (
345
+ <div
346
+ data-slot="sidebar-footer"
347
+ data-sidebar="footer"
348
+ className={cn('flex flex-col gap-2 p-2', className)}
349
+ {...props}
350
+ />
351
+ )
352
+ }
353
+
354
+ function SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {
355
+ return (
356
+ <Separator
357
+ data-slot="sidebar-separator"
358
+ data-sidebar="separator"
359
+ className={cn('mx-2 w-auto bg-sidebar-border', className)}
360
+ {...props}
361
+ />
362
+ )
363
+ }
364
+
365
+ function SidebarContent({ className, ...props }: React.ComponentProps<'div'>) {
366
+ return (
367
+ <div
368
+ data-slot="sidebar-content"
369
+ data-sidebar="content"
370
+ className={cn(
371
+ 'no-scrollbar flex min-h-0 flex-1 flex-col gap-2 overflow-auto [--radius:var(--radius-xl)] group-data-[collapsible=icon]:overflow-hidden',
372
+ className
373
+ )}
374
+ {...props}
375
+ />
376
+ )
377
+ }
378
+
379
+ function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>) {
380
+ return (
381
+ <div
382
+ data-slot="sidebar-group"
383
+ data-sidebar="group"
384
+ className={cn('relative flex w-full min-w-0 flex-col p-2', className)}
385
+ {...props}
386
+ />
387
+ )
388
+ }
389
+
390
+ function SidebarGroupLabel({
391
+ className,
392
+ asChild = false,
393
+ ...props
394
+ }: React.ComponentProps<'div'> & { asChild?: boolean }) {
395
+ const Comp = asChild ? Slot.Root : 'div'
396
+
397
+ return (
398
+ <Comp
399
+ data-slot="sidebar-group-label"
400
+ data-sidebar="group-label"
401
+ className={cn(
402
+ 'flex h-8 shrink-0 items-center rounded-full px-3 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0 focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
403
+ className
404
+ )}
405
+ {...props}
406
+ />
407
+ )
408
+ }
409
+
410
+ function SidebarGroupAction({
411
+ className,
412
+ asChild = false,
413
+ ...props
414
+ }: React.ComponentProps<'button'> & { asChild?: boolean }) {
415
+ const Comp = asChild ? Slot.Root : 'button'
416
+
417
+ return (
418
+ <Comp
419
+ data-slot="sidebar-group-action"
420
+ data-sidebar="group-action"
421
+ className={cn(
422
+ 'absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-full p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
423
+ className
424
+ )}
425
+ {...props}
426
+ />
427
+ )
428
+ }
429
+
430
+ function SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>) {
431
+ return (
432
+ <div
433
+ data-slot="sidebar-group-content"
434
+ data-sidebar="group-content"
435
+ className={cn('w-full text-sm', className)}
436
+ {...props}
437
+ />
438
+ )
439
+ }
440
+
441
+ function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>) {
442
+ return (
443
+ <ul
444
+ data-slot="sidebar-menu"
445
+ data-sidebar="menu"
446
+ className={cn('flex w-full min-w-0 flex-col gap-1', className)}
447
+ {...props}
448
+ />
449
+ )
450
+ }
451
+
452
+ function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {
453
+ return (
454
+ <li
455
+ data-slot="sidebar-menu-item"
456
+ data-sidebar="menu-item"
457
+ className={cn('group/menu-item relative', className)}
458
+ {...props}
459
+ />
460
+ )
461
+ }
462
+
463
+ const sidebarMenuButtonVariants = cva(
464
+ 'peer/menu-button group/menu-button font-medium flex w-full items-center gap-2 overflow-hidden rounded-full px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! 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 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground text-sidebar-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate',
465
+ {
466
+ variants: {
467
+ variant: {
468
+ default: 'hover:bg-sidebar-accent/60 hover:text-sidebar-accent-foreground',
469
+ outline:
470
+ '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))]'
471
+ },
472
+ size: {
473
+ default: 'h-8 text-sm',
474
+ sm: 'h-8 text-xs',
475
+ lg: 'h-14 px-3 text-sm group-data-[collapsible=icon]:p-0!'
476
+ }
477
+ },
478
+ defaultVariants: {
479
+ variant: 'default',
480
+ size: 'default'
481
+ }
482
+ }
483
+ )
484
+
485
+ function SidebarMenuButton({
486
+ asChild = false,
487
+ isActive = false,
488
+ variant = 'default',
489
+ size = 'default',
490
+ tooltip,
491
+ className,
492
+ ...props
493
+ }: React.ComponentProps<'button'> & {
494
+ asChild?: boolean
495
+ isActive?: boolean
496
+ tooltip?: string | React.ComponentProps<typeof TooltipContent>
497
+ } & VariantProps<typeof sidebarMenuButtonVariants>) {
498
+ const Comp = asChild ? Slot.Root : 'button'
499
+ const { isMobile, state } = useSidebar()
500
+
501
+ const button = (
502
+ <Comp
503
+ data-slot="sidebar-menu-button"
504
+ data-sidebar="menu-button"
505
+ data-size={size}
506
+ data-active={isActive}
507
+ className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
508
+ {...props}
509
+ />
510
+ )
511
+
512
+ if (!tooltip) {
513
+ return button
514
+ }
515
+
516
+ if (typeof tooltip === 'string') {
517
+ tooltip = {
518
+ children: tooltip
519
+ }
520
+ }
521
+
522
+ return (
523
+ <Tooltip>
524
+ <TooltipTrigger asChild>{button}</TooltipTrigger>
525
+ <TooltipContent
526
+ side="right"
527
+ align="center"
528
+ hidden={state !== 'collapsed' || isMobile}
529
+ {...tooltip}
530
+ />
531
+ </Tooltip>
532
+ )
533
+ }
534
+
535
+ function SidebarMenuAction({
536
+ className,
537
+ asChild = false,
538
+ showOnHover = false,
539
+ ...props
540
+ }: React.ComponentProps<'button'> & {
541
+ asChild?: boolean
542
+ showOnHover?: boolean
543
+ }) {
544
+ const Comp = asChild ? Slot.Root : 'button'
545
+
546
+ return (
547
+ <Comp
548
+ data-slot="sidebar-menu-action"
549
+ data-sidebar="menu-action"
550
+ className={cn(
551
+ 'absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-full p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-2 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0',
552
+ {
553
+ 'group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0':
554
+ showOnHover
555
+ },
556
+ className
557
+ )}
558
+ {...props}
559
+ />
560
+ )
561
+ }
562
+
563
+ function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>) {
564
+ return (
565
+ <div
566
+ data-slot="sidebar-menu-badge"
567
+ data-sidebar="menu-badge"
568
+ className={cn(
569
+ 'pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-full px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground',
570
+ className
571
+ )}
572
+ {...props}
573
+ />
574
+ )
575
+ }
576
+
577
+ function SidebarMenuSkeleton({
578
+ className,
579
+ showIcon = false,
580
+ ...props
581
+ }: React.ComponentProps<'div'> & {
582
+ showIcon?: boolean
583
+ }) {
584
+ // Random width between 50 to 90%.
585
+ const [width] = React.useState(() => {
586
+ return `${Math.floor(Math.random() * 40) + 50}%`
587
+ })
588
+
589
+ return (
590
+ <div
591
+ data-slot="sidebar-menu-skeleton"
592
+ data-sidebar="menu-skeleton"
593
+ className={cn('flex h-8 items-center gap-2 rounded-full px-2', className)}
594
+ {...props}
595
+ >
596
+ {showIcon && <Skeleton className="size-4 rounded-full" data-sidebar="menu-skeleton-icon" />}
597
+ <Skeleton
598
+ className="h-4 max-w-(--skeleton-width) flex-1"
599
+ data-sidebar="menu-skeleton-text"
600
+ style={
601
+ {
602
+ '--skeleton-width': width
603
+ } as React.CSSProperties
604
+ }
605
+ />
606
+ </div>
607
+ )
608
+ }
609
+
610
+ function SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {
611
+ return (
612
+ <ul
613
+ data-slot="sidebar-menu-sub"
614
+ data-sidebar="menu-sub"
615
+ className={cn(
616
+ '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 group-data-[collapsible=icon]:hidden',
617
+ className
618
+ )}
619
+ {...props}
620
+ />
621
+ )
622
+ }
623
+
624
+ function SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>) {
625
+ return (
626
+ <li
627
+ data-slot="sidebar-menu-sub-item"
628
+ data-sidebar="menu-sub-item"
629
+ className={cn('group/menu-sub-item relative', className)}
630
+ {...props}
631
+ />
632
+ )
633
+ }
634
+
635
+ function SidebarMenuSubButton({
636
+ asChild = false,
637
+ size = 'md',
638
+ isActive = false,
639
+ className,
640
+ ...props
641
+ }: React.ComponentProps<'a'> & {
642
+ asChild?: boolean
643
+ size?: 'sm' | 'md'
644
+ isActive?: boolean
645
+ }) {
646
+ const Comp = asChild ? Slot.Root : 'a'
647
+
648
+ return (
649
+ <Comp
650
+ data-slot="sidebar-menu-sub-button"
651
+ data-sidebar="menu-sub-button"
652
+ data-size={size}
653
+ data-active={isActive}
654
+ className={cn(
655
+ 'flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-full px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden 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 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-accent data-active:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-foreground',
656
+ className
657
+ )}
658
+ {...props}
659
+ />
660
+ )
661
+ }
662
+
663
+ export {
664
+ Sidebar,
665
+ SidebarContent,
666
+ SidebarFooter,
667
+ SidebarGroup,
668
+ SidebarGroupAction,
669
+ SidebarGroupContent,
670
+ SidebarGroupLabel,
671
+ SidebarHeader,
672
+ SidebarInput,
673
+ SidebarInset,
674
+ SidebarMenu,
675
+ SidebarMenuAction,
676
+ SidebarMenuBadge,
677
+ SidebarMenuButton,
678
+ SidebarMenuItem,
679
+ SidebarMenuSkeleton,
680
+ SidebarMenuSub,
681
+ SidebarMenuSubButton,
682
+ SidebarMenuSubItem,
683
+ SidebarProvider,
684
+ SidebarRail,
685
+ SidebarSeparator,
686
+ SidebarTrigger,
687
+ useSidebar
688
+ }
@@ -0,0 +1,13 @@
1
+ import { cn } from '@admin/utils/shared/cn'
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<'div'>) {
4
+ return (
5
+ <div
6
+ data-slot="skeleton"
7
+ className={cn('animate-pulse rounded-lg bg-secondary', className)}
8
+ {...props}
9
+ />
10
+ )
11
+ }
12
+
13
+ export { Skeleton }