@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,32 +1,32 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useEffect } from 'react';
3
+ import { useEffect } from 'react'
4
4
 
5
5
  interface ShortcutMap {
6
- [combo: string]: (e: KeyboardEvent) => void;
6
+ [combo: string]: (e: KeyboardEvent) => void
7
7
  }
8
8
 
9
9
  export function useKeyboardShortcuts(shortcuts: ShortcutMap) {
10
10
  useEffect(() => {
11
11
  function handleKeyDown(e: KeyboardEvent) {
12
- const meta = e.metaKey || e.ctrlKey;
13
- const parts: string[] = [];
12
+ const meta = e.metaKey || e.ctrlKey
13
+ const parts: string[] = []
14
14
 
15
- if (meta) parts.push('mod');
16
- if (e.shiftKey) parts.push('shift');
17
- if (e.altKey) parts.push('alt');
18
- parts.push(e.key.toLowerCase());
15
+ if (meta) parts.push('mod')
16
+ if (e.shiftKey) parts.push('shift')
17
+ if (e.altKey) parts.push('alt')
18
+ parts.push(e.key.toLowerCase())
19
19
 
20
- const combo = parts.join('+');
21
- const handler = shortcuts[combo];
20
+ const combo = parts.join('+')
21
+ const handler = shortcuts[combo]
22
22
 
23
23
  if (handler) {
24
- e.preventDefault();
25
- handler(e);
24
+ e.preventDefault()
25
+ handler(e)
26
26
  }
27
27
  }
28
28
 
29
- document.addEventListener('keydown', handleKeyDown);
30
- return () => document.removeEventListener('keydown', handleKeyDown);
31
- }, [shortcuts]);
29
+ document.addEventListener('keydown', handleKeyDown)
30
+ return () => document.removeEventListener('keydown', handleKeyDown)
31
+ }, [shortcuts])
32
32
  }
package/src/index.ts CHANGED
@@ -1,63 +1,74 @@
1
- export { AdminRoot } from './AdminRoot.js';
2
- export type { AdminRootProps } from './AdminRoot.js';
1
+ export { AdminRoot } from './AdminRoot.js'
2
+ export type { AdminRootProps } from './AdminRoot.js'
3
3
 
4
- export { Layout } from './layout/Layout.js';
5
- export type { LayoutProps } from './layout/Layout.js';
6
- export { Sidebar } from './layout/Sidebar.js';
7
- export type { SidebarProps } from './layout/Sidebar.js';
8
- export { Header } from './layout/Header.js';
9
- export type { HeaderProps } from './layout/Header.js';
4
+ export { Layout } from './layout/Layout.js'
5
+ export type { LayoutProps } from './layout/Layout.js'
6
+ export { Sidebar } from './layout/Sidebar.js'
7
+ export type { SidebarProps } from './layout/Sidebar.js'
8
+ export { Header } from './layout/Header.js'
9
+ export type { HeaderProps } from './layout/Header.js'
10
10
 
11
- export { Dashboard } from './views/Dashboard.js';
12
- export { Posts } from './views/Posts.js';
13
- export { Pages } from './views/Pages.js';
14
- export { PostEditor } from './views/PostEditor.js';
15
- export { PageEditor } from './views/PageEditor.js';
16
- export { MediaBrowser } from './views/MediaBrowser.js';
17
- export { Forms } from './views/Forms.js';
18
- export { FormEditor } from './views/FormEditor.js';
19
- export type { FormEditorProps } from './views/FormEditor.js';
20
- export { FormSubmissions } from './views/FormSubmissions.js';
21
- export { Redirects } from './views/Redirects.js';
22
- export { Users } from './views/Users.js';
23
- export { Settings } from './views/Settings.js';
24
- export { SEO } from './views/SEO.js';
25
- export { SetupWizard } from './views/SetupWizard.js';
26
- export type { SetupWizardProps } from './views/SetupWizard.js';
27
- export { Login } from './views/Login.js';
28
- export type { LoginProps, CaptchaConfig } from './views/Login.js';
29
- export { ForgotPassword } from './views/ForgotPassword.js';
30
- export type { ForgotPasswordProps } from './views/ForgotPassword.js';
31
- export { ResetPassword } from './views/ResetPassword.js';
32
- export type { ResetPasswordProps } from './views/ResetPassword.js';
33
- export { CollectionList } from './views/CollectionList.js';
34
- export { DocumentEdit } from './views/DocumentEdit.js';
11
+ export { Dashboard } from './views/Dashboard.js'
12
+ export { Posts } from './views/Posts.js'
13
+ export { Pages } from './views/Pages.js'
14
+ export { PostEditor } from './views/PostEditor.js'
15
+ export { PageEditor } from './views/PageEditor.js'
16
+ export { MediaBrowser } from './views/MediaBrowser.js'
17
+ export { Forms } from './views/Forms.js'
18
+ export { FormEditor } from './views/FormEditor.js'
19
+ export type { FormEditorProps } from './views/FormEditor.js'
20
+ export { FormSubmissions } from './views/FormSubmissions.js'
21
+ export { Redirects } from './views/Redirects.js'
22
+ export { Users } from './views/Users.js'
23
+ export { Settings } from './views/Settings.js'
24
+ export { SEO } from './views/SEO.js'
25
+ export { SetupWizard } from './views/SetupWizard.js'
26
+ export type { SetupWizardProps } from './views/SetupWizard.js'
27
+ export { Login } from './views/Login.js'
28
+ export type { LoginProps, CaptchaConfig } from './views/Login.js'
29
+ export { ForgotPassword } from './views/ForgotPassword.js'
30
+ export type { ForgotPasswordProps } from './views/ForgotPassword.js'
31
+ export { ResetPassword } from './views/ResetPassword.js'
32
+ export type { ResetPasswordProps } from './views/ResetPassword.js'
33
+ export { CollectionList } from './views/CollectionList.js'
34
+ export { DocumentEdit } from './views/DocumentEdit.js'
35
35
 
36
- export { PageBuilder } from './views/page-builder/PageBuilder.js';
37
- export { useBuilderState } from './hooks/useBuilderState.js';
38
- export type { BuilderState, BuilderActions, DeviceMode, PanelTab, PageSettings as BuilderPageSettings } from './hooks/useBuilderState.js';
36
+ export { PageBuilder } from './views/page-builder/PageBuilder.js'
37
+ export { useBuilderState } from './hooks/useBuilderState.js'
38
+ export type {
39
+ BuilderState,
40
+ BuilderActions,
41
+ DeviceMode,
42
+ PanelTab,
43
+ PageSettings as BuilderPageSettings,
44
+ } from './hooks/useBuilderState.js'
39
45
 
40
- export { Breadcrumbs } from './components/Breadcrumbs.js';
41
- export { CommandPalette } from './components/CommandPalette.js';
42
- export { ErrorBoundary } from './components/ErrorBoundary.js';
43
- export { FolderTree } from './components/FolderTree.js';
44
- export type { FolderTreeProps, FolderNode, FolderSelection, SmartFolder } from './components/FolderTree.js';
45
- export { TipTapEditor } from './components/TipTapEditor.js';
46
- export { SEOPanel } from './components/SEOPanel.js';
47
- export type { SEOData, SEOPanelProps } from './components/SEOPanel.js';
48
- export { LivePreview } from './components/LivePreview.js';
49
- export { VersionHistory } from './components/VersionHistory.js';
50
- export type { VersionHistoryProps } from './components/VersionHistory.js';
51
- export { MediaPickerModal } from './components/MediaPickerModal.js';
52
- export type { MediaPickerModalProps } from './components/MediaPickerModal.js';
53
- export { ThemeProvider, useTheme } from './components/ThemeProvider.js';
54
- export { FocalPointPicker } from './components/FocalPointPicker.js';
55
- export { PresenceIndicator } from './components/PresenceIndicator.js';
56
- export { LocaleProvider, useLocale } from './components/LocaleProvider.js';
57
- export type { LocaleProviderProps } from './components/LocaleProvider.js';
58
- export { LocaleSwitcher } from './components/LocaleSwitcher.js';
59
- export { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts.js';
46
+ export { Breadcrumbs } from './components/Breadcrumbs.js'
47
+ export { CommandPalette } from './components/CommandPalette.js'
48
+ export { ErrorBoundary } from './components/ErrorBoundary.js'
49
+ export { FolderTree } from './components/FolderTree.js'
50
+ export type {
51
+ FolderTreeProps,
52
+ FolderNode,
53
+ FolderSelection,
54
+ SmartFolder,
55
+ } from './components/FolderTree.js'
56
+ export { TipTapEditor } from './components/TipTapEditor.js'
57
+ export { SEOPanel } from './components/SEOPanel.js'
58
+ export type { SEOData, SEOPanelProps } from './components/SEOPanel.js'
59
+ export { LivePreview } from './components/LivePreview.js'
60
+ export { VersionHistory } from './components/VersionHistory.js'
61
+ export type { VersionHistoryProps } from './components/VersionHistory.js'
62
+ export { MediaPickerModal } from './components/MediaPickerModal.js'
63
+ export type { MediaPickerModalProps } from './components/MediaPickerModal.js'
64
+ export { ThemeProvider, useTheme } from './components/ThemeProvider.js'
65
+ export { FocalPointPicker } from './components/FocalPointPicker.js'
66
+ export { PresenceIndicator } from './components/PresenceIndicator.js'
67
+ export { LocaleProvider, useLocale } from './components/LocaleProvider.js'
68
+ export type { LocaleProviderProps } from './components/LocaleProvider.js'
69
+ export { LocaleSwitcher } from './components/LocaleSwitcher.js'
70
+ export { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts.js'
60
71
 
61
- export { cmsApi, setApiBase, ensureCsrfToken } from './lib/api.js';
62
- export { useApiData } from './lib/useApiData.js';
63
- export type { UseApiDataResult } from './lib/useApiData.js';
72
+ export { cmsApi, setApiBase, ensureCsrfToken } from './lib/api.js'
73
+ export { useApiData } from './lib/useApiData.js'
74
+ export type { UseApiDataResult } from './lib/useApiData.js'
@@ -1,26 +1,26 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState } from 'react';
4
- import { Search, Bell, User, ChevronDown, Menu, Sun, Moon } from 'lucide-react';
5
- import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
6
- import { CommandPalette } from '../components/CommandPalette.js';
7
- import { useTheme } from '../components/ThemeProvider.js';
8
- import { LocaleSwitcher } from '../components/LocaleSwitcher.js';
3
+ import { useState } from 'react'
4
+ import { Search, Bell, User, ChevronDown, Menu, Sun, Moon } from 'lucide-react'
5
+ import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
6
+ import { CommandPalette } from '../components/CommandPalette.js'
7
+ import { useTheme } from '../components/ThemeProvider.js'
8
+ import { LocaleSwitcher } from '../components/LocaleSwitcher.js'
9
9
 
10
10
  export interface HeaderProps {
11
- onToggleSidebar: () => void;
12
- session?: any;
13
- onNavigate: (path: string) => void;
11
+ onToggleSidebar: () => void
12
+ session?: any
13
+ onNavigate: (path: string) => void
14
14
  }
15
15
 
16
16
  export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
17
- const [showCommandPalette, setShowCommandPalette] = useState(false);
18
- const [searchQuery, setSearchQuery] = useState('');
19
- const { resolvedTheme, setTheme } = useTheme();
17
+ const [showCommandPalette, setShowCommandPalette] = useState(false)
18
+ const [searchQuery, setSearchQuery] = useState('')
19
+ const { resolvedTheme, setTheme } = useTheme()
20
20
 
21
21
  const toggleTheme = () => {
22
- setTheme(resolvedTheme === 'dark' ? 'light' : 'dark');
23
- };
22
+ setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')
23
+ }
24
24
 
25
25
  return (
26
26
  <>
@@ -74,7 +74,10 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
74
74
  )}
75
75
  </button>
76
76
 
77
- <button className="p-2 hover:bg-accent rounded-lg transition-colors relative" aria-label="Notifications">
77
+ <button
78
+ className="p-2 hover:bg-accent rounded-lg transition-colors relative"
79
+ aria-label="Notifications"
80
+ >
78
81
  <Bell className="w-5 h-5 text-muted-foreground" />
79
82
  <span className="absolute top-1.5 right-1.5 w-2 h-2 bg-destructive rounded-full" />
80
83
  </button>
@@ -98,9 +101,7 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
98
101
  sideOffset={5}
99
102
  >
100
103
  <div className="px-3 py-2 border-b border-border">
101
- <p className="text-sm font-medium">
102
- {session?.user?.name ?? 'Admin User'}
103
- </p>
104
+ <p className="text-sm font-medium">{session?.user?.name ?? 'Admin User'}</p>
104
105
  <p className="text-xs text-muted-foreground">
105
106
  {session?.user?.email ?? 'admin@example.com'}
106
107
  </p>
@@ -131,5 +132,5 @@ export function Header({ onToggleSidebar, session, onNavigate }: HeaderProps) {
131
132
  onNavigate={onNavigate}
132
133
  />
133
134
  </>
134
- );
135
+ )
135
136
  }
@@ -1,36 +1,36 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, useEffect, type ReactNode } from 'react';
4
- import { Sidebar } from './Sidebar.js';
5
- import { Header } from './Header.js';
6
- import { Breadcrumbs } from '../components/Breadcrumbs.js';
7
- import { Toaster } from 'sonner';
3
+ import { useState, useEffect, type ReactNode } from 'react'
4
+ import { Sidebar } from './Sidebar.js'
5
+ import { Header } from './Header.js'
6
+ import { Breadcrumbs } from '../components/Breadcrumbs.js'
7
+ import { Toaster } from 'sonner'
8
8
 
9
9
  export interface LayoutProps {
10
- config: any;
11
- session: any;
12
- currentPath: string;
13
- onNavigate: (path: string) => void;
14
- children: ReactNode;
10
+ config: any
11
+ session: any
12
+ currentPath: string
13
+ onNavigate: (path: string) => void
14
+ children: ReactNode
15
15
  }
16
16
 
17
17
  export function Layout({ config, session, currentPath, onNavigate, children }: LayoutProps) {
18
- const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
19
- const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
18
+ const [sidebarCollapsed, setSidebarCollapsed] = useState(false)
19
+ const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false)
20
20
 
21
21
  useEffect(() => {
22
- setMobileSidebarOpen(false);
23
- }, [currentPath]);
22
+ setMobileSidebarOpen(false)
23
+ }, [currentPath])
24
24
 
25
25
  useEffect(() => {
26
26
  const handleResize = () => {
27
27
  if (window.innerWidth < 1024) {
28
- setMobileSidebarOpen(false);
28
+ setMobileSidebarOpen(false)
29
29
  }
30
- };
31
- window.addEventListener('resize', handleResize);
32
- return () => window.removeEventListener('resize', handleResize);
33
- }, []);
30
+ }
31
+ window.addEventListener('resize', handleResize)
32
+ return () => window.removeEventListener('resize', handleResize)
33
+ }, [])
34
34
 
35
35
  return (
36
36
  <div className="h-screen flex overflow-hidden bg-background text-foreground">
@@ -67,11 +67,9 @@ export function Layout({ config, session, currentPath, onNavigate, children }: L
67
67
  <Breadcrumbs currentPath={currentPath} onNavigate={onNavigate} />
68
68
 
69
69
  <main className="flex-1 overflow-auto bg-background">
70
- <div className="h-full">
71
- {children}
72
- </div>
70
+ <div className="h-full">{children}</div>
73
71
  </main>
74
72
  </div>
75
73
  </div>
76
- );
74
+ )
77
75
  }
@@ -1,4 +1,4 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  import {
4
4
  LayoutDashboard,
@@ -22,12 +22,18 @@ import {
22
22
  Code2,
23
23
  LayoutTemplate,
24
24
  Library,
25
- } from 'lucide-react';
26
- import type { LucideIcon } from 'lucide-react';
25
+ } from 'lucide-react'
26
+ import type { LucideIcon } from 'lucide-react'
27
27
 
28
28
  function ActuateLogo({ className }: { className?: string }) {
29
29
  return (
30
- <svg viewBox="0 0 40 44" fill="none" xmlns="http://www.w3.org/2000/svg" className={className} aria-hidden="true">
30
+ <svg
31
+ viewBox="0 0 40 44"
32
+ fill="none"
33
+ xmlns="http://www.w3.org/2000/svg"
34
+ className={className}
35
+ aria-hidden="true"
36
+ >
31
37
  {/* Upward arrow / chevron */}
32
38
  <polygon points="20,2 6,18 12,18 20,8 28,18 34,18" fill="#E8646A" />
33
39
  {/* Three vertical bars */}
@@ -35,20 +41,46 @@ function ActuateLogo({ className }: { className?: string }) {
35
41
  <rect x="18" y="20" width="4" height="22" rx="1" fill="#E8646A" />
36
42
  <rect x="25" y="20" width="4" height="22" rx="1" fill="#E8646A" />
37
43
  </svg>
38
- );
44
+ )
39
45
  }
40
46
 
41
47
  function ActuateWordmark({ className }: { className?: string }) {
42
48
  return (
43
- <svg viewBox="0 0 170 44" fill="none" xmlns="http://www.w3.org/2000/svg" className={className} aria-hidden="true">
49
+ <svg
50
+ viewBox="0 0 170 44"
51
+ fill="none"
52
+ xmlns="http://www.w3.org/2000/svg"
53
+ className={className}
54
+ aria-hidden="true"
55
+ >
44
56
  <polygon points="20,2 6,18 12,18 20,8 28,18 34,18" fill="#E8646A" />
45
57
  <rect x="11" y="20" width="4" height="22" rx="1" fill="#E8646A" />
46
58
  <rect x="18" y="20" width="4" height="22" rx="1" fill="#E8646A" />
47
59
  <rect x="25" y="20" width="4" height="22" rx="1" fill="#E8646A" />
48
- <text x="44" y="25" fontFamily="system-ui, sans-serif" fontSize="17" fontWeight="600" letterSpacing="1.5" fill="#E8646A">ACTUATE</text>
49
- <text x="44" y="40" fontFamily="system-ui, sans-serif" fontSize="10" fontWeight="500" letterSpacing="4" fill="#9CA3AF">MEDIA</text>
60
+ <text
61
+ x="44"
62
+ y="25"
63
+ fontFamily="system-ui, sans-serif"
64
+ fontSize="17"
65
+ fontWeight="600"
66
+ letterSpacing="1.5"
67
+ fill="#E8646A"
68
+ >
69
+ ACTUATE
70
+ </text>
71
+ <text
72
+ x="44"
73
+ y="40"
74
+ fontFamily="system-ui, sans-serif"
75
+ fontSize="10"
76
+ fontWeight="500"
77
+ letterSpacing="4"
78
+ fill="#9CA3AF"
79
+ >
80
+ MEDIA
81
+ </text>
50
82
  </svg>
51
- );
83
+ )
52
84
  }
53
85
 
54
86
  const ICON_MAP: Record<string, LucideIcon> = {
@@ -62,29 +94,35 @@ const ICON_MAP: Record<string, LucideIcon> = {
62
94
  PanelTop: PanelTop,
63
95
  PanelBottom: PanelBottom,
64
96
  Layers: Layers,
65
- };
97
+ }
66
98
 
67
99
  function BrandLogo({ config, collapsed }: { config?: any; collapsed: boolean }) {
68
- const branding = config?.admin?.branding;
69
- const customLogo = branding?.logo;
70
- const brandName = branding?.name;
100
+ const branding = config?.admin?.branding
101
+ const customLogo = branding?.logo
102
+ const brandName = branding?.name
71
103
 
72
104
  if (collapsed) {
73
105
  if (customLogo) {
74
- return <img src={customLogo} alt={brandName ?? 'Admin'} className="w-8 h-8 object-contain" />;
106
+ return <img src={customLogo} alt={brandName ?? 'Admin'} className="w-8 h-8 object-contain" />
75
107
  }
76
- return <ActuateLogo className="w-8 h-8" />;
108
+ return <ActuateLogo className="w-8 h-8" />
77
109
  }
78
110
 
79
111
  if (customLogo) {
80
112
  return (
81
113
  <div className="flex items-center gap-2.5 min-w-0">
82
- <img src={customLogo} alt={brandName ?? 'Admin'} className="h-8 w-auto object-contain shrink-0" />
114
+ <img
115
+ src={customLogo}
116
+ alt={brandName ?? 'Admin'}
117
+ className="h-8 w-auto object-contain shrink-0"
118
+ />
83
119
  {brandName && (
84
- <span className="text-sm font-semibold text-sidebar-foreground truncate">{brandName}</span>
120
+ <span className="text-sm font-semibold text-sidebar-foreground truncate">
121
+ {brandName}
122
+ </span>
85
123
  )}
86
124
  </div>
87
- );
125
+ )
88
126
  }
89
127
 
90
128
  if (brandName) {
@@ -93,10 +131,10 @@ function BrandLogo({ config, collapsed }: { config?: any; collapsed: boolean })
93
131
  <ActuateLogo className="w-7 h-7 shrink-0" />
94
132
  <span className="text-sm font-semibold text-sidebar-foreground truncate">{brandName}</span>
95
133
  </div>
96
- );
134
+ )
97
135
  }
98
136
 
99
- return <ActuateWordmark className="h-8 w-auto" />;
137
+ return <ActuateWordmark className="h-8 w-auto" />
100
138
  }
101
139
 
102
140
  const defaultNavItems = [
@@ -108,18 +146,24 @@ const defaultNavItems = [
108
146
  { path: '/seo', label: 'SEO', icon: SearchIcon },
109
147
  { path: '/users', label: 'Users', icon: Users },
110
148
  { path: '/settings', label: 'Settings', icon: Settings },
111
- ];
149
+ ]
112
150
 
113
151
  export interface SidebarProps {
114
- collapsed: boolean;
115
- onToggleCollapse: () => void;
116
- currentPath: string;
117
- onNavigate: (path: string) => void;
118
- config?: any;
152
+ collapsed: boolean
153
+ onToggleCollapse: () => void
154
+ currentPath: string
155
+ onNavigate: (path: string) => void
156
+ config?: any
119
157
  }
120
158
 
121
- export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate, config }: SidebarProps) {
122
- const navItems = buildNavItems(config);
159
+ export function Sidebar({
160
+ collapsed,
161
+ onToggleCollapse,
162
+ currentPath,
163
+ onNavigate,
164
+ config,
165
+ }: SidebarProps) {
166
+ const navItems = buildNavItems(config)
123
167
 
124
168
  return (
125
169
  <aside
@@ -132,12 +176,8 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
132
176
  collapsed ? 'justify-center' : 'justify-between'
133
177
  }`}
134
178
  >
135
- {!collapsed && (
136
- <BrandLogo config={config} collapsed={false} />
137
- )}
138
- {collapsed && (
139
- <BrandLogo config={config} collapsed={true} />
140
- )}
179
+ {!collapsed && <BrandLogo config={config} collapsed={false} />}
180
+ {collapsed && <BrandLogo config={config} collapsed={true} />}
141
181
  <button
142
182
  onClick={onToggleCollapse}
143
183
  className="hidden lg:block p-2 hover:bg-sidebar-accent rounded-lg transition-colors shrink-0"
@@ -153,13 +193,12 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
153
193
 
154
194
  <nav className="p-3 space-y-1">
155
195
  {navItems.map((item, idx) => {
156
- const Icon = item.icon;
196
+ const Icon = item.icon
157
197
  const isActive =
158
- currentPath === item.path ||
159
- (item.path !== '/' && currentPath.startsWith(item.path));
198
+ currentPath === item.path || (item.path !== '/' && currentPath.startsWith(item.path))
160
199
 
161
- const prevGroup = idx > 0 ? navItems[idx - 1]?.group : undefined;
162
- const showGroupLabel = item.group && item.group !== prevGroup;
200
+ const prevGroup = idx > 0 ? navItems[idx - 1]?.group : undefined
201
+ const showGroupLabel = item.group && item.group !== prevGroup
163
202
 
164
203
  return (
165
204
  <div key={item.path}>
@@ -185,64 +224,60 @@ export function Sidebar({ collapsed, onToggleCollapse, currentPath, onNavigate,
185
224
  title={collapsed ? item.label : ''}
186
225
  >
187
226
  <Icon className="w-5 h-5 shrink-0" />
188
- {!collapsed && (
189
- <span className="text-sm font-medium">{item.label}</span>
190
- )}
227
+ {!collapsed && <span className="text-sm font-medium">{item.label}</span>}
191
228
  </button>
192
229
  </div>
193
- );
230
+ )
194
231
  })}
195
232
  </nav>
196
233
  </aside>
197
- );
234
+ )
198
235
  }
199
236
 
200
237
  function resolveIcon(collection: any): LucideIcon {
201
- const mapped = collection.admin?.icon ? ICON_MAP[collection.admin.icon] : undefined;
202
- if (mapped) return mapped;
203
- return collection.type === 'page' ? File : FileText;
238
+ const mapped = collection.admin?.icon ? ICON_MAP[collection.admin.icon] : undefined
239
+ if (mapped) return mapped
240
+ return collection.type === 'page' ? File : FileText
204
241
  }
205
242
 
206
243
  export interface NavItem {
207
- path: string;
208
- label: string;
209
- icon: LucideIcon;
210
- group?: string;
244
+ path: string
245
+ label: string
246
+ icon: LucideIcon
247
+ group?: string
211
248
  }
212
249
 
213
250
  function buildNavItems(config: any): NavItem[] {
214
- if (!config?.collections) return defaultNavItems;
251
+ if (!config?.collections) return defaultNavItems
215
252
 
216
- const raw = config.collections;
217
- const collectionsList: any[] = Array.isArray(raw) ? raw : Object.values(raw);
253
+ const raw = config.collections
254
+ const collectionsList: any[] = Array.isArray(raw) ? raw : Object.values(raw)
218
255
 
219
- const visible = collectionsList.filter((c) => !c.admin?.hidden);
256
+ const visible = collectionsList.filter((c) => !c.admin?.hidden)
220
257
 
221
- const ungrouped = visible.filter((c) => !c.admin?.group);
222
- const grouped = visible.filter((c) => c.admin?.group);
258
+ const ungrouped = visible.filter((c) => !c.admin?.group)
259
+ const grouped = visible.filter((c) => c.admin?.group)
223
260
 
224
- const pages = ungrouped.filter((c) => c.type === 'page');
225
- const posts = ungrouped.filter((c) => c.type === 'post');
226
- const other = ungrouped.filter((c) => c.type !== 'page' && c.type !== 'post');
227
- const sortedUngrouped = [...pages, ...posts, ...other];
261
+ const pages = ungrouped.filter((c) => c.type === 'page')
262
+ const posts = ungrouped.filter((c) => c.type === 'post')
263
+ const other = ungrouped.filter((c) => c.type !== 'page' && c.type !== 'post')
264
+ const sortedUngrouped = [...pages, ...posts, ...other]
228
265
 
229
- const items: NavItem[] = [
230
- { path: '/', label: 'Dashboard', icon: LayoutDashboard },
231
- ];
266
+ const items: NavItem[] = [{ path: '/', label: 'Dashboard', icon: LayoutDashboard }]
232
267
 
233
268
  for (const collection of sortedUngrouped) {
234
269
  items.push({
235
270
  label: collection.labels?.plural ?? collection.slug,
236
271
  path: `/${collection.slug}`,
237
272
  icon: resolveIcon(collection),
238
- });
273
+ })
239
274
  }
240
275
 
241
- const groups = new Map<string, typeof grouped>();
276
+ const groups = new Map<string, typeof grouped>()
242
277
  for (const col of grouped) {
243
- const group = col.admin.group as string;
244
- if (!groups.has(group)) groups.set(group, []);
245
- groups.get(group)!.push(col);
278
+ const group = col.admin.group as string
279
+ if (!groups.has(group)) groups.set(group, [])
280
+ groups.get(group)!.push(col)
246
281
  }
247
282
  for (const [groupName, cols] of groups) {
248
283
  for (const collection of cols) {
@@ -251,7 +286,7 @@ function buildNavItems(config: any): NavItem[] {
251
286
  path: `/${collection.slug}`,
252
287
  icon: resolveIcon(collection),
253
288
  group: groupName,
254
- });
289
+ })
255
290
  }
256
291
  }
257
292
 
@@ -265,7 +300,7 @@ function buildNavItems(config: any): NavItem[] {
265
300
  { path: '/script-tags', label: 'Script Tags', icon: Code2 },
266
301
  { path: '/users', label: 'Users', icon: Users },
267
302
  { path: '/settings', label: 'Settings', icon: Settings },
268
- );
303
+ )
269
304
 
270
- return items;
305
+ return items
271
306
  }