@actuate-media/cms-admin 0.73.0 → 0.75.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 (209) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +3 -2
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/LoginRoot.d.ts.map +1 -1
  6. package/dist/LoginRoot.js +2 -1
  7. package/dist/LoginRoot.js.map +1 -1
  8. package/dist/__tests__/components/theme-provider-accent.test.d.ts +2 -0
  9. package/dist/__tests__/components/theme-provider-accent.test.d.ts.map +1 -0
  10. package/dist/__tests__/components/theme-provider-accent.test.js +64 -0
  11. package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -0
  12. package/dist/__tests__/views/portal-container.test.js +13 -0
  13. package/dist/__tests__/views/portal-container.test.js.map +1 -1
  14. package/dist/__tests__/views/post-fields-modal.render.test.js +3 -6
  15. package/dist/__tests__/views/post-fields-modal.render.test.js.map +1 -1
  16. package/dist/__tests__/views/redirects-pane.render.test.js +6 -0
  17. package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
  18. package/dist/__tests__/views/seo-content-pane.render.test.js +15 -4
  19. package/dist/__tests__/views/seo-content-pane.render.test.js.map +1 -1
  20. package/dist/actuate-admin.css +1 -1
  21. package/dist/components/CoauthorResultPopover.js +1 -1
  22. package/dist/components/EditorSeoAside.d.ts +23 -0
  23. package/dist/components/EditorSeoAside.d.ts.map +1 -0
  24. package/dist/components/EditorSeoAside.js +21 -0
  25. package/dist/components/EditorSeoAside.js.map +1 -0
  26. package/dist/components/MediaPickerModal.js +1 -1
  27. package/dist/components/SEOConfigPanel.js +1 -1
  28. package/dist/components/SchedulePublishDialog.js +1 -1
  29. package/dist/components/SharePreviewLinkDialog.js +1 -1
  30. package/dist/components/ThemeProvider.d.ts.map +1 -1
  31. package/dist/components/ThemeProvider.js +2 -1
  32. package/dist/components/ThemeProvider.js.map +1 -1
  33. package/dist/components/VersionHistory.js +1 -1
  34. package/dist/components/seo/EditorSeoScoreBadge.d.ts +7 -0
  35. package/dist/components/seo/EditorSeoScoreBadge.d.ts.map +1 -0
  36. package/dist/components/seo/EditorSeoScoreBadge.js +9 -0
  37. package/dist/components/seo/EditorSeoScoreBadge.js.map +1 -0
  38. package/dist/components/seo/SeoAccordion.d.ts +16 -0
  39. package/dist/components/seo/SeoAccordion.d.ts.map +1 -0
  40. package/dist/components/seo/SeoAccordion.js +21 -0
  41. package/dist/components/seo/SeoAccordion.js.map +1 -0
  42. package/dist/components/seo/SeoAnalysisList.d.ts +7 -0
  43. package/dist/components/seo/SeoAnalysisList.d.ts.map +1 -0
  44. package/dist/components/seo/SeoAnalysisList.js +32 -0
  45. package/dist/components/seo/SeoAnalysisList.js.map +1 -0
  46. package/dist/components/seo/SeoEditorPane.d.ts +15 -4
  47. package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
  48. package/dist/components/seo/SeoEditorPane.js +155 -35
  49. package/dist/components/seo/SeoEditorPane.js.map +1 -1
  50. package/dist/components/seo/SeoInsightsMetrics.d.ts +6 -0
  51. package/dist/components/seo/SeoInsightsMetrics.d.ts.map +1 -0
  52. package/dist/components/seo/SeoInsightsMetrics.js +16 -0
  53. package/dist/components/seo/SeoInsightsMetrics.js.map +1 -0
  54. package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
  55. package/dist/components/seo/SeoIssueFixPanel.js +13 -3
  56. package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
  57. package/dist/components/seo/SeoLinkingSection.d.ts +9 -0
  58. package/dist/components/seo/SeoLinkingSection.d.ts.map +1 -0
  59. package/dist/components/seo/SeoLinkingSection.js +44 -0
  60. package/dist/components/seo/SeoLinkingSection.js.map +1 -0
  61. package/dist/components/seo/primitives.d.ts.map +1 -1
  62. package/dist/components/seo/primitives.js +3 -3
  63. package/dist/components/seo/primitives.js.map +1 -1
  64. package/dist/components/ui/Card.js +5 -5
  65. package/dist/components/ui/Card.js.map +1 -1
  66. package/dist/components/ui/InspectorPane.js +3 -3
  67. package/dist/components/ui/InspectorPane.js.map +1 -1
  68. package/dist/components/ui/PanelSection.d.ts +16 -0
  69. package/dist/components/ui/PanelSection.d.ts.map +1 -0
  70. package/dist/components/ui/PanelSection.js +15 -0
  71. package/dist/components/ui/PanelSection.js.map +1 -0
  72. package/dist/lib/admin-root-element.d.ts +9 -0
  73. package/dist/lib/admin-root-element.d.ts.map +1 -0
  74. package/dist/lib/admin-root-element.js +14 -0
  75. package/dist/lib/admin-root-element.js.map +1 -0
  76. package/dist/lib/editor-seo-content.d.ts +16 -0
  77. package/dist/lib/editor-seo-content.d.ts.map +1 -0
  78. package/dist/lib/editor-seo-content.js +139 -0
  79. package/dist/lib/editor-seo-content.js.map +1 -0
  80. package/dist/lib/portal-container.d.ts.map +1 -1
  81. package/dist/lib/portal-container.js +2 -3
  82. package/dist/lib/portal-container.js.map +1 -1
  83. package/dist/lib/seo-service.d.ts +91 -0
  84. package/dist/lib/seo-service.d.ts.map +1 -1
  85. package/dist/lib/seo-service.js +55 -2
  86. package/dist/lib/seo-service.js.map +1 -1
  87. package/dist/views/ApiKeys.js +2 -2
  88. package/dist/views/Dashboard.d.ts.map +1 -1
  89. package/dist/views/Dashboard.js +12 -14
  90. package/dist/views/Dashboard.js.map +1 -1
  91. package/dist/views/MediaBrowser.d.ts.map +1 -1
  92. package/dist/views/MediaBrowser.js +35 -6
  93. package/dist/views/MediaBrowser.js.map +1 -1
  94. package/dist/views/PageEditor.js +1 -1
  95. package/dist/views/Posts/PostTypeEditor.js +3 -3
  96. package/dist/views/SEO.d.ts.map +1 -1
  97. package/dist/views/SEO.js +4 -2
  98. package/dist/views/SEO.js.map +1 -1
  99. package/dist/views/ScriptTags.js +1 -1
  100. package/dist/views/ScriptTags.js.map +1 -1
  101. package/dist/views/Users.js +1 -1
  102. package/dist/views/page-editor/EditorTopBar.d.ts +6 -1
  103. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  104. package/dist/views/page-editor/EditorTopBar.js +5 -2
  105. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  106. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  107. package/dist/views/page-editor/PageSectionEditor.js +36 -1
  108. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  109. package/dist/views/page-editor/PageSettingsModal.d.ts +1 -1
  110. package/dist/views/page-editor/PageSettingsModal.d.ts.map +1 -1
  111. package/dist/views/page-editor/PageSettingsModal.js +2 -13
  112. package/dist/views/page-editor/PageSettingsModal.js.map +1 -1
  113. package/dist/views/page-editor/SectionInspector.js +2 -2
  114. package/dist/views/page-editor/SectionsPanel.js +1 -1
  115. package/dist/views/post-editor/PostFieldsModal.d.ts +1 -1
  116. package/dist/views/post-editor/PostFieldsModal.d.ts.map +1 -1
  117. package/dist/views/post-editor/PostFieldsModal.js +17 -79
  118. package/dist/views/post-editor/PostFieldsModal.js.map +1 -1
  119. package/dist/views/post-editor/PostHeaderPanel.js +1 -1
  120. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  121. package/dist/views/post-editor/PostSectionEditor.js +37 -1
  122. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  123. package/dist/views/seo/ContentTab.d.ts.map +1 -1
  124. package/dist/views/seo/ContentTab.js +7 -1
  125. package/dist/views/seo/ContentTab.js.map +1 -1
  126. package/dist/views/seo/LinksTab.d.ts +4 -0
  127. package/dist/views/seo/LinksTab.d.ts.map +1 -0
  128. package/dist/views/seo/LinksTab.js +111 -0
  129. package/dist/views/seo/LinksTab.js.map +1 -0
  130. package/dist/views/seo/OverviewTab.js +1 -1
  131. package/dist/views/seo/OverviewTab.js.map +1 -1
  132. package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
  133. package/dist/views/seo/RedirectsTab.js +39 -6
  134. package/dist/views/seo/RedirectsTab.js.map +1 -1
  135. package/dist/views/seo/TechnicalTab.js +2 -2
  136. package/dist/views/settings/AISettingsTab.js +1 -1
  137. package/dist/views/settings/AiFeaturesCard.js +1 -1
  138. package/dist/views/settings/AiFeaturesCard.js.map +1 -1
  139. package/dist/views/settings/AppearanceTab.js +1 -1
  140. package/dist/views/settings/BrandVoiceCard.js +1 -1
  141. package/dist/views/settings/EmailSettingsTab.js +2 -2
  142. package/dist/views/settings/GeneralSettingsTab.js +1 -1
  143. package/dist/views/settings/SecurityStatusCard.js +1 -1
  144. package/dist/views/settings/SeoSettingsTab.js +4 -4
  145. package/dist/views/settings/UpdatesTab.js +2 -2
  146. package/dist/views/settings/components.js +3 -3
  147. package/dist/views/settings/components.js.map +1 -1
  148. package/package.json +2 -2
  149. package/src/AdminRoot.tsx +3 -2
  150. package/src/LoginRoot.tsx +2 -1
  151. package/src/__tests__/components/theme-provider-accent.test.tsx +84 -0
  152. package/src/__tests__/views/portal-container.test.tsx +14 -0
  153. package/src/__tests__/views/post-fields-modal.render.test.tsx +3 -9
  154. package/src/__tests__/views/redirects-pane.render.test.tsx +6 -0
  155. package/src/__tests__/views/seo-content-pane.render.test.tsx +16 -4
  156. package/src/components/CoauthorResultPopover.tsx +1 -1
  157. package/src/components/EditorSeoAside.tsx +68 -0
  158. package/src/components/MediaPickerModal.tsx +1 -1
  159. package/src/components/SEOConfigPanel.tsx +2 -2
  160. package/src/components/SchedulePublishDialog.tsx +1 -1
  161. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  162. package/src/components/ThemeProvider.tsx +3 -1
  163. package/src/components/VersionHistory.tsx +1 -1
  164. package/src/components/seo/EditorSeoScoreBadge.tsx +26 -0
  165. package/src/components/seo/SeoAccordion.tsx +76 -0
  166. package/src/components/seo/SeoAnalysisList.tsx +113 -0
  167. package/src/components/seo/SeoEditorPane.tsx +532 -250
  168. package/src/components/seo/SeoInsightsMetrics.tsx +109 -0
  169. package/src/components/seo/SeoIssueFixPanel.tsx +16 -4
  170. package/src/components/seo/SeoLinkingSection.tsx +151 -0
  171. package/src/components/seo/primitives.tsx +7 -3
  172. package/src/components/ui/Card.tsx +5 -5
  173. package/src/components/ui/InspectorPane.tsx +3 -3
  174. package/src/components/ui/PanelSection.tsx +53 -0
  175. package/src/lib/admin-root-element.ts +15 -0
  176. package/src/lib/editor-seo-content.ts +144 -0
  177. package/src/lib/portal-container.ts +3 -2
  178. package/src/lib/seo-service.ts +150 -2
  179. package/src/views/ApiKeys.tsx +2 -2
  180. package/src/views/Dashboard.tsx +40 -53
  181. package/src/views/MediaBrowser.tsx +62 -12
  182. package/src/views/PageEditor.tsx +1 -1
  183. package/src/views/Posts/PostTypeEditor.tsx +3 -3
  184. package/src/views/SEO.tsx +6 -0
  185. package/src/views/ScriptTags.tsx +2 -2
  186. package/src/views/Users.tsx +1 -1
  187. package/src/views/page-editor/EditorTopBar.tsx +27 -0
  188. package/src/views/page-editor/PageSectionEditor.tsx +58 -3
  189. package/src/views/page-editor/PageSettingsModal.tsx +1 -45
  190. package/src/views/page-editor/SectionInspector.tsx +2 -2
  191. package/src/views/page-editor/SectionsPanel.tsx +1 -1
  192. package/src/views/post-editor/PostFieldsModal.tsx +19 -138
  193. package/src/views/post-editor/PostHeaderPanel.tsx +1 -1
  194. package/src/views/post-editor/PostSectionEditor.tsx +60 -3
  195. package/src/views/seo/ContentTab.tsx +11 -5
  196. package/src/views/seo/LinksTab.tsx +462 -0
  197. package/src/views/seo/OverviewTab.tsx +1 -1
  198. package/src/views/seo/RedirectsTab.tsx +97 -4
  199. package/src/views/seo/TechnicalTab.tsx +2 -2
  200. package/src/views/settings/AISettingsTab.tsx +3 -3
  201. package/src/views/settings/AiFeaturesCard.tsx +1 -1
  202. package/src/views/settings/AppearanceTab.tsx +1 -1
  203. package/src/views/settings/BrandVoiceCard.tsx +2 -2
  204. package/src/views/settings/EmailSettingsTab.tsx +2 -2
  205. package/src/views/settings/GeneralSettingsTab.tsx +3 -3
  206. package/src/views/settings/SecurityStatusCard.tsx +1 -1
  207. package/src/views/settings/SeoSettingsTab.tsx +6 -6
  208. package/src/views/settings/UpdatesTab.tsx +3 -3
  209. package/src/views/settings/components.tsx +3 -3
@@ -129,7 +129,7 @@ export function SEOConfigPanel() {
129
129
  if (error) {
130
130
  return (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 text-destructive rounded-lg border p-4 text-sm", 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: "border-destructive bg-card text-destructive hover:bg-destructive/10 mt-3 inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-xs font-medium", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5" }), " Retry"] })] }));
131
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-muted-foreground text-sm", children: ["Edit the SEO defaults that flow into", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/sitemap.xml" }), ",", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/robots.txt" }), ",", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/og.png" }), ", and the", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/resolve" }), " meta + JSON-LD response. Empty fields fall back to", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "actuate.config.ts" }), "."] }), updatedAt && (_jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["Last saved: ", updatedAt] }))] }), _jsxs("button", { onClick: handleSave, disabled: saving, className: "bg-primary hover:bg-primary/90 inline-flex shrink-0 items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium text-white shadow-sm 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: "border-border bg-card rounded-lg border", children: [_jsxs("header", { className: "border-border flex items-center gap-2 border-b px-4 py-3", children: [_jsx(Globe, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-medium", 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: "border-border bg-card rounded-lg border", children: [_jsxs("header", { className: "border-border flex items-center gap-2 border-b px-4 py-3", children: [_jsx(FileText, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-medium", children: "Per-collection defaults" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "\u2014 shown placeholders are the static defaults" })] }), _jsxs("div", { className: "divide-y divide-gray-100", children: [data?.collections.map((col) => {
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-muted-foreground text-sm", children: ["Edit the SEO defaults that flow into", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/sitemap.xml" }), ",", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/robots.txt" }), ",", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/og.png" }), ", and the", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "/resolve" }), " meta + JSON-LD response. Empty fields fall back to", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 text-[11px]", children: "actuate.config.ts" }), "."] }), updatedAt && (_jsxs("p", { className: "text-muted-foreground mt-1 text-xs", children: ["Last saved: ", updatedAt] }))] }), _jsxs("button", { onClick: handleSave, disabled: saving, className: "bg-primary hover:bg-primary/90 inline-flex shrink-0 items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium text-white shadow-sm 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: "border-border bg-card rounded-lg border", children: [_jsxs("header", { className: "border-border flex items-center gap-2 border-b px-6 py-4", children: [_jsx(Globe, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-medium", 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: "border-border bg-card rounded-lg border", children: [_jsxs("header", { className: "border-border flex items-center gap-2 border-b px-6 py-4", children: [_jsx(FileText, { className: "text-primary h-4 w-4" }), _jsx("h3", { className: "text-foreground text-sm font-medium", children: "Per-collection defaults" }), _jsx("span", { className: "text-muted-foreground text-xs", children: "\u2014 shown placeholders are the static defaults" })] }), _jsxs("div", { className: "divide-y divide-gray-100", children: [data?.collections.map((col) => {
133
133
  const override = collections[col.slug] ?? {};
134
134
  const staticC = col.staticSeo ?? {};
135
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-foreground text-sm font-medium", children: col.label }), _jsxs("p", { className: "text-muted-foreground text-xs", children: [_jsx("code", { className: "bg-muted rounded px-1 py-0.5", children: col.slug }), col.urlPrefix !== undefined && (_jsxs(_Fragment, { children: [' ', "prefix:", ' ', _jsxs("code", { className: "bg-muted rounded 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));
@@ -103,6 +103,6 @@ export function SchedulePublishDialog({ collectionSlug, documentId, scheduledAt,
103
103
  });
104
104
  onClose();
105
105
  }
106
- return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/40" }), _jsxs(Dialog.Content, { className: "bg-card text-card-foreground border-border fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg border shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Schedule publishing" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close dialog", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { htmlFor: publishAtId, className: "text-foreground text-sm font-medium", children: "Publish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 h-4 w-4", "aria-hidden": true }), _jsx("input", { id: publishAtId, type: "datetime-local", value: publishAt, onChange: (e) => setPublishAt(e.target.value), min: toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "border-input bg-background text-foreground focus:border-ring focus:ring-ring w-full rounded-md border py-2 pr-3 pl-9 text-sm focus:ring-1 focus:outline-none" })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "The document will move from DRAFT to PUBLISHED at this time (your local timezone)." })] }), _jsxs("label", { className: "text-foreground flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: includeUnpublish, onChange: (e) => setIncludeUnpublish(e.target.checked), className: "border-input text-primary focus:ring-ring h-4 w-4 rounded" }), "Also schedule an unpublish"] }), includeUnpublish && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { htmlFor: unpublishAtId, className: "text-foreground text-sm font-medium", children: "Unpublish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 h-4 w-4", "aria-hidden": true }), _jsx("input", { id: unpublishAtId, type: "datetime-local", value: unpublishAt, onChange: (e) => setUnpublishAt(e.target.value), min: publishAt || toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "border-input bg-background text-foreground focus:border-ring focus:ring-ring w-full rounded-md border py-2 pr-3 pl-9 text-sm focus:ring-1 focus:outline-none" })] })] }))] }), _jsxs("div", { className: "border-border flex items-center justify-between gap-2 border-t px-4 py-3", children: [hasExistingSchedule ? (_jsxs("button", { type: "button", onClick: handleCancelSchedule, disabled: cancelling || saving, className: "text-destructive hover:bg-destructive/10 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium disabled:opacity-50", children: [cancelling ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(X, { className: "h-4 w-4", "aria-hidden": true })), "Cancel schedule"] })) : (_jsx("span", {})), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", className: "text-foreground hover:bg-accent rounded-md px-3 py-1.5 text-sm", children: "Close" }) }), _jsxs("button", { type: "button", onClick: handleSave, disabled: saving || cancelling, className: "bg-primary text-primary-foreground inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium hover:opacity-90 disabled:opacity-50", children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Calendar, { className: "h-4 w-4", "aria-hidden": true })), hasExistingSchedule ? 'Reschedule' : 'Schedule'] })] })] })] })] }) }));
106
+ return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/40" }), _jsxs(Dialog.Content, { className: "bg-card text-card-foreground border-border fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg border shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-6 py-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Calendar, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Schedule publishing" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close dialog", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { htmlFor: publishAtId, className: "text-foreground text-sm font-medium", children: "Publish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 h-4 w-4", "aria-hidden": true }), _jsx("input", { id: publishAtId, type: "datetime-local", value: publishAt, onChange: (e) => setPublishAt(e.target.value), min: toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "border-input bg-background text-foreground focus:border-ring focus:ring-ring w-full rounded-md border py-2 pr-3 pl-9 text-sm focus:ring-1 focus:outline-none" })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "The document will move from DRAFT to PUBLISHED at this time (your local timezone)." })] }), _jsxs("label", { className: "text-foreground flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: includeUnpublish, onChange: (e) => setIncludeUnpublish(e.target.checked), className: "border-input text-primary focus:ring-ring h-4 w-4 rounded" }), "Also schedule an unpublish"] }), includeUnpublish && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("label", { htmlFor: unpublishAtId, className: "text-foreground text-sm font-medium", children: "Unpublish at" }), _jsxs("div", { className: "relative", children: [_jsx(Clock, { className: "text-muted-foreground pointer-events-none absolute top-2.5 left-2.5 h-4 w-4", "aria-hidden": true }), _jsx("input", { id: unpublishAtId, type: "datetime-local", value: unpublishAt, onChange: (e) => setUnpublishAt(e.target.value), min: publishAt || toLocalDateTimeInput(new Date(Date.now() + 60 * 1000)), className: "border-input bg-background text-foreground focus:border-ring focus:ring-ring w-full rounded-md border py-2 pr-3 pl-9 text-sm focus:ring-1 focus:outline-none" })] })] }))] }), _jsxs("div", { className: "border-border flex items-center justify-between gap-2 border-t px-4 py-3", children: [hasExistingSchedule ? (_jsxs("button", { type: "button", onClick: handleCancelSchedule, disabled: cancelling || saving, className: "text-destructive hover:bg-destructive/10 inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium disabled:opacity-50", children: [cancelling ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(X, { className: "h-4 w-4", "aria-hidden": true })), "Cancel schedule"] })) : (_jsx("span", {})), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", className: "text-foreground hover:bg-accent rounded-md px-3 py-1.5 text-sm", children: "Close" }) }), _jsxs("button", { type: "button", onClick: handleSave, disabled: saving || cancelling, className: "bg-primary text-primary-foreground inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-sm font-medium hover:opacity-90 disabled:opacity-50", children: [saving ? (_jsx(Loader2, { className: "h-4 w-4 animate-spin", "aria-hidden": true })) : (_jsx(Calendar, { className: "h-4 w-4", "aria-hidden": true })), hasExistingSchedule ? 'Reschedule' : 'Schedule'] })] })] })] })] }) }));
107
107
  }
108
108
  //# sourceMappingURL=SchedulePublishDialog.js.map
@@ -74,7 +74,7 @@ export function SharePreviewLinkDialog({ collectionSlug, documentId, documentSlu
74
74
  toast.error("Couldn't copy to clipboard");
75
75
  }
76
76
  }
77
- return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/40" }), _jsxs(Dialog.Content, { className: "bg-card text-card-foreground border-border fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-lg border shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Share2, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Share preview link" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close dialog", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsx(Dialog.Description, { className: "text-muted-foreground text-sm", children: "Generate a signed URL that lets anyone with the link view the current draft of this document \u2014 even if it's never been published." }), _jsxs("div", { className: "space-y-2", children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: "Link lifetime" }), _jsx("div", { className: "grid grid-cols-2 gap-2", children: TTL_CHOICES.map((choice) => {
77
+ return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/40" }), _jsxs(Dialog.Content, { className: "bg-card text-card-foreground border-border fixed top-1/2 left-1/2 z-50 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 rounded-lg border shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-6 py-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Share2, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Share preview link" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close dialog", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsxs("div", { className: "space-y-4 px-4 py-4", children: [_jsx(Dialog.Description, { className: "text-muted-foreground text-sm", children: "Generate a signed URL that lets anyone with the link view the current draft of this document \u2014 even if it's never been published." }), _jsxs("div", { className: "space-y-2", children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: "Link lifetime" }), _jsx("div", { className: "grid grid-cols-2 gap-2", children: TTL_CHOICES.map((choice) => {
78
78
  const selected = ttl === choice.seconds;
79
79
  return (_jsxs("button", { type: "button", "aria-pressed": selected, onClick: () => setTtl(choice.seconds), className: `rounded-md border px-3 py-2 text-left text-sm transition-colors ${selected
80
80
  ? 'border-primary bg-primary/10 text-foreground'
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEnG;;;;;;;;;;;;;GAaG;AAEH,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,EAAE,OAAO,GAAG,MAAM,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC,UAAU,EAAE,eAAe,CAAA;IAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC/C,uEAAuE;IACvE,eAAe,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,qDAAsD,CAAA;AAuClF,wBAAgB,QAAQ,sBAEvB;AAyDD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,kBAAkB,2CAmJ9E"}
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAA+D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAInG;;;;;;;;;;;;;GAaG;AAEH,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,iBAAiB;IACzB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,EAAE,OAAO,GAAG,MAAM,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACzC,UAAU,EAAE,eAAe,CAAA;IAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAA;IAC/C,uEAAuE;IACvE,eAAe,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,kFAAkF;AAClF,eAAO,MAAM,eAAe,qDAAsD,CAAA;AAuClF,wBAAgB,QAAQ,sBAEvB;AAyDD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,gFAAgF;IAChF,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,EAAE,kBAAkB,2CAmJ9E"}
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { accentTokensToCssVars, generateAdminThemeTokens, } from '@actuate-media/cms-core/appearance';
4
4
  import { createContext, useContext, useState, useEffect, useCallback } from 'react';
5
+ import { getAdminRootElement } from '../lib/admin-root-element.js';
5
6
  /** Curated content-font options. Applied as family strings (no web-font load). */
6
7
  export const AVAILABLE_FONTS = ['DM Sans', 'Inter', 'Geist', 'System UI'];
7
8
  const SYSTEM_STACK = "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif";
@@ -54,7 +55,7 @@ const KEY_FONT = 'actuate-font';
54
55
  const KEY_MOTION = 'actuate-reduce-motion';
55
56
  const KEY_BRAND = 'actuate-admin-brand';
56
57
  function adminRootEl() {
57
- return document.querySelector('.actuate-admin');
58
+ return getAdminRootElement();
58
59
  }
59
60
  function applyColorMode(resolved) {
60
61
  const el = adminRootEl();
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.js","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThemeProvider.js","sourceRoot":"","sources":["../../src/components/ThemeProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GAGzB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAA;AAEnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAoDlE,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAU,CAAA;AAElF,MAAM,YAAY,GAAG,8EAA8E,CAAA;AAEnG,MAAM,WAAW,GAA2B;IAC1C,SAAS,EAAE,cAAc,YAAY,EAAE;IACvC,KAAK,EAAE,YAAY,YAAY,EAAE;IACjC,KAAK,EAAE,YAAY,YAAY,EAAE;IACjC,WAAW,EAAE,YAAY;CAC1B,CAAA;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,YAAY,EAAE,CAAA;AAC1D,CAAC;AAED,MAAM,aAAa,GAAoB;IACrC,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,GAAG;CACd,CAAA;AAED,MAAM,YAAY,GAAG,aAAa,CAAoB;IACpD,KAAK,EAAE,QAAQ;IACf,aAAa,EAAE,OAAO;IACtB,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;IAClB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;IACnB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;IACpB,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;IACzB,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,eAAe,EAAE,GAAG,EAAE,GAAE,CAAC;CAC1B,CAAC,CAAA;AAEF,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAA;AACjC,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAA;IACjD,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,KAAgB;IACpC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AACtD,CAAC;AAED,MAAM,SAAS,GAAG,eAAe,CAAA;AACjC,MAAM,UAAU,GAAG,gBAAgB,CAAA;AACnC,MAAM,WAAW,GAAG,iBAAiB,CAAA;AACrC,MAAM,QAAQ,GAAG,cAAc,CAAA;AAC/B,MAAM,UAAU,GAAG,uBAAuB,CAAA;AAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAA;AAEvC,SAAS,WAAW;IAClB,OAAO,mBAAmB,EAAE,CAAA;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,QAA0B;IAChD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAA;IAChD,2FAA2F;IAC3F,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,QAA0B;IAC7D,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,MAAM,IAAI,GAAG,qBAAqB,CAChC,wBAAwB,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,CACjE,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,OAAuB;IAC3C,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,sBAAsB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;IACxB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;AAC7C,CAAC;AAQD,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAsB;IAC7E,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAY,QAAQ,CAAC,CAAA;IAC5D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAmB,OAAO,CAAC,CAAA;IAC7E,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACnD,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAiB,SAAS,CAAC,CAAA;IACtE,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAA;IAClD,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC5D,MAAM,CAAC,UAAU,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAkB,aAAa,CAAC,CAAA;IAEjF,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAqB,CAAA;QACvE,IAAI,YAAuB,CAAA;QAC3B,IAAI,WAAW,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACrE,YAAY,GAAG,WAAW,CAAA;QAC5B,CAAC;aAAM,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;YACpC,YAAY,GAAG,MAAM,CAAA;QACvB,CAAC;aAAM,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;YACrC,YAAY,GAAG,OAAO,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,QAAQ,CAAA;QACzB,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;QAE3C,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAA;QACjE,MAAM,aAAa,GAAI,YAAY,CAAC,OAAO,CAAC,WAAW,CAA2B,IAAI,SAAS,CAAA;QAC/F,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAA;QAChE,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,MAAM,CAAA;QAChE,IAAI,WAAW,GAAG,aAAa,CAAA;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAI,GAAG;gBAAE,WAAW,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QAED,aAAa,CAAC,YAAY,CAAC,CAAA;QAC3B,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAC1B,cAAc,CAAC,YAAY,CAAC,CAAA;QAC5B,eAAe,CAAC,aAAa,CAAC,CAAA;QAC9B,YAAY,CAAC,UAAU,CAAC,CAAA;QACxB,oBAAoB,CAAC,YAAY,CAAC,CAAA;QAClC,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAE/B,cAAc,CAAC,QAAQ,CAAC,CAAA;QACxB,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;QACnC,YAAY,CAAC,aAAa,CAAC,CAAA;QAC3B,SAAS,CAAC,UAAU,CAAC,CAAA;QACrB,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;IAErB,4EAA4E;IAC5E,gDAAgD;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAA;QAC5D,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;gBACjC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;gBAC1B,cAAc,CAAC,QAAQ,CAAC,CAAA;gBACxB,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC,CAAA;QACD,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACtC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IAEnB,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,IAAe,EAAE,EAAE;QAClB,aAAa,CAAC,IAAI,CAAC,CAAA;QACnB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QACnC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAC1B,cAAc,CAAC,QAAQ,CAAC,CAAA;QACxB,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAA;IAED,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,IAAY,EAAE,EAAE;QACf,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACtC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAClC,CAAC,EACD,CAAC,aAAa,CAAC,CAChB,CAAA;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,IAAoB,EAAE,EAAE;QACtD,eAAe,CAAC,IAAI,CAAC,CAAA;QACrB,YAAY,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QACvC,YAAY,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,EAAE;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACpC,SAAS,CAAC,IAAI,CAAC,CAAA;IACjB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE;QACpD,oBAAoB,CAAC,IAAI,CAAC,CAAA;QAC1B,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAAqB,EAAE,EAAE;QAC1D,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,QAA4B,EAAE,EAAE;QAC/B,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;YAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC7D,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAChE,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACvD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QAC/E,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS;YAAE,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC3E,CAAC,EACD,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAC3E,CAAA;IAED,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IACpB,KAAK,EAAE;YACL,KAAK;YACL,aAAa;YACb,QAAQ;YACR,MAAM;YACN,SAAS;YACT,OAAO;YACP,UAAU;YACV,IAAI;YACJ,OAAO;YACP,YAAY;YACZ,eAAe;YACf,UAAU;YACV,aAAa;YACb,eAAe;SAChB,YAEA,QAAQ,GACa,CACzB,CAAA;AACH,CAAC"}
@@ -58,7 +58,7 @@ export function VersionHistory({ collectionSlug, documentId, open, onClose, onRe
58
58
  }
59
59
  setRestoring(null);
60
60
  }
61
- return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/30" }), _jsxs(Dialog.Content, { "aria-describedby": undefined, className: "bg-card text-card-foreground border-border animate-in slide-in-from-right fixed inset-y-0 right-0 z-50 flex w-full max-w-md flex-col border-l shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Clock, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Version History" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close version history", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: loading ? (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin", "aria-hidden": true }) })) : versions.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-16 text-center text-sm", children: "No version history available" })) : (_jsx("div", { className: "divide-border divide-y", children: versions.map((version, index) => {
61
+ return (_jsx(Dialog.Root, { open: open, onOpenChange: (next) => !next && onClose(), children: _jsxs(Dialog.Portal, { container: adminPortalContainer(), children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/30" }), _jsxs(Dialog.Content, { "aria-describedby": undefined, className: "bg-card text-card-foreground border-border animate-in slide-in-from-right fixed inset-y-0 right-0 z-50 flex w-full max-w-md flex-col border-l shadow-xl focus:outline-none", children: [_jsxs("div", { className: "border-border flex items-center justify-between border-b px-6 py-4", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Clock, { className: "text-muted-foreground h-5 w-5", "aria-hidden": true }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: "Version History" })] }), _jsx(Dialog.Close, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Close version history", className: "text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:ring-ring rounded-lg p-1.5 transition-colors focus-visible:ring-2 focus-visible:outline-none", children: _jsx(X, { className: "h-5 w-5", "aria-hidden": true }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: loading ? (_jsx("div", { className: "flex items-center justify-center py-16", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin", "aria-hidden": true }) })) : versions.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-16 text-center text-sm", children: "No version history available" })) : (_jsx("div", { className: "divide-border divide-y", children: versions.map((version, index) => {
62
62
  const typeInfo = CHANGE_TYPE_LABELS[version.changeType] ?? {
63
63
  label: version.changeType,
64
64
  color: 'bg-muted text-muted-foreground',
@@ -0,0 +1,7 @@
1
+ /** Compact color-coded score for the page/post editor toolbar (`77/100` left of "SEO"). */
2
+ export declare function EditorSeoScoreBadge({ score, inverted, }: {
3
+ score: number;
4
+ /** When the SEO toggle uses `bg-primary`, render score in primary-foreground. */
5
+ inverted?: boolean;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=EditorSeoScoreBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorSeoScoreBadge.d.ts","sourceRoot":"","sources":["../../../src/components/seo/EditorSeoScoreBadge.tsx"],"names":[],"mappings":"AAIA,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAgB,GACjB,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,2CAaA"}
@@ -0,0 +1,9 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { gradeFromScore, gradeMeta } from './primitives.js';
4
+ /** Compact color-coded score for the page/post editor toolbar (`77/100` left of "SEO"). */
5
+ export function EditorSeoScoreBadge({ score, inverted = false, }) {
6
+ const meta = gradeMeta(gradeFromScore(score));
7
+ return (_jsxs("span", { className: `inline-flex items-baseline gap-0.5 text-xs font-medium tabular-nums ${inverted ? 'text-primary-foreground' : meta.text}`, "aria-hidden": true, children: [score, _jsx("span", { className: inverted ? 'text-primary-foreground/80' : 'opacity-70', children: "/100" })] }));
8
+ }
9
+ //# sourceMappingURL=EditorSeoScoreBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditorSeoScoreBadge.js","sourceRoot":"","sources":["../../../src/components/seo/EditorSeoScoreBadge.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3D,2FAA2F;AAC3F,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GAAG,KAAK,GAKjB;IACC,MAAM,IAAI,GAAG,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,OAAO,CACL,gBACE,SAAS,EAAE,uEACT,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAC9C,EAAE,kCAGD,KAAK,EACN,eAAM,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,YAAY,qBAAa,IAC/E,CACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare function SeoAccordion({ children, defaultOpen, }: {
3
+ children: ReactNode;
4
+ defaultOpen?: string[];
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ export declare function SeoAccordionItem({ value, title, badge, children, }: {
7
+ value: string;
8
+ title: string;
9
+ badge?: ReactNode;
10
+ children: ReactNode;
11
+ }): import("react/jsx-runtime").JSX.Element;
12
+ export declare function SeoAccordionBadge({ tone, children, }: {
13
+ tone: 'neutral' | 'good' | 'warn' | 'bad';
14
+ children: ReactNode;
15
+ }): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=SeoAccordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoAccordion.d.ts","sourceRoot":"","sources":["../../../src/components/seo/SeoAccordion.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAoD,GACrD,EAAE;IACD,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB,2CAUA;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,SAAS,CAAA;CACpB,2CAqBA;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IACzC,QAAQ,EAAE,SAAS,CAAA;CACpB,2CAYA"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as Accordion from '@radix-ui/react-accordion';
4
+ import { ChevronDown } from 'lucide-react';
5
+ export function SeoAccordion({ children, defaultOpen = ['focus-keyword', 'search-appearance'], }) {
6
+ return (_jsx(Accordion.Root, { type: "multiple", defaultValue: defaultOpen, className: "divide-y divide-[var(--bdr)]", children: children }));
7
+ }
8
+ export function SeoAccordionItem({ value, title, badge, children, }) {
9
+ return (_jsxs(Accordion.Item, { value: value, className: "border-[var(--bdr)] bg-[var(--sb)]", children: [_jsx(Accordion.Header, { children: _jsxs(Accordion.Trigger, { className: "group flex w-full items-center justify-between gap-2 px-5 py-3.5 text-left transition-colors duration-[var(--motion-fast)] hover:bg-[var(--bg)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "text-[13px] font-medium text-[var(--txt)]", children: title }), badge] }), _jsx(ChevronDown, { size: 16, "aria-hidden": true, className: "shrink-0 text-[var(--muted)] group-data-[state=open]:rotate-180 motion-safe:transition-transform motion-safe:duration-200" })] }) }), _jsx(Accordion.Content, { className: "overflow-hidden data-[state=closed]:hidden", children: _jsx("div", { className: "space-y-3 px-5 pt-1 pb-4", children: children }) })] }));
10
+ }
11
+ export function SeoAccordionBadge({ tone, children, }) {
12
+ const cls = tone === 'good'
13
+ ? 'bg-[var(--suc-l)] text-[var(--suc)]'
14
+ : tone === 'warn'
15
+ ? 'bg-[var(--warn-l)] text-[var(--warn)]'
16
+ : tone === 'bad'
17
+ ? 'bg-[var(--err-l)] text-[var(--err)]'
18
+ : 'bg-[var(--bg)] text-[var(--sub)]';
19
+ return (_jsx("span", { className: `rounded-full px-2 py-0.5 text-[10.5px] font-medium ${cls}`, children: children }));
20
+ }
21
+ //# sourceMappingURL=SeoAccordion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoAccordion.js","sourceRoot":"","sources":["../../../src/components/seo/SeoAccordion.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAGZ,OAAO,KAAK,SAAS,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,UAAU,YAAY,CAAC,EAC3B,QAAQ,EACR,WAAW,GAAG,CAAC,eAAe,EAAE,mBAAmB,CAAC,GAIrD;IACC,OAAO,CACL,KAAC,SAAS,CAAC,IAAI,IACb,IAAI,EAAC,UAAU,EACf,YAAY,EAAE,WAAW,EACzB,SAAS,EAAC,8BAA8B,YAEvC,QAAQ,GACM,CAClB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,GAMT;IACC,OAAO,CACL,MAAC,SAAS,CAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,oCAAoC,aAC1E,KAAC,SAAS,CAAC,MAAM,cACf,MAAC,SAAS,CAAC,OAAO,IAAC,SAAS,EAAC,kOAAkO,aAC7P,gBAAM,SAAS,EAAC,iCAAiC,aAC/C,eAAM,SAAS,EAAC,2CAA2C,YAAE,KAAK,GAAQ,EACzE,KAAK,IACD,EACP,KAAC,WAAW,IACV,IAAI,EAAE,EAAE,uBAER,SAAS,EAAC,2HAA2H,GACrI,IACgB,GACH,EACnB,KAAC,SAAS,CAAC,OAAO,IAAC,SAAS,EAAC,4CAA4C,YACvE,cAAK,SAAS,EAAC,0BAA0B,YAAE,QAAQ,GAAO,GACxC,IACL,CAClB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,GAIT;IACC,MAAM,GAAG,GACP,IAAI,KAAK,MAAM;QACb,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,IAAI,KAAK,MAAM;YACf,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,IAAI,KAAK,KAAK;gBACd,CAAC,CAAC,qCAAqC;gBACvC,CAAC,CAAC,kCAAkC,CAAA;IAC5C,OAAO,CACL,eAAM,SAAS,EAAE,sDAAsD,GAAG,EAAE,YAAG,QAAQ,GAAQ,CAChG,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SEOCheck } from '@actuate-media/cms-core/seo/analysis';
2
+ export declare function SeoAnalysisList({ checks, onAiFixField, aiFixField, }: {
3
+ checks: SEOCheck[];
4
+ onAiFixField?: (field: 'metaTitle' | 'metaDescription' | 'focusKeyword') => void;
5
+ aiFixField?: string | null;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=SeoAnalysisList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoAnalysisList.d.ts","sourceRoot":"","sources":["../../../src/components/seo/SeoAnalysisList.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAA;AAEpE,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,YAAY,EACZ,UAAU,GACX,EAAE;IACD,MAAM,EAAE,QAAQ,EAAE,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,iBAAiB,GAAG,cAAc,KAAK,IAAI,CAAA;IAChF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,2CA6CA"}
@@ -0,0 +1,32 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertCircle, CheckCircle2, Sparkles, Wand2 } from 'lucide-react';
4
+ export function SeoAnalysisList({ checks, onAiFixField, aiFixField, }) {
5
+ const problems = checks.filter((c) => c.status === 'problem' || c.status === 'improvement');
6
+ const good = checks.filter((c) => c.status === 'good');
7
+ if (checks.length === 0) {
8
+ return (_jsx("p", { className: "text-[12px] text-[var(--muted)]", children: "Add content and a focus keyphrase to run SEO checks." }));
9
+ }
10
+ return (_jsxs("div", { className: "space-y-4", children: [problems.length > 0 && (_jsxs("div", { children: [_jsxs("h4", { className: "mb-2 text-[11px] font-semibold tracking-wide text-[var(--sub)] uppercase", children: ["Problems (", problems.length, ")"] }), _jsx("ul", { className: "space-y-2", children: problems.map((check) => (_jsx(AnalysisRow, { check: check, onAiFix: onAiFixField, aiBusy: aiFixField }, check.id))) })] })), good.length > 0 && (_jsxs("div", { children: [_jsxs("h4", { className: "mb-2 text-[11px] font-semibold tracking-wide text-[var(--sub)] uppercase", children: ["Good results (", good.length, ")"] }), _jsx("ul", { className: "space-y-2", children: good.map((check) => (_jsx(AnalysisRow, { check: check }, check.id))) })] }))] }));
11
+ }
12
+ function AnalysisRow({ check, onAiFix, aiBusy, }) {
13
+ const tone = check.status === 'good'
14
+ ? 'text-[var(--suc)]'
15
+ : check.status === 'improvement'
16
+ ? 'text-[var(--warn)]'
17
+ : 'text-[var(--err)]';
18
+ const Icon = check.status === 'good' ? CheckCircle2 : AlertCircle;
19
+ const aiField = aiFieldForCheck(check.id);
20
+ return (_jsxs("li", { className: "flex items-start gap-2 rounded-[7px] border border-[var(--bdr)] bg-[var(--card)] px-2.5 py-2", children: [_jsx(Icon, { className: `mt-0.5 h-3.5 w-3.5 shrink-0 ${tone}`, "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-[12.5px] font-medium text-[var(--txt)]", children: check.title }), _jsx("p", { className: "text-[11.5px] text-[var(--sub)]", children: check.description })] }), onAiFix && aiField && check.status !== 'good' && (_jsxs("button", { type: "button", "aria-label": `AI help for ${check.title}`, disabled: Boolean(aiBusy), onClick: () => onAiFix(aiField), className: "inline-flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] font-medium text-[var(--acc)] hover:bg-[var(--acc-l)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none disabled:opacity-60", children: [aiBusy === aiField ? (_jsx(Sparkles, { className: "h-3 w-3 animate-pulse", "aria-hidden": true })) : (_jsx(Wand2, { className: "h-3 w-3", "aria-hidden": true })), "AI"] }))] }));
21
+ }
22
+ function aiFieldForCheck(checkId) {
23
+ if (checkId.includes('meta-title') || checkId.includes('keyphrase-in-title'))
24
+ return 'metaTitle';
25
+ if (checkId.includes('meta-description') || checkId.includes('keyphrase-in-meta-description')) {
26
+ return 'metaDescription';
27
+ }
28
+ if (checkId.includes('keyphrase'))
29
+ return 'focusKeyword';
30
+ return null;
31
+ }
32
+ //# sourceMappingURL=SeoAnalysisList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SeoAnalysisList.js","sourceRoot":"","sources":["../../../src/components/seo/SeoAnalysisList.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +1,20 @@
1
1
  export interface SeoEditorPaneProps {
2
- entityType: string;
3
- entityId: string;
2
+ entityType: 'page' | 'post';
3
+ /** When absent, draft-only mode — meta fields sync via `onDraftChange`. */
4
+ entityId: string | null;
4
5
  onClose: () => void;
5
- /** Called after a successful save so the list can refetch. */
6
6
  onSaved?: () => void;
7
+ /** Live HTML from the section editor for real-time analysis. */
8
+ contentHtml?: string;
9
+ slug?: string;
10
+ draftMeta?: {
11
+ seoTitle: string;
12
+ seoDescription: string;
13
+ };
14
+ onDraftChange?: (patch: {
15
+ seoTitle?: string;
16
+ seoDescription?: string;
17
+ }) => void;
7
18
  }
8
- export declare function SeoEditorPane({ entityType, entityId, onClose, onSaved }: SeoEditorPaneProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function SeoEditorPane({ entityType, entityId, onClose, onSaved, contentHtml, slug, draftMeta, onDraftChange, }: SeoEditorPaneProps): import("react/jsx-runtime").JSX.Element;
9
20
  //# sourceMappingURL=SeoEditorPane.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SeoEditorPane.d.ts","sourceRoot":"","sources":["../../../src/components/seo/SeoEditorPane.tsx"],"names":[],"mappings":"AAqHA,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB,2CAuZ3F"}
1
+ {"version":3,"file":"SeoEditorPane.d.ts","sourceRoot":"","sources":["../../../src/components/seo/SeoEditorPane.tsx"],"names":[],"mappings":"AAmIA,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;IACxD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAChF;AAED,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,QAAQ,EACR,OAAO,EACP,OAAO,EACP,WAAgB,EAChB,IAAS,EACT,SAAS,EACT,aAAa,GACd,EAAE,kBAAkB,2CAqpBpB"}