@actuate-media/cms-admin 0.10.0 → 0.12.0

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 (315) hide show
  1. package/LICENSE +21 -21
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +8 -5
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/__tests__/fields/component-block-helpers.test.d.ts +7 -0
  6. package/dist/__tests__/fields/component-block-helpers.test.d.ts.map +1 -0
  7. package/dist/__tests__/fields/component-block-helpers.test.js +592 -0
  8. package/dist/__tests__/fields/component-block-helpers.test.js.map +1 -0
  9. package/dist/__tests__/layout/primitives.test.d.ts +2 -0
  10. package/dist/__tests__/layout/primitives.test.d.ts.map +1 -0
  11. package/dist/__tests__/layout/primitives.test.js +34 -0
  12. package/dist/__tests__/layout/primitives.test.js.map +1 -0
  13. package/dist/__tests__/lib/cv.test.d.ts +2 -0
  14. package/dist/__tests__/lib/cv.test.d.ts.map +1 -0
  15. package/dist/__tests__/lib/cv.test.js +66 -0
  16. package/dist/__tests__/lib/cv.test.js.map +1 -0
  17. package/dist/actuate-admin.css +1 -1
  18. package/dist/assets/actuate-logo.d.ts +36 -0
  19. package/dist/assets/actuate-logo.d.ts.map +1 -0
  20. package/dist/assets/actuate-logo.js +15 -0
  21. package/dist/assets/actuate-logo.js.map +1 -0
  22. package/dist/components/Breadcrumbs.js +2 -2
  23. package/dist/components/CommandPalette.js +10 -10
  24. package/dist/components/ContentOverviewChart.js +3 -3
  25. package/dist/components/ErrorBoundary.js +1 -1
  26. package/dist/components/FocalPointPicker.js +2 -2
  27. package/dist/components/FolderTree.js +20 -20
  28. package/dist/components/LivePreview.js +3 -3
  29. package/dist/components/LocaleSwitcher.js +1 -1
  30. package/dist/components/MediaPickerModal.js +4 -4
  31. package/dist/components/PresenceIndicator.js +1 -1
  32. package/dist/components/SEOConfigPanel.d.ts +2 -0
  33. package/dist/components/SEOConfigPanel.d.ts.map +1 -0
  34. package/dist/components/SEOConfigPanel.js +174 -0
  35. package/dist/components/SEOConfigPanel.js.map +1 -0
  36. package/dist/components/SEOPanel.js +9 -9
  37. package/dist/components/SEOPerformance.js +2 -2
  38. package/dist/components/SchedulePublishDialog.js +1 -1
  39. package/dist/components/SharePreviewLinkDialog.js +1 -1
  40. package/dist/components/TipTapEditor.js +5 -5
  41. package/dist/components/VersionHistory.js +2 -2
  42. package/dist/components/ui/Badge.d.ts +33 -3
  43. package/dist/components/ui/Badge.d.ts.map +1 -1
  44. package/dist/components/ui/Badge.js +42 -8
  45. package/dist/components/ui/Badge.js.map +1 -1
  46. package/dist/components/ui/Button.d.ts +19 -8
  47. package/dist/components/ui/Button.d.ts.map +1 -1
  48. package/dist/components/ui/Button.js +35 -14
  49. package/dist/components/ui/Button.js.map +1 -1
  50. package/dist/components/ui/Card.d.ts +26 -0
  51. package/dist/components/ui/Card.d.ts.map +1 -0
  52. package/dist/components/ui/Card.js +45 -0
  53. package/dist/components/ui/Card.js.map +1 -0
  54. package/dist/components/ui/DataTable.js +1 -1
  55. package/dist/components/ui/Input.d.ts +15 -0
  56. package/dist/components/ui/Input.d.ts.map +1 -0
  57. package/dist/components/ui/Input.js +23 -0
  58. package/dist/components/ui/Input.js.map +1 -0
  59. package/dist/components/ui/SearchInput.js +1 -1
  60. package/dist/components/ui/Select.d.ts +16 -0
  61. package/dist/components/ui/Select.d.ts.map +1 -0
  62. package/dist/components/ui/Select.js +25 -0
  63. package/dist/components/ui/Select.js.map +1 -0
  64. package/dist/components/ui/Toast.js +1 -1
  65. package/dist/components/ui/index.d.ts +10 -4
  66. package/dist/components/ui/index.d.ts.map +1 -1
  67. package/dist/components/ui/index.js +5 -2
  68. package/dist/components/ui/index.js.map +1 -1
  69. package/dist/fields/BlockBuilderField.js +3 -3
  70. package/dist/fields/ComponentBlockField.d.ts +25 -0
  71. package/dist/fields/ComponentBlockField.d.ts.map +1 -0
  72. package/dist/fields/ComponentBlockField.js +74 -0
  73. package/dist/fields/ComponentBlockField.js.map +1 -0
  74. package/dist/fields/DateField.js +1 -1
  75. package/dist/fields/FieldRenderer.d.ts +3 -0
  76. package/dist/fields/FieldRenderer.d.ts.map +1 -1
  77. package/dist/fields/FieldRenderer.js +3 -1
  78. package/dist/fields/FieldRenderer.js.map +1 -1
  79. package/dist/fields/PropInput.d.ts +14 -0
  80. package/dist/fields/PropInput.d.ts.map +1 -0
  81. package/dist/fields/PropInput.js +163 -0
  82. package/dist/fields/PropInput.js.map +1 -0
  83. package/dist/fields/RelationshipField.js +3 -3
  84. package/dist/fields/TextField.js +1 -1
  85. package/dist/fields/component-block-helpers.d.ts +96 -0
  86. package/dist/fields/component-block-helpers.d.ts.map +1 -0
  87. package/dist/fields/component-block-helpers.js +323 -0
  88. package/dist/fields/component-block-helpers.js.map +1 -0
  89. package/dist/fields/index.d.ts +4 -0
  90. package/dist/fields/index.d.ts.map +1 -1
  91. package/dist/fields/index.js +2 -0
  92. package/dist/fields/index.js.map +1 -1
  93. package/dist/index.d.ts +4 -0
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +4 -0
  96. package/dist/index.js.map +1 -1
  97. package/dist/layout/Header.js +1 -1
  98. package/dist/layout/Layout.d.ts +14 -0
  99. package/dist/layout/Layout.d.ts.map +1 -1
  100. package/dist/layout/Layout.js +17 -11
  101. package/dist/layout/Layout.js.map +1 -1
  102. package/dist/layout/Sidebar.d.ts.map +1 -1
  103. package/dist/layout/Sidebar.js +21 -11
  104. package/dist/layout/Sidebar.js.map +1 -1
  105. package/dist/layout/primitives/AdminShell.d.ts +43 -0
  106. package/dist/layout/primitives/AdminShell.d.ts.map +1 -0
  107. package/dist/layout/primitives/AdminShell.js +51 -0
  108. package/dist/layout/primitives/AdminShell.js.map +1 -0
  109. package/dist/layout/primitives/Box.d.ts +19 -0
  110. package/dist/layout/primitives/Box.d.ts.map +1 -0
  111. package/dist/layout/primitives/Box.js +12 -0
  112. package/dist/layout/primitives/Box.js.map +1 -0
  113. package/dist/layout/primitives/Cluster.d.ts +27 -0
  114. package/dist/layout/primitives/Cluster.d.ts.map +1 -0
  115. package/dist/layout/primitives/Cluster.js +37 -0
  116. package/dist/layout/primitives/Cluster.js.map +1 -0
  117. package/dist/layout/primitives/Grid.d.ts +45 -0
  118. package/dist/layout/primitives/Grid.d.ts.map +1 -0
  119. package/dist/layout/primitives/Grid.js +59 -0
  120. package/dist/layout/primitives/Grid.js.map +1 -0
  121. package/dist/layout/primitives/PageContainer.d.ts +36 -0
  122. package/dist/layout/primitives/PageContainer.d.ts.map +1 -0
  123. package/dist/layout/primitives/PageContainer.js +41 -0
  124. package/dist/layout/primitives/PageContainer.js.map +1 -0
  125. package/dist/layout/primitives/Split.d.ts +34 -0
  126. package/dist/layout/primitives/Split.d.ts.map +1 -0
  127. package/dist/layout/primitives/Split.js +27 -0
  128. package/dist/layout/primitives/Split.js.map +1 -0
  129. package/dist/layout/primitives/Stack.d.ts +23 -0
  130. package/dist/layout/primitives/Stack.d.ts.map +1 -0
  131. package/dist/layout/primitives/Stack.js +34 -0
  132. package/dist/layout/primitives/Stack.js.map +1 -0
  133. package/dist/layout/primitives/index.d.ts +30 -0
  134. package/dist/layout/primitives/index.d.ts.map +1 -0
  135. package/dist/layout/primitives/index.js +22 -0
  136. package/dist/layout/primitives/index.js.map +1 -0
  137. package/dist/layout/primitives/tokens.d.ts +48 -0
  138. package/dist/layout/primitives/tokens.d.ts.map +1 -0
  139. package/dist/layout/primitives/tokens.js +54 -0
  140. package/dist/layout/primitives/tokens.js.map +1 -0
  141. package/dist/lib/cv.d.ts +53 -0
  142. package/dist/lib/cv.d.ts.map +1 -0
  143. package/dist/lib/cv.js +39 -0
  144. package/dist/lib/cv.js.map +1 -0
  145. package/dist/views/ApiKeys.js +7 -7
  146. package/dist/views/CollectionList.js +8 -8
  147. package/dist/views/Dashboard.d.ts.map +1 -1
  148. package/dist/views/Dashboard.js +333 -78
  149. package/dist/views/Dashboard.js.map +1 -1
  150. package/dist/views/DocumentEdit.js +3 -3
  151. package/dist/views/ForgotPassword.js +2 -2
  152. package/dist/views/FormEditor.js +5 -5
  153. package/dist/views/FormSubmissions.js +6 -6
  154. package/dist/views/Forms.js +2 -2
  155. package/dist/views/Login.d.ts +16 -1
  156. package/dist/views/Login.d.ts.map +1 -1
  157. package/dist/views/Login.js +17 -7
  158. package/dist/views/Login.js.map +1 -1
  159. package/dist/views/MediaBrowser.js +16 -16
  160. package/dist/views/PageEditor.js +2 -2
  161. package/dist/views/Pages.js +10 -10
  162. package/dist/views/PostEditor.js +2 -2
  163. package/dist/views/Posts.js +4 -4
  164. package/dist/views/Redirects.js +4 -4
  165. package/dist/views/ResetPassword.js +2 -2
  166. package/dist/views/SEO.js +6 -6
  167. package/dist/views/ScriptTagEditor.js +4 -4
  168. package/dist/views/ScriptTags.js +2 -2
  169. package/dist/views/Settings.d.ts.map +1 -1
  170. package/dist/views/Settings.js +9 -8
  171. package/dist/views/Settings.js.map +1 -1
  172. package/dist/views/SetupWizard.js +2 -2
  173. package/dist/views/Users.js +4 -4
  174. package/dist/views/page-builder/AIBlockAssist.js +1 -1
  175. package/dist/views/page-builder/AIGenerateDialog.js +10 -10
  176. package/dist/views/page-builder/BlockEditor.js +10 -10
  177. package/dist/views/page-builder/BlockPicker.js +4 -4
  178. package/dist/views/page-builder/BottomBar.js +1 -1
  179. package/dist/views/page-builder/BuilderToolbar.js +2 -2
  180. package/dist/views/page-builder/ContextPanel.js +2 -2
  181. package/dist/views/page-builder/DesignScore.js +9 -9
  182. package/dist/views/page-builder/NodeSettings.js +8 -8
  183. package/dist/views/page-builder/PageBuilder.js +3 -3
  184. package/dist/views/page-builder/PageSettings.js +1 -1
  185. package/dist/views/page-builder/PageTemplates.js +2 -2
  186. package/dist/views/page-builder/SEOPanel.js +13 -13
  187. package/dist/views/page-builder/SavedSections.js +5 -5
  188. package/dist/views/page-builder/TemplatePicker.js +2 -2
  189. package/dist/views/page-builder/block-renderers/CTAPreview.js +5 -5
  190. package/dist/views/page-builder/block-renderers/CardsPreview.js +1 -1
  191. package/dist/views/page-builder/block-renderers/CodePreview.js +1 -1
  192. package/dist/views/page-builder/block-renderers/FAQPreview.js +3 -3
  193. package/dist/views/page-builder/block-renderers/FallbackPreview.js +1 -1
  194. package/dist/views/page-builder/block-renderers/FormPreview.js +3 -3
  195. package/dist/views/page-builder/block-renderers/GalleryPreview.js +5 -5
  196. package/dist/views/page-builder/block-renderers/HeroPreview.js +3 -3
  197. package/dist/views/page-builder/block-renderers/ImagePreview.js +3 -3
  198. package/dist/views/page-builder/block-renderers/TextPreview.js +3 -3
  199. package/dist/views/page-builder/block-renderers/VideoPreview.js +4 -4
  200. package/dist/views/page-builder/canvas/BlockRenderer.js +1 -1
  201. package/dist/views/page-builder/canvas/BuilderCanvas.js +3 -3
  202. package/dist/views/page-builder/canvas/ColumnRenderer.js +2 -2
  203. package/dist/views/page-builder/canvas/ContainerRenderer.js +2 -2
  204. package/dist/views/page-builder/canvas/RowRenderer.js +2 -2
  205. package/dist/views/page-builder/canvas/SectionRenderer.js +2 -2
  206. package/package.json +14 -3
  207. package/src/AdminRoot.tsx +21 -11
  208. package/src/__tests__/fields/component-block-helpers.test.ts +674 -0
  209. package/src/__tests__/layout/primitives.test.ts +37 -0
  210. package/src/__tests__/lib/cv.test.ts +74 -0
  211. package/src/assets/actuate-logo.tsx +72 -0
  212. package/src/components/Breadcrumbs.tsx +6 -6
  213. package/src/components/CommandPalette.tsx +34 -34
  214. package/src/components/ContentOverviewChart.tsx +3 -3
  215. package/src/components/ErrorBoundary.tsx +3 -3
  216. package/src/components/FocalPointPicker.tsx +4 -4
  217. package/src/components/FolderTree.tsx +38 -38
  218. package/src/components/LivePreview.tsx +16 -16
  219. package/src/components/LocaleSwitcher.tsx +7 -7
  220. package/src/components/MediaPickerModal.tsx +21 -21
  221. package/src/components/PresenceIndicator.tsx +2 -2
  222. package/src/components/SEOConfigPanel.tsx +582 -0
  223. package/src/components/SEOPanel.tsx +46 -46
  224. package/src/components/SEOPerformance.tsx +21 -21
  225. package/src/components/SchedulePublishDialog.tsx +4 -4
  226. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  227. package/src/components/TipTapEditor.tsx +33 -33
  228. package/src/components/VersionHistory.tsx +16 -16
  229. package/src/components/ui/Badge.tsx +66 -14
  230. package/src/components/ui/Button.tsx +70 -33
  231. package/src/components/ui/Card.tsx +101 -0
  232. package/src/components/ui/DataTable.tsx +1 -1
  233. package/src/components/ui/Input.tsx +35 -0
  234. package/src/components/ui/SearchInput.tsx +4 -4
  235. package/src/components/ui/Select.tsx +56 -0
  236. package/src/components/ui/Toast.tsx +1 -1
  237. package/src/components/ui/index.ts +18 -4
  238. package/src/fields/BlockBuilderField.tsx +3 -3
  239. package/src/fields/ComponentBlockField.tsx +179 -0
  240. package/src/fields/DateField.tsx +1 -1
  241. package/src/fields/FieldRenderer.tsx +8 -0
  242. package/src/fields/PropInput.tsx +552 -0
  243. package/src/fields/RelationshipField.tsx +10 -10
  244. package/src/fields/TextField.tsx +1 -1
  245. package/src/fields/component-block-helpers.ts +341 -0
  246. package/src/fields/index.ts +4 -0
  247. package/src/index.ts +35 -0
  248. package/src/layout/Header.tsx +28 -28
  249. package/src/layout/Layout.tsx +39 -46
  250. package/src/layout/Sidebar.tsx +37 -64
  251. package/src/layout/primitives/AdminShell.tsx +118 -0
  252. package/src/layout/primitives/Box.tsx +30 -0
  253. package/src/layout/primitives/Cluster.tsx +74 -0
  254. package/src/layout/primitives/Grid.tsx +120 -0
  255. package/src/layout/primitives/PageContainer.tsx +96 -0
  256. package/src/layout/primitives/Split.tsx +73 -0
  257. package/src/layout/primitives/Stack.tsx +67 -0
  258. package/src/layout/primitives/index.ts +36 -0
  259. package/src/layout/primitives/tokens.ts +76 -0
  260. package/src/lib/cv.ts +96 -0
  261. package/src/styles/build-input.css +1 -1
  262. package/src/views/ApiKeys.tsx +57 -57
  263. package/src/views/CollectionList.tsx +30 -30
  264. package/src/views/Dashboard.tsx +737 -186
  265. package/src/views/DocumentEdit.tsx +9 -9
  266. package/src/views/ForgotPassword.tsx +18 -18
  267. package/src/views/FormEditor.tsx +75 -75
  268. package/src/views/FormSubmissions.tsx +76 -76
  269. package/src/views/Forms.tsx +27 -27
  270. package/src/views/Login.tsx +65 -25
  271. package/src/views/MediaBrowser.tsx +127 -127
  272. package/src/views/PageEditor.tsx +25 -25
  273. package/src/views/Pages.tsx +59 -59
  274. package/src/views/PostEditor.tsx +37 -37
  275. package/src/views/Posts.tsx +48 -48
  276. package/src/views/Redirects.tsx +21 -21
  277. package/src/views/ResetPassword.tsx +28 -28
  278. package/src/views/SEO.tsx +144 -144
  279. package/src/views/ScriptTagEditor.tsx +24 -24
  280. package/src/views/ScriptTags.tsx +10 -10
  281. package/src/views/Settings.tsx +88 -80
  282. package/src/views/SetupWizard.tsx +28 -28
  283. package/src/views/Users.tsx +20 -20
  284. package/src/views/page-builder/AIBlockAssist.tsx +1 -1
  285. package/src/views/page-builder/AIGenerateDialog.tsx +63 -63
  286. package/src/views/page-builder/BlockEditor.tsx +26 -26
  287. package/src/views/page-builder/BlockPicker.tsx +22 -22
  288. package/src/views/page-builder/BottomBar.tsx +8 -8
  289. package/src/views/page-builder/BuilderToolbar.tsx +17 -17
  290. package/src/views/page-builder/ContextPanel.tsx +3 -3
  291. package/src/views/page-builder/DesignScore.tsx +21 -21
  292. package/src/views/page-builder/NodeSettings.tsx +27 -27
  293. package/src/views/page-builder/PageBuilder.tsx +11 -11
  294. package/src/views/page-builder/PageSettings.tsx +4 -4
  295. package/src/views/page-builder/PageTemplates.tsx +18 -18
  296. package/src/views/page-builder/SEOPanel.tsx +53 -53
  297. package/src/views/page-builder/SavedSections.tsx +37 -37
  298. package/src/views/page-builder/TemplatePicker.tsx +17 -17
  299. package/src/views/page-builder/block-renderers/CTAPreview.tsx +13 -13
  300. package/src/views/page-builder/block-renderers/CardsPreview.tsx +5 -5
  301. package/src/views/page-builder/block-renderers/CodePreview.tsx +6 -6
  302. package/src/views/page-builder/block-renderers/FAQPreview.tsx +13 -13
  303. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +3 -3
  304. package/src/views/page-builder/block-renderers/FormPreview.tsx +20 -20
  305. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +8 -8
  306. package/src/views/page-builder/block-renderers/HeroPreview.tsx +16 -16
  307. package/src/views/page-builder/block-renderers/ImagePreview.tsx +4 -4
  308. package/src/views/page-builder/block-renderers/TextPreview.tsx +14 -14
  309. package/src/views/page-builder/block-renderers/VideoPreview.tsx +12 -12
  310. package/src/views/page-builder/canvas/BlockRenderer.tsx +4 -4
  311. package/src/views/page-builder/canvas/BuilderCanvas.tsx +6 -6
  312. package/src/views/page-builder/canvas/ColumnRenderer.tsx +3 -3
  313. package/src/views/page-builder/canvas/ContainerRenderer.tsx +2 -2
  314. package/src/views/page-builder/canvas/RowRenderer.tsx +2 -2
  315. package/src/views/page-builder/canvas/SectionRenderer.tsx +2 -2
@@ -117,40 +117,40 @@ export function CommandPalette({ open, onOpenChange, onNavigate }) {
117
117
  return null;
118
118
  const hasQuery = search.trim().length > 0;
119
119
  const hasResults = documents.length > 0 || media.length > 0 || users.length > 0;
120
- return (_jsx("div", { className: "fixed inset-0 z-50 bg-black/50 flex items-start justify-center pt-[20vh] px-4", onClick: () => {
120
+ return (_jsx("div", { className: "fixed inset-0 z-50 flex items-start justify-center bg-black/50 px-4 pt-[20vh]", onClick: () => {
121
121
  onOpenChange(false);
122
122
  setSearch('');
123
- }, role: "presentation", children: _jsx("div", { role: "dialog", "aria-modal": "true", className: "w-full max-w-2xl", onClick: (e) => e.stopPropagation(), children: _jsxs(Command, { className: "bg-white rounded-lg shadow-2xl w-full overflow-hidden", onKeyDown: (e) => {
123
+ }, role: "presentation", children: _jsx("div", { role: "dialog", "aria-modal": "true", className: "w-full max-w-2xl", onClick: (e) => e.stopPropagation(), children: _jsxs(Command, { className: "w-full overflow-hidden rounded-lg bg-white shadow-2xl", onKeyDown: (e) => {
124
124
  if (e.key === 'Escape') {
125
125
  onOpenChange(false);
126
126
  setSearch('');
127
127
  }
128
- }, shouldFilter: !hasQuery, children: [_jsxs("div", { className: "flex items-center border-b border-gray-200 px-4", children: [_jsx(Search, { className: "w-5 h-5 text-gray-400 mr-3 shrink-0" }), _jsx(Command.Input, { value: search, onValueChange: setSearch, placeholder: "Search or jump to...", className: "w-full py-4 text-base bg-transparent focus:outline-none placeholder:text-gray-400" }), loading && (_jsx("div", { className: "w-4 h-4 border-2 border-gray-300 border-t-gray-600 rounded-full animate-spin shrink-0 mr-2" })), _jsx("kbd", { className: "hidden sm:inline-block px-2 py-1 text-xs font-mono bg-gray-100 text-gray-600 rounded shrink-0", children: "ESC" })] }), _jsxs(Command.List, { className: "max-h-[400px] overflow-y-auto p-2", children: [_jsx(Command.Empty, { className: "py-6 text-center text-sm text-gray-500", children: loading ? 'Searching...' : 'No results found.' }), !hasQuery && recentItems.length > 0 && (_jsxs(Command.Group, { heading: "Recent", className: "px-2 py-2", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "RECENT" }), recentItems.map((item) => (_jsxs(Command.Item, { value: `recent ${item.label}`, onSelect: () => handleSelect(item.path, item), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Clock, { className: "w-4 h-4 text-gray-400" }), _jsx("span", { children: item.label }), _jsx("span", { className: "ml-auto text-xs text-gray-400 capitalize", children: item.type })] }, `recent-${item.id}`)))] })), hasQuery && documents.length > 0 && (_jsxs(Command.Group, { heading: "Documents", className: "px-2 py-2", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "DOCUMENTS" }), documents.map((doc) => (_jsxs(Command.Item, { value: doc.title ?? doc.slug ?? doc.id, onSelect: () => handleSelect(`/collections/${doc.collection}/${doc.id}`, {
128
+ }, shouldFilter: !hasQuery, children: [_jsxs("div", { className: "flex items-center border-b border-gray-200 px-4", children: [_jsx(Search, { className: "mr-3 h-5 w-5 shrink-0 text-gray-400" }), _jsx(Command.Input, { value: search, onValueChange: setSearch, placeholder: "Search or jump to...", className: "w-full bg-transparent py-4 text-base placeholder:text-gray-400 focus:outline-none" }), loading && (_jsx("div", { className: "mr-2 h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-gray-300 border-t-gray-600" })), _jsx("kbd", { className: "hidden shrink-0 rounded bg-gray-100 px-2 py-1 font-mono text-xs text-gray-600 sm:inline-block", children: "ESC" })] }), _jsxs(Command.List, { className: "max-h-[400px] overflow-y-auto p-2", children: [_jsx(Command.Empty, { className: "py-6 text-center text-sm text-gray-500", children: loading ? 'Searching...' : 'No results found.' }), !hasQuery && recentItems.length > 0 && (_jsxs(Command.Group, { heading: "Recent", className: "px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "RECENT" }), recentItems.map((item) => (_jsxs(Command.Item, { value: `recent ${item.label}`, onSelect: () => handleSelect(item.path, item), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Clock, { className: "h-4 w-4 text-gray-400" }), _jsx("span", { children: item.label }), _jsx("span", { className: "ml-auto text-xs text-gray-400 capitalize", children: item.type })] }, `recent-${item.id}`)))] })), hasQuery && documents.length > 0 && (_jsxs(Command.Group, { heading: "Documents", className: "px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "DOCUMENTS" }), documents.map((doc) => (_jsxs(Command.Item, { value: doc.title ?? doc.slug ?? doc.id, onSelect: () => handleSelect(`/collections/${doc.collection}/${doc.id}`, {
129
129
  id: `doc-${doc.id}`,
130
130
  label: doc.title ?? doc.slug ?? doc.id,
131
131
  path: `/collections/${doc.collection}/${doc.id}`,
132
132
  type: 'document',
133
- }), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(FileText, { className: "w-4 h-4 text-gray-500" }), _jsxs("div", { className: "flex flex-col min-w-0", children: [_jsx("span", { className: "truncate", children: doc.title ?? doc.slug ?? doc.id }), _jsxs("span", { className: "text-xs text-gray-400", children: [doc.collection, " \u00B7 ", doc.status] })] })] }, `doc-${doc.id}`)))] })), hasQuery && media.length > 0 && (_jsxs(Command.Group, { heading: "Media", className: "px-2 py-2 mt-1", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "MEDIA" }), media.map((m) => (_jsxs(Command.Item, { value: m.filename, onSelect: () => handleSelect(`/media?selected=${m.id}`, {
133
+ }), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(FileText, { className: "h-4 w-4 text-gray-500" }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate", children: doc.title ?? doc.slug ?? doc.id }), _jsxs("span", { className: "text-xs text-gray-400", children: [doc.collection, " \u00B7 ", doc.status] })] })] }, `doc-${doc.id}`)))] })), hasQuery && media.length > 0 && (_jsxs(Command.Group, { heading: "Media", className: "mt-1 px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "MEDIA" }), media.map((m) => (_jsxs(Command.Item, { value: m.filename, onSelect: () => handleSelect(`/media?selected=${m.id}`, {
134
134
  id: `media-${m.id}`,
135
135
  label: m.filename,
136
136
  path: `/media?selected=${m.id}`,
137
137
  type: 'media',
138
- }), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Image, { className: "w-4 h-4 text-gray-500" }), _jsxs("div", { className: "flex flex-col min-w-0", children: [_jsx("span", { className: "truncate", children: m.filename }), _jsx("span", { className: "text-xs text-gray-400", children: m.mimeType })] })] }, `media-${m.id}`)))] })), hasQuery && users.length > 0 && (_jsxs(Command.Group, { heading: "Users", className: "px-2 py-2 mt-1", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "USERS" }), users.map((u) => (_jsxs(Command.Item, { value: `${u.name} ${u.email}`, onSelect: () => handleSelect(`/users?selected=${u.id}`, {
138
+ }), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Image, { className: "h-4 w-4 text-gray-500" }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate", children: m.filename }), _jsx("span", { className: "text-xs text-gray-400", children: m.mimeType })] })] }, `media-${m.id}`)))] })), hasQuery && users.length > 0 && (_jsxs(Command.Group, { heading: "Users", className: "mt-1 px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "USERS" }), users.map((u) => (_jsxs(Command.Item, { value: `${u.name} ${u.email}`, onSelect: () => handleSelect(`/users?selected=${u.id}`, {
139
139
  id: `user-${u.id}`,
140
140
  label: u.name,
141
141
  path: `/users?selected=${u.id}`,
142
142
  type: 'user',
143
- }), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Users, { className: "w-4 h-4 text-gray-500" }), _jsxs("div", { className: "flex flex-col min-w-0", children: [_jsx("span", { className: "truncate", children: u.name }), _jsxs("span", { className: "text-xs text-gray-400", children: [u.email, " \u00B7 ", u.role] })] })] }, `user-${u.id}`)))] })), (!hasQuery || !hasResults) && (_jsxs(Command.Group, { heading: "Navigation", className: "px-2 py-2", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "NAVIGATION" }), navigationCommands.map((cmd) => {
143
+ }), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Users, { className: "h-4 w-4 text-gray-500" }), _jsxs("div", { className: "flex min-w-0 flex-col", children: [_jsx("span", { className: "truncate", children: u.name }), _jsxs("span", { className: "text-xs text-gray-400", children: [u.email, " \u00B7 ", u.role] })] })] }, `user-${u.id}`)))] })), (!hasQuery || !hasResults) && (_jsxs(Command.Group, { heading: "Navigation", className: "px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "NAVIGATION" }), navigationCommands.map((cmd) => {
144
144
  const Icon = cmd.icon;
145
- return (_jsxs(Command.Item, { value: cmd.label, onSelect: () => handleSelect(cmd.action), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Icon, { className: "w-4 h-4 text-gray-500" }), _jsx("span", { children: cmd.label })] }, cmd.id));
146
- })] })), _jsxs(Command.Group, { heading: "Actions", className: "px-2 py-2 mt-2", children: [_jsx("div", { className: "text-xs font-medium text-gray-500 mb-2", children: "ACTIONS" }), staticActions.map((cmd) => {
145
+ return (_jsxs(Command.Item, { value: cmd.label, onSelect: () => handleSelect(cmd.action), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Icon, { className: "h-4 w-4 text-gray-500" }), _jsx("span", { children: cmd.label })] }, cmd.id));
146
+ })] })), _jsxs(Command.Group, { heading: "Actions", className: "mt-2 px-2 py-2", children: [_jsx("div", { className: "mb-2 text-xs font-medium text-gray-500", children: "ACTIONS" }), staticActions.map((cmd) => {
147
147
  const Icon = cmd.icon;
148
148
  return (_jsxs(Command.Item, { value: cmd.label, onSelect: () => handleSelect(cmd.action, {
149
149
  id: cmd.id,
150
150
  label: cmd.label,
151
151
  path: cmd.action,
152
152
  type: 'action',
153
- }), className: "flex items-center gap-3 px-3 py-2 rounded-lg cursor-pointer hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Icon, { className: "w-4 h-4 text-gray-500" }), _jsx("span", { children: cmd.label })] }, cmd.id));
154
- })] })] }), _jsx("div", { className: "border-t border-gray-200 px-4 py-3 bg-gray-50 flex items-center justify-between text-xs text-gray-500", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("kbd", { className: "px-1.5 py-0.5 bg-white border border-gray-300 rounded text-[10px]", children: "\u2191" }), _jsx("kbd", { className: "px-1.5 py-0.5 bg-white border border-gray-300 rounded text-[10px]", children: "\u2193" }), "to navigate"] }), _jsxs("span", { className: "flex items-center gap-1", children: [_jsx("kbd", { className: "px-1.5 py-0.5 bg-white border border-gray-300 rounded text-[10px]", children: "\u21B5" }), "to select"] })] }) })] }) }) }));
153
+ }), className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100", children: [_jsx(Icon, { className: "h-4 w-4 text-gray-500" }), _jsx("span", { children: cmd.label })] }, cmd.id));
154
+ })] })] }), _jsx("div", { className: "flex items-center justify-between border-t border-gray-200 bg-gray-50 px-4 py-3 text-xs text-gray-500", children: _jsxs("div", { className: "flex items-center gap-4", children: [_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("kbd", { className: "rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]", children: "\u2191" }), _jsx("kbd", { className: "rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]", children: "\u2193" }), "to navigate"] }), _jsxs("span", { className: "flex items-center gap-1", children: [_jsx("kbd", { className: "rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]", children: "\u21B5" }), "to select"] })] }) })] }) }) }));
155
155
  }
156
156
  //# sourceMappingURL=CommandPalette.js.map
@@ -10,11 +10,11 @@ export function ContentOverviewChart({ published, drafts, scheduled }) {
10
10
  { name: 'Scheduled', value: scheduled },
11
11
  ];
12
12
  if (total === 0) {
13
- return (_jsx("div", { className: "flex items-center justify-center h-full text-sm text-gray-400", children: "No content yet" }));
13
+ return (_jsx("div", { className: "flex h-full items-center justify-center text-sm text-gray-400", children: "No content yet" }));
14
14
  }
15
- return (_jsxs("div", { className: "flex items-center gap-6", children: [_jsx("div", { className: "w-36 h-36 shrink-0", children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsx(PieChart, { children: _jsx(Pie, { data: data, cx: "50%", cy: "50%", innerRadius: 38, outerRadius: 65, dataKey: "value", strokeWidth: 2, stroke: "#fff", children: data.map((_, idx) => (_jsx(Cell, { fill: COLORS[idx] }, idx))) }) }) }) }), _jsx("div", { className: "space-y-3", children: data.map((entry, idx) => {
15
+ return (_jsxs("div", { className: "flex items-center gap-6", children: [_jsx("div", { className: "h-36 w-36 shrink-0", children: _jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsx(PieChart, { children: _jsx(Pie, { data: data, cx: "50%", cy: "50%", innerRadius: 38, outerRadius: 65, dataKey: "value", strokeWidth: 2, stroke: "#fff", children: data.map((_, idx) => (_jsx(Cell, { fill: COLORS[idx] }, idx))) }) }) }) }), _jsx("div", { className: "space-y-3", children: data.map((entry, idx) => {
16
16
  const pct = total > 0 ? Math.round((entry.value / total) * 100) : 0;
17
- return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "w-2.5 h-2.5 rounded-full shrink-0", style: { backgroundColor: COLORS[idx] } }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "text-sm text-gray-700", children: entry.name }), _jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-lg font-semibold text-gray-900", children: entry.value.toLocaleString() }), _jsxs("span", { className: "text-xs text-gray-400", children: [pct, "%"] })] })] })] }, entry.name));
17
+ return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "h-2.5 w-2.5 shrink-0 rounded-full", style: { backgroundColor: COLORS[idx] } }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "text-sm text-gray-700", children: entry.name }), _jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-lg font-semibold text-gray-900", children: entry.value.toLocaleString() }), _jsxs("span", { className: "text-xs text-gray-400", children: [pct, "%"] })] })] })] }, entry.name));
18
18
  }) })] }));
19
19
  }
20
20
  //# sourceMappingURL=ContentOverviewChart.js.map
@@ -16,7 +16,7 @@ export class ErrorBoundary extends Component {
16
16
  if (this.state.hasError) {
17
17
  if (this.props.fallback)
18
18
  return this.props.fallback;
19
- return (_jsx("div", { className: "flex min-h-[200px] items-center justify-center p-6", children: _jsxs("div", { className: "text-center", children: [_jsx("h2", { className: "text-lg font-medium text-foreground mb-2", children: "Something went wrong" }), _jsx("p", { className: "text-sm text-muted-foreground mb-4", children: this.state.error?.message ?? 'An unexpected error occurred' }), _jsx("button", { onClick: () => this.setState({ hasError: false, error: null }), className: "px-4 py-2 text-sm font-medium text-primary-foreground bg-primary rounded-md hover:bg-primary/90 transition-colors", children: "Try Again" })] }) }));
19
+ return (_jsx("div", { className: "flex min-h-[200px] items-center justify-center p-6", children: _jsxs("div", { className: "text-center", children: [_jsx("h2", { className: "text-foreground mb-2 text-lg font-medium", children: "Something went wrong" }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: this.state.error?.message ?? 'An unexpected error occurred' }), _jsx("button", { onClick: () => this.setState({ hasError: false, error: null }), className: "text-primary-foreground bg-primary hover:bg-primary/90 rounded-md px-4 py-2 text-sm font-medium transition-colors", children: "Try Again" })] }) }));
20
20
  }
21
21
  return this.props.children;
22
22
  }
@@ -13,9 +13,9 @@ export function FocalPointPicker({ imageUrl, focalX, focalY, onChange }) {
13
13
  const y = Math.max(0, Math.min(1, (e.clientY - rect.top) / rect.height));
14
14
  onChange(Math.round(x * 100) / 100, Math.round(y * 100) / 100);
15
15
  }, [onChange]);
16
- return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-[var(--foreground)]", children: [_jsx(Crosshair, { className: "w-4 h-4" }), "Focal Point"] }), _jsxs("div", { ref: containerRef, className: "relative rounded-lg overflow-hidden border border-[var(--border)] cursor-crosshair select-none", style: { maxHeight: '200px' }, onClick: handlePosition, onMouseDown: () => setDragging(true), onMouseUp: () => setDragging(false), onMouseLeave: () => setDragging(false), onMouseMove: (e) => {
16
+ return (_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-[var(--foreground)]", children: [_jsx(Crosshair, { className: "h-4 w-4" }), "Focal Point"] }), _jsxs("div", { ref: containerRef, className: "relative cursor-crosshair overflow-hidden rounded-lg border border-[var(--border)] select-none", style: { maxHeight: '200px' }, onClick: handlePosition, onMouseDown: () => setDragging(true), onMouseUp: () => setDragging(false), onMouseLeave: () => setDragging(false), onMouseMove: (e) => {
17
17
  if (dragging)
18
18
  handlePosition(e);
19
- }, children: [_jsx("img", { src: imageUrl, alt: "Focal point preview", className: "w-full h-full object-contain", draggable: false }), _jsx("div", { className: "absolute w-6 h-6 -ml-3 -mt-3 rounded-full border-2 border-white shadow-lg bg-blue-500/50 pointer-events-none", style: { left: `${focalX * 100}%`, top: `${focalY * 100}%` }, children: _jsx("div", { className: "absolute inset-1 rounded-full bg-white" }) })] }), _jsxs("p", { className: "text-xs text-[var(--muted-foreground)]", children: ["Click or drag to set the focal point (", Math.round(focalX * 100), "%,", ' ', Math.round(focalY * 100), "%)"] })] }));
19
+ }, children: [_jsx("img", { src: imageUrl, alt: "Focal point preview", className: "h-full w-full object-contain", draggable: false }), _jsx("div", { className: "pointer-events-none absolute -mt-3 -ml-3 h-6 w-6 rounded-full border-2 border-white bg-blue-500/50 shadow-lg", style: { left: `${focalX * 100}%`, top: `${focalY * 100}%` }, children: _jsx("div", { className: "absolute inset-1 rounded-full bg-white" }) })] }), _jsxs("p", { className: "text-xs text-[var(--muted-foreground)]", children: ["Click or drag to set the focal point (", Math.round(focalX * 100), "%,", ' ', Math.round(focalY * 100), "%)"] })] }));
20
20
  }
21
21
  //# sourceMappingURL=FocalPointPicker.js.map
@@ -130,68 +130,68 @@ export function FolderTree({ scope, selected, onSelect, itemCounts, totalCount,
130
130
  const isActive = isSelected({ type: 'folder', folderId: folder.id });
131
131
  const isDragOver = dragOverId === folder.id;
132
132
  const count = countForFolder(folder.id);
133
- return (_jsxs("div", { children: [_jsxs("div", { className: `group flex items-center gap-1 px-2 py-1.5 rounded-md cursor-pointer text-sm transition-colors ${isActive
134
- ? 'bg-blue-50 text-blue-700 font-medium'
133
+ return (_jsxs("div", { children: [_jsxs("div", { className: `group flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-sm transition-colors ${isActive
134
+ ? 'bg-blue-50 font-medium text-blue-700'
135
135
  : isDragOver
136
136
  ? 'bg-blue-100 ring-2 ring-blue-300'
137
137
  : 'text-gray-700 hover:bg-gray-100'}`, style: { paddingLeft: `${8 + depth * 16}px` }, onClick: () => onSelect({ type: 'folder', folderId: folder.id }), onContextMenu: (e) => {
138
138
  e.preventDefault();
139
139
  setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY });
140
- }, onDragOver: (e) => handleDragOver(e, folder.id), onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, folder.id), children: [_jsx("button", { type: "button", className: `p-0.5 rounded hover:bg-gray-200 transition-colors ${hasChildren ? '' : 'invisible'}`, onClick: (e) => {
140
+ }, onDragOver: (e) => handleDragOver(e, folder.id), onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, folder.id), children: [_jsx("button", { type: "button", className: `rounded p-0.5 transition-colors hover:bg-gray-200 ${hasChildren ? '' : 'invisible'}`, onClick: (e) => {
141
141
  e.stopPropagation();
142
142
  toggleExpand(folder.id);
143
- }, children: isExpanded ? (_jsx(ChevronDown, { className: "w-3.5 h-3.5" })) : (_jsx(ChevronRight, { className: "w-3.5 h-3.5" })) }), isExpanded ? (_jsx(FolderOpen, { className: "w-4 h-4 text-blue-500 shrink-0" })) : (_jsx(FolderIcon, { className: "w-4 h-4 text-gray-400 shrink-0" })), editingId === folder.id ? (_jsx("input", { ref: editInputRef, type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: () => handleRename(folder.id), onKeyDown: (e) => {
143
+ }, children: isExpanded ? (_jsx(ChevronDown, { className: "h-3.5 w-3.5" })) : (_jsx(ChevronRight, { className: "h-3.5 w-3.5" })) }), isExpanded ? (_jsx(FolderOpen, { className: "h-4 w-4 shrink-0 text-blue-500" })) : (_jsx(FolderIcon, { className: "h-4 w-4 shrink-0 text-gray-400" })), editingId === folder.id ? (_jsx("input", { ref: editInputRef, type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: () => handleRename(folder.id), onKeyDown: (e) => {
144
144
  if (e.key === 'Enter')
145
145
  handleRename(folder.id);
146
146
  if (e.key === 'Escape')
147
147
  setEditingId(null);
148
- }, 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", onClick: (e) => e.stopPropagation() })) : (_jsx("span", { className: "flex-1 min-w-0 truncate", children: folder.name })), count !== undefined && !editingId && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: count })), _jsx("button", { type: "button", className: "p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-gray-200 transition-all", onClick: (e) => {
148
+ }, className: "min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none", onClick: (e) => e.stopPropagation() })) : (_jsx("span", { className: "min-w-0 flex-1 truncate", children: folder.name })), count !== undefined && !editingId && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: count })), _jsx("button", { type: "button", className: "rounded p-0.5 opacity-0 transition-all group-hover:opacity-100 hover:bg-gray-200", onClick: (e) => {
149
149
  e.stopPropagation();
150
150
  setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY });
151
- }, children: _jsx(MoreHorizontal, { className: "w-3.5 h-3.5 text-gray-500" }) })] }), isExpanded && (_jsxs("div", { children: [folder.children.map((child) => renderFolder(child, depth + 1)), creatingIn === folder.id && (_jsxs("div", { className: "flex items-center gap-1 px-2 py-1", style: { paddingLeft: `${24 + (depth + 1) * 16}px` }, children: [_jsx(FolderIcon, { className: "w-4 h-4 text-gray-400 shrink-0" }), _jsx("input", { ref: newFolderInputRef, type: "text", value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onBlur: () => handleCreate(folder.id), onKeyDown: (e) => {
151
+ }, children: _jsx(MoreHorizontal, { className: "h-3.5 w-3.5 text-gray-500" }) })] }), isExpanded && (_jsxs("div", { children: [folder.children.map((child) => renderFolder(child, depth + 1)), creatingIn === folder.id && (_jsxs("div", { className: "flex items-center gap-1 px-2 py-1", style: { paddingLeft: `${24 + (depth + 1) * 16}px` }, children: [_jsx(FolderIcon, { className: "h-4 w-4 shrink-0 text-gray-400" }), _jsx("input", { ref: newFolderInputRef, type: "text", value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onBlur: () => handleCreate(folder.id), onKeyDown: (e) => {
152
152
  if (e.key === 'Enter')
153
153
  handleCreate(folder.id);
154
154
  if (e.key === 'Escape') {
155
155
  setCreatingIn(false);
156
156
  setNewFolderName('');
157
157
  }
158
- }, placeholder: "Folder name...", 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" })] }))] }))] }, folder.id));
158
+ }, placeholder: "Folder name...", className: "min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none" })] }))] }))] }, folder.id));
159
159
  };
160
160
  if (loading) {
161
- return (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(Loader2, { className: "w-5 h-5 animate-spin text-gray-400" }) }));
161
+ return (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-gray-400" }) }));
162
162
  }
163
- return (_jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "space-y-0.5 px-1 py-2", children: [_jsxs("button", { type: "button", className: `w-full flex items-center gap-2 px-2 py-1.5 rounded-md text-sm transition-colors ${isSelected({ type: 'smart', smart: 'all' })
164
- ? 'bg-blue-50 text-blue-700 font-medium'
165
- : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'all' }), onDragOver: (e) => handleDragOver(e, null), onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, null), children: [_jsx(LayoutGrid, { className: "w-4 h-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "All" }), totalCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: totalCount }))] }), _jsxs("button", { type: "button", className: `w-full flex items-center gap-2 px-2 py-1.5 rounded-md text-sm transition-colors ${isSelected({ type: 'smart', smart: 'recent' })
166
- ? 'bg-blue-50 text-blue-700 font-medium'
167
- : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'recent' }), children: [_jsx(Clock, { className: "w-4 h-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "Recent" }), recentCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: recentCount }))] }), _jsxs("button", { type: "button", className: `w-full flex items-center gap-2 px-2 py-1.5 rounded-md text-sm transition-colors ${isSelected({ type: 'smart', smart: 'uncategorized' })
168
- ? 'bg-blue-50 text-blue-700 font-medium'
169
- : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'uncategorized' }), children: [_jsx(Inbox, { className: "w-4 h-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "Uncategorized" }), uncategorizedCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: uncategorizedCount }))] })] }), _jsx("div", { className: "border-t border-gray-200 my-1" }), _jsxs("div", { className: "flex-1 overflow-y-auto px-1 py-1 space-y-0.5", children: [folders.map((folder) => renderFolder(folder, 0)), creatingIn === null && (_jsxs("div", { className: "flex items-center gap-1 px-2 py-1", children: [_jsx(FolderIcon, { className: "w-4 h-4 text-gray-400 shrink-0 ml-5" }), _jsx("input", { ref: newFolderInputRef, type: "text", value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onBlur: () => handleCreate(null), onKeyDown: (e) => {
163
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "space-y-0.5 px-1 py-2", children: [_jsxs("button", { type: "button", className: `flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${isSelected({ type: 'smart', smart: 'all' })
164
+ ? 'bg-blue-50 font-medium text-blue-700'
165
+ : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'all' }), onDragOver: (e) => handleDragOver(e, null), onDragLeave: handleDragLeave, onDrop: (e) => handleDrop(e, null), children: [_jsx(LayoutGrid, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "All" }), totalCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: totalCount }))] }), _jsxs("button", { type: "button", className: `flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${isSelected({ type: 'smart', smart: 'recent' })
166
+ ? 'bg-blue-50 font-medium text-blue-700'
167
+ : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'recent' }), children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "Recent" }), recentCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: recentCount }))] }), _jsxs("button", { type: "button", className: `flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${isSelected({ type: 'smart', smart: 'uncategorized' })
168
+ ? 'bg-blue-50 font-medium text-blue-700'
169
+ : 'text-gray-700 hover:bg-gray-100'}`, onClick: () => onSelect({ type: 'smart', smart: 'uncategorized' }), children: [_jsx(Inbox, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "flex-1 text-left", children: "Uncategorized" }), uncategorizedCount !== undefined && (_jsx("span", { className: "text-xs text-gray-400 tabular-nums", children: uncategorizedCount }))] })] }), _jsx("div", { className: "my-1 border-t border-gray-200" }), _jsxs("div", { className: "flex-1 space-y-0.5 overflow-y-auto px-1 py-1", children: [folders.map((folder) => renderFolder(folder, 0)), creatingIn === null && (_jsxs("div", { className: "flex items-center gap-1 px-2 py-1", children: [_jsx(FolderIcon, { className: "ml-5 h-4 w-4 shrink-0 text-gray-400" }), _jsx("input", { ref: newFolderInputRef, type: "text", value: newFolderName, onChange: (e) => setNewFolderName(e.target.value), onBlur: () => handleCreate(null), onKeyDown: (e) => {
170
170
  if (e.key === 'Enter')
171
171
  handleCreate(null);
172
172
  if (e.key === 'Escape') {
173
173
  setCreatingIn(false);
174
174
  setNewFolderName('');
175
175
  }
176
- }, placeholder: "Folder name...", 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" })] }))] }), _jsx("div", { className: "border-t border-gray-200 p-2", children: _jsxs("button", { type: "button", onClick: () => {
176
+ }, placeholder: "Folder name...", className: "min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none" })] }))] }), _jsx("div", { className: "border-t border-gray-200 p-2", children: _jsxs("button", { type: "button", onClick: () => {
177
177
  setCreatingIn(null);
178
178
  setNewFolderName('');
179
- }, 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", children: [_jsx(Plus, { className: "w-4 h-4" }), "New Folder"] }) }), contextMenu && (_jsxs("div", { className: "fixed z-50 bg-white rounded-lg border border-gray-200 shadow-lg py-1 min-w-[160px]", style: { left: contextMenu.x, top: contextMenu.y }, children: [_jsxs("button", { type: "button", className: "w-full flex items-center gap-2 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 transition-colors", onClick: () => {
179
+ }, className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-100", children: [_jsx(Plus, { className: "h-4 w-4" }), "New Folder"] }) }), contextMenu && (_jsxs("div", { className: "fixed z-50 min-w-[160px] rounded-lg border border-gray-200 bg-white py-1 shadow-lg", style: { left: contextMenu.x, top: contextMenu.y }, children: [_jsxs("button", { type: "button", className: "flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100", onClick: () => {
180
180
  const folder = findFolder(folders, contextMenu.id);
181
181
  if (folder) {
182
182
  setEditingId(folder.id);
183
183
  setEditName(folder.name);
184
184
  }
185
185
  setContextMenu(null);
186
- }, children: [_jsx(Pencil, { className: "w-3.5 h-3.5" }), "Rename"] }), _jsxs("button", { type: "button", className: "w-full flex items-center gap-2 px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 transition-colors", onClick: () => {
186
+ }, children: [_jsx(Pencil, { className: "h-3.5 w-3.5" }), "Rename"] }), _jsxs("button", { type: "button", className: "flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100", onClick: () => {
187
187
  setCreatingIn(contextMenu.id);
188
188
  setNewFolderName('');
189
189
  setExpanded((prev) => new Set(prev).add(contextMenu.id));
190
190
  setContextMenu(null);
191
- }, children: [_jsx(FolderPlus, { className: "w-3.5 h-3.5" }), "New Subfolder"] }), _jsx("div", { className: "border-t border-gray-200 my-1" }), _jsxs("button", { type: "button", className: "w-full flex items-center gap-2 px-3 py-1.5 text-sm text-red-600 hover:bg-red-50 transition-colors", onClick: () => {
191
+ }, children: [_jsx(FolderPlus, { className: "h-3.5 w-3.5" }), "New Subfolder"] }), _jsx("div", { className: "my-1 border-t border-gray-200" }), _jsxs("button", { type: "button", className: "flex w-full items-center gap-2 px-3 py-1.5 text-sm text-red-600 transition-colors hover:bg-red-50", onClick: () => {
192
192
  handleDelete(contextMenu.id);
193
193
  setContextMenu(null);
194
- }, children: [_jsx(Trash2, { className: "w-3.5 h-3.5" }), "Delete"] })] }))] }));
194
+ }, children: [_jsx(Trash2, { className: "h-3.5 w-3.5" }), "Delete"] })] }))] }));
195
195
  }
196
196
  function findFolder(nodes, id) {
197
197
  for (const n of nodes) {
@@ -53,14 +53,14 @@ export function LivePreview({ collection, documentId, previewUrl, values, onClos
53
53
  window.open(previewSrc, '_blank');
54
54
  }, [previewSrc]);
55
55
  if (!previewSrc) {
56
- return (_jsxs("div", { className: "flex flex-col items-center justify-center h-full bg-gray-50 rounded-lg border border-dashed border-gray-300 p-8", children: [_jsx("p", { className: "text-sm text-gray-500 text-center", children: !documentId
56
+ return (_jsxs("div", { className: "flex h-full flex-col items-center justify-center rounded-lg border border-dashed border-gray-300 bg-gray-50 p-8", children: [_jsx("p", { className: "text-center text-sm text-gray-500", children: !documentId
57
57
  ? 'Save the document first to enable preview'
58
58
  : 'Configure a preview URL in the collection settings to enable live preview' }), _jsx("button", { onClick: onClose, className: "mt-4 text-xs text-gray-400 hover:text-gray-600", children: "Close Preview" })] }));
59
59
  }
60
- return (_jsxs("div", { className: "flex flex-col h-full border-l border-gray-200 bg-white", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-gray-200 bg-gray-50", children: [_jsx("div", { className: "flex items-center gap-1", children: [
60
+ return (_jsxs("div", { className: "flex h-full flex-col border-l border-gray-200 bg-white", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 bg-gray-50 px-3 py-2", children: [_jsx("div", { className: "flex items-center gap-1", children: [
61
61
  ['desktop', Monitor],
62
62
  ['tablet', Tablet],
63
63
  ['mobile', Smartphone],
64
- ].map(([vp, Icon]) => (_jsx("button", { onClick: () => setViewport(vp), className: `p-1.5 rounded ${viewport === vp ? 'bg-white shadow-sm text-blue-600' : 'text-gray-400 hover:text-gray-600'}`, title: vp, children: _jsx(Icon, { className: "w-4 h-4" }) }, vp))) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: handleRefresh, className: "p-1.5 rounded text-gray-400 hover:text-gray-600", title: "Refresh", children: _jsx(RefreshCw, { className: "w-4 h-4" }) }), _jsx("button", { onClick: handleOpenExternal, className: "p-1.5 rounded text-gray-400 hover:text-gray-600", title: "Open in new tab", children: _jsx(ExternalLink, { className: "w-4 h-4" }) }), _jsx("button", { onClick: onClose, className: "p-1.5 rounded text-gray-400 hover:text-gray-600", title: "Close", children: _jsx(X, { className: "w-4 h-4" }) })] })] }), _jsx("div", { className: "flex-1 overflow-auto flex justify-center bg-gray-100 p-4", children: _jsxs("div", { style: { width: VIEWPORT_WIDTHS[viewport], maxWidth: '100%', transition: 'width 0.3s' }, className: "relative", children: [loading && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-white/80 z-10 rounded-lg", children: _jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600" }) })), _jsx("iframe", { ref: iframeRef, src: previewSrc, className: "w-full h-full bg-white rounded-lg shadow-lg border border-gray-200", style: { minHeight: '600px' }, onLoad: () => setLoading(false), title: "Page Preview" })] }) })] }));
64
+ ].map(([vp, Icon]) => (_jsx("button", { onClick: () => setViewport(vp), className: `rounded p-1.5 ${viewport === vp ? 'bg-white text-blue-600 shadow-sm' : 'text-gray-400 hover:text-gray-600'}`, title: vp, children: _jsx(Icon, { className: "h-4 w-4" }) }, vp))) }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx("button", { onClick: handleRefresh, className: "rounded p-1.5 text-gray-400 hover:text-gray-600", title: "Refresh", children: _jsx(RefreshCw, { className: "h-4 w-4" }) }), _jsx("button", { onClick: handleOpenExternal, className: "rounded p-1.5 text-gray-400 hover:text-gray-600", title: "Open in new tab", children: _jsx(ExternalLink, { className: "h-4 w-4" }) }), _jsx("button", { onClick: onClose, className: "rounded p-1.5 text-gray-400 hover:text-gray-600", title: "Close", children: _jsx(X, { className: "h-4 w-4" }) })] })] }), _jsx("div", { className: "flex flex-1 justify-center overflow-auto bg-gray-100 p-4", children: _jsxs("div", { style: { width: VIEWPORT_WIDTHS[viewport], maxWidth: '100%', transition: 'width 0.3s' }, className: "relative", children: [loading && (_jsx("div", { className: "absolute inset-0 z-10 flex items-center justify-center rounded-lg bg-white/80", children: _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-b-2 border-blue-600" }) })), _jsx("iframe", { ref: iframeRef, src: previewSrc, className: "h-full w-full rounded-lg border border-gray-200 bg-white shadow-lg", style: { minHeight: '600px' }, onLoad: () => setLoading(false), title: "Page Preview" })] }) })] }));
65
65
  }
66
66
  //# sourceMappingURL=LivePreview.js.map
@@ -8,6 +8,6 @@ export function LocaleSwitcher() {
8
8
  if (locales.length < 2)
9
9
  return null;
10
10
  const activeLabel = locales.find((l) => l.code === activeLocale)?.label ?? activeLocale;
11
- return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-1.5 px-2 py-1.5 text-sm hover:bg-[var(--accent)] rounded-lg transition-colors", "aria-label": "Switch locale", children: [_jsx(Globe, { className: "w-4 h-4 text-[var(--muted-foreground)]" }), _jsx("span", { className: "hidden sm:inline text-[var(--foreground)] text-sm font-medium", children: activeLabel }), _jsx(ChevronDown, { className: "w-3 h-3 text-[var(--muted-foreground)]" })] }) }), _jsx(DropdownMenu.Portal, { children: _jsx(DropdownMenu.Content, { className: "min-w-[160px] bg-[var(--popover)] text-[var(--popover-foreground)] rounded-lg border border-[var(--border)] shadow-lg p-1 z-50", align: "end", sideOffset: 5, children: locales.map((locale) => (_jsxs(DropdownMenu.Item, { onSelect: () => setLocale(locale.code), className: "flex items-center justify-between gap-2 px-3 py-2 text-sm hover:bg-[var(--accent)] rounded cursor-pointer outline-none", children: [_jsx("span", { children: locale.label }), locale.code === activeLocale && _jsx(Check, { className: "w-4 h-4 text-[var(--primary)]" })] }, locale.code))) }) })] }));
11
+ return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-sm transition-colors hover:bg-[var(--accent)]", "aria-label": "Switch locale", children: [_jsx(Globe, { className: "h-4 w-4 text-[var(--muted-foreground)]" }), _jsx("span", { className: "hidden text-sm font-medium text-[var(--foreground)] sm:inline", children: activeLabel }), _jsx(ChevronDown, { className: "h-3 w-3 text-[var(--muted-foreground)]" })] }) }), _jsx(DropdownMenu.Portal, { children: _jsx(DropdownMenu.Content, { className: "z-50 min-w-[160px] rounded-lg border border-[var(--border)] bg-[var(--popover)] p-1 text-[var(--popover-foreground)] shadow-lg", align: "end", sideOffset: 5, children: locales.map((locale) => (_jsxs(DropdownMenu.Item, { onSelect: () => setLocale(locale.code), className: "flex cursor-pointer items-center justify-between gap-2 rounded px-3 py-2 text-sm outline-none hover:bg-[var(--accent)]", children: [_jsx("span", { children: locale.label }), locale.code === activeLocale && _jsx(Check, { className: "h-4 w-4 text-[var(--primary)]" })] }, locale.code))) }) })] }));
12
12
  }
13
13
  //# sourceMappingURL=LocaleSwitcher.js.map
@@ -44,10 +44,10 @@ export function MediaPickerModal({ open, onClose, onSelect, accept }) {
44
44
  }
45
45
  if (!open)
46
46
  return null;
47
- return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [_jsx("div", { className: "fixed inset-0 bg-black/40", onClick: onClose }), _jsxs("div", { className: "relative bg-white rounded-xl shadow-2xl w-full max-w-2xl max-h-[80vh] flex flex-col mx-4", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-gray-200", children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Insert Image" }), _jsx("button", { onClick: onClose, className: "p-1.5 hover:bg-gray-100 rounded-lg transition-colors", children: _jsx(X, { className: "w-5 h-5 text-gray-500" }) })] }), _jsxs("div", { className: "flex border-b border-gray-200", children: [_jsx("button", { onClick: () => setTab('library'), className: `flex-1 px-4 py-2.5 text-sm font-medium transition-colors ${tab === 'library'
48
- ? 'text-blue-600 border-b-2 border-blue-600'
47
+ return (_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [_jsx("div", { className: "fixed inset-0 bg-black/40", onClick: onClose }), _jsxs("div", { className: "relative mx-4 flex max-h-[80vh] w-full max-w-2xl flex-col rounded-xl bg-white shadow-2xl", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-200 px-4 py-3", children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Insert Image" }), _jsx("button", { onClick: onClose, className: "rounded-lg p-1.5 transition-colors hover:bg-gray-100", children: _jsx(X, { className: "h-5 w-5 text-gray-500" }) })] }), _jsxs("div", { className: "flex border-b border-gray-200", children: [_jsx("button", { onClick: () => setTab('library'), className: `flex-1 px-4 py-2.5 text-sm font-medium transition-colors ${tab === 'library'
48
+ ? 'border-b-2 border-blue-600 text-blue-600'
49
49
  : 'text-gray-500 hover:text-gray-700'}`, children: "Media Library" }), _jsx("button", { onClick: () => setTab('upload'), className: `flex-1 px-4 py-2.5 text-sm font-medium transition-colors ${tab === 'upload'
50
- ? 'text-blue-600 border-b-2 border-blue-600'
51
- : 'text-gray-500 hover:text-gray-700'}`, children: "Upload New" })] }), _jsx("div", { className: "flex-1 overflow-y-auto p-4", children: tab === 'library' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative mb-4", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search images...", className: "w-full pl-9 pr-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" })] }), loading ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Loader2, { className: "w-6 h-6 animate-spin text-gray-400" }) })) : imageItems.length === 0 ? (_jsx("div", { className: "text-center py-12 text-sm text-gray-500", children: "No images found. Try uploading one." })) : (_jsx("div", { className: "grid grid-cols-3 sm:grid-cols-4 gap-3", children: imageItems.map((item) => (_jsxs("button", { onClick: () => handleSelectItem(item), className: "group relative aspect-square rounded-lg border-2 border-gray-200 hover:border-blue-500 overflow-hidden bg-gray-100 transition-colors", children: [_jsx("div", { className: "w-full h-full flex items-center justify-center", children: _jsx(ImageIcon, { className: "w-8 h-8 text-gray-300" }) }), _jsx("div", { className: "absolute inset-x-0 bottom-0 bg-black/60 p-1.5 opacity-0 group-hover:opacity-100 transition-opacity", children: _jsx("p", { className: "text-white text-xs truncate", children: item.filename }) })] }, item.id))) }))] })) : (_jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [_jsx("input", { ref: fileInputRef, type: "file", accept: accept ?? 'image/*', className: "hidden", onChange: (e) => handleUpload(e.target.files) }), _jsx("div", { className: "w-16 h-16 rounded-full bg-blue-50 flex items-center justify-center mb-4", children: uploading ? (_jsx(Loader2, { className: "w-8 h-8 text-blue-600 animate-spin" })) : (_jsx(Upload, { className: "w-8 h-8 text-blue-600" })) }), _jsx("p", { className: "text-sm text-gray-600 mb-4", children: uploading ? 'Uploading...' : 'Select an image file to upload' }), !uploading && (_jsx("button", { onClick: () => fileInputRef.current?.click(), className: "px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors", children: "Choose File" }))] })) })] })] }));
50
+ ? 'border-b-2 border-blue-600 text-blue-600'
51
+ : 'text-gray-500 hover:text-gray-700'}`, children: "Upload New" })] }), _jsx("div", { className: "flex-1 overflow-y-auto p-4", children: tab === 'library' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative mb-4", children: [_jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-gray-400" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search images...", className: "w-full rounded-lg border border-gray-300 py-2 pr-3 pl-9 text-sm focus:ring-2 focus:ring-blue-500 focus:outline-none" })] }), loading ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-gray-400" }) })) : imageItems.length === 0 ? (_jsx("div", { className: "py-12 text-center text-sm text-gray-500", children: "No images found. Try uploading one." })) : (_jsx("div", { className: "grid grid-cols-3 gap-3 sm:grid-cols-4", children: imageItems.map((item) => (_jsxs("button", { onClick: () => handleSelectItem(item), className: "group relative aspect-square overflow-hidden rounded-lg border-2 border-gray-200 bg-gray-100 transition-colors hover:border-blue-500", children: [_jsx("div", { className: "flex h-full w-full items-center justify-center", children: _jsx(ImageIcon, { className: "h-8 w-8 text-gray-300" }) }), _jsx("div", { className: "absolute inset-x-0 bottom-0 bg-black/60 p-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: _jsx("p", { className: "truncate text-xs text-white", children: item.filename }) })] }, item.id))) }))] })) : (_jsxs("div", { className: "flex flex-col items-center justify-center py-12", children: [_jsx("input", { ref: fileInputRef, type: "file", accept: accept ?? 'image/*', className: "hidden", onChange: (e) => handleUpload(e.target.files) }), _jsx("div", { className: "mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-blue-50", children: uploading ? (_jsx(Loader2, { className: "h-8 w-8 animate-spin text-blue-600" })) : (_jsx(Upload, { className: "h-8 w-8 text-blue-600" })) }), _jsx("p", { className: "mb-4 text-sm text-gray-600", children: uploading ? 'Uploading...' : 'Select an image file to upload' }), !uploading && (_jsx("button", { onClick: () => fileInputRef.current?.click(), className: "rounded-lg bg-blue-600 px-4 py-2 text-sm text-white transition-colors hover:bg-blue-700", children: "Choose File" }))] })) })] })] }));
52
52
  }
53
53
  //# sourceMappingURL=MediaPickerModal.js.map
@@ -35,6 +35,6 @@ export function PresenceIndicator({ documentId, currentUserId }) {
35
35
  }, [documentId, currentUserId]);
36
36
  if (users.length === 0)
37
37
  return null;
38
- return (_jsxs("div", { className: "flex items-center gap-1", title: `${users.length} other editor(s) active`, children: [users.slice(0, 5).map((user, i) => (_jsx("div", { className: "w-7 h-7 rounded-full flex items-center justify-center text-white text-xs font-medium ring-2 ring-white", style: { backgroundColor: COLORS[i % COLORS.length] }, title: user.name, children: user.name.charAt(0).toUpperCase() }, user.userId))), users.length > 5 && (_jsxs("div", { className: "w-7 h-7 rounded-full flex items-center justify-center bg-muted text-muted-foreground text-xs font-medium ring-2 ring-white", children: ["+", users.length - 5] }))] }));
38
+ return (_jsxs("div", { className: "flex items-center gap-1", title: `${users.length} other editor(s) active`, children: [users.slice(0, 5).map((user, i) => (_jsx("div", { className: "flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium text-white ring-2 ring-white", style: { backgroundColor: COLORS[i % COLORS.length] }, title: user.name, children: user.name.charAt(0).toUpperCase() }, user.userId))), users.length > 5 && (_jsxs("div", { className: "bg-muted text-muted-foreground flex h-7 w-7 items-center justify-center rounded-full text-xs font-medium ring-2 ring-white", children: ["+", users.length - 5] }))] }));
39
39
  }
40
40
  //# sourceMappingURL=PresenceIndicator.js.map
@@ -0,0 +1,2 @@
1
+ export declare function SEOConfigPanel(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SEOConfigPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SEOConfigPanel.d.ts","sourceRoot":"","sources":["../../src/components/SEOConfigPanel.tsx"],"names":[],"mappings":"AAoFA,wBAAgB,cAAc,4CA+V7B"}
@@ -0,0 +1,174 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * Admin UI for editing the site-wide + per-collection SEO defaults that are
5
+ * normally defined in `actuate.config.ts`. The CMS merges code-level config
6
+ * with these DB-stored overrides, so any field left blank here falls back to
7
+ * the static config (shown as the placeholder).
8
+ *
9
+ * Wired in `Settings.tsx` as the "SEO" tab. Talks to `/seo/config` (GET + PUT).
10
+ */
11
+ import { Loader2, RefreshCw, Save, Globe, FileText } from 'lucide-react';
12
+ import { useEffect, useMemo, useState } from 'react';
13
+ import { toast } from 'sonner';
14
+ import { cmsApi } from '../lib/api.js';
15
+ const SCHEMA_TYPES = [
16
+ '',
17
+ 'WebPage',
18
+ 'Article',
19
+ 'BlogPosting',
20
+ 'NewsArticle',
21
+ 'Product',
22
+ 'Service',
23
+ 'LocalBusiness',
24
+ 'FAQPage',
25
+ 'JobPosting',
26
+ 'Event',
27
+ 'Recipe',
28
+ 'Person',
29
+ 'Organization',
30
+ ];
31
+ const CHANGE_FREQS = ['', 'always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'];
32
+ export function SEOConfigPanel() {
33
+ const [data, setData] = useState(null);
34
+ const [loading, setLoading] = useState(true);
35
+ const [saving, setSaving] = useState(false);
36
+ const [error, setError] = useState(null);
37
+ const [site, setSite] = useState({});
38
+ const [collections, setCollections] = useState({});
39
+ async function load() {
40
+ setLoading(true);
41
+ setError(null);
42
+ const res = await cmsApi('/seo/config', { method: 'GET' });
43
+ if (res.error || !res.data) {
44
+ setError(res.error ?? 'Failed to load SEO config');
45
+ setLoading(false);
46
+ return;
47
+ }
48
+ setData(res.data);
49
+ setSite(res.data.overrides?.site ?? {});
50
+ setCollections(res.data.overrides?.collections ?? {});
51
+ setLoading(false);
52
+ }
53
+ useEffect(() => {
54
+ void load();
55
+ }, []);
56
+ // Field-level placeholder = the static value from actuate.config.ts. The
57
+ // input value is whatever the admin has typed (or the saved override). Empty
58
+ // input + empty override means "fall back to static", which is the desired
59
+ // UX for an additive overrides panel.
60
+ const staticSite = data?.static?.site ?? {};
61
+ async function handleSave() {
62
+ setSaving(true);
63
+ // Strip empty strings so they unset back to the static default rather
64
+ // than persisting "" — the store treats "" as "no override".
65
+ const cleanSite = stripEmpty(site);
66
+ const cleanCollections = {};
67
+ for (const [slug, c] of Object.entries(collections)) {
68
+ const cleaned = stripEmpty(c);
69
+ if (Object.keys(cleaned).length > 0)
70
+ cleanCollections[slug] = cleaned;
71
+ }
72
+ const res = await cmsApi('/seo/config', {
73
+ method: 'PUT',
74
+ body: JSON.stringify({ site: cleanSite, collections: cleanCollections }),
75
+ });
76
+ if (res.error) {
77
+ toast.error(res.error);
78
+ }
79
+ else {
80
+ toast.success('SEO defaults saved');
81
+ await load();
82
+ }
83
+ setSaving(false);
84
+ }
85
+ function patchSite(key, value) {
86
+ setSite((prev) => ({ ...prev, [key]: value }));
87
+ }
88
+ function patchSiteRobots(key, value) {
89
+ setSite((prev) => ({ ...prev, robots: { ...(prev.robots ?? {}), [key]: value } }));
90
+ }
91
+ function patchSiteSitemap(key, value) {
92
+ setSite((prev) => ({ ...prev, sitemap: { ...(prev.sitemap ?? {}), [key]: value } }));
93
+ }
94
+ function patchSiteOg(key, value) {
95
+ setSite((prev) => ({ ...prev, ogImage: { ...(prev.ogImage ?? {}), [key]: value } }));
96
+ }
97
+ function patchCollection(slug, key, value) {
98
+ setCollections((prev) => ({
99
+ ...prev,
100
+ [slug]: { ...(prev[slug] ?? {}), [key]: value },
101
+ }));
102
+ }
103
+ function patchCollectionRobots(slug, key, value) {
104
+ setCollections((prev) => ({
105
+ ...prev,
106
+ [slug]: {
107
+ ...(prev[slug] ?? {}),
108
+ defaultRobots: { ...(prev[slug]?.defaultRobots ?? {}), [key]: value },
109
+ },
110
+ }));
111
+ }
112
+ const updatedAt = useMemo(() => {
113
+ // `updatedAt` is set by the server when overrides are persisted but isn't
114
+ // part of the declared `SeoConfigOverrides` shape. Cast through `unknown`
115
+ // so we can surface it in the UI without widening the type contract.
116
+ const ts = data?.overrides?.updatedAt;
117
+ if (!ts)
118
+ return null;
119
+ try {
120
+ return new Date(ts).toLocaleString();
121
+ }
122
+ catch {
123
+ return ts;
124
+ }
125
+ }, [data]);
126
+ if (loading) {
127
+ return (_jsxs("div", { className: "flex items-center gap-2 py-8 text-sm text-gray-600", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Loading SEO defaults\u2026"] }));
128
+ }
129
+ if (error) {
130
+ return (_jsxs("div", { className: "rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-700", children: [_jsx("div", { className: "mb-2 font-medium", children: "Failed to load SEO config" }), _jsx("div", { className: "font-mono text-xs", children: error }), _jsxs("button", { onClick: () => void load(), className: "mt-3 inline-flex items-center gap-1.5 rounded-md border border-red-300 bg-white px-3 py-1.5 text-xs font-medium text-red-700 hover:bg-red-100", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5" }), " Retry"] })] }));
131
+ }
132
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { children: [_jsxs("p", { className: "text-sm text-gray-600", children: ["Edit the SEO defaults that flow into", ' ', _jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5 text-[11px]", children: "/sitemap.xml" }), ",", ' ', _jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5 text-[11px]", children: "/robots.txt" }), ",", ' ', _jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5 text-[11px]", children: "/og.png" }), ", and the", ' ', _jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5 text-[11px]", children: "/resolve" }), " meta + JSON-LD response. Empty fields fall back to", ' ', _jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5 text-[11px]", children: "actuate.config.ts" }), "."] }), updatedAt && _jsxs("p", { className: "mt-1 text-xs text-gray-500", children: ["Last saved: ", updatedAt] })] }), _jsxs("button", { onClick: handleSave, disabled: saving, className: "inline-flex shrink-0 items-center gap-1.5 rounded-md bg-blue-600 px-3 py-1.5 text-sm font-medium text-white shadow-sm hover:bg-blue-700 disabled:opacity-50", children: [saving ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : _jsx(Save, { className: "h-4 w-4" }), "Save SEO defaults"] })] }), _jsxs("section", { className: "rounded-lg border border-gray-200 bg-white", children: [_jsxs("header", { className: "flex items-center gap-2 border-b border-gray-200 px-4 py-3", children: [_jsx(Globe, { className: "h-4 w-4 text-blue-600" }), _jsx("h3", { className: "text-sm font-semibold text-gray-900", children: "Site-wide defaults" })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 p-4 md:grid-cols-2", children: [_jsx(Field, { label: "Site URL", placeholder: staticSite.siteUrl ?? 'https://example.com', value: site.siteUrl ?? '', onChange: (v) => patchSite('siteUrl', v), hint: "Canonical origin used in sitemap URLs and JSON-LD." }), _jsx(Field, { label: "Site name", placeholder: staticSite.siteName ?? 'My Site', value: site.siteName ?? '', onChange: (v) => patchSite('siteName', v), hint: "Brand name in OG cards and Schema.org Organization." }), _jsx(Field, { label: "Default OG image", placeholder: staticSite.defaultOgImage ?? '/og-default.png', value: site.defaultOgImage ?? '', onChange: (v) => patchSite('defaultOgImage', v), hint: "Used when a document doesn't supply its own." }), _jsx(Field, { label: "Twitter handle", placeholder: staticSite.twitterHandle ?? '@yourbrand', value: site.twitterHandle ?? '', onChange: (v) => patchSite('twitterHandle', v), hint: "Including the leading @." })] }), _jsxs("div", { className: "grid grid-cols-1 gap-4 border-t border-gray-100 p-4 md:grid-cols-3", children: [_jsx(Select, { label: "Default change frequency", value: site.sitemap?.defaultChangeFreq ?? '', options: CHANGE_FREQS, onChange: (v) => patchSiteSitemap('defaultChangeFreq', v), placeholderLabel: `default: ${staticSite.sitemap?.defaultChangeFreq ?? 'weekly'}`, hint: "Applied per-URL in sitemap.xml when a collection doesn't override." }), _jsx(NumberField, { label: "Default priority", value: site.sitemap?.defaultPriority, placeholder: `default: ${staticSite.sitemap?.defaultPriority ?? 0.6}`, onChange: (v) => patchSiteSitemap('defaultPriority', v), min: 0, max: 1, step: 0.1, hint: "Between 0.0 and 1.0." }), _jsx(Select, { label: "OG image theme", value: site.ogImage?.theme ?? '', options: ['', 'light', 'dark'], onChange: (v) => patchSiteOg('theme', (v || undefined)), placeholderLabel: `default: ${staticSite.ogImage?.theme ?? 'light'}`, hint: "Applied by the built-in /og.png renderer." })] }), _jsxs("div", { className: "flex flex-wrap gap-6 border-t border-gray-100 p-4", children: [_jsx(Toggle, { label: "Block known AI bots in robots.txt", checked: !!site.robots?.blockAIBots, onChange: (v) => patchSiteRobots('blockAIBots', v), hint: "GPTBot, ClaudeBot, anthropic-ai, Bytespider, etc." }), _jsx(Toggle, { label: "Disable robots.txt route", checked: !!site.robots?.disabled, onChange: (v) => patchSiteRobots('disabled', v) }), _jsx(Toggle, { label: "Disable sitemap.xml route", checked: !!site.sitemap?.disabled, onChange: (v) => patchSiteSitemap('disabled', v) }), _jsx(Toggle, { label: "Disable /og.png route", checked: !!site.ogImage?.disabled, onChange: (v) => patchSiteOg('disabled', v) })] })] }), _jsxs("section", { className: "rounded-lg border border-gray-200 bg-white", children: [_jsxs("header", { className: "flex items-center gap-2 border-b border-gray-200 px-4 py-3", children: [_jsx(FileText, { className: "h-4 w-4 text-blue-600" }), _jsx("h3", { className: "text-sm font-semibold text-gray-900", children: "Per-collection defaults" }), _jsx("span", { className: "text-xs text-gray-500", children: "\u2014 shown placeholders are the static defaults" })] }), _jsxs("div", { className: "divide-y divide-gray-100", children: [data?.collections.map((col) => {
133
+ const override = collections[col.slug] ?? {};
134
+ const staticC = col.staticSeo ?? {};
135
+ return (_jsxs("div", { className: "p-4", children: [_jsx("div", { className: "mb-3 flex items-baseline justify-between gap-4", children: _jsxs("div", { children: [_jsx("h4", { className: "text-sm font-semibold text-gray-900", children: col.label }), _jsxs("p", { className: "text-xs text-gray-500", children: [_jsx("code", { className: "rounded bg-gray-100 px-1 py-0.5", children: col.slug }), col.urlPrefix !== undefined && (_jsxs(_Fragment, { children: [' ', "prefix:", ' ', _jsxs("code", { className: "rounded bg-gray-100 px-1 py-0.5", children: ["/", col.urlPrefix] })] })), ' ', "\u2014 ", col.type] })] }) }), _jsxs("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-3", children: [_jsx(Select, { label: "Default Schema.org type", value: override.defaultSchemaType ?? '', options: SCHEMA_TYPES, onChange: (v) => patchCollection(col.slug, 'defaultSchemaType', v || undefined), placeholderLabel: `default: ${staticC.defaultSchemaType ?? 'auto-detect'}` }), _jsx(Field, { label: "Archive path", placeholder: staticC.archivePath ?? '/blog', value: override.archivePath ?? '', onChange: (v) => patchCollection(col.slug, 'archivePath', v) }), _jsx(Select, { label: "Sitemap change frequency", value: override.sitemapChangeFreq ?? '', options: CHANGE_FREQS, onChange: (v) => patchCollection(col.slug, 'sitemapChangeFreq', v), placeholderLabel: `default: ${staticC.sitemapChangeFreq ?? 'weekly'}` }), _jsx(NumberField, { label: "Sitemap priority", value: override.sitemapPriority, placeholder: `default: ${staticC.sitemapPriority ?? (col.type === 'page' ? 0.8 : 0.6)}`, onChange: (v) => patchCollection(col.slug, 'sitemapPriority', v), min: 0, max: 1, step: 0.1 })] }), _jsxs("div", { className: "mt-3 flex flex-wrap gap-4", children: [_jsx(Toggle, { label: "Exclude from sitemap", checked: !!override.excludeFromSitemap, onChange: (v) => patchCollection(col.slug, 'excludeFromSitemap', v) }), _jsx(Toggle, { label: "Default: noindex", checked: !!override.defaultRobots?.noIndex, onChange: (v) => patchCollectionRobots(col.slug, 'noIndex', v) }), _jsx(Toggle, { label: "Default: nofollow", checked: !!override.defaultRobots?.noFollow, onChange: (v) => patchCollectionRobots(col.slug, 'noFollow', v) })] })] }, col.slug));
136
+ }), data?.collections.length === 0 && (_jsxs("div", { className: "p-4 text-sm text-gray-500", children: ["No collections configured in ", _jsx("code", { children: "actuate.config.ts" }), "."] }))] })] }), _jsx("div", { className: "flex justify-end", children: _jsxs("button", { onClick: handleSave, disabled: saving, className: "inline-flex items-center gap-1.5 rounded-md bg-blue-600 px-4 py-2 text-sm font-medium text-white shadow-sm hover:bg-blue-700 disabled:opacity-50", children: [saving ? _jsx(Loader2, { className: "h-4 w-4 animate-spin" }) : _jsx(Save, { className: "h-4 w-4" }), "Save SEO defaults"] }) })] }));
137
+ }
138
+ function stripEmpty(obj) {
139
+ const out = {};
140
+ for (const [k, v] of Object.entries(obj)) {
141
+ if (v === undefined || v === null)
142
+ continue;
143
+ if (typeof v === 'string' && v.trim() === '')
144
+ continue;
145
+ if (typeof v === 'object' && !Array.isArray(v)) {
146
+ const nested = stripEmpty(v);
147
+ if (Object.keys(nested).length > 0)
148
+ out[k] = nested;
149
+ continue;
150
+ }
151
+ out[k] = v;
152
+ }
153
+ return out;
154
+ }
155
+ function Field({ label, value, placeholder, onChange, hint, }) {
156
+ return (_jsxs("div", { children: [_jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700", children: label }), _jsx("input", { type: "text", value: value, placeholder: placeholder, onChange: (e) => onChange(e.target.value), className: "w-full rounded-md border border-gray-300 px-2.5 py-1.5 text-sm text-gray-900 placeholder-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" }), hint && _jsx("p", { className: "mt-1 text-[11px] text-gray-500", children: hint })] }));
157
+ }
158
+ function NumberField({ label, value, placeholder, onChange, min, max, step, hint, }) {
159
+ return (_jsxs("div", { children: [_jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700", children: label }), _jsx("input", { type: "number", value: value ?? '', placeholder: placeholder, min: min, max: max, step: step, onChange: (e) => {
160
+ const raw = e.target.value;
161
+ if (raw === '')
162
+ return onChange(undefined);
163
+ const n = Number(raw);
164
+ if (Number.isFinite(n))
165
+ onChange(n);
166
+ }, className: "w-full rounded-md border border-gray-300 px-2.5 py-1.5 text-sm text-gray-900 placeholder-gray-400 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none" }), hint && _jsx("p", { className: "mt-1 text-[11px] text-gray-500", children: hint })] }));
167
+ }
168
+ function Select({ label, value, options, onChange, placeholderLabel, hint, }) {
169
+ return (_jsxs("div", { children: [_jsx("label", { className: "mb-1 block text-xs font-medium text-gray-700", children: label }), _jsx("select", { value: value, onChange: (e) => onChange(e.target.value), className: "w-full rounded-md border border-gray-300 bg-white px-2.5 py-1.5 text-sm text-gray-900 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 focus:outline-none", children: options.map((opt) => (_jsx("option", { value: opt, children: opt === '' ? (placeholderLabel ?? '— use default —') : opt }, opt))) }), hint && _jsx("p", { className: "mt-1 text-[11px] text-gray-500", children: hint })] }));
170
+ }
171
+ function Toggle({ label, checked, onChange, hint, }) {
172
+ return (_jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm text-gray-700", children: [_jsx("input", { type: "checkbox", checked: checked, onChange: (e) => onChange(e.target.checked), className: "h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500" }), _jsxs("span", { children: [label, hint && _jsxs("span", { className: "ml-1 text-[11px] text-gray-500", children: ["\u2014 ", hint] })] })] }));
173
+ }
174
+ //# sourceMappingURL=SEOConfigPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SEOConfigPanel.js","sourceRoot":"","sources":["../../src/components/SEOConfigPanel.tsx"],"names":[],"mappings":"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"}