convex-cms 0.0.5-alpha.0 → 0.0.5-alpha.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 (323) hide show
  1. package/README.md +95 -144
  2. package/admin/README.md +99 -0
  3. package/admin/src/components/AdminLayout.tsx +22 -0
  4. package/admin/src/components/BreakingChangesWarningDialog.tsx +81 -0
  5. package/admin/src/components/BulkActionBar.tsx +190 -0
  6. package/admin/src/components/BulkOperationModal.tsx +177 -0
  7. package/admin/src/components/ContentEntryEditor.tsx +1104 -0
  8. package/admin/src/components/ContentTypeFormModal.tsx +1012 -0
  9. package/admin/src/components/ErrorBoundary.tsx +83 -0
  10. package/admin/src/components/ErrorState.tsx +147 -0
  11. package/admin/src/components/Header.tsx +294 -0
  12. package/admin/src/components/RouteGuard.tsx +264 -0
  13. package/admin/src/components/Sidebar.tsx +90 -0
  14. package/admin/src/components/TaxonomyEditor.tsx +348 -0
  15. package/admin/src/components/TermTree.tsx +533 -0
  16. package/admin/src/components/UploadDropzone.tsx +383 -0
  17. package/admin/src/components/VersionCompare.tsx +250 -0
  18. package/admin/src/components/VersionHistory.tsx +279 -0
  19. package/admin/src/components/VersionRollbackModal.tsx +79 -0
  20. package/admin/src/components/cmsds/CmsButton.tsx +101 -0
  21. package/admin/src/components/cmsds/CmsDialog.tsx +139 -0
  22. package/admin/src/components/cmsds/CmsDropdown.tsx +62 -0
  23. package/admin/src/components/cmsds/CmsEmptyState.tsx +54 -0
  24. package/admin/src/components/cmsds/CmsField.tsx +47 -0
  25. package/admin/src/components/cmsds/CmsPageHeader.tsx +35 -0
  26. package/admin/src/components/cmsds/CmsStatusBadge.tsx +153 -0
  27. package/admin/src/components/cmsds/CmsSurface.tsx +52 -0
  28. package/admin/src/components/cmsds/CmsTable.tsx +164 -0
  29. package/admin/src/components/cmsds/CmsToolbar.tsx +58 -0
  30. package/admin/src/components/cmsds/index.ts +10 -0
  31. package/admin/src/components/fields/BooleanField.tsx +74 -0
  32. package/admin/src/components/fields/CategoryField.tsx +394 -0
  33. package/admin/src/components/fields/DateField.tsx +173 -0
  34. package/admin/src/components/fields/DefaultFieldRenderer.tsx +74 -0
  35. package/admin/src/components/fields/FieldRenderer.tsx +180 -0
  36. package/admin/src/components/fields/FieldWrapper.tsx +57 -0
  37. package/admin/src/components/fields/JsonField.tsx +172 -0
  38. package/admin/src/components/fields/MediaField.tsx +367 -0
  39. package/admin/src/components/fields/MultiSelectField.tsx +118 -0
  40. package/admin/src/components/fields/NumberField.tsx +77 -0
  41. package/admin/src/components/fields/ReferenceField.tsx +386 -0
  42. package/admin/src/components/fields/RichTextField.tsx +171 -0
  43. package/admin/src/components/fields/SelectField.tsx +62 -0
  44. package/admin/src/components/fields/TagField.tsx +325 -0
  45. package/admin/src/components/fields/TextAreaField.tsx +68 -0
  46. package/admin/src/components/fields/TextField.tsx +56 -0
  47. package/admin/src/components/fields/index.ts +54 -0
  48. package/admin/src/components/fields/registry.ts +64 -0
  49. package/admin/src/components/fields/types.ts +217 -0
  50. package/admin/src/components/filters/TaxonomyFilter.tsx +254 -0
  51. package/admin/src/components/filters/index.ts +1 -0
  52. package/admin/src/components/index.ts +8 -0
  53. package/admin/src/components/media/MediaAssetActions.tsx +115 -0
  54. package/admin/src/components/media/MediaAssetEditDialog.tsx +217 -0
  55. package/admin/src/components/media/MediaBulkActionBar.tsx +51 -0
  56. package/admin/src/components/media/MediaFolderActions.tsx +69 -0
  57. package/admin/src/components/media/MediaFolderEditDialog.tsx +126 -0
  58. package/admin/src/components/media/MediaMoveModal.tsx +179 -0
  59. package/admin/src/components/media/MediaPreviewModal.tsx +370 -0
  60. package/admin/src/components/media/MediaTaxonomyPicker.tsx +304 -0
  61. package/admin/src/components/media/MediaTrashBulkActionBar.tsx +59 -0
  62. package/admin/src/components/ui/accordion.tsx +64 -0
  63. package/admin/src/components/ui/alert-dialog.tsx +155 -0
  64. package/admin/src/components/ui/alert.tsx +66 -0
  65. package/admin/src/components/ui/avatar.tsx +53 -0
  66. package/admin/src/components/ui/badge.tsx +46 -0
  67. package/admin/src/components/ui/breadcrumb.tsx +109 -0
  68. package/admin/src/components/ui/button.tsx +62 -0
  69. package/admin/src/components/ui/calendar.tsx +220 -0
  70. package/admin/src/components/ui/card.tsx +92 -0
  71. package/admin/src/components/ui/checkbox.tsx +30 -0
  72. package/admin/src/components/ui/command.tsx +182 -0
  73. package/admin/src/components/ui/dialog.tsx +143 -0
  74. package/admin/src/components/ui/dropdown-menu.tsx +257 -0
  75. package/admin/src/components/ui/form.tsx +167 -0
  76. package/admin/src/components/ui/input.tsx +21 -0
  77. package/admin/src/components/ui/label.tsx +24 -0
  78. package/admin/src/components/ui/popover.tsx +46 -0
  79. package/admin/src/components/ui/scroll-area.tsx +56 -0
  80. package/admin/src/components/ui/select.tsx +190 -0
  81. package/admin/src/components/ui/separator.tsx +26 -0
  82. package/admin/src/components/ui/sheet.tsx +137 -0
  83. package/admin/src/components/ui/sidebar.tsx +724 -0
  84. package/admin/src/components/ui/skeleton.tsx +13 -0
  85. package/admin/src/components/ui/sonner.tsx +38 -0
  86. package/admin/src/components/ui/switch.tsx +31 -0
  87. package/admin/src/components/ui/table.tsx +114 -0
  88. package/admin/src/components/ui/tabs.tsx +66 -0
  89. package/admin/src/components/ui/textarea.tsx +18 -0
  90. package/admin/src/components/ui/tooltip.tsx +61 -0
  91. package/admin/src/contexts/AdminConfigContext.tsx +30 -0
  92. package/admin/src/contexts/AuthContext.tsx +330 -0
  93. package/admin/src/contexts/BreadcrumbContext.tsx +49 -0
  94. package/admin/src/contexts/SettingsConfigContext.tsx +57 -0
  95. package/admin/src/contexts/ThemeContext.tsx +91 -0
  96. package/admin/src/contexts/index.ts +20 -0
  97. package/admin/src/embed/components/EmbedHeader.tsx +103 -0
  98. package/admin/src/embed/components/EmbedLayout.tsx +29 -0
  99. package/admin/src/embed/components/EmbedSidebar.tsx +119 -0
  100. package/admin/src/embed/components/index.ts +3 -0
  101. package/admin/src/embed/contexts/ApiContext.tsx +32 -0
  102. package/admin/src/embed/index.tsx +184 -0
  103. package/admin/src/embed/navigation.tsx +202 -0
  104. package/admin/src/embed/pages/Content.tsx +19 -0
  105. package/admin/src/embed/pages/ContentTypes.tsx +19 -0
  106. package/admin/src/embed/pages/Dashboard.tsx +19 -0
  107. package/admin/src/embed/pages/Media.tsx +19 -0
  108. package/admin/src/embed/pages/Settings.tsx +22 -0
  109. package/admin/src/embed/pages/Taxonomies.tsx +22 -0
  110. package/admin/src/embed/pages/Trash.tsx +22 -0
  111. package/admin/src/embed/pages/index.ts +7 -0
  112. package/admin/src/embed/types.ts +24 -0
  113. package/admin/src/hooks/index.ts +2 -0
  114. package/admin/src/hooks/use-mobile.ts +19 -0
  115. package/admin/src/hooks/useBreadcrumbLabel.ts +15 -0
  116. package/admin/src/hooks/usePermissions.ts +211 -0
  117. package/admin/src/lib/admin-config.ts +111 -0
  118. package/admin/src/lib/cn.ts +6 -0
  119. package/admin/src/lib/config.server.ts +56 -0
  120. package/admin/src/lib/convex.ts +26 -0
  121. package/admin/src/lib/embed-adapter.ts +80 -0
  122. package/admin/src/lib/icons.tsx +96 -0
  123. package/admin/src/lib/loadAdminConfig.ts +92 -0
  124. package/admin/src/lib/motion.ts +29 -0
  125. package/admin/src/lib/navigation.ts +43 -0
  126. package/admin/src/lib/tanstack-adapter.ts +82 -0
  127. package/admin/src/pages/ContentPage.tsx +337 -0
  128. package/admin/src/pages/ContentTypesPage.tsx +457 -0
  129. package/admin/src/pages/DashboardPage.tsx +163 -0
  130. package/admin/src/pages/MediaPage.tsx +34 -0
  131. package/admin/src/pages/SettingsPage.tsx +486 -0
  132. package/admin/src/pages/TaxonomiesPage.tsx +289 -0
  133. package/admin/src/pages/TrashPage.tsx +421 -0
  134. package/admin/src/pages/index.ts +14 -0
  135. package/admin/src/routeTree.gen.ts +262 -0
  136. package/admin/src/router.tsx +22 -0
  137. package/admin/src/routes/__root.tsx +250 -0
  138. package/admin/src/routes/content-types.tsx +20 -0
  139. package/admin/src/routes/content.tsx +20 -0
  140. package/admin/src/routes/entries/$entryId.tsx +107 -0
  141. package/admin/src/routes/entries/new.$contentTypeId.tsx +69 -0
  142. package/admin/src/routes/entries/type/$contentTypeId.tsx +503 -0
  143. package/admin/src/routes/index.tsx +20 -0
  144. package/admin/src/routes/media.tsx +1095 -0
  145. package/admin/src/routes/settings.tsx +20 -0
  146. package/admin/src/routes/taxonomies.tsx +20 -0
  147. package/admin/src/routes/trash.tsx +20 -0
  148. package/admin/src/styles/globals.css +69 -0
  149. package/admin/src/styles/tailwind-config.css +74 -0
  150. package/admin/src/styles/theme.css +73 -0
  151. package/admin/src/types/index.ts +221 -0
  152. package/admin/src/utils/errorParsing.ts +163 -0
  153. package/admin/src/utils/index.ts +5 -0
  154. package/admin/src/vite-env.d.ts +14 -0
  155. package/admin/tailwind.preset.cjs +102 -0
  156. package/admin-dist/nitro.json +1 -1
  157. package/admin-dist/public/assets/{CmsEmptyState-CiMQwSQV.js → CmsEmptyState-CkqBIab3.js} +1 -1
  158. package/admin-dist/public/assets/{CmsPageHeader-ohOq0luT.js → CmsPageHeader-CUtl5MMG.js} +1 -1
  159. package/admin-dist/public/assets/{CmsStatusBadge-BdNf0V9v.js → CmsStatusBadge-CUYFgEe-.js} +1 -1
  160. package/admin-dist/public/assets/{CmsSurface-CWup6Jh7.js → CmsSurface-CsJfAVa3.js} +1 -1
  161. package/admin-dist/public/assets/{CmsToolbar-cEBlCHa3.js → CmsToolbar-CnfbcxeP.js} +1 -1
  162. package/admin-dist/public/assets/{ContentEntryEditor-BY5ypfUs.js → ContentEntryEditor-BU220CCy.js} +1 -1
  163. package/admin-dist/public/assets/TaxonomyFilter-CWCxC5HZ.js +1 -0
  164. package/admin-dist/public/assets/_contentTypeId-DK8cskRt.js +1 -0
  165. package/admin-dist/public/assets/{_entryId-BpSmrfAm.js → _entryId-CuVMExbb.js} +1 -1
  166. package/admin-dist/public/assets/{alert-Bf2l8kxw.js → alert-CF1BSzGR.js} +1 -1
  167. package/admin-dist/public/assets/{badge-qPrc4AUM.js → badge-CmuOIVKp.js} +1 -1
  168. package/admin-dist/public/assets/{circle-check-big-Dgozy3vV.js → circle-check-big-BKDVG6DU.js} +1 -1
  169. package/admin-dist/public/assets/{command-QOmNhlb0.js → command-XJxnF2Sd.js} +1 -1
  170. package/admin-dist/public/assets/content-QBUxdxbS.js +1 -0
  171. package/admin-dist/public/assets/content-types-CrNEm8Hf.js +2 -0
  172. package/admin-dist/public/assets/globals-B7Wsfh_v.css +1 -0
  173. package/admin-dist/public/assets/index-C7xOwudI.js +1 -0
  174. package/admin-dist/public/assets/{label-DCsUdvFh.js → label-CHCnXeBk.js} +1 -1
  175. package/admin-dist/public/assets/{link-2-Czw1N61H.js → link-2-Bb34judH.js} +1 -1
  176. package/admin-dist/public/assets/{list-DtCsXj8-.js → list-9Pzt48ld.js} +1 -1
  177. package/admin-dist/public/assets/{main-CXgkZMhe.js → main-CjQ2VI9L.js} +3 -3
  178. package/admin-dist/public/assets/media-Dc5PWt2Q.js +1 -0
  179. package/admin-dist/public/assets/{new._contentTypeId-CoTDxKzf.js → new._contentTypeId-C_I4YxIa.js} +1 -1
  180. package/admin-dist/public/assets/{plus-xCFJK0RC.js → plus-Ceef7DHk.js} +1 -1
  181. package/admin-dist/public/assets/{rotate-ccw-DIqK63wY.js → rotate-ccw-7k7-4VUq.js} +1 -1
  182. package/admin-dist/public/assets/{scroll-area-B-yrE66a.js → scroll-area-CC6wujnp.js} +1 -1
  183. package/admin-dist/public/assets/{search-CbCbboeU.js → search-DwoUV2pv.js} +1 -1
  184. package/admin-dist/public/assets/{select-Co3TZFJb.js → select-hOZTp8aC.js} +1 -1
  185. package/admin-dist/public/assets/{settings-BspTTv_o.js → settings-t2PbCZh4.js} +1 -1
  186. package/admin-dist/public/assets/{switch-CfavASmR.js → switch-jX2pDaNU.js} +1 -1
  187. package/admin-dist/public/assets/{tabs-CN5s5u2W.js → tabs-q4EbZk7c.js} +1 -1
  188. package/admin-dist/public/assets/{tanstack-adapter-npeE3RdY.js → tanstack-adapter-B-Glm4kH.js} +1 -1
  189. package/admin-dist/public/assets/taxonomies-kyk5P4ZW.js +1 -0
  190. package/admin-dist/public/assets/{textarea-BJ0XFZpT.js → textarea-B6SfBmr0.js} +1 -1
  191. package/admin-dist/public/assets/trash-BOCnIznD.js +1 -0
  192. package/admin-dist/public/assets/{triangle-alert-BZRcqsUg.js → triangle-alert-CXFIO_Gu.js} +1 -1
  193. package/admin-dist/public/assets/{useBreadcrumbLabel-DwZlwvFF.js → useBreadcrumbLabel-_6qBagc3.js} +1 -1
  194. package/admin-dist/public/assets/{usePermissions-C1JQhfqb.js → usePermissions-M1ijZ7a6.js} +1 -1
  195. package/admin-dist/server/_ssr/{CmsButton-B45JAKR1.mjs → CmsButton-DOiTVKQq.mjs} +1 -1
  196. package/admin-dist/server/_ssr/{CmsEmptyState-D_BQFAVR.mjs → CmsEmptyState-fbnGt3LD.mjs} +2 -2
  197. package/admin-dist/server/_ssr/{CmsPageHeader-CrUZA59A.mjs → CmsPageHeader-DHRrdOZa.mjs} +1 -1
  198. package/admin-dist/server/_ssr/{CmsStatusBadge-B-sj6yaj.mjs → CmsStatusBadge-s7obWbKZ.mjs} +2 -2
  199. package/admin-dist/server/_ssr/{CmsSurface-DKJZhpjk.mjs → CmsSurface-rFoYjb62.mjs} +1 -1
  200. package/admin-dist/server/_ssr/{CmsToolbar-ByaW5iXf.mjs → CmsToolbar-zTE45z2q.mjs} +2 -2
  201. package/admin-dist/server/_ssr/{ContentEntryEditor-D3_Jb1dq.mjs → ContentEntryEditor-BLoEjT_m.mjs} +12 -12
  202. package/admin-dist/server/_ssr/{TaxonomyFilter-BRJkuCtA.mjs → TaxonomyFilter-XAtaJC2z.mjs} +5 -5
  203. package/admin-dist/server/_ssr/{_contentTypeId-B9kA6CaM.mjs → _contentTypeId-Csl4822C.mjs} +13 -13
  204. package/admin-dist/server/_ssr/{_entryId-BddcMkZN.mjs → _entryId-D8alLFBx.mjs} +15 -15
  205. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-BffZedId.mjs +4 -0
  206. package/admin-dist/server/_ssr/{command-CGtVr8Gb.mjs → command-C0Di14--.mjs} +1 -1
  207. package/admin-dist/server/_ssr/{content-D1tbeOd0.mjs → content-CT-FPsmV.mjs} +12 -55
  208. package/admin-dist/server/_ssr/{content-types-BZqY_BER.mjs → content-types-C8cBFdzE.mjs} +15 -46
  209. package/admin-dist/server/_ssr/{index-BIdq4xaC.mjs → index-BJtcrEc-.mjs} +5 -5
  210. package/admin-dist/server/_ssr/index.mjs +2 -2
  211. package/admin-dist/server/_ssr/{label-T-QNKAr6.mjs → label-qn2Afwl4.mjs} +1 -1
  212. package/admin-dist/server/_ssr/{media-C-xqjBrl.mjs → media-qv5IAsMZ.mjs} +14 -14
  213. package/admin-dist/server/_ssr/{new._contentTypeId-DWic9cRq.mjs → new._contentTypeId-DdGyrhqs.mjs} +13 -13
  214. package/admin-dist/server/_ssr/{router-D1BMAMJT.mjs → router-nSVkxb6Y.mjs} +11 -11
  215. package/admin-dist/server/_ssr/{scroll-area-C0pic_WA.mjs → scroll-area-BCinP455.mjs} +1 -1
  216. package/admin-dist/server/_ssr/{select-CqmuN2F6.mjs → select-BKQlQScw.mjs} +1 -1
  217. package/admin-dist/server/_ssr/{settings-CAkncGGV.mjs → settings-BCr2KQlk.mjs} +55 -40
  218. package/admin-dist/server/_ssr/{switch-CgmuJkT9.mjs → switch-BaOi42fE.mjs} +1 -1
  219. package/admin-dist/server/_ssr/{tabs-CnMj0aRy.mjs → tabs-DYXEi9kq.mjs} +2 -2
  220. package/admin-dist/server/_ssr/{tanstack-adapter-BXZrMauE.mjs → tanstack-adapter-Bsz8kha-.mjs} +1 -1
  221. package/admin-dist/server/_ssr/{taxonomies-thl3BfVm.mjs → taxonomies-CueMHTbE.mjs} +30 -19
  222. package/admin-dist/server/_ssr/{textarea-4K5OJgeh.mjs → textarea-CI0Jqx2x.mjs} +1 -1
  223. package/admin-dist/server/_ssr/{trash-B40Gx5zP.mjs → trash-DE6W8GoX.mjs} +20 -17
  224. package/admin-dist/server/_ssr/{useBreadcrumbLabel-rn-fL4zV.mjs → useBreadcrumbLabel-B5Yi72lM.mjs} +1 -1
  225. package/admin-dist/server/_ssr/{usePermissions-CKeM6_Vw.mjs → usePermissions-C3nZ-Izm.mjs} +1 -1
  226. package/admin-dist/server/index.mjs +183 -190
  227. package/dist/client/admin/bulk.d.ts +79 -0
  228. package/dist/client/admin/bulk.d.ts.map +1 -0
  229. package/dist/client/admin/bulk.js +72 -0
  230. package/dist/client/admin/bulk.js.map +1 -0
  231. package/dist/client/admin/contentLock.d.ts +118 -0
  232. package/dist/client/admin/contentLock.d.ts.map +1 -0
  233. package/dist/client/admin/contentLock.js +81 -0
  234. package/dist/client/admin/contentLock.js.map +1 -0
  235. package/dist/client/{adminApi.d.ts → admin/contentTypes.d.ts} +39 -1134
  236. package/dist/client/admin/contentTypes.d.ts.map +1 -0
  237. package/dist/client/admin/contentTypes.js +122 -0
  238. package/dist/client/admin/contentTypes.js.map +1 -0
  239. package/dist/client/admin/dashboard.d.ts +16 -0
  240. package/dist/client/admin/dashboard.d.ts.map +1 -0
  241. package/dist/client/admin/dashboard.js +33 -0
  242. package/dist/client/admin/dashboard.js.map +1 -0
  243. package/dist/client/admin/entries.d.ts +358 -0
  244. package/dist/client/admin/entries.d.ts.map +1 -0
  245. package/dist/client/admin/entries.js +220 -0
  246. package/dist/client/admin/entries.js.map +1 -0
  247. package/dist/client/admin/index.d.ts +6568 -0
  248. package/dist/client/admin/index.d.ts.map +1 -0
  249. package/dist/client/admin/index.js +305 -0
  250. package/dist/client/admin/index.js.map +1 -0
  251. package/dist/client/admin/media.d.ts +1038 -0
  252. package/dist/client/admin/media.d.ts.map +1 -0
  253. package/dist/client/admin/media.js +489 -0
  254. package/dist/client/admin/media.js.map +1 -0
  255. package/dist/client/admin/taxonomies.d.ts +339 -0
  256. package/dist/client/admin/taxonomies.d.ts.map +1 -0
  257. package/dist/client/admin/taxonomies.js +364 -0
  258. package/dist/client/admin/taxonomies.js.map +1 -0
  259. package/dist/client/admin/trash.d.ts +91 -0
  260. package/dist/client/admin/trash.d.ts.map +1 -0
  261. package/dist/client/admin/trash.js +71 -0
  262. package/dist/client/admin/trash.js.map +1 -0
  263. package/dist/client/admin/types.d.ts +320 -0
  264. package/dist/client/admin/types.d.ts.map +1 -0
  265. package/dist/client/admin/types.js +7 -0
  266. package/dist/client/admin/types.js.map +1 -0
  267. package/dist/client/admin/validators.d.ts +3886 -0
  268. package/dist/client/admin/validators.d.ts.map +1 -0
  269. package/dist/client/admin/validators.js +322 -0
  270. package/dist/client/admin/validators.js.map +1 -0
  271. package/dist/client/admin/versions.d.ts +106 -0
  272. package/dist/client/admin/versions.d.ts.map +1 -0
  273. package/dist/client/admin/versions.js +57 -0
  274. package/dist/client/admin/versions.js.map +1 -0
  275. package/dist/client/adminApiTypes.d.ts +27 -0
  276. package/dist/client/adminApiTypes.d.ts.map +1 -0
  277. package/dist/client/adminApiTypes.js +12 -0
  278. package/dist/client/adminApiTypes.js.map +1 -0
  279. package/dist/client/{admin-config.d.ts → adminConfig.d.ts} +2 -2
  280. package/dist/client/adminConfig.d.ts.map +1 -0
  281. package/dist/client/{admin-config.js → adminConfig.js} +1 -1
  282. package/dist/client/adminConfig.js.map +1 -0
  283. package/dist/client/agentTools.d.ts +4 -4
  284. package/dist/client/index.d.ts +2 -2
  285. package/dist/client/index.d.ts.map +1 -1
  286. package/dist/client/index.js +15 -2
  287. package/dist/client/index.js.map +1 -1
  288. package/dist/component/contentEntries.d.ts +4 -4
  289. package/dist/component/contentEntryMutations.d.ts +46 -0
  290. package/dist/component/contentEntryMutations.d.ts.map +1 -1
  291. package/dist/component/contentEntryMutations.js +1 -1
  292. package/dist/component/contentEntryMutations.js.map +1 -1
  293. package/dist/component/contentTypeMigration.d.ts +1 -1
  294. package/dist/component/contentTypeMutations.d.ts +22 -0
  295. package/dist/component/contentTypeMutations.d.ts.map +1 -1
  296. package/dist/component/contentTypeMutations.js +1 -1
  297. package/dist/component/contentTypeMutations.js.map +1 -1
  298. package/dist/component/mediaAssetMutations.d.ts +47 -0
  299. package/dist/component/mediaAssetMutations.d.ts.map +1 -1
  300. package/dist/component/mediaAssetMutations.js +1 -1
  301. package/dist/component/mediaAssetMutations.js.map +1 -1
  302. package/dist/component/schema.d.ts +9 -0
  303. package/dist/component/schema.d.ts.map +1 -1
  304. package/dist/component/schema.js +1 -1
  305. package/dist/component/schema.js.map +1 -1
  306. package/package.json +85 -3
  307. package/admin-dist/public/assets/ErrorState-C4nJ-ml4.js +0 -1
  308. package/admin-dist/public/assets/TaxonomyFilter-BgE_SR_O.js +0 -1
  309. package/admin-dist/public/assets/_contentTypeId-DtZectcC.js +0 -1
  310. package/admin-dist/public/assets/content-OEBGlxg1.js +0 -1
  311. package/admin-dist/public/assets/content-types-CjQliqVV.js +0 -2
  312. package/admin-dist/public/assets/globals-hAmgC66w.css +0 -1
  313. package/admin-dist/public/assets/index-BH_ECMhv.js +0 -1
  314. package/admin-dist/public/assets/media-DTJ3-ViE.js +0 -1
  315. package/admin-dist/public/assets/taxonomies-CgG46fIF.js +0 -1
  316. package/admin-dist/public/assets/trash-B3daldm5.js +0 -1
  317. package/admin-dist/server/_ssr/ErrorState-cI-bKLez.mjs +0 -89
  318. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dd7AmelK.mjs +0 -4
  319. package/dist/client/admin-config.d.ts.map +0 -1
  320. package/dist/client/admin-config.js.map +0 -1
  321. package/dist/client/adminApi.d.ts.map +0 -1
  322. package/dist/client/adminApi.js +0 -736
  323. package/dist/client/adminApi.js.map +0 -1
@@ -0,0 +1,486 @@
1
+ /**
2
+ * Shared Settings Page Component
3
+ *
4
+ * Manages CMS settings including appearance, features, and localization.
5
+ * Used by both CLI routes and embed pages.
6
+ */
7
+
8
+ import { useState, useEffect, useCallback } from "react";
9
+ import { useQuery, useMutation } from "convex/react";
10
+ import { RouteGuard } from "~/components";
11
+ import { usePermissions } from "~/hooks";
12
+ import { useSettingsConfig, useTheme } from "~/contexts";
13
+ import { CmsPageHeader } from "~/components/cmsds/CmsPageHeader";
14
+ import { CmsSurface } from "~/components/cmsds/CmsSurface";
15
+ import { CmsButton } from "~/components/cmsds/CmsButton";
16
+ import {
17
+ Select,
18
+ SelectContent,
19
+ SelectItem,
20
+ SelectTrigger,
21
+ SelectValue,
22
+ } from "~/components/ui/select";
23
+ import { Switch } from "~/components/ui/switch";
24
+ import { Label } from "~/components/ui/label";
25
+ import { Badge } from "~/components/ui/badge";
26
+ import { Alert, AlertDescription } from "~/components/ui/alert";
27
+ import { cn } from "~/lib/cn";
28
+ import { AlertTriangle, Check, X, Sun, Moon, Monitor } from "lucide-react";
29
+ import type { AdminNavigation } from "~/lib/navigation";
30
+ import { CmsAdminApi } from "~/embed/contexts/ApiContext";
31
+
32
+ interface Settings {
33
+ _id: string | null;
34
+ defaultLocale: string;
35
+ availableLocales: string[];
36
+ features: {
37
+ versioning: boolean;
38
+ scheduling: boolean;
39
+ localization: boolean;
40
+ mediaManagement: boolean;
41
+ };
42
+ updatedBy?: string;
43
+ _creationTime?: number;
44
+ }
45
+
46
+ const LOCALE_OPTIONS = [
47
+ { value: "en", label: "English (en)" },
48
+ { value: "es", label: "Spanish (es)" },
49
+ { value: "fr", label: "French (fr)" },
50
+ { value: "de", label: "German (de)" },
51
+ { value: "it", label: "Italian (it)" },
52
+ { value: "pt", label: "Portuguese (pt)" },
53
+ { value: "zh", label: "Chinese (zh)" },
54
+ { value: "ja", label: "Japanese (ja)" },
55
+ ];
56
+
57
+ type FeedbackStatus = "idle" | "saving" | "saved" | "error";
58
+ type Theme = "light" | "dark" | "system";
59
+
60
+ const THEME_OPTIONS: {
61
+ value: Theme;
62
+ label: string;
63
+ icon: React.ReactNode;
64
+ }[] = [
65
+ { value: "light", label: "Light", icon: <Sun className="size-4" /> },
66
+ { value: "dark", label: "Dark", icon: <Moon className="size-4" /> },
67
+ { value: "system", label: "System", icon: <Monitor className="size-4" /> },
68
+ ];
69
+
70
+ function AppearanceSection() {
71
+ const { theme, setTheme } = useTheme();
72
+
73
+ return (
74
+ <CmsSurface elevation="base" className="p-6">
75
+ <h2 className="mb-4 text-lg font-semibold text-foreground">Appearance</h2>
76
+ <div className="space-y-4">
77
+ <div className="flex items-center justify-between">
78
+ <div>
79
+ <Label className="text-sm font-medium">Theme</Label>
80
+ <p className="text-sm text-muted-foreground">
81
+ Choose your preferred color theme for the admin interface.
82
+ </p>
83
+ </div>
84
+ <div className="flex gap-1 rounded-lg border bg-muted/50 p-1">
85
+ {THEME_OPTIONS.map((option) => (
86
+ <button
87
+ key={option.value}
88
+ type="button"
89
+ onClick={() => setTheme(option.value)}
90
+ className={cn(
91
+ "flex items-center gap-2 rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
92
+ theme === option.value
93
+ ? "bg-background text-foreground shadow-sm"
94
+ : "text-muted-foreground hover:text-foreground",
95
+ )}
96
+ >
97
+ {option.icon}
98
+ {option.label}
99
+ </button>
100
+ ))}
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </CmsSurface>
105
+ );
106
+ }
107
+
108
+ export interface SettingsPageProps {
109
+ api: CmsAdminApi;
110
+ navigation: AdminNavigation;
111
+ }
112
+
113
+ export function SettingsPage({
114
+ api,
115
+ navigation: _navigation,
116
+ }: SettingsPageProps) {
117
+ const { canManageSettings } = usePermissions();
118
+ const canEdit = canManageSettings();
119
+ const { baseConfig } = useSettingsConfig();
120
+
121
+ const settings = useQuery(api.getSettings, {});
122
+ const updateSettings = useMutation(api.updateSettings);
123
+ const resetSettings = useMutation(api.resetSettings);
124
+
125
+ const [formData, setFormData] = useState<Settings | null>(null);
126
+ const [isDirty, setIsDirty] = useState(false);
127
+ const [feedbackStatus, setFeedbackStatus] = useState<FeedbackStatus>("idle");
128
+ const [errorMessage, setErrorMessage] = useState<string | null>(null);
129
+
130
+ useEffect(() => {
131
+ if (settings && !formData) {
132
+ setFormData(settings as Settings);
133
+ }
134
+ }, [settings, formData]);
135
+
136
+ useEffect(() => {
137
+ if (settings && !isDirty) {
138
+ setFormData(settings as Settings);
139
+ }
140
+ }, [settings, isDirty]);
141
+
142
+ const handleLocaleChange = useCallback(
143
+ (value: string) => {
144
+ if (!formData) return;
145
+
146
+ setFormData({
147
+ ...formData,
148
+ defaultLocale: value,
149
+ });
150
+ setIsDirty(true);
151
+ setFeedbackStatus("idle");
152
+ },
153
+ [formData],
154
+ );
155
+
156
+ const handleFeatureChange = useCallback(
157
+ (feature: keyof Settings["features"]) => {
158
+ if (!formData) return;
159
+
160
+ setFormData({
161
+ ...formData,
162
+ features: {
163
+ ...formData.features,
164
+ [feature]: !formData.features[feature],
165
+ },
166
+ });
167
+ setIsDirty(true);
168
+ setFeedbackStatus("idle");
169
+ },
170
+ [formData],
171
+ );
172
+
173
+ const handleSave = useCallback(async () => {
174
+ if (!formData || !isDirty) return;
175
+
176
+ setFeedbackStatus("saving");
177
+ setErrorMessage(null);
178
+
179
+ try {
180
+ await updateSettings({
181
+ defaultLocale: formData.defaultLocale,
182
+ features: formData.features,
183
+ });
184
+
185
+ setFeedbackStatus("saved");
186
+ setIsDirty(false);
187
+
188
+ setTimeout(() => {
189
+ setFeedbackStatus("idle");
190
+ }, 3000);
191
+ } catch (error) {
192
+ setFeedbackStatus("error");
193
+ setErrorMessage(
194
+ error instanceof Error ? error.message : "Failed to save settings",
195
+ );
196
+ }
197
+ }, [formData, isDirty, updateSettings]);
198
+
199
+ const handleReset = useCallback(async () => {
200
+ const confirmed = window.confirm(
201
+ "Are you sure you want to reset all settings to their defaults? This action cannot be undone.",
202
+ );
203
+
204
+ if (!confirmed) return;
205
+
206
+ setFeedbackStatus("saving");
207
+ setErrorMessage(null);
208
+
209
+ try {
210
+ const newSettings = await resetSettings({});
211
+ setFormData(newSettings as Settings);
212
+ setFeedbackStatus("saved");
213
+ setIsDirty(false);
214
+
215
+ setTimeout(() => {
216
+ setFeedbackStatus("idle");
217
+ }, 3000);
218
+ } catch (error) {
219
+ setFeedbackStatus("error");
220
+ setErrorMessage(
221
+ error instanceof Error ? error.message : "Failed to reset settings",
222
+ );
223
+ }
224
+ }, [resetSettings]);
225
+
226
+ const handleDiscard = useCallback(() => {
227
+ if (settings) {
228
+ setFormData(settings as Settings);
229
+ setIsDirty(false);
230
+ setFeedbackStatus("idle");
231
+ setErrorMessage(null);
232
+ }
233
+ }, [settings]);
234
+
235
+ if (settings === undefined) {
236
+ return (
237
+ <RouteGuard
238
+ requiredPermission={{ resource: "settings", action: "manage" }}
239
+ >
240
+ <div className="space-y-6 p-6">
241
+ <CmsPageHeader
242
+ title="Settings"
243
+ description="Configure your CMS settings and preferences."
244
+ />
245
+ <div className="flex flex-col items-center justify-center py-12">
246
+ <div className="size-8 animate-spin rounded-full border-2 border-muted border-t-primary" />
247
+ <p className="mt-4 text-sm text-muted-foreground">
248
+ Loading settings...
249
+ </p>
250
+ </div>
251
+ </div>
252
+ </RouteGuard>
253
+ );
254
+ }
255
+
256
+ if (settings === null && !formData) {
257
+ return (
258
+ <RouteGuard
259
+ requiredPermission={{ resource: "settings", action: "manage" }}
260
+ >
261
+ <div className="space-y-6 p-6">
262
+ <CmsPageHeader
263
+ title="Settings"
264
+ description="Configure your CMS settings and preferences."
265
+ />
266
+ <Alert variant="destructive">
267
+ <AlertTriangle className="size-4" />
268
+ <AlertDescription>
269
+ Failed to load settings. Please try refreshing the page.
270
+ </AlertDescription>
271
+ </Alert>
272
+ </div>
273
+ </RouteGuard>
274
+ );
275
+ }
276
+
277
+ return (
278
+ <RouteGuard requiredPermission={{ resource: "settings", action: "manage" }}>
279
+ <div className="space-y-6 p-6">
280
+ <div className="flex items-start justify-between">
281
+ <CmsPageHeader
282
+ title="Settings"
283
+ description="Configure your CMS settings and preferences."
284
+ />
285
+
286
+ {canEdit && (
287
+ <div className="flex items-center gap-3">
288
+ {feedbackStatus === "saved" && (
289
+ <Badge
290
+ variant="secondary"
291
+ className="gap-1 bg-emerald-100 text-emerald-700"
292
+ >
293
+ <Check className="size-3" />
294
+ Settings saved successfully
295
+ </Badge>
296
+ )}
297
+ {feedbackStatus === "error" && (
298
+ <Badge variant="destructive" className="gap-1">
299
+ <X className="size-3" />
300
+ {errorMessage || "An error occurred"}
301
+ </Badge>
302
+ )}
303
+
304
+ {isDirty && (
305
+ <CmsButton
306
+ variant="secondary"
307
+ onClick={handleDiscard}
308
+ disabled={feedbackStatus === "saving"}
309
+ >
310
+ Discard Changes
311
+ </CmsButton>
312
+ )}
313
+
314
+ <CmsButton
315
+ onClick={handleSave}
316
+ disabled={!isDirty}
317
+ loading={feedbackStatus === "saving"}
318
+ >
319
+ Save Changes
320
+ </CmsButton>
321
+ </div>
322
+ )}
323
+ </div>
324
+
325
+ <div className="space-y-6">
326
+ <AppearanceSection />
327
+
328
+ {formData?.features.localization && (
329
+ <CmsSurface elevation="base" className="p-6">
330
+ <h2 className="mb-4 text-lg font-semibold text-foreground">
331
+ General
332
+ </h2>
333
+ <div className="space-y-4">
334
+ <div className="flex items-center justify-between">
335
+ <div>
336
+ <Label className="text-sm font-medium">
337
+ Default Locale
338
+ </Label>
339
+ <p className="text-sm text-muted-foreground">
340
+ The default language for new content entries.
341
+ </p>
342
+ </div>
343
+ <Select
344
+ value={formData?.defaultLocale || "en"}
345
+ onValueChange={handleLocaleChange}
346
+ disabled={!canEdit || feedbackStatus === "saving"}
347
+ >
348
+ <SelectTrigger className="w-48">
349
+ <SelectValue />
350
+ </SelectTrigger>
351
+ <SelectContent>
352
+ {LOCALE_OPTIONS.map((option) => (
353
+ <SelectItem key={option.value} value={option.value}>
354
+ {option.label}
355
+ </SelectItem>
356
+ ))}
357
+ </SelectContent>
358
+ </Select>
359
+ </div>
360
+ </div>
361
+ </CmsSurface>
362
+ )}
363
+
364
+ <CmsSurface elevation="base" className="p-6">
365
+ <h2 className="mb-4 text-lg font-semibold text-foreground">
366
+ Features
367
+ </h2>
368
+ <div className="space-y-4">
369
+ <div className="flex items-center justify-between">
370
+ <div>
371
+ <Label className="text-sm font-medium">
372
+ Enable Versioning
373
+ </Label>
374
+ <p className="text-sm text-muted-foreground">
375
+ Track content history and enable rollback to previous
376
+ versions
377
+ </p>
378
+ </div>
379
+ <Switch
380
+ checked={formData?.features.versioning ?? true}
381
+ onCheckedChange={() => handleFeatureChange("versioning")}
382
+ disabled={!canEdit || feedbackStatus === "saving"}
383
+ />
384
+ </div>
385
+
386
+ <div className="flex items-center justify-between">
387
+ <div>
388
+ <Label className="text-sm font-medium">
389
+ Enable Scheduling
390
+ </Label>
391
+ <p className="text-sm text-muted-foreground">
392
+ Schedule content to publish at a future date and time
393
+ </p>
394
+ </div>
395
+ <Switch
396
+ checked={formData?.features.scheduling ?? true}
397
+ onCheckedChange={() => handleFeatureChange("scheduling")}
398
+ disabled={!canEdit || feedbackStatus === "saving"}
399
+ />
400
+ </div>
401
+
402
+ <div className="flex items-center justify-between">
403
+ <div>
404
+ <Label className="text-sm font-medium">
405
+ Enable Localization
406
+ </Label>
407
+ <p className="text-sm text-muted-foreground">
408
+ Support multiple languages for content entries
409
+ </p>
410
+ </div>
411
+ <Switch
412
+ checked={formData?.features.localization ?? false}
413
+ onCheckedChange={() => handleFeatureChange("localization")}
414
+ disabled={!canEdit || feedbackStatus === "saving"}
415
+ />
416
+ </div>
417
+
418
+ {baseConfig.navigation.showMedia && (
419
+ <div className="flex items-center justify-between">
420
+ <div>
421
+ <Label className="text-sm font-medium">
422
+ Enable Media Management
423
+ </Label>
424
+ <p className="text-sm text-muted-foreground">
425
+ Use the built-in media library for image and file uploads
426
+ </p>
427
+ </div>
428
+ <Switch
429
+ checked={formData?.features.mediaManagement ?? true}
430
+ onCheckedChange={() =>
431
+ handleFeatureChange("mediaManagement")
432
+ }
433
+ disabled={!canEdit || feedbackStatus === "saving"}
434
+ />
435
+ </div>
436
+ )}
437
+ </div>
438
+ </CmsSurface>
439
+
440
+ <CmsSurface elevation="base" className="p-6">
441
+ <h2 className="mb-4 text-lg font-semibold text-foreground">API</h2>
442
+ <div className="space-y-4">
443
+ <div>
444
+ <Label className="text-sm font-medium">
445
+ Convex Deployment URL
446
+ </Label>
447
+ <code className="mt-1 block rounded-md bg-muted px-3 py-2 text-sm">
448
+ {import.meta.env.VITE_CONVEX_URL || "Not configured"}
449
+ </code>
450
+ </div>
451
+ </div>
452
+ </CmsSurface>
453
+
454
+ {canEdit && (
455
+ <CmsSurface
456
+ elevation="base"
457
+ className="border-red-200 p-6 dark:border-red-900"
458
+ >
459
+ <h2 className="mb-4 text-lg font-semibold text-red-600">
460
+ Danger Zone
461
+ </h2>
462
+ <div className="flex items-center justify-between">
463
+ <div>
464
+ <Label className="text-sm font-medium">
465
+ Reset to Defaults
466
+ </Label>
467
+ <p className="text-sm text-muted-foreground">
468
+ Reset all settings to their default values. This cannot be
469
+ undone.
470
+ </p>
471
+ </div>
472
+ <CmsButton
473
+ variant="danger"
474
+ onClick={handleReset}
475
+ disabled={feedbackStatus === "saving"}
476
+ >
477
+ Reset Settings
478
+ </CmsButton>
479
+ </div>
480
+ </CmsSurface>
481
+ )}
482
+ </div>
483
+ </div>
484
+ </RouteGuard>
485
+ );
486
+ }