@actuate-media/cms-admin 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +44 -42
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/__tests__/lib/search.test.js +10 -10
  5. package/dist/__tests__/lib/search.test.js.map +1 -1
  6. package/dist/__tests__/lib/utils.test.js.map +1 -1
  7. package/dist/__tests__/router/match-route.test.js.map +1 -1
  8. package/dist/__tests__/router/strip-base.test.js.map +1 -1
  9. package/dist/components/Breadcrumbs.d.ts.map +1 -1
  10. package/dist/components/Breadcrumbs.js +2 -4
  11. package/dist/components/Breadcrumbs.js.map +1 -1
  12. package/dist/components/CommandPalette.d.ts.map +1 -1
  13. package/dist/components/CommandPalette.js +7 -3
  14. package/dist/components/CommandPalette.js.map +1 -1
  15. package/dist/components/ContentOverviewChart.d.ts.map +1 -1
  16. package/dist/components/ContentOverviewChart.js.map +1 -1
  17. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  18. package/dist/components/ErrorBoundary.js.map +1 -1
  19. package/dist/components/FocalPointPicker.d.ts.map +1 -1
  20. package/dist/components/FocalPointPicker.js +4 -2
  21. package/dist/components/FocalPointPicker.js.map +1 -1
  22. package/dist/components/FolderTree.d.ts.map +1 -1
  23. package/dist/components/FolderTree.js +18 -10
  24. package/dist/components/FolderTree.js.map +1 -1
  25. package/dist/components/LivePreview.d.ts +1 -1
  26. package/dist/components/LivePreview.d.ts.map +1 -1
  27. package/dist/components/LivePreview.js +6 -2
  28. package/dist/components/LivePreview.js.map +1 -1
  29. package/dist/components/LocaleProvider.d.ts.map +1 -1
  30. package/dist/components/LocaleProvider.js.map +1 -1
  31. package/dist/components/LocaleSwitcher.d.ts.map +1 -1
  32. package/dist/components/LocaleSwitcher.js +1 -1
  33. package/dist/components/LocaleSwitcher.js.map +1 -1
  34. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  35. package/dist/components/MediaPickerModal.js.map +1 -1
  36. package/dist/components/PresenceIndicator.d.ts.map +1 -1
  37. package/dist/components/PresenceIndicator.js +5 -2
  38. package/dist/components/PresenceIndicator.js.map +1 -1
  39. package/dist/components/SEOPanel.d.ts +1 -1
  40. package/dist/components/SEOPanel.d.ts.map +1 -1
  41. package/dist/components/SEOPanel.js +110 -24
  42. package/dist/components/SEOPanel.js.map +1 -1
  43. package/dist/components/SEOPerformance.d.ts.map +1 -1
  44. package/dist/components/SEOPerformance.js +2 -2
  45. package/dist/components/SEOPerformance.js.map +1 -1
  46. package/dist/components/ThemeProvider.d.ts.map +1 -1
  47. package/dist/components/ThemeProvider.js.map +1 -1
  48. package/dist/components/TipTapEditor.d.ts.map +1 -1
  49. package/dist/components/TipTapEditor.js +5 -1
  50. package/dist/components/TipTapEditor.js.map +1 -1
  51. package/dist/components/VersionHistory.d.ts +1 -1
  52. package/dist/components/VersionHistory.d.ts.map +1 -1
  53. package/dist/components/VersionHistory.js +1 -1
  54. package/dist/components/VersionHistory.js.map +1 -1
  55. package/dist/components/ui/Avatar.d.ts.map +1 -1
  56. package/dist/components/ui/Avatar.js.map +1 -1
  57. package/dist/components/ui/Badge.d.ts.map +1 -1
  58. package/dist/components/ui/Badge.js.map +1 -1
  59. package/dist/components/ui/Button.d.ts.map +1 -1
  60. package/dist/components/ui/Button.js.map +1 -1
  61. package/dist/components/ui/CommandPalette.d.ts.map +1 -1
  62. package/dist/components/ui/CommandPalette.js +8 -2
  63. package/dist/components/ui/CommandPalette.js.map +1 -1
  64. package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
  65. package/dist/components/ui/ConfirmDialog.js.map +1 -1
  66. package/dist/components/ui/DataTable.d.ts.map +1 -1
  67. package/dist/components/ui/DataTable.js +1 -3
  68. package/dist/components/ui/DataTable.js.map +1 -1
  69. package/dist/components/ui/EmptyState.d.ts.map +1 -1
  70. package/dist/components/ui/EmptyState.js +1 -1
  71. package/dist/components/ui/EmptyState.js.map +1 -1
  72. package/dist/components/ui/Modal.d.ts.map +1 -1
  73. package/dist/components/ui/Modal.js.map +1 -1
  74. package/dist/components/ui/Pagination.d.ts +1 -1
  75. package/dist/components/ui/Pagination.d.ts.map +1 -1
  76. package/dist/components/ui/Pagination.js +7 -2
  77. package/dist/components/ui/Pagination.js.map +1 -1
  78. package/dist/components/ui/SearchInput.d.ts.map +1 -1
  79. package/dist/components/ui/SearchInput.js.map +1 -1
  80. package/dist/components/ui/Skeleton.d.ts.map +1 -1
  81. package/dist/components/ui/Skeleton.js.map +1 -1
  82. package/dist/components/ui/Toast.d.ts.map +1 -1
  83. package/dist/components/ui/Toast.js.map +1 -1
  84. package/dist/components/ui/index.d.ts.map +1 -1
  85. package/dist/components/ui/index.js.map +1 -1
  86. package/dist/fields/ArrayField.d.ts.map +1 -1
  87. package/dist/fields/ArrayField.js +1 -1
  88. package/dist/fields/ArrayField.js.map +1 -1
  89. package/dist/fields/BlockBuilderField.d.ts.map +1 -1
  90. package/dist/fields/BlockBuilderField.js +7 -7
  91. package/dist/fields/BlockBuilderField.js.map +1 -1
  92. package/dist/fields/DateField.d.ts.map +1 -1
  93. package/dist/fields/DateField.js +1 -1
  94. package/dist/fields/DateField.js.map +1 -1
  95. package/dist/fields/FieldRenderer.d.ts.map +1 -1
  96. package/dist/fields/FieldRenderer.js.map +1 -1
  97. package/dist/fields/GroupField.d.ts.map +1 -1
  98. package/dist/fields/GroupField.js +1 -1
  99. package/dist/fields/GroupField.js.map +1 -1
  100. package/dist/fields/MediaField.d.ts.map +1 -1
  101. package/dist/fields/MediaField.js +1 -1
  102. package/dist/fields/MediaField.js.map +1 -1
  103. package/dist/fields/NavBuilderField.d.ts.map +1 -1
  104. package/dist/fields/NavBuilderField.js +2 -5
  105. package/dist/fields/NavBuilderField.js.map +1 -1
  106. package/dist/fields/NumberField.d.ts +1 -1
  107. package/dist/fields/NumberField.d.ts.map +1 -1
  108. package/dist/fields/NumberField.js +2 -2
  109. package/dist/fields/NumberField.js.map +1 -1
  110. package/dist/fields/RelationshipField.d.ts.map +1 -1
  111. package/dist/fields/RelationshipField.js +7 -3
  112. package/dist/fields/RelationshipField.js.map +1 -1
  113. package/dist/fields/RichTextField.d.ts +1 -1
  114. package/dist/fields/RichTextField.d.ts.map +1 -1
  115. package/dist/fields/RichTextField.js +2 -2
  116. package/dist/fields/RichTextField.js.map +1 -1
  117. package/dist/fields/SelectField.d.ts.map +1 -1
  118. package/dist/fields/SelectField.js +9 -7
  119. package/dist/fields/SelectField.js.map +1 -1
  120. package/dist/fields/SlugField.d.ts.map +1 -1
  121. package/dist/fields/SlugField.js +1 -1
  122. package/dist/fields/SlugField.js.map +1 -1
  123. package/dist/fields/TextField.d.ts +1 -1
  124. package/dist/fields/TextField.d.ts.map +1 -1
  125. package/dist/fields/TextField.js +2 -2
  126. package/dist/fields/TextField.js.map +1 -1
  127. package/dist/fields/ToggleField.d.ts.map +1 -1
  128. package/dist/fields/ToggleField.js +1 -1
  129. package/dist/fields/ToggleField.js.map +1 -1
  130. package/dist/fields/block-types.d.ts.map +1 -1
  131. package/dist/fields/block-types.js +28 -8
  132. package/dist/fields/block-types.js.map +1 -1
  133. package/dist/fields/index.d.ts.map +1 -1
  134. package/dist/fields/index.js.map +1 -1
  135. package/dist/hooks/useBuilderState.d.ts.map +1 -1
  136. package/dist/hooks/useBuilderState.js.map +1 -1
  137. package/dist/hooks/useContentLock.d.ts.map +1 -1
  138. package/dist/hooks/useContentLock.js.map +1 -1
  139. package/dist/hooks/useDebounce.js.map +1 -1
  140. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  141. package/dist/hooks/useKeyboardShortcuts.js.map +1 -1
  142. package/dist/index.d.ts +2 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/layout/Header.d.ts.map +1 -1
  146. package/dist/layout/Header.js.map +1 -1
  147. package/dist/layout/Layout.d.ts.map +1 -1
  148. package/dist/layout/Layout.js.map +1 -1
  149. package/dist/layout/Sidebar.d.ts +1 -1
  150. package/dist/layout/Sidebar.d.ts.map +1 -1
  151. package/dist/layout/Sidebar.js +5 -8
  152. package/dist/layout/Sidebar.js.map +1 -1
  153. package/dist/lib/api.js.map +1 -1
  154. package/dist/lib/search.d.ts.map +1 -1
  155. package/dist/lib/search.js +3 -5
  156. package/dist/lib/search.js.map +1 -1
  157. package/dist/lib/useApiData.d.ts.map +1 -1
  158. package/dist/lib/useApiData.js.map +1 -1
  159. package/dist/lib/utils.d.ts.map +1 -1
  160. package/dist/lib/utils.js.map +1 -1
  161. package/dist/router/index.d.ts.map +1 -1
  162. package/dist/router/index.js +1 -3
  163. package/dist/router/index.js.map +1 -1
  164. package/dist/views/CollectionList.d.ts.map +1 -1
  165. package/dist/views/CollectionList.js +56 -17
  166. package/dist/views/CollectionList.js.map +1 -1
  167. package/dist/views/Dashboard.d.ts.map +1 -1
  168. package/dist/views/Dashboard.js +26 -13
  169. package/dist/views/Dashboard.js.map +1 -1
  170. package/dist/views/DocumentEdit.d.ts +1 -1
  171. package/dist/views/DocumentEdit.d.ts.map +1 -1
  172. package/dist/views/DocumentEdit.js +33 -15
  173. package/dist/views/DocumentEdit.js.map +1 -1
  174. package/dist/views/ForgotPassword.d.ts.map +1 -1
  175. package/dist/views/ForgotPassword.js.map +1 -1
  176. package/dist/views/FormEditor.d.ts.map +1 -1
  177. package/dist/views/FormEditor.js +8 -2
  178. package/dist/views/FormEditor.js.map +1 -1
  179. package/dist/views/FormSubmissions.d.ts.map +1 -1
  180. package/dist/views/FormSubmissions.js +6 -6
  181. package/dist/views/FormSubmissions.js.map +1 -1
  182. package/dist/views/Forms.d.ts.map +1 -1
  183. package/dist/views/Forms.js.map +1 -1
  184. package/dist/views/Login.d.ts.map +1 -1
  185. package/dist/views/Login.js +5 -2
  186. package/dist/views/Login.js.map +1 -1
  187. package/dist/views/MediaBrowser.d.ts.map +1 -1
  188. package/dist/views/MediaBrowser.js +39 -19
  189. package/dist/views/MediaBrowser.js.map +1 -1
  190. package/dist/views/PageEditor.d.ts.map +1 -1
  191. package/dist/views/PageEditor.js.map +1 -1
  192. package/dist/views/Pages.d.ts.map +1 -1
  193. package/dist/views/Pages.js +20 -10
  194. package/dist/views/Pages.js.map +1 -1
  195. package/dist/views/PostEditor.d.ts.map +1 -1
  196. package/dist/views/PostEditor.js.map +1 -1
  197. package/dist/views/Posts.d.ts.map +1 -1
  198. package/dist/views/Posts.js +13 -7
  199. package/dist/views/Posts.js.map +1 -1
  200. package/dist/views/Redirects.d.ts.map +1 -1
  201. package/dist/views/Redirects.js +17 -5
  202. package/dist/views/Redirects.js.map +1 -1
  203. package/dist/views/ResetPassword.d.ts.map +1 -1
  204. package/dist/views/ResetPassword.js.map +1 -1
  205. package/dist/views/SEO.d.ts.map +1 -1
  206. package/dist/views/SEO.js +39 -16
  207. package/dist/views/SEO.js.map +1 -1
  208. package/dist/views/ScriptTagEditor.d.ts.map +1 -1
  209. package/dist/views/ScriptTagEditor.js +2 -1
  210. package/dist/views/ScriptTagEditor.js.map +1 -1
  211. package/dist/views/ScriptTags.d.ts.map +1 -1
  212. package/dist/views/ScriptTags.js.map +1 -1
  213. package/dist/views/Settings.d.ts.map +1 -1
  214. package/dist/views/Settings.js +38 -11
  215. package/dist/views/Settings.js.map +1 -1
  216. package/dist/views/SetupWizard.d.ts.map +1 -1
  217. package/dist/views/SetupWizard.js.map +1 -1
  218. package/dist/views/Users.d.ts.map +1 -1
  219. package/dist/views/Users.js +5 -3
  220. package/dist/views/Users.js.map +1 -1
  221. package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
  222. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  223. package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
  224. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  225. package/dist/views/page-builder/AIGenerateDialog.js +4 -1
  226. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  227. package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
  228. package/dist/views/page-builder/BlockEditor.js +1 -1
  229. package/dist/views/page-builder/BlockEditor.js.map +1 -1
  230. package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
  231. package/dist/views/page-builder/BlockPicker.js.map +1 -1
  232. package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
  233. package/dist/views/page-builder/BottomBar.js.map +1 -1
  234. package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
  235. package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
  236. package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
  237. package/dist/views/page-builder/ContextPanel.js +4 -1
  238. package/dist/views/page-builder/ContextPanel.js.map +1 -1
  239. package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
  240. package/dist/views/page-builder/DesignScore.js.map +1 -1
  241. package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
  242. package/dist/views/page-builder/NodeSettings.js +1 -1
  243. package/dist/views/page-builder/NodeSettings.js.map +1 -1
  244. package/dist/views/page-builder/PageBuilder.d.ts +1 -1
  245. package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
  246. package/dist/views/page-builder/PageBuilder.js +4 -2
  247. package/dist/views/page-builder/PageBuilder.js.map +1 -1
  248. package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
  249. package/dist/views/page-builder/PageSettings.js.map +1 -1
  250. package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
  251. package/dist/views/page-builder/PageTemplates.js.map +1 -1
  252. package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
  253. package/dist/views/page-builder/SEOPanel.js +1 -3
  254. package/dist/views/page-builder/SEOPanel.js.map +1 -1
  255. package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
  256. package/dist/views/page-builder/SavedSections.js +3 -7
  257. package/dist/views/page-builder/SavedSections.js.map +1 -1
  258. package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
  259. package/dist/views/page-builder/TemplatePicker.js.map +1 -1
  260. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
  261. package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
  262. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
  263. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
  264. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  265. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
  266. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
  267. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
  268. package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
  269. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
  270. package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
  271. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
  272. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
  273. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
  274. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
  275. package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
  276. package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
  277. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
  278. package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
  279. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
  280. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
  281. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
  282. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
  283. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
  284. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
  285. package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
  286. package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
  287. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
  288. package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
  289. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
  290. package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
  291. package/dist/views/page-builder/block-renderers/index.js.map +1 -1
  292. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
  293. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
  294. package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
  295. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
  296. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
  297. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
  298. package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
  299. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
  300. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
  301. package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
  302. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
  303. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
  304. package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
  305. package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
  306. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
  307. package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
  308. package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
  309. package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
  310. package/dist/views/page-builder/canvas/index.js.map +1 -1
  311. package/package.json +2 -2
  312. package/src/AdminRoot.tsx +263 -191
  313. package/src/__tests__/lib/search.test.ts +60 -69
  314. package/src/__tests__/lib/utils.test.ts +12 -12
  315. package/src/__tests__/router/match-route.test.ts +24 -26
  316. package/src/__tests__/router/strip-base.test.ts +15 -15
  317. package/src/components/Breadcrumbs.tsx +27 -24
  318. package/src/components/CommandPalette.tsx +115 -99
  319. package/src/components/ContentOverviewChart.tsx +19 -14
  320. package/src/components/ErrorBoundary.tsx +13 -13
  321. package/src/components/FocalPointPicker.tsx +31 -20
  322. package/src/components/FolderTree.tsx +172 -139
  323. package/src/components/LivePreview.tsx +68 -41
  324. package/src/components/LocaleProvider.tsx +26 -20
  325. package/src/components/LocaleSwitcher.tsx +9 -11
  326. package/src/components/MediaPickerModal.tsx +46 -45
  327. package/src/components/PresenceIndicator.tsx +30 -27
  328. package/src/components/SEOPanel.tsx +378 -228
  329. package/src/components/SEOPerformance.tsx +52 -30
  330. package/src/components/ThemeProvider.tsx +46 -46
  331. package/src/components/TipTapEditor.tsx +60 -64
  332. package/src/components/VersionHistory.tsx +63 -52
  333. package/src/components/ui/Avatar.tsx +8 -8
  334. package/src/components/ui/Badge.tsx +7 -5
  335. package/src/components/ui/Button.tsx +24 -13
  336. package/src/components/ui/CommandPalette.tsx +56 -42
  337. package/src/components/ui/ConfirmDialog.tsx +14 -14
  338. package/src/components/ui/DataTable.tsx +37 -39
  339. package/src/components/ui/EmptyState.tsx +9 -11
  340. package/src/components/ui/Modal.tsx +21 -15
  341. package/src/components/ui/Pagination.tsx +34 -19
  342. package/src/components/ui/SearchInput.tsx +17 -7
  343. package/src/components/ui/Skeleton.tsx +7 -7
  344. package/src/components/ui/Toast.tsx +29 -22
  345. package/src/components/ui/index.ts +24 -24
  346. package/src/fields/ArrayField.tsx +43 -25
  347. package/src/fields/BlockBuilderField.tsx +80 -99
  348. package/src/fields/DateField.tsx +20 -12
  349. package/src/fields/FieldRenderer.tsx +34 -34
  350. package/src/fields/GroupField.tsx +8 -10
  351. package/src/fields/MediaField.tsx +8 -10
  352. package/src/fields/NavBuilderField.tsx +24 -25
  353. package/src/fields/NumberField.tsx +21 -14
  354. package/src/fields/RelationshipField.tsx +105 -91
  355. package/src/fields/RichTextField.tsx +16 -12
  356. package/src/fields/SelectField.tsx +42 -34
  357. package/src/fields/SlugField.tsx +29 -17
  358. package/src/fields/TextField.tsx +24 -16
  359. package/src/fields/ToggleField.tsx +7 -9
  360. package/src/fields/block-types.ts +50 -24
  361. package/src/fields/index.ts +17 -17
  362. package/src/hooks/useBuilderState.ts +260 -221
  363. package/src/hooks/useContentLock.ts +23 -20
  364. package/src/hooks/useDebounce.ts +7 -7
  365. package/src/hooks/useKeyboardShortcuts.ts +16 -16
  366. package/src/index.ts +69 -58
  367. package/src/layout/Header.tsx +21 -20
  368. package/src/layout/Layout.tsx +22 -24
  369. package/src/layout/Sidebar.tsx +107 -72
  370. package/src/lib/api.ts +34 -34
  371. package/src/lib/search.ts +30 -34
  372. package/src/lib/useApiData.ts +65 -62
  373. package/src/lib/utils.ts +3 -3
  374. package/src/router/index.ts +33 -35
  375. package/src/styles/build-input.css +2 -2
  376. package/src/styles/tailwind.css +1 -1
  377. package/src/styles/theme.css +7 -1
  378. package/src/views/CollectionList.tsx +275 -121
  379. package/src/views/Dashboard.tsx +164 -117
  380. package/src/views/DocumentEdit.tsx +298 -253
  381. package/src/views/ForgotPassword.tsx +27 -23
  382. package/src/views/FormEditor.tsx +165 -99
  383. package/src/views/FormSubmissions.tsx +261 -117
  384. package/src/views/Forms.tsx +56 -26
  385. package/src/views/Login.tsx +107 -84
  386. package/src/views/MediaBrowser.tsx +717 -523
  387. package/src/views/PageEditor.tsx +44 -46
  388. package/src/views/Pages.tsx +312 -149
  389. package/src/views/PostEditor.tsx +57 -51
  390. package/src/views/Posts.tsx +206 -74
  391. package/src/views/Redirects.tsx +173 -117
  392. package/src/views/ResetPassword.tsx +43 -32
  393. package/src/views/SEO.tsx +589 -160
  394. package/src/views/ScriptTagEditor.tsx +69 -69
  395. package/src/views/ScriptTags.tsx +54 -42
  396. package/src/views/Settings.tsx +430 -220
  397. package/src/views/SetupWizard.tsx +69 -46
  398. package/src/views/Users.tsx +154 -120
  399. package/src/views/page-builder/AIBlockAssist.tsx +21 -25
  400. package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
  401. package/src/views/page-builder/BlockEditor.tsx +94 -96
  402. package/src/views/page-builder/BlockPicker.tsx +73 -88
  403. package/src/views/page-builder/BottomBar.tsx +15 -11
  404. package/src/views/page-builder/BuilderToolbar.tsx +32 -29
  405. package/src/views/page-builder/ContextPanel.tsx +57 -57
  406. package/src/views/page-builder/DesignScore.tsx +52 -59
  407. package/src/views/page-builder/NodeSettings.tsx +59 -59
  408. package/src/views/page-builder/PageBuilder.tsx +156 -155
  409. package/src/views/page-builder/PageSettings.tsx +16 -15
  410. package/src/views/page-builder/PageTemplates.tsx +23 -17
  411. package/src/views/page-builder/SEOPanel.tsx +90 -111
  412. package/src/views/page-builder/SavedSections.tsx +99 -105
  413. package/src/views/page-builder/TemplatePicker.tsx +44 -48
  414. package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
  415. package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
  416. package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
  417. package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
  418. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
  419. package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
  420. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
  421. package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
  422. package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
  423. package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
  424. package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
  425. package/src/views/page-builder/block-renderers/index.ts +17 -17
  426. package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
  427. package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
  428. package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
  429. package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
  430. package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
  431. package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
  432. package/src/views/page-builder/canvas/index.ts +2 -2
@@ -1,97 +1,116 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  import {
4
- FileText, File, Image, Users, ClipboardList, Search,
5
- Loader2, AlertTriangle, Database, ChevronLeft, ChevronRight,
6
- } from 'lucide-react';
7
- import { useState } from 'react';
8
- import { useApiData } from '../lib/useApiData.js';
9
- import { ContentOverviewChart } from '../components/ContentOverviewChart.js';
10
- import { SEOPerformance } from '../components/SEOPerformance.js';
4
+ FileText,
5
+ File,
6
+ Image,
7
+ Users,
8
+ ClipboardList,
9
+ Search,
10
+ Loader2,
11
+ AlertTriangle,
12
+ Database,
13
+ ChevronLeft,
14
+ ChevronRight,
15
+ } from 'lucide-react'
16
+ import { useState } from 'react'
17
+ import { useApiData } from '../lib/useApiData.js'
18
+ import { ContentOverviewChart } from '../components/ContentOverviewChart.js'
19
+ import { SEOPerformance } from '../components/SEOPerformance.js'
11
20
 
12
21
  interface DashboardStats {
13
- totalDocuments: number;
14
- totalMedia: number;
15
- totalUsers: number;
16
- formCount: number;
17
- avgSeoScore: number;
18
- collectionCounts: Record<string, number>;
19
- statusCounts: Record<string, number>;
22
+ totalDocuments: number
23
+ totalMedia: number
24
+ totalUsers: number
25
+ formCount: number
26
+ avgSeoScore: number
27
+ collectionCounts: Record<string, number>
28
+ statusCounts: Record<string, number>
20
29
  recentDocuments: {
21
- id: string;
22
- title: string;
23
- status: string;
24
- collection: string;
25
- updatedAt: string;
26
- author: string;
27
- }[];
30
+ id: string
31
+ title: string
32
+ status: string
33
+ collection: string
34
+ updatedAt: string
35
+ author: string
36
+ }[]
28
37
  }
29
38
 
30
39
  interface HealthData {
31
- status: 'healthy' | 'degraded';
32
- version: string;
33
- secretConfigured: boolean;
34
- models: Record<string, boolean>;
35
- databaseConnected: boolean;
40
+ status: 'healthy' | 'degraded'
41
+ version: string
42
+ secretConfigured: boolean
43
+ models: Record<string, boolean>
44
+ databaseConnected: boolean
36
45
  }
37
46
 
38
47
  interface CollectionMeta {
39
- slug: string;
40
- type?: string;
41
- labels?: { singular?: string; plural?: string };
48
+ slug: string
49
+ type?: string
50
+ labels?: { singular?: string; plural?: string }
42
51
  }
43
52
 
44
53
  export interface DashboardProps {
45
- config?: any;
46
- session?: any;
47
- onNavigate?: (path: string) => void;
54
+ config?: any
55
+ session?: any
56
+ onNavigate?: (path: string) => void
48
57
  }
49
58
 
50
59
  function resolveCollections(config: any): CollectionMeta[] {
51
- if (!config?.collections) return [];
52
- const raw = config.collections;
53
- const list: any[] = Array.isArray(raw) ? raw : Object.values(raw);
60
+ if (!config?.collections) return []
61
+ const raw = config.collections
62
+ const list: any[] = Array.isArray(raw) ? raw : Object.values(raw)
54
63
  return list
55
64
  .filter((c) => !c.admin?.hidden)
56
- .map((c) => ({ slug: c.slug, type: c.type, labels: c.labels }));
65
+ .map((c) => ({ slug: c.slug, type: c.type, labels: c.labels }))
57
66
  }
58
67
 
59
68
  function collectionLabel(col: CollectionMeta, plural = true): string {
60
- if (plural) return col.labels?.plural ?? col.slug.charAt(0).toUpperCase() + col.slug.slice(1);
61
- return col.labels?.singular ?? col.slug.charAt(0).toUpperCase() + col.slug.slice(1);
69
+ if (plural) return col.labels?.plural ?? col.slug.charAt(0).toUpperCase() + col.slug.slice(1)
70
+ return col.labels?.singular ?? col.slug.charAt(0).toUpperCase() + col.slug.slice(1)
62
71
  }
63
72
 
64
73
  function relativeTime(dateStr: string): string {
65
- const now = Date.now();
66
- const then = new Date(dateStr).getTime();
67
- const diff = now - then;
68
- const mins = Math.floor(diff / 60000);
69
- if (mins < 1) return 'just now';
70
- if (mins < 60) return `${mins} min ago`;
71
- const hours = Math.floor(mins / 60);
72
- if (hours < 24) return `${hours} hour${hours !== 1 ? 's' : ''} ago`;
73
- const days = Math.floor(hours / 24);
74
- if (days < 30) return `${days} day${days !== 1 ? 's' : ''} ago`;
75
- return new Date(dateStr).toLocaleDateString();
74
+ const now = Date.now()
75
+ const then = new Date(dateStr).getTime()
76
+ const diff = now - then
77
+ const mins = Math.floor(diff / 60000)
78
+ if (mins < 1) return 'just now'
79
+ if (mins < 60) return `${mins} min ago`
80
+ const hours = Math.floor(mins / 60)
81
+ if (hours < 24) return `${hours} hour${hours !== 1 ? 's' : ''} ago`
82
+ const days = Math.floor(hours / 24)
83
+ if (days < 30) return `${days} day${days !== 1 ? 's' : ''} ago`
84
+ return new Date(dateStr).toLocaleDateString()
76
85
  }
77
86
 
78
87
  function statusColor(status: string): string {
79
88
  switch (status) {
80
- case 'PUBLISHED': return 'bg-green-100 text-green-800';
81
- case 'DRAFT': return 'bg-gray-100 text-gray-700';
82
- case 'SCHEDULED': return 'bg-purple-100 text-purple-800';
83
- case 'IN_REVIEW': return 'bg-blue-100 text-blue-800';
84
- default: return 'bg-gray-100 text-gray-700';
89
+ case 'PUBLISHED':
90
+ return 'bg-green-100 text-green-800'
91
+ case 'DRAFT':
92
+ return 'bg-gray-100 text-gray-700'
93
+ case 'SCHEDULED':
94
+ return 'bg-purple-100 text-purple-800'
95
+ case 'IN_REVIEW':
96
+ return 'bg-blue-100 text-blue-800'
97
+ default:
98
+ return 'bg-gray-100 text-gray-700'
85
99
  }
86
100
  }
87
101
 
88
102
  function statusLabel(status: string): string {
89
103
  switch (status) {
90
- case 'PUBLISHED': return 'Published';
91
- case 'DRAFT': return 'Draft';
92
- case 'SCHEDULED': return 'Scheduled';
93
- case 'IN_REVIEW': return 'In Review';
94
- default: return status;
104
+ case 'PUBLISHED':
105
+ return 'Published'
106
+ case 'DRAFT':
107
+ return 'Draft'
108
+ case 'SCHEDULED':
109
+ return 'Scheduled'
110
+ case 'IN_REVIEW':
111
+ return 'In Review'
112
+ default:
113
+ return status
95
114
  }
96
115
  }
97
116
 
@@ -101,26 +120,26 @@ const STAT_COLORS = [
101
120
  { bg: 'bg-teal-50', icon: 'bg-teal-100', text: 'text-teal-600' },
102
121
  { bg: 'bg-green-50', icon: 'bg-green-100', text: 'text-green-600' },
103
122
  { bg: 'bg-amber-50', icon: 'bg-amber-100', text: 'text-amber-600' },
104
- ];
123
+ ]
105
124
 
106
125
  export function Dashboard({ config, session, onNavigate }: DashboardProps) {
107
- const nav = (path: string) => onNavigate?.(path);
108
- const { data, loading, error, exhausted, refetch } = useApiData<DashboardStats>('/stats');
109
- const { data: health } = useApiData<HealthData>('/health');
110
- const [activityPage, setActivityPage] = useState(0);
126
+ const nav = (path: string) => onNavigate?.(path)
127
+ const { data, loading, error, exhausted, refetch } = useApiData<DashboardStats>('/stats')
128
+ const { data: health } = useApiData<HealthData>('/health')
129
+ const [activityPage, setActivityPage] = useState(0)
111
130
 
112
- const collections = resolveCollections(config);
113
- const userName = session?.name ?? session?.email?.split('@')[0] ?? 'Admin';
131
+ const collections = resolveCollections(config)
132
+ const userName = session?.name ?? session?.email?.split('@')[0] ?? 'Admin'
114
133
 
115
- const collectionCounts = data?.collectionCounts ?? {};
116
- const statusCounts = data?.statusCounts ?? {};
117
- const recentDocs = data?.recentDocuments ?? [];
134
+ const collectionCounts = data?.collectionCounts ?? {}
135
+ const statusCounts = data?.statusCounts ?? {}
136
+ const recentDocs = data?.recentDocuments ?? []
118
137
 
119
- const perPage = 5;
120
- const totalActivityPages = Math.max(1, Math.ceil(recentDocs.length / perPage));
121
- const visibleDocs = recentDocs.slice(activityPage * perPage, (activityPage + 1) * perPage);
138
+ const perPage = 5
139
+ const totalActivityPages = Math.max(1, Math.ceil(recentDocs.length / perPage))
140
+ const visibleDocs = recentDocs.slice(activityPage * perPage, (activityPage + 1) * perPage)
122
141
 
123
- const statCards: { label: string; value: number; icon: typeof FileText }[] = [];
142
+ const statCards: { label: string; value: number; icon: typeof FileText }[] = []
124
143
 
125
144
  if (collections.length > 0) {
126
145
  for (const col of collections.slice(0, 2)) {
@@ -128,23 +147,23 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
128
147
  label: collectionLabel(col),
129
148
  value: collectionCounts[col.slug] ?? 0,
130
149
  icon: col.type === 'page' ? File : FileText,
131
- });
150
+ })
132
151
  }
133
152
  } else {
134
- statCards.push({ label: 'Pages', value: collectionCounts['pages'] ?? 0, icon: File });
135
- statCards.push({ label: 'Posts', value: collectionCounts['posts'] ?? 0, icon: FileText });
153
+ statCards.push({ label: 'Pages', value: collectionCounts['pages'] ?? 0, icon: File })
154
+ statCards.push({ label: 'Posts', value: collectionCounts['posts'] ?? 0, icon: FileText })
136
155
  }
137
156
 
138
- statCards.push({ label: 'Forms', value: data?.formCount ?? 0, icon: ClipboardList });
139
- statCards.push({ label: 'Media', value: data?.totalMedia ?? 0, icon: Image });
140
- statCards.push({ label: 'Avg. SEO Rating', value: data?.avgSeoScore ?? 0, icon: Search });
157
+ statCards.push({ label: 'Forms', value: data?.formCount ?? 0, icon: ClipboardList })
158
+ statCards.push({ label: 'Media', value: data?.totalMedia ?? 0, icon: Image })
159
+ statCards.push({ label: 'Avg. SEO Rating', value: data?.avgSeoScore ?? 0, icon: Search })
141
160
 
142
161
  if (loading) {
143
162
  return (
144
163
  <div className="p-4 sm:p-6 flex items-center justify-center h-64">
145
164
  <Loader2 className="w-6 h-6 animate-spin text-blue-600" />
146
165
  </div>
147
- );
166
+ )
148
167
  }
149
168
 
150
169
  return (
@@ -159,8 +178,10 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
159
178
  ? 'Cannot connect to the database. Check your DATABASE_URL environment variable.'
160
179
  : !health.secretConfigured
161
180
  ? 'CMS secret not configured. Set CMS_SECRET or CMS_SESSION_SECRET (min 32 characters).'
162
- : `Some CMS models are missing: ${Object.entries(health.models).filter(([, v]) => !v).map(([k]) => k).join(', ')}. Run your database migrations.`
163
- }
181
+ : `Some CMS models are missing: ${Object.entries(health.models)
182
+ .filter(([, v]) => !v)
183
+ .map(([k]) => k)
184
+ .join(', ')}. Run your database migrations.`}
164
185
  </p>
165
186
  </div>
166
187
  </div>
@@ -169,33 +190,46 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
169
190
  {error && exhausted && (
170
191
  <div className="flex items-center gap-3 rounded-lg border border-amber-200 bg-amber-50 p-3">
171
192
  <AlertTriangle className="w-5 h-5 text-amber-600 shrink-0" />
172
- <span className="text-sm text-amber-800 flex-1">Some dashboard data may be unavailable.</span>
173
- <button onClick={refetch} className="px-3 py-1 text-sm text-amber-700 border border-amber-300 rounded-lg hover:bg-amber-100 transition-colors">Retry</button>
193
+ <span className="text-sm text-amber-800 flex-1">
194
+ Some dashboard data may be unavailable.
195
+ </span>
196
+ <button
197
+ onClick={refetch}
198
+ className="px-3 py-1 text-sm text-amber-700 border border-amber-300 rounded-lg hover:bg-amber-100 transition-colors"
199
+ >
200
+ Retry
201
+ </button>
174
202
  </div>
175
203
  )}
176
204
 
177
205
  {/* Header */}
178
206
  <div>
179
- <h1 className="text-xl sm:text-2xl font-semibold text-gray-900">Welcome back, {userName}</h1>
180
- <p className="text-sm text-gray-500 mt-0.5">Here&apos;s what&apos;s happening with your content today</p>
207
+ <h1 className="text-xl sm:text-2xl font-semibold text-gray-900">
208
+ Welcome back, {userName}
209
+ </h1>
210
+ <p className="text-sm text-gray-500 mt-0.5">
211
+ Here&apos;s what&apos;s happening with your content today
212
+ </p>
181
213
  </div>
182
214
 
183
215
  {/* Stat cards */}
184
216
  <div className="grid grid-cols-2 md:grid-cols-3 xl:grid-cols-5 gap-4">
185
217
  {statCards.map((card, i) => {
186
- const colors = STAT_COLORS[i % STAT_COLORS.length]!;
187
- const Icon = card.icon;
218
+ const colors = STAT_COLORS[i % STAT_COLORS.length]!
219
+ const Icon = card.icon
188
220
  return (
189
221
  <div key={card.label} className="bg-white rounded-xl border border-gray-200 p-4">
190
222
  <div className="flex items-center justify-between mb-3">
191
- <div className={`w-9 h-9 rounded-lg flex items-center justify-center ${colors.icon}`}>
223
+ <div
224
+ className={`w-9 h-9 rounded-lg flex items-center justify-center ${colors.icon}`}
225
+ >
192
226
  <Icon className={`w-4.5 h-4.5 ${colors.text}`} />
193
227
  </div>
194
228
  </div>
195
229
  <p className="text-2xl font-semibold text-gray-900">{card.value.toLocaleString()}</p>
196
230
  <p className="text-xs text-gray-500 mt-0.5">{card.label}</p>
197
231
  </div>
198
- );
232
+ )
199
233
  })}
200
234
  </div>
201
235
 
@@ -211,35 +245,44 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
211
245
  <div className="p-8 text-center">
212
246
  <p className="text-sm text-gray-400">No content yet</p>
213
247
  </div>
214
- ) : visibleDocs.map((doc) => {
215
- const colMeta = collections.find((c) => c.slug === doc.collection);
216
- const typeLabel = colMeta ? collectionLabel(colMeta, false) : doc.collection;
217
- return (
218
- <div key={doc.id} className="px-4 py-3 hover:bg-gray-50 transition-colors">
219
- <div className="flex items-center justify-between gap-3">
220
- <div className="flex-1 min-w-0">
221
- <div className="flex items-center gap-2 mb-0.5">
222
- <h3 className="text-sm font-medium text-gray-900 truncate">{doc.title ?? 'Untitled'}</h3>
223
- </div>
224
- <div className="flex items-center gap-2 text-xs text-gray-500">
225
- <span className="capitalize">{typeLabel}</span>
226
- <span>&middot;</span>
227
- <span>{doc.author}</span>
228
- <span>&middot;</span>
229
- <span>{relativeTime(doc.updatedAt)}</span>
248
+ ) : (
249
+ visibleDocs.map((doc) => {
250
+ const colMeta = collections.find((c) => c.slug === doc.collection)
251
+ const typeLabel = colMeta ? collectionLabel(colMeta, false) : doc.collection
252
+ return (
253
+ <div key={doc.id} className="px-4 py-3 hover:bg-gray-50 transition-colors">
254
+ <div className="flex items-center justify-between gap-3">
255
+ <div className="flex-1 min-w-0">
256
+ <div className="flex items-center gap-2 mb-0.5">
257
+ <h3 className="text-sm font-medium text-gray-900 truncate">
258
+ {doc.title ?? 'Untitled'}
259
+ </h3>
260
+ </div>
261
+ <div className="flex items-center gap-2 text-xs text-gray-500">
262
+ <span className="capitalize">{typeLabel}</span>
263
+ <span>&middot;</span>
264
+ <span>{doc.author}</span>
265
+ <span>&middot;</span>
266
+ <span>{relativeTime(doc.updatedAt)}</span>
267
+ </div>
230
268
  </div>
269
+ <span
270
+ className={`px-2.5 py-0.5 rounded-full text-xs font-medium whitespace-nowrap ${statusColor(doc.status)}`}
271
+ >
272
+ {statusLabel(doc.status)}
273
+ </span>
231
274
  </div>
232
- <span className={`px-2.5 py-0.5 rounded-full text-xs font-medium whitespace-nowrap ${statusColor(doc.status)}`}>
233
- {statusLabel(doc.status)}
234
- </span>
235
275
  </div>
236
- </div>
237
- );
238
- })}
276
+ )
277
+ })
278
+ )}
239
279
  </div>
240
280
  {recentDocs.length > perPage && (
241
281
  <div className="px-4 py-3 border-t border-gray-100 flex items-center justify-between text-xs text-gray-500">
242
- <span>Showing {activityPage * perPage + 1}-{Math.min((activityPage + 1) * perPage, recentDocs.length)} of {recentDocs.length}</span>
282
+ <span>
283
+ Showing {activityPage * perPage + 1}-
284
+ {Math.min((activityPage + 1) * perPage, recentDocs.length)} of {recentDocs.length}
285
+ </span>
243
286
  <div className="flex items-center gap-1">
244
287
  <button
245
288
  onClick={() => setActivityPage(Math.max(0, activityPage - 1))}
@@ -248,9 +291,13 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
248
291
  >
249
292
  <ChevronLeft className="w-3.5 h-3.5" />
250
293
  </button>
251
- <span>Page {activityPage + 1} of {totalActivityPages}</span>
294
+ <span>
295
+ Page {activityPage + 1} of {totalActivityPages}
296
+ </span>
252
297
  <button
253
- onClick={() => setActivityPage(Math.min(totalActivityPages - 1, activityPage + 1))}
298
+ onClick={() =>
299
+ setActivityPage(Math.min(totalActivityPages - 1, activityPage + 1))
300
+ }
254
301
  disabled={activityPage >= totalActivityPages - 1}
255
302
  className="p-1 rounded hover:bg-gray-100 disabled:opacity-30"
256
303
  >
@@ -279,5 +326,5 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
279
326
  {/* SEO Performance */}
280
327
  <SEOPerformance onNavigate={nav} />
281
328
  </div>
282
- );
329
+ )
283
330
  }