@actuate-media/cms-admin 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/dist/AdminRoot.d.ts.map +1 -1
  2. package/dist/AdminRoot.js +44 -42
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/__tests__/lib/search.test.js +10 -10
  5. package/dist/__tests__/lib/search.test.js.map +1 -1
  6. package/dist/__tests__/lib/utils.test.js.map +1 -1
  7. package/dist/__tests__/router/match-route.test.js.map +1 -1
  8. package/dist/__tests__/router/strip-base.test.js.map +1 -1
  9. package/dist/components/Breadcrumbs.d.ts.map +1 -1
  10. package/dist/components/Breadcrumbs.js +2 -4
  11. package/dist/components/Breadcrumbs.js.map +1 -1
  12. package/dist/components/CommandPalette.d.ts.map +1 -1
  13. package/dist/components/CommandPalette.js +7 -3
  14. package/dist/components/CommandPalette.js.map +1 -1
  15. package/dist/components/ContentOverviewChart.d.ts.map +1 -1
  16. package/dist/components/ContentOverviewChart.js.map +1 -1
  17. package/dist/components/ErrorBoundary.d.ts.map +1 -1
  18. package/dist/components/ErrorBoundary.js.map +1 -1
  19. package/dist/components/FocalPointPicker.d.ts.map +1 -1
  20. package/dist/components/FocalPointPicker.js +4 -2
  21. package/dist/components/FocalPointPicker.js.map +1 -1
  22. package/dist/components/FolderTree.d.ts.map +1 -1
  23. package/dist/components/FolderTree.js +18 -10
  24. package/dist/components/FolderTree.js.map +1 -1
  25. package/dist/components/LivePreview.d.ts +1 -1
  26. package/dist/components/LivePreview.d.ts.map +1 -1
  27. package/dist/components/LivePreview.js +6 -2
  28. package/dist/components/LivePreview.js.map +1 -1
  29. package/dist/components/LocaleProvider.d.ts.map +1 -1
  30. package/dist/components/LocaleProvider.js.map +1 -1
  31. package/dist/components/LocaleSwitcher.d.ts.map +1 -1
  32. package/dist/components/LocaleSwitcher.js +1 -1
  33. package/dist/components/LocaleSwitcher.js.map +1 -1
  34. package/dist/components/MediaPickerModal.d.ts.map +1 -1
  35. package/dist/components/MediaPickerModal.js.map +1 -1
  36. package/dist/components/PresenceIndicator.d.ts.map +1 -1
  37. package/dist/components/PresenceIndicator.js +5 -2
  38. package/dist/components/PresenceIndicator.js.map +1 -1
  39. package/dist/components/SEOPanel.d.ts +1 -1
  40. package/dist/components/SEOPanel.d.ts.map +1 -1
  41. package/dist/components/SEOPanel.js +110 -24
  42. package/dist/components/SEOPanel.js.map +1 -1
  43. package/dist/components/SEOPerformance.d.ts.map +1 -1
  44. package/dist/components/SEOPerformance.js +2 -2
  45. package/dist/components/SEOPerformance.js.map +1 -1
  46. package/dist/components/ThemeProvider.d.ts.map +1 -1
  47. package/dist/components/ThemeProvider.js.map +1 -1
  48. package/dist/components/TipTapEditor.d.ts.map +1 -1
  49. package/dist/components/TipTapEditor.js +5 -1
  50. package/dist/components/TipTapEditor.js.map +1 -1
  51. package/dist/components/VersionHistory.d.ts +1 -1
  52. package/dist/components/VersionHistory.d.ts.map +1 -1
  53. package/dist/components/VersionHistory.js +1 -1
  54. package/dist/components/VersionHistory.js.map +1 -1
  55. package/dist/components/ui/Avatar.d.ts.map +1 -1
  56. package/dist/components/ui/Avatar.js.map +1 -1
  57. package/dist/components/ui/Badge.d.ts.map +1 -1
  58. package/dist/components/ui/Badge.js.map +1 -1
  59. package/dist/components/ui/Button.d.ts.map +1 -1
  60. package/dist/components/ui/Button.js.map +1 -1
  61. package/dist/components/ui/CommandPalette.d.ts.map +1 -1
  62. package/dist/components/ui/CommandPalette.js +8 -2
  63. package/dist/components/ui/CommandPalette.js.map +1 -1
  64. package/dist/components/ui/ConfirmDialog.d.ts.map +1 -1
  65. package/dist/components/ui/ConfirmDialog.js.map +1 -1
  66. package/dist/components/ui/DataTable.d.ts.map +1 -1
  67. package/dist/components/ui/DataTable.js +1 -3
  68. package/dist/components/ui/DataTable.js.map +1 -1
  69. package/dist/components/ui/EmptyState.d.ts.map +1 -1
  70. package/dist/components/ui/EmptyState.js +1 -1
  71. package/dist/components/ui/EmptyState.js.map +1 -1
  72. package/dist/components/ui/Modal.d.ts.map +1 -1
  73. package/dist/components/ui/Modal.js.map +1 -1
  74. package/dist/components/ui/Pagination.d.ts +1 -1
  75. package/dist/components/ui/Pagination.d.ts.map +1 -1
  76. package/dist/components/ui/Pagination.js +7 -2
  77. package/dist/components/ui/Pagination.js.map +1 -1
  78. package/dist/components/ui/SearchInput.d.ts.map +1 -1
  79. package/dist/components/ui/SearchInput.js.map +1 -1
  80. package/dist/components/ui/Skeleton.d.ts.map +1 -1
  81. package/dist/components/ui/Skeleton.js.map +1 -1
  82. package/dist/components/ui/Toast.d.ts.map +1 -1
  83. package/dist/components/ui/Toast.js.map +1 -1
  84. package/dist/components/ui/index.d.ts.map +1 -1
  85. package/dist/components/ui/index.js.map +1 -1
  86. package/dist/fields/ArrayField.d.ts.map +1 -1
  87. package/dist/fields/ArrayField.js +1 -1
  88. package/dist/fields/ArrayField.js.map +1 -1
  89. package/dist/fields/BlockBuilderField.d.ts.map +1 -1
  90. package/dist/fields/BlockBuilderField.js +7 -7
  91. package/dist/fields/BlockBuilderField.js.map +1 -1
  92. package/dist/fields/DateField.d.ts.map +1 -1
  93. package/dist/fields/DateField.js +1 -1
  94. package/dist/fields/DateField.js.map +1 -1
  95. package/dist/fields/FieldRenderer.d.ts.map +1 -1
  96. package/dist/fields/FieldRenderer.js.map +1 -1
  97. package/dist/fields/GroupField.d.ts.map +1 -1
  98. package/dist/fields/GroupField.js +1 -1
  99. package/dist/fields/GroupField.js.map +1 -1
  100. package/dist/fields/MediaField.d.ts.map +1 -1
  101. package/dist/fields/MediaField.js +1 -1
  102. package/dist/fields/MediaField.js.map +1 -1
  103. package/dist/fields/NavBuilderField.d.ts.map +1 -1
  104. package/dist/fields/NavBuilderField.js +2 -5
  105. package/dist/fields/NavBuilderField.js.map +1 -1
  106. package/dist/fields/NumberField.d.ts +1 -1
  107. package/dist/fields/NumberField.d.ts.map +1 -1
  108. package/dist/fields/NumberField.js +2 -2
  109. package/dist/fields/NumberField.js.map +1 -1
  110. package/dist/fields/RelationshipField.d.ts.map +1 -1
  111. package/dist/fields/RelationshipField.js +7 -3
  112. package/dist/fields/RelationshipField.js.map +1 -1
  113. package/dist/fields/RichTextField.d.ts +1 -1
  114. package/dist/fields/RichTextField.d.ts.map +1 -1
  115. package/dist/fields/RichTextField.js +2 -2
  116. package/dist/fields/RichTextField.js.map +1 -1
  117. package/dist/fields/SelectField.d.ts.map +1 -1
  118. package/dist/fields/SelectField.js +9 -7
  119. package/dist/fields/SelectField.js.map +1 -1
  120. package/dist/fields/SlugField.d.ts.map +1 -1
  121. package/dist/fields/SlugField.js +1 -1
  122. package/dist/fields/SlugField.js.map +1 -1
  123. package/dist/fields/TextField.d.ts +1 -1
  124. package/dist/fields/TextField.d.ts.map +1 -1
  125. package/dist/fields/TextField.js +2 -2
  126. package/dist/fields/TextField.js.map +1 -1
  127. package/dist/fields/ToggleField.d.ts.map +1 -1
  128. package/dist/fields/ToggleField.js +1 -1
  129. package/dist/fields/ToggleField.js.map +1 -1
  130. package/dist/fields/block-types.d.ts.map +1 -1
  131. package/dist/fields/block-types.js +28 -8
  132. package/dist/fields/block-types.js.map +1 -1
  133. package/dist/fields/index.d.ts.map +1 -1
  134. package/dist/fields/index.js.map +1 -1
  135. package/dist/hooks/useBuilderState.d.ts.map +1 -1
  136. package/dist/hooks/useBuilderState.js.map +1 -1
  137. package/dist/hooks/useContentLock.d.ts.map +1 -1
  138. package/dist/hooks/useContentLock.js.map +1 -1
  139. package/dist/hooks/useDebounce.js.map +1 -1
  140. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  141. package/dist/hooks/useKeyboardShortcuts.js.map +1 -1
  142. package/dist/index.d.ts +2 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js.map +1 -1
  145. package/dist/layout/Header.d.ts.map +1 -1
  146. package/dist/layout/Header.js.map +1 -1
  147. package/dist/layout/Layout.d.ts.map +1 -1
  148. package/dist/layout/Layout.js.map +1 -1
  149. package/dist/layout/Sidebar.d.ts +1 -1
  150. package/dist/layout/Sidebar.d.ts.map +1 -1
  151. package/dist/layout/Sidebar.js +5 -8
  152. package/dist/layout/Sidebar.js.map +1 -1
  153. package/dist/lib/api.js.map +1 -1
  154. package/dist/lib/search.d.ts.map +1 -1
  155. package/dist/lib/search.js +3 -5
  156. package/dist/lib/search.js.map +1 -1
  157. package/dist/lib/useApiData.d.ts.map +1 -1
  158. package/dist/lib/useApiData.js.map +1 -1
  159. package/dist/lib/utils.d.ts.map +1 -1
  160. package/dist/lib/utils.js.map +1 -1
  161. package/dist/router/index.d.ts.map +1 -1
  162. package/dist/router/index.js +1 -3
  163. package/dist/router/index.js.map +1 -1
  164. package/dist/views/CollectionList.d.ts.map +1 -1
  165. package/dist/views/CollectionList.js +56 -17
  166. package/dist/views/CollectionList.js.map +1 -1
  167. package/dist/views/Dashboard.d.ts.map +1 -1
  168. package/dist/views/Dashboard.js +26 -13
  169. package/dist/views/Dashboard.js.map +1 -1
  170. package/dist/views/DocumentEdit.d.ts +1 -1
  171. package/dist/views/DocumentEdit.d.ts.map +1 -1
  172. package/dist/views/DocumentEdit.js +33 -15
  173. package/dist/views/DocumentEdit.js.map +1 -1
  174. package/dist/views/ForgotPassword.d.ts.map +1 -1
  175. package/dist/views/ForgotPassword.js.map +1 -1
  176. package/dist/views/FormEditor.d.ts.map +1 -1
  177. package/dist/views/FormEditor.js +8 -2
  178. package/dist/views/FormEditor.js.map +1 -1
  179. package/dist/views/FormSubmissions.d.ts.map +1 -1
  180. package/dist/views/FormSubmissions.js +6 -6
  181. package/dist/views/FormSubmissions.js.map +1 -1
  182. package/dist/views/Forms.d.ts.map +1 -1
  183. package/dist/views/Forms.js.map +1 -1
  184. package/dist/views/Login.d.ts.map +1 -1
  185. package/dist/views/Login.js +5 -2
  186. package/dist/views/Login.js.map +1 -1
  187. package/dist/views/MediaBrowser.d.ts.map +1 -1
  188. package/dist/views/MediaBrowser.js +39 -19
  189. package/dist/views/MediaBrowser.js.map +1 -1
  190. package/dist/views/PageEditor.d.ts.map +1 -1
  191. package/dist/views/PageEditor.js.map +1 -1
  192. package/dist/views/Pages.d.ts.map +1 -1
  193. package/dist/views/Pages.js +20 -10
  194. package/dist/views/Pages.js.map +1 -1
  195. package/dist/views/PostEditor.d.ts.map +1 -1
  196. package/dist/views/PostEditor.js.map +1 -1
  197. package/dist/views/Posts.d.ts.map +1 -1
  198. package/dist/views/Posts.js +13 -7
  199. package/dist/views/Posts.js.map +1 -1
  200. package/dist/views/Redirects.d.ts.map +1 -1
  201. package/dist/views/Redirects.js +17 -5
  202. package/dist/views/Redirects.js.map +1 -1
  203. package/dist/views/ResetPassword.d.ts.map +1 -1
  204. package/dist/views/ResetPassword.js.map +1 -1
  205. package/dist/views/SEO.d.ts.map +1 -1
  206. package/dist/views/SEO.js +39 -16
  207. package/dist/views/SEO.js.map +1 -1
  208. package/dist/views/ScriptTagEditor.d.ts.map +1 -1
  209. package/dist/views/ScriptTagEditor.js +2 -1
  210. package/dist/views/ScriptTagEditor.js.map +1 -1
  211. package/dist/views/ScriptTags.d.ts.map +1 -1
  212. package/dist/views/ScriptTags.js.map +1 -1
  213. package/dist/views/Settings.d.ts.map +1 -1
  214. package/dist/views/Settings.js +38 -11
  215. package/dist/views/Settings.js.map +1 -1
  216. package/dist/views/SetupWizard.d.ts.map +1 -1
  217. package/dist/views/SetupWizard.js.map +1 -1
  218. package/dist/views/Users.d.ts.map +1 -1
  219. package/dist/views/Users.js +5 -3
  220. package/dist/views/Users.js.map +1 -1
  221. package/dist/views/page-builder/AIBlockAssist.d.ts.map +1 -1
  222. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  223. package/dist/views/page-builder/AIBlockAssist.js.map +1 -1
  224. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +1 -1
  225. package/dist/views/page-builder/AIGenerateDialog.js +4 -1
  226. package/dist/views/page-builder/AIGenerateDialog.js.map +1 -1
  227. package/dist/views/page-builder/BlockEditor.d.ts.map +1 -1
  228. package/dist/views/page-builder/BlockEditor.js +1 -1
  229. package/dist/views/page-builder/BlockEditor.js.map +1 -1
  230. package/dist/views/page-builder/BlockPicker.d.ts.map +1 -1
  231. package/dist/views/page-builder/BlockPicker.js.map +1 -1
  232. package/dist/views/page-builder/BottomBar.d.ts.map +1 -1
  233. package/dist/views/page-builder/BottomBar.js.map +1 -1
  234. package/dist/views/page-builder/BuilderToolbar.d.ts.map +1 -1
  235. package/dist/views/page-builder/BuilderToolbar.js.map +1 -1
  236. package/dist/views/page-builder/ContextPanel.d.ts.map +1 -1
  237. package/dist/views/page-builder/ContextPanel.js +4 -1
  238. package/dist/views/page-builder/ContextPanel.js.map +1 -1
  239. package/dist/views/page-builder/DesignScore.d.ts.map +1 -1
  240. package/dist/views/page-builder/DesignScore.js.map +1 -1
  241. package/dist/views/page-builder/NodeSettings.d.ts.map +1 -1
  242. package/dist/views/page-builder/NodeSettings.js +1 -1
  243. package/dist/views/page-builder/NodeSettings.js.map +1 -1
  244. package/dist/views/page-builder/PageBuilder.d.ts +1 -1
  245. package/dist/views/page-builder/PageBuilder.d.ts.map +1 -1
  246. package/dist/views/page-builder/PageBuilder.js +4 -2
  247. package/dist/views/page-builder/PageBuilder.js.map +1 -1
  248. package/dist/views/page-builder/PageSettings.d.ts.map +1 -1
  249. package/dist/views/page-builder/PageSettings.js.map +1 -1
  250. package/dist/views/page-builder/PageTemplates.d.ts.map +1 -1
  251. package/dist/views/page-builder/PageTemplates.js.map +1 -1
  252. package/dist/views/page-builder/SEOPanel.d.ts.map +1 -1
  253. package/dist/views/page-builder/SEOPanel.js +1 -3
  254. package/dist/views/page-builder/SEOPanel.js.map +1 -1
  255. package/dist/views/page-builder/SavedSections.d.ts.map +1 -1
  256. package/dist/views/page-builder/SavedSections.js +3 -7
  257. package/dist/views/page-builder/SavedSections.js.map +1 -1
  258. package/dist/views/page-builder/TemplatePicker.d.ts.map +1 -1
  259. package/dist/views/page-builder/TemplatePicker.js.map +1 -1
  260. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +1 -1
  261. package/dist/views/page-builder/block-renderers/CTAPreview.js +1 -1
  262. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +1 -1
  263. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +1 -1
  264. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  265. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +1 -1
  266. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +1 -1
  267. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -5
  268. package/dist/views/page-builder/block-renderers/CodePreview.js.map +1 -1
  269. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +1 -1
  270. package/dist/views/page-builder/block-renderers/FAQPreview.js +4 -1
  271. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +1 -1
  272. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +1 -1
  273. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +1 -1
  274. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +1 -1
  275. package/dist/views/page-builder/block-renderers/FormPreview.js +2 -2
  276. package/dist/views/page-builder/block-renderers/FormPreview.js.map +1 -1
  277. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +1 -1
  278. package/dist/views/page-builder/block-renderers/GalleryPreview.js +1 -3
  279. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +1 -1
  280. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +1 -1
  281. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +1 -1
  282. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +1 -1
  283. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +1 -1
  284. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +1 -1
  285. package/dist/views/page-builder/block-renderers/TextPreview.js +2 -6
  286. package/dist/views/page-builder/block-renderers/TextPreview.js.map +1 -1
  287. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +1 -1
  288. package/dist/views/page-builder/block-renderers/VideoPreview.js +2 -5
  289. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +1 -1
  290. package/dist/views/page-builder/block-renderers/index.d.ts.map +1 -1
  291. package/dist/views/page-builder/block-renderers/index.js.map +1 -1
  292. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +1 -1
  293. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -5
  294. package/dist/views/page-builder/canvas/BlockRenderer.js.map +1 -1
  295. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +1 -1
  296. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +1 -1
  297. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +1 -1
  298. package/dist/views/page-builder/canvas/ColumnRenderer.js +1 -5
  299. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +1 -1
  300. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +1 -1
  301. package/dist/views/page-builder/canvas/ContainerRenderer.js +1 -5
  302. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +1 -1
  303. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +1 -1
  304. package/dist/views/page-builder/canvas/RowRenderer.js +1 -5
  305. package/dist/views/page-builder/canvas/RowRenderer.js.map +1 -1
  306. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +1 -1
  307. package/dist/views/page-builder/canvas/SectionRenderer.js +1 -5
  308. package/dist/views/page-builder/canvas/SectionRenderer.js.map +1 -1
  309. package/dist/views/page-builder/canvas/index.d.ts.map +1 -1
  310. package/dist/views/page-builder/canvas/index.js.map +1 -1
  311. package/package.json +2 -2
  312. package/src/AdminRoot.tsx +263 -191
  313. package/src/__tests__/lib/search.test.ts +60 -69
  314. package/src/__tests__/lib/utils.test.ts +12 -12
  315. package/src/__tests__/router/match-route.test.ts +24 -26
  316. package/src/__tests__/router/strip-base.test.ts +15 -15
  317. package/src/components/Breadcrumbs.tsx +27 -24
  318. package/src/components/CommandPalette.tsx +115 -99
  319. package/src/components/ContentOverviewChart.tsx +19 -14
  320. package/src/components/ErrorBoundary.tsx +13 -13
  321. package/src/components/FocalPointPicker.tsx +31 -20
  322. package/src/components/FolderTree.tsx +172 -139
  323. package/src/components/LivePreview.tsx +68 -41
  324. package/src/components/LocaleProvider.tsx +26 -20
  325. package/src/components/LocaleSwitcher.tsx +9 -11
  326. package/src/components/MediaPickerModal.tsx +46 -45
  327. package/src/components/PresenceIndicator.tsx +30 -27
  328. package/src/components/SEOPanel.tsx +378 -228
  329. package/src/components/SEOPerformance.tsx +52 -30
  330. package/src/components/ThemeProvider.tsx +46 -46
  331. package/src/components/TipTapEditor.tsx +60 -64
  332. package/src/components/VersionHistory.tsx +63 -52
  333. package/src/components/ui/Avatar.tsx +8 -8
  334. package/src/components/ui/Badge.tsx +7 -5
  335. package/src/components/ui/Button.tsx +24 -13
  336. package/src/components/ui/CommandPalette.tsx +56 -42
  337. package/src/components/ui/ConfirmDialog.tsx +14 -14
  338. package/src/components/ui/DataTable.tsx +37 -39
  339. package/src/components/ui/EmptyState.tsx +9 -11
  340. package/src/components/ui/Modal.tsx +21 -15
  341. package/src/components/ui/Pagination.tsx +34 -19
  342. package/src/components/ui/SearchInput.tsx +17 -7
  343. package/src/components/ui/Skeleton.tsx +7 -7
  344. package/src/components/ui/Toast.tsx +29 -22
  345. package/src/components/ui/index.ts +24 -24
  346. package/src/fields/ArrayField.tsx +43 -25
  347. package/src/fields/BlockBuilderField.tsx +80 -99
  348. package/src/fields/DateField.tsx +20 -12
  349. package/src/fields/FieldRenderer.tsx +34 -34
  350. package/src/fields/GroupField.tsx +8 -10
  351. package/src/fields/MediaField.tsx +8 -10
  352. package/src/fields/NavBuilderField.tsx +24 -25
  353. package/src/fields/NumberField.tsx +21 -14
  354. package/src/fields/RelationshipField.tsx +105 -91
  355. package/src/fields/RichTextField.tsx +16 -12
  356. package/src/fields/SelectField.tsx +42 -34
  357. package/src/fields/SlugField.tsx +29 -17
  358. package/src/fields/TextField.tsx +24 -16
  359. package/src/fields/ToggleField.tsx +7 -9
  360. package/src/fields/block-types.ts +50 -24
  361. package/src/fields/index.ts +17 -17
  362. package/src/hooks/useBuilderState.ts +260 -221
  363. package/src/hooks/useContentLock.ts +23 -20
  364. package/src/hooks/useDebounce.ts +7 -7
  365. package/src/hooks/useKeyboardShortcuts.ts +16 -16
  366. package/src/index.ts +69 -58
  367. package/src/layout/Header.tsx +21 -20
  368. package/src/layout/Layout.tsx +22 -24
  369. package/src/layout/Sidebar.tsx +107 -72
  370. package/src/lib/api.ts +34 -34
  371. package/src/lib/search.ts +30 -34
  372. package/src/lib/useApiData.ts +65 -62
  373. package/src/lib/utils.ts +3 -3
  374. package/src/router/index.ts +33 -35
  375. package/src/styles/build-input.css +2 -2
  376. package/src/styles/tailwind.css +1 -1
  377. package/src/styles/theme.css +7 -1
  378. package/src/views/CollectionList.tsx +275 -121
  379. package/src/views/Dashboard.tsx +164 -117
  380. package/src/views/DocumentEdit.tsx +298 -253
  381. package/src/views/ForgotPassword.tsx +27 -23
  382. package/src/views/FormEditor.tsx +165 -99
  383. package/src/views/FormSubmissions.tsx +261 -117
  384. package/src/views/Forms.tsx +56 -26
  385. package/src/views/Login.tsx +107 -84
  386. package/src/views/MediaBrowser.tsx +717 -523
  387. package/src/views/PageEditor.tsx +44 -46
  388. package/src/views/Pages.tsx +312 -149
  389. package/src/views/PostEditor.tsx +57 -51
  390. package/src/views/Posts.tsx +206 -74
  391. package/src/views/Redirects.tsx +173 -117
  392. package/src/views/ResetPassword.tsx +43 -32
  393. package/src/views/SEO.tsx +589 -160
  394. package/src/views/ScriptTagEditor.tsx +69 -69
  395. package/src/views/ScriptTags.tsx +54 -42
  396. package/src/views/Settings.tsx +430 -220
  397. package/src/views/SetupWizard.tsx +69 -46
  398. package/src/views/Users.tsx +154 -120
  399. package/src/views/page-builder/AIBlockAssist.tsx +21 -25
  400. package/src/views/page-builder/AIGenerateDialog.tsx +134 -127
  401. package/src/views/page-builder/BlockEditor.tsx +94 -96
  402. package/src/views/page-builder/BlockPicker.tsx +73 -88
  403. package/src/views/page-builder/BottomBar.tsx +15 -11
  404. package/src/views/page-builder/BuilderToolbar.tsx +32 -29
  405. package/src/views/page-builder/ContextPanel.tsx +57 -57
  406. package/src/views/page-builder/DesignScore.tsx +52 -59
  407. package/src/views/page-builder/NodeSettings.tsx +59 -59
  408. package/src/views/page-builder/PageBuilder.tsx +156 -155
  409. package/src/views/page-builder/PageSettings.tsx +16 -15
  410. package/src/views/page-builder/PageTemplates.tsx +23 -17
  411. package/src/views/page-builder/SEOPanel.tsx +90 -111
  412. package/src/views/page-builder/SavedSections.tsx +99 -105
  413. package/src/views/page-builder/TemplatePicker.tsx +44 -48
  414. package/src/views/page-builder/block-renderers/CTAPreview.tsx +11 -13
  415. package/src/views/page-builder/block-renderers/CardsPreview.tsx +13 -15
  416. package/src/views/page-builder/block-renderers/CodePreview.tsx +16 -16
  417. package/src/views/page-builder/block-renderers/FAQPreview.tsx +20 -23
  418. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +5 -5
  419. package/src/views/page-builder/block-renderers/FormPreview.tsx +9 -13
  420. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +22 -28
  421. package/src/views/page-builder/block-renderers/HeroPreview.tsx +17 -30
  422. package/src/views/page-builder/block-renderers/ImagePreview.tsx +12 -12
  423. package/src/views/page-builder/block-renderers/TextPreview.tsx +22 -22
  424. package/src/views/page-builder/block-renderers/VideoPreview.tsx +13 -18
  425. package/src/views/page-builder/block-renderers/index.ts +17 -17
  426. package/src/views/page-builder/canvas/BlockRenderer.tsx +19 -23
  427. package/src/views/page-builder/canvas/BuilderCanvas.tsx +17 -20
  428. package/src/views/page-builder/canvas/ColumnRenderer.tsx +22 -26
  429. package/src/views/page-builder/canvas/ContainerRenderer.tsx +20 -24
  430. package/src/views/page-builder/canvas/RowRenderer.tsx +19 -23
  431. package/src/views/page-builder/canvas/SectionRenderer.tsx +30 -34
  432. package/src/views/page-builder/canvas/index.ts +2 -2
@@ -1,38 +1,39 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { Plus, MoreVertical, FileText, Send, Search, Loader2, AlertTriangle } from 'lucide-react';
4
- import { useState, useMemo } from 'react';
5
- import { sortByRelevance } from '../lib/search.js';
6
- import { useApiData } from '../lib/useApiData.js';
3
+ import { Plus, MoreVertical, FileText, Send, Search, Loader2, AlertTriangle } from 'lucide-react'
4
+ import { useState, useMemo } from 'react'
5
+ import { sortByRelevance } from '../lib/search.js'
6
+ import { useApiData } from '../lib/useApiData.js'
7
7
 
8
8
  export interface FormsProps {
9
- onNavigate?: (path: string) => void;
9
+ onNavigate?: (path: string) => void
10
10
  }
11
11
 
12
12
  export function Forms({ onNavigate }: FormsProps) {
13
- const { data, loading, error, refetch } = useApiData<any[]>('/forms');
14
- const [searchQuery, setSearchQuery] = useState('');
13
+ const { data, loading, error, refetch } = useApiData<any[]>('/forms')
14
+ const [searchQuery, setSearchQuery] = useState('')
15
15
 
16
- const forms = data ?? [];
16
+ const forms = data ?? []
17
17
 
18
18
  const filteredAndSorted = useMemo(() => {
19
- let results = forms.filter((form: any) =>
20
- (form.name ?? '').toLowerCase().includes(searchQuery.toLowerCase()) ||
21
- (form.description ?? '').toLowerCase().includes(searchQuery.toLowerCase())
22
- );
19
+ let results = forms.filter(
20
+ (form: any) =>
21
+ (form.name ?? '').toLowerCase().includes(searchQuery.toLowerCase()) ||
22
+ (form.description ?? '').toLowerCase().includes(searchQuery.toLowerCase()),
23
+ )
23
24
 
24
25
  if (searchQuery.trim()) {
25
- results = sortByRelevance(results, searchQuery, (f: any) => [f.name, f.description ?? '']);
26
+ results = sortByRelevance(results, searchQuery, (f: any) => [f.name, f.description ?? ''])
26
27
  }
27
- return results;
28
- }, [forms, searchQuery]);
28
+ return results
29
+ }, [forms, searchQuery])
29
30
 
30
31
  if (loading) {
31
32
  return (
32
33
  <div className="p-3 pr-6 sm:p-4 sm:pr-8 flex items-center justify-center h-64">
33
34
  <Loader2 className="w-6 h-6 animate-spin text-blue-600" />
34
35
  </div>
35
- );
36
+ )
36
37
  }
37
38
 
38
39
  return (
@@ -41,7 +42,12 @@ export function Forms({ onNavigate }: FormsProps) {
41
42
  <div className="mb-4 flex items-center gap-3 rounded-lg border border-red-200 bg-red-50 p-3">
42
43
  <AlertTriangle className="w-5 h-5 text-red-600 shrink-0" />
43
44
  <span className="text-sm text-red-800 flex-1">{error}</span>
44
- <button onClick={refetch} className="px-3 py-1 text-sm text-red-700 border border-red-300 rounded-lg hover:bg-red-100 transition-colors">Retry</button>
45
+ <button
46
+ onClick={refetch}
47
+ className="px-3 py-1 text-sm text-red-700 border border-red-300 rounded-lg hover:bg-red-100 transition-colors"
48
+ >
49
+ Retry
50
+ </button>
45
51
  </div>
46
52
  )}
47
53
 
@@ -50,7 +56,10 @@ export function Forms({ onNavigate }: FormsProps) {
50
56
  <h1 className="text-xl sm:text-2xl font-semibold text-gray-900 mb-1">Forms</h1>
51
57
  <p className="text-sm text-gray-600">{filteredAndSorted.length} total forms</p>
52
58
  </div>
53
- <button onClick={() => onNavigate?.('/forms/new')} className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm">
59
+ <button
60
+ onClick={() => onNavigate?.('/forms/new')}
61
+ className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors text-sm"
62
+ >
54
63
  <Plus className="w-4 h-4" />
55
64
  New Form
56
65
  </button>
@@ -74,12 +83,17 @@ export function Forms({ onNavigate }: FormsProps) {
74
83
  {filteredAndSorted.length === 0 ? (
75
84
  <div className="bg-white rounded-lg border border-gray-200 p-8 text-center">
76
85
  <p className="text-sm text-gray-500 mb-2">No forms yet</p>
77
- <button className="px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors">Create your first form</button>
86
+ <button className="px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors">
87
+ Create your first form
88
+ </button>
78
89
  </div>
79
90
  ) : (
80
91
  <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
81
92
  {filteredAndSorted.map((form: any) => (
82
- <div key={form.id} className="bg-white rounded-lg border border-gray-200 p-4 hover:shadow-md transition-shadow">
93
+ <div
94
+ key={form.id}
95
+ className="bg-white rounded-lg border border-gray-200 p-4 hover:shadow-md transition-shadow"
96
+ >
83
97
  <div className="flex items-start justify-between mb-3">
84
98
  <div className="flex-1">
85
99
  <h3 className="font-semibold text-gray-900 mb-1">{form.name}</h3>
@@ -90,17 +104,33 @@ export function Forms({ onNavigate }: FormsProps) {
90
104
  </button>
91
105
  </div>
92
106
  <div className="flex items-center gap-4 text-sm text-gray-600 mb-3">
93
- <span className="flex items-center gap-1"><FileText className="w-4 h-4" />{form.fields} fields</span>
94
- <span className="flex items-center gap-1"><Send className="w-4 h-4" />{form.submissions} submissions</span>
107
+ <span className="flex items-center gap-1">
108
+ <FileText className="w-4 h-4" />
109
+ {form.fields} fields
110
+ </span>
111
+ <span className="flex items-center gap-1">
112
+ <Send className="w-4 h-4" />
113
+ {form.submissions} submissions
114
+ </span>
95
115
  </div>
96
116
  <div className="flex items-center gap-2">
97
- <button onClick={() => onNavigate?.(`/forms/${form.id}/submissions`)} className="flex-1 px-3 py-1.5 text-sm text-center bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors">View Submissions</button>
98
- <button onClick={() => onNavigate?.(`/forms/${form.id}/edit`)} className="px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors">Edit</button>
117
+ <button
118
+ onClick={() => onNavigate?.(`/forms/${form.id}/submissions`)}
119
+ className="flex-1 px-3 py-1.5 text-sm text-center bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
120
+ >
121
+ View Submissions
122
+ </button>
123
+ <button
124
+ onClick={() => onNavigate?.(`/forms/${form.id}/edit`)}
125
+ className="px-3 py-1.5 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors"
126
+ >
127
+ Edit
128
+ </button>
99
129
  </div>
100
130
  </div>
101
131
  ))}
102
132
  </div>
103
133
  )}
104
134
  </div>
105
- );
135
+ )
106
136
  }
@@ -1,25 +1,29 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
- import { useState, type FormEvent } from 'react';
4
- import { Shield, Eye, EyeOff, AlertTriangle, Loader2 } from 'lucide-react';
3
+ import { useState, type FormEvent } from 'react'
4
+ import { Shield, Eye, EyeOff, AlertTriangle, Loader2 } from 'lucide-react'
5
5
 
6
6
  export interface CaptchaConfig {
7
- provider: 'recaptcha' | 'turnstile' | 'none';
8
- siteKey: string | null;
7
+ provider: 'recaptcha' | 'turnstile' | 'none'
8
+ siteKey: string | null
9
9
  }
10
10
 
11
11
  export interface LoginProps {
12
- onLogin: (email: string, password: string, captchaToken?: string) => Promise<{ success: boolean; error?: string }>;
13
- onNavigate?: (path: string) => void;
14
- oauthProviders?: string[];
15
- captchaConfig?: CaptchaConfig;
12
+ onLogin: (
13
+ email: string,
14
+ password: string,
15
+ captchaToken?: string,
16
+ ) => Promise<{ success: boolean; error?: string }>
17
+ onNavigate?: (path: string) => void
18
+ oauthProviders?: string[]
19
+ captchaConfig?: CaptchaConfig
16
20
  }
17
21
 
18
22
  const OAUTH_LABELS: Record<string, string> = {
19
23
  google: 'Google',
20
24
  github: 'GitHub',
21
25
  microsoft: 'Microsoft',
22
- };
26
+ }
23
27
 
24
28
  const OAUTH_COLORS: Record<string, { border: string; bg: string; text: string; hover: string }> = {
25
29
  google: {
@@ -40,7 +44,7 @@ const OAUTH_COLORS: Record<string, { border: string; bg: string; text: string; h
40
44
  text: 'text-gray-700',
41
45
  hover: 'hover:bg-blue-50',
42
46
  },
43
- };
47
+ }
44
48
 
45
49
  function GoogleIcon() {
46
50
  return (
@@ -62,7 +66,7 @@ function GoogleIcon() {
62
66
  fill="#EA4335"
63
67
  />
64
68
  </svg>
65
- );
69
+ )
66
70
  }
67
71
 
68
72
  function MicrosoftIcon() {
@@ -73,134 +77,146 @@ function MicrosoftIcon() {
73
77
  <rect x="11" y="1" width="9" height="9" fill="#7FBA00" />
74
78
  <rect x="11" y="11" width="9" height="9" fill="#FFB900" />
75
79
  </svg>
76
- );
80
+ )
77
81
  }
78
82
 
79
83
  function OAuthIcon({ provider }: { provider: string }) {
80
84
  switch (provider) {
81
85
  case 'google':
82
- return <GoogleIcon />;
86
+ return <GoogleIcon />
83
87
  case 'github':
84
- return <svg className="w-5 h-5" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>;
88
+ return (
89
+ <svg className="w-5 h-5" viewBox="0 0 24 24" fill="currentColor">
90
+ <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
91
+ </svg>
92
+ )
85
93
  case 'microsoft':
86
- return <MicrosoftIcon />;
94
+ return <MicrosoftIcon />
87
95
  default:
88
- return null;
96
+ return null
89
97
  }
90
98
  }
91
99
 
92
100
  function useCaptchaScript(provider: string | undefined, siteKey: string | null | undefined) {
93
- const [loaded, setLoaded] = useState(false);
101
+ const [loaded, setLoaded] = useState(false)
94
102
 
95
103
  useState(() => {
96
- if (typeof window === 'undefined' || !siteKey) return;
104
+ if (typeof window === 'undefined' || !siteKey) return
97
105
 
98
106
  if (provider === 'recaptcha') {
99
- const existing = document.querySelector('script[src*="recaptcha"]');
100
- if (existing) { setLoaded(true); return; }
101
- const script = document.createElement('script');
102
- script.src = `https://www.google.com/recaptcha/api.js?render=${siteKey}`;
103
- script.async = true;
104
- script.onload = () => setLoaded(true);
105
- document.head.appendChild(script);
107
+ const existing = document.querySelector('script[src*="recaptcha"]')
108
+ if (existing) {
109
+ setLoaded(true)
110
+ return
111
+ }
112
+ const script = document.createElement('script')
113
+ script.src = `https://www.google.com/recaptcha/api.js?render=${siteKey}`
114
+ script.async = true
115
+ script.onload = () => setLoaded(true)
116
+ document.head.appendChild(script)
106
117
  } else if (provider === 'turnstile') {
107
- const existing = document.querySelector('script[src*="turnstile"]');
108
- if (existing) { setLoaded(true); return; }
109
- const script = document.createElement('script');
110
- script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js';
111
- script.async = true;
112
- script.onload = () => setLoaded(true);
113
- document.head.appendChild(script);
118
+ const existing = document.querySelector('script[src*="turnstile"]')
119
+ if (existing) {
120
+ setLoaded(true)
121
+ return
122
+ }
123
+ const script = document.createElement('script')
124
+ script.src = 'https://challenges.cloudflare.com/turnstile/v0/api.js'
125
+ script.async = true
126
+ script.onload = () => setLoaded(true)
127
+ document.head.appendChild(script)
114
128
  }
115
- });
129
+ })
116
130
 
117
- return loaded;
131
+ return loaded
118
132
  }
119
133
 
120
134
  async function getCaptchaToken(provider: string, siteKey: string, action: string): Promise<string> {
121
135
  if (provider === 'recaptcha') {
122
- const grecaptcha = (window as any).grecaptcha;
123
- if (!grecaptcha) return '';
136
+ const grecaptcha = (window as any).grecaptcha
137
+ if (!grecaptcha) return ''
124
138
  return new Promise((resolve) => {
125
139
  grecaptcha.ready(() => {
126
- grecaptcha.execute(siteKey, { action }).then(resolve).catch(() => resolve(''));
127
- });
128
- });
140
+ grecaptcha
141
+ .execute(siteKey, { action })
142
+ .then(resolve)
143
+ .catch(() => resolve(''))
144
+ })
145
+ })
129
146
  }
130
147
 
131
148
  if (provider === 'turnstile') {
132
- const turnstile = (window as any).turnstile;
133
- if (!turnstile) return '';
149
+ const turnstile = (window as any).turnstile
150
+ if (!turnstile) return ''
134
151
  return new Promise((resolve) => {
135
- const container = document.createElement('div');
136
- container.style.display = 'none';
137
- document.body.appendChild(container);
152
+ const container = document.createElement('div')
153
+ container.style.display = 'none'
154
+ document.body.appendChild(container)
138
155
  turnstile.render(container, {
139
156
  sitekey: siteKey,
140
157
  action,
141
158
  callback: (token: string) => {
142
- container.remove();
143
- resolve(token);
159
+ container.remove()
160
+ resolve(token)
144
161
  },
145
162
  'error-callback': () => {
146
- container.remove();
147
- resolve('');
163
+ container.remove()
164
+ resolve('')
148
165
  },
149
- });
150
- });
166
+ })
167
+ })
151
168
  }
152
169
 
153
- return '';
170
+ return ''
154
171
  }
155
172
 
156
173
  export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: LoginProps) {
157
- const [email, setEmail] = useState('');
158
- const [password, setPassword] = useState('');
159
- const [showPassword, setShowPassword] = useState(false);
160
- const [submitting, setSubmitting] = useState(false);
161
- const [error, setError] = useState('');
174
+ const [email, setEmail] = useState('')
175
+ const [password, setPassword] = useState('')
176
+ const [showPassword, setShowPassword] = useState(false)
177
+ const [submitting, setSubmitting] = useState(false)
178
+ const [error, setError] = useState('')
162
179
 
163
- useCaptchaScript(captchaConfig?.provider, captchaConfig?.siteKey);
180
+ useCaptchaScript(captchaConfig?.provider, captchaConfig?.siteKey)
164
181
 
165
- const canSubmit = email.trim() && password && !submitting;
182
+ const canSubmit = email.trim() && password && !submitting
166
183
 
167
184
  const handleSubmit = async (e: FormEvent) => {
168
- e.preventDefault();
169
- if (!canSubmit) return;
185
+ e.preventDefault()
186
+ if (!canSubmit) return
170
187
 
171
- setError('');
172
- setSubmitting(true);
188
+ setError('')
189
+ setSubmitting(true)
173
190
 
174
191
  try {
175
- let captchaToken: string | undefined;
192
+ let captchaToken: string | undefined
176
193
  if (captchaConfig?.provider && captchaConfig.provider !== 'none' && captchaConfig.siteKey) {
177
- captchaToken = await getCaptchaToken(captchaConfig.provider, captchaConfig.siteKey, 'login');
194
+ captchaToken = await getCaptchaToken(captchaConfig.provider, captchaConfig.siteKey, 'login')
178
195
  if (!captchaToken) {
179
- setError('CAPTCHA verification failed. Please try again.');
180
- setSubmitting(false);
181
- return;
196
+ setError('CAPTCHA verification failed. Please try again.')
197
+ setSubmitting(false)
198
+ return
182
199
  }
183
200
  }
184
201
 
185
- const result = await onLogin(email.trim(), password, captchaToken);
202
+ const result = await onLogin(email.trim(), password, captchaToken)
186
203
 
187
204
  if (!result.success) {
188
- setError(result.error ?? 'Invalid email or password');
205
+ setError(result.error ?? 'Invalid email or password')
189
206
  }
190
207
  } catch (err) {
191
- setError(err instanceof Error ? err.message : 'An unexpected error occurred');
208
+ setError(err instanceof Error ? err.message : 'An unexpected error occurred')
192
209
  } finally {
193
- setSubmitting(false);
210
+ setSubmitting(false)
194
211
  }
195
- };
212
+ }
196
213
 
197
214
  const handleOAuthClick = (provider: string) => {
198
- window.location.href = `/api/cms/auth/oauth/${provider}`;
199
- };
215
+ window.location.href = `/api/cms/auth/oauth/${provider}`
216
+ }
200
217
 
201
- const enabledProviders = oauthProviders?.filter(
202
- (p) => ['google', 'github', 'microsoft'].includes(p),
203
- ) ?? [];
218
+ const enabledProviders =
219
+ oauthProviders?.filter((p) => ['google', 'github', 'microsoft'].includes(p)) ?? []
204
220
 
205
221
  return (
206
222
  <div className="min-h-screen flex items-center justify-center bg-gray-50 px-4">
@@ -213,7 +229,10 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
213
229
  <p className="text-gray-600 mt-2">Sign in to your account</p>
214
230
  </div>
215
231
 
216
- <form onSubmit={handleSubmit} className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm space-y-5">
232
+ <form
233
+ onSubmit={handleSubmit}
234
+ className="bg-white rounded-xl border border-gray-200 p-6 shadow-sm space-y-5"
235
+ >
217
236
  {error && (
218
237
  <div className="flex items-start gap-3 p-3 bg-red-50 border border-red-200 rounded-lg">
219
238
  <AlertTriangle className="w-5 h-5 text-red-600 mt-0.5 shrink-0" />
@@ -222,7 +241,9 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
222
241
  )}
223
242
 
224
243
  <div>
225
- <label htmlFor="login-email" className="block text-sm font-medium text-gray-700 mb-1.5">Email Address</label>
244
+ <label htmlFor="login-email" className="block text-sm font-medium text-gray-700 mb-1.5">
245
+ Email Address
246
+ </label>
226
247
  <input
227
248
  id="login-email"
228
249
  type="email"
@@ -238,7 +259,9 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
238
259
 
239
260
  <div>
240
261
  <div className="flex items-center justify-between mb-1.5">
241
- <label htmlFor="login-password" className="block text-sm font-medium text-gray-700">Password</label>
262
+ <label htmlFor="login-password" className="block text-sm font-medium text-gray-700">
263
+ Password
264
+ </label>
242
265
  {onNavigate && (
243
266
  <button
244
267
  type="button"
@@ -299,7 +322,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
299
322
 
300
323
  <div className="grid gap-3">
301
324
  {enabledProviders.map((provider) => {
302
- const colors = OAUTH_COLORS[provider] ?? OAUTH_COLORS.google;
325
+ const colors = OAUTH_COLORS[provider] ?? OAUTH_COLORS.google
303
326
  return (
304
327
  <button
305
328
  key={provider}
@@ -310,7 +333,7 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
310
333
  <OAuthIcon provider={provider} />
311
334
  {OAUTH_LABELS[provider] ?? provider}
312
335
  </button>
313
- );
336
+ )
314
337
  })}
315
338
  </div>
316
339
  </>
@@ -318,5 +341,5 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig }: Lo
318
341
  </form>
319
342
  </div>
320
343
  </div>
321
- );
344
+ )
322
345
  }