@actuate-media/cms-admin 0.7.3 → 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 (435) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +95 -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/actuate-admin.css +1 -1
  10. package/dist/components/Breadcrumbs.d.ts.map +1 -1
  11. package/dist/components/Breadcrumbs.js +2 -4
  12. package/dist/components/Breadcrumbs.js.map +1 -1
  13. package/dist/components/CommandPalette.d.ts.map +1 -1
  14. package/dist/components/CommandPalette.js +7 -3
  15. package/dist/components/CommandPalette.js.map +1 -1
  16. package/dist/components/ContentOverviewChart.d.ts.map +1 -1
  17. package/dist/components/ContentOverviewChart.js.map +1 -1
  18. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  19. package/dist/components/ErrorBoundary.js.map +1 -1
  20. package/dist/components/FocalPointPicker.d.ts.map +1 -1
  21. package/dist/components/FocalPointPicker.js +4 -2
  22. package/dist/components/FocalPointPicker.js.map +1 -1
  23. package/dist/components/FolderTree.d.ts.map +1 -1
  24. package/dist/components/FolderTree.js +18 -10
  25. package/dist/components/FolderTree.js.map +1 -1
  26. package/dist/components/LivePreview.d.ts +1 -1
  27. package/dist/components/LivePreview.d.ts.map +1 -1
  28. package/dist/components/LivePreview.js +6 -2
  29. package/dist/components/LivePreview.js.map +1 -1
  30. package/dist/components/LocaleProvider.d.ts.map +1 -1
  31. package/dist/components/LocaleProvider.js.map +1 -1
  32. package/dist/components/LocaleSwitcher.d.ts.map +1 -1
  33. package/dist/components/LocaleSwitcher.js +1 -1
  34. package/dist/components/LocaleSwitcher.js.map +1 -1
  35. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  36. package/dist/components/MediaPickerModal.js.map +1 -1
  37. package/dist/components/PresenceIndicator.d.ts.map +1 -1
  38. package/dist/components/PresenceIndicator.js +5 -2
  39. package/dist/components/PresenceIndicator.js.map +1 -1
  40. package/dist/components/SEOPanel.d.ts +1 -1
  41. package/dist/components/SEOPanel.d.ts.map +1 -1
  42. package/dist/components/SEOPanel.js +110 -24
  43. package/dist/components/SEOPanel.js.map +1 -1
  44. package/dist/components/SEOPerformance.d.ts.map +1 -1
  45. package/dist/components/SEOPerformance.js +2 -2
  46. package/dist/components/SEOPerformance.js.map +1 -1
  47. package/dist/components/ThemeProvider.d.ts.map +1 -1
  48. package/dist/components/ThemeProvider.js.map +1 -1
  49. package/dist/components/TipTapEditor.d.ts.map +1 -1
  50. package/dist/components/TipTapEditor.js +5 -1
  51. package/dist/components/TipTapEditor.js.map +1 -1
  52. package/dist/components/VersionHistory.d.ts +1 -1
  53. package/dist/components/VersionHistory.d.ts.map +1 -1
  54. package/dist/components/VersionHistory.js +1 -1
  55. package/dist/components/VersionHistory.js.map +1 -1
  56. package/dist/components/ui/Avatar.d.ts.map +1 -1
  57. package/dist/components/ui/Avatar.js.map +1 -1
  58. package/dist/components/ui/Badge.d.ts.map +1 -1
  59. package/dist/components/ui/Badge.js.map +1 -1
  60. package/dist/components/ui/Button.d.ts.map +1 -1
  61. package/dist/components/ui/Button.js.map +1 -1
  62. package/dist/components/ui/CommandPalette.d.ts.map +1 -1
  63. package/dist/components/ui/CommandPalette.js +8 -2
  64. package/dist/components/ui/CommandPalette.js.map +1 -1
  65. package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
  66. package/dist/components/ui/ConfirmDialog.js.map +1 -1
  67. package/dist/components/ui/DataTable.d.ts.map +1 -1
  68. package/dist/components/ui/DataTable.js +1 -3
  69. package/dist/components/ui/DataTable.js.map +1 -1
  70. package/dist/components/ui/EmptyState.d.ts.map +1 -1
  71. package/dist/components/ui/EmptyState.js +1 -1
  72. package/dist/components/ui/EmptyState.js.map +1 -1
  73. package/dist/components/ui/Modal.d.ts.map +1 -1
  74. package/dist/components/ui/Modal.js.map +1 -1
  75. package/dist/components/ui/Pagination.d.ts +1 -1
  76. package/dist/components/ui/Pagination.d.ts.map +1 -1
  77. package/dist/components/ui/Pagination.js +7 -2
  78. package/dist/components/ui/Pagination.js.map +1 -1
  79. package/dist/components/ui/SearchInput.d.ts.map +1 -1
  80. package/dist/components/ui/SearchInput.js.map +1 -1
  81. package/dist/components/ui/Skeleton.d.ts.map +1 -1
  82. package/dist/components/ui/Skeleton.js.map +1 -1
  83. package/dist/components/ui/Toast.d.ts.map +1 -1
  84. package/dist/components/ui/Toast.js.map +1 -1
  85. package/dist/components/ui/index.d.ts.map +1 -1
  86. package/dist/components/ui/index.js.map +1 -1
  87. package/dist/fields/ArrayField.d.ts.map +1 -1
  88. package/dist/fields/ArrayField.js +1 -1
  89. package/dist/fields/ArrayField.js.map +1 -1
  90. package/dist/fields/BlockBuilderField.d.ts.map +1 -1
  91. package/dist/fields/BlockBuilderField.js +7 -7
  92. package/dist/fields/BlockBuilderField.js.map +1 -1
  93. package/dist/fields/DateField.d.ts.map +1 -1
  94. package/dist/fields/DateField.js +1 -1
  95. package/dist/fields/DateField.js.map +1 -1
  96. package/dist/fields/FieldRenderer.d.ts.map +1 -1
  97. package/dist/fields/FieldRenderer.js.map +1 -1
  98. package/dist/fields/GroupField.d.ts.map +1 -1
  99. package/dist/fields/GroupField.js +1 -1
  100. package/dist/fields/GroupField.js.map +1 -1
  101. package/dist/fields/MediaField.d.ts.map +1 -1
  102. package/dist/fields/MediaField.js +1 -1
  103. package/dist/fields/MediaField.js.map +1 -1
  104. package/dist/fields/NavBuilderField.d.ts.map +1 -1
  105. package/dist/fields/NavBuilderField.js +2 -5
  106. package/dist/fields/NavBuilderField.js.map +1 -1
  107. package/dist/fields/NumberField.d.ts +1 -1
  108. package/dist/fields/NumberField.d.ts.map +1 -1
  109. package/dist/fields/NumberField.js +2 -2
  110. package/dist/fields/NumberField.js.map +1 -1
  111. package/dist/fields/RelationshipField.d.ts.map +1 -1
  112. package/dist/fields/RelationshipField.js +7 -3
  113. package/dist/fields/RelationshipField.js.map +1 -1
  114. package/dist/fields/RichTextField.d.ts +1 -1
  115. package/dist/fields/RichTextField.d.ts.map +1 -1
  116. package/dist/fields/RichTextField.js +2 -2
  117. package/dist/fields/RichTextField.js.map +1 -1
  118. package/dist/fields/SelectField.d.ts.map +1 -1
  119. package/dist/fields/SelectField.js +9 -7
  120. package/dist/fields/SelectField.js.map +1 -1
  121. package/dist/fields/SlugField.d.ts.map +1 -1
  122. package/dist/fields/SlugField.js +1 -1
  123. package/dist/fields/SlugField.js.map +1 -1
  124. package/dist/fields/TextField.d.ts +1 -1
  125. package/dist/fields/TextField.d.ts.map +1 -1
  126. package/dist/fields/TextField.js +2 -2
  127. package/dist/fields/TextField.js.map +1 -1
  128. package/dist/fields/ToggleField.d.ts.map +1 -1
  129. package/dist/fields/ToggleField.js +1 -1
  130. package/dist/fields/ToggleField.js.map +1 -1
  131. package/dist/fields/block-types.d.ts.map +1 -1
  132. package/dist/fields/block-types.js +28 -8
  133. package/dist/fields/block-types.js.map +1 -1
  134. package/dist/fields/index.d.ts.map +1 -1
  135. package/dist/fields/index.js.map +1 -1
  136. package/dist/hooks/useBuilderState.d.ts.map +1 -1
  137. package/dist/hooks/useBuilderState.js.map +1 -1
  138. package/dist/hooks/useContentLock.d.ts.map +1 -1
  139. package/dist/hooks/useContentLock.js.map +1 -1
  140. package/dist/hooks/useDebounce.js.map +1 -1
  141. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  142. package/dist/hooks/useKeyboardShortcuts.js.map +1 -1
  143. package/dist/index.d.ts +2 -2
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js.map +1 -1
  146. package/dist/layout/Header.d.ts.map +1 -1
  147. package/dist/layout/Header.js.map +1 -1
  148. package/dist/layout/Layout.d.ts.map +1 -1
  149. package/dist/layout/Layout.js.map +1 -1
  150. package/dist/layout/Sidebar.d.ts +1 -1
  151. package/dist/layout/Sidebar.d.ts.map +1 -1
  152. package/dist/layout/Sidebar.js +5 -8
  153. package/dist/layout/Sidebar.js.map +1 -1
  154. package/dist/lib/api.d.ts.map +1 -1
  155. package/dist/lib/api.js +33 -4
  156. package/dist/lib/api.js.map +1 -1
  157. package/dist/lib/search.d.ts.map +1 -1
  158. package/dist/lib/search.js +3 -5
  159. package/dist/lib/search.js.map +1 -1
  160. package/dist/lib/useApiData.d.ts.map +1 -1
  161. package/dist/lib/useApiData.js.map +1 -1
  162. package/dist/lib/utils.d.ts.map +1 -1
  163. package/dist/lib/utils.js.map +1 -1
  164. package/dist/router/index.d.ts.map +1 -1
  165. package/dist/router/index.js +1 -3
  166. package/dist/router/index.js.map +1 -1
  167. package/dist/views/CollectionList.d.ts.map +1 -1
  168. package/dist/views/CollectionList.js +56 -17
  169. package/dist/views/CollectionList.js.map +1 -1
  170. package/dist/views/Dashboard.d.ts.map +1 -1
  171. package/dist/views/Dashboard.js +26 -13
  172. package/dist/views/Dashboard.js.map +1 -1
  173. package/dist/views/DocumentEdit.d.ts +1 -1
  174. package/dist/views/DocumentEdit.d.ts.map +1 -1
  175. package/dist/views/DocumentEdit.js +33 -15
  176. package/dist/views/DocumentEdit.js.map +1 -1
  177. package/dist/views/ForgotPassword.d.ts.map +1 -1
  178. package/dist/views/ForgotPassword.js.map +1 -1
  179. package/dist/views/FormEditor.d.ts.map +1 -1
  180. package/dist/views/FormEditor.js +8 -2
  181. package/dist/views/FormEditor.js.map +1 -1
  182. package/dist/views/FormSubmissions.d.ts.map +1 -1
  183. package/dist/views/FormSubmissions.js +6 -6
  184. package/dist/views/FormSubmissions.js.map +1 -1
  185. package/dist/views/Forms.d.ts.map +1 -1
  186. package/dist/views/Forms.js.map +1 -1
  187. package/dist/views/Login.d.ts.map +1 -1
  188. package/dist/views/Login.js +5 -2
  189. package/dist/views/Login.js.map +1 -1
  190. package/dist/views/MediaBrowser.d.ts.map +1 -1
  191. package/dist/views/MediaBrowser.js +39 -19
  192. package/dist/views/MediaBrowser.js.map +1 -1
  193. package/dist/views/PageEditor.d.ts.map +1 -1
  194. package/dist/views/PageEditor.js.map +1 -1
  195. package/dist/views/Pages.d.ts.map +1 -1
  196. package/dist/views/Pages.js +20 -10
  197. package/dist/views/Pages.js.map +1 -1
  198. package/dist/views/PostEditor.d.ts.map +1 -1
  199. package/dist/views/PostEditor.js.map +1 -1
  200. package/dist/views/Posts.d.ts.map +1 -1
  201. package/dist/views/Posts.js +13 -7
  202. package/dist/views/Posts.js.map +1 -1
  203. package/dist/views/Redirects.d.ts.map +1 -1
  204. package/dist/views/Redirects.js +17 -5
  205. package/dist/views/Redirects.js.map +1 -1
  206. package/dist/views/ResetPassword.d.ts.map +1 -1
  207. package/dist/views/ResetPassword.js.map +1 -1
  208. package/dist/views/SEO.d.ts.map +1 -1
  209. package/dist/views/SEO.js +39 -16
  210. package/dist/views/SEO.js.map +1 -1
  211. package/dist/views/ScriptTagEditor.d.ts.map +1 -1
  212. package/dist/views/ScriptTagEditor.js +2 -1
  213. package/dist/views/ScriptTagEditor.js.map +1 -1
  214. package/dist/views/ScriptTags.d.ts.map +1 -1
  215. package/dist/views/ScriptTags.js.map +1 -1
  216. package/dist/views/Settings.d.ts.map +1 -1
  217. package/dist/views/Settings.js +38 -11
  218. package/dist/views/Settings.js.map +1 -1
  219. package/dist/views/SetupWizard.d.ts.map +1 -1
  220. package/dist/views/SetupWizard.js.map +1 -1
  221. package/dist/views/Users.d.ts.map +1 -1
  222. package/dist/views/Users.js +5 -3
  223. package/dist/views/Users.js.map +1 -1
  224. package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
  225. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  226. package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
  227. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  228. package/dist/views/page-builder/AIGenerateDialog.js +4 -1
  229. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  230. package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
  231. package/dist/views/page-builder/BlockEditor.js +94 -3
  232. package/dist/views/page-builder/BlockEditor.js.map +1 -1
  233. package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
  234. package/dist/views/page-builder/BlockPicker.js.map +1 -1
  235. package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
  236. package/dist/views/page-builder/BottomBar.js.map +1 -1
  237. package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
  238. package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
  239. package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
  240. package/dist/views/page-builder/ContextPanel.js +4 -1
  241. package/dist/views/page-builder/ContextPanel.js.map +1 -1
  242. package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
  243. package/dist/views/page-builder/DesignScore.js.map +1 -1
  244. package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
  245. package/dist/views/page-builder/NodeSettings.js +1 -1
  246. package/dist/views/page-builder/NodeSettings.js.map +1 -1
  247. package/dist/views/page-builder/PageBuilder.d.ts +1 -1
  248. package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
  249. package/dist/views/page-builder/PageBuilder.js +25 -3
  250. package/dist/views/page-builder/PageBuilder.js.map +1 -1
  251. package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
  252. package/dist/views/page-builder/PageSettings.js.map +1 -1
  253. package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
  254. package/dist/views/page-builder/PageTemplates.js.map +1 -1
  255. package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
  256. package/dist/views/page-builder/SEOPanel.js +1 -3
  257. package/dist/views/page-builder/SEOPanel.js.map +1 -1
  258. package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
  259. package/dist/views/page-builder/SavedSections.js +3 -7
  260. package/dist/views/page-builder/SavedSections.js.map +1 -1
  261. package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
  262. package/dist/views/page-builder/TemplatePicker.js.map +1 -1
  263. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
  264. package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
  265. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
  266. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
  267. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  268. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
  269. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
  270. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
  271. package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
  272. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
  273. package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
  274. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
  275. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
  276. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
  277. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
  278. package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
  279. package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
  280. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
  281. package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
  282. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
  283. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
  284. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
  285. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
  286. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
  287. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
  288. package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
  289. package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
  290. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
  291. package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
  292. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
  293. package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
  294. package/dist/views/page-builder/block-renderers/index.js.map +1 -1
  295. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
  296. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
  297. package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
  298. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
  299. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
  300. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
  301. package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
  302. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
  303. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
  304. package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
  305. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
  306. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
  307. package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
  308. package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
  309. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
  310. package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
  311. package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
  312. package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
  313. package/dist/views/page-builder/canvas/index.js.map +1 -1
  314. package/package.json +2 -2
  315. package/src/AdminRoot.tsx +302 -177
  316. package/src/__tests__/lib/search.test.ts +60 -69
  317. package/src/__tests__/lib/utils.test.ts +12 -12
  318. package/src/__tests__/router/match-route.test.ts +24 -26
  319. package/src/__tests__/router/strip-base.test.ts +15 -15
  320. package/src/components/Breadcrumbs.tsx +27 -24
  321. package/src/components/CommandPalette.tsx +115 -99
  322. package/src/components/ContentOverviewChart.tsx +19 -14
  323. package/src/components/ErrorBoundary.tsx +13 -13
  324. package/src/components/FocalPointPicker.tsx +31 -20
  325. package/src/components/FolderTree.tsx +172 -139
  326. package/src/components/LivePreview.tsx +68 -41
  327. package/src/components/LocaleProvider.tsx +26 -20
  328. package/src/components/LocaleSwitcher.tsx +9 -11
  329. package/src/components/MediaPickerModal.tsx +46 -45
  330. package/src/components/PresenceIndicator.tsx +30 -27
  331. package/src/components/SEOPanel.tsx +378 -228
  332. package/src/components/SEOPerformance.tsx +52 -30
  333. package/src/components/ThemeProvider.tsx +46 -46
  334. package/src/components/TipTapEditor.tsx +60 -64
  335. package/src/components/VersionHistory.tsx +63 -52
  336. package/src/components/ui/Avatar.tsx +8 -8
  337. package/src/components/ui/Badge.tsx +7 -5
  338. package/src/components/ui/Button.tsx +24 -13
  339. package/src/components/ui/CommandPalette.tsx +56 -42
  340. package/src/components/ui/ConfirmDialog.tsx +14 -14
  341. package/src/components/ui/DataTable.tsx +37 -39
  342. package/src/components/ui/EmptyState.tsx +9 -11
  343. package/src/components/ui/Modal.tsx +21 -15
  344. package/src/components/ui/Pagination.tsx +34 -19
  345. package/src/components/ui/SearchInput.tsx +17 -7
  346. package/src/components/ui/Skeleton.tsx +7 -7
  347. package/src/components/ui/Toast.tsx +29 -22
  348. package/src/components/ui/index.ts +24 -24
  349. package/src/fields/ArrayField.tsx +43 -25
  350. package/src/fields/BlockBuilderField.tsx +80 -99
  351. package/src/fields/DateField.tsx +20 -12
  352. package/src/fields/FieldRenderer.tsx +34 -34
  353. package/src/fields/GroupField.tsx +8 -10
  354. package/src/fields/MediaField.tsx +8 -10
  355. package/src/fields/NavBuilderField.tsx +24 -25
  356. package/src/fields/NumberField.tsx +21 -14
  357. package/src/fields/RelationshipField.tsx +105 -91
  358. package/src/fields/RichTextField.tsx +16 -12
  359. package/src/fields/SelectField.tsx +42 -34
  360. package/src/fields/SlugField.tsx +29 -17
  361. package/src/fields/TextField.tsx +24 -16
  362. package/src/fields/ToggleField.tsx +7 -9
  363. package/src/fields/block-types.ts +50 -24
  364. package/src/fields/index.ts +17 -17
  365. package/src/hooks/useBuilderState.ts +260 -221
  366. package/src/hooks/useContentLock.ts +23 -20
  367. package/src/hooks/useDebounce.ts +7 -7
  368. package/src/hooks/useKeyboardShortcuts.ts +16 -16
  369. package/src/index.ts +69 -58
  370. package/src/layout/Header.tsx +21 -20
  371. package/src/layout/Layout.tsx +22 -24
  372. package/src/layout/Sidebar.tsx +107 -72
  373. package/src/lib/api.ts +58 -30
  374. package/src/lib/search.ts +30 -34
  375. package/src/lib/useApiData.ts +65 -62
  376. package/src/lib/utils.ts +3 -3
  377. package/src/router/index.ts +33 -35
  378. package/src/styles/build-input.css +2 -2
  379. package/src/styles/tailwind.css +1 -1
  380. package/src/styles/theme.css +7 -1
  381. package/src/views/CollectionList.tsx +275 -121
  382. package/src/views/Dashboard.tsx +164 -117
  383. package/src/views/DocumentEdit.tsx +298 -253
  384. package/src/views/ForgotPassword.tsx +27 -23
  385. package/src/views/FormEditor.tsx +165 -99
  386. package/src/views/FormSubmissions.tsx +261 -117
  387. package/src/views/Forms.tsx +56 -26
  388. package/src/views/Login.tsx +107 -84
  389. package/src/views/MediaBrowser.tsx +717 -523
  390. package/src/views/PageEditor.tsx +44 -46
  391. package/src/views/Pages.tsx +312 -149
  392. package/src/views/PostEditor.tsx +57 -51
  393. package/src/views/Posts.tsx +206 -74
  394. package/src/views/Redirects.tsx +173 -117
  395. package/src/views/ResetPassword.tsx +43 -32
  396. package/src/views/SEO.tsx +589 -160
  397. package/src/views/ScriptTagEditor.tsx +69 -69
  398. package/src/views/ScriptTags.tsx +54 -42
  399. package/src/views/Settings.tsx +430 -220
  400. package/src/views/SetupWizard.tsx +69 -46
  401. package/src/views/Users.tsx +154 -120
  402. package/src/views/page-builder/AIBlockAssist.tsx +21 -25
  403. package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
  404. package/src/views/page-builder/BlockEditor.tsx +258 -81
  405. package/src/views/page-builder/BlockPicker.tsx +73 -88
  406. package/src/views/page-builder/BottomBar.tsx +15 -11
  407. package/src/views/page-builder/BuilderToolbar.tsx +32 -29
  408. package/src/views/page-builder/ContextPanel.tsx +57 -57
  409. package/src/views/page-builder/DesignScore.tsx +52 -59
  410. package/src/views/page-builder/NodeSettings.tsx +59 -59
  411. package/src/views/page-builder/PageBuilder.tsx +164 -146
  412. package/src/views/page-builder/PageSettings.tsx +16 -15
  413. package/src/views/page-builder/PageTemplates.tsx +23 -17
  414. package/src/views/page-builder/SEOPanel.tsx +90 -111
  415. package/src/views/page-builder/SavedSections.tsx +99 -105
  416. package/src/views/page-builder/TemplatePicker.tsx +44 -48
  417. package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
  418. package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
  419. package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
  420. package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
  421. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
  422. package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
  423. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
  424. package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
  425. package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
  426. package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
  427. package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
  428. package/src/views/page-builder/block-renderers/index.ts +17 -17
  429. package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
  430. package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
  431. package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
  432. package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
  433. package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
  434. package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
  435. package/src/views/page-builder/canvas/index.ts +2 -2
@@ -1,30 +1,30 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Button } from '../components/ui/Button.js';
3
+ import { Button } from '../components/ui/Button.js'
4
4
 
5
5
  export interface ArrayFieldProps {
6
- label: string;
7
- value?: any[];
8
- onChange: (value: any[]) => void;
9
- fields?: any[];
10
- helpText?: string;
6
+ label: string
7
+ value?: any[]
8
+ onChange: (value: any[]) => void
9
+ fields?: any[]
10
+ helpText?: string
11
11
  }
12
12
 
13
13
  export function ArrayField({ label, value = [], onChange, helpText }: ArrayFieldProps) {
14
14
  function addItem() {
15
- onChange([...value, { id: crypto.randomUUID(), data: {} }]);
15
+ onChange([...value, { id: crypto.randomUUID(), data: {} }])
16
16
  }
17
17
 
18
18
  function removeItem(index: number) {
19
- onChange(value.filter((_, i) => i !== index));
19
+ onChange(value.filter((_, i) => i !== index))
20
20
  }
21
21
 
22
22
  function moveItem(from: number, to: number) {
23
- if (to < 0 || to >= value.length) return;
24
- const next = [...value];
25
- const [moved] = next.splice(from, 1);
26
- next.splice(to, 0, moved);
27
- onChange(next);
23
+ if (to < 0 || to >= value.length) return
24
+ const next = [...value]
25
+ const [moved] = next.splice(from, 1)
26
+ next.splice(to, 0, moved)
27
+ onChange(next)
28
28
  }
29
29
 
30
30
  return (
@@ -45,7 +45,13 @@ export function ArrayField({ label, value = [], onChange, helpText }: ArrayField
45
45
  className="text-[var(--muted-foreground)] hover:text-[var(--foreground)] disabled:opacity-30"
46
46
  aria-label="Move up"
47
47
  >
48
- <svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
48
+ <svg
49
+ className="h-3 w-3"
50
+ fill="none"
51
+ viewBox="0 0 24 24"
52
+ stroke="currentColor"
53
+ strokeWidth={3}
54
+ >
49
55
  <path strokeLinecap="round" strokeLinejoin="round" d="M5 15l7-7 7 7" />
50
56
  </svg>
51
57
  </button>
@@ -56,15 +62,19 @@ export function ArrayField({ label, value = [], onChange, helpText }: ArrayField
56
62
  className="text-[var(--muted-foreground)] hover:text-[var(--foreground)] disabled:opacity-30"
57
63
  aria-label="Move down"
58
64
  >
59
- <svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
65
+ <svg
66
+ className="h-3 w-3"
67
+ fill="none"
68
+ viewBox="0 0 24 24"
69
+ stroke="currentColor"
70
+ strokeWidth={3}
71
+ >
60
72
  <path strokeLinecap="round" strokeLinejoin="round" d="M19 9l-7 7-7-7" />
61
73
  </svg>
62
74
  </button>
63
75
  </div>
64
76
 
65
- <div className="flex-1 text-sm text-[var(--muted-foreground)]">
66
- Item {index + 1}
67
- </div>
77
+ <div className="flex-1 text-sm text-[var(--muted-foreground)]">Item {index + 1}</div>
68
78
 
69
79
  <button
70
80
  type="button"
@@ -72,8 +82,18 @@ export function ArrayField({ label, value = [], onChange, helpText }: ArrayField
72
82
  className="rounded p-1 text-[var(--muted-foreground)] hover:bg-[var(--accent)] hover:text-[var(--destructive)]"
73
83
  aria-label="Remove item"
74
84
  >
75
- <svg className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
76
- <path strokeLinecap="round" strokeLinejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
85
+ <svg
86
+ className="h-4 w-4"
87
+ fill="none"
88
+ viewBox="0 0 24 24"
89
+ stroke="currentColor"
90
+ strokeWidth={2}
91
+ >
92
+ <path
93
+ strokeLinecap="round"
94
+ strokeLinejoin="round"
95
+ d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"
96
+ />
77
97
  </svg>
78
98
  </button>
79
99
  </div>
@@ -84,9 +104,7 @@ export function ArrayField({ label, value = [], onChange, helpText }: ArrayField
84
104
  Add Item
85
105
  </Button>
86
106
 
87
- {helpText && (
88
- <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>
89
- )}
107
+ {helpText && <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>}
90
108
  </div>
91
- );
109
+ )
92
110
  }
@@ -1,6 +1,6 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, useCallback, useMemo } from 'react';
3
+ import { useState, useCallback, useMemo } from 'react'
4
4
  import {
5
5
  DndContext,
6
6
  closestCenter,
@@ -9,15 +9,15 @@ import {
9
9
  useSensor,
10
10
  useSensors,
11
11
  type DragEndEvent,
12
- } from '@dnd-kit/core';
12
+ } from '@dnd-kit/core'
13
13
  import {
14
14
  SortableContext,
15
15
  sortableKeyboardCoordinates,
16
16
  verticalListSortingStrategy,
17
17
  useSortable,
18
18
  arrayMove,
19
- } from '@dnd-kit/sortable';
20
- import { CSS } from '@dnd-kit/utilities';
19
+ } from '@dnd-kit/sortable'
20
+ import { CSS } from '@dnd-kit/utilities'
21
21
  import {
22
22
  Plus,
23
23
  GripVertical,
@@ -31,8 +31,8 @@ import {
31
31
  Quote,
32
32
  Play,
33
33
  X,
34
- } from 'lucide-react';
35
- import { PRESET_BLOCKS, type BlockTypeDefinition } from './block-types.js';
34
+ } from 'lucide-react'
35
+ import { PRESET_BLOCKS, type BlockTypeDefinition } from './block-types.js'
36
36
 
37
37
  const BLOCK_ICONS: Record<string, React.ComponentType<{ className?: string }>> = {
38
38
  layout: Layout,
@@ -41,26 +41,26 @@ const BLOCK_ICONS: Record<string, React.ComponentType<{ className?: string }>> =
41
41
  image: Image,
42
42
  quote: Quote,
43
43
  play: Play,
44
- };
44
+ }
45
45
 
46
46
  interface BlockValue {
47
- id: string;
48
- type: string;
49
- data: Record<string, unknown>;
47
+ id: string
48
+ type: string
49
+ data: Record<string, unknown>
50
50
  }
51
51
 
52
52
  export interface BlockBuilderFieldProps {
53
- label?: string;
54
- value?: BlockValue[];
55
- onChange?: (value: BlockValue[]) => void;
56
- blocks?: BlockTypeDefinition[];
57
- helpText?: string;
53
+ label?: string
54
+ value?: BlockValue[]
55
+ onChange?: (value: BlockValue[]) => void
56
+ blocks?: BlockTypeDefinition[]
57
+ helpText?: string
58
58
  }
59
59
 
60
60
  interface BlockFieldProps {
61
- field: BlockTypeDefinition['fields'][number];
62
- value: unknown;
63
- onChange: (value: unknown) => void;
61
+ field: BlockTypeDefinition['fields'][number]
62
+ value: unknown
63
+ onChange: (value: unknown) => void
64
64
  }
65
65
 
66
66
  function BlockField({ field, value, onChange }: BlockFieldProps) {
@@ -84,7 +84,7 @@ function BlockField({ field, value, onChange }: BlockFieldProps) {
84
84
  ))}
85
85
  </select>
86
86
  </div>
87
- );
87
+ )
88
88
  }
89
89
 
90
90
  if (field.type === 'richText') {
@@ -101,7 +101,7 @@ function BlockField({ field, value, onChange }: BlockFieldProps) {
101
101
  className="w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none transition-colors focus:ring-2 focus:ring-[var(--ring)]"
102
102
  />
103
103
  </div>
104
- );
104
+ )
105
105
  }
106
106
 
107
107
  if (field.type === 'media') {
@@ -120,7 +120,7 @@ function BlockField({ field, value, onChange }: BlockFieldProps) {
120
120
  </span>
121
121
  </div>
122
122
  </div>
123
- );
123
+ )
124
124
  }
125
125
 
126
126
  return (
@@ -137,16 +137,16 @@ function BlockField({ field, value, onChange }: BlockFieldProps) {
137
137
  className="w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm outline-none transition-colors focus:ring-2 focus:ring-[var(--ring)]"
138
138
  />
139
139
  </div>
140
- );
140
+ )
141
141
  }
142
142
 
143
143
  interface SortableBlockProps {
144
- block: BlockValue;
145
- blockDef: BlockTypeDefinition | undefined;
146
- expanded: boolean;
147
- onToggle: () => void;
148
- onRemove: () => void;
149
- onFieldChange: (fieldName: string, fieldValue: unknown) => void;
144
+ block: BlockValue
145
+ blockDef: BlockTypeDefinition | undefined
146
+ expanded: boolean
147
+ onToggle: () => void
148
+ onRemove: () => void
149
+ onFieldChange: (fieldName: string, fieldValue: unknown) => void
150
150
  }
151
151
 
152
152
  function SortableBlock({
@@ -157,23 +157,18 @@ function SortableBlock({
157
157
  onRemove,
158
158
  onFieldChange,
159
159
  }: SortableBlockProps) {
160
- const {
161
- attributes,
162
- listeners,
163
- setNodeRef,
164
- transform,
165
- transition,
166
- isDragging,
167
- } = useSortable({ id: block.id });
160
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
161
+ id: block.id,
162
+ })
168
163
 
169
164
  const style: React.CSSProperties = {
170
165
  transform: CSS.Transform.toString(transform),
171
166
  transition,
172
167
  opacity: isDragging ? 0.5 : 1,
173
168
  zIndex: isDragging ? 10 : undefined,
174
- };
169
+ }
175
170
 
176
- const IconComponent = blockDef ? BLOCK_ICONS[blockDef.icon] : undefined;
171
+ const IconComponent = blockDef ? BLOCK_ICONS[blockDef.icon] : undefined
177
172
 
178
173
  return (
179
174
  <div
@@ -191,9 +186,7 @@ function SortableBlock({
191
186
  <GripVertical className="h-4 w-4" />
192
187
  </button>
193
188
 
194
- {IconComponent && (
195
- <IconComponent className="h-4 w-4 text-[var(--muted-foreground)]" />
196
- )}
189
+ {IconComponent && <IconComponent className="h-4 w-4 text-[var(--muted-foreground)]" />}
197
190
 
198
191
  <button
199
192
  type="button"
@@ -237,7 +230,7 @@ function SortableBlock({
237
230
  </div>
238
231
  )}
239
232
  </div>
240
- );
233
+ )
241
234
  }
242
235
 
243
236
  export function BlockBuilderField({
@@ -247,99 +240,91 @@ export function BlockBuilderField({
247
240
  blocks: customBlocks,
248
241
  helpText,
249
242
  }: BlockBuilderFieldProps) {
250
- const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set());
251
- const [pickerOpen, setPickerOpen] = useState(false);
243
+ const [expandedIds, setExpandedIds] = useState<Set<string>>(new Set())
244
+ const [pickerOpen, setPickerOpen] = useState(false)
252
245
 
253
246
  const allBlockTypes = useMemo(() => {
254
- if (!customBlocks?.length) return PRESET_BLOCKS;
255
- const customTypes = new Set(customBlocks.map((b) => b.type));
256
- const filtered = PRESET_BLOCKS.filter((b) => !customTypes.has(b.type));
257
- return [...filtered, ...customBlocks];
258
- }, [customBlocks]);
247
+ if (!customBlocks?.length) return PRESET_BLOCKS
248
+ const customTypes = new Set(customBlocks.map((b) => b.type))
249
+ const filtered = PRESET_BLOCKS.filter((b) => !customTypes.has(b.type))
250
+ return [...filtered, ...customBlocks]
251
+ }, [customBlocks])
259
252
 
260
253
  const blockDefMap = useMemo(() => {
261
- const map = new Map<string, BlockTypeDefinition>();
254
+ const map = new Map<string, BlockTypeDefinition>()
262
255
  for (const def of allBlockTypes) {
263
- map.set(def.type, def);
256
+ map.set(def.type, def)
264
257
  }
265
- return map;
266
- }, [allBlockTypes]);
258
+ return map
259
+ }, [allBlockTypes])
267
260
 
268
261
  const sensors = useSensors(
269
262
  useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
270
263
  useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),
271
- );
264
+ )
272
265
 
273
266
  const handleDragEnd = useCallback(
274
267
  (event: DragEndEvent) => {
275
- const { active, over } = event;
276
- if (!over || active.id === over.id) return;
268
+ const { active, over } = event
269
+ if (!over || active.id === over.id) return
277
270
 
278
- const oldIndex = value.findIndex((b) => b.id === active.id);
279
- const newIndex = value.findIndex((b) => b.id === over.id);
280
- if (oldIndex === -1 || newIndex === -1) return;
271
+ const oldIndex = value.findIndex((b) => b.id === active.id)
272
+ const newIndex = value.findIndex((b) => b.id === over.id)
273
+ if (oldIndex === -1 || newIndex === -1) return
281
274
 
282
- onChange?.(arrayMove(value, oldIndex, newIndex));
275
+ onChange?.(arrayMove(value, oldIndex, newIndex))
283
276
  },
284
277
  [value, onChange],
285
- );
278
+ )
286
279
 
287
280
  function addBlock(type: string) {
288
281
  const newBlock: BlockValue = {
289
282
  id: crypto.randomUUID(),
290
283
  type,
291
284
  data: {},
292
- };
293
- const newId = newBlock.id;
294
- onChange?.([...value, newBlock]);
295
- setExpandedIds((prev) => new Set(prev).add(newId));
296
- setPickerOpen(false);
285
+ }
286
+ const newId = newBlock.id
287
+ onChange?.([...value, newBlock])
288
+ setExpandedIds((prev) => new Set(prev).add(newId))
289
+ setPickerOpen(false)
297
290
  }
298
291
 
299
292
  function removeBlock(id: string) {
300
- onChange?.(value.filter((b) => b.id !== id));
293
+ onChange?.(value.filter((b) => b.id !== id))
301
294
  setExpandedIds((prev) => {
302
- const next = new Set(prev);
303
- next.delete(id);
304
- return next;
305
- });
295
+ const next = new Set(prev)
296
+ next.delete(id)
297
+ return next
298
+ })
306
299
  }
307
300
 
308
301
  function toggleExpand(id: string) {
309
302
  setExpandedIds((prev) => {
310
- const next = new Set(prev);
303
+ const next = new Set(prev)
311
304
  if (next.has(id)) {
312
- next.delete(id);
305
+ next.delete(id)
313
306
  } else {
314
- next.add(id);
307
+ next.add(id)
315
308
  }
316
- return next;
317
- });
309
+ return next
310
+ })
318
311
  }
319
312
 
320
313
  function updateBlockField(blockId: string, fieldName: string, fieldValue: unknown) {
321
314
  onChange?.(
322
315
  value.map((b) =>
323
- b.id === blockId
324
- ? { ...b, data: { ...b.data, [fieldName]: fieldValue } }
325
- : b,
316
+ b.id === blockId ? { ...b, data: { ...b.data, [fieldName]: fieldValue } } : b,
326
317
  ),
327
- );
318
+ )
328
319
  }
329
320
 
330
- const blockIds = value.map((b) => b.id);
321
+ const blockIds = value.map((b) => b.id)
331
322
 
332
323
  return (
333
324
  <div>
334
- {label && (
335
- <label className="mb-2 block text-sm font-medium">{label}</label>
336
- )}
325
+ {label && <label className="mb-2 block text-sm font-medium">{label}</label>}
337
326
 
338
- <DndContext
339
- sensors={sensors}
340
- collisionDetection={closestCenter}
341
- onDragEnd={handleDragEnd}
342
- >
327
+ <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
343
328
  <SortableContext items={blockIds} strategy={verticalListSortingStrategy}>
344
329
  <div className="space-y-2">
345
330
  {value.map((block) => (
@@ -350,9 +335,7 @@ export function BlockBuilderField({
350
335
  expanded={expandedIds.has(block.id)}
351
336
  onToggle={() => toggleExpand(block.id)}
352
337
  onRemove={() => removeBlock(block.id)}
353
- onFieldChange={(name, val) =>
354
- updateBlockField(block.id, name, val)
355
- }
338
+ onFieldChange={(name, val) => updateBlockField(block.id, name, val)}
356
339
  />
357
340
  ))}
358
341
  </div>
@@ -392,7 +375,7 @@ export function BlockBuilderField({
392
375
  </div>
393
376
  <div className="grid grid-cols-2 gap-3 p-5 sm:grid-cols-3">
394
377
  {allBlockTypes.map((bt) => {
395
- const Icon = BLOCK_ICONS[bt.icon];
378
+ const Icon = BLOCK_ICONS[bt.icon]
396
379
  return (
397
380
  <button
398
381
  key={bt.type}
@@ -406,16 +389,14 @@ export function BlockBuilderField({
406
389
  {bt.description}
407
390
  </span>
408
391
  </button>
409
- );
392
+ )
410
393
  })}
411
394
  </div>
412
395
  </div>
413
396
  </div>
414
397
  )}
415
398
 
416
- {helpText && (
417
- <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>
418
- )}
399
+ {helpText && <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>}
419
400
  </div>
420
- );
401
+ )
421
402
  }
@@ -1,11 +1,11 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  export interface DateFieldProps {
4
- label: string;
5
- value?: string;
6
- onChange: (value: string) => void;
7
- required?: boolean;
8
- helpText?: string;
4
+ label: string
5
+ value?: string
6
+ onChange: (value: string) => void
7
+ required?: boolean
8
+ helpText?: string
9
9
  }
10
10
 
11
11
  export function DateField({ label, value = '', onChange, required, helpText }: DateFieldProps) {
@@ -28,14 +28,22 @@ export function DateField({ label, value = '', onChange, required, helpText }: D
28
28
  className="absolute right-2 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)]"
29
29
  aria-label="Open calendar"
30
30
  >
31
- <svg className="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
32
- <path strokeLinecap="round" strokeLinejoin="round" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
31
+ <svg
32
+ className="h-4 w-4"
33
+ fill="none"
34
+ viewBox="0 0 24 24"
35
+ stroke="currentColor"
36
+ strokeWidth={2}
37
+ >
38
+ <path
39
+ strokeLinecap="round"
40
+ strokeLinejoin="round"
41
+ d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
42
+ />
33
43
  </svg>
34
44
  </button>
35
45
  </div>
36
- {helpText && (
37
- <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>
38
- )}
46
+ {helpText && <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>}
39
47
  </div>
40
- );
48
+ )
41
49
  }
@@ -1,39 +1,39 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { TextField } from './TextField.js';
4
- import { RichTextField } from './RichTextField.js';
5
- import { SlugField } from './SlugField.js';
6
- import { SelectField } from './SelectField.js';
7
- import { MediaField } from './MediaField.js';
8
- import { RelationshipField } from './RelationshipField.js';
9
- import { DateField } from './DateField.js';
10
- import { ToggleField } from './ToggleField.js';
11
- import { ArrayField } from './ArrayField.js';
12
- import { BlockBuilderField } from './BlockBuilderField.js';
13
- import { GroupField } from './GroupField.js';
14
- import { NavBuilderField } from './NavBuilderField.js';
15
- import { NumberField } from './NumberField.js';
3
+ import { TextField } from './TextField.js'
4
+ import { RichTextField } from './RichTextField.js'
5
+ import { SlugField } from './SlugField.js'
6
+ import { SelectField } from './SelectField.js'
7
+ import { MediaField } from './MediaField.js'
8
+ import { RelationshipField } from './RelationshipField.js'
9
+ import { DateField } from './DateField.js'
10
+ import { ToggleField } from './ToggleField.js'
11
+ import { ArrayField } from './ArrayField.js'
12
+ import { BlockBuilderField } from './BlockBuilderField.js'
13
+ import { GroupField } from './GroupField.js'
14
+ import { NavBuilderField } from './NavBuilderField.js'
15
+ import { NumberField } from './NumberField.js'
16
16
 
17
17
  export interface FieldDefinition {
18
- name: string;
19
- type: string;
20
- label: string;
21
- required?: boolean;
22
- maxLength?: number;
23
- helpText?: string;
24
- options?: string[];
25
- min?: number;
26
- max?: number;
27
- from?: string;
28
- multi?: boolean;
29
- fields?: FieldDefinition[];
30
- blocks?: any[];
18
+ name: string
19
+ type: string
20
+ label: string
21
+ required?: boolean
22
+ maxLength?: number
23
+ helpText?: string
24
+ options?: string[]
25
+ min?: number
26
+ max?: number
27
+ from?: string
28
+ multi?: boolean
29
+ fields?: FieldDefinition[]
30
+ blocks?: any[]
31
31
  }
32
32
 
33
33
  export interface FieldRendererProps {
34
- field: FieldDefinition;
35
- value: any;
36
- onChange: (value: any) => void;
34
+ field: FieldDefinition
35
+ value: any
36
+ onChange: (value: any) => void
37
37
  }
38
38
 
39
39
  const FIELD_MAP: Record<string, React.ComponentType<any>> = {
@@ -50,17 +50,17 @@ const FIELD_MAP: Record<string, React.ComponentType<any>> = {
50
50
  group: GroupField,
51
51
  nav: NavBuilderField,
52
52
  number: NumberField,
53
- };
53
+ }
54
54
 
55
55
  export function FieldRenderer({ field, value, onChange }: FieldRendererProps) {
56
- const Component = FIELD_MAP[field.type];
56
+ const Component = FIELD_MAP[field.type]
57
57
 
58
58
  if (!Component) {
59
59
  return (
60
60
  <div className="rounded-md border border-[var(--destructive)] bg-red-50 p-3 text-sm text-[var(--destructive)]">
61
61
  Unknown field type: <code>{field.type}</code>
62
62
  </div>
63
- );
63
+ )
64
64
  }
65
65
 
66
66
  return (
@@ -80,5 +80,5 @@ export function FieldRenderer({ field, value, onChange }: FieldRendererProps) {
80
80
  blocks={field.blocks}
81
81
  name={field.name}
82
82
  />
83
- );
83
+ )
84
84
  }
@@ -1,15 +1,15 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, type ReactNode } from 'react';
3
+ import { useState, type ReactNode } from 'react'
4
4
 
5
5
  export interface GroupFieldProps {
6
- label: string;
7
- children?: ReactNode;
8
- defaultOpen?: boolean;
6
+ label: string
7
+ children?: ReactNode
8
+ defaultOpen?: boolean
9
9
  }
10
10
 
11
11
  export function GroupField({ label, children, defaultOpen = true }: GroupFieldProps) {
12
- const [open, setOpen] = useState(defaultOpen);
12
+ const [open, setOpen] = useState(defaultOpen)
13
13
 
14
14
  return (
15
15
  <div className="rounded-md border border-[var(--border)]">
@@ -31,11 +31,9 @@ export function GroupField({ label, children, defaultOpen = true }: GroupFieldPr
31
31
  </button>
32
32
  {open && (
33
33
  <div className="border-t border-[var(--border)] p-4">
34
- {children ?? (
35
- <p className="text-sm text-[var(--muted-foreground)]">Group fields area</p>
36
- )}
34
+ {children ?? <p className="text-sm text-[var(--muted-foreground)]">Group fields area</p>}
37
35
  </div>
38
36
  )}
39
37
  </div>
40
- );
38
+ )
41
39
  }
@@ -1,11 +1,11 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  export interface MediaFieldProps {
4
- label: string;
5
- value?: { id: string; filename: string; url: string } | null;
6
- onChange: (value: any) => void;
7
- required?: boolean;
8
- helpText?: string;
4
+ label: string
5
+ value?: { id: string; filename: string; url: string } | null
6
+ onChange: (value: any) => void
7
+ required?: boolean
8
+ helpText?: string
9
9
  }
10
10
 
11
11
  export function MediaField({ label, value, onChange, required, helpText }: MediaFieldProps) {
@@ -40,9 +40,7 @@ export function MediaField({ label, value, onChange, required, helpText }: Media
40
40
  </button>
41
41
  )}
42
42
 
43
- {helpText && (
44
- <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>
45
- )}
43
+ {helpText && <p className="mt-1 text-xs text-[var(--muted-foreground)]">{helpText}</p>}
46
44
  </div>
47
- );
45
+ )
48
46
  }