@actuate-media/cms-admin 0.8.0 → 0.8.2

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 (433) 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/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.js.map +1 -1
  155. package/dist/lib/search.d.ts.map +1 -1
  156. package/dist/lib/search.js +3 -5
  157. package/dist/lib/search.js.map +1 -1
  158. package/dist/lib/useApiData.d.ts.map +1 -1
  159. package/dist/lib/useApiData.js.map +1 -1
  160. package/dist/lib/utils.d.ts.map +1 -1
  161. package/dist/lib/utils.js.map +1 -1
  162. package/dist/router/index.d.ts.map +1 -1
  163. package/dist/router/index.js +1 -3
  164. package/dist/router/index.js.map +1 -1
  165. package/dist/views/CollectionList.d.ts.map +1 -1
  166. package/dist/views/CollectionList.js +56 -17
  167. package/dist/views/CollectionList.js.map +1 -1
  168. package/dist/views/Dashboard.d.ts.map +1 -1
  169. package/dist/views/Dashboard.js +26 -13
  170. package/dist/views/Dashboard.js.map +1 -1
  171. package/dist/views/DocumentEdit.d.ts +1 -1
  172. package/dist/views/DocumentEdit.d.ts.map +1 -1
  173. package/dist/views/DocumentEdit.js +33 -15
  174. package/dist/views/DocumentEdit.js.map +1 -1
  175. package/dist/views/ForgotPassword.d.ts.map +1 -1
  176. package/dist/views/ForgotPassword.js.map +1 -1
  177. package/dist/views/FormEditor.d.ts.map +1 -1
  178. package/dist/views/FormEditor.js +8 -2
  179. package/dist/views/FormEditor.js.map +1 -1
  180. package/dist/views/FormSubmissions.d.ts.map +1 -1
  181. package/dist/views/FormSubmissions.js +6 -6
  182. package/dist/views/FormSubmissions.js.map +1 -1
  183. package/dist/views/Forms.d.ts.map +1 -1
  184. package/dist/views/Forms.js.map +1 -1
  185. package/dist/views/Login.d.ts.map +1 -1
  186. package/dist/views/Login.js +5 -2
  187. package/dist/views/Login.js.map +1 -1
  188. package/dist/views/MediaBrowser.d.ts.map +1 -1
  189. package/dist/views/MediaBrowser.js +39 -19
  190. package/dist/views/MediaBrowser.js.map +1 -1
  191. package/dist/views/PageEditor.d.ts.map +1 -1
  192. package/dist/views/PageEditor.js.map +1 -1
  193. package/dist/views/Pages.d.ts.map +1 -1
  194. package/dist/views/Pages.js +20 -10
  195. package/dist/views/Pages.js.map +1 -1
  196. package/dist/views/PostEditor.d.ts.map +1 -1
  197. package/dist/views/PostEditor.js.map +1 -1
  198. package/dist/views/Posts.d.ts.map +1 -1
  199. package/dist/views/Posts.js +13 -7
  200. package/dist/views/Posts.js.map +1 -1
  201. package/dist/views/Redirects.d.ts.map +1 -1
  202. package/dist/views/Redirects.js +17 -5
  203. package/dist/views/Redirects.js.map +1 -1
  204. package/dist/views/ResetPassword.d.ts.map +1 -1
  205. package/dist/views/ResetPassword.js.map +1 -1
  206. package/dist/views/SEO.d.ts.map +1 -1
  207. package/dist/views/SEO.js +40 -17
  208. package/dist/views/SEO.js.map +1 -1
  209. package/dist/views/ScriptTagEditor.d.ts.map +1 -1
  210. package/dist/views/ScriptTagEditor.js +2 -1
  211. package/dist/views/ScriptTagEditor.js.map +1 -1
  212. package/dist/views/ScriptTags.d.ts.map +1 -1
  213. package/dist/views/ScriptTags.js.map +1 -1
  214. package/dist/views/Settings.d.ts.map +1 -1
  215. package/dist/views/Settings.js +38 -11
  216. package/dist/views/Settings.js.map +1 -1
  217. package/dist/views/SetupWizard.d.ts.map +1 -1
  218. package/dist/views/SetupWizard.js.map +1 -1
  219. package/dist/views/Users.d.ts.map +1 -1
  220. package/dist/views/Users.js +5 -3
  221. package/dist/views/Users.js.map +1 -1
  222. package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
  223. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  224. package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
  225. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  226. package/dist/views/page-builder/AIGenerateDialog.js +4 -1
  227. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  228. package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
  229. package/dist/views/page-builder/BlockEditor.js +1 -1
  230. package/dist/views/page-builder/BlockEditor.js.map +1 -1
  231. package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
  232. package/dist/views/page-builder/BlockPicker.js.map +1 -1
  233. package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
  234. package/dist/views/page-builder/BottomBar.js.map +1 -1
  235. package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
  236. package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
  237. package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
  238. package/dist/views/page-builder/ContextPanel.js +4 -1
  239. package/dist/views/page-builder/ContextPanel.js.map +1 -1
  240. package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
  241. package/dist/views/page-builder/DesignScore.js.map +1 -1
  242. package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
  243. package/dist/views/page-builder/NodeSettings.js +1 -1
  244. package/dist/views/page-builder/NodeSettings.js.map +1 -1
  245. package/dist/views/page-builder/PageBuilder.d.ts +1 -1
  246. package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
  247. package/dist/views/page-builder/PageBuilder.js +4 -2
  248. package/dist/views/page-builder/PageBuilder.js.map +1 -1
  249. package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
  250. package/dist/views/page-builder/PageSettings.js.map +1 -1
  251. package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
  252. package/dist/views/page-builder/PageTemplates.js.map +1 -1
  253. package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
  254. package/dist/views/page-builder/SEOPanel.js +1 -3
  255. package/dist/views/page-builder/SEOPanel.js.map +1 -1
  256. package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
  257. package/dist/views/page-builder/SavedSections.js +3 -7
  258. package/dist/views/page-builder/SavedSections.js.map +1 -1
  259. package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
  260. package/dist/views/page-builder/TemplatePicker.js.map +1 -1
  261. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
  262. package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
  263. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
  264. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
  265. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  266. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
  267. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
  268. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
  269. package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
  270. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
  271. package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
  272. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
  273. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
  274. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
  275. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
  276. package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
  277. package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
  278. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
  279. package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
  280. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
  281. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
  282. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
  283. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
  284. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
  285. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
  286. package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
  287. package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
  288. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
  289. package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
  290. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
  291. package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
  292. package/dist/views/page-builder/block-renderers/index.js.map +1 -1
  293. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
  294. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
  295. package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
  296. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
  297. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
  298. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
  299. package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
  300. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
  301. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
  302. package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
  303. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
  304. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
  305. package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
  306. package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
  307. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
  308. package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
  309. package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
  310. package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
  311. package/dist/views/page-builder/canvas/index.js.map +1 -1
  312. package/package.json +2 -2
  313. package/src/AdminRoot.tsx +263 -191
  314. package/src/__tests__/lib/search.test.ts +60 -69
  315. package/src/__tests__/lib/utils.test.ts +12 -12
  316. package/src/__tests__/router/match-route.test.ts +24 -26
  317. package/src/__tests__/router/strip-base.test.ts +15 -15
  318. package/src/components/Breadcrumbs.tsx +27 -24
  319. package/src/components/CommandPalette.tsx +115 -99
  320. package/src/components/ContentOverviewChart.tsx +19 -14
  321. package/src/components/ErrorBoundary.tsx +13 -13
  322. package/src/components/FocalPointPicker.tsx +31 -20
  323. package/src/components/FolderTree.tsx +172 -139
  324. package/src/components/LivePreview.tsx +68 -41
  325. package/src/components/LocaleProvider.tsx +26 -20
  326. package/src/components/LocaleSwitcher.tsx +9 -11
  327. package/src/components/MediaPickerModal.tsx +46 -45
  328. package/src/components/PresenceIndicator.tsx +30 -27
  329. package/src/components/SEOPanel.tsx +378 -228
  330. package/src/components/SEOPerformance.tsx +52 -30
  331. package/src/components/ThemeProvider.tsx +46 -46
  332. package/src/components/TipTapEditor.tsx +60 -64
  333. package/src/components/VersionHistory.tsx +63 -52
  334. package/src/components/ui/Avatar.tsx +8 -8
  335. package/src/components/ui/Badge.tsx +7 -5
  336. package/src/components/ui/Button.tsx +24 -13
  337. package/src/components/ui/CommandPalette.tsx +56 -42
  338. package/src/components/ui/ConfirmDialog.tsx +14 -14
  339. package/src/components/ui/DataTable.tsx +37 -39
  340. package/src/components/ui/EmptyState.tsx +9 -11
  341. package/src/components/ui/Modal.tsx +21 -15
  342. package/src/components/ui/Pagination.tsx +34 -19
  343. package/src/components/ui/SearchInput.tsx +17 -7
  344. package/src/components/ui/Skeleton.tsx +7 -7
  345. package/src/components/ui/Toast.tsx +29 -22
  346. package/src/components/ui/index.ts +24 -24
  347. package/src/fields/ArrayField.tsx +43 -25
  348. package/src/fields/BlockBuilderField.tsx +80 -99
  349. package/src/fields/DateField.tsx +20 -12
  350. package/src/fields/FieldRenderer.tsx +34 -34
  351. package/src/fields/GroupField.tsx +8 -10
  352. package/src/fields/MediaField.tsx +8 -10
  353. package/src/fields/NavBuilderField.tsx +24 -25
  354. package/src/fields/NumberField.tsx +21 -14
  355. package/src/fields/RelationshipField.tsx +105 -91
  356. package/src/fields/RichTextField.tsx +16 -12
  357. package/src/fields/SelectField.tsx +42 -34
  358. package/src/fields/SlugField.tsx +29 -17
  359. package/src/fields/TextField.tsx +24 -16
  360. package/src/fields/ToggleField.tsx +7 -9
  361. package/src/fields/block-types.ts +50 -24
  362. package/src/fields/index.ts +17 -17
  363. package/src/hooks/useBuilderState.ts +260 -221
  364. package/src/hooks/useContentLock.ts +23 -20
  365. package/src/hooks/useDebounce.ts +7 -7
  366. package/src/hooks/useKeyboardShortcuts.ts +16 -16
  367. package/src/index.ts +69 -58
  368. package/src/layout/Header.tsx +21 -20
  369. package/src/layout/Layout.tsx +22 -24
  370. package/src/layout/Sidebar.tsx +107 -72
  371. package/src/lib/api.ts +34 -34
  372. package/src/lib/search.ts +30 -34
  373. package/src/lib/useApiData.ts +65 -62
  374. package/src/lib/utils.ts +3 -3
  375. package/src/router/index.ts +33 -35
  376. package/src/styles/build-input.css +2 -2
  377. package/src/styles/tailwind.css +1 -1
  378. package/src/styles/theme.css +26 -2
  379. package/src/views/CollectionList.tsx +275 -121
  380. package/src/views/Dashboard.tsx +164 -117
  381. package/src/views/DocumentEdit.tsx +298 -253
  382. package/src/views/ForgotPassword.tsx +27 -23
  383. package/src/views/FormEditor.tsx +165 -99
  384. package/src/views/FormSubmissions.tsx +261 -117
  385. package/src/views/Forms.tsx +56 -26
  386. package/src/views/Login.tsx +107 -84
  387. package/src/views/MediaBrowser.tsx +717 -523
  388. package/src/views/PageEditor.tsx +44 -46
  389. package/src/views/Pages.tsx +312 -149
  390. package/src/views/PostEditor.tsx +57 -51
  391. package/src/views/Posts.tsx +206 -74
  392. package/src/views/Redirects.tsx +173 -117
  393. package/src/views/ResetPassword.tsx +43 -32
  394. package/src/views/SEO.tsx +607 -160
  395. package/src/views/ScriptTagEditor.tsx +69 -69
  396. package/src/views/ScriptTags.tsx +54 -42
  397. package/src/views/Settings.tsx +430 -220
  398. package/src/views/SetupWizard.tsx +69 -46
  399. package/src/views/Users.tsx +154 -120
  400. package/src/views/page-builder/AIBlockAssist.tsx +21 -25
  401. package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
  402. package/src/views/page-builder/BlockEditor.tsx +94 -96
  403. package/src/views/page-builder/BlockPicker.tsx +73 -88
  404. package/src/views/page-builder/BottomBar.tsx +15 -11
  405. package/src/views/page-builder/BuilderToolbar.tsx +32 -29
  406. package/src/views/page-builder/ContextPanel.tsx +57 -57
  407. package/src/views/page-builder/DesignScore.tsx +52 -59
  408. package/src/views/page-builder/NodeSettings.tsx +59 -59
  409. package/src/views/page-builder/PageBuilder.tsx +156 -155
  410. package/src/views/page-builder/PageSettings.tsx +16 -15
  411. package/src/views/page-builder/PageTemplates.tsx +23 -17
  412. package/src/views/page-builder/SEOPanel.tsx +90 -111
  413. package/src/views/page-builder/SavedSections.tsx +99 -105
  414. package/src/views/page-builder/TemplatePicker.tsx +44 -48
  415. package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
  416. package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
  417. package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
  418. package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
  419. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
  420. package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
  421. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
  422. package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
  423. package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
  424. package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
  425. package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
  426. package/src/views/page-builder/block-renderers/index.ts +17 -17
  427. package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
  428. package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
  429. package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
  430. package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
  431. package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
  432. package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
  433. package/src/views/page-builder/canvas/index.ts +2 -2
@@ -1,29 +1,29 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Code, Globe, Terminal } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { Code, Globe, Terminal } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  export function CodePreview({ data, variant = 'embed' }: BlockPreviewProps) {
7
- const content = (data.content as string) || '';
8
- const language = (data.language as string) || '';
9
- const sandboxed = data.sandboxed as boolean | undefined;
7
+ const content = (data.content as string) || ''
8
+ const language = (data.language as string) || ''
9
+ const sandboxed = data.sandboxed as boolean | undefined
10
10
 
11
- const truncated = content.length > 200 ? content.slice(0, 200) + '…' : content;
11
+ const truncated = content.length > 200 ? content.slice(0, 200) + '…' : content
12
12
 
13
13
  const icon =
14
- variant === 'html'
15
- ? <Globe size={14} className="text-muted-foreground" />
16
- : variant === 'script'
17
- ? <Terminal size={14} className="text-muted-foreground" />
18
- : <Code size={14} className="text-muted-foreground" />;
14
+ variant === 'html' ? (
15
+ <Globe size={14} className="text-muted-foreground" />
16
+ ) : variant === 'script' ? (
17
+ <Terminal size={14} className="text-muted-foreground" />
18
+ ) : (
19
+ <Code size={14} className="text-muted-foreground" />
20
+ )
19
21
 
20
22
  return (
21
23
  <div className="overflow-hidden rounded-md border border-border">
22
24
  <div className="flex items-center gap-2 border-b border-border bg-card px-3 py-2">
23
25
  {icon}
24
- <span className="text-xs text-muted-foreground">
25
- {language || variant}
26
- </span>
26
+ <span className="text-xs text-muted-foreground">{language || variant}</span>
27
27
  {sandboxed && (
28
28
  <span className="ml-auto rounded bg-muted px-1.5 py-0.5 text-xs text-muted-foreground">
29
29
  sandboxed
@@ -42,5 +42,5 @@ export function CodePreview({ data, variant = 'embed' }: BlockPreviewProps) {
42
42
  )}
43
43
  </div>
44
44
  </div>
45
- );
45
+ )
46
46
  }
@@ -1,15 +1,15 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { ChevronDown } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { ChevronDown } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  interface FAQItem {
7
- question?: string;
8
- answer?: string;
7
+ question?: string
8
+ answer?: string
9
9
  }
10
10
 
11
11
  export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
12
- const items = (data.items as FAQItem[]) || [];
12
+ const items = (data.items as FAQItem[]) || []
13
13
 
14
14
  const placeholderItems: FAQItem[] =
15
15
  items.length > 0
@@ -17,13 +17,16 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
17
17
  : [
18
18
  { question: 'What is this?', answer: 'Answer to the first question goes here.' },
19
19
  { question: 'How does it work?', answer: 'Answer to the second question goes here.' },
20
- { question: 'Where can I learn more?', answer: 'Answer to the third question goes here.' },
21
- ];
20
+ {
21
+ question: 'Where can I learn more?',
22
+ answer: 'Answer to the third question goes here.',
23
+ },
24
+ ]
22
25
 
23
26
  if (variant === 'two-column') {
24
- const mid = Math.ceil(placeholderItems.length / 2);
25
- const col1 = placeholderItems.slice(0, mid);
26
- const col2 = placeholderItems.slice(mid);
27
+ const mid = Math.ceil(placeholderItems.length / 2)
28
+ const col1 = placeholderItems.slice(0, mid)
29
+ const col2 = placeholderItems.slice(mid)
27
30
 
28
31
  return (
29
32
  <div className="rounded-md border border-border p-4">
@@ -44,7 +47,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
44
47
  ))}
45
48
  </div>
46
49
  </div>
47
- );
50
+ )
48
51
  }
49
52
 
50
53
  if (variant === 'list') {
@@ -53,9 +56,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
53
56
  <div className="flex flex-col gap-3">
54
57
  {placeholderItems.map((item, i) => (
55
58
  <div key={i} className="border-b border-border pb-3 last:border-b-0 last:pb-0">
56
- <p className="text-sm font-medium text-foreground">
57
- {item.question || 'Question?'}
58
- </p>
59
+ <p className="text-sm font-medium text-foreground">{item.question || 'Question?'}</p>
59
60
  <p className="mt-1 text-xs text-muted-foreground line-clamp-2">
60
61
  {item.answer || 'Answer text…'}
61
62
  </p>
@@ -63,7 +64,7 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
63
64
  ))}
64
65
  </div>
65
66
  </div>
66
- );
67
+ )
67
68
  }
68
69
 
69
70
  return (
@@ -72,19 +73,15 @@ export function FAQPreview({ data, variant = 'accordion' }: BlockPreviewProps) {
72
73
  {placeholderItems.map((item, i) => (
73
74
  <div key={i} className="rounded-md border border-border p-3">
74
75
  <div className="flex items-center justify-between">
75
- <p className="text-sm font-medium text-foreground">
76
- {item.question || 'Question?'}
77
- </p>
76
+ <p className="text-sm font-medium text-foreground">{item.question || 'Question?'}</p>
78
77
  <ChevronDown size={14} className="shrink-0 text-muted-foreground" />
79
78
  </div>
80
79
  {i === 0 && (
81
- <p className="mt-2 text-xs text-muted-foreground">
82
- {item.answer || 'Answer text…'}
83
- </p>
80
+ <p className="mt-2 text-xs text-muted-foreground">{item.answer || 'Answer text…'}</p>
84
81
  )}
85
82
  </div>
86
83
  ))}
87
84
  </div>
88
85
  </div>
89
- );
86
+ )
90
87
  }
@@ -1,10 +1,10 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Box } from 'lucide-react';
3
+ import { Box } from 'lucide-react'
4
4
 
5
5
  export interface FallbackPreviewProps {
6
- blockType: string;
7
- data: Record<string, unknown>;
6
+ blockType: string
7
+ data: Record<string, unknown>
8
8
  }
9
9
 
10
10
  export function FallbackPreview({ blockType }: FallbackPreviewProps) {
@@ -14,5 +14,5 @@ export function FallbackPreview({ blockType }: FallbackPreviewProps) {
14
14
  <p className="text-sm font-medium text-muted-foreground">{blockType}</p>
15
15
  <p className="text-xs text-muted-foreground">No preview available</p>
16
16
  </div>
17
- );
17
+ )
18
18
  }
@@ -1,19 +1,17 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { FileText, Mail, Send } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { FileText, Mail, Send } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
7
- const formId = (data.formId as string) || '';
7
+ const formId = (data.formId as string) || ''
8
8
 
9
9
  if (variant === 'newsletter') {
10
10
  return (
11
11
  <div className="rounded-md border border-border p-6 text-center">
12
12
  <Mail size={24} className="mx-auto text-muted-foreground" />
13
13
  <p className="mt-3 text-sm font-medium text-foreground">Newsletter Signup</p>
14
- {formId && (
15
- <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>
16
- )}
14
+ {formId && <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>}
17
15
  <div className="mx-auto mt-4 flex max-w-xs gap-2">
18
16
  <div className="h-9 flex-1 rounded-md border border-border bg-input-background" />
19
17
  <div className="flex h-9 items-center rounded-md bg-primary px-3">
@@ -21,7 +19,7 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
21
19
  </div>
22
20
  </div>
23
21
  </div>
24
- );
22
+ )
25
23
  }
26
24
 
27
25
  if (variant === 'custom') {
@@ -44,15 +42,13 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
44
42
  </span>
45
43
  </div>
46
44
  </div>
47
- );
45
+ )
48
46
  }
49
47
 
50
48
  return (
51
49
  <div className="rounded-md border border-border p-5">
52
50
  <p className="text-sm font-medium text-foreground">Contact Form</p>
53
- {formId && (
54
- <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>
55
- )}
51
+ {formId && <p className="mt-1 text-xs text-muted-foreground">Form: {formId}</p>}
56
52
  <div className="mt-3 grid grid-cols-2 gap-2">
57
53
  <div className="h-8 rounded-md border border-border bg-input-background" />
58
54
  <div className="h-8 rounded-md border border-border bg-input-background" />
@@ -65,5 +61,5 @@ export function FormPreview({ data, variant = 'contact' }: BlockPreviewProps) {
65
61
  </span>
66
62
  </div>
67
63
  </div>
68
- );
64
+ )
69
65
  }
@@ -1,31 +1,31 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Image } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { Image } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  interface GalleryImage {
7
- src?: string;
8
- alt?: string;
9
- caption?: string;
7
+ src?: string
8
+ alt?: string
9
+ caption?: string
10
10
  }
11
11
 
12
12
  export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
13
- const images = (data.images as GalleryImage[]) || [];
13
+ const images = (data.images as GalleryImage[]) || []
14
14
 
15
15
  const placeholders: GalleryImage[] =
16
- images.length > 0
17
- ? images
18
- : Array.from({ length: 6 }, (_, i) => ({ alt: `Image ${i + 1}` }));
16
+ images.length > 0 ? images : Array.from({ length: 6 }, (_, i) => ({ alt: `Image ${i + 1}` }))
19
17
 
20
18
  const Thumbnail = ({ item, className = '' }: { item: GalleryImage; className?: string }) => (
21
- <div className={`flex items-center justify-center overflow-hidden rounded-md bg-muted ${className}`}>
19
+ <div
20
+ className={`flex items-center justify-center overflow-hidden rounded-md bg-muted ${className}`}
21
+ >
22
22
  {item.src ? (
23
23
  <img src={item.src} alt={item.alt || ''} className="h-full w-full object-cover" />
24
24
  ) : (
25
25
  <Image size={20} className="text-muted-foreground" />
26
26
  )}
27
27
  </div>
28
- );
28
+ )
29
29
 
30
30
  if (variant === 'masonry') {
31
31
  return (
@@ -35,12 +35,14 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
35
35
  <Thumbnail
36
36
  key={i}
37
37
  item={item}
38
- className={i % 3 === 0 ? 'aspect-square' : i % 3 === 1 ? 'aspect-[3/4]' : 'aspect-[4/3]'}
38
+ className={
39
+ i % 3 === 0 ? 'aspect-square' : i % 3 === 1 ? 'aspect-[3/4]' : 'aspect-[4/3]'
40
+ }
39
41
  />
40
42
  ))}
41
43
  </div>
42
44
  </div>
43
- );
45
+ )
44
46
  }
45
47
 
46
48
  if (variant === 'carousel') {
@@ -48,22 +50,16 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
48
50
  <div className="overflow-hidden rounded-md border border-border p-4">
49
51
  <div className="flex gap-3 overflow-hidden">
50
52
  {placeholders.slice(0, 4).map((item, i) => (
51
- <Thumbnail
52
- key={i}
53
- item={item}
54
- className="aspect-square min-w-[120px] flex-1"
55
- />
53
+ <Thumbnail key={i} item={item} className="aspect-square min-w-[120px] flex-1" />
56
54
  ))}
57
55
  {placeholders.length > 4 && (
58
56
  <div className="flex min-w-[120px] flex-1 items-center justify-center rounded-md bg-muted">
59
- <span className="text-sm text-muted-foreground">
60
- +{placeholders.length - 4}
61
- </span>
57
+ <span className="text-sm text-muted-foreground">+{placeholders.length - 4}</span>
62
58
  </div>
63
59
  )}
64
60
  </div>
65
61
  </div>
66
- );
62
+ )
67
63
  }
68
64
 
69
65
  if (variant === 'lightbox') {
@@ -74,11 +70,9 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
74
70
  <Thumbnail key={i} item={item} className="aspect-square" />
75
71
  ))}
76
72
  </div>
77
- <p className="mt-2 text-center text-xs text-muted-foreground">
78
- Click to open lightbox
79
- </p>
73
+ <p className="mt-2 text-center text-xs text-muted-foreground">Click to open lightbox</p>
80
74
  </div>
81
- );
75
+ )
82
76
  }
83
77
 
84
78
  return (
@@ -89,5 +83,5 @@ export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
89
83
  ))}
90
84
  </div>
91
85
  </div>
92
- );
86
+ )
93
87
  }
@@ -1,14 +1,14 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Image, Play } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { Image, Play } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
7
- const title = (data.title as string) || '';
8
- const subtitle = (data.subtitle as string) || '';
9
- const image = data.image as string | undefined;
10
- const ctaText = (data.ctaText as string) || '';
11
- const overlayOpacity = (data.overlayOpacity as number) ?? 0.4;
7
+ const title = (data.title as string) || ''
8
+ const subtitle = (data.subtitle as string) || ''
9
+ const image = data.image as string | undefined
10
+ const ctaText = (data.ctaText as string) || ''
11
+ const overlayOpacity = (data.overlayOpacity as number) ?? 0.4
12
12
 
13
13
  if (variant === 'split-image') {
14
14
  return (
@@ -18,9 +18,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
18
18
  {title || <span className="text-muted-foreground">Hero Title</span>}
19
19
  </h2>
20
20
  {(subtitle || !title) && (
21
- <p className="text-sm text-muted-foreground">
22
- {subtitle || 'Subtitle text goes here'}
23
- </p>
21
+ <p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
24
22
  )}
25
23
  {ctaText && (
26
24
  <div className="mt-2">
@@ -38,7 +36,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
38
36
  )}
39
37
  </div>
40
38
  </div>
41
- );
39
+ )
42
40
  }
43
41
 
44
42
  if (variant === 'minimal') {
@@ -48,9 +46,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
48
46
  {title || <span className="text-muted-foreground">Hero Title</span>}
49
47
  </h2>
50
48
  {(subtitle || !title) && (
51
- <p className="text-sm text-muted-foreground">
52
- {subtitle || 'Subtitle text goes here'}
53
- </p>
49
+ <p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
54
50
  )}
55
51
  {ctaText && (
56
52
  <span className="mt-2 inline-block rounded-md bg-primary px-4 py-2 text-sm text-primary-foreground">
@@ -58,26 +54,19 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
58
54
  </span>
59
55
  )}
60
56
  </div>
61
- );
57
+ )
62
58
  }
63
59
 
64
- const isVideo = variant === 'video-bg';
60
+ const isVideo = variant === 'video-bg'
65
61
 
66
62
  return (
67
63
  <div className="relative flex min-h-[220px] flex-col items-center justify-center gap-3 overflow-hidden rounded-md border border-border p-8">
68
64
  {image ? (
69
- <img
70
- src={image}
71
- alt=""
72
- className="absolute inset-0 h-full w-full object-cover"
73
- />
65
+ <img src={image} alt="" className="absolute inset-0 h-full w-full object-cover" />
74
66
  ) : (
75
67
  <div className="absolute inset-0 bg-muted" />
76
68
  )}
77
- <div
78
- className="absolute inset-0 bg-background"
79
- style={{ opacity: overlayOpacity }}
80
- />
69
+ <div className="absolute inset-0 bg-background" style={{ opacity: overlayOpacity }} />
81
70
  <div className="relative z-10 flex flex-col items-center gap-3 text-center">
82
71
  {isVideo && (
83
72
  <div className="mb-2 flex h-12 w-12 items-center justify-center rounded-full bg-primary/90">
@@ -88,9 +77,7 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
88
77
  {title || <span className="text-muted-foreground">Hero Title</span>}
89
78
  </h2>
90
79
  {(subtitle || !title) && (
91
- <p className="text-sm text-muted-foreground">
92
- {subtitle || 'Subtitle text goes here'}
93
- </p>
80
+ <p className="text-sm text-muted-foreground">{subtitle || 'Subtitle text goes here'}</p>
94
81
  )}
95
82
  {ctaText && (
96
83
  <span className="mt-2 inline-block rounded-md bg-primary px-4 py-2 text-sm text-primary-foreground">
@@ -99,5 +86,5 @@ export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
99
86
  )}
100
87
  </div>
101
88
  </div>
102
- );
89
+ )
103
90
  }
@@ -1,15 +1,15 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Image } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { Image } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps) {
7
- const src = data.src as string | undefined;
8
- const alt = (data.alt as string) || '';
9
- const caption = (data.caption as string) || '';
10
- const aspectRatio = (data.aspectRatio as string) || '16/9';
7
+ const src = data.src as string | undefined
8
+ const alt = (data.alt as string) || ''
9
+ const caption = (data.caption as string) || ''
10
+ const aspectRatio = (data.aspectRatio as string) || '16/9'
11
11
 
12
- const roundedClass = variant === 'rounded' ? 'rounded-xl' : 'rounded-md';
12
+ const roundedClass = variant === 'rounded' ? 'rounded-xl' : 'rounded-md'
13
13
 
14
14
  const ImagePlaceholder = ({ className = '' }: { className?: string }) => (
15
15
  <div
@@ -18,7 +18,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
18
18
  >
19
19
  <Image size={32} className="text-muted-foreground" />
20
20
  </div>
21
- );
21
+ )
22
22
 
23
23
  const ImageElement = ({ className = '' }: { className?: string }) =>
24
24
  src ? (
@@ -30,7 +30,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
30
30
  />
31
31
  ) : (
32
32
  <ImagePlaceholder className={className} />
33
- );
33
+ )
34
34
 
35
35
  if (variant === 'side-by-side') {
36
36
  return (
@@ -38,7 +38,7 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
38
38
  <ImageElement />
39
39
  <ImagePlaceholder />
40
40
  </div>
41
- );
41
+ )
42
42
  }
43
43
 
44
44
  return (
@@ -50,5 +50,5 @@ export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps
50
50
  </figcaption>
51
51
  )}
52
52
  </figure>
53
- );
53
+ )
54
54
  }
@@ -1,27 +1,29 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import type { BlockPreviewProps } from './index.js';
3
+ import type { BlockPreviewProps } from './index.js'
4
4
 
5
5
  export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
6
- const body = (data.body as string) || '';
7
- const heading = (data.heading as string) || '';
8
- const headingLevel = (data.headingLevel as string) || 'h2';
6
+ const body = (data.body as string) || ''
7
+ const heading = (data.heading as string) || ''
8
+ const headingLevel = (data.headingLevel as string) || 'h2'
9
9
 
10
- const truncatedBody = body.length > 300 ? body.slice(0, 300) + '…' : body;
10
+ const truncatedBody = body.length > 300 ? body.slice(0, 300) + '…' : body
11
11
 
12
- const validLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;
13
- const HeadingTag = (validLevels.includes(headingLevel as any) ? headingLevel : 'h2') as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
12
+ const validLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const
13
+ const HeadingTag = (validLevels.includes(headingLevel as any) ? headingLevel : 'h2') as
14
+ | 'h1'
15
+ | 'h2'
16
+ | 'h3'
17
+ | 'h4'
18
+ | 'h5'
19
+ | 'h6'
14
20
  const headingSizeClass =
15
- HeadingTag === 'h1'
16
- ? 'text-2xl'
17
- : HeadingTag === 'h2'
18
- ? 'text-xl'
19
- : 'text-lg';
21
+ HeadingTag === 'h1' ? 'text-2xl' : HeadingTag === 'h2' ? 'text-xl' : 'text-lg'
20
22
 
21
23
  if (variant === 'two-column') {
22
- const midpoint = Math.ceil(truncatedBody.length / 2);
23
- const col1 = truncatedBody.slice(0, midpoint);
24
- const col2 = truncatedBody.slice(midpoint);
24
+ const midpoint = Math.ceil(truncatedBody.length / 2)
25
+ const col1 = truncatedBody.slice(0, midpoint)
26
+ const col2 = truncatedBody.slice(midpoint)
25
27
 
26
28
  return (
27
29
  <div className="rounded-md border border-border p-5">
@@ -39,7 +41,7 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
39
41
  </p>
40
42
  </div>
41
43
  </div>
42
- );
44
+ )
43
45
  }
44
46
 
45
47
  if (variant === 'with-sidebar') {
@@ -61,7 +63,7 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
61
63
  <div className="mt-1 h-2 w-2/3 rounded bg-border" />
62
64
  </aside>
63
65
  </div>
64
- );
66
+ )
65
67
  }
66
68
 
67
69
  return (
@@ -72,10 +74,8 @@ export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
72
74
  </HeadingTag>
73
75
  )}
74
76
  <p className="text-sm leading-relaxed text-muted-foreground">
75
- {truncatedBody || (
76
- <span className="italic">Body text content goes here…</span>
77
- )}
77
+ {truncatedBody || <span className="italic">Body text content goes here…</span>}
78
78
  </p>
79
79
  </div>
80
- );
80
+ )
81
81
  }
@@ -1,17 +1,16 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Play } from 'lucide-react';
4
- import type { BlockPreviewProps } from './index.js';
3
+ import { Play } from 'lucide-react'
4
+ import type { BlockPreviewProps } from './index.js'
5
5
 
6
6
  export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
7
- const poster = data.poster as string | undefined;
8
- const autoplay = data.autoplay as boolean | undefined;
9
- const loop = data.loop as boolean | undefined;
7
+ const poster = data.poster as string | undefined
8
+ const autoplay = data.autoplay as boolean | undefined
9
+ const loop = data.loop as boolean | undefined
10
10
 
11
- const badges: string[] = [
12
- autoplay ? 'Autoplay' : '',
13
- loop ? 'Loop' : '',
14
- ].filter((b): b is string => b !== '');
11
+ const badges: string[] = [autoplay ? 'Autoplay' : '', loop ? 'Loop' : ''].filter(
12
+ (b): b is string => b !== '',
13
+ )
15
14
 
16
15
  const content = (
17
16
  <div className="relative flex aspect-video items-center justify-center overflow-hidden rounded-md bg-muted">
@@ -36,7 +35,7 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
36
35
  </div>
37
36
  )}
38
37
  </div>
39
- );
38
+ )
40
39
 
41
40
  if (variant === 'background') {
42
41
  return (
@@ -54,7 +53,7 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
54
53
  </div>
55
54
  </div>
56
55
  </div>
57
- );
56
+ )
58
57
  }
59
58
 
60
59
  if (variant === 'lightbox') {
@@ -67,12 +66,8 @@ export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
67
66
  </p>
68
67
  </div>
69
68
  </div>
70
- );
69
+ )
71
70
  }
72
71
 
73
- return (
74
- <div className="rounded-md border border-border p-4">
75
- {content}
76
- </div>
77
- );
72
+ return <div className="rounded-md border border-border p-4">{content}</div>
78
73
  }