@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,6 +1,6 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, useCallback } from 'react';
3
+ import { useState, useCallback } from 'react'
4
4
  import {
5
5
  Sparkles,
6
6
  X,
@@ -14,22 +14,22 @@ import {
14
14
  Search,
15
15
  Accessibility,
16
16
  ArrowRight,
17
- } from 'lucide-react';
18
- import { toast } from 'sonner';
19
- import { cmsApi } from '../../lib/api.js';
20
- import type { PageNode, GenerationStep } from '@actuate-media/cms-core';
17
+ } from 'lucide-react'
18
+ import { toast } from 'sonner'
19
+ import { cmsApi } from '../../lib/api.js'
20
+ import type { PageNode, GenerationStep } from '@actuate-media/cms-core'
21
21
 
22
22
  export interface AIGenerateDialogProps {
23
- open: boolean;
24
- onClose: () => void;
25
- onAccept: (tree: PageNode) => void;
23
+ open: boolean
24
+ onClose: () => void
25
+ onAccept: (tree: PageNode) => void
26
26
  }
27
27
 
28
28
  interface StepInfo {
29
- key: GenerationStep;
30
- label: string;
31
- icon: React.ReactNode;
32
- description: string;
29
+ key: GenerationStep
30
+ label: string
31
+ icon: React.ReactNode
32
+ description: string
33
33
  }
34
34
 
35
35
  const ALL_STEPS: StepInfo[] = [
@@ -57,9 +57,9 @@ const ALL_STEPS: StepInfo[] = [
57
57
  icon: <Accessibility size={14} />,
58
58
  description: 'Fix heading hierarchy, alt text, and ARIA',
59
59
  },
60
- ];
60
+ ]
61
61
 
62
- type Tone = 'professional' | 'casual' | 'friendly' | 'technical' | 'luxury';
62
+ type Tone = 'professional' | 'casual' | 'friendly' | 'technical' | 'luxury'
63
63
 
64
64
  const TONES: { value: Tone; label: string }[] = [
65
65
  { value: 'professional', label: 'Professional' },
@@ -67,103 +67,107 @@ const TONES: { value: Tone; label: string }[] = [
67
67
  { value: 'friendly', label: 'Friendly' },
68
68
  { value: 'technical', label: 'Technical' },
69
69
  { value: 'luxury', label: 'Luxury' },
70
- ];
70
+ ]
71
71
 
72
- type Phase = 'prompt' | 'generating' | 'review';
72
+ type Phase = 'prompt' | 'generating' | 'review'
73
73
 
74
74
  interface GenerationStepResult {
75
- step: string;
75
+ step: string
76
76
  metadata: {
77
- tokensUsed: number;
78
- durationMs: number;
79
- changes: string[];
80
- };
77
+ tokensUsed: number
78
+ durationMs: number
79
+ changes: string[]
80
+ }
81
81
  }
82
82
 
83
83
  interface GenerationResultData {
84
- tree: PageNode;
85
- steps: GenerationStepResult[];
86
- totalTokensUsed: number;
87
- totalDurationMs: number;
84
+ tree: PageNode
85
+ steps: GenerationStepResult[]
86
+ totalTokensUsed: number
87
+ totalDurationMs: number
88
88
  }
89
89
 
90
90
  export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogProps) {
91
- const [phase, setPhase] = useState<Phase>('prompt');
92
- const [prompt, setPrompt] = useState('');
93
- const [tone, setTone] = useState<Tone>('professional');
91
+ const [phase, setPhase] = useState<Phase>('prompt')
92
+ const [prompt, setPrompt] = useState('')
93
+ const [tone, setTone] = useState<Tone>('professional')
94
94
  const [enabledSteps, setEnabledSteps] = useState<Set<GenerationStep>>(
95
95
  new Set(['structure', 'content', 'seo', 'accessibility']),
96
- );
97
- const [showContext, setShowContext] = useState(false);
98
- const [businessName, setBusiness] = useState('');
99
- const [industry, setIndustry] = useState('');
100
- const [phone, setPhone] = useState('');
101
- const [address, setAddress] = useState('');
102
- const [services, setServices] = useState('');
103
-
104
- const [currentStep, setCurrentStep] = useState<string>('');
105
- const [completedSteps, setCompletedSteps] = useState<string[]>([]);
106
- const [stepMessage, setStepMessage] = useState('');
107
-
108
- const [result, setResult] = useState<GenerationResultData | null>(null);
109
- const [error, setError] = useState<string | null>(null);
110
- const [expandedStep, setExpandedStep] = useState<string | null>(null);
96
+ )
97
+ const [showContext, setShowContext] = useState(false)
98
+ const [businessName, setBusiness] = useState('')
99
+ const [industry, setIndustry] = useState('')
100
+ const [phone, setPhone] = useState('')
101
+ const [address, setAddress] = useState('')
102
+ const [services, setServices] = useState('')
103
+
104
+ const [currentStep, setCurrentStep] = useState<string>('')
105
+ const [completedSteps, setCompletedSteps] = useState<string[]>([])
106
+ const [stepMessage, setStepMessage] = useState('')
107
+
108
+ const [result, setResult] = useState<GenerationResultData | null>(null)
109
+ const [error, setError] = useState<string | null>(null)
110
+ const [expandedStep, setExpandedStep] = useState<string | null>(null)
111
111
 
112
112
  const toggleStep = (step: GenerationStep) => {
113
- const next = new Set(enabledSteps);
114
- if (step === 'structure') return;
113
+ const next = new Set(enabledSteps)
114
+ if (step === 'structure') return
115
115
  if (next.has(step)) {
116
- next.delete(step);
116
+ next.delete(step)
117
117
  } else {
118
- next.add(step);
118
+ next.add(step)
119
119
  }
120
- setEnabledSteps(next);
121
- };
120
+ setEnabledSteps(next)
121
+ }
122
122
 
123
123
  const resetState = useCallback(() => {
124
- setPhase('prompt');
125
- setPrompt('');
126
- setTone('professional');
127
- setEnabledSteps(new Set(['structure', 'content', 'seo', 'accessibility']));
128
- setShowContext(false);
129
- setBusiness('');
130
- setIndustry('');
131
- setPhone('');
132
- setAddress('');
133
- setServices('');
134
- setCurrentStep('');
135
- setCompletedSteps([]);
136
- setStepMessage('');
137
- setResult(null);
138
- setError(null);
139
- setExpandedStep(null);
140
- }, []);
124
+ setPhase('prompt')
125
+ setPrompt('')
126
+ setTone('professional')
127
+ setEnabledSteps(new Set(['structure', 'content', 'seo', 'accessibility']))
128
+ setShowContext(false)
129
+ setBusiness('')
130
+ setIndustry('')
131
+ setPhone('')
132
+ setAddress('')
133
+ setServices('')
134
+ setCurrentStep('')
135
+ setCompletedSteps([])
136
+ setStepMessage('')
137
+ setResult(null)
138
+ setError(null)
139
+ setExpandedStep(null)
140
+ }, [])
141
141
 
142
142
  const handleClose = useCallback(() => {
143
- resetState();
144
- onClose();
145
- }, [resetState, onClose]);
143
+ resetState()
144
+ onClose()
145
+ }, [resetState, onClose])
146
146
 
147
147
  const handleGenerate = useCallback(async () => {
148
148
  if (!prompt.trim()) {
149
- toast.error('Please describe the page you want to create');
150
- return;
149
+ toast.error('Please describe the page you want to create')
150
+ return
151
151
  }
152
152
 
153
- setPhase('generating');
154
- setError(null);
153
+ setPhase('generating')
154
+ setError(null)
155
155
 
156
- const steps = ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((s) => s.key);
156
+ const steps = ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((s) => s.key)
157
157
 
158
- setCurrentStep(steps[0]!);
159
- setStepMessage('Starting generation...');
158
+ setCurrentStep(steps[0]!)
159
+ setStepMessage('Starting generation...')
160
160
 
161
- const context: Record<string, unknown> = {};
162
- if (businessName) context.businessName = businessName;
163
- if (industry) context.industry = industry;
164
- if (phone) context.phone = phone;
165
- if (address) context.address = address;
166
- if (services) context.services = services.split(',').map((s) => s.trim()).filter(Boolean);
161
+ const context: Record<string, unknown> = {}
162
+ if (businessName) context.businessName = businessName
163
+ if (industry) context.industry = industry
164
+ if (phone) context.phone = phone
165
+ if (address) context.address = address
166
+ if (services)
167
+ context.services = services
168
+ .split(',')
169
+ .map((s) => s.trim())
170
+ .filter(Boolean)
167
171
 
168
172
  try {
169
173
  const res = await cmsApi<GenerationResultData>('/page-builder/generate', {
@@ -174,34 +178,34 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
174
178
  tone,
175
179
  context: Object.keys(context).length > 0 ? context : undefined,
176
180
  }),
177
- });
181
+ })
178
182
 
179
183
  if (res.error) {
180
- setError(res.error);
181
- setPhase('prompt');
182
- return;
184
+ setError(res.error)
185
+ setPhase('prompt')
186
+ return
183
187
  }
184
188
 
185
189
  if (res.data) {
186
- setResult(res.data);
187
- setCompletedSteps(res.data.steps.map((s) => s.step));
188
- setPhase('review');
190
+ setResult(res.data)
191
+ setCompletedSteps(res.data.steps.map((s) => s.step))
192
+ setPhase('review')
189
193
  }
190
194
  } catch (err) {
191
- setError(err instanceof Error ? err.message : 'Generation failed');
192
- setPhase('prompt');
195
+ setError(err instanceof Error ? err.message : 'Generation failed')
196
+ setPhase('prompt')
193
197
  }
194
- }, [prompt, tone, enabledSteps, businessName, industry, phone, address, services]);
198
+ }, [prompt, tone, enabledSteps, businessName, industry, phone, address, services])
195
199
 
196
200
  const handleAccept = useCallback(() => {
197
201
  if (result?.tree) {
198
- onAccept(result.tree);
199
- toast.success('AI-generated page applied');
200
- handleClose();
202
+ onAccept(result.tree)
203
+ toast.success('AI-generated page applied')
204
+ handleClose()
201
205
  }
202
- }, [result, onAccept, handleClose]);
206
+ }, [result, onAccept, handleClose])
203
207
 
204
- if (!open) return null;
208
+ if (!open) return null
205
209
 
206
210
  return (
207
211
  <div className="fixed inset-0 z-50 flex items-center justify-center">
@@ -214,9 +218,7 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
214
218
  <Sparkles size={18} className="text-primary" />
215
219
  </div>
216
220
  <div>
217
- <h2 className="text-base font-medium text-foreground">
218
- AI Page Generator
219
- </h2>
221
+ <h2 className="text-base font-medium text-foreground">AI Page Generator</h2>
220
222
  <p className="text-xs text-muted-foreground">
221
223
  Describe your page and let AI build it
222
224
  </p>
@@ -259,9 +261,7 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
259
261
 
260
262
  {/* Tone */}
261
263
  <div>
262
- <label className="block text-sm font-medium text-foreground mb-1.5">
263
- Tone
264
- </label>
264
+ <label className="block text-sm font-medium text-foreground mb-1.5">Tone</label>
265
265
  <div className="flex flex-wrap gap-2">
266
266
  {TONES.map((t) => (
267
267
  <button
@@ -337,7 +337,9 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
337
337
  <div className="mt-3 space-y-3 p-4 bg-muted/50 rounded-lg border border-border">
338
338
  <div className="grid grid-cols-2 gap-3">
339
339
  <div>
340
- <label className="block text-xs text-muted-foreground mb-1">Business name</label>
340
+ <label className="block text-xs text-muted-foreground mb-1">
341
+ Business name
342
+ </label>
341
343
  <input
342
344
  type="text"
343
345
  value={businessName}
@@ -395,16 +397,16 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
395
397
  <div className="py-8 space-y-6">
396
398
  <div className="text-center">
397
399
  <Loader2 size={32} className="animate-spin text-primary mx-auto mb-3" />
398
- <p className="text-sm font-medium text-foreground">{stepMessage || 'Generating...'}</p>
399
- <p className="text-xs text-muted-foreground mt-1">
400
- This may take 15-30 seconds
400
+ <p className="text-sm font-medium text-foreground">
401
+ {stepMessage || 'Generating...'}
401
402
  </p>
403
+ <p className="text-xs text-muted-foreground mt-1">This may take 15-30 seconds</p>
402
404
  </div>
403
405
 
404
406
  <div className="space-y-2">
405
407
  {ALL_STEPS.filter((s) => enabledSteps.has(s.key)).map((step) => {
406
- const isComplete = completedSteps.includes(step.key);
407
- const isCurrent = currentStep === step.key;
408
+ const isComplete = completedSteps.includes(step.key)
409
+ const isCurrent = currentStep === step.key
408
410
 
409
411
  return (
410
412
  <div
@@ -430,12 +432,14 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
430
432
  </div>
431
433
  <div className="flex items-center gap-2">
432
434
  <span className="text-muted-foreground">{step.icon}</span>
433
- <span className={`text-sm ${isCurrent || isComplete ? 'text-foreground' : 'text-muted-foreground'}`}>
435
+ <span
436
+ className={`text-sm ${isCurrent || isComplete ? 'text-foreground' : 'text-muted-foreground'}`}
437
+ >
434
438
  {step.label}
435
439
  </span>
436
440
  </div>
437
441
  </div>
438
- );
442
+ )
439
443
  })}
440
444
  </div>
441
445
  </div>
@@ -449,14 +453,11 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
449
453
  <Sparkles size={18} className="text-primary" />
450
454
  </div>
451
455
  <div>
452
- <p className="text-sm font-medium text-foreground">
453
- Page generated successfully
454
- </p>
456
+ <p className="text-sm font-medium text-foreground">Page generated successfully</p>
455
457
  <p className="text-xs text-muted-foreground mt-0.5">
456
458
  {result.totalTokensUsed.toLocaleString()} tokens
457
459
  {' \u00B7 '}
458
- {(result.totalDurationMs / 1000).toFixed(1)}s
459
- {' \u00B7 '}
460
+ {(result.totalDurationMs / 1000).toFixed(1)}s{' \u00B7 '}
460
461
  {result.steps.length} step{result.steps.length !== 1 ? 's' : ''}
461
462
  </p>
462
463
  </div>
@@ -466,11 +467,14 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
466
467
  <div className="space-y-2">
467
468
  <h3 className="text-sm font-medium text-foreground">Generation steps</h3>
468
469
  {result.steps.map((step) => {
469
- const info = ALL_STEPS.find((s) => s.key === step.step);
470
- const isExpanded = expandedStep === step.step;
470
+ const info = ALL_STEPS.find((s) => s.key === step.step)
471
+ const isExpanded = expandedStep === step.step
471
472
 
472
473
  return (
473
- <div key={step.step} className="rounded-lg border border-border overflow-hidden">
474
+ <div
475
+ key={step.step}
476
+ className="rounded-lg border border-border overflow-hidden"
477
+ >
474
478
  <button
475
479
  onClick={() => setExpandedStep(isExpanded ? null : step.step)}
476
480
  className="w-full flex items-center gap-3 p-3 hover:bg-muted/50 transition-colors text-left"
@@ -493,7 +497,10 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
493
497
  <div className="px-3 pb-3 border-t border-border pt-2">
494
498
  <ul className="space-y-1">
495
499
  {step.metadata.changes.map((change, i) => (
496
- <li key={i} className="flex items-start gap-2 text-xs text-muted-foreground">
500
+ <li
501
+ key={i}
502
+ className="flex items-start gap-2 text-xs text-muted-foreground"
503
+ >
497
504
  <ArrowRight size={10} className="shrink-0 mt-0.5" />
498
505
  {change}
499
506
  </li>
@@ -505,13 +512,13 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
505
512
  </div>
506
513
  )}
507
514
  </div>
508
- );
515
+ )
509
516
  })}
510
517
  </div>
511
518
 
512
519
  <p className="text-xs text-muted-foreground">
513
- Review the generated page in the canvas after accepting.
514
- You can always undo to revert.
520
+ Review the generated page in the canvas after accepting. You can always undo to
521
+ revert.
515
522
  </p>
516
523
  </div>
517
524
  )}
@@ -551,8 +558,8 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
551
558
  <>
552
559
  <button
553
560
  onClick={() => {
554
- setPhase('prompt');
555
- setResult(null);
561
+ setPhase('prompt')
562
+ setResult(null)
556
563
  }}
557
564
  className="px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors"
558
565
  >
@@ -570,5 +577,5 @@ export function AIGenerateDialog({ open, onClose, onAccept }: AIGenerateDialogPr
570
577
  </div>
571
578
  </div>
572
579
  </div>
573
- );
580
+ )
574
581
  }