@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
package/src/lib/api.ts CHANGED
@@ -1,15 +1,15 @@
1
- const DEFAULT_BASE = '/api/cms';
1
+ const DEFAULT_BASE = '/api/cms'
2
2
 
3
- let basePath = DEFAULT_BASE;
3
+ let basePath = DEFAULT_BASE
4
4
 
5
5
  export function setApiBase(path: string) {
6
- basePath = path;
6
+ basePath = path
7
7
  }
8
8
 
9
9
  function getCsrfToken(): string {
10
- if (typeof document === 'undefined') return '';
11
- const match = document.cookie.match(/(?:^|;\s*)actuate_csrf=([^;]*)/);
12
- return match?.[1] ?? '';
10
+ if (typeof document === 'undefined') return ''
11
+ const match = document.cookie.match(/(?:^|;\s*)actuate_csrf=([^;]*)/)
12
+ return match?.[1] ?? ''
13
13
  }
14
14
 
15
15
  /**
@@ -21,52 +21,52 @@ function getCsrfToken(): string {
21
21
  * `pendingFetch` cache so the admin doesn't fire N parallel `/auth/csrf`
22
22
  * requests when a page lights up after navigation.
23
23
  */
24
- let pendingFetch: Promise<void> | null = null;
24
+ let pendingFetch: Promise<void> | null = null
25
25
 
26
26
  export async function ensureCsrfToken(): Promise<void> {
27
- if (getCsrfToken()) return;
28
- if (pendingFetch) return pendingFetch;
27
+ if (getCsrfToken()) return
28
+ if (pendingFetch) return pendingFetch
29
29
  pendingFetch = (async () => {
30
30
  try {
31
- await fetch(`${basePath}/auth/csrf`, { credentials: 'include' });
31
+ await fetch(`${basePath}/auth/csrf`, { credentials: 'include' })
32
32
  } catch {
33
33
  // best-effort — caller will see the 403 from the actual mutation if
34
34
  // the cookie still isn't set, instead of a silent network failure.
35
35
  } finally {
36
- pendingFetch = null;
36
+ pendingFetch = null
37
37
  }
38
- })();
39
- return pendingFetch;
38
+ })()
39
+ return pendingFetch
40
40
  }
41
41
 
42
42
  function getActiveLocale(): string | null {
43
- if (typeof localStorage === 'undefined') return null;
44
- return localStorage.getItem('actuate-locale');
43
+ if (typeof localStorage === 'undefined') return null
44
+ return localStorage.getItem('actuate-locale')
45
45
  }
46
46
 
47
47
  function appendLocaleParam(endpoint: string): string {
48
- const locale = getActiveLocale();
49
- if (!locale) return endpoint;
50
- const separator = endpoint.includes('?') ? '&' : '?';
51
- return `${endpoint}${separator}locale=${encodeURIComponent(locale)}`;
48
+ const locale = getActiveLocale()
49
+ if (!locale) return endpoint
50
+ const separator = endpoint.includes('?') ? '&' : '?'
51
+ return `${endpoint}${separator}locale=${encodeURIComponent(locale)}`
52
52
  }
53
53
 
54
54
  export async function cmsApi<T = unknown>(
55
55
  endpoint: string,
56
- options: RequestInit = {}
56
+ options: RequestInit = {},
57
57
  ): Promise<{ data?: T; error?: string; status: number }> {
58
- const url = `${basePath}${appendLocaleParam(endpoint)}`;
59
- const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData;
58
+ const url = `${basePath}${appendLocaleParam(endpoint)}`
59
+ const isFormData = typeof FormData !== 'undefined' && options.body instanceof FormData
60
60
 
61
61
  const headers: Record<string, string> = {
62
- ...(options.headers as Record<string, string> || {}),
63
- };
62
+ ...((options.headers as Record<string, string>) || {}),
63
+ }
64
64
 
65
65
  if (!isFormData) {
66
- headers['Content-Type'] = 'application/json';
66
+ headers['Content-Type'] = 'application/json'
67
67
  }
68
68
 
69
- const method = (options.method ?? 'GET').toUpperCase();
69
+ const method = (options.method ?? 'GET').toUpperCase()
70
70
  if (method !== 'GET' && method !== 'HEAD') {
71
71
  // Bootstrap the CSRF cookie lazily — covers consumers that sign users
72
72
  // in via a custom Server Action (the Next.js App Router pattern) where
@@ -74,22 +74,22 @@ export async function cmsApi<T = unknown>(
74
74
  // cookie from the login response. Without this, the very first mutation
75
75
  // after sign-in 403s.
76
76
  if (!getCsrfToken()) {
77
- await ensureCsrfToken();
77
+ await ensureCsrfToken()
78
78
  }
79
- const csrf = getCsrfToken();
80
- if (csrf) headers['x-csrf-token'] = csrf;
79
+ const csrf = getCsrfToken()
80
+ if (csrf) headers['x-csrf-token'] = csrf
81
81
  }
82
82
 
83
83
  try {
84
- const res = await fetch(url, { ...options, headers, credentials: 'include' });
85
- const json = await res.json().catch(() => ({}));
84
+ const res = await fetch(url, { ...options, headers, credentials: 'include' })
85
+ const json = await res.json().catch(() => ({}))
86
86
 
87
87
  if (!res.ok) {
88
- return { error: json.error || `Request failed (${res.status})`, status: res.status };
88
+ return { error: json.error || `Request failed (${res.status})`, status: res.status }
89
89
  }
90
90
 
91
- return { data: json.data ?? json, status: res.status };
91
+ return { data: json.data ?? json, status: res.status }
92
92
  } catch (err) {
93
- return { error: err instanceof Error ? err.message : 'Network error', status: 0 };
93
+ return { error: err instanceof Error ? err.message : 'Network error', status: 0 }
94
94
  }
95
95
  }
package/src/lib/search.ts CHANGED
@@ -1,24 +1,24 @@
1
- type SortDirection = 'asc' | 'desc';
1
+ type SortDirection = 'asc' | 'desc'
2
2
 
3
3
  export interface SortConfig<K extends string = string> {
4
- key: K;
5
- direction: SortDirection;
4
+ key: K
5
+ direction: SortDirection
6
6
  }
7
7
 
8
8
  function toSearchText(value: unknown): string {
9
- return String(value ?? '');
9
+ return String(value ?? '')
10
10
  }
11
11
 
12
12
  export function scoreRelevance(text: unknown, query: unknown): number {
13
- if (!query) return 0;
14
- const lower = toSearchText(text).toLowerCase();
15
- const q = toSearchText(query).toLowerCase();
16
- if (lower === q) return 100;
17
- if (lower.startsWith(q)) return 80;
18
- const wordBoundary = new RegExp(`\\b${q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`);
19
- if (wordBoundary.test(lower)) return 60;
20
- if (lower.includes(q)) return 40;
21
- return 0;
13
+ if (!query) return 0
14
+ const lower = toSearchText(text).toLowerCase()
15
+ const q = toSearchText(query).toLowerCase()
16
+ if (lower === q) return 100
17
+ if (lower.startsWith(q)) return 80
18
+ const wordBoundary = new RegExp(`\\b${q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}`)
19
+ if (wordBoundary.test(lower)) return 60
20
+ if (lower.includes(q)) return 40
21
+ return 0
22
22
  }
23
23
 
24
24
  export function sortByRelevance<T>(
@@ -26,12 +26,12 @@ export function sortByRelevance<T>(
26
26
  query: string,
27
27
  getSearchFields: (item: T) => unknown[],
28
28
  ): T[] {
29
- if (!query.trim()) return items;
29
+ if (!query.trim()) return items
30
30
  return [...items].sort((a, b) => {
31
- const scoreA = Math.max(...getSearchFields(a).map(f => scoreRelevance(f, query)));
32
- const scoreB = Math.max(...getSearchFields(b).map(f => scoreRelevance(f, query)));
33
- return scoreB - scoreA;
34
- });
31
+ const scoreA = Math.max(...getSearchFields(a).map((f) => scoreRelevance(f, query)))
32
+ const scoreB = Math.max(...getSearchFields(b).map((f) => scoreRelevance(f, query)))
33
+ return scoreB - scoreA
34
+ })
35
35
  }
36
36
 
37
37
  export function sortByColumn<T>(
@@ -39,25 +39,21 @@ export function sortByColumn<T>(
39
39
  sortConfig: SortConfig | null,
40
40
  getValue: (item: T, key: string) => string | number,
41
41
  ): T[] {
42
- if (!sortConfig) return items;
42
+ if (!sortConfig) return items
43
43
  return [...items].sort((a, b) => {
44
- const aVal = getValue(a, sortConfig.key);
45
- const bVal = getValue(b, sortConfig.key);
46
- const cmp = typeof aVal === 'number' && typeof bVal === 'number'
47
- ? aVal - bVal
48
- : String(aVal).localeCompare(String(bVal));
49
- return sortConfig.direction === 'asc' ? cmp : -cmp;
50
- });
44
+ const aVal = getValue(a, sortConfig.key)
45
+ const bVal = getValue(b, sortConfig.key)
46
+ const cmp =
47
+ typeof aVal === 'number' && typeof bVal === 'number'
48
+ ? aVal - bVal
49
+ : String(aVal).localeCompare(String(bVal))
50
+ return sortConfig.direction === 'asc' ? cmp : -cmp
51
+ })
51
52
  }
52
53
 
53
- export function toggleSort<K extends string>(
54
- current: SortConfig<K> | null,
55
- key: K,
56
- ): SortConfig<K> {
54
+ export function toggleSort<K extends string>(current: SortConfig<K> | null, key: K): SortConfig<K> {
57
55
  if (current?.key === key) {
58
- return current.direction === 'asc'
59
- ? { key, direction: 'desc' }
60
- : { key, direction: 'asc' };
56
+ return current.direction === 'asc' ? { key, direction: 'desc' } : { key, direction: 'asc' }
61
57
  }
62
- return { key, direction: 'asc' };
58
+ return { key, direction: 'asc' }
63
59
  }
@@ -1,20 +1,20 @@
1
- 'use client';
2
- import { useState, useEffect, useCallback, useRef } from 'react';
3
- import { cmsApi } from './api.js';
1
+ 'use client'
2
+ import { useState, useEffect, useCallback, useRef } from 'react'
3
+ import { cmsApi } from './api.js'
4
4
 
5
5
  export interface UseApiDataOptions {
6
- maxRetries?: number;
6
+ maxRetries?: number
7
7
  /** Base delay in ms for exponential backoff (default 1000). Actual delay = base * 2^attempt. */
8
- retryBaseMs?: number;
8
+ retryBaseMs?: number
9
9
  }
10
10
 
11
11
  export interface UseApiDataResult<T> {
12
- data: T | null;
13
- loading: boolean;
14
- error: string | null;
12
+ data: T | null
13
+ loading: boolean
14
+ error: string | null
15
15
  /** True when all retries are exhausted and the request permanently failed. */
16
- exhausted: boolean;
17
- refetch: () => void;
16
+ exhausted: boolean
17
+ refetch: () => void
18
18
  }
19
19
 
20
20
  export function useApiData<T>(
@@ -22,74 +22,77 @@ export function useApiData<T>(
22
22
  defaultValue: T | null = null,
23
23
  options: UseApiDataOptions = {},
24
24
  ): UseApiDataResult<T> {
25
- const { maxRetries = 3, retryBaseMs = 1000 } = options;
26
- const [data, setData] = useState<T | null>(defaultValue);
27
- const [loading, setLoading] = useState(endpoint !== null);
28
- const [error, setError] = useState<string | null>(null);
29
- const [exhausted, setExhausted] = useState(false);
30
- const abortRef = useRef<AbortController | null>(null);
31
- const retryCountRef = useRef(0);
32
- const retryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
25
+ const { maxRetries = 3, retryBaseMs = 1000 } = options
26
+ const [data, setData] = useState<T | null>(defaultValue)
27
+ const [loading, setLoading] = useState(endpoint !== null)
28
+ const [error, setError] = useState<string | null>(null)
29
+ const [exhausted, setExhausted] = useState(false)
30
+ const abortRef = useRef<AbortController | null>(null)
31
+ const retryCountRef = useRef(0)
32
+ const retryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)
33
33
 
34
- const fetchData = useCallback(async (isRetry = false) => {
35
- if (!endpoint) {
36
- setLoading(false);
37
- return;
38
- }
34
+ const fetchData = useCallback(
35
+ async (isRetry = false) => {
36
+ if (!endpoint) {
37
+ setLoading(false)
38
+ return
39
+ }
39
40
 
40
- abortRef.current?.abort();
41
- const controller = new AbortController();
42
- abortRef.current = controller;
41
+ abortRef.current?.abort()
42
+ const controller = new AbortController()
43
+ abortRef.current = controller
43
44
 
44
- if (!isRetry) {
45
- retryCountRef.current = 0;
46
- setExhausted(false);
47
- }
45
+ if (!isRetry) {
46
+ retryCountRef.current = 0
47
+ setExhausted(false)
48
+ }
48
49
 
49
- setLoading(true);
50
- setError(null);
50
+ setLoading(true)
51
+ setError(null)
51
52
 
52
- const res = await cmsApi<T>(endpoint, { signal: controller.signal });
53
+ const res = await cmsApi<T>(endpoint, { signal: controller.signal })
53
54
 
54
- if (controller.signal.aborted) return;
55
+ if (controller.signal.aborted) return
55
56
 
56
- if (res.error) {
57
- if (retryCountRef.current < maxRetries) {
58
- const delay = retryBaseMs * Math.pow(2, retryCountRef.current);
59
- retryCountRef.current += 1;
60
- retryTimerRef.current = setTimeout(() => fetchData(true), delay);
61
- return;
57
+ if (res.error) {
58
+ if (retryCountRef.current < maxRetries) {
59
+ const delay = retryBaseMs * Math.pow(2, retryCountRef.current)
60
+ retryCountRef.current += 1
61
+ retryTimerRef.current = setTimeout(() => fetchData(true), delay)
62
+ return
63
+ }
64
+ setError(res.error)
65
+ setExhausted(true)
66
+ setLoading(false)
67
+ } else {
68
+ setData(res.data ?? null)
69
+ setLoading(false)
70
+ retryCountRef.current = 0
62
71
  }
63
- setError(res.error);
64
- setExhausted(true);
65
- setLoading(false);
66
- } else {
67
- setData(res.data ?? null);
68
- setLoading(false);
69
- retryCountRef.current = 0;
70
- }
71
- }, [endpoint, maxRetries, retryBaseMs]);
72
+ },
73
+ [endpoint, maxRetries, retryBaseMs],
74
+ )
72
75
 
73
76
  const manualRefetch = useCallback(() => {
74
77
  if (retryTimerRef.current) {
75
- clearTimeout(retryTimerRef.current);
76
- retryTimerRef.current = null;
78
+ clearTimeout(retryTimerRef.current)
79
+ retryTimerRef.current = null
77
80
  }
78
- retryCountRef.current = 0;
79
- setExhausted(false);
80
- fetchData(false);
81
- }, [fetchData]);
81
+ retryCountRef.current = 0
82
+ setExhausted(false)
83
+ fetchData(false)
84
+ }, [fetchData])
82
85
 
83
86
  useEffect(() => {
84
- fetchData(false);
87
+ fetchData(false)
85
88
  return () => {
86
- abortRef.current?.abort();
89
+ abortRef.current?.abort()
87
90
  if (retryTimerRef.current) {
88
- clearTimeout(retryTimerRef.current);
89
- retryTimerRef.current = null;
91
+ clearTimeout(retryTimerRef.current)
92
+ retryTimerRef.current = null
90
93
  }
91
- };
92
- }, [fetchData]);
94
+ }
95
+ }, [fetchData])
93
96
 
94
- return { data, loading, error, exhausted, refetch: manualRefetch };
97
+ return { data, loading, error, exhausted, refetch: manualRefetch }
95
98
  }
package/src/lib/utils.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { clsx, type ClassValue } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
1
+ import { clsx, type ClassValue } from 'clsx'
2
+ import { twMerge } from 'tailwind-merge'
3
3
 
4
4
  export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs));
5
+ return twMerge(clsx(inputs))
6
6
  }
@@ -1,81 +1,79 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, useCallback, useEffect, useRef } from 'react';
3
+ import { useState, useCallback, useEffect, useRef } from 'react'
4
4
 
5
5
  interface RouteParams {
6
- [key: string]: string;
6
+ [key: string]: string
7
7
  }
8
8
 
9
9
  function stripBase(pathname: string, basePath: string): string {
10
10
  if (pathname.startsWith(basePath)) {
11
- const rest = pathname.slice(basePath.length);
12
- return rest === '' || rest === '/' ? '/' : rest.startsWith('/') ? rest : `/${rest}`;
11
+ const rest = pathname.slice(basePath.length)
12
+ return rest === '' || rest === '/' ? '/' : rest.startsWith('/') ? rest : `/${rest}`
13
13
  }
14
- return '/';
14
+ return '/'
15
15
  }
16
16
 
17
17
  export function useAdminRouter(basePath = '/admin', serverPath = '/') {
18
- const [currentPath, setCurrentPath] = useState(serverPath);
19
- const baseRef = useRef(basePath);
20
- baseRef.current = basePath;
18
+ const [currentPath, setCurrentPath] = useState(serverPath)
19
+ const baseRef = useRef(basePath)
20
+ baseRef.current = basePath
21
21
 
22
22
  useEffect(() => {
23
23
  if (typeof window !== 'undefined') {
24
- const browserPath = stripBase(window.location.pathname, basePath);
24
+ const browserPath = stripBase(window.location.pathname, basePath)
25
25
  if (browserPath !== currentPath) {
26
- setCurrentPath(browserPath);
26
+ setCurrentPath(browserPath)
27
27
  }
28
28
  }
29
- }, []); // eslint-disable-line react-hooks/exhaustive-deps
29
+ }, []) // eslint-disable-line react-hooks/exhaustive-deps
30
30
 
31
31
  useEffect(() => {
32
32
  function onPopState() {
33
- setCurrentPath(stripBase(window.location.pathname, baseRef.current));
33
+ setCurrentPath(stripBase(window.location.pathname, baseRef.current))
34
34
  }
35
- window.addEventListener('popstate', onPopState);
36
- return () => window.removeEventListener('popstate', onPopState);
37
- }, []);
35
+ window.addEventListener('popstate', onPopState)
36
+ return () => window.removeEventListener('popstate', onPopState)
37
+ }, [])
38
38
 
39
39
  const navigate = useCallback((path: string) => {
40
- const normalizedPath = path.startsWith('/') ? path : `/${path}`;
41
- setCurrentPath(normalizedPath);
40
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`
41
+ setCurrentPath(normalizedPath)
42
42
 
43
- const fullUrl = normalizedPath === '/'
44
- ? baseRef.current
45
- : `${baseRef.current}${normalizedPath}`;
46
- window.history.pushState({ adminPath: normalizedPath }, '', fullUrl);
47
- }, []);
43
+ const fullUrl = normalizedPath === '/' ? baseRef.current : `${baseRef.current}${normalizedPath}`
44
+ window.history.pushState({ adminPath: normalizedPath }, '', fullUrl)
45
+ }, [])
48
46
 
49
47
  const matchRoute = useCallback(
50
48
  (pattern: string): RouteParams | null => {
51
- const patternParts = pattern.split('/').filter(Boolean);
52
- const pathParts = currentPath.split('/').filter(Boolean);
49
+ const patternParts = pattern.split('/').filter(Boolean)
50
+ const pathParts = currentPath.split('/').filter(Boolean)
53
51
 
54
52
  if (pattern === '/' && pathParts.length === 0) {
55
- return {};
53
+ return {}
56
54
  }
57
55
 
58
56
  if (patternParts.length !== pathParts.length) {
59
- return null;
57
+ return null
60
58
  }
61
59
 
62
- const params: RouteParams = {};
60
+ const params: RouteParams = {}
63
61
 
64
62
  for (let i = 0; i < patternParts.length; i++) {
65
- const patternPart = patternParts[i]!;
66
- const pathPart = pathParts[i]!;
63
+ const patternPart = patternParts[i]!
64
+ const pathPart = pathParts[i]!
67
65
 
68
66
  if (patternPart.startsWith(':')) {
69
- params[patternPart.slice(1)] = pathPart;
67
+ params[patternPart.slice(1)] = pathPart
70
68
  } else if (patternPart !== pathPart) {
71
- return null;
69
+ return null
72
70
  }
73
71
  }
74
72
 
75
- return params;
73
+ return params
76
74
  },
77
75
  [currentPath],
78
- );
76
+ )
79
77
 
80
- return { currentPath, navigate, matchRoute };
78
+ return { currentPath, navigate, matchRoute }
81
79
  }
@@ -6,6 +6,6 @@
6
6
  * Consumers import the compiled output:
7
7
  * import '@actuate-media/cms-admin/styles/precompiled.css'
8
8
  */
9
- @import "tailwindcss";
9
+ @import 'tailwindcss';
10
10
  @source "../../src/**/*.{ts,tsx}";
11
- @import "./theme.css";
11
+ @import './theme.css';
@@ -8,4 +8,4 @@
8
8
  * If using this file, you must add @source to scan the admin components:
9
9
  * @source "../../../node_modules/@actuate-media/cms-admin/src/**\/*.{ts,tsx}";
10
10
  */
11
- @import "./theme.css";
11
+ @import './theme.css';
@@ -129,7 +129,13 @@
129
129
 
130
130
  .actuate-admin {
131
131
  @apply bg-background text-foreground;
132
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important;
132
+ font-family:
133
+ system-ui,
134
+ -apple-system,
135
+ BlinkMacSystemFont,
136
+ 'Segoe UI',
137
+ Roboto,
138
+ sans-serif !important;
133
139
  font-size: var(--font-size);
134
140
  line-height: 1.5;
135
141
  isolation: isolate;