@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,48 @@
1
- 'use client';
1
+ 'use client'
2
2
 
3
3
  import {
4
- ChevronRight, ChevronDown, FolderOpen, Folder as FolderIcon,
5
- Plus, MoreHorizontal, Pencil, Trash2, FolderPlus, Clock,
6
- Inbox, LayoutGrid, Loader2,
7
- } from 'lucide-react';
8
- import { useState, useEffect, useCallback, useRef } from 'react';
9
- import { toast } from 'sonner';
10
- import { cmsApi } from '../lib/api.js';
4
+ ChevronRight,
5
+ ChevronDown,
6
+ FolderOpen,
7
+ Folder as FolderIcon,
8
+ Plus,
9
+ MoreHorizontal,
10
+ Pencil,
11
+ Trash2,
12
+ FolderPlus,
13
+ Clock,
14
+ Inbox,
15
+ LayoutGrid,
16
+ Loader2,
17
+ } from 'lucide-react'
18
+ import { useState, useEffect, useCallback, useRef } from 'react'
19
+ import { toast } from 'sonner'
20
+ import { cmsApi } from '../lib/api.js'
11
21
 
12
22
  export interface FolderNode {
13
- id: string;
14
- name: string;
15
- scope: string;
16
- parentId: string | null;
17
- position: number;
18
- children: FolderNode[];
23
+ id: string
24
+ name: string
25
+ scope: string
26
+ parentId: string | null
27
+ position: number
28
+ children: FolderNode[]
19
29
  }
20
30
 
21
- export type SmartFolder = 'all' | 'recent' | 'uncategorized';
31
+ export type SmartFolder = 'all' | 'recent' | 'uncategorized'
22
32
 
23
33
  export type FolderSelection =
24
34
  | { type: 'smart'; smart: SmartFolder }
25
- | { type: 'folder'; folderId: string };
35
+ | { type: 'folder'; folderId: string }
26
36
 
27
37
  export interface FolderTreeProps {
28
- scope: string;
29
- selected: FolderSelection;
30
- onSelect: (selection: FolderSelection) => void;
31
- itemCounts?: Record<string, number>;
32
- totalCount?: number;
33
- recentCount?: number;
34
- uncategorizedCount?: number;
35
- onDropItem?: (itemId: string, folderId: string | null) => void;
38
+ scope: string
39
+ selected: FolderSelection
40
+ onSelect: (selection: FolderSelection) => void
41
+ itemCounts?: Record<string, number>
42
+ totalCount?: number
43
+ recentCount?: number
44
+ uncategorizedCount?: number
45
+ onDropItem?: (itemId: string, folderId: string | null) => void
36
46
  }
37
47
 
38
48
  export function FolderTree({
@@ -45,134 +55,136 @@ export function FolderTree({
45
55
  uncategorizedCount,
46
56
  onDropItem,
47
57
  }: FolderTreeProps) {
48
- const [folders, setFolders] = useState<FolderNode[]>([]);
49
- const [loading, setLoading] = useState(true);
50
- const [expanded, setExpanded] = useState<Set<string>>(new Set());
51
- const [editingId, setEditingId] = useState<string | null>(null);
52
- const [editName, setEditName] = useState('');
53
- const [contextMenu, setContextMenu] = useState<{ id: string; x: number; y: number } | null>(null);
54
- const [creatingIn, setCreatingIn] = useState<string | null | false>(false);
55
- const [newFolderName, setNewFolderName] = useState('');
56
- const newFolderInputRef = useRef<HTMLInputElement>(null);
57
- const editInputRef = useRef<HTMLInputElement>(null);
58
- const [dragOverId, setDragOverId] = useState<string | null>(null);
58
+ const [folders, setFolders] = useState<FolderNode[]>([])
59
+ const [loading, setLoading] = useState(true)
60
+ const [expanded, setExpanded] = useState<Set<string>>(new Set())
61
+ const [editingId, setEditingId] = useState<string | null>(null)
62
+ const [editName, setEditName] = useState('')
63
+ const [contextMenu, setContextMenu] = useState<{ id: string; x: number; y: number } | null>(null)
64
+ const [creatingIn, setCreatingIn] = useState<string | null | false>(false)
65
+ const [newFolderName, setNewFolderName] = useState('')
66
+ const newFolderInputRef = useRef<HTMLInputElement>(null)
67
+ const editInputRef = useRef<HTMLInputElement>(null)
68
+ const [dragOverId, setDragOverId] = useState<string | null>(null)
59
69
 
60
70
  const fetchFolders = useCallback(async () => {
61
- const res = await cmsApi<FolderNode[]>(`/folders?scope=${scope}`);
62
- if (res.data) setFolders(res.data);
63
- setLoading(false);
64
- }, [scope]);
71
+ const res = await cmsApi<FolderNode[]>(`/folders?scope=${scope}`)
72
+ if (res.data) setFolders(res.data)
73
+ setLoading(false)
74
+ }, [scope])
65
75
 
66
- useEffect(() => { fetchFolders(); }, [fetchFolders]);
76
+ useEffect(() => {
77
+ fetchFolders()
78
+ }, [fetchFolders])
67
79
 
68
80
  useEffect(() => {
69
81
  if (creatingIn !== false && newFolderInputRef.current) {
70
- newFolderInputRef.current.focus();
82
+ newFolderInputRef.current.focus()
71
83
  }
72
- }, [creatingIn]);
84
+ }, [creatingIn])
73
85
 
74
86
  useEffect(() => {
75
87
  if (editingId && editInputRef.current) {
76
- editInputRef.current.focus();
77
- editInputRef.current.select();
88
+ editInputRef.current.focus()
89
+ editInputRef.current.select()
78
90
  }
79
- }, [editingId]);
91
+ }, [editingId])
80
92
 
81
93
  useEffect(() => {
82
- const handleClick = () => setContextMenu(null);
83
- document.addEventListener('click', handleClick);
84
- return () => document.removeEventListener('click', handleClick);
85
- }, []);
94
+ const handleClick = () => setContextMenu(null)
95
+ document.addEventListener('click', handleClick)
96
+ return () => document.removeEventListener('click', handleClick)
97
+ }, [])
86
98
 
87
99
  const toggleExpand = (id: string) => {
88
- setExpanded(prev => {
89
- const next = new Set(prev);
90
- if (next.has(id)) next.delete(id);
91
- else next.add(id);
92
- return next;
93
- });
94
- };
100
+ setExpanded((prev) => {
101
+ const next = new Set(prev)
102
+ if (next.has(id)) next.delete(id)
103
+ else next.add(id)
104
+ return next
105
+ })
106
+ }
95
107
 
96
108
  const handleCreate = async (parentId: string | null) => {
97
109
  if (!newFolderName.trim()) {
98
- setCreatingIn(false);
99
- return;
110
+ setCreatingIn(false)
111
+ return
100
112
  }
101
113
  const res = await cmsApi('/folders', {
102
114
  method: 'POST',
103
115
  body: JSON.stringify({ name: newFolderName.trim(), scope, parentId }),
104
- });
116
+ })
105
117
  if (res.error) {
106
- toast.error(res.error);
118
+ toast.error(res.error)
107
119
  } else {
108
- toast.success('Folder created');
109
- if (parentId) setExpanded(prev => new Set(prev).add(parentId));
110
- fetchFolders();
120
+ toast.success('Folder created')
121
+ if (parentId) setExpanded((prev) => new Set(prev).add(parentId))
122
+ fetchFolders()
111
123
  }
112
- setNewFolderName('');
113
- setCreatingIn(false);
114
- };
124
+ setNewFolderName('')
125
+ setCreatingIn(false)
126
+ }
115
127
 
116
128
  const handleRename = async (id: string) => {
117
129
  if (!editName.trim()) {
118
- setEditingId(null);
119
- return;
130
+ setEditingId(null)
131
+ return
120
132
  }
121
133
  const res = await cmsApi(`/folders/${id}`, {
122
134
  method: 'PUT',
123
135
  body: JSON.stringify({ name: editName.trim() }),
124
- });
125
- if (res.error) toast.error(res.error);
126
- else fetchFolders();
127
- setEditingId(null);
128
- };
136
+ })
137
+ if (res.error) toast.error(res.error)
138
+ else fetchFolders()
139
+ setEditingId(null)
140
+ }
129
141
 
130
142
  const handleDelete = async (id: string) => {
131
- const res = await cmsApi(`/folders/${id}`, { method: 'DELETE' });
132
- if (res.error) toast.error(res.error);
143
+ const res = await cmsApi(`/folders/${id}`, { method: 'DELETE' })
144
+ if (res.error) toast.error(res.error)
133
145
  else {
134
- toast.success('Folder deleted');
146
+ toast.success('Folder deleted')
135
147
  if (selected.type === 'folder' && selected.folderId === id) {
136
- onSelect({ type: 'smart', smart: 'all' });
148
+ onSelect({ type: 'smart', smart: 'all' })
137
149
  }
138
- fetchFolders();
150
+ fetchFolders()
139
151
  }
140
- };
152
+ }
141
153
 
142
154
  const isSelected = (sel: FolderSelection) => {
143
- if (selected.type !== sel.type) return false;
144
- if (sel.type === 'smart') return (selected as any).smart === sel.smart;
145
- return (selected as any).folderId === (sel as any).folderId;
146
- };
155
+ if (selected.type !== sel.type) return false
156
+ if (sel.type === 'smart') return (selected as any).smart === sel.smart
157
+ return (selected as any).folderId === (sel as any).folderId
158
+ }
147
159
 
148
160
  const handleDragOver = (e: React.DragEvent, folderId: string | null) => {
149
- e.preventDefault();
150
- e.stopPropagation();
151
- setDragOverId(folderId);
152
- };
161
+ e.preventDefault()
162
+ e.stopPropagation()
163
+ setDragOverId(folderId)
164
+ }
153
165
 
154
166
  const handleDragLeave = () => {
155
- setDragOverId(null);
156
- };
167
+ setDragOverId(null)
168
+ }
157
169
 
158
170
  const handleDrop = (e: React.DragEvent, folderId: string | null) => {
159
- e.preventDefault();
160
- e.stopPropagation();
161
- setDragOverId(null);
162
- const itemId = e.dataTransfer.getData('text/actuate-item-id');
171
+ e.preventDefault()
172
+ e.stopPropagation()
173
+ setDragOverId(null)
174
+ const itemId = e.dataTransfer.getData('text/actuate-item-id')
163
175
  if (itemId && onDropItem) {
164
- onDropItem(itemId, folderId);
176
+ onDropItem(itemId, folderId)
165
177
  }
166
- };
178
+ }
167
179
 
168
- const countForFolder = (id: string): number | undefined => itemCounts?.[id];
180
+ const countForFolder = (id: string): number | undefined => itemCounts?.[id]
169
181
 
170
182
  const renderFolder = (folder: FolderNode, depth: number) => {
171
- const isExpanded = expanded.has(folder.id);
172
- const hasChildren = folder.children.length > 0;
173
- const isActive = isSelected({ type: 'folder', folderId: folder.id });
174
- const isDragOver = dragOverId === folder.id;
175
- const count = countForFolder(folder.id);
183
+ const isExpanded = expanded.has(folder.id)
184
+ const hasChildren = folder.children.length > 0
185
+ const isActive = isSelected({ type: 'folder', folderId: folder.id })
186
+ const isDragOver = dragOverId === folder.id
187
+ const count = countForFolder(folder.id)
176
188
 
177
189
  return (
178
190
  <div key={folder.id}>
@@ -181,14 +193,14 @@ export function FolderTree({
181
193
  isActive
182
194
  ? 'bg-blue-50 text-blue-700 font-medium'
183
195
  : isDragOver
184
- ? 'bg-blue-100 ring-2 ring-blue-300'
185
- : 'text-gray-700 hover:bg-gray-100'
196
+ ? 'bg-blue-100 ring-2 ring-blue-300'
197
+ : 'text-gray-700 hover:bg-gray-100'
186
198
  }`}
187
199
  style={{ paddingLeft: `${8 + depth * 16}px` }}
188
200
  onClick={() => onSelect({ type: 'folder', folderId: folder.id })}
189
201
  onContextMenu={(e) => {
190
- e.preventDefault();
191
- setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY });
202
+ e.preventDefault()
203
+ setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY })
192
204
  }}
193
205
  onDragOver={(e) => handleDragOver(e, folder.id)}
194
206
  onDragLeave={handleDragLeave}
@@ -197,7 +209,10 @@ export function FolderTree({
197
209
  <button
198
210
  type="button"
199
211
  className={`p-0.5 rounded hover:bg-gray-200 transition-colors ${hasChildren ? '' : 'invisible'}`}
200
- onClick={(e) => { e.stopPropagation(); toggleExpand(folder.id); }}
212
+ onClick={(e) => {
213
+ e.stopPropagation()
214
+ toggleExpand(folder.id)
215
+ }}
201
216
  >
202
217
  {isExpanded ? (
203
218
  <ChevronDown className="w-3.5 h-3.5" />
@@ -220,8 +235,8 @@ export function FolderTree({
220
235
  onChange={(e) => setEditName(e.target.value)}
221
236
  onBlur={() => handleRename(folder.id)}
222
237
  onKeyDown={(e) => {
223
- if (e.key === 'Enter') handleRename(folder.id);
224
- if (e.key === 'Escape') setEditingId(null);
238
+ if (e.key === 'Enter') handleRename(folder.id)
239
+ if (e.key === 'Escape') setEditingId(null)
225
240
  }}
226
241
  className="flex-1 min-w-0 text-sm border border-blue-300 rounded px-1 py-0 focus:outline-none focus:ring-1 focus:ring-blue-500"
227
242
  onClick={(e) => e.stopPropagation()}
@@ -238,8 +253,8 @@ export function FolderTree({
238
253
  type="button"
239
254
  className="p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-200 transition-all"
240
255
  onClick={(e) => {
241
- e.stopPropagation();
242
- setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY });
256
+ e.stopPropagation()
257
+ setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY })
243
258
  }}
244
259
  >
245
260
  <MoreHorizontal className="w-3.5 h-3.5 text-gray-500" />
@@ -248,9 +263,12 @@ export function FolderTree({
248
263
 
249
264
  {isExpanded && (
250
265
  <div>
251
- {folder.children.map(child => renderFolder(child, depth + 1))}
266
+ {folder.children.map((child) => renderFolder(child, depth + 1))}
252
267
  {creatingIn === folder.id && (
253
- <div className="flex items-center gap-1 px-2 py-1" style={{ paddingLeft: `${24 + (depth + 1) * 16}px` }}>
268
+ <div
269
+ className="flex items-center gap-1 px-2 py-1"
270
+ style={{ paddingLeft: `${24 + (depth + 1) * 16}px` }}
271
+ >
254
272
  <FolderIcon className="w-4 h-4 text-gray-400 shrink-0" />
255
273
  <input
256
274
  ref={newFolderInputRef}
@@ -259,8 +277,11 @@ export function FolderTree({
259
277
  onChange={(e) => setNewFolderName(e.target.value)}
260
278
  onBlur={() => handleCreate(folder.id)}
261
279
  onKeyDown={(e) => {
262
- if (e.key === 'Enter') handleCreate(folder.id);
263
- if (e.key === 'Escape') { setCreatingIn(false); setNewFolderName(''); }
280
+ if (e.key === 'Enter') handleCreate(folder.id)
281
+ if (e.key === 'Escape') {
282
+ setCreatingIn(false)
283
+ setNewFolderName('')
284
+ }
264
285
  }}
265
286
  placeholder="Folder name..."
266
287
  className="flex-1 min-w-0 text-sm border border-blue-300 rounded px-1 py-0 focus:outline-none focus:ring-1 focus:ring-blue-500"
@@ -270,15 +291,15 @@ export function FolderTree({
270
291
  </div>
271
292
  )}
272
293
  </div>
273
- );
274
- };
294
+ )
295
+ }
275
296
 
276
297
  if (loading) {
277
298
  return (
278
299
  <div className="flex items-center justify-center py-8">
279
300
  <Loader2 className="w-5 h-5 animate-spin text-gray-400" />
280
301
  </div>
281
- );
302
+ )
282
303
  }
283
304
 
284
305
  return (
@@ -298,7 +319,9 @@ export function FolderTree({
298
319
  >
299
320
  <LayoutGrid className="w-4 h-4 shrink-0" />
300
321
  <span className="flex-1 text-left">All</span>
301
- {totalCount !== undefined && <span className="text-xs text-gray-400 tabular-nums">{totalCount}</span>}
322
+ {totalCount !== undefined && (
323
+ <span className="text-xs text-gray-400 tabular-nums">{totalCount}</span>
324
+ )}
302
325
  </button>
303
326
 
304
327
  <button
@@ -312,7 +335,9 @@ export function FolderTree({
312
335
  >
313
336
  <Clock className="w-4 h-4 shrink-0" />
314
337
  <span className="flex-1 text-left">Recent</span>
315
- {recentCount !== undefined && <span className="text-xs text-gray-400 tabular-nums">{recentCount}</span>}
338
+ {recentCount !== undefined && (
339
+ <span className="text-xs text-gray-400 tabular-nums">{recentCount}</span>
340
+ )}
316
341
  </button>
317
342
 
318
343
  <button
@@ -326,14 +351,16 @@ export function FolderTree({
326
351
  >
327
352
  <Inbox className="w-4 h-4 shrink-0" />
328
353
  <span className="flex-1 text-left">Uncategorized</span>
329
- {uncategorizedCount !== undefined && <span className="text-xs text-gray-400 tabular-nums">{uncategorizedCount}</span>}
354
+ {uncategorizedCount !== undefined && (
355
+ <span className="text-xs text-gray-400 tabular-nums">{uncategorizedCount}</span>
356
+ )}
330
357
  </button>
331
358
  </div>
332
359
 
333
360
  <div className="border-t border-gray-200 my-1" />
334
361
 
335
362
  <div className="flex-1 overflow-y-auto px-1 py-1 space-y-0.5">
336
- {folders.map(folder => renderFolder(folder, 0))}
363
+ {folders.map((folder) => renderFolder(folder, 0))}
337
364
 
338
365
  {creatingIn === null && (
339
366
  <div className="flex items-center gap-1 px-2 py-1">
@@ -345,8 +372,11 @@ export function FolderTree({
345
372
  onChange={(e) => setNewFolderName(e.target.value)}
346
373
  onBlur={() => handleCreate(null)}
347
374
  onKeyDown={(e) => {
348
- if (e.key === 'Enter') handleCreate(null);
349
- if (e.key === 'Escape') { setCreatingIn(false); setNewFolderName(''); }
375
+ if (e.key === 'Enter') handleCreate(null)
376
+ if (e.key === 'Escape') {
377
+ setCreatingIn(false)
378
+ setNewFolderName('')
379
+ }
350
380
  }}
351
381
  placeholder="Folder name..."
352
382
  className="flex-1 min-w-0 text-sm border border-blue-300 rounded px-1 py-0 focus:outline-none focus:ring-1 focus:ring-blue-500"
@@ -358,7 +388,10 @@ export function FolderTree({
358
388
  <div className="border-t border-gray-200 p-2">
359
389
  <button
360
390
  type="button"
361
- onClick={() => { setCreatingIn(null); setNewFolderName(''); }}
391
+ onClick={() => {
392
+ setCreatingIn(null)
393
+ setNewFolderName('')
394
+ }}
362
395
  className="w-full flex items-center gap-2 px-2 py-1.5 rounded-md text-sm text-gray-600 hover:bg-gray-100 transition-colors"
363
396
  >
364
397
  <Plus className="w-4 h-4" />
@@ -375,12 +408,12 @@ export function FolderTree({
375
408
  type="button"
376
409
  className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 transition-colors"
377
410
  onClick={() => {
378
- const folder = findFolder(folders, contextMenu.id);
411
+ const folder = findFolder(folders, contextMenu.id)
379
412
  if (folder) {
380
- setEditingId(folder.id);
381
- setEditName(folder.name);
413
+ setEditingId(folder.id)
414
+ setEditName(folder.name)
382
415
  }
383
- setContextMenu(null);
416
+ setContextMenu(null)
384
417
  }}
385
418
  >
386
419
  <Pencil className="w-3.5 h-3.5" />
@@ -390,10 +423,10 @@ export function FolderTree({
390
423
  type="button"
391
424
  className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 transition-colors"
392
425
  onClick={() => {
393
- setCreatingIn(contextMenu.id);
394
- setNewFolderName('');
395
- setExpanded(prev => new Set(prev).add(contextMenu.id));
396
- setContextMenu(null);
426
+ setCreatingIn(contextMenu.id)
427
+ setNewFolderName('')
428
+ setExpanded((prev) => new Set(prev).add(contextMenu.id))
429
+ setContextMenu(null)
397
430
  }}
398
431
  >
399
432
  <FolderPlus className="w-3.5 h-3.5" />
@@ -404,8 +437,8 @@ export function FolderTree({
404
437
  type="button"
405
438
  className="w-full flex items-center gap-2 px-3 py-1.5 text-sm text-red-600 hover:bg-red-50 transition-colors"
406
439
  onClick={() => {
407
- handleDelete(contextMenu.id);
408
- setContextMenu(null);
440
+ handleDelete(contextMenu.id)
441
+ setContextMenu(null)
409
442
  }}
410
443
  >
411
444
  <Trash2 className="w-3.5 h-3.5" />
@@ -414,14 +447,14 @@ export function FolderTree({
414
447
  </div>
415
448
  )}
416
449
  </div>
417
- );
450
+ )
418
451
  }
419
452
 
420
453
  function findFolder(nodes: FolderNode[], id: string): FolderNode | null {
421
454
  for (const n of nodes) {
422
- if (n.id === id) return n;
423
- const found = findFolder(n.children, id);
424
- if (found) return found;
455
+ if (n.id === id) return n
456
+ const found = findFolder(n.children, id)
457
+ if (found) return found
425
458
  }
426
- return null;
459
+ return null
427
460
  }