@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,7 +1,7 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, useMemo, useRef, useEffect, useCallback } from 'react';
4
- import * as Dialog from '@radix-ui/react-dialog';
3
+ import { useState, useMemo, useRef, useEffect, useCallback } from 'react'
4
+ import * as Dialog from '@radix-ui/react-dialog'
5
5
  import {
6
6
  Star,
7
7
  Type,
@@ -18,15 +18,15 @@ import {
18
18
  ArrowLeft,
19
19
  Search,
20
20
  Check,
21
- } from 'lucide-react';
22
- import type { LucideIcon } from 'lucide-react';
23
- import { BlockCatalog } from '@actuate-media/cms-core';
24
- import type { BlockTypeDefinition, VariantDefinition } from '@actuate-media/cms-core';
21
+ } from 'lucide-react'
22
+ import type { LucideIcon } from 'lucide-react'
23
+ import { BlockCatalog } from '@actuate-media/cms-core'
24
+ import type { BlockTypeDefinition, VariantDefinition } from '@actuate-media/cms-core'
25
25
 
26
26
  export interface BlockPickerProps {
27
- open: boolean;
28
- onClose: () => void;
29
- onSelect: (blockType: string, variant?: string) => void;
27
+ open: boolean
28
+ onClose: () => void
29
+ onSelect: (blockType: string, variant?: string) => void
30
30
  }
31
31
 
32
32
  const iconMap: Record<string, LucideIcon> = {
@@ -40,88 +40,87 @@ const iconMap: Record<string, LucideIcon> = {
40
40
  HelpCircle,
41
41
  FileText,
42
42
  Code,
43
- };
43
+ }
44
44
 
45
45
  function resolveIcon(name: string): LucideIcon {
46
- return iconMap[name] ?? Box;
46
+ return iconMap[name] ?? Box
47
47
  }
48
48
 
49
49
  export function BlockPicker({ open, onClose, onSelect }: BlockPickerProps) {
50
- const [search, setSearch] = useState('');
51
- const [selectedBlock, setSelectedBlock] = useState<BlockTypeDefinition | null>(null);
52
- const searchInputRef = useRef<HTMLInputElement>(null);
53
- const variantListRef = useRef<HTMLDivElement>(null);
50
+ const [search, setSearch] = useState('')
51
+ const [selectedBlock, setSelectedBlock] = useState<BlockTypeDefinition | null>(null)
52
+ const searchInputRef = useRef<HTMLInputElement>(null)
53
+ const variantListRef = useRef<HTMLDivElement>(null)
54
54
 
55
- const catalog = useMemo(() => new BlockCatalog(), []);
56
- const allBlocks = useMemo(() => catalog.getAll(), [catalog]);
55
+ const catalog = useMemo(() => new BlockCatalog(), [])
56
+ const allBlocks = useMemo(() => catalog.getAll(), [catalog])
57
57
 
58
58
  const filteredBlocks = useMemo(() => {
59
- if (!search.trim()) return allBlocks;
60
- const q = search.toLowerCase();
59
+ if (!search.trim()) return allBlocks
60
+ const q = search.toLowerCase()
61
61
  return allBlocks.filter(
62
62
  (block) =>
63
63
  block.label.toLowerCase().includes(q) ||
64
- (block.description?.toLowerCase().includes(q) ?? false)
65
- );
66
- }, [allBlocks, search]);
64
+ (block.description?.toLowerCase().includes(q) ?? false),
65
+ )
66
+ }, [allBlocks, search])
67
67
 
68
68
  const resetState = useCallback(() => {
69
- setSearch('');
70
- setSelectedBlock(null);
71
- }, []);
69
+ setSearch('')
70
+ setSelectedBlock(null)
71
+ }, [])
72
72
 
73
73
  useEffect(() => {
74
74
  if (open) {
75
- resetState();
75
+ resetState()
76
76
  }
77
- }, [open, resetState]);
77
+ }, [open, resetState])
78
78
 
79
79
  useEffect(() => {
80
80
  if (open && !selectedBlock) {
81
- const timer = setTimeout(() => searchInputRef.current?.focus(), 50);
82
- return () => clearTimeout(timer);
81
+ const timer = setTimeout(() => searchInputRef.current?.focus(), 50)
82
+ return () => clearTimeout(timer)
83
83
  }
84
- }, [open, selectedBlock]);
84
+ }, [open, selectedBlock])
85
85
 
86
86
  useEffect(() => {
87
87
  if (selectedBlock && variantListRef.current) {
88
- const firstButton = variantListRef.current.querySelector<HTMLButtonElement>(
89
- 'button[data-variant]'
90
- );
91
- firstButton?.focus();
88
+ const firstButton =
89
+ variantListRef.current.querySelector<HTMLButtonElement>('button[data-variant]')
90
+ firstButton?.focus()
92
91
  }
93
- }, [selectedBlock]);
92
+ }, [selectedBlock])
94
93
 
95
94
  function handleBlockClick(block: BlockTypeDefinition) {
96
95
  if (block.variants.length === 1) {
97
- onSelect(block.type, block.variants[0]!.name);
98
- onClose();
99
- return;
96
+ onSelect(block.type, block.variants[0]!.name)
97
+ onClose()
98
+ return
100
99
  }
101
- setSelectedBlock(block);
100
+ setSelectedBlock(block)
102
101
  }
103
102
 
104
103
  function handleVariantClick(variant: VariantDefinition) {
105
- if (!selectedBlock) return;
106
- onSelect(selectedBlock.type, variant.name);
107
- onClose();
104
+ if (!selectedBlock) return
105
+ onSelect(selectedBlock.type, variant.name)
106
+ onClose()
108
107
  }
109
108
 
110
109
  function handleBack() {
111
- setSelectedBlock(null);
110
+ setSelectedBlock(null)
112
111
  }
113
112
 
114
113
  function handleKeyDownOnGrid(e: React.KeyboardEvent) {
115
114
  if (e.key === 'Escape') {
116
- e.stopPropagation();
117
- onClose();
115
+ e.stopPropagation()
116
+ onClose()
118
117
  }
119
118
  }
120
119
 
121
120
  function handleKeyDownOnVariants(e: React.KeyboardEvent) {
122
121
  if (e.key === 'Escape') {
123
- e.stopPropagation();
124
- handleBack();
122
+ e.stopPropagation()
123
+ handleBack()
125
124
  }
126
125
  }
127
126
 
@@ -134,7 +133,7 @@ export function BlockPicker({ open, onClose, onSelect }: BlockPickerProps) {
134
133
  aria-describedby={undefined}
135
134
  onEscapeKeyDown={() => {
136
135
  if (selectedBlock) {
137
- handleBack();
136
+ handleBack()
138
137
  }
139
138
  }}
140
139
  >
@@ -160,17 +159,17 @@ export function BlockPicker({ open, onClose, onSelect }: BlockPickerProps) {
160
159
  </Dialog.Content>
161
160
  </Dialog.Portal>
162
161
  </Dialog.Root>
163
- );
162
+ )
164
163
  }
165
164
 
166
165
  interface BlockTypeGridProps {
167
- search: string;
168
- filteredBlocks: BlockTypeDefinition[];
169
- searchInputRef: React.RefObject<HTMLInputElement | null>;
170
- onSearchChange: (value: string) => void;
171
- onBlockClick: (block: BlockTypeDefinition) => void;
172
- onClose: () => void;
173
- onKeyDown: (e: React.KeyboardEvent) => void;
166
+ search: string
167
+ filteredBlocks: BlockTypeDefinition[]
168
+ searchInputRef: React.RefObject<HTMLInputElement | null>
169
+ onSearchChange: (value: string) => void
170
+ onBlockClick: (block: BlockTypeDefinition) => void
171
+ onClose: () => void
172
+ onKeyDown: (e: React.KeyboardEvent) => void
174
173
  }
175
174
 
176
175
  function BlockTypeGrid({
@@ -185,9 +184,7 @@ function BlockTypeGrid({
185
184
  return (
186
185
  <div className="flex flex-col h-full" onKeyDown={onKeyDown}>
187
186
  <div className="flex items-center justify-between gap-3 px-5 pt-5 pb-3">
188
- <Dialog.Title className="text-lg font-medium text-foreground">
189
- Add Block
190
- </Dialog.Title>
187
+ <Dialog.Title className="text-lg font-medium text-foreground">Add Block</Dialog.Title>
191
188
  <Dialog.Close asChild>
192
189
  <button
193
190
  type="button"
@@ -221,14 +218,12 @@ function BlockTypeGrid({
221
218
  {filteredBlocks.length === 0 ? (
222
219
  <div className="flex flex-col items-center justify-center py-12 text-center">
223
220
  <Search size={24} className="text-muted-foreground mb-2" />
224
- <p className="text-sm text-muted-foreground">
225
- No blocks match &ldquo;{search}&rdquo;
226
- </p>
221
+ <p className="text-sm text-muted-foreground">No blocks match &ldquo;{search}&rdquo;</p>
227
222
  </div>
228
223
  ) : (
229
224
  <div className="grid grid-cols-2 gap-3" role="list" aria-label="Available block types">
230
225
  {filteredBlocks.map((block) => {
231
- const Icon = resolveIcon(block.icon);
226
+ const Icon = resolveIcon(block.icon)
232
227
  return (
233
228
  <button
234
229
  key={block.type}
@@ -241,9 +236,7 @@ function BlockTypeGrid({
241
236
  <Icon size={18} />
242
237
  </div>
243
238
  <div className="min-w-0">
244
- <p className="text-sm font-medium text-foreground truncate">
245
- {block.label}
246
- </p>
239
+ <p className="text-sm font-medium text-foreground truncate">{block.label}</p>
247
240
  {block.description && (
248
241
  <p className="text-xs text-muted-foreground mt-0.5 line-clamp-2">
249
242
  {block.description}
@@ -251,21 +244,21 @@ function BlockTypeGrid({
251
244
  )}
252
245
  </div>
253
246
  </button>
254
- );
247
+ )
255
248
  })}
256
249
  </div>
257
250
  )}
258
251
  </div>
259
252
  </div>
260
- );
253
+ )
261
254
  }
262
255
 
263
256
  interface VariantViewProps {
264
- block: BlockTypeDefinition;
265
- variantListRef: React.RefObject<HTMLDivElement | null>;
266
- onBack: () => void;
267
- onVariantClick: (variant: VariantDefinition) => void;
268
- onKeyDown: (e: React.KeyboardEvent) => void;
257
+ block: BlockTypeDefinition
258
+ variantListRef: React.RefObject<HTMLDivElement | null>
259
+ onBack: () => void
260
+ onVariantClick: (variant: VariantDefinition) => void
261
+ onKeyDown: (e: React.KeyboardEvent) => void
269
262
  }
270
263
 
271
264
  function VariantView({
@@ -275,7 +268,7 @@ function VariantView({
275
268
  onVariantClick,
276
269
  onKeyDown,
277
270
  }: VariantViewProps) {
278
- const Icon = resolveIcon(block.icon);
271
+ const Icon = resolveIcon(block.icon)
279
272
 
280
273
  return (
281
274
  <div className="flex flex-col h-full" onKeyDown={onKeyDown}>
@@ -290,16 +283,12 @@ function VariantView({
290
283
  </button>
291
284
  <div className="flex items-center gap-2 min-w-0">
292
285
  <Icon size={18} className="text-foreground shrink-0" />
293
- <h2 className="text-lg font-medium text-foreground truncate">
294
- {block.label}
295
- </h2>
286
+ <h2 className="text-lg font-medium text-foreground truncate">{block.label}</h2>
296
287
  </div>
297
288
  </div>
298
289
 
299
290
  {block.description && (
300
- <p className="text-sm text-muted-foreground px-5 pb-3">
301
- {block.description}
302
- </p>
291
+ <p className="text-sm text-muted-foreground px-5 pb-3">{block.description}</p>
303
292
  )}
304
293
 
305
294
  <div className="flex-1 overflow-y-auto px-5 pb-5" ref={variantListRef}>
@@ -315,9 +304,7 @@ function VariantView({
315
304
  >
316
305
  <div className="flex-1 min-w-0">
317
306
  <div className="flex items-center gap-2">
318
- <p className="text-sm font-medium text-foreground">
319
- {variant.label}
320
- </p>
307
+ <p className="text-sm font-medium text-foreground">{variant.label}</p>
321
308
  {index === 0 && (
322
309
  <span className="inline-flex items-center gap-1 text-xs text-primary bg-primary/10 px-1.5 py-0.5 rounded">
323
310
  <Check size={10} />
@@ -325,14 +312,12 @@ function VariantView({
325
312
  </span>
326
313
  )}
327
314
  </div>
328
- <p className="text-xs text-muted-foreground mt-0.5">
329
- {variant.description}
330
- </p>
315
+ <p className="text-xs text-muted-foreground mt-0.5">{variant.description}</p>
331
316
  </div>
332
317
  </button>
333
318
  ))}
334
319
  </div>
335
320
  </div>
336
321
  </div>
337
- );
322
+ )
338
323
  }
@@ -1,21 +1,21 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Plus, Grid3X3 } from 'lucide-react';
4
- import * as Switch from '@radix-ui/react-switch';
5
- import type { DeviceMode } from '../../hooks/useBuilderState.js';
3
+ import { Plus, Grid3X3 } from 'lucide-react'
4
+ import * as Switch from '@radix-ui/react-switch'
5
+ import type { DeviceMode } from '../../hooks/useBuilderState.js'
6
6
 
7
7
  export interface BottomBarProps {
8
- deviceMode: DeviceMode;
9
- showGridOverlay: boolean;
10
- onAddSection: () => void;
11
- onToggleGrid: (show: boolean) => void;
8
+ deviceMode: DeviceMode
9
+ showGridOverlay: boolean
10
+ onAddSection: () => void
11
+ onToggleGrid: (show: boolean) => void
12
12
  }
13
13
 
14
14
  const DEVICE_LABELS: Record<DeviceMode, string> = {
15
15
  desktop: '100%',
16
16
  tablet: '768px',
17
17
  mobile: '375px',
18
- };
18
+ }
19
19
 
20
20
  export function BottomBar({
21
21
  deviceMode,
@@ -24,7 +24,11 @@ export function BottomBar({
24
24
  onToggleGrid,
25
25
  }: BottomBarProps) {
26
26
  return (
27
- <div className="h-10 bg-card border-t border-border flex items-center px-4 gap-4 shrink-0" role="toolbar" aria-label="Builder actions">
27
+ <div
28
+ className="h-10 bg-card border-t border-border flex items-center px-4 gap-4 shrink-0"
29
+ role="toolbar"
30
+ aria-label="Builder actions"
31
+ >
28
32
  {/* Add Section */}
29
33
  <button
30
34
  onClick={onAddSection}
@@ -60,5 +64,5 @@ export function BottomBar({
60
64
  {DEVICE_LABELS[deviceMode]}
61
65
  </span>
62
66
  </div>
63
- );
67
+ )
64
68
  }
@@ -1,4 +1,4 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  import {
4
4
  ChevronLeft,
@@ -9,33 +9,33 @@ import {
9
9
  Smartphone,
10
10
  Loader2,
11
11
  Sparkles,
12
- } from 'lucide-react';
13
- import type { DeviceMode, PageSettings } from '../../hooks/useBuilderState.js';
12
+ } from 'lucide-react'
13
+ import type { DeviceMode, PageSettings } from '../../hooks/useBuilderState.js'
14
14
 
15
15
  export interface BuilderToolbarProps {
16
- collectionSlug: string;
17
- pageSettings: PageSettings;
18
- status: 'DRAFT' | 'PUBLISHED' | 'SCHEDULED';
19
- dirty: boolean;
20
- saving: boolean;
21
- canUndo: boolean;
22
- canRedo: boolean;
23
- deviceMode: DeviceMode;
24
- onNavigate: (path: string) => void;
25
- onTitleChange: (title: string) => void;
26
- onUndo: () => void;
27
- onRedo: () => void;
28
- onDeviceMode: (mode: DeviceMode) => void;
29
- onSave: () => void;
30
- onPublish: () => void;
31
- onOpenAI?: () => void;
16
+ collectionSlug: string
17
+ pageSettings: PageSettings
18
+ status: 'DRAFT' | 'PUBLISHED' | 'SCHEDULED'
19
+ dirty: boolean
20
+ saving: boolean
21
+ canUndo: boolean
22
+ canRedo: boolean
23
+ deviceMode: DeviceMode
24
+ onNavigate: (path: string) => void
25
+ onTitleChange: (title: string) => void
26
+ onUndo: () => void
27
+ onRedo: () => void
28
+ onDeviceMode: (mode: DeviceMode) => void
29
+ onSave: () => void
30
+ onPublish: () => void
31
+ onOpenAI?: () => void
32
32
  }
33
33
 
34
34
  const STATUS_STYLES: Record<string, string> = {
35
35
  DRAFT: 'bg-muted text-muted-foreground',
36
36
  PUBLISHED: 'bg-primary/10 text-primary',
37
37
  SCHEDULED: 'bg-accent text-accent-foreground',
38
- };
38
+ }
39
39
 
40
40
  export function BuilderToolbar({
41
41
  collectionSlug,
@@ -55,11 +55,14 @@ export function BuilderToolbar({
55
55
  onPublish,
56
56
  onOpenAI,
57
57
  }: BuilderToolbarProps) {
58
- const collectionLabel =
59
- collectionSlug.charAt(0).toUpperCase() + collectionSlug.slice(1);
58
+ const collectionLabel = collectionSlug.charAt(0).toUpperCase() + collectionSlug.slice(1)
60
59
 
61
60
  return (
62
- <div className="h-14 bg-card border-b border-border flex items-center px-4 gap-3 shrink-0" role="toolbar" aria-label="Page builder toolbar">
61
+ <div
62
+ className="h-14 bg-card border-b border-border flex items-center px-4 gap-3 shrink-0"
63
+ role="toolbar"
64
+ aria-label="Page builder toolbar"
65
+ >
63
66
  {/* Back button */}
64
67
  <button
65
68
  onClick={() => onNavigate(`/collections/${collectionSlug}`)}
@@ -187,7 +190,7 @@ export function BuilderToolbar({
187
190
  </button>
188
191
  </div>
189
192
  </div>
190
- );
193
+ )
191
194
  }
192
195
 
193
196
  function DeviceButton({
@@ -196,10 +199,10 @@ function DeviceButton({
196
199
  label,
197
200
  children,
198
201
  }: {
199
- active: boolean;
200
- onClick: () => void;
201
- label: string;
202
- children: React.ReactNode;
202
+ active: boolean
203
+ onClick: () => void
204
+ label: string
205
+ children: React.ReactNode
203
206
  }) {
204
207
  return (
205
208
  <button
@@ -214,5 +217,5 @@ function DeviceButton({
214
217
  >
215
218
  {children}
216
219
  </button>
217
- );
220
+ )
218
221
  }
@@ -1,38 +1,38 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useMemo } from 'react';
4
- import * as Tabs from '@radix-ui/react-tabs';
5
- import { Blocks, Settings2, FileText, Search, Palette } from 'lucide-react';
6
- import type { BuilderNode, PageNode } from '@actuate-media/cms-core';
7
- import { BlockEditor } from './BlockEditor.js';
8
- import { NodeSettings } from './NodeSettings.js';
9
- import { PageSettingsEditor } from './PageSettings.js';
10
- import { BuilderSEOPanel } from './SEOPanel.js';
11
- import { DesignScorePanel } from './DesignScore.js';
12
- import type { PageSettings } from '../../hooks/useBuilderState.js';
3
+ import { useMemo } from 'react'
4
+ import * as Tabs from '@radix-ui/react-tabs'
5
+ import { Blocks, Settings2, FileText, Search, Palette } from 'lucide-react'
6
+ import type { BuilderNode, PageNode } from '@actuate-media/cms-core'
7
+ import { BlockEditor } from './BlockEditor.js'
8
+ import { NodeSettings } from './NodeSettings.js'
9
+ import { PageSettingsEditor } from './PageSettings.js'
10
+ import { BuilderSEOPanel } from './SEOPanel.js'
11
+ import { DesignScorePanel } from './DesignScore.js'
12
+ import type { PageSettings } from '../../hooks/useBuilderState.js'
13
13
 
14
14
  export interface ContextPanelProps {
15
- activeTab: 'block' | 'node' | 'page' | 'seo' | 'design';
16
- onTabChange: (tab: 'block' | 'node' | 'page' | 'seo' | 'design') => void;
17
- selectedNode: BuilderNode | null;
18
- tree: PageNode;
19
- pageSettings: PageSettings;
20
- onUpdateSettings: (id: string, settings: Record<string, unknown>) => void;
21
- onUpdateBlock: (id: string, data: Record<string, unknown>) => void;
22
- onRemoveNode: (id: string) => void;
23
- onDuplicateNode: (id: string) => void;
24
- onMoveNodeUp: (id: string) => void;
25
- onMoveNodeDown: (id: string) => void;
26
- onPageSettingsChange: (settings: Partial<PageSettings>) => void;
27
- onAddRow: (sectionId: string) => void;
28
- config: any;
15
+ activeTab: 'block' | 'node' | 'page' | 'seo' | 'design'
16
+ onTabChange: (tab: 'block' | 'node' | 'page' | 'seo' | 'design') => void
17
+ selectedNode: BuilderNode | null
18
+ tree: PageNode
19
+ pageSettings: PageSettings
20
+ onUpdateSettings: (id: string, settings: Record<string, unknown>) => void
21
+ onUpdateBlock: (id: string, data: Record<string, unknown>) => void
22
+ onRemoveNode: (id: string) => void
23
+ onDuplicateNode: (id: string) => void
24
+ onMoveNodeUp: (id: string) => void
25
+ onMoveNodeDown: (id: string) => void
26
+ onPageSettingsChange: (settings: Partial<PageSettings>) => void
27
+ onAddRow: (sectionId: string) => void
28
+ config: any
29
29
  }
30
30
 
31
31
  type TabDef = {
32
- value: 'block' | 'node' | 'page' | 'seo' | 'design';
33
- label: string;
34
- icon: typeof Blocks;
35
- };
32
+ value: 'block' | 'node' | 'page' | 'seo' | 'design'
33
+ label: string
34
+ icon: typeof Blocks
35
+ }
36
36
 
37
37
  const TABS: TabDef[] = [
38
38
  { value: 'block', label: 'Block', icon: Blocks },
@@ -40,7 +40,7 @@ const TABS: TabDef[] = [
40
40
  { value: 'page', label: 'Page', icon: FileText },
41
41
  { value: 'seo', label: 'SEO', icon: Search },
42
42
  { value: 'design', label: 'Design', icon: Palette },
43
- ];
43
+ ]
44
44
 
45
45
  export function ContextPanel({
46
46
  activeTab,
@@ -59,17 +59,17 @@ export function ContextPanel({
59
59
  config,
60
60
  }: ContextPanelProps) {
61
61
  const availableTabs = useMemo(() => {
62
- if (!selectedNode) return TABS.filter((t) => t.value !== 'block' && t.value !== 'node');
63
- if (selectedNode.type === 'block') return TABS.filter((t) => t.value !== 'node');
64
- return TABS.filter((t) => t.value !== 'block');
65
- }, [selectedNode]);
62
+ if (!selectedNode) return TABS.filter((t) => t.value !== 'block' && t.value !== 'node')
63
+ if (selectedNode.type === 'block') return TABS.filter((t) => t.value !== 'node')
64
+ return TABS.filter((t) => t.value !== 'block')
65
+ }, [selectedNode])
66
66
 
67
67
  const effectiveTab = useMemo(() => {
68
- if (availableTabs.some((t) => t.value === activeTab)) return activeTab;
69
- if (selectedNode?.type === 'block') return 'block';
70
- if (selectedNode) return 'node';
71
- return 'page';
72
- }, [activeTab, availableTabs, selectedNode]);
68
+ if (availableTabs.some((t) => t.value === activeTab)) return activeTab
69
+ if (selectedNode?.type === 'block') return 'block'
70
+ if (selectedNode) return 'node'
71
+ return 'page'
72
+ }, [activeTab, availableTabs, selectedNode])
73
73
 
74
74
  return (
75
75
  <div className="w-full h-full bg-card overflow-y-auto">
@@ -79,7 +79,7 @@ export function ContextPanel({
79
79
  >
80
80
  <Tabs.List className="flex border-b border-border bg-muted/30">
81
81
  {availableTabs.map((tab) => {
82
- const Icon = tab.icon;
82
+ const Icon = tab.icon
83
83
  return (
84
84
  <Tabs.Trigger
85
85
  key={tab.value}
@@ -89,7 +89,7 @@ export function ContextPanel({
89
89
  <Icon size={14} />
90
90
  <span>{tab.label}</span>
91
91
  </Tabs.Trigger>
92
- );
92
+ )
93
93
  })}
94
94
  </Tabs.List>
95
95
 
@@ -107,24 +107,24 @@ export function ContextPanel({
107
107
  </Tabs.Content>
108
108
 
109
109
  <Tabs.Content value="node">
110
- {selectedNode && selectedNode.type !== 'block' && selectedNode.type !== 'page' && selectedNode.type !== 'savedSectionRef' && (
111
- <NodeSettings
112
- node={selectedNode}
113
- onUpdateSettings={onUpdateSettings}
114
- onRemoveNode={onRemoveNode}
115
- onDuplicateNode={onDuplicateNode}
116
- onMoveNodeUp={onMoveNodeUp}
117
- onMoveNodeDown={onMoveNodeDown}
118
- onAddRow={selectedNode.type === 'section' ? onAddRow : undefined}
119
- />
120
- )}
110
+ {selectedNode &&
111
+ selectedNode.type !== 'block' &&
112
+ selectedNode.type !== 'page' &&
113
+ selectedNode.type !== 'savedSectionRef' && (
114
+ <NodeSettings
115
+ node={selectedNode}
116
+ onUpdateSettings={onUpdateSettings}
117
+ onRemoveNode={onRemoveNode}
118
+ onDuplicateNode={onDuplicateNode}
119
+ onMoveNodeUp={onMoveNodeUp}
120
+ onMoveNodeDown={onMoveNodeDown}
121
+ onAddRow={selectedNode.type === 'section' ? onAddRow : undefined}
122
+ />
123
+ )}
121
124
  </Tabs.Content>
122
125
 
123
126
  <Tabs.Content value="page">
124
- <PageSettingsEditor
125
- settings={pageSettings}
126
- onChange={onPageSettingsChange}
127
- />
127
+ <PageSettingsEditor settings={pageSettings} onChange={onPageSettingsChange} />
128
128
  </Tabs.Content>
129
129
 
130
130
  <Tabs.Content value="seo">
@@ -141,5 +141,5 @@ export function ContextPanel({
141
141
  </Tabs.Content>
142
142
  </Tabs.Root>
143
143
  </div>
144
- );
144
+ )
145
145
  }