convex-cms 0.0.6 → 0.0.7

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 (329) hide show
  1. package/README.md +68 -101
  2. package/admin/src/components/BreakingChangesWarningDialog.tsx +5 -5
  3. package/admin/src/components/BulkOperationModal.tsx +14 -14
  4. package/admin/src/components/ContentEntryEditor.tsx +8 -8
  5. package/admin/src/components/ContentTypeFormModal.tsx +122 -82
  6. package/admin/src/components/Header.tsx +5 -2
  7. package/admin/src/components/SchemaDriftWarning.tsx +126 -0
  8. package/admin/src/components/TaxonomyEditor.tsx +2 -2
  9. package/admin/src/components/TermTree.tsx +3 -3
  10. package/admin/src/components/UploadDropzone.tsx +7 -7
  11. package/admin/src/components/VersionCompare.tsx +13 -13
  12. package/admin/src/components/VersionHistory.tsx +2 -2
  13. package/admin/src/components/VersionRollbackModal.tsx +5 -5
  14. package/admin/src/components/cmsds/CmsButton.tsx +2 -2
  15. package/admin/src/components/cmsds/CmsDialog.tsx +4 -1
  16. package/admin/src/components/cmsds/CmsStatusBadge.tsx +5 -5
  17. package/admin/src/components/fields/JsonField.tsx +1 -1
  18. package/admin/src/components/fields/ReferenceField.tsx +9 -9
  19. package/admin/src/components/fields/TagField.tsx +1 -1
  20. package/admin/src/contexts/SettingsConfigContext.tsx +10 -3
  21. package/admin/src/embed/index.tsx +29 -9
  22. package/admin/src/embed/pages/ContentTypeEntries.tsx +25 -0
  23. package/admin/src/embed/pages/Entry.tsx +114 -0
  24. package/admin/src/embed/pages/Media.tsx +3 -1
  25. package/admin/src/embed/pages/NewEntry.tsx +83 -0
  26. package/admin/src/embed/pages/index.ts +3 -0
  27. package/admin/src/pages/ContentPage.tsx +27 -20
  28. package/admin/src/pages/ContentTypeEntriesPage.tsx +466 -0
  29. package/admin/src/pages/ContentTypesPage.tsx +65 -19
  30. package/admin/src/pages/DashboardPage.tsx +3 -0
  31. package/admin/src/pages/SettingsPage.tsx +4 -4
  32. package/admin/src/pages/index.ts +1 -0
  33. package/admin/src/routes/__root.tsx +10 -10
  34. package/admin/src/routes/entries/$entryId.tsx +1 -1
  35. package/admin/src/routes/entries/type/$contentTypeId.tsx +1 -1
  36. package/admin/src/styles/globals.css +31 -5
  37. package/admin/src/styles/tailwind-config.css +25 -0
  38. package/admin/src/styles/theme.css +50 -0
  39. package/admin-dist/nitro.json +1 -1
  40. package/admin-dist/public/assets/CmsEmptyState-6-PLaXtD.js +1 -0
  41. package/admin-dist/public/assets/CmsPageHeader-SoF4Epu9.js +1 -0
  42. package/admin-dist/public/assets/CmsStatusBadge-D7kYaohx.js +1 -0
  43. package/admin-dist/public/assets/{CmsSurface-DBy5Lumx.js → CmsSurface-BvksBm6W.js} +1 -1
  44. package/admin-dist/public/assets/CmsToolbar-DlZPMe2B.js +1 -0
  45. package/admin-dist/public/assets/ContentEntryEditor-C6n9xLS9.js +4 -0
  46. package/admin-dist/public/assets/TaxonomyFilter-CFX1_g8s.js +1 -0
  47. package/admin-dist/public/assets/_contentTypeId-DTv8UoTp.js +1 -0
  48. package/admin-dist/public/assets/_entryId-D3lr5Dvy.js +1 -0
  49. package/admin-dist/public/assets/alert-BAHTL6ao.js +1 -0
  50. package/admin-dist/public/assets/badge-oJv4Eai8.js +1 -0
  51. package/admin-dist/public/assets/{circle-check-big-CpLxAvEj.js → circle-check-big-3OHxNDhO.js} +1 -1
  52. package/admin-dist/public/assets/command-DwgQs69u.js +1 -0
  53. package/admin-dist/public/assets/content-CKQ4QwW2.js +1 -0
  54. package/admin-dist/public/assets/content-types-BrttaLpc.js +1 -0
  55. package/admin-dist/public/assets/globals-CoCRjt0K.css +1 -0
  56. package/admin-dist/public/assets/index-DOkgTSx0.js +1 -0
  57. package/admin-dist/public/assets/main-DV6oxWnU.js +102 -0
  58. package/admin-dist/public/assets/media-B2i-mCbx.js +1 -0
  59. package/admin-dist/public/assets/new._contentTypeId-VF63rpic.js +1 -0
  60. package/admin-dist/public/assets/pencil-CX1CiTDD.js +1 -0
  61. package/admin-dist/public/assets/refresh-cw-Cm-YOeFI.js +1 -0
  62. package/admin-dist/public/assets/{rotate-ccw-BZpZtw0N.js → rotate-ccw-B45JsL5f.js} +1 -1
  63. package/admin-dist/public/assets/scroll-area-b3A1HHR7.js +1 -0
  64. package/admin-dist/public/assets/{search-BvgYr-c9.js → search-DKKh_DdH.js} +1 -1
  65. package/admin-dist/public/assets/settings-CGVDEV1r.js +1 -0
  66. package/admin-dist/public/assets/switch-BTMY8Qnk.js +1 -0
  67. package/admin-dist/public/assets/tabs-DUQwUoIb.js +1 -0
  68. package/admin-dist/public/assets/tanstack-adapter-f7AHmQ5L.js +1 -0
  69. package/admin-dist/public/assets/taxonomies-DvMppdiD.js +1 -0
  70. package/admin-dist/public/assets/trash-D7e0uKd9.js +1 -0
  71. package/admin-dist/public/assets/{useBreadcrumbLabel-D00rvqjw.js → useBreadcrumbLabel-CF2KYwsw.js} +1 -1
  72. package/admin-dist/public/assets/usePermissions-DWBImEOW.js +1 -0
  73. package/admin-dist/server/_chunks/_libs/@date-fns/tz.mjs +2 -2
  74. package/admin-dist/server/_chunks/_libs/@radix-ui/react-avatar.mjs +1 -1
  75. package/admin-dist/server/_chunks/_libs/@radix-ui/react-collection.mjs +1 -1
  76. package/admin-dist/server/_chunks/_libs/@radix-ui/react-context.mjs +2 -2
  77. package/admin-dist/server/_chunks/_libs/@radix-ui/react-dialog.mjs +2 -2
  78. package/admin-dist/server/_chunks/_libs/@radix-ui/react-label.mjs +1 -1
  79. package/admin-dist/server/_chunks/_libs/@radix-ui/react-menu.mjs +1 -1
  80. package/admin-dist/server/_chunks/_libs/@radix-ui/react-popover.mjs +1 -1
  81. package/admin-dist/server/_chunks/_libs/@radix-ui/react-primitive.mjs +6 -72
  82. package/admin-dist/server/_chunks/_libs/@radix-ui/react-select.mjs +1 -1
  83. package/admin-dist/server/_chunks/_libs/@radix-ui/react-separator.mjs +1 -1
  84. package/admin-dist/server/_chunks/_libs/@radix-ui/react-slot.mjs +20 -435
  85. package/admin-dist/server/_chunks/_libs/@radix-ui/react-visually-hidden.mjs +30 -3
  86. package/admin-dist/server/_chunks/_libs/@tanstack/history.mjs +0 -376
  87. package/admin-dist/server/_chunks/_libs/@tanstack/react-router.mjs +168 -383
  88. package/admin-dist/server/_chunks/_libs/@tanstack/router-core.mjs +451 -1195
  89. package/admin-dist/server/_chunks/_libs/react-dom.mjs +5 -5
  90. package/admin-dist/server/_chunks/_libs/react.mjs +2 -2
  91. package/admin-dist/server/_libs/cmdk.mjs +1 -1
  92. package/admin-dist/server/_libs/convex.mjs +3 -3
  93. package/admin-dist/server/_libs/cookie-es.mjs +1 -58
  94. package/admin-dist/server/_libs/date-fns.mjs +1 -1
  95. package/admin-dist/server/_libs/lucide-react.mjs +117 -103
  96. package/admin-dist/server/_libs/seroval-plugins.mjs +1 -58
  97. package/admin-dist/server/_libs/seroval.mjs +1 -1765
  98. package/admin-dist/server/_libs/zod.mjs +1 -1
  99. package/admin-dist/server/_ssr/CmsEmptyState-BM8DghTl.mjs +38 -0
  100. package/admin-dist/server/_ssr/{CmsPageHeader-ClNPU7Up.mjs → CmsPageHeader-BHUmrIWD.mjs} +1 -1
  101. package/admin-dist/server/_ssr/{CmsStatusBadge-CojMbrY7.mjs → CmsStatusBadge-D0Zb0oRl.mjs} +7 -7
  102. package/admin-dist/server/_ssr/{CmsSurface-Dcv440rp.mjs → CmsSurface-B2eBr-47.mjs} +1 -1
  103. package/admin-dist/server/_ssr/{CmsToolbar-BKv1nL6u.mjs → CmsToolbar-BCrwg7OL.mjs} +2 -3
  104. package/admin-dist/server/_ssr/{ContentEntryEditor-weiXSBdZ.mjs → ContentEntryEditor-Cjfm0uhr.mjs} +46 -49
  105. package/admin-dist/server/_ssr/{TaxonomyFilter-BPQ57Mwk.mjs → TaxonomyFilter-C4pD0kfM.mjs} +4 -5
  106. package/admin-dist/server/_ssr/{_contentTypeId-DyyauLOs.mjs → _contentTypeId-CiDiX-p7.mjs} +34 -43
  107. package/admin-dist/server/_ssr/{_entryId-9Cafwxmw.mjs → _entryId-9GxatOkL.mjs} +35 -47
  108. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-CC7UrHKE.mjs +4 -0
  109. package/admin-dist/server/_ssr/badge-EI998zba.mjs +39 -0
  110. package/admin-dist/server/_ssr/{command-CEf8YBxY.mjs → command-BLAWQhUw.mjs} +2 -2
  111. package/admin-dist/server/_ssr/{config.server-D7JHDcDv.mjs → config.server-BOr7Jxr4.mjs} +5 -14
  112. package/admin-dist/server/_ssr/{content-ZFWVzO25.mjs → content-BHX39L4D.mjs} +63 -63
  113. package/admin-dist/server/_ssr/content-types-DCzrBhTH.mjs +459 -0
  114. package/admin-dist/server/_ssr/{index-BlSIlH4Z.mjs → index-DwM_5VNP.mjs} +114 -30
  115. package/admin-dist/server/_ssr/index.mjs +3459 -62
  116. package/admin-dist/server/_ssr/{media-CD2_NUMw.mjs → media-CbzgTRRQ.mjs} +31 -43
  117. package/admin-dist/server/_ssr/{new._contentTypeId-dmZy6PBX.mjs → new._contentTypeId-6Ph-Gtlw.mjs} +33 -45
  118. package/admin-dist/server/_ssr/router-vd1nySeP.mjs +3041 -0
  119. package/admin-dist/server/_ssr/{scroll-area-BH_1K-WT.mjs → scroll-area--B9snFTJ.mjs} +1 -1
  120. package/admin-dist/server/_ssr/{settings-DVdsoWoh.mjs → settings-DlTO2JSj.mjs} +34 -43
  121. package/admin-dist/server/_ssr/{switch-DX_X8vZl.mjs → switch-C05NgNW0.mjs} +1 -1
  122. package/admin-dist/server/_ssr/{tabs-4FWM0sn8.mjs → tabs-DAk2J5xy.mjs} +9 -10
  123. package/admin-dist/server/_ssr/{tanstack-adapter-D3ZcKtbY.mjs → tanstack-adapter-DWbaPByn.mjs} +15 -1
  124. package/admin-dist/server/_ssr/{taxonomies-BHFfO9Yr.mjs → taxonomies-B8nqce6u.mjs} +35 -44
  125. package/admin-dist/server/_ssr/{trash-9tUB2KwI.mjs → trash-zdlZgpTo.mjs} +30 -39
  126. package/admin-dist/server/_ssr/{useBreadcrumbLabel-DVme3DSb.mjs → useBreadcrumbLabel-DpEKyG1h.mjs} +1 -1
  127. package/admin-dist/server/_ssr/{usePermissions-zAQj-ruE.mjs → usePermissions-olYRd9S9.mjs} +1 -1
  128. package/admin-dist/server/index.mjs +168 -203
  129. package/dist/cli/templates/cmsClient.d.ts +1 -1
  130. package/dist/cli/templates/cmsClient.d.ts.map +1 -1
  131. package/dist/cli/templates/cmsClient.js +30 -11
  132. package/dist/cli/templates/cmsClient.js.map +1 -1
  133. package/dist/cli/templates/cmsConfig.d.ts +1 -1
  134. package/dist/cli/templates/cmsConfig.d.ts.map +1 -1
  135. package/dist/cli/templates/cmsConfig.js +3 -3
  136. package/dist/client/admin/contentLock.d.ts +4 -4
  137. package/dist/client/admin/contentLock.d.ts.map +1 -1
  138. package/dist/client/admin/contentLock.js +1 -1
  139. package/dist/client/admin/contentLock.js.map +1 -1
  140. package/dist/client/admin/contentTypes.d.ts +328 -290
  141. package/dist/client/admin/contentTypes.d.ts.map +1 -1
  142. package/dist/client/admin/contentTypes.js +307 -9
  143. package/dist/client/admin/contentTypes.js.map +1 -1
  144. package/dist/client/admin/entries.d.ts +18 -19
  145. package/dist/client/admin/entries.d.ts.map +1 -1
  146. package/dist/client/admin/entries.js +33 -8
  147. package/dist/client/admin/entries.js.map +1 -1
  148. package/dist/client/admin/index.d.ts +694 -642
  149. package/dist/client/admin/index.d.ts.map +1 -1
  150. package/dist/client/admin/index.js +45 -5
  151. package/dist/client/admin/index.js.map +1 -1
  152. package/dist/client/admin/media.d.ts.map +1 -1
  153. package/dist/client/admin/taxonomies.d.ts.map +1 -1
  154. package/dist/client/admin/trash.d.ts +3 -4
  155. package/dist/client/admin/trash.d.ts.map +1 -1
  156. package/dist/client/admin/types.d.ts +185 -4
  157. package/dist/client/admin/types.d.ts.map +1 -1
  158. package/dist/client/admin/validators.d.ts +2009 -25
  159. package/dist/client/admin/validators.d.ts.map +1 -1
  160. package/dist/client/admin/validators.js +15 -4
  161. package/dist/client/admin/validators.js.map +1 -1
  162. package/dist/client/admin/versions.d.ts +1 -1
  163. package/dist/client/admin/versions.d.ts.map +1 -1
  164. package/dist/client/agentTools.d.ts +1 -4
  165. package/dist/client/agentTools.d.ts.map +1 -1
  166. package/dist/client/agentTools.js +9 -21
  167. package/dist/client/agentTools.js.map +1 -1
  168. package/dist/client/config.d.ts +10 -0
  169. package/dist/client/config.d.ts.map +1 -1
  170. package/dist/client/config.js +1 -0
  171. package/dist/client/config.js.map +1 -1
  172. package/dist/client/defineContent.d.ts +338 -0
  173. package/dist/client/defineContent.d.ts.map +1 -0
  174. package/dist/client/defineContent.js +368 -0
  175. package/dist/client/defineContent.js.map +1 -0
  176. package/dist/client/index.d.ts +2 -0
  177. package/dist/client/index.d.ts.map +1 -1
  178. package/dist/client/index.js +2 -0
  179. package/dist/client/index.js.map +1 -1
  180. package/dist/client/queryBuilder.d.ts +0 -15
  181. package/dist/client/queryBuilder.d.ts.map +1 -1
  182. package/dist/client/queryBuilder.js +0 -23
  183. package/dist/client/queryBuilder.js.map +1 -1
  184. package/dist/client/registry.d.ts +77 -0
  185. package/dist/client/registry.d.ts.map +1 -0
  186. package/dist/client/registry.js +95 -0
  187. package/dist/client/registry.js.map +1 -0
  188. package/dist/client/schema/defineContentType.d.ts +36 -24
  189. package/dist/client/schema/defineContentType.d.ts.map +1 -1
  190. package/dist/client/schema/defineContentType.js +176 -128
  191. package/dist/client/schema/defineContentType.js.map +1 -1
  192. package/dist/client/schema/typedClient.d.ts.map +1 -1
  193. package/dist/client/schema/typedClient.js +2 -10
  194. package/dist/client/schema/typedClient.js.map +1 -1
  195. package/dist/client/schema/types.d.ts +16 -9
  196. package/dist/client/schema/types.d.ts.map +1 -1
  197. package/dist/client/schema/types.js.map +1 -1
  198. package/dist/client/utils/toSlug.d.ts +60 -0
  199. package/dist/client/utils/toSlug.d.ts.map +1 -0
  200. package/dist/client/utils/toSlug.js +31 -0
  201. package/dist/client/utils/toSlug.js.map +1 -0
  202. package/dist/client/wrapper.d.ts +2 -2
  203. package/dist/client/wrapper.d.ts.map +1 -1
  204. package/dist/client/wrapper.js +22 -30
  205. package/dist/client/wrapper.js.map +1 -1
  206. package/dist/component/_generated/component.d.ts +24 -28
  207. package/dist/component/_generated/component.d.ts.map +1 -1
  208. package/dist/component/authorizationHooks.d.ts +1 -1
  209. package/dist/component/authorizationHooks.d.ts.map +1 -1
  210. package/dist/component/authorizationHooks.js +2 -2
  211. package/dist/component/authorizationHooks.js.map +1 -1
  212. package/dist/component/bulkOperations.d.ts.map +1 -1
  213. package/dist/component/bulkOperations.js +7 -4
  214. package/dist/component/bulkOperations.js.map +1 -1
  215. package/dist/component/contentEntries.d.ts +18 -56
  216. package/dist/component/contentEntries.d.ts.map +1 -1
  217. package/dist/component/contentEntries.js +45 -137
  218. package/dist/component/contentEntries.js.map +1 -1
  219. package/dist/component/contentEntryMutations.d.ts +14 -14
  220. package/dist/component/contentEntryMutations.d.ts.map +1 -1
  221. package/dist/component/contentEntryMutations.js +40 -43
  222. package/dist/component/contentEntryMutations.js.map +1 -1
  223. package/dist/component/contentEntryValidation.d.ts +3 -3
  224. package/dist/component/contentEntryValidation.js +6 -9
  225. package/dist/component/contentEntryValidation.js.map +1 -1
  226. package/dist/component/contentLock.d.ts +7 -7
  227. package/dist/component/contentLock.js +3 -3
  228. package/dist/component/contentLock.js.map +1 -1
  229. package/dist/component/contentTypeMigration.d.ts +1 -1
  230. package/dist/component/contentTypeMigration.js +2 -2
  231. package/dist/component/contentTypeMigration.js.map +1 -1
  232. package/dist/component/contentTypeMutations.d.ts.map +1 -1
  233. package/dist/component/contentTypeMutations.js +7 -6
  234. package/dist/component/contentTypeMutations.js.map +1 -1
  235. package/dist/component/convex.config.d.ts.map +1 -1
  236. package/dist/component/convex.config.js +1 -1
  237. package/dist/component/convex.config.js.map +1 -1
  238. package/dist/component/eventEmitter.d.ts +0 -1
  239. package/dist/component/eventEmitter.d.ts.map +1 -1
  240. package/dist/component/eventEmitter.js.map +1 -1
  241. package/dist/component/exportImport.d.ts +37 -37
  242. package/dist/component/exportImport.d.ts.map +1 -1
  243. package/dist/component/exportImport.js +34 -34
  244. package/dist/component/exportImport.js.map +1 -1
  245. package/dist/component/lib/deepReferenceResolver.d.ts +2 -2
  246. package/dist/component/lib/deepReferenceResolver.d.ts.map +1 -1
  247. package/dist/component/lib/deepReferenceResolver.js +13 -8
  248. package/dist/component/lib/deepReferenceResolver.js.map +1 -1
  249. package/dist/component/lib/ragContentChunker.d.ts +3 -3
  250. package/dist/component/lib/ragContentChunker.d.ts.map +1 -1
  251. package/dist/component/lib/ragContentChunker.js +4 -4
  252. package/dist/component/lib/ragContentChunker.js.map +1 -1
  253. package/dist/component/lib/referenceResolver.d.ts.map +1 -1
  254. package/dist/component/lib/referenceResolver.js +10 -17
  255. package/dist/component/lib/referenceResolver.js.map +1 -1
  256. package/dist/component/mediaAssetMutations.js +4 -4
  257. package/dist/component/mediaAssetMutations.js.map +1 -1
  258. package/dist/component/ragContentIndexer.d.ts +2 -2
  259. package/dist/component/ragContentIndexer.d.ts.map +1 -1
  260. package/dist/component/ragContentIndexer.js +44 -48
  261. package/dist/component/ragContentIndexer.js.map +1 -1
  262. package/dist/component/roles.d.ts +3 -3
  263. package/dist/component/scheduledPublish.d.ts +4 -4
  264. package/dist/component/scheduledPublish.js +3 -3
  265. package/dist/component/scheduledPublish.js.map +1 -1
  266. package/dist/component/schema.d.ts +18 -18
  267. package/dist/component/schema.js +5 -5
  268. package/dist/component/schema.js.map +1 -1
  269. package/dist/component/trash.d.ts +6 -9
  270. package/dist/component/trash.d.ts.map +1 -1
  271. package/dist/component/trash.js +12 -36
  272. package/dist/component/trash.js.map +1 -1
  273. package/dist/component/userContext.d.ts +1 -2
  274. package/dist/component/userContext.d.ts.map +1 -1
  275. package/dist/component/userContext.js +1 -2
  276. package/dist/component/userContext.js.map +1 -1
  277. package/dist/component/validators.d.ts +27 -33
  278. package/dist/component/validators.d.ts.map +1 -1
  279. package/dist/component/validators.js +3 -5
  280. package/dist/component/validators.js.map +1 -1
  281. package/dist/component/versionMutations.d.ts +1 -1
  282. package/dist/component/webhookTrigger.d.ts +14 -14
  283. package/dist/test.d.ts +30 -30
  284. package/dist/test.d.ts.map +1 -1
  285. package/dist/test.js +24 -24
  286. package/dist/test.js.map +1 -1
  287. package/package.json +1 -1
  288. package/admin-dist/public/assets/CmsEmptyState-Do_erIgn.js +0 -5
  289. package/admin-dist/public/assets/CmsPageHeader-qDwPGi48.js +0 -1
  290. package/admin-dist/public/assets/CmsStatusBadge-Dd9uToHE.js +0 -1
  291. package/admin-dist/public/assets/CmsToolbar-D1-Y-7SK.js +0 -1
  292. package/admin-dist/public/assets/ContentEntryEditor-CWBiIx52.js +0 -4
  293. package/admin-dist/public/assets/TaxonomyFilter-CdYQawxb.js +0 -1
  294. package/admin-dist/public/assets/_contentTypeId-D9VMP6Gs.js +0 -1
  295. package/admin-dist/public/assets/_entryId-2FlCfqE7.js +0 -1
  296. package/admin-dist/public/assets/alert-GxZx0y5c.js +0 -1
  297. package/admin-dist/public/assets/badge-BAlGIjop.js +0 -1
  298. package/admin-dist/public/assets/command-di7XCqcv.js +0 -1
  299. package/admin-dist/public/assets/content-D8zELsDG.js +0 -1
  300. package/admin-dist/public/assets/content-types-BmzD0krT.js +0 -2
  301. package/admin-dist/public/assets/globals-BvFfH-v9.css +0 -1
  302. package/admin-dist/public/assets/index-zqfj4T_v.js +0 -1
  303. package/admin-dist/public/assets/label-B6PPtKR5.js +0 -1
  304. package/admin-dist/public/assets/link-2-W2fVnVOf.js +0 -1
  305. package/admin-dist/public/assets/list-F8O0lZXC.js +0 -1
  306. package/admin-dist/public/assets/main-dZT72bAG.js +0 -97
  307. package/admin-dist/public/assets/media-CETueFbV.js +0 -1
  308. package/admin-dist/public/assets/new._contentTypeId-BV2-TyyR.js +0 -1
  309. package/admin-dist/public/assets/plus-AABQIF0N.js +0 -1
  310. package/admin-dist/public/assets/scroll-area-CDfk-zrz.js +0 -1
  311. package/admin-dist/public/assets/select-BuiHcMzS.js +0 -1
  312. package/admin-dist/public/assets/settings-DBxbYDvn.js +0 -1
  313. package/admin-dist/public/assets/switch-DiJvolcs.js +0 -1
  314. package/admin-dist/public/assets/tabs-Cgz6G_Xy.js +0 -1
  315. package/admin-dist/public/assets/tanstack-adapter-BknsSgra.js +0 -1
  316. package/admin-dist/public/assets/taxonomies-DOErsLl5.js +0 -1
  317. package/admin-dist/public/assets/textarea-CgggMxUX.js +0 -1
  318. package/admin-dist/public/assets/trash-BU4ANuaW.js +0 -1
  319. package/admin-dist/public/assets/triangle-alert-lvCbwp0s.js +0 -1
  320. package/admin-dist/public/assets/usePermissions-D7tQowaF.js +0 -1
  321. package/admin-dist/server/_libs/h3-v2.mjs +0 -277
  322. package/admin-dist/server/_ssr/CmsButton-DbzfJru_.mjs +0 -125
  323. package/admin-dist/server/_ssr/CmsEmptyState-CuvcXr3Z.mjs +0 -290
  324. package/admin-dist/server/_ssr/_tanstack-start-manifest_v-Dk-FIYPN.mjs +0 -4
  325. package/admin-dist/server/_ssr/content-types-D25lUE-j.mjs +0 -1312
  326. package/admin-dist/server/_ssr/label-PblVvdRv.mjs +0 -22
  327. package/admin-dist/server/_ssr/router-x6Ab8T4s.mjs +0 -1622
  328. package/admin-dist/server/_ssr/select-CrfEkFJw.mjs +0 -142
  329. package/admin-dist/server/_ssr/textarea-CZVaroMc.mjs +0 -18
@@ -78,11 +78,14 @@ function getBreadcrumbs(
78
78
  ): BreadcrumbData[] {
79
79
  const breadcrumbs: BreadcrumbData[] = [{ label: appName, to: '/' }]
80
80
 
81
- if (pathname === '/') {
81
+ // Decode pathname to match non-encoded override keys
82
+ const decodedPathname = decodeURIComponent(pathname)
83
+
84
+ if (decodedPathname === '/') {
82
85
  return breadcrumbs
83
86
  }
84
87
 
85
- const segments = pathname.split('/').filter(Boolean)
88
+ const segments = decodedPathname.split('/').filter(Boolean)
86
89
  let currentPath = ''
87
90
 
88
91
  segments.forEach((segment, index) => {
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Schema Drift Warning Component
3
+ *
4
+ * Displays a warning banner when code-defined content types
5
+ * are out of sync with the database schema.
6
+ */
7
+
8
+ import { useQuery, useMutation } from "convex/react";
9
+ import { Alert, AlertDescription, AlertTitle } from "~/components/ui/alert";
10
+ import { Button } from "~/components/ui/button";
11
+ import { AlertTriangle, RefreshCw, XCircle, AlertCircle } from "lucide-react";
12
+ import type { CmsAdminApi } from "~/embed/contexts/ApiContext";
13
+ import { useState } from "react";
14
+
15
+ interface DriftIssue {
16
+ type: string;
17
+ severity: "error" | "warning" | "info";
18
+ contentTypeName: string;
19
+ fieldName?: string;
20
+ message: string;
21
+ }
22
+
23
+ interface SchemaDriftWarningProps {
24
+ api: CmsAdminApi;
25
+ }
26
+
27
+ export function SchemaDriftWarning({ api }: SchemaDriftWarningProps) {
28
+ const driftResults = useQuery(api.checkSchemaDrift, {});
29
+ const syncMutation = useMutation(api.syncCodeDefinedTypes);
30
+ const [isSyncing, setIsSyncing] = useState(false);
31
+ const [syncResult, setSyncResult] = useState<{
32
+ created: number;
33
+ updated: number;
34
+ } | null>(null);
35
+
36
+ if (driftResults === undefined) {
37
+ return null;
38
+ }
39
+
40
+ if (!driftResults || driftResults.length === 0) {
41
+ if (syncResult && (syncResult.created > 0 || syncResult.updated > 0)) {
42
+ return (
43
+ <Alert className="border-success/50 bg-success/10">
44
+ <AlertCircle className="size-4 text-success" />
45
+ <AlertTitle className="text-diff-added-foreground">
46
+ Sync Complete
47
+ </AlertTitle>
48
+ <AlertDescription className="text-diff-added-foreground/80">
49
+ {syncResult.created > 0 && (
50
+ <span>{syncResult.created} content type(s) created. </span>
51
+ )}
52
+ {syncResult.updated > 0 && (
53
+ <span>{syncResult.updated} content type(s) updated.</span>
54
+ )}
55
+ </AlertDescription>
56
+ </Alert>
57
+ );
58
+ }
59
+ return null;
60
+ }
61
+
62
+ const errors = driftResults.filter((d: DriftIssue) => d.severity === "error");
63
+ const warnings = driftResults.filter((d: DriftIssue) => d.severity === "warning");
64
+
65
+ const handleSync = async () => {
66
+ setIsSyncing(true);
67
+ setSyncResult(null);
68
+ try {
69
+ const result = await syncMutation({});
70
+ setSyncResult(result);
71
+ } catch (error) {
72
+ console.error("Sync failed:", error);
73
+ } finally {
74
+ setIsSyncing(false);
75
+ }
76
+ };
77
+
78
+ const variant = errors.length > 0 ? "destructive" : "default";
79
+ const Icon = errors.length > 0 ? XCircle : AlertTriangle;
80
+ const iconColor =
81
+ errors.length > 0 ? "text-destructive" : "text-warning";
82
+
83
+ return (
84
+ <Alert variant={variant} className={errors.length === 0 ? "border-warning/50 bg-warning/10" : ""}>
85
+ <Icon className={`size-4 ${iconColor}`} />
86
+ <AlertTitle className={errors.length === 0 ? "text-diff-modified-foreground" : ""}>
87
+ Schema Drift Detected
88
+ </AlertTitle>
89
+ <AlertDescription className={errors.length === 0 ? "text-diff-modified-foreground/80" : ""}>
90
+ <div className="space-y-2">
91
+ {errors.length > 0 && (
92
+ <p>
93
+ <strong>{errors.length} error(s)</strong>:{" "}
94
+ {errors
95
+ .slice(0, 3)
96
+ .map((e: DriftIssue) => e.message)
97
+ .join(" ")}
98
+ {errors.length > 3 && ` ...and ${errors.length - 3} more`}
99
+ </p>
100
+ )}
101
+ {warnings.length > 0 && (
102
+ <p>
103
+ <strong>{warnings.length} warning(s)</strong>: Code-defined types
104
+ may need syncing.
105
+ </p>
106
+ )}
107
+ <div className="mt-3 flex items-center gap-2">
108
+ <Button
109
+ size="sm"
110
+ variant={errors.length > 0 ? "destructive" : "outline"}
111
+ onClick={handleSync}
112
+ disabled={isSyncing}
113
+ className={errors.length === 0 ? "border-warning/50 text-diff-modified-foreground hover:bg-warning/20" : ""}
114
+ >
115
+ <RefreshCw className={`mr-1.5 size-3.5 ${isSyncing ? "animate-spin" : ""}`} />
116
+ {isSyncing ? "Syncing..." : "Sync Now"}
117
+ </Button>
118
+ <span className="text-xs opacity-75">
119
+ Syncs code-defined types to the database
120
+ </span>
121
+ </div>
122
+ </div>
123
+ </AlertDescription>
124
+ </Alert>
125
+ );
126
+ }
@@ -187,7 +187,7 @@ export function TaxonomyEditor({
187
187
  >
188
188
  <form onSubmit={handleSubmit} className="space-y-4">
189
189
  {submitError && (
190
- <div className="rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800">
190
+ <div className="diff-removed rounded-lg border px-3 py-2 text-sm">
191
191
  {submitError}
192
192
  </div>
193
193
  )}
@@ -294,7 +294,7 @@ export function TaxonomyEditor({
294
294
  Terms can have parent-child relationships (like categories)
295
295
  </p>
296
296
  {isEditing && (
297
- <p className="text-xs text-amber-600">
297
+ <p className="text-xs text-warning">
298
298
  Hierarchy type cannot be changed after creation
299
299
  </p>
300
300
  )}
@@ -196,12 +196,12 @@ export function TermTree({
196
196
  </div>
197
197
 
198
198
  {error && (
199
- <div className="flex items-center justify-between rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800">
199
+ <div className="diff-removed flex items-center justify-between rounded-lg border px-3 py-2 text-sm">
200
200
  {error}
201
201
  <button
202
202
  type="button"
203
203
  onClick={() => setError(null)}
204
- className="text-red-600 hover:text-red-800"
204
+ className="text-diff-removed hover:text-diff-removed-foreground"
205
205
  >
206
206
  ×
207
207
  </button>
@@ -436,7 +436,7 @@ function TermEditModal({
436
436
  >
437
437
  <form onSubmit={handleSubmit} className="space-y-4">
438
438
  {submitError && (
439
- <div className="rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800">
439
+ <div className="diff-removed rounded-lg border px-3 py-2 text-sm">
440
440
  {submitError}
441
441
  </div>
442
442
  )}
@@ -158,10 +158,10 @@ export function UploadDropzone({
158
158
  const getStatusIcon = (status: UploadQueueFileStatus) => {
159
159
  switch (status) {
160
160
  case 'complete':
161
- return <Check className="size-4 text-emerald-500" />
161
+ return <Check className="size-4 text-success" />
162
162
  case 'error':
163
163
  case 'cancelled':
164
- return <X className="size-4 text-red-500" />
164
+ return <X className="size-4 text-destructive" />
165
165
  case 'uploading':
166
166
  return (
167
167
  <div className="size-4 animate-spin rounded-full border-2 border-muted border-t-primary" />
@@ -247,10 +247,10 @@ export function UploadDropzone({
247
247
  {!queue.isUploading && hasCompletedOrFailed && (
248
248
  <div className="flex items-center gap-2">
249
249
  {completedCount > 0 && (
250
- <span className="text-emerald-600">{completedCount} completed</span>
250
+ <span className="text-success">{completedCount} completed</span>
251
251
  )}
252
252
  {errorCount > 0 && (
253
- <span className="text-red-500">{errorCount} failed</span>
253
+ <span className="text-destructive">{errorCount} failed</span>
254
254
  )}
255
255
  </div>
256
256
  )}
@@ -293,8 +293,8 @@ export function UploadDropzone({
293
293
  key={uploadFile.id}
294
294
  className={cn(
295
295
  'flex items-center gap-3 rounded-lg border bg-card p-3',
296
- uploadFile.status === 'error' && 'border-red-200 bg-red-50 dark:border-red-900 dark:bg-red-950/20',
297
- uploadFile.status === 'complete' && 'border-emerald-200 bg-emerald-50 dark:border-emerald-900 dark:bg-emerald-950/20'
296
+ uploadFile.status === 'error' && 'border-diff-removed-border bg-diff-removed-bg',
297
+ uploadFile.status === 'complete' && 'border-diff-added-border bg-diff-added-bg'
298
298
  )}
299
299
  >
300
300
  <div className="shrink-0">{getStatusIcon(uploadFile.status)}</div>
@@ -311,7 +311,7 @@ export function UploadDropzone({
311
311
  {formatFileSize(uploadFile.file.size)}
312
312
  </span>
313
313
  {uploadFile.error && (
314
- <span className="text-xs text-red-500">{uploadFile.error}</span>
314
+ <span className="text-xs text-destructive">{uploadFile.error}</span>
315
315
  )}
316
316
  </div>
317
317
  </div>
@@ -82,11 +82,11 @@ export function VersionCompare({
82
82
  const getChangeStyles = (changeType: string) => {
83
83
  switch (changeType) {
84
84
  case 'added':
85
- return 'border-emerald-200 bg-emerald-50'
85
+ return 'diff-added border'
86
86
  case 'removed':
87
- return 'border-red-200 bg-red-50'
87
+ return 'diff-removed border'
88
88
  case 'modified':
89
- return 'border-amber-200 bg-amber-50'
89
+ return 'diff-modified border'
90
90
  default:
91
91
  return 'border-border bg-card'
92
92
  }
@@ -95,11 +95,11 @@ export function VersionCompare({
95
95
  const getChangeIconStyles = (changeType: string) => {
96
96
  switch (changeType) {
97
97
  case 'added':
98
- return 'bg-emerald-100 text-emerald-700'
98
+ return 'diff-icon-added'
99
99
  case 'removed':
100
- return 'bg-red-100 text-red-700'
100
+ return 'diff-icon-removed'
101
101
  case 'modified':
102
- return 'bg-amber-100 text-amber-700'
102
+ return 'diff-icon-modified'
103
103
  default:
104
104
  return 'bg-muted text-muted-foreground'
105
105
  }
@@ -144,7 +144,7 @@ export function VersionCompare({
144
144
  </p>
145
145
  </div>
146
146
  ) : !comparison ? (
147
- <div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-800">
147
+ <div className="diff-removed rounded-lg border px-4 py-3 text-sm">
148
148
  Could not load version comparison
149
149
  </div>
150
150
  ) : !comparison.hasChanges ? (
@@ -209,21 +209,21 @@ export function VersionCompare({
209
209
 
210
210
  <div className="mt-2 space-y-2">
211
211
  {change.changeType !== 'added' && (
212
- <div className="rounded border border-red-200 bg-white p-2">
213
- <p className="mb-1 text-xs font-medium text-red-700">
212
+ <div className="rounded border border-diff-removed-border bg-card p-2">
213
+ <p className="mb-1 text-xs font-medium text-diff-removed">
214
214
  Before:
215
215
  </p>
216
- <pre className="overflow-x-auto whitespace-pre-wrap break-words font-mono text-xs text-red-900">
216
+ <pre className="overflow-x-auto whitespace-pre-wrap break-words font-mono text-xs text-diff-removed-foreground">
217
217
  {formatValue(change.fromValue)}
218
218
  </pre>
219
219
  </div>
220
220
  )}
221
221
  {change.changeType !== 'removed' && (
222
- <div className="rounded border border-emerald-200 bg-white p-2">
223
- <p className="mb-1 text-xs font-medium text-emerald-700">
222
+ <div className="rounded border border-diff-added-border bg-card p-2">
223
+ <p className="mb-1 text-xs font-medium text-diff-added">
224
224
  After:
225
225
  </p>
226
- <pre className="overflow-x-auto whitespace-pre-wrap break-words font-mono text-xs text-emerald-900">
226
+ <pre className="overflow-x-auto whitespace-pre-wrap break-words font-mono text-xs text-diff-added-foreground">
227
227
  {formatValue(change.toValue)}
228
228
  </pre>
229
229
  </div>
@@ -149,7 +149,7 @@ export function VersionHistory({
149
149
  </div>
150
150
 
151
151
  {rollbackSuccess && (
152
- <div className="flex items-center gap-2 border-b bg-emerald-50 px-4 py-2 text-sm text-emerald-800">
152
+ <div className="flex items-center gap-2 border-b bg-diff-added-bg px-4 py-2 text-sm text-diff-added-foreground">
153
153
  <CheckCircle className="size-4" />
154
154
  Successfully rolled back to previous version
155
155
  </div>
@@ -198,7 +198,7 @@ export function VersionHistory({
198
198
  {version.wasPublished && (
199
199
  <Badge
200
200
  variant="outline"
201
- className="border-emerald-500/50 text-emerald-600"
201
+ className="border-success/50 text-success"
202
202
  >
203
203
  Published
204
204
  </Badge>
@@ -49,14 +49,14 @@ export function VersionRollbackModal({
49
49
  .
50
50
  </p>
51
51
 
52
- <div className="rounded-lg border border-amber-200 bg-amber-50 p-3">
52
+ <div className="diff-modified rounded-lg border p-3">
53
53
  <div className="flex gap-2">
54
- <AlertTriangle className="mt-0.5 size-4 shrink-0 text-amber-600" />
54
+ <AlertTriangle className="mt-0.5 size-4 shrink-0 text-diff-modified" />
55
55
  <div className="space-y-2">
56
- <p className="text-sm font-medium text-amber-800">
56
+ <p className="text-sm font-medium text-diff-modified">
57
57
  This action will:
58
58
  </p>
59
- <ul className="space-y-1 text-sm text-amber-700">
59
+ <ul className="space-y-1 text-sm text-diff-modified-foreground">
60
60
  <li>
61
61
  • Create a new version with the content from version{' '}
62
62
  {targetVersion}
@@ -69,7 +69,7 @@ export function VersionRollbackModal({
69
69
  </div>
70
70
 
71
71
  {error && (
72
- <div className="rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-800">
72
+ <div className="diff-removed rounded-lg border px-3 py-2 text-sm">
73
73
  <span className="font-medium">Error:</span> {error}
74
74
  </div>
75
75
  )}
@@ -31,9 +31,9 @@ const variantMap = {
31
31
 
32
32
  const customVariantClasses = {
33
33
  success:
34
- 'bg-emerald-600 text-white hover:bg-emerald-700 focus-visible:ring-emerald-500',
34
+ 'bg-success text-success-foreground hover:bg-success/90 focus-visible:ring-success',
35
35
  warning:
36
- 'bg-amber-500 text-white hover:bg-amber-600 focus-visible:ring-amber-500',
36
+ 'bg-warning text-warning-foreground hover:bg-warning/90 focus-visible:ring-warning',
37
37
  } as Record<string, string>
38
38
 
39
39
  const LoadingSpinner = () => (
@@ -52,7 +52,10 @@ export function CmsDialog({
52
52
  <DialogTitle>{title}</DialogTitle>
53
53
  {description && <DialogDescription>{description}</DialogDescription>}
54
54
  </DialogHeader>
55
- <div className="min-h-0 flex-1 py-4 scrollbar-none">
55
+ <div
56
+ className="min-h-0 flex-1 overflow-y-auto py-4 [&::-webkit-scrollbar]:hidden"
57
+ style={{ scrollbarWidth: 'none', msOverflowStyle: 'none' }}
58
+ >
56
59
  {children}
57
60
  </div>
58
61
  {footer && <DialogFooter className="shrink-0 border-t pt-4">{footer}</DialogFooter>}
@@ -92,12 +92,12 @@ const statusConfig: Record<
92
92
 
93
93
  const colorToClassName: Record<WorkflowStateColor, string> = {
94
94
  gray: "bg-muted text-muted-foreground",
95
- yellow: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400",
96
- blue: "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400",
97
- green: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400",
98
- red: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400",
95
+ yellow: "bg-diff-modified-bg text-diff-modified-foreground",
96
+ blue: "bg-info-bg text-info-foreground",
97
+ green: "bg-diff-added-bg text-diff-added-foreground",
98
+ red: "bg-diff-removed-bg text-diff-removed-foreground",
99
99
  purple: "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400",
100
- orange: "bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-400",
100
+ orange: "bg-diff-modified-bg text-diff-modified-foreground",
101
101
  };
102
102
 
103
103
  function getDefaultIcon() {
@@ -160,7 +160,7 @@ export function JsonField({
160
160
  </span>
161
161
  )}
162
162
  {!syntaxError && textValue.trim() !== '' && (
163
- <span className="flex items-center gap-1 text-emerald-600 dark:text-emerald-400">
163
+ <span className="flex items-center gap-1 text-success">
164
164
  <Check className="size-3" />
165
165
  Valid JSON
166
166
  </span>
@@ -113,7 +113,7 @@ export function ReferenceField({
113
113
  api.admin.listEntries,
114
114
  showPicker
115
115
  ? {
116
- contentTypeId: contentTypeFilter || undefined,
116
+ contentTypeName: contentTypeFilter || undefined,
117
117
  search: searchQuery || undefined,
118
118
  paginationOpts: { numItems: 50, cursor: null },
119
119
  }
@@ -124,15 +124,15 @@ export function ReferenceField({
124
124
  if (!entriesResult?.page) return []
125
125
  if (allowedContentTypes.length === 0) return entriesResult.page
126
126
 
127
- const allowedIds = filteredContentTypes.map((ct) => ct._id)
127
+ const allowedNames = filteredContentTypes.map((ct) => ct.name)
128
128
  return entriesResult.page.filter((entry) =>
129
- allowedIds.includes(entry.contentTypeId)
129
+ allowedNames.includes(entry.contentTypeName)
130
130
  )
131
131
  }, [entriesResult?.page, allowedContentTypes, filteredContentTypes])
132
132
 
133
- const getContentTypeName = useCallback(
134
- (contentTypeId: string) => {
135
- const ct = contentTypes?.page?.find((c) => c._id === contentTypeId)
133
+ const getContentTypeDisplayName = useCallback(
134
+ (contentTypeName: string) => {
135
+ const ct = contentTypes?.page?.find((c) => c.name === contentTypeName)
136
136
  return ct?.displayName || ct?.name || 'Unknown'
137
137
  },
138
138
  [contentTypes?.page]
@@ -177,7 +177,7 @@ export function ReferenceField({
177
177
  data?: Record<string, unknown>
178
178
  slug?: string
179
179
  status: string
180
- contentTypeId: string
180
+ contentTypeName: string
181
181
  },
182
182
  showRemove = true
183
183
  ) => (
@@ -194,7 +194,7 @@ export function ReferenceField({
194
194
  </p>
195
195
  <div className="flex items-center gap-2">
196
196
  <span className="text-xs text-muted-foreground">
197
- {getContentTypeName(entry.contentTypeId)}
197
+ {getContentTypeDisplayName(entry.contentTypeName)}
198
198
  </span>
199
199
  <CmsStatusBadge status={entry.status as ContentStatus} />
200
200
  </div>
@@ -329,7 +329,7 @@ export function ReferenceField({
329
329
  </p>
330
330
  <div className="flex items-center gap-2">
331
331
  <span className="text-xs text-muted-foreground">
332
- {getContentTypeName(entry.contentTypeId)}
332
+ {getContentTypeDisplayName(entry.contentTypeName)}
333
333
  </span>
334
334
  <Badge
335
335
  variant="secondary"
@@ -315,7 +315,7 @@ export function TagField({
315
315
  <div className="border-t px-3 py-1.5 text-xs text-muted-foreground">
316
316
  {value?.length ?? 0} tag{(value?.length ?? 0) !== 1 ? 's' : ''}
317
317
  {minTags && (value?.length ?? 0) < minTags && (
318
- <span className="text-amber-600"> (minimum {minTags})</span>
318
+ <span className="text-warning"> (minimum {minTags})</span>
319
319
  )}
320
320
  {maxTags && <span> / {maxTags} max</span>}
321
321
  </div>
@@ -1,10 +1,14 @@
1
1
  import { useQuery } from "convex/react";
2
2
  import { createContext, useContext, useMemo, type ReactNode } from "react";
3
- import { api } from "../../convex/_generated/api";
3
+ import { api as localApi } from "../../convex/_generated/api";
4
4
  import type { AdminConfig } from "~/lib/admin-config";
5
5
  import { AdminConfigProvider } from "./AdminConfigContext";
6
6
 
7
- type Settings = NonNullable<typeof api.admin.getSettings._returnType>;
7
+ type Settings = NonNullable<typeof localApi.admin.getSettings._returnType>;
8
+
9
+ type SettingsApi = {
10
+ getSettings: typeof localApi.admin.getSettings;
11
+ };
8
12
 
9
13
  interface SettingsConfigContextValue {
10
14
  baseConfig: AdminConfig;
@@ -16,11 +20,14 @@ const SettingsConfigContext = createContext<SettingsConfigContextValue | null>(n
16
20
  export function SettingsConfigProvider({
17
21
  baseConfig,
18
22
  children,
23
+ api,
19
24
  }: {
20
25
  baseConfig: AdminConfig;
21
26
  children: ReactNode;
27
+ api?: SettingsApi;
22
28
  }) {
23
- const settings = useQuery(api.admin.getSettings);
29
+ const resolvedApi = api ?? localApi.admin;
30
+ const settings = useQuery(resolvedApi.getSettings);
24
31
 
25
32
  const mergedConfig = useMemo((): AdminConfig => {
26
33
  if (!settings) return baseConfig;
@@ -30,7 +30,7 @@
30
30
 
31
31
  import { ConvexProvider, ConvexReactClient } from "convex/react";
32
32
  import { useMemo, type ReactNode } from "react";
33
- import { AdminConfigProvider } from "../contexts/AdminConfigContext";
33
+ import { SettingsConfigProvider } from "../contexts/SettingsConfigContext";
34
34
  import {
35
35
  AuthProvider,
36
36
  type GetUserHook,
@@ -51,11 +51,14 @@ import { EmbedLayout } from "./components/EmbedLayout";
51
51
  import {
52
52
  EmbedDashboard,
53
53
  EmbedContent,
54
+ EmbedContentTypeEntries,
54
55
  EmbedContentTypes,
55
56
  EmbedMedia,
56
57
  EmbedSettings,
57
58
  EmbedTrash,
58
59
  EmbedTaxonomies,
60
+ EmbedNewEntry,
61
+ EmbedEntry,
59
62
  } from "./pages";
60
63
 
61
64
  function adaptAuthConfig(auth: CmsAdminAuthConfig): {
@@ -85,11 +88,11 @@ function ConvexProviderWrapper({
85
88
  if (!convex) {
86
89
  return (
87
90
  <div className="flex min-h-full items-center justify-center bg-background p-6">
88
- <div className="max-w-lg space-y-4 rounded-lg border border-amber-200 bg-amber-50 p-6 text-center">
89
- <h2 className="text-xl font-semibold text-amber-900">
91
+ <div className="diff-modified max-w-lg space-y-4 rounded-lg border p-6 text-center">
92
+ <h2 className="text-xl font-semibold text-diff-modified">
90
93
  Convex Configuration Required
91
94
  </h2>
92
- <p className="text-sm text-amber-800">
95
+ <p className="text-sm text-diff-modified-foreground">
93
96
  Please provide a valid convexUrl prop to the CmsAdmin component.
94
97
  </p>
95
98
  </div>
@@ -119,8 +122,21 @@ function EmbedRouter() {
119
122
  return <EmbedTaxonomies />;
120
123
  case "trash":
121
124
  return <EmbedTrash />;
122
- case "entries":
125
+ case "entries": {
126
+ // Handle new entry action
127
+ if (currentRoute.params.action === "new") {
128
+ return <EmbedNewEntry />;
129
+ }
130
+ // Handle existing entry edit
131
+ if (currentRoute.params.entryId) {
132
+ return <EmbedEntry />;
133
+ }
134
+ // Handle content type specific entries
135
+ if (currentRoute.params.contentTypeId) {
136
+ return <EmbedContentTypeEntries contentTypeId={currentRoute.params.contentTypeId} />;
137
+ }
123
138
  return <EmbedContent />;
139
+ }
124
140
  default:
125
141
  return <EmbedDashboard />;
126
142
  }
@@ -144,13 +160,17 @@ export function CmsAdmin({
144
160
  }) {
145
161
  const adminConfig = useMemo(() => resolveAdminConfig(config), [config]);
146
162
  const authConfig = useMemo(() => adaptAuthConfig(auth), [auth]);
163
+ const settingsApi = useMemo(
164
+ () => (api.getSettings ? { getSettings: api.getSettings } : undefined),
165
+ [api]
166
+ );
147
167
 
148
168
  return (
149
169
  <div className={className}>
150
170
  <ApiProvider api={api}>
151
171
  <ThemeProvider>
152
- <AdminConfigProvider config={adminConfig}>
153
- <ConvexProviderWrapper convexUrl={convexUrl}>
172
+ <ConvexProviderWrapper convexUrl={convexUrl}>
173
+ <SettingsConfigProvider baseConfig={adminConfig} api={settingsApi}>
154
174
  <AuthProvider
155
175
  getUser={authConfig.getUser}
156
176
  getUserRole={authConfig.getUserRole}
@@ -168,8 +188,8 @@ export function CmsAdmin({
168
188
  </RouteGuard>
169
189
  </EmbedNavigationProvider>
170
190
  </AuthProvider>
171
- </ConvexProviderWrapper>
172
- </AdminConfigProvider>
191
+ </SettingsConfigProvider>
192
+ </ConvexProviderWrapper>
173
193
  </ThemeProvider>
174
194
  </ApiProvider>
175
195
  </div>
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Embed Content Type Entries Page
3
+ *
4
+ * Thin wrapper around the shared ContentTypeEntriesPage component.
5
+ * Provides embed navigation and API access.
6
+ */
7
+
8
+ import { useApi } from "../contexts/ApiContext";
9
+ import { useEmbedNavigation } from "../navigation";
10
+ import { useEmbedAdapter } from "../../lib/embed-adapter";
11
+ import { ContentTypeEntriesPage } from "../../pages";
12
+
13
+ export function EmbedContentTypeEntries({ contentTypeId }: { contentTypeId: string }) {
14
+ const api = useApi();
15
+ const embedNav = useEmbedNavigation();
16
+ const navigation = useEmbedAdapter(embedNav);
17
+
18
+ return (
19
+ <ContentTypeEntriesPage
20
+ api={api}
21
+ navigation={navigation}
22
+ contentTypeId={contentTypeId}
23
+ />
24
+ );
25
+ }