convex-cms 0.0.15 → 0.0.16

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 (654) hide show
  1. package/README.md +18 -18
  2. package/admin/dist/types/admin/src/components/AdminLayout.d.ts +7 -0
  3. package/admin/dist/types/admin/src/components/AdminLayout.d.ts.map +1 -0
  4. package/admin/dist/types/admin/src/components/BreakingChangesWarningDialog.d.ts +11 -0
  5. package/admin/dist/types/admin/src/components/BreakingChangesWarningDialog.d.ts.map +1 -0
  6. package/admin/dist/types/admin/src/components/BulkActionBar.d.ts +8 -0
  7. package/admin/dist/types/admin/src/components/BulkActionBar.d.ts.map +1 -0
  8. package/admin/dist/types/admin/src/components/BulkOperationModal.d.ts +16 -0
  9. package/admin/dist/types/admin/src/components/BulkOperationModal.d.ts.map +1 -0
  10. package/admin/dist/types/admin/src/components/ContentEntryEditor.d.ts +42 -0
  11. package/admin/dist/types/admin/src/components/ContentEntryEditor.d.ts.map +1 -0
  12. package/admin/dist/types/admin/src/components/ContentTypeFormModal.d.ts +13 -0
  13. package/admin/dist/types/admin/src/components/ContentTypeFormModal.d.ts.map +1 -0
  14. package/admin/dist/types/admin/src/components/ErrorBoundary.d.ts +35 -0
  15. package/admin/dist/types/admin/src/components/ErrorBoundary.d.ts.map +1 -0
  16. package/admin/dist/types/admin/src/components/ErrorState.d.ts +52 -0
  17. package/admin/dist/types/admin/src/components/ErrorState.d.ts.map +1 -0
  18. package/admin/dist/types/admin/src/components/FieldGroupSection.d.ts +23 -0
  19. package/admin/dist/types/admin/src/components/FieldGroupSection.d.ts.map +1 -0
  20. package/admin/dist/types/admin/src/components/Header.d.ts +2 -0
  21. package/admin/dist/types/admin/src/components/Header.d.ts.map +1 -0
  22. package/admin/dist/types/admin/src/components/RouteGuard.d.ts +70 -0
  23. package/admin/dist/types/admin/src/components/RouteGuard.d.ts.map +1 -0
  24. package/admin/dist/types/admin/src/components/SchemaDriftWarning.d.ts +13 -0
  25. package/admin/dist/types/admin/src/components/SchemaDriftWarning.d.ts.map +1 -0
  26. package/admin/dist/types/admin/src/components/Sidebar.d.ts +2 -0
  27. package/admin/dist/types/admin/src/components/Sidebar.d.ts.map +1 -0
  28. package/admin/dist/types/admin/src/components/TaxonomyEditor.d.ts +19 -0
  29. package/admin/dist/types/admin/src/components/TaxonomyEditor.d.ts.map +1 -0
  30. package/admin/dist/types/admin/src/components/TermTree.d.ts +8 -0
  31. package/admin/dist/types/admin/src/components/TermTree.d.ts.map +1 -0
  32. package/admin/dist/types/admin/src/components/UploadDropzone.d.ts +20 -0
  33. package/admin/dist/types/admin/src/components/UploadDropzone.d.ts.map +1 -0
  34. package/admin/dist/types/admin/src/components/VersionCompare.d.ts +10 -0
  35. package/admin/dist/types/admin/src/components/VersionCompare.d.ts.map +1 -0
  36. package/admin/dist/types/admin/src/components/VersionHistory.d.ts +9 -0
  37. package/admin/dist/types/admin/src/components/VersionHistory.d.ts.map +1 -0
  38. package/admin/dist/types/admin/src/components/VersionRollbackModal.d.ts +11 -0
  39. package/admin/dist/types/admin/src/components/VersionRollbackModal.d.ts.map +1 -0
  40. package/admin/dist/types/admin/src/components/cmsds/CmsButton.d.ts +10 -0
  41. package/admin/dist/types/admin/src/components/cmsds/CmsButton.d.ts.map +1 -0
  42. package/admin/dist/types/admin/src/components/cmsds/CmsDialog.d.ts +28 -0
  43. package/admin/dist/types/admin/src/components/cmsds/CmsDialog.d.ts.map +1 -0
  44. package/admin/dist/types/admin/src/components/cmsds/CmsDropdown.d.ts +15 -0
  45. package/admin/dist/types/admin/src/components/cmsds/CmsDropdown.d.ts.map +1 -0
  46. package/admin/dist/types/admin/src/components/cmsds/CmsEmptyState.d.ts +14 -0
  47. package/admin/dist/types/admin/src/components/cmsds/CmsEmptyState.d.ts.map +1 -0
  48. package/admin/dist/types/admin/src/components/cmsds/CmsFilterBar.d.ts +25 -0
  49. package/admin/dist/types/admin/src/components/cmsds/CmsFilterBar.d.ts.map +1 -0
  50. package/admin/dist/types/admin/src/components/cmsds/CmsInput.d.ts +6 -0
  51. package/admin/dist/types/admin/src/components/cmsds/CmsInput.d.ts.map +1 -0
  52. package/admin/dist/types/admin/src/components/cmsds/CmsPageHeader.d.ts +9 -0
  53. package/admin/dist/types/admin/src/components/cmsds/CmsPageHeader.d.ts.map +1 -0
  54. package/admin/dist/types/admin/src/components/cmsds/CmsPagination.d.ts +9 -0
  55. package/admin/dist/types/admin/src/components/cmsds/CmsPagination.d.ts.map +1 -0
  56. package/admin/dist/types/admin/src/components/cmsds/CmsSelect.d.ts +16 -0
  57. package/admin/dist/types/admin/src/components/cmsds/CmsSelect.d.ts.map +1 -0
  58. package/admin/dist/types/admin/src/components/cmsds/CmsStatCard.d.ts +16 -0
  59. package/admin/dist/types/admin/src/components/cmsds/CmsStatCard.d.ts.map +1 -0
  60. package/admin/dist/types/admin/src/components/cmsds/CmsStatusBadge.d.ts +15 -0
  61. package/admin/dist/types/admin/src/components/cmsds/CmsStatusBadge.d.ts.map +1 -0
  62. package/admin/dist/types/admin/src/components/cmsds/CmsSurface.d.ts +9 -0
  63. package/admin/dist/types/admin/src/components/cmsds/CmsSurface.d.ts.map +1 -0
  64. package/admin/dist/types/admin/src/components/cmsds/CmsTable.d.ts +24 -0
  65. package/admin/dist/types/admin/src/components/cmsds/CmsTable.d.ts.map +1 -0
  66. package/admin/dist/types/admin/src/components/cmsds/CmsToolbar.d.ts +14 -0
  67. package/admin/dist/types/admin/src/components/cmsds/CmsToolbar.d.ts.map +1 -0
  68. package/admin/dist/types/admin/src/components/cmsds/index.d.ts +15 -0
  69. package/admin/dist/types/admin/src/components/cmsds/index.d.ts.map +1 -0
  70. package/admin/dist/types/admin/src/components/editor/AutosaveIndicator.d.ts +12 -0
  71. package/admin/dist/types/admin/src/components/editor/AutosaveIndicator.d.ts.map +1 -0
  72. package/admin/dist/types/admin/src/components/editor/EditorContentPanel.d.ts +11 -0
  73. package/admin/dist/types/admin/src/components/editor/EditorContentPanel.d.ts.map +1 -0
  74. package/admin/dist/types/admin/src/components/editor/EditorModals.d.ts +29 -0
  75. package/admin/dist/types/admin/src/components/editor/EditorModals.d.ts.map +1 -0
  76. package/admin/dist/types/admin/src/components/editor/EditorPropertiesPanel.d.ts +24 -0
  77. package/admin/dist/types/admin/src/components/editor/EditorPropertiesPanel.d.ts.map +1 -0
  78. package/admin/dist/types/admin/src/components/editor/EditorToolbar.d.ts +38 -0
  79. package/admin/dist/types/admin/src/components/editor/EditorToolbar.d.ts.map +1 -0
  80. package/admin/dist/types/admin/src/components/editor/index.d.ts +6 -0
  81. package/admin/dist/types/admin/src/components/editor/index.d.ts.map +1 -0
  82. package/admin/dist/types/admin/src/components/fields/ArrayObjectField.d.ts +3 -0
  83. package/admin/dist/types/admin/src/components/fields/ArrayObjectField.d.ts.map +1 -0
  84. package/admin/dist/types/admin/src/components/fields/BooleanField.d.ts +3 -0
  85. package/admin/dist/types/admin/src/components/fields/BooleanField.d.ts.map +1 -0
  86. package/admin/dist/types/admin/src/components/fields/CategoryField.d.ts +6 -0
  87. package/admin/dist/types/admin/src/components/fields/CategoryField.d.ts.map +1 -0
  88. package/admin/dist/types/admin/src/components/fields/DateField.d.ts +3 -0
  89. package/admin/dist/types/admin/src/components/fields/DateField.d.ts.map +1 -0
  90. package/admin/dist/types/admin/src/components/fields/DefaultFieldRenderer.d.ts +9 -0
  91. package/admin/dist/types/admin/src/components/fields/DefaultFieldRenderer.d.ts.map +1 -0
  92. package/admin/dist/types/admin/src/components/fields/FieldRenderer.d.ts +23 -0
  93. package/admin/dist/types/admin/src/components/fields/FieldRenderer.d.ts.map +1 -0
  94. package/admin/dist/types/admin/src/components/fields/FieldWrapper.d.ts +13 -0
  95. package/admin/dist/types/admin/src/components/fields/FieldWrapper.d.ts.map +1 -0
  96. package/admin/dist/types/admin/src/components/fields/JsonField.d.ts +7 -0
  97. package/admin/dist/types/admin/src/components/fields/JsonField.d.ts.map +1 -0
  98. package/admin/dist/types/admin/src/components/fields/MediaField.d.ts +6 -0
  99. package/admin/dist/types/admin/src/components/fields/MediaField.d.ts.map +1 -0
  100. package/admin/dist/types/admin/src/components/fields/MoneyField.d.ts +3 -0
  101. package/admin/dist/types/admin/src/components/fields/MoneyField.d.ts.map +1 -0
  102. package/admin/dist/types/admin/src/components/fields/MultiSelectField.d.ts +6 -0
  103. package/admin/dist/types/admin/src/components/fields/MultiSelectField.d.ts.map +1 -0
  104. package/admin/dist/types/admin/src/components/fields/NumberField.d.ts +3 -0
  105. package/admin/dist/types/admin/src/components/fields/NumberField.d.ts.map +1 -0
  106. package/admin/dist/types/admin/src/components/fields/ReferenceField.d.ts +6 -0
  107. package/admin/dist/types/admin/src/components/fields/ReferenceField.d.ts.map +1 -0
  108. package/admin/dist/types/admin/src/components/fields/RichTextField.d.ts +3 -0
  109. package/admin/dist/types/admin/src/components/fields/RichTextField.d.ts.map +1 -0
  110. package/admin/dist/types/admin/src/components/fields/SelectField.d.ts +6 -0
  111. package/admin/dist/types/admin/src/components/fields/SelectField.d.ts.map +1 -0
  112. package/admin/dist/types/admin/src/components/fields/TagField.d.ts +6 -0
  113. package/admin/dist/types/admin/src/components/fields/TagField.d.ts.map +1 -0
  114. package/admin/dist/types/admin/src/components/fields/TextAreaField.d.ts +3 -0
  115. package/admin/dist/types/admin/src/components/fields/TextAreaField.d.ts.map +1 -0
  116. package/admin/dist/types/admin/src/components/fields/TextField.d.ts +3 -0
  117. package/admin/dist/types/admin/src/components/fields/TextField.d.ts.map +1 -0
  118. package/admin/dist/types/admin/src/components/fields/registry.d.ts +18 -0
  119. package/admin/dist/types/admin/src/components/fields/registry.d.ts.map +1 -0
  120. package/admin/dist/types/admin/src/components/fields/types.d.ts +202 -0
  121. package/admin/dist/types/admin/src/components/fields/types.d.ts.map +1 -0
  122. package/admin/dist/types/admin/src/components/filters/TaxonomyFilter.d.ts +10 -0
  123. package/admin/dist/types/admin/src/components/filters/TaxonomyFilter.d.ts.map +1 -0
  124. package/admin/dist/types/admin/src/components/index.d.ts +9 -0
  125. package/admin/dist/types/admin/src/components/index.d.ts.map +1 -0
  126. package/admin/dist/types/admin/src/components/media/MediaAssetActions.d.ts +15 -0
  127. package/admin/dist/types/admin/src/components/media/MediaAssetActions.d.ts.map +1 -0
  128. package/admin/dist/types/admin/src/components/media/MediaAssetEditDialog.d.ts +17 -0
  129. package/admin/dist/types/admin/src/components/media/MediaAssetEditDialog.d.ts.map +1 -0
  130. package/admin/dist/types/admin/src/components/media/MediaBulkActionBar.d.ts +10 -0
  131. package/admin/dist/types/admin/src/components/media/MediaBulkActionBar.d.ts.map +1 -0
  132. package/admin/dist/types/admin/src/components/media/MediaFolderActions.d.ts +13 -0
  133. package/admin/dist/types/admin/src/components/media/MediaFolderActions.d.ts.map +1 -0
  134. package/admin/dist/types/admin/src/components/media/MediaFolderEditDialog.d.ts +14 -0
  135. package/admin/dist/types/admin/src/components/media/MediaFolderEditDialog.d.ts.map +1 -0
  136. package/admin/dist/types/admin/src/components/media/MediaMoveModal.d.ts +10 -0
  137. package/admin/dist/types/admin/src/components/media/MediaMoveModal.d.ts.map +1 -0
  138. package/admin/dist/types/admin/src/components/media/MediaPreviewModal.d.ts +27 -0
  139. package/admin/dist/types/admin/src/components/media/MediaPreviewModal.d.ts.map +1 -0
  140. package/admin/dist/types/admin/src/components/media/MediaTaxonomyPicker.d.ts +11 -0
  141. package/admin/dist/types/admin/src/components/media/MediaTaxonomyPicker.d.ts.map +1 -0
  142. package/admin/dist/types/admin/src/components/media/MediaTrashBulkActionBar.d.ts +11 -0
  143. package/admin/dist/types/admin/src/components/media/MediaTrashBulkActionBar.d.ts.map +1 -0
  144. package/admin/dist/types/admin/src/components/ui/alert-dialog.d.ts +15 -0
  145. package/admin/dist/types/admin/src/components/ui/alert-dialog.d.ts.map +1 -0
  146. package/admin/dist/types/admin/src/components/ui/alert.d.ts +10 -0
  147. package/admin/dist/types/admin/src/components/ui/alert.d.ts.map +1 -0
  148. package/admin/dist/types/admin/src/components/ui/avatar.d.ts +7 -0
  149. package/admin/dist/types/admin/src/components/ui/avatar.d.ts.map +1 -0
  150. package/admin/dist/types/admin/src/components/ui/badge.d.ts +10 -0
  151. package/admin/dist/types/admin/src/components/ui/badge.d.ts.map +1 -0
  152. package/admin/dist/types/admin/src/components/ui/breadcrumb.d.ts +12 -0
  153. package/admin/dist/types/admin/src/components/ui/breadcrumb.d.ts.map +1 -0
  154. package/admin/dist/types/admin/src/components/ui/button.d.ts +11 -0
  155. package/admin/dist/types/admin/src/components/ui/button.d.ts.map +1 -0
  156. package/admin/dist/types/admin/src/components/ui/calendar.d.ts +9 -0
  157. package/admin/dist/types/admin/src/components/ui/calendar.d.ts.map +1 -0
  158. package/admin/dist/types/admin/src/components/ui/card.d.ts +10 -0
  159. package/admin/dist/types/admin/src/components/ui/card.d.ts.map +1 -0
  160. package/admin/dist/types/admin/src/components/ui/checkbox.d.ts +5 -0
  161. package/admin/dist/types/admin/src/components/ui/checkbox.d.ts.map +1 -0
  162. package/admin/dist/types/admin/src/components/ui/collapsible.d.ts +7 -0
  163. package/admin/dist/types/admin/src/components/ui/collapsible.d.ts.map +1 -0
  164. package/admin/dist/types/admin/src/components/ui/command.d.ts +19 -0
  165. package/admin/dist/types/admin/src/components/ui/command.d.ts.map +1 -0
  166. package/admin/dist/types/admin/src/components/ui/dialog.d.ts +16 -0
  167. package/admin/dist/types/admin/src/components/ui/dialog.d.ts.map +1 -0
  168. package/admin/dist/types/admin/src/components/ui/drawer.d.ts +14 -0
  169. package/admin/dist/types/admin/src/components/ui/drawer.d.ts.map +1 -0
  170. package/admin/dist/types/admin/src/components/ui/dropdown-menu.d.ts +26 -0
  171. package/admin/dist/types/admin/src/components/ui/dropdown-menu.d.ts.map +1 -0
  172. package/admin/dist/types/admin/src/components/ui/field.d.ts +25 -0
  173. package/admin/dist/types/admin/src/components/ui/field.d.ts.map +1 -0
  174. package/admin/dist/types/admin/src/components/ui/input-group.d.ts +17 -0
  175. package/admin/dist/types/admin/src/components/ui/input-group.d.ts.map +1 -0
  176. package/admin/dist/types/admin/src/components/ui/input.d.ts +4 -0
  177. package/admin/dist/types/admin/src/components/ui/input.d.ts.map +1 -0
  178. package/admin/dist/types/admin/src/components/ui/label.d.ts +5 -0
  179. package/admin/dist/types/admin/src/components/ui/label.d.ts.map +1 -0
  180. package/admin/dist/types/admin/src/components/ui/popover.d.ts +8 -0
  181. package/admin/dist/types/admin/src/components/ui/popover.d.ts.map +1 -0
  182. package/admin/dist/types/admin/src/components/ui/scroll-area.d.ts +6 -0
  183. package/admin/dist/types/admin/src/components/ui/scroll-area.d.ts.map +1 -0
  184. package/admin/dist/types/admin/src/components/ui/select.d.ts +16 -0
  185. package/admin/dist/types/admin/src/components/ui/select.d.ts.map +1 -0
  186. package/admin/dist/types/admin/src/components/ui/separator.d.ts +5 -0
  187. package/admin/dist/types/admin/src/components/ui/separator.d.ts.map +1 -0
  188. package/admin/dist/types/admin/src/components/ui/sheet.d.ts +14 -0
  189. package/admin/dist/types/admin/src/components/ui/sheet.d.ts.map +1 -0
  190. package/admin/dist/types/admin/src/components/ui/sidebar.d.ts +70 -0
  191. package/admin/dist/types/admin/src/components/ui/sidebar.d.ts.map +1 -0
  192. package/admin/dist/types/admin/src/components/ui/skeleton.d.ts +3 -0
  193. package/admin/dist/types/admin/src/components/ui/skeleton.d.ts.map +1 -0
  194. package/admin/dist/types/admin/src/components/ui/spinner.d.ts +3 -0
  195. package/admin/dist/types/admin/src/components/ui/spinner.d.ts.map +1 -0
  196. package/admin/dist/types/admin/src/components/ui/switch.d.ts +5 -0
  197. package/admin/dist/types/admin/src/components/ui/switch.d.ts.map +1 -0
  198. package/admin/dist/types/admin/src/components/ui/table.d.ts +11 -0
  199. package/admin/dist/types/admin/src/components/ui/table.d.ts.map +1 -0
  200. package/admin/dist/types/admin/src/components/ui/tabs.d.ts +8 -0
  201. package/admin/dist/types/admin/src/components/ui/tabs.d.ts.map +1 -0
  202. package/admin/dist/types/admin/src/components/ui/textarea.d.ts +4 -0
  203. package/admin/dist/types/admin/src/components/ui/textarea.d.ts.map +1 -0
  204. package/admin/dist/types/admin/src/components/ui/toggle-group.d.ts +10 -0
  205. package/admin/dist/types/admin/src/components/ui/toggle-group.d.ts.map +1 -0
  206. package/admin/dist/types/admin/src/components/ui/toggle.d.ts +10 -0
  207. package/admin/dist/types/admin/src/components/ui/toggle.d.ts.map +1 -0
  208. package/admin/dist/types/admin/src/components/ui/tooltip.d.ts +8 -0
  209. package/admin/dist/types/admin/src/components/ui/tooltip.d.ts.map +1 -0
  210. package/admin/dist/types/admin/src/contexts/AdminConfigContext.d.ts +15 -0
  211. package/admin/dist/types/admin/src/contexts/AdminConfigContext.d.ts.map +1 -0
  212. package/admin/dist/types/admin/src/contexts/AuthContext.d.ts +161 -0
  213. package/admin/dist/types/admin/src/contexts/AuthContext.d.ts.map +1 -0
  214. package/admin/dist/types/admin/src/contexts/BreadcrumbContext.d.ts +12 -0
  215. package/admin/dist/types/admin/src/contexts/BreadcrumbContext.d.ts.map +1 -0
  216. package/admin/dist/types/admin/src/contexts/SettingsConfigContext.d.ts +30 -0
  217. package/admin/dist/types/admin/src/contexts/SettingsConfigContext.d.ts.map +1 -0
  218. package/admin/dist/types/admin/src/contexts/ThemeContext.d.ts +17 -0
  219. package/admin/dist/types/admin/src/contexts/ThemeContext.d.ts.map +1 -0
  220. package/admin/dist/types/admin/src/contexts/index.d.ts +6 -0
  221. package/admin/dist/types/admin/src/contexts/index.d.ts.map +1 -0
  222. package/admin/dist/types/admin/src/embed/components/EmbedHeader.d.ts +7 -0
  223. package/admin/dist/types/admin/src/embed/components/EmbedHeader.d.ts.map +1 -0
  224. package/admin/dist/types/admin/src/embed/components/EmbedLayout.d.ts +13 -0
  225. package/admin/dist/types/admin/src/embed/components/EmbedLayout.d.ts.map +1 -0
  226. package/admin/dist/types/admin/src/embed/components/EmbedSidebar.d.ts +8 -0
  227. package/admin/dist/types/admin/src/embed/components/EmbedSidebar.d.ts.map +1 -0
  228. package/admin/dist/types/admin/src/embed/components/index.d.ts +4 -0
  229. package/admin/dist/types/admin/src/embed/components/index.d.ts.map +1 -0
  230. package/admin/dist/types/admin/src/embed/contexts/ApiContext.d.ts +18 -0
  231. package/admin/dist/types/admin/src/embed/contexts/ApiContext.d.ts.map +1 -0
  232. package/admin/dist/types/admin/src/embed/index.d.ts +23 -0
  233. package/admin/dist/types/admin/src/embed/index.d.ts.map +1 -0
  234. package/admin/dist/types/admin/src/embed/navigation.d.ts +42 -0
  235. package/admin/dist/types/admin/src/embed/navigation.d.ts.map +1 -0
  236. package/admin/dist/types/admin/src/embed/pages/Content.d.ts +8 -0
  237. package/admin/dist/types/admin/src/embed/pages/Content.d.ts.map +1 -0
  238. package/admin/dist/types/admin/src/embed/pages/ContentTypeEntries.d.ts +10 -0
  239. package/admin/dist/types/admin/src/embed/pages/ContentTypeEntries.d.ts.map +1 -0
  240. package/admin/dist/types/admin/src/embed/pages/ContentTypes.d.ts +8 -0
  241. package/admin/dist/types/admin/src/embed/pages/ContentTypes.d.ts.map +1 -0
  242. package/admin/dist/types/admin/src/embed/pages/Dashboard.d.ts +8 -0
  243. package/admin/dist/types/admin/src/embed/pages/Dashboard.d.ts.map +1 -0
  244. package/admin/dist/types/admin/src/embed/pages/Entry.d.ts +7 -0
  245. package/admin/dist/types/admin/src/embed/pages/Entry.d.ts.map +1 -0
  246. package/admin/dist/types/admin/src/embed/pages/Media.d.ts +8 -0
  247. package/admin/dist/types/admin/src/embed/pages/Media.d.ts.map +1 -0
  248. package/admin/dist/types/admin/src/embed/pages/NewEntry.d.ts +7 -0
  249. package/admin/dist/types/admin/src/embed/pages/NewEntry.d.ts.map +1 -0
  250. package/admin/dist/types/admin/src/embed/pages/Settings.d.ts +11 -0
  251. package/admin/dist/types/admin/src/embed/pages/Settings.d.ts.map +1 -0
  252. package/admin/dist/types/admin/src/embed/pages/Taxonomies.d.ts +11 -0
  253. package/admin/dist/types/admin/src/embed/pages/Taxonomies.d.ts.map +1 -0
  254. package/admin/dist/types/admin/src/embed/pages/Trash.d.ts +11 -0
  255. package/admin/dist/types/admin/src/embed/pages/Trash.d.ts.map +1 -0
  256. package/admin/dist/types/admin/src/embed/pages/Users.d.ts +7 -0
  257. package/admin/dist/types/admin/src/embed/pages/Users.d.ts.map +1 -0
  258. package/admin/dist/types/admin/src/embed/pages/index.d.ts +12 -0
  259. package/admin/dist/types/admin/src/embed/pages/index.d.ts.map +1 -0
  260. package/admin/dist/types/admin/src/embed/types.d.ts +33 -0
  261. package/admin/dist/types/admin/src/embed/types.d.ts.map +1 -0
  262. package/admin/dist/types/admin/src/hooks/index.d.ts +4 -0
  263. package/admin/dist/types/admin/src/hooks/index.d.ts.map +1 -0
  264. package/admin/dist/types/admin/src/hooks/use-mobile.d.ts +2 -0
  265. package/admin/dist/types/admin/src/hooks/use-mobile.d.ts.map +1 -0
  266. package/admin/dist/types/admin/src/hooks/useBreadcrumbLabel.d.ts +2 -0
  267. package/admin/dist/types/admin/src/hooks/useBreadcrumbLabel.d.ts.map +1 -0
  268. package/admin/dist/types/admin/src/hooks/usePermissions.d.ts +65 -0
  269. package/admin/dist/types/admin/src/hooks/usePermissions.d.ts.map +1 -0
  270. package/admin/dist/types/admin/src/hooks/useTaxonomyId.d.ts +13 -0
  271. package/admin/dist/types/admin/src/hooks/useTaxonomyId.d.ts.map +1 -0
  272. package/admin/dist/types/admin/src/lib/admin-config.d.ts +69 -0
  273. package/admin/dist/types/admin/src/lib/admin-config.d.ts.map +1 -0
  274. package/admin/dist/types/admin/src/lib/cmsExports.d.ts +7 -0
  275. package/admin/dist/types/admin/src/lib/cmsExports.d.ts.map +1 -0
  276. package/admin/dist/types/admin/src/lib/cn.d.ts +3 -0
  277. package/admin/dist/types/admin/src/lib/cn.d.ts.map +1 -0
  278. package/admin/dist/types/admin/src/lib/embed-adapter.d.ts +10 -0
  279. package/admin/dist/types/admin/src/lib/embed-adapter.d.ts.map +1 -0
  280. package/admin/dist/types/admin/src/lib/icons.d.ts +7 -0
  281. package/admin/dist/types/admin/src/lib/icons.d.ts.map +1 -0
  282. package/admin/dist/types/admin/src/lib/motion.d.ts +27 -0
  283. package/admin/dist/types/admin/src/lib/motion.d.ts.map +1 -0
  284. package/admin/dist/types/admin/src/lib/navigation.d.ts +31 -0
  285. package/admin/dist/types/admin/src/lib/navigation.d.ts.map +1 -0
  286. package/admin/dist/types/admin/src/pages/ContentPage.d.ts +14 -0
  287. package/admin/dist/types/admin/src/pages/ContentPage.d.ts.map +1 -0
  288. package/admin/dist/types/admin/src/pages/ContentTypeEntriesPage.d.ts +15 -0
  289. package/admin/dist/types/admin/src/pages/ContentTypeEntriesPage.d.ts.map +1 -0
  290. package/admin/dist/types/admin/src/pages/ContentTypesPage.d.ts +14 -0
  291. package/admin/dist/types/admin/src/pages/ContentTypesPage.d.ts.map +1 -0
  292. package/admin/dist/types/admin/src/pages/DashboardPage.d.ts +15 -0
  293. package/admin/dist/types/admin/src/pages/DashboardPage.d.ts.map +1 -0
  294. package/admin/dist/types/admin/src/pages/MediaPage.d.ts +19 -0
  295. package/admin/dist/types/admin/src/pages/MediaPage.d.ts.map +1 -0
  296. package/admin/dist/types/admin/src/pages/SettingsPage.d.ts +14 -0
  297. package/admin/dist/types/admin/src/pages/SettingsPage.d.ts.map +1 -0
  298. package/admin/dist/types/admin/src/pages/TaxonomiesPage.d.ts +14 -0
  299. package/admin/dist/types/admin/src/pages/TaxonomiesPage.d.ts.map +1 -0
  300. package/admin/dist/types/admin/src/pages/TrashPage.d.ts +14 -0
  301. package/admin/dist/types/admin/src/pages/TrashPage.d.ts.map +1 -0
  302. package/admin/dist/types/admin/src/pages/UsersPage.d.ts +8 -0
  303. package/admin/dist/types/admin/src/pages/UsersPage.d.ts.map +1 -0
  304. package/admin/dist/types/admin/src/pages/index.d.ts +16 -0
  305. package/admin/dist/types/admin/src/pages/index.d.ts.map +1 -0
  306. package/admin/dist/types/admin/src/types/index.d.ts +144 -0
  307. package/admin/dist/types/admin/src/types/index.d.ts.map +1 -0
  308. package/admin/dist/types/admin/src/utils/errorParsing.d.ts +27 -0
  309. package/admin/dist/types/admin/src/utils/errorParsing.d.ts.map +1 -0
  310. package/admin/dist/types/admin/src/utils/index.d.ts +2 -0
  311. package/admin/dist/types/admin/src/utils/index.d.ts.map +1 -0
  312. package/admin/dist/types/src/client/admin/bulk.d.ts +79 -0
  313. package/admin/dist/types/src/client/admin/bulk.d.ts.map +1 -0
  314. package/admin/dist/types/src/client/admin/contentLock.d.ts +118 -0
  315. package/admin/dist/types/src/client/admin/contentLock.d.ts.map +1 -0
  316. package/admin/dist/types/src/client/admin/contentTypes.d.ts +1627 -0
  317. package/admin/dist/types/src/client/admin/contentTypes.d.ts.map +1 -0
  318. package/admin/dist/types/src/client/admin/dashboard.d.ts +16 -0
  319. package/admin/dist/types/src/client/admin/dashboard.d.ts.map +1 -0
  320. package/admin/dist/types/src/client/admin/entries.d.ts +357 -0
  321. package/admin/dist/types/src/client/admin/entries.d.ts.map +1 -0
  322. package/admin/dist/types/src/client/admin/index.d.ts +7502 -0
  323. package/admin/dist/types/src/client/admin/index.d.ts.map +1 -0
  324. package/admin/dist/types/src/client/admin/media.d.ts +1038 -0
  325. package/admin/dist/types/src/client/admin/media.d.ts.map +1 -0
  326. package/admin/dist/types/src/client/admin/settings.d.ts +50 -0
  327. package/admin/dist/types/src/client/admin/settings.d.ts.map +1 -0
  328. package/admin/dist/types/src/client/admin/taxonomies.d.ts +339 -0
  329. package/admin/dist/types/src/client/admin/taxonomies.d.ts.map +1 -0
  330. package/admin/dist/types/src/client/admin/trash.d.ts +90 -0
  331. package/admin/dist/types/src/client/admin/trash.d.ts.map +1 -0
  332. package/admin/dist/types/src/client/admin/types.d.ts +594 -0
  333. package/admin/dist/types/src/client/admin/types.d.ts.map +1 -0
  334. package/admin/dist/types/src/client/admin/users.d.ts +58 -0
  335. package/admin/dist/types/src/client/admin/users.d.ts.map +1 -0
  336. package/admin/dist/types/src/client/admin/validators.d.ts +7732 -0
  337. package/admin/dist/types/src/client/admin/validators.d.ts.map +1 -0
  338. package/admin/dist/types/src/client/admin/versions.d.ts +106 -0
  339. package/admin/dist/types/src/client/admin/versions.d.ts.map +1 -0
  340. package/admin/dist/types/src/client/adminConfig.d.ts +125 -0
  341. package/admin/dist/types/src/client/adminConfig.d.ts.map +1 -0
  342. package/admin/dist/types/src/client/config.d.ts +155 -0
  343. package/admin/dist/types/src/client/config.d.ts.map +1 -0
  344. package/admin/dist/types/src/client/field-types.d.ts +55 -0
  345. package/admin/dist/types/src/client/field-types.d.ts.map +1 -0
  346. package/admin/dist/types/src/client/fields.d.ts +70 -0
  347. package/admin/dist/types/src/client/fields.d.ts.map +1 -0
  348. package/admin/dist/types/src/client/registry.d.ts +77 -0
  349. package/admin/dist/types/src/client/registry.d.ts.map +1 -0
  350. package/admin/dist/types/src/client/schema/defineContentType.d.ts +233 -0
  351. package/admin/dist/types/src/client/schema/defineContentType.d.ts.map +1 -0
  352. package/admin/dist/types/src/client/schema/types.d.ts +540 -0
  353. package/admin/dist/types/src/client/schema/types.d.ts.map +1 -0
  354. package/admin/dist/types/src/client/types.d.ts +449 -0
  355. package/admin/dist/types/src/client/types.d.ts.map +1 -0
  356. package/admin/dist/types/src/client/utils/toSlug.d.ts +60 -0
  357. package/admin/dist/types/src/client/utils/toSlug.d.ts.map +1 -0
  358. package/admin/dist/types/src/client/workflows.d.ts +51 -0
  359. package/admin/dist/types/src/client/workflows.d.ts.map +1 -0
  360. package/admin/dist/types/src/component/_generated/component.d.ts +4813 -0
  361. package/admin/dist/types/src/component/_generated/component.d.ts.map +1 -0
  362. package/admin/dist/types/src/component/_generated/dataModel.d.ts +46 -0
  363. package/admin/dist/types/src/component/_generated/dataModel.d.ts.map +1 -0
  364. package/admin/dist/types/src/component/_generated/server.d.ts +121 -0
  365. package/admin/dist/types/src/component/_generated/server.d.ts.map +1 -0
  366. package/admin/dist/types/src/component/contentEntryMutations.d.ts +551 -0
  367. package/admin/dist/types/src/component/contentEntryMutations.d.ts.map +1 -0
  368. package/admin/dist/types/src/component/contentLock.d.ts +328 -0
  369. package/admin/dist/types/src/component/contentLock.d.ts.map +1 -0
  370. package/admin/dist/types/src/component/contentTypeMutations.d.ts +1253 -0
  371. package/admin/dist/types/src/component/contentTypeMutations.d.ts.map +1 -0
  372. package/admin/dist/types/src/component/documentTypes.d.ts +186 -0
  373. package/admin/dist/types/src/component/documentTypes.d.ts.map +1 -0
  374. package/admin/dist/types/src/component/eventEmitter.d.ts +309 -0
  375. package/admin/dist/types/src/component/eventEmitter.d.ts.map +1 -0
  376. package/admin/dist/types/src/component/lib/errors.d.ts +306 -0
  377. package/admin/dist/types/src/component/lib/errors.d.ts.map +1 -0
  378. package/admin/dist/types/src/component/lib/metadataExtractor.d.ts +245 -0
  379. package/admin/dist/types/src/component/lib/metadataExtractor.d.ts.map +1 -0
  380. package/admin/dist/types/src/component/lib/mutationAuth.d.ts +95 -0
  381. package/admin/dist/types/src/component/lib/mutationAuth.d.ts.map +1 -0
  382. package/admin/dist/types/src/component/lib/slugGenerator.d.ts +71 -0
  383. package/admin/dist/types/src/component/lib/slugGenerator.d.ts.map +1 -0
  384. package/admin/dist/types/src/component/lib/slugUniqueness.d.ts +131 -0
  385. package/admin/dist/types/src/component/lib/slugUniqueness.d.ts.map +1 -0
  386. package/admin/dist/types/src/component/lib/softDelete.d.ts +18 -0
  387. package/admin/dist/types/src/component/lib/softDelete.d.ts.map +1 -0
  388. package/admin/dist/types/src/component/localeFields.d.ts +508 -0
  389. package/admin/dist/types/src/component/localeFields.d.ts.map +1 -0
  390. package/admin/dist/types/src/component/mediaAssetMutations.d.ts +282 -0
  391. package/admin/dist/types/src/component/mediaAssetMutations.d.ts.map +1 -0
  392. package/admin/dist/types/src/component/roles.d.ts +649 -0
  393. package/admin/dist/types/src/component/roles.d.ts.map +1 -0
  394. package/admin/dist/types/src/component/schema.d.ts +5248 -0
  395. package/admin/dist/types/src/component/schema.d.ts.map +1 -0
  396. package/admin/dist/types/src/component/validation.d.ts +407 -0
  397. package/admin/dist/types/src/component/validation.d.ts.map +1 -0
  398. package/admin/dist/types/src/component/validators.d.ts +5722 -0
  399. package/admin/dist/types/src/component/validators.d.ts.map +1 -0
  400. package/admin/dist/types/src/react/index.d.ts +493 -0
  401. package/admin/dist/types/src/react/index.d.ts.map +1 -0
  402. package/admin/src/components/AdminLayout.tsx +14 -6
  403. package/admin/src/components/BreakingChangesWarningDialog.tsx +6 -6
  404. package/admin/src/components/BulkActionBar.tsx +3 -3
  405. package/admin/src/components/BulkOperationModal.tsx +7 -7
  406. package/admin/src/components/ContentEntryEditor.tsx +319 -630
  407. package/admin/src/components/ContentTypeFormModal.tsx +39 -28
  408. package/admin/src/components/FieldGroupSection.tsx +178 -0
  409. package/admin/src/components/Header.tsx +18 -12
  410. package/admin/src/components/RouteGuard.tsx +1 -1
  411. package/admin/src/components/SchemaDriftWarning.tsx +10 -6
  412. package/admin/src/components/Sidebar.tsx +180 -162
  413. package/admin/src/components/TaxonomyEditor.tsx +17 -17
  414. package/admin/src/components/TermTree.tsx +16 -16
  415. package/admin/src/components/UploadDropzone.tsx +18 -8
  416. package/admin/src/components/VersionCompare.tsx +7 -7
  417. package/admin/src/components/VersionHistory.tsx +7 -7
  418. package/admin/src/components/VersionRollbackModal.tsx +5 -5
  419. package/admin/src/components/cmsds/CmsButton.tsx +5 -27
  420. package/admin/src/components/cmsds/CmsDialog.tsx +3 -3
  421. package/admin/src/components/cmsds/CmsDropdown.tsx +1 -1
  422. package/admin/src/components/cmsds/CmsEmptyState.tsx +1 -1
  423. package/admin/src/components/cmsds/CmsField.tsx +3 -3
  424. package/admin/src/components/cmsds/CmsFilterBar.tsx +8 -7
  425. package/admin/src/components/cmsds/CmsInput.tsx +2 -2
  426. package/admin/src/components/cmsds/CmsPageHeader.tsx +4 -4
  427. package/admin/src/components/cmsds/CmsPagination.tsx +1 -1
  428. package/admin/src/components/cmsds/CmsSelect.tsx +2 -2
  429. package/admin/src/components/cmsds/CmsStatCard.tsx +2 -2
  430. package/admin/src/components/cmsds/CmsStatusBadge.tsx +2 -2
  431. package/admin/src/components/cmsds/CmsSurface.tsx +1 -1
  432. package/admin/src/components/cmsds/CmsTable.tsx +3 -3
  433. package/admin/src/components/cmsds/CmsToolbar.tsx +2 -2
  434. package/admin/src/components/cmsds/index.ts +0 -1
  435. package/admin/src/components/editor/AutosaveIndicator.tsx +56 -0
  436. package/admin/src/components/editor/EditorContentPanel.tsx +60 -0
  437. package/admin/src/components/editor/EditorModals.tsx +122 -0
  438. package/admin/src/components/editor/EditorPropertiesPanel.tsx +179 -0
  439. package/admin/src/components/editor/EditorToolbar.tsx +284 -0
  440. package/admin/src/components/editor/index.ts +5 -0
  441. package/admin/src/components/fields/ArrayObjectField.tsx +304 -0
  442. package/admin/src/components/fields/BooleanField.tsx +30 -35
  443. package/admin/src/components/fields/CategoryField.tsx +8 -7
  444. package/admin/src/components/fields/DateField.tsx +5 -5
  445. package/admin/src/components/fields/DefaultFieldRenderer.tsx +1 -1
  446. package/admin/src/components/fields/FieldRenderer.tsx +30 -0
  447. package/admin/src/components/fields/FieldWrapper.tsx +12 -25
  448. package/admin/src/components/fields/JsonField.tsx +3 -3
  449. package/admin/src/components/fields/MediaField.tsx +269 -132
  450. package/admin/src/components/fields/MoneyField.tsx +179 -0
  451. package/admin/src/components/fields/MultiSelectField.tsx +67 -62
  452. package/admin/src/components/fields/NumberField.tsx +141 -28
  453. package/admin/src/components/fields/ReferenceField.tsx +12 -12
  454. package/admin/src/components/fields/RichTextField.tsx +4 -4
  455. package/admin/src/components/fields/SelectField.tsx +10 -7
  456. package/admin/src/components/fields/TagField.tsx +11 -9
  457. package/admin/src/components/fields/TextAreaField.tsx +2 -2
  458. package/admin/src/components/fields/TextField.tsx +2 -2
  459. package/admin/src/components/fields/index.ts +4 -0
  460. package/admin/src/components/fields/registry.ts +2 -0
  461. package/admin/src/components/fields/types.ts +34 -0
  462. package/admin/src/components/filters/TaxonomyFilter.tsx +7 -7
  463. package/admin/src/components/media/MediaAssetActions.tsx +2 -2
  464. package/admin/src/components/media/MediaAssetEditDialog.tsx +30 -34
  465. package/admin/src/components/media/MediaBulkActionBar.tsx +1 -1
  466. package/admin/src/components/media/MediaFolderActions.tsx +2 -2
  467. package/admin/src/components/media/MediaFolderEditDialog.tsx +17 -15
  468. package/admin/src/components/media/MediaMoveModal.tsx +5 -5
  469. package/admin/src/components/media/MediaPreviewModal.tsx +5 -5
  470. package/admin/src/components/media/MediaTaxonomyPicker.tsx +6 -6
  471. package/admin/src/components/media/MediaTrashBulkActionBar.tsx +1 -1
  472. package/admin/src/components/ui/accordion.tsx +1 -1
  473. package/admin/src/components/ui/alert-dialog.tsx +2 -2
  474. package/admin/src/components/ui/alert.tsx +1 -1
  475. package/admin/src/components/ui/avatar.tsx +1 -1
  476. package/admin/src/components/ui/badge.tsx +1 -1
  477. package/admin/src/components/ui/breadcrumb.tsx +1 -1
  478. package/admin/src/components/ui/button.tsx +1 -1
  479. package/admin/src/components/ui/calendar.tsx +2 -2
  480. package/admin/src/components/ui/card.tsx +1 -1
  481. package/admin/src/components/ui/checkbox.tsx +1 -1
  482. package/admin/src/components/ui/collapsible.tsx +25 -5
  483. package/admin/src/components/ui/command.tsx +2 -2
  484. package/admin/src/components/ui/dialog.tsx +1 -1
  485. package/admin/src/components/ui/drawer.tsx +133 -0
  486. package/admin/src/components/ui/dropdown-menu.tsx +1 -1
  487. package/admin/src/components/ui/field.tsx +246 -0
  488. package/admin/src/components/ui/form.tsx +2 -2
  489. package/admin/src/components/ui/input-group.tsx +168 -0
  490. package/admin/src/components/ui/input.tsx +1 -1
  491. package/admin/src/components/ui/label.tsx +1 -1
  492. package/admin/src/components/ui/popover.tsx +1 -1
  493. package/admin/src/components/ui/scroll-area.tsx +1 -1
  494. package/admin/src/components/ui/select.tsx +1 -1
  495. package/admin/src/components/ui/separator.tsx +1 -1
  496. package/admin/src/components/ui/sheet.tsx +1 -1
  497. package/admin/src/components/ui/sidebar.tsx +8 -8
  498. package/admin/src/components/ui/skeleton.tsx +1 -1
  499. package/admin/src/components/ui/spinner.tsx +16 -0
  500. package/admin/src/components/ui/switch.tsx +1 -1
  501. package/admin/src/components/ui/table.tsx +1 -1
  502. package/admin/src/components/ui/tabs.tsx +1 -1
  503. package/admin/src/components/ui/textarea.tsx +1 -1
  504. package/admin/src/components/ui/toggle-group.tsx +83 -0
  505. package/admin/src/components/ui/toggle.tsx +45 -0
  506. package/admin/src/components/ui/tooltip.tsx +1 -1
  507. package/admin/src/contexts/SettingsConfigContext.tsx +1 -1
  508. package/admin/src/embed/components/EmbedHeader.tsx +13 -9
  509. package/admin/src/embed/components/EmbedLayout.tsx +13 -5
  510. package/admin/src/embed/components/EmbedSidebar.tsx +107 -102
  511. package/admin/src/embed/contexts/ApiContext.tsx +1 -1
  512. package/admin/src/embed/index.tsx +31 -32
  513. package/admin/src/embed/navigation.tsx +3 -0
  514. package/admin/src/embed/pages/Entry.tsx +50 -15
  515. package/admin/src/embed/pages/Users.tsx +11 -0
  516. package/admin/src/embed/pages/index.ts +1 -0
  517. package/admin/src/embed/theme.css +65 -0
  518. package/admin/src/hooks/index.ts +1 -0
  519. package/admin/src/hooks/useBreadcrumbLabel.ts +1 -1
  520. package/admin/src/hooks/useTaxonomyId.ts +32 -0
  521. package/admin/src/index.css +21 -0
  522. package/admin/src/lib/admin-config.ts +16 -0
  523. package/admin/src/lib/adminApi.ts +1 -1
  524. package/admin/src/lib/cmsExports.ts +8 -15
  525. package/admin/src/lib/icons.tsx +2 -0
  526. package/admin/src/pages/ContentPage.tsx +11 -11
  527. package/admin/src/pages/ContentTypeEntriesPage.tsx +9 -9
  528. package/admin/src/pages/ContentTypesPage.tsx +9 -9
  529. package/admin/src/pages/DashboardPage.tsx +7 -7
  530. package/admin/src/pages/MediaPage.tsx +26 -26
  531. package/admin/src/pages/SettingsPage.tsx +36 -39
  532. package/admin/src/pages/TaxonomiesPage.tsx +12 -12
  533. package/admin/src/pages/TrashPage.tsx +8 -8
  534. package/admin/src/pages/UsersPage.tsx +344 -0
  535. package/admin/src/pages/index.ts +1 -0
  536. package/admin/src/standalone/App.tsx +6 -6
  537. package/admin/src/standalone/config.ts +1 -1
  538. package/admin/src/standalone/router.tsx +17 -17
  539. package/admin-dist/assets/index-CQLWK5Wb.css +1 -0
  540. package/admin-dist/assets/index-DTgANhXL.js +104 -0
  541. package/admin-dist/index.html +2 -2
  542. package/dist/client/admin/contentLock.d.ts.map +1 -1
  543. package/dist/client/admin/contentTypes.d.ts +287 -4
  544. package/dist/client/admin/contentTypes.d.ts.map +1 -1
  545. package/dist/client/admin/contentTypes.js +19 -1
  546. package/dist/client/admin/contentTypes.js.map +1 -1
  547. package/dist/client/admin/entries.d.ts.map +1 -1
  548. package/dist/client/admin/index.d.ts +612 -8
  549. package/dist/client/admin/index.d.ts.map +1 -1
  550. package/dist/client/admin/index.js +34 -3
  551. package/dist/client/admin/index.js.map +1 -1
  552. package/dist/client/admin/media.d.ts.map +1 -1
  553. package/dist/client/admin/media.js +10 -1
  554. package/dist/client/admin/media.js.map +1 -1
  555. package/dist/client/admin/taxonomies.d.ts.map +1 -1
  556. package/dist/client/admin/taxonomies.js +36 -11
  557. package/dist/client/admin/taxonomies.js.map +1 -1
  558. package/dist/client/admin/trash.d.ts.map +1 -1
  559. package/dist/client/admin/types.d.ts +47 -7
  560. package/dist/client/admin/types.d.ts.map +1 -1
  561. package/dist/client/admin/users.d.ts +58 -0
  562. package/dist/client/admin/users.d.ts.map +1 -0
  563. package/dist/client/admin/users.js +111 -0
  564. package/dist/client/admin/users.js.map +1 -0
  565. package/dist/client/admin/validators.d.ts +1266 -120
  566. package/dist/client/admin/validators.d.ts.map +1 -1
  567. package/dist/client/admin/validators.js +3 -2
  568. package/dist/client/admin/validators.js.map +1 -1
  569. package/dist/client/admin/versions.d.ts.map +1 -1
  570. package/dist/client/config.js.map +1 -1
  571. package/dist/client/defineContent.d.ts +98 -8
  572. package/dist/client/defineContent.d.ts.map +1 -1
  573. package/dist/client/defineContent.js +329 -19
  574. package/dist/client/defineContent.js.map +1 -1
  575. package/dist/client/field-types.d.ts.map +1 -1
  576. package/dist/client/field-types.js +27 -0
  577. package/dist/client/field-types.js.map +1 -1
  578. package/dist/client/fields.d.ts +70 -0
  579. package/dist/client/fields.d.ts.map +1 -0
  580. package/dist/client/fields.js +118 -0
  581. package/dist/client/fields.js.map +1 -0
  582. package/dist/client/index.d.ts +3 -2
  583. package/dist/client/index.d.ts.map +1 -1
  584. package/dist/client/index.js +3 -1
  585. package/dist/client/index.js.map +1 -1
  586. package/dist/client/registry.js.map +1 -1
  587. package/dist/client/schema/defineContentType.d.ts +3 -3
  588. package/dist/client/schema/defineContentType.d.ts.map +1 -1
  589. package/dist/client/schema/defineContentType.js +86 -3
  590. package/dist/client/schema/defineContentType.js.map +1 -1
  591. package/dist/client/schema/index.d.ts +1 -1
  592. package/dist/client/schema/index.d.ts.map +1 -1
  593. package/dist/client/schema/index.js.map +1 -1
  594. package/dist/client/schema/types.d.ts +65 -9
  595. package/dist/client/schema/types.d.ts.map +1 -1
  596. package/dist/client/schema/types.js.map +1 -1
  597. package/dist/component/_generated/api.d.ts +2 -0
  598. package/dist/component/_generated/api.d.ts.map +1 -1
  599. package/dist/component/_generated/api.js.map +1 -1
  600. package/dist/component/_generated/component.d.ts +361 -18
  601. package/dist/component/_generated/component.d.ts.map +1 -1
  602. package/dist/component/authorization.d.ts.map +1 -1
  603. package/dist/component/authorization.js +1 -0
  604. package/dist/component/authorization.js.map +1 -1
  605. package/dist/component/cmsUsers.d.ts +97 -0
  606. package/dist/component/cmsUsers.d.ts.map +1 -0
  607. package/dist/component/cmsUsers.js +224 -0
  608. package/dist/component/cmsUsers.js.map +1 -0
  609. package/dist/component/contentEntryMutations.d.ts +7 -7
  610. package/dist/component/contentTypeMutations.d.ts +199 -11
  611. package/dist/component/contentTypeMutations.d.ts.map +1 -1
  612. package/dist/component/contentTypes.d.ts +98 -4
  613. package/dist/component/contentTypes.d.ts.map +1 -1
  614. package/dist/component/eventEmitter.d.ts +43 -14
  615. package/dist/component/eventEmitter.d.ts.map +1 -1
  616. package/dist/component/eventEmitter.js +50 -2
  617. package/dist/component/eventEmitter.js.map +1 -1
  618. package/dist/component/exportImport.d.ts +12 -12
  619. package/dist/component/mediaAssetMutations.d.ts +5 -5
  620. package/dist/component/mediaFolderMutations.d.ts +5 -5
  621. package/dist/component/ragContentIndexer.d.ts +51 -4
  622. package/dist/component/ragContentIndexer.d.ts.map +1 -1
  623. package/dist/component/roles.d.ts +4 -4
  624. package/dist/component/roles.d.ts.map +1 -1
  625. package/dist/component/roles.js +5 -1
  626. package/dist/component/roles.js.map +1 -1
  627. package/dist/component/schema.d.ts +897 -112
  628. package/dist/component/schema.d.ts.map +1 -1
  629. package/dist/component/schema.js +48 -7
  630. package/dist/component/schema.js.map +1 -1
  631. package/dist/component/taxonomies.d.ts +1 -1
  632. package/dist/component/taxonomies.d.ts.map +1 -1
  633. package/dist/component/taxonomies.js +11 -2
  634. package/dist/component/taxonomies.js.map +1 -1
  635. package/dist/component/validation.d.ts +22 -2
  636. package/dist/component/validation.d.ts.map +1 -1
  637. package/dist/component/validation.js +174 -1
  638. package/dist/component/validation.js.map +1 -1
  639. package/dist/component/validators.d.ts +847 -106
  640. package/dist/component/validators.d.ts.map +1 -1
  641. package/dist/component/validators.js +5 -2
  642. package/dist/component/validators.js.map +1 -1
  643. package/dist/component/webhookTrigger.d.ts +17 -17
  644. package/dist/component/webhookTrigger.d.ts.map +1 -1
  645. package/dist/component/webhookTrigger.js +4 -4
  646. package/dist/component/webhookTrigger.js.map +1 -1
  647. package/dist/react/index.d.ts +3 -2
  648. package/dist/react/index.d.ts.map +1 -1
  649. package/dist/react/index.js.map +1 -1
  650. package/dist/test.d.ts +309 -33
  651. package/dist/test.d.ts.map +1 -1
  652. package/package.json +238 -230
  653. package/admin-dist/assets/index-BrbXSzjb.css +0 -1
  654. package/admin-dist/assets/index-CdHu1-Ex.js +0 -96
@@ -1,25 +1,33 @@
1
1
  import { useState, useCallback, useEffect, useRef } from 'react'
2
2
  import { useMutation } from 'convex/react'
3
- import { useApi } from '~/embed/contexts/ApiContext'
4
- import { FieldRenderer } from './fields/FieldRenderer'
3
+ import { toast } from 'sonner'
4
+ import { useApi } from '../embed/contexts/ApiContext'
5
5
  import { VersionHistory } from './VersionHistory'
6
6
  import type { FieldDefinition, FieldError } from './fields/types'
7
- import { parseServerError, isRetryableError } from '~/utils'
8
- import { useSettingsConfig } from '~/contexts'
9
- import { CmsButton } from '~/components/cmsds/CmsButton'
10
- import { CmsStatusBadge } from '~/components/cmsds/CmsStatusBadge'
11
- import { CmsDialog, CmsConfirmDialog } from '~/components/cmsds/CmsDialog'
12
- import { Badge as _Badge } from '~/components/ui/badge'
13
- import { Input } from '~/components/ui/input'
7
+ import { parseServerError, isRetryableError } from '../utils'
8
+ import { useSettingsConfig } from '../contexts'
14
9
  import {
15
- CheckCircle,
16
- AlertCircle,
17
- Loader2,
18
- RefreshCw,
19
- History,
20
- Clock,
21
- } from 'lucide-react'
22
- import { cn } from '~/lib/cn'
10
+ AlertDialog,
11
+ AlertDialogAction,
12
+ AlertDialogCancel,
13
+ AlertDialogContent,
14
+ AlertDialogDescription,
15
+ AlertDialogFooter,
16
+ AlertDialogHeader,
17
+ AlertDialogTitle,
18
+ } from './ui/alert-dialog'
19
+ import {
20
+ EditorToolbar,
21
+ EditorContentPanel,
22
+ EditorPropertiesPanel,
23
+ ScheduleModal,
24
+ PublishConfirmModal,
25
+ DeleteConfirmModal,
26
+ } from './editor'
27
+ import { Sheet, SheetContent, SheetTitle } from './ui/sheet'
28
+ import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from './ui/drawer'
29
+
30
+ // --- Utility functions ---
23
31
 
24
32
  function formatDateTimeLocal(timestamp: number): string {
25
33
  const date = new Date(timestamp)
@@ -81,6 +89,8 @@ function transformDataForBackend(
81
89
  return transformed
82
90
  }
83
91
 
92
+ // --- Types ---
93
+
84
94
  export interface ContentType {
85
95
  _id: string
86
96
  name: string
@@ -111,23 +121,33 @@ interface ContentEntryEditorProps {
111
121
  onSave?: (entry: ContentEntry) => void
112
122
  onCancel?: () => void
113
123
  onDelete?: () => void
124
+ onNavigateToEntry?: (entryId: string) => void
125
+ onNavigateToNewEntry?: () => void
126
+ siblingEntries?: Array<{ _id: string; title: string }>
114
127
  autosaveEnabled?: boolean
115
128
  autosaveInterval?: number
116
129
  canDelete?: boolean
117
130
  }
118
131
 
132
+ // --- Main Component ---
133
+
119
134
  export function ContentEntryEditor({
120
135
  contentType,
121
136
  entry,
122
137
  onSave,
123
138
  onCancel,
124
139
  onDelete,
140
+ onNavigateToEntry,
141
+ onNavigateToNewEntry,
142
+ siblingEntries,
125
143
  autosaveEnabled = true,
126
144
  autosaveInterval = 30000,
127
145
  canDelete: canDeleteProp = false,
128
146
  }: ContentEntryEditorProps) {
129
147
  const { settings } = useSettingsConfig()
130
148
 
149
+ // --- Initial data ---
150
+
131
151
  const getInitialData = useCallback(() => {
132
152
  if (entry) {
133
153
  return transformDataForUI({ ...entry.data }, contentType.fields)
@@ -166,28 +186,49 @@ export function ContentEntryEditor({
166
186
  return defaults
167
187
  }, [contentType.fields, entry])
168
188
 
169
- const [formData, setFormData] =
170
- useState<Record<string, unknown>>(getInitialData)
189
+ // --- State ---
190
+
191
+ const [formData, setFormData] = useState<Record<string, unknown>>(getInitialData)
171
192
  const [fieldErrors, setFieldErrors] = useState<Record<string, FieldError>>({})
172
193
  const [isSubmitting, setIsSubmitting] = useState(false)
173
194
  const [isDirty, setIsDirty] = useState(false)
174
- const [_lastSavedData, setLastSavedData] = useState<Record<
175
- string,
176
- unknown
177
- > | null>(entry ? { ...entry.data } : null)
178
- const [autosaveStatus, setAutosaveStatus] = useState<
179
- 'idle' | 'saving' | 'saved' | 'error'
180
- >('idle')
195
+ const [_lastSavedData, setLastSavedData] = useState<Record<string, unknown> | null>(
196
+ entry ? { ...entry.data } : null
197
+ )
198
+ const [autosaveStatus, setAutosaveStatus] = useState<'idle' | 'saving' | 'saved' | 'error'>('idle')
181
199
  const [autosaveError, setAutosaveError] = useState<string | null>(null)
182
200
  const [autosaveRetryCount, setAutosaveRetryCount] = useState(0)
183
- const [submitError, setSubmitError] = useState<string | null>(null)
184
- const [saveSuccess, setSaveSuccess] = useState(false)
185
201
  const maxAutosaveRetries = 3
186
202
 
203
+ const [showScheduleModal, setShowScheduleModal] = useState(false)
204
+ const [scheduleDateTime, setScheduleDateTime] = useState<string>(() => {
205
+ const tomorrow = new Date()
206
+ tomorrow.setDate(tomorrow.getDate() + 1)
207
+ tomorrow.setHours(9, 0, 0, 0)
208
+ return formatDateTimeLocal(tomorrow.getTime())
209
+ })
210
+ const [isPublishing, setIsPublishing] = useState(false)
211
+ const [publishError, setPublishError] = useState<string | null>(null)
212
+
213
+ const [showConfirmModal, setShowConfirmModal] = useState(false)
214
+ const [confirmAction, setConfirmAction] = useState<'publish' | 'unpublish' | null>(null)
215
+
216
+ const [showDeleteModal, setShowDeleteModal] = useState(false)
217
+ const [isDeleting, setIsDeleting] = useState(false)
218
+ const [deleteError, setDeleteError] = useState<string | null>(null)
219
+
220
+ const [isDuplicating, setIsDuplicating] = useState(false)
221
+ const [isArchiving, setIsArchiving] = useState(false)
222
+ const [showVersionHistory, setShowVersionHistory] = useState(false)
223
+ const [showMobileProperties, setShowMobileProperties] = useState(false)
224
+ const [showUnsavedWarning, setShowUnsavedWarning] = useState(false)
225
+
187
226
  const autosaveTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
188
227
  const formDataRef = useRef(formData)
189
228
  formDataRef.current = formData
190
229
 
230
+ // --- Mutations ---
231
+
191
232
  const api = useApi()
192
233
  const createEntry = useMutation(api.createEntry)
193
234
  const updateEntry = useMutation(api.updateEntry)
@@ -198,15 +239,7 @@ export function ContentEntryEditor({
198
239
  const deleteEntryMutation = useMutation(api.deleteEntry)
199
240
  const duplicateEntryMutation = useMutation(api.duplicateEntry)
200
241
 
201
- const [showScheduleModal, setShowScheduleModal] = useState(false)
202
- const [scheduleDateTime, setScheduleDateTime] = useState<string>(() => {
203
- const tomorrow = new Date()
204
- tomorrow.setDate(tomorrow.getDate() + 1)
205
- tomorrow.setHours(9, 0, 0, 0)
206
- return formatDateTimeLocal(tomorrow.getTime())
207
- })
208
- const [isPublishing, setIsPublishing] = useState(false)
209
- const [publishError, setPublishError] = useState<string | null>(null)
242
+ // --- Effects ---
210
243
 
211
244
  useEffect(() => {
212
245
  const newData = getInitialData()
@@ -214,16 +247,13 @@ export function ContentEntryEditor({
214
247
  setFieldErrors({})
215
248
  setIsDirty(false)
216
249
  setLastSavedData(entry ? { ...entry.data } : null)
217
- setSubmitError(null)
218
250
  }, [entry?._id, getInitialData])
219
251
 
252
+ // --- Field handling ---
253
+
220
254
  const handleFieldChange = useCallback((fieldName: string, value: unknown) => {
221
- setFormData((prev) => {
222
- const updated = { ...prev, [fieldName]: value }
223
- return updated
224
- })
255
+ setFormData((prev) => ({ ...prev, [fieldName]: value }))
225
256
  setIsDirty(true)
226
-
227
257
  setFieldErrors((prev) => {
228
258
  if (prev[fieldName]) {
229
259
  const { [fieldName]: _removed, ...rest } = prev
@@ -233,6 +263,8 @@ export function ContentEntryEditor({
233
263
  })
234
264
  }, [])
235
265
 
266
+ // --- Validation ---
267
+
236
268
  const validateForm = useCallback(async (): Promise<boolean> => {
237
269
  const errors: Record<string, FieldError> = {}
238
270
 
@@ -247,10 +279,7 @@ export function ContentEntryEditor({
247
279
  (Array.isArray(value) && value.length === 0)
248
280
 
249
281
  if (isEmpty) {
250
- errors[field.name] = {
251
- message: `${field.label} is required`,
252
- code: 'REQUIRED',
253
- }
282
+ errors[field.name] = { message: `${field.label} is required`, code: 'REQUIRED' }
254
283
  continue
255
284
  }
256
285
  }
@@ -261,79 +290,47 @@ export function ContentEntryEditor({
261
290
  const strValue = String(value)
262
291
  const opts = field.options
263
292
  if (opts?.minLength && strValue.length < opts.minLength) {
264
- errors[field.name] = {
265
- message: `Minimum ${opts.minLength} characters required`,
266
- code: 'MIN_LENGTH',
267
- }
293
+ errors[field.name] = { message: `Minimum ${opts.minLength} characters required`, code: 'MIN_LENGTH' }
268
294
  } else if (opts?.maxLength && strValue.length > opts.maxLength) {
269
- errors[field.name] = {
270
- message: `Maximum ${opts.maxLength} characters allowed`,
271
- code: 'MAX_LENGTH',
272
- }
295
+ errors[field.name] = { message: `Maximum ${opts.maxLength} characters allowed`, code: 'MAX_LENGTH' }
273
296
  } else if (opts?.pattern) {
274
297
  const regex = new RegExp(opts.pattern)
275
298
  if (!regex.test(strValue)) {
276
- errors[field.name] = {
277
- message: 'Value does not match the required format',
278
- code: 'PATTERN_MISMATCH',
279
- }
299
+ errors[field.name] = { message: 'Value does not match the required format', code: 'PATTERN_MISMATCH' }
280
300
  }
281
301
  }
282
302
  break
283
303
  }
284
-
285
304
  case 'number': {
286
305
  const numValue = Number(value)
287
306
  const opts = field.options
288
307
  if (isNaN(numValue)) {
289
- errors[field.name] = {
290
- message: 'Must be a valid number',
291
- code: 'INVALID_TYPE',
292
- }
308
+ errors[field.name] = { message: 'Must be a valid number', code: 'INVALID_TYPE' }
293
309
  } else {
294
310
  if (opts?.min !== undefined && numValue < opts.min) {
295
- errors[field.name] = {
296
- message: `Minimum value is ${opts.min}`,
297
- code: 'MIN_VALUE',
298
- }
311
+ errors[field.name] = { message: `Minimum value is ${opts.min}`, code: 'MIN_VALUE' }
299
312
  } else if (opts?.max !== undefined && numValue > opts.max) {
300
- errors[field.name] = {
301
- message: `Maximum value is ${opts.max}`,
302
- code: 'MAX_VALUE',
303
- }
313
+ errors[field.name] = { message: `Maximum value is ${opts.max}`, code: 'MAX_VALUE' }
304
314
  } else if (opts?.precision === 0 && !Number.isInteger(numValue)) {
305
- errors[field.name] = {
306
- message: 'Must be a whole number',
307
- code: 'NOT_INTEGER',
308
- }
315
+ errors[field.name] = { message: 'Must be a whole number', code: 'NOT_INTEGER' }
309
316
  }
310
317
  }
311
318
  break
312
319
  }
313
-
314
320
  case 'select': {
315
321
  const opts = field.options
316
322
  if (opts?.options && !opts.options.some((o) => o.value === value)) {
317
- errors[field.name] = {
318
- message: 'Please select a valid option',
319
- code: 'INVALID_OPTION',
320
- }
323
+ errors[field.name] = { message: 'Please select a valid option', code: 'INVALID_OPTION' }
321
324
  }
322
325
  break
323
326
  }
324
-
325
327
  case 'multiSelect': {
326
328
  const opts = field.options
327
329
  if (Array.isArray(value) && opts?.options) {
328
330
  const validValues = opts.options.map((o) => o.value)
329
- const invalid = value.filter(
330
- (v) => !validValues.includes(String(v))
331
- )
331
+ const invalid = value.filter((v) => !validValues.includes(String(v)))
332
332
  if (invalid.length > 0) {
333
- errors[field.name] = {
334
- message: 'Contains invalid options',
335
- code: 'INVALID_OPTION',
336
- }
333
+ errors[field.name] = { message: 'Contains invalid options', code: 'INVALID_OPTION' }
337
334
  }
338
335
  }
339
336
  break
@@ -346,10 +343,11 @@ export function ContentEntryEditor({
346
343
  return Object.keys(errors).length === 0
347
344
  }, [contentType.fields, formData])
348
345
 
346
+ // --- Autosave ---
347
+
349
348
  const autosaveDraft = useCallback(
350
349
  async (retryAttempt = 0) => {
351
350
  if (!isDirty || !entry) return
352
-
353
351
  if (entry.status !== 'draft') return
354
352
 
355
353
  try {
@@ -365,29 +363,18 @@ export function ContentEntryEditor({
365
363
  setAutosaveStatus('saved')
366
364
  setIsDirty(false)
367
365
  setAutosaveRetryCount(0)
368
-
369
- setTimeout(() => {
370
- setAutosaveStatus('idle')
371
- }, 3000)
366
+ setTimeout(() => setAutosaveStatus('idle'), 3000)
372
367
  } catch (error) {
373
368
  console.error('Autosave failed:', error)
374
-
375
- const errorMessage =
376
- error instanceof Error ? error.message : 'Failed to save'
377
- const canRetry =
378
- isRetryableError(error) && retryAttempt < maxAutosaveRetries
369
+ const errorMessage = error instanceof Error ? error.message : 'Failed to save'
370
+ const canRetry = isRetryableError(error) && retryAttempt < maxAutosaveRetries
379
371
 
380
372
  if (canRetry) {
381
373
  const retryDelay = Math.min(1000 * Math.pow(2, retryAttempt), 10000)
382
374
  setAutosaveStatus('error')
383
- setAutosaveError(
384
- `Save failed, retrying in ${Math.round(retryDelay / 1000)}s...`
385
- )
375
+ setAutosaveError(`Save failed, retrying in ${Math.round(retryDelay / 1000)}s...`)
386
376
  setAutosaveRetryCount(retryAttempt + 1)
387
-
388
- setTimeout(() => {
389
- autosaveDraft(retryAttempt + 1)
390
- }, retryDelay)
377
+ setTimeout(() => autosaveDraft(retryAttempt + 1), retryDelay)
391
378
  } else {
392
379
  setAutosaveStatus('error')
393
380
  setAutosaveError(errorMessage)
@@ -404,39 +391,64 @@ export function ContentEntryEditor({
404
391
  }, [autosaveDraft])
405
392
 
406
393
  useEffect(() => {
407
- if (!autosaveEnabled || !entry || entry.status !== 'draft') {
408
- return
409
- }
410
-
411
- if (autosaveTimerRef.current) {
412
- clearTimeout(autosaveTimerRef.current)
413
- }
414
-
394
+ if (!autosaveEnabled || !entry || entry.status !== 'draft') return
395
+ if (autosaveTimerRef.current) clearTimeout(autosaveTimerRef.current)
415
396
  if (isDirty) {
416
- autosaveTimerRef.current = setTimeout(() => {
417
- autosaveDraft()
418
- }, autosaveInterval)
397
+ autosaveTimerRef.current = setTimeout(() => autosaveDraft(), autosaveInterval)
419
398
  }
420
-
421
399
  return () => {
422
- if (autosaveTimerRef.current) {
423
- clearTimeout(autosaveTimerRef.current)
424
- }
400
+ if (autosaveTimerRef.current) clearTimeout(autosaveTimerRef.current)
425
401
  }
426
402
  }, [autosaveEnabled, autosaveInterval, isDirty, entry, autosaveDraft])
427
403
 
428
- const [showConfirmModal, setShowConfirmModal] = useState(false)
429
- const [confirmAction, setConfirmAction] = useState<
430
- 'publish' | 'unpublish' | null
431
- >(null)
404
+ // --- Handlers ---
432
405
 
433
- const [showDeleteModal, setShowDeleteModal] = useState(false)
434
- const [isDeleting, setIsDeleting] = useState(false)
435
- const [deleteError, setDeleteError] = useState<string | null>(null)
406
+ const handleSubmit = useCallback(async () => {
407
+ const isValid = await validateForm()
408
+ if (!isValid) return
436
409
 
437
- const [isDuplicating, setIsDuplicating] = useState(false)
438
- const [isArchiving, setIsArchiving] = useState(false)
439
- const [showVersionHistory, setShowVersionHistory] = useState(false)
410
+ setIsSubmitting(true)
411
+ try {
412
+ let savedEntry: ContentEntry
413
+ const dataForBackend = transformDataForBackend(formData, contentType.fields)
414
+
415
+ if (entry) {
416
+ savedEntry = (await updateEntry({ id: entry._id, data: dataForBackend })) as ContentEntry
417
+ } else {
418
+ savedEntry = (await createEntry({
419
+ contentTypeName: contentType.name,
420
+ data: dataForBackend,
421
+ })) as ContentEntry
422
+ }
423
+
424
+ setIsDirty(false)
425
+ setLastSavedData({ ...formData })
426
+ toast.success('Changes saved')
427
+ onSave?.(savedEntry)
428
+ } catch (error) {
429
+ const { fieldErrors: serverFieldErrors, generalError } = parseServerError(error)
430
+ const message = generalError ?? (error instanceof Error ? error.message : 'Failed to save entry')
431
+ toast.error('Failed to save', { description: message })
432
+ if (Object.keys(serverFieldErrors).length > 0) {
433
+ setFieldErrors((prev) => ({ ...prev, ...serverFieldErrors }))
434
+ }
435
+ } finally {
436
+ setIsSubmitting(false)
437
+ }
438
+ }, [validateForm, entry, formData, contentType.fields, contentType.name, contentType._id, createEntry, updateEntry, onSave])
439
+
440
+ const handleCancel = useCallback(() => {
441
+ if (isDirty) {
442
+ setShowUnsavedWarning(true)
443
+ return
444
+ }
445
+ onCancel?.()
446
+ }, [isDirty, onCancel])
447
+
448
+ const handleConfirmLeave = useCallback(() => {
449
+ setShowUnsavedWarning(false)
450
+ onCancel?.()
451
+ }, [onCancel])
440
452
 
441
453
  const handlePublishClick = useCallback(() => {
442
454
  setConfirmAction('publish')
@@ -450,52 +462,37 @@ export function ContentEntryEditor({
450
462
 
451
463
  const handleConfirmAction = useCallback(async () => {
452
464
  if (!entry || !confirmAction) return
453
-
454
465
  setShowConfirmModal(false)
455
466
  setIsPublishing(true)
456
467
  setPublishError(null)
457
468
 
458
469
  try {
459
470
  if (confirmAction === 'publish') {
460
- const publishedEntry = (await publishEntry({
461
- id: entry._id,
462
- changeDescription: 'Published from editor',
463
- })) as ContentEntry
471
+ const publishedEntry = (await publishEntry({ id: entry._id, changeDescription: 'Published from editor' })) as ContentEntry
472
+ toast.success('Entry published')
464
473
  onSave?.(publishedEntry)
465
474
  } else {
466
- const draftEntry = (await unpublishEntry({
467
- id: entry._id,
468
- })) as ContentEntry
475
+ const draftEntry = (await unpublishEntry({ id: entry._id })) as ContentEntry
476
+ toast.success('Entry unpublished')
469
477
  onSave?.(draftEntry)
470
478
  }
471
479
  } catch (error) {
472
- const message =
473
- error instanceof Error
474
- ? error.message
475
- : `Failed to ${confirmAction}`
476
- setPublishError(message)
480
+ toast.error(`Failed to ${confirmAction}`, { description: error instanceof Error ? error.message : undefined })
477
481
  } finally {
478
482
  setIsPublishing(false)
479
483
  setConfirmAction(null)
480
484
  }
481
485
  }, [entry, confirmAction, publishEntry, unpublishEntry, onSave])
482
486
 
483
- const handlePublish = useCallback(async () => {
487
+ const handlePublishNow = useCallback(async () => {
484
488
  if (!entry) return
485
-
486
489
  setIsPublishing(true)
487
- setPublishError(null)
488
-
489
490
  try {
490
- const publishedEntry = (await publishEntry({
491
- id: entry._id,
492
- changeDescription: 'Published from editor',
493
- })) as ContentEntry
491
+ const publishedEntry = (await publishEntry({ id: entry._id, changeDescription: 'Published from editor' })) as ContentEntry
492
+ toast.success('Entry published')
494
493
  onSave?.(publishedEntry)
495
494
  } catch (error) {
496
- const message =
497
- error instanceof Error ? error.message : 'Failed to publish'
498
- setPublishError(message)
495
+ toast.error('Failed to publish', { description: error instanceof Error ? error.message : undefined })
499
496
  } finally {
500
497
  setIsPublishing(false)
501
498
  }
@@ -503,29 +500,19 @@ export function ContentEntryEditor({
503
500
 
504
501
  const handleSchedule = useCallback(async () => {
505
502
  if (!entry) return
506
-
507
503
  const publishAt = parseDateTimeLocal(scheduleDateTime)
508
- const minimumTime = Date.now() + 60 * 1000
509
-
510
- if (publishAt < minimumTime) {
504
+ if (publishAt < Date.now() + 60 * 1000) {
511
505
  setPublishError('Schedule time must be at least 1 minute in the future')
512
506
  return
513
507
  }
514
-
515
508
  setIsPublishing(true)
516
509
  setPublishError(null)
517
-
518
510
  try {
519
- const scheduledEntry = (await scheduleEntry({
520
- id: entry._id,
521
- publishAt,
522
- })) as ContentEntry
511
+ const scheduledEntry = (await scheduleEntry({ id: entry._id, publishAt })) as ContentEntry
523
512
  setShowScheduleModal(false)
524
513
  onSave?.(scheduledEntry)
525
514
  } catch (error) {
526
- const message =
527
- error instanceof Error ? error.message : 'Failed to schedule'
528
- setPublishError(message)
515
+ setPublishError(error instanceof Error ? error.message : 'Failed to schedule')
529
516
  } finally {
530
517
  setIsPublishing(false)
531
518
  }
@@ -533,19 +520,13 @@ export function ContentEntryEditor({
533
520
 
534
521
  const handleCancelSchedule = useCallback(async () => {
535
522
  if (!entry) return
536
-
537
523
  setIsPublishing(true)
538
524
  setPublishError(null)
539
-
540
525
  try {
541
- const draftEntry = (await cancelScheduleEntry({
542
- id: entry._id,
543
- })) as ContentEntry
526
+ const draftEntry = (await cancelScheduleEntry({ id: entry._id })) as ContentEntry
544
527
  onSave?.(draftEntry)
545
528
  } catch (error) {
546
- const message =
547
- error instanceof Error ? error.message : 'Failed to cancel schedule'
548
- setPublishError(message)
529
+ setPublishError(error instanceof Error ? error.message : 'Failed to cancel schedule')
549
530
  } finally {
550
531
  setIsPublishing(false)
551
532
  }
@@ -558,21 +539,14 @@ export function ContentEntryEditor({
558
539
 
559
540
  const handleDeleteConfirm = useCallback(async () => {
560
541
  if (!entry) return
561
-
562
542
  setIsDeleting(true)
563
543
  setDeleteError(null)
564
-
565
544
  try {
566
- await deleteEntryMutation({
567
- id: entry._id,
568
- hardDelete: false,
569
- })
545
+ await deleteEntryMutation({ id: entry._id, hardDelete: false })
570
546
  setShowDeleteModal(false)
571
547
  onDelete?.()
572
548
  } catch (error) {
573
- const message =
574
- error instanceof Error ? error.message : 'Failed to delete entry'
575
- setDeleteError(message)
549
+ setDeleteError(error instanceof Error ? error.message : 'Failed to delete entry')
576
550
  } finally {
577
551
  setIsDeleting(false)
578
552
  }
@@ -580,19 +554,13 @@ export function ContentEntryEditor({
580
554
 
581
555
  const handleDuplicate = useCallback(async () => {
582
556
  if (!entry) return
583
-
584
557
  setIsDuplicating(true)
585
- setSubmitError(null)
586
-
587
558
  try {
588
- const duplicatedEntry = (await duplicateEntryMutation({
589
- sourceEntryId: entry._id,
590
- })) as ContentEntry
559
+ const duplicatedEntry = (await duplicateEntryMutation({ sourceEntryId: entry._id })) as ContentEntry
560
+ toast.success('Entry duplicated')
591
561
  onSave?.(duplicatedEntry)
592
562
  } catch (error) {
593
- const message =
594
- error instanceof Error ? error.message : 'Failed to duplicate entry'
595
- setSubmitError(message)
563
+ toast.error('Failed to duplicate', { description: error instanceof Error ? error.message : undefined })
596
564
  } finally {
597
565
  setIsDuplicating(false)
598
566
  }
@@ -600,457 +568,196 @@ export function ContentEntryEditor({
600
568
 
601
569
  const handleArchive = useCallback(async () => {
602
570
  if (!entry) return
603
-
604
571
  setIsArchiving(true)
605
- setSubmitError(null)
606
-
607
572
  try {
608
- const archivedEntry = (await updateEntry({
609
- id: entry._id,
610
- status: 'archived',
611
- })) as ContentEntry
573
+ const archivedEntry = (await updateEntry({ id: entry._id, status: 'archived' })) as ContentEntry
574
+ toast.success('Entry archived')
612
575
  onSave?.(archivedEntry)
613
576
  } catch (error) {
614
- const message =
615
- error instanceof Error ? error.message : 'Failed to archive entry'
616
- setSubmitError(message)
577
+ toast.error('Failed to archive', { description: error instanceof Error ? error.message : undefined })
617
578
  } finally {
618
579
  setIsArchiving(false)
619
580
  }
620
581
  }, [entry, updateEntry, onSave])
621
582
 
622
- const handleSubmit = useCallback(
623
- async (e: React.FormEvent) => {
624
- e.preventDefault()
625
- setSubmitError(null)
626
-
627
- const isValid = await validateForm()
628
- if (!isValid) {
629
- return
630
- }
631
-
632
- setIsSubmitting(true)
583
+ // --- Derived ---
633
584
 
634
- try {
635
- let savedEntry: ContentEntry
636
-
637
- const dataForBackend = transformDataForBackend(
638
- formData,
639
- contentType.fields
640
- )
641
-
642
- if (entry) {
643
- savedEntry = (await updateEntry({
644
- id: entry._id,
645
- data: dataForBackend,
646
- })) as ContentEntry
647
- } else {
648
- savedEntry = (await createEntry({
649
- contentTypeName: contentType.name,
650
- data: dataForBackend,
651
- })) as ContentEntry
652
- }
653
-
654
- setIsDirty(false)
655
- setLastSavedData({ ...formData })
656
- setSaveSuccess(true)
657
- setTimeout(() => setSaveSuccess(false), 3000)
658
- onSave?.(savedEntry)
659
- } catch (error) {
660
- const { fieldErrors: serverFieldErrors, generalError } =
661
- parseServerError(error)
662
- const message =
663
- generalError ??
664
- (error instanceof Error ? error.message : 'Failed to save entry')
585
+ const entryTitle = contentType.titleField
586
+ ? (formData[contentType.titleField] as string) || undefined
587
+ : undefined
665
588
 
666
- setSubmitError(message)
589
+ const hasScheduling = !!settings?.features.scheduling
590
+ const hasVersioning = !!settings?.features.versioning
667
591
 
668
- if (Object.keys(serverFieldErrors).length > 0) {
669
- setFieldErrors((prev) => ({ ...prev, ...serverFieldErrors }))
670
- }
671
- } finally {
672
- setIsSubmitting(false)
673
- }
674
- },
675
- [
676
- validateForm,
677
- entry,
678
- formData,
679
- contentType._id,
680
- createEntry,
681
- updateEntry,
682
- onSave,
683
- ]
684
- )
685
-
686
- const handleCancel = useCallback(() => {
687
- if (isDirty) {
688
- const confirmed = window.confirm(
689
- 'You have unsaved changes. Are you sure you want to leave?'
690
- )
691
- if (!confirmed) return
692
- }
693
- onCancel?.()
694
- }, [isDirty, onCancel])
695
-
696
- const getAutosaveStatusText = () => {
697
- switch (autosaveStatus) {
698
- case 'saving':
699
- return autosaveRetryCount > 0
700
- ? `Retrying (${autosaveRetryCount}/${maxAutosaveRetries})...`
701
- : 'Saving...'
702
- case 'saved':
703
- return 'Draft saved'
704
- case 'error':
705
- return autosaveError ?? 'Autosave failed'
706
- default:
707
- return null
708
- }
709
- }
592
+ // --- Render ---
710
593
 
711
594
  return (
712
- <form className="space-y-6" onSubmit={handleSubmit}>
713
- {/* Header */}
714
- <div className="flex flex-wrap items-center justify-between gap-4">
715
- <div className="flex items-center gap-3">
716
- <h2 className="text-xl font-semibold">
717
- {entry ? 'Edit' : 'Create'} {contentType.displayName}
718
- </h2>
719
- {entry && <CmsStatusBadge status={entry.status} />}
720
- </div>
721
-
722
- <div className="flex items-center gap-3">
723
- {autosaveStatus !== 'idle' && (
724
- <div className="flex items-center gap-2">
725
- <span
726
- className={cn(
727
- 'flex items-center gap-1.5 text-sm',
728
- autosaveStatus === 'saving' && 'text-muted-foreground',
729
- autosaveStatus === 'saved' && 'text-success',
730
- autosaveStatus === 'error' && 'text-destructive'
731
- )}
732
- data-testid="autosave-status"
733
- >
734
- {autosaveStatus === 'saving' && (
735
- <Loader2 className="size-3 animate-spin" />
736
- )}
737
- {autosaveStatus === 'saved' && (
738
- <CheckCircle className="size-3" />
739
- )}
740
- {autosaveStatus === 'error' && (
741
- <AlertCircle className="size-3" />
742
- )}
743
- {getAutosaveStatusText()}
744
- </span>
745
- {autosaveStatus === 'error' && autosaveRetryCount === 0 && (
746
- <button
747
- type="button"
748
- onClick={handleAutosaveRetry}
749
- className="text-sm text-primary hover:underline"
750
- data-testid="autosave-retry-button"
751
- >
752
- <RefreshCw className="size-3" />
753
- </button>
754
- )}
755
- </div>
756
- )}
757
-
758
- {isDirty && (
759
- <span className="text-sm text-warning">Unsaved changes</span>
760
- )}
761
- </div>
762
- </div>
595
+ <div className="flex h-full flex-col">
596
+ {/* Sticky Toolbar */}
597
+ <EditorToolbar
598
+ contentType={contentType}
599
+ entry={entry}
600
+ entryTitle={entryTitle}
601
+ isDirty={isDirty}
602
+ isSubmitting={isSubmitting}
603
+ isPublishing={isPublishing}
604
+ autosaveStatus={autosaveStatus}
605
+ autosaveError={autosaveError}
606
+ autosaveRetryCount={autosaveRetryCount}
607
+ maxAutosaveRetries={maxAutosaveRetries}
608
+ canDelete={canDeleteProp}
609
+ hasScheduling={hasScheduling}
610
+ onSave={handleSubmit}
611
+ onCancel={handleCancel}
612
+ onPublishClick={handlePublishClick}
613
+ onUnpublishClick={handleUnpublishClick}
614
+ onScheduleClick={() => setShowScheduleModal(true)}
615
+ onCancelSchedule={handleCancelSchedule}
616
+ onPublishNow={handlePublishNow}
617
+ onDuplicate={handleDuplicate}
618
+ onArchive={handleArchive}
619
+ onDelete={handleDeleteClick}
620
+ onAutosaveRetry={handleAutosaveRetry}
621
+ onToggleProperties={() => setShowMobileProperties(true)}
622
+ siblingEntries={siblingEntries}
623
+ onNavigateToEntry={onNavigateToEntry}
624
+ onNavigateToNewEntry={onNavigateToNewEntry}
625
+ />
763
626
 
764
- {/* Success/Error Messages */}
765
- {saveSuccess && (
766
- <div
767
- className="diff-added flex items-center gap-2 rounded-lg border px-4 py-3 text-sm"
768
- role="status"
769
- >
770
- <CheckCircle className="size-4" />
771
- Changes saved successfully
627
+ {/* Unsaved changes warning */}
628
+ <AlertDialog open={showUnsavedWarning} onOpenChange={setShowUnsavedWarning}>
629
+ <AlertDialogContent>
630
+ <AlertDialogHeader>
631
+ <AlertDialogTitle>Unsaved changes</AlertDialogTitle>
632
+ <AlertDialogDescription>
633
+ You have unsaved changes that will be lost if you leave.
634
+ </AlertDialogDescription>
635
+ </AlertDialogHeader>
636
+ <AlertDialogFooter>
637
+ <AlertDialogCancel>Keep editing</AlertDialogCancel>
638
+ <AlertDialogAction onClick={handleConfirmLeave} className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
639
+ Discard changes
640
+ </AlertDialogAction>
641
+ </AlertDialogFooter>
642
+ </AlertDialogContent>
643
+ </AlertDialog>
644
+
645
+ {/* Two-panel layout — each panel scrolls independently */}
646
+ <div className="flex min-h-0 flex-1">
647
+ {/* Content panel — independent scroll */}
648
+ <div className="min-w-0 flex-1 overflow-y-auto p-6">
649
+ <EditorContentPanel
650
+ fields={contentType.fields as FieldDefinition[]}
651
+ formData={formData}
652
+ fieldErrors={fieldErrors}
653
+ isSubmitting={isSubmitting}
654
+ onFieldChange={handleFieldChange}
655
+ />
772
656
  </div>
773
- )}
774
657
 
775
- {(submitError || publishError) && (
776
- <div
777
- className="diff-removed rounded-lg border px-4 py-3 text-sm"
778
- role="alert"
779
- >
780
- <span className="font-medium">Error:</span> {submitError || publishError}
781
- </div>
782
- )}
783
-
784
- {/* Fields */}
785
- <div className="space-y-4">
786
- {contentType.fields.map((field) => (
787
- <FieldRenderer
788
- key={field.name}
789
- field={field}
790
- value={formData[field.name]}
791
- onChange={(value) => handleFieldChange(field.name, value)}
792
- error={fieldErrors[field.name]}
793
- disabled={isSubmitting}
794
- />
795
- ))}
658
+ {/* Properties panel independent scroll, desktop only */}
659
+ {entry && (
660
+ <aside className="hidden w-80 shrink-0 overflow-y-auto border-l p-6 lg:block">
661
+ <EditorPropertiesPanel
662
+ entry={entry}
663
+ hasScheduling={hasScheduling}
664
+ hasVersioning={hasVersioning}
665
+ canDelete={canDeleteProp}
666
+ isSubmitting={isSubmitting}
667
+ isPublishing={isPublishing}
668
+ isDuplicating={isDuplicating}
669
+ isArchiving={isArchiving}
670
+ isDeleting={isDeleting}
671
+ onPublishClick={handlePublishClick}
672
+ onUnpublishClick={handleUnpublishClick}
673
+ onScheduleClick={() => setShowScheduleModal(true)}
674
+ onCancelSchedule={handleCancelSchedule}
675
+ onPublishNow={handlePublishNow}
676
+ onDuplicate={handleDuplicate}
677
+ onArchive={handleArchive}
678
+ onDelete={handleDeleteClick}
679
+ onViewHistory={() => setShowVersionHistory(true)}
680
+ />
681
+ </aside>
682
+ )}
796
683
  </div>
797
684
 
798
- {/* Footer */}
799
- <div className="flex flex-wrap items-center justify-between gap-4 border-t pt-4">
800
- <div className="flex flex-wrap items-center gap-2">
801
- {entry && canDeleteProp && (
802
- <CmsButton
803
- type="button"
804
- variant="danger"
805
- onClick={handleDeleteClick}
806
- disabled={
807
- isSubmitting ||
808
- isPublishing ||
809
- isDeleting ||
810
- isDuplicating
811
- }
812
- loading={isDeleting}
813
- data-testid="delete-button"
814
- >
815
- Delete
816
- </CmsButton>
817
- )}
818
-
819
- {entry && (
820
- <CmsButton
821
- type="button"
822
- variant="secondary"
823
- onClick={handleDuplicate}
824
- disabled={
825
- isSubmitting ||
826
- isPublishing ||
827
- isDeleting ||
828
- isDuplicating ||
829
- isArchiving
830
- }
831
- loading={isDuplicating}
832
- data-testid="duplicate-button"
833
- >
834
- Duplicate
835
- </CmsButton>
836
- )}
837
-
838
- {entry &&
839
- (entry.status === 'draft' || entry.status === 'scheduled') && (
840
- <CmsButton
841
- type="button"
842
- variant="secondary"
843
- onClick={handleArchive}
844
- disabled={
845
- isSubmitting ||
846
- isPublishing ||
847
- isDeleting ||
848
- isDuplicating ||
849
- isArchiving
850
- }
851
- loading={isArchiving}
852
- data-testid="archive-button"
853
- >
854
- Archive
855
- </CmsButton>
856
- )}
857
-
858
- {entry && (
859
- <div className="flex items-center gap-4 text-sm text-muted-foreground">
860
- {settings?.features.versioning && (
861
- <button
862
- type="button"
863
- onClick={() => setShowVersionHistory(true)}
864
- className="flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-1.5 transition-colors hover:bg-muted/50"
865
- >
866
- <History className="size-4 text-muted-foreground" />
867
- <span className="text-xs font-medium text-foreground">
868
- Version {entry.version}
869
- </span>
870
- <span className="text-xs text-muted-foreground">
871
- View history
872
- </span>
873
- </button>
874
- )}
875
-
876
- {entry.lastPublishedAt && (
877
- <span
878
- className="text-xs"
879
- data-testid="last-published-time"
880
- >
881
- Last published:{' '}
882
- {new Date(entry.lastPublishedAt).toLocaleString()}
883
- </span>
884
- )}
885
-
886
- {settings?.features.scheduling &&
887
- entry.status === 'scheduled' &&
888
- entry.scheduledPublishAt && (
889
- <span
890
- className="flex items-center gap-1 text-xs text-info"
891
- data-testid="scheduled-time"
892
- >
893
- <Clock className="size-3" />
894
- Scheduled:{' '}
895
- {new Date(entry.scheduledPublishAt).toLocaleString()}
896
- </span>
897
- )}
685
+ {/* Mobile properties drawer (bottom sheet) */}
686
+ {entry && (
687
+ <Drawer open={showMobileProperties} onOpenChange={setShowMobileProperties}>
688
+ <DrawerContent>
689
+ <DrawerHeader>
690
+ <DrawerTitle>Properties</DrawerTitle>
691
+ </DrawerHeader>
692
+ <div className="overflow-y-auto px-4 pb-6">
693
+ <EditorPropertiesPanel
694
+ entry={entry}
695
+ hasScheduling={hasScheduling}
696
+ hasVersioning={hasVersioning}
697
+ canDelete={canDeleteProp}
698
+ isSubmitting={isSubmitting}
699
+ isPublishing={isPublishing}
700
+ isDuplicating={isDuplicating}
701
+ isArchiving={isArchiving}
702
+ isDeleting={isDeleting}
703
+ onPublishClick={handlePublishClick}
704
+ onUnpublishClick={handleUnpublishClick}
705
+ onScheduleClick={() => setShowScheduleModal(true)}
706
+ onCancelSchedule={handleCancelSchedule}
707
+ onPublishNow={handlePublishNow}
708
+ onDuplicate={handleDuplicate}
709
+ onArchive={handleArchive}
710
+ onDelete={handleDeleteClick}
711
+ onViewHistory={() => setShowVersionHistory(true)}
712
+ />
898
713
  </div>
899
- )}
900
- </div>
714
+ </DrawerContent>
715
+ </Drawer>
716
+ )}
901
717
 
902
- <div className="flex flex-wrap items-center gap-2">
903
- <CmsButton
904
- type="button"
905
- variant="outline"
906
- onClick={handleCancel}
907
- disabled={isSubmitting || isPublishing}
908
- >
909
- Cancel
910
- </CmsButton>
911
-
912
- <CmsButton
913
- type="submit"
914
- variant="primary"
915
- disabled={isSubmitting || isPublishing}
916
- loading={isSubmitting}
917
- >
918
- {entry ? 'Save Changes' : 'Create Entry'}
919
- </CmsButton>
920
-
921
- {entry && (
922
- <>
923
- {entry.status === 'draft' && (
924
- <>
925
- {settings?.features.scheduling && (
926
- <CmsButton
927
- type="button"
928
- variant="secondary"
929
- onClick={() => setShowScheduleModal(true)}
930
- disabled={isSubmitting || isPublishing}
931
- >
932
- Schedule
933
- </CmsButton>
934
- )}
935
- <CmsButton
936
- type="button"
937
- variant="success"
938
- onClick={handlePublishClick}
939
- disabled={isSubmitting || isPublishing}
940
- loading={isPublishing}
941
- data-testid="publish-button"
942
- >
943
- Publish Now
944
- </CmsButton>
945
- </>
946
- )}
947
-
948
- {settings?.features.scheduling && entry.status === 'scheduled' && (
949
- <>
950
- <CmsButton
951
- type="button"
952
- variant="secondary"
953
- onClick={handleCancelSchedule}
954
- disabled={isSubmitting || isPublishing}
955
- >
956
- Cancel Schedule
957
- </CmsButton>
958
- <CmsButton
959
- type="button"
960
- variant="success"
961
- onClick={handlePublish}
962
- disabled={isSubmitting || isPublishing}
963
- loading={isPublishing}
964
- >
965
- Publish Now
966
- </CmsButton>
967
- </>
968
- )}
969
-
970
- {entry.status === 'published' && (
971
- <CmsButton
972
- type="button"
973
- variant="warning"
974
- onClick={handleUnpublishClick}
975
- disabled={isSubmitting || isPublishing}
976
- loading={isPublishing}
977
- data-testid="unpublish-button"
978
- >
979
- Unpublish
980
- </CmsButton>
981
- )}
982
- </>
983
- )}
984
- </div>
985
- </div>
718
+ {/* Version History sheet */}
719
+ {hasVersioning && entry && (
720
+ <Sheet open={showVersionHistory} onOpenChange={setShowVersionHistory}>
721
+ <SheetContent side="right" className="w-96 sm:w-[420px]">
722
+ <SheetTitle>Version History</SheetTitle>
723
+ <VersionHistory
724
+ entryId={entry._id}
725
+ currentVersion={entry.version}
726
+ onRollbackComplete={() => setShowVersionHistory(false)}
727
+ onClose={() => setShowVersionHistory(false)}
728
+ />
729
+ </SheetContent>
730
+ </Sheet>
731
+ )}
986
732
 
987
- {/* Schedule Modal */}
988
- {settings?.features.scheduling && (
989
- <CmsDialog
733
+ {/* Modals */}
734
+ {hasScheduling && (
735
+ <ScheduleModal
990
736
  open={showScheduleModal}
991
737
  onOpenChange={setShowScheduleModal}
992
- title="Schedule Publication"
993
- size="sm"
994
- footer={
995
- <>
996
- <CmsButton
997
- variant="outline"
998
- onClick={() => setShowScheduleModal(false)}
999
- >
1000
- Cancel
1001
- </CmsButton>
1002
- <CmsButton
1003
- variant="primary"
1004
- onClick={handleSchedule}
1005
- loading={isPublishing}
1006
- >
1007
- Schedule
1008
- </CmsButton>
1009
- </>
1010
- }
1011
- >
1012
- <div className="space-y-4">
1013
- <p className="text-sm text-muted-foreground">
1014
- Choose when this content should be automatically published:
1015
- </p>
1016
- <Input
1017
- type="datetime-local"
1018
- value={scheduleDateTime}
1019
- onChange={(e) => setScheduleDateTime(e.target.value)}
1020
- min={formatDateTimeLocal(Date.now() + 60 * 1000)}
1021
- />
1022
- {publishError && (
1023
- <p className="text-sm text-destructive">{publishError}</p>
1024
- )}
1025
- </div>
1026
- </CmsDialog>
738
+ scheduleDateTime={scheduleDateTime}
739
+ onScheduleDateTimeChange={setScheduleDateTime}
740
+ onSchedule={handleSchedule}
741
+ isPublishing={isPublishing}
742
+ publishError={publishError}
743
+ minDateTime={formatDateTimeLocal(Date.now() + 60 * 1000)}
744
+ />
1027
745
  )}
1028
746
 
1029
- {/* Publish/Unpublish Confirmation Modal */}
1030
- <CmsConfirmDialog
1031
- open={showConfirmModal && confirmAction !== null}
747
+ <PublishConfirmModal
748
+ open={showConfirmModal}
1032
749
  onOpenChange={(open) => {
1033
750
  if (!open) {
1034
751
  setShowConfirmModal(false)
1035
752
  setConfirmAction(null)
1036
753
  }
1037
754
  }}
1038
- title={
1039
- confirmAction === 'publish' ? 'Confirm Publish' : 'Confirm Unpublish'
1040
- }
1041
- description={
1042
- confirmAction === 'publish'
1043
- ? 'Are you sure you want to publish this entry? It will become publicly visible.'
1044
- : 'Are you sure you want to unpublish this entry? It will no longer be publicly visible.'
1045
- }
1046
- confirmLabel={confirmAction === 'publish' ? 'Publish' : 'Unpublish'}
1047
- variant={confirmAction === 'publish' ? 'primary' : 'warning'}
755
+ action={confirmAction}
1048
756
  onConfirm={handleConfirmAction}
1049
- isLoading={isPublishing}
757
+ isPublishing={isPublishing}
1050
758
  />
1051
759
 
1052
- {/* Delete Confirmation Modal */}
1053
- <CmsConfirmDialog
760
+ <DeleteConfirmModal
1054
761
  open={showDeleteModal}
1055
762
  onOpenChange={(open) => {
1056
763
  if (!open && !isDeleting) {
@@ -1058,28 +765,10 @@ export function ContentEntryEditor({
1058
765
  setDeleteError(null)
1059
766
  }
1060
767
  }}
1061
- title="Delete Entry"
1062
- description="Are you sure you want to delete this entry? It will be moved to the trash and can be restored within the retention period."
1063
- confirmLabel="Delete"
1064
- variant="danger"
1065
768
  onConfirm={handleDeleteConfirm}
1066
- isLoading={isDeleting}
769
+ isDeleting={isDeleting}
1067
770
  error={deleteError}
1068
771
  />
1069
-
1070
- {/* Version History Panel */}
1071
- {settings?.features.versioning && showVersionHistory && entry && (
1072
- <div className="fixed inset-y-0 right-0 z-50 flex w-96 flex-col shadow-xl">
1073
- <VersionHistory
1074
- entryId={entry._id}
1075
- currentVersion={entry.version}
1076
- onRollbackComplete={() => {
1077
- setShowVersionHistory(false)
1078
- }}
1079
- onClose={() => setShowVersionHistory(false)}
1080
- />
1081
- </div>
1082
- )}
1083
- </form>
772
+ </div>
1084
773
  )
1085
774
  }