@actuate-media/cms-admin 0.72.3 → 0.74.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 (178) hide show
  1. package/CHANGELOG.md +22 -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/resizable-aside.test.d.ts +2 -0
  9. package/dist/__tests__/components/resizable-aside.test.d.ts.map +1 -0
  10. package/dist/__tests__/components/resizable-aside.test.js +77 -0
  11. package/dist/__tests__/components/resizable-aside.test.js.map +1 -0
  12. package/dist/__tests__/components/theme-provider-accent.test.d.ts +2 -0
  13. package/dist/__tests__/components/theme-provider-accent.test.d.ts.map +1 -0
  14. package/dist/__tests__/components/theme-provider-accent.test.js +64 -0
  15. package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -0
  16. package/dist/__tests__/views/portal-container.test.js +13 -0
  17. package/dist/__tests__/views/portal-container.test.js.map +1 -1
  18. package/dist/__tests__/views/redirects-pane.render.test.js +6 -0
  19. package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
  20. package/dist/__tests__/views/seo-content-pane.render.test.js +13 -4
  21. package/dist/__tests__/views/seo-content-pane.render.test.js.map +1 -1
  22. package/dist/actuate-admin.css +1 -1
  23. package/dist/components/CoauthorResultPopover.js +1 -1
  24. package/dist/components/EditorSeoAside.d.ts +20 -0
  25. package/dist/components/EditorSeoAside.d.ts.map +1 -0
  26. package/dist/components/EditorSeoAside.js +30 -0
  27. package/dist/components/EditorSeoAside.js.map +1 -0
  28. package/dist/components/MediaPickerModal.js +1 -1
  29. package/dist/components/SEOConfigPanel.js +1 -1
  30. package/dist/components/SchedulePublishDialog.js +1 -1
  31. package/dist/components/SharePreviewLinkDialog.js +1 -1
  32. package/dist/components/ThemeProvider.d.ts.map +1 -1
  33. package/dist/components/ThemeProvider.js +2 -1
  34. package/dist/components/ThemeProvider.js.map +1 -1
  35. package/dist/components/VersionHistory.js +1 -1
  36. package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
  37. package/dist/components/seo/SeoEditorPane.js +28 -8
  38. package/dist/components/seo/SeoEditorPane.js.map +1 -1
  39. package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
  40. package/dist/components/seo/SeoIssueFixPanel.js +13 -3
  41. package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
  42. package/dist/components/seo/primitives.d.ts.map +1 -1
  43. package/dist/components/seo/primitives.js +3 -3
  44. package/dist/components/seo/primitives.js.map +1 -1
  45. package/dist/components/ui/Card.js +5 -5
  46. package/dist/components/ui/Card.js.map +1 -1
  47. package/dist/components/ui/InspectorPane.js +3 -3
  48. package/dist/components/ui/InspectorPane.js.map +1 -1
  49. package/dist/components/ui/PanelSection.d.ts +16 -0
  50. package/dist/components/ui/PanelSection.d.ts.map +1 -0
  51. package/dist/components/ui/PanelSection.js +15 -0
  52. package/dist/components/ui/PanelSection.js.map +1 -0
  53. package/dist/components/ui/ResizableAside.d.ts +38 -0
  54. package/dist/components/ui/ResizableAside.d.ts.map +1 -0
  55. package/dist/components/ui/ResizableAside.js +209 -0
  56. package/dist/components/ui/ResizableAside.js.map +1 -0
  57. package/dist/lib/admin-root-element.d.ts +9 -0
  58. package/dist/lib/admin-root-element.d.ts.map +1 -0
  59. package/dist/lib/admin-root-element.js +14 -0
  60. package/dist/lib/admin-root-element.js.map +1 -0
  61. package/dist/lib/portal-container.d.ts.map +1 -1
  62. package/dist/lib/portal-container.js +2 -3
  63. package/dist/lib/portal-container.js.map +1 -1
  64. package/dist/lib/seo-service.d.ts +89 -0
  65. package/dist/lib/seo-service.d.ts.map +1 -1
  66. package/dist/lib/seo-service.js +50 -2
  67. package/dist/lib/seo-service.js.map +1 -1
  68. package/dist/views/ApiKeys.js +2 -2
  69. package/dist/views/Dashboard.d.ts.map +1 -1
  70. package/dist/views/Dashboard.js +12 -14
  71. package/dist/views/Dashboard.js.map +1 -1
  72. package/dist/views/MediaBrowser.d.ts.map +1 -1
  73. package/dist/views/MediaBrowser.js +35 -6
  74. package/dist/views/MediaBrowser.js.map +1 -1
  75. package/dist/views/PageEditor.js +1 -1
  76. package/dist/views/Posts/PostTypeEditor.js +3 -3
  77. package/dist/views/SEO.d.ts.map +1 -1
  78. package/dist/views/SEO.js +4 -2
  79. package/dist/views/SEO.js.map +1 -1
  80. package/dist/views/ScriptTags.js +1 -1
  81. package/dist/views/ScriptTags.js.map +1 -1
  82. package/dist/views/Users.js +1 -1
  83. package/dist/views/page-editor/EditorTopBar.d.ts +4 -1
  84. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  85. package/dist/views/page-editor/EditorTopBar.js +5 -3
  86. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  87. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  88. package/dist/views/page-editor/PageSectionEditor.js +24 -1
  89. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  90. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
  91. package/dist/views/page-editor/SectionInspector.js +7 -2
  92. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  93. package/dist/views/page-editor/SectionsPanel.js +1 -1
  94. package/dist/views/post-editor/PostHeaderPanel.d.ts.map +1 -1
  95. package/dist/views/post-editor/PostHeaderPanel.js +2 -1
  96. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  97. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  98. package/dist/views/post-editor/PostSectionEditor.js +24 -1
  99. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  100. package/dist/views/post-editor/PostTemplateEditor.js +1 -1
  101. package/dist/views/post-editor/PostTemplateEditor.js.map +1 -1
  102. package/dist/views/seo/LinksTab.d.ts +4 -0
  103. package/dist/views/seo/LinksTab.d.ts.map +1 -0
  104. package/dist/views/seo/LinksTab.js +111 -0
  105. package/dist/views/seo/LinksTab.js.map +1 -0
  106. package/dist/views/seo/OverviewTab.js +1 -1
  107. package/dist/views/seo/OverviewTab.js.map +1 -1
  108. package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
  109. package/dist/views/seo/RedirectsTab.js +39 -6
  110. package/dist/views/seo/RedirectsTab.js.map +1 -1
  111. package/dist/views/seo/TechnicalTab.js +2 -2
  112. package/dist/views/settings/AISettingsTab.js +1 -1
  113. package/dist/views/settings/AiFeaturesCard.js +1 -1
  114. package/dist/views/settings/AiFeaturesCard.js.map +1 -1
  115. package/dist/views/settings/AppearanceTab.js +1 -1
  116. package/dist/views/settings/BrandVoiceCard.js +1 -1
  117. package/dist/views/settings/EmailSettingsTab.js +2 -2
  118. package/dist/views/settings/GeneralSettingsTab.js +1 -1
  119. package/dist/views/settings/SecurityStatusCard.js +1 -1
  120. package/dist/views/settings/SeoSettingsTab.js +4 -4
  121. package/dist/views/settings/UpdatesTab.js +2 -2
  122. package/dist/views/settings/components.js +3 -3
  123. package/dist/views/settings/components.js.map +1 -1
  124. package/package.json +2 -2
  125. package/src/AdminRoot.tsx +3 -2
  126. package/src/LoginRoot.tsx +2 -1
  127. package/src/__tests__/components/resizable-aside.test.tsx +130 -0
  128. package/src/__tests__/components/theme-provider-accent.test.tsx +84 -0
  129. package/src/__tests__/views/portal-container.test.tsx +14 -0
  130. package/src/__tests__/views/redirects-pane.render.test.tsx +6 -0
  131. package/src/__tests__/views/seo-content-pane.render.test.tsx +14 -4
  132. package/src/components/CoauthorResultPopover.tsx +1 -1
  133. package/src/components/EditorSeoAside.tsx +149 -0
  134. package/src/components/MediaPickerModal.tsx +1 -1
  135. package/src/components/SEOConfigPanel.tsx +2 -2
  136. package/src/components/SchedulePublishDialog.tsx +1 -1
  137. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  138. package/src/components/ThemeProvider.tsx +3 -1
  139. package/src/components/VersionHistory.tsx +1 -1
  140. package/src/components/seo/SeoEditorPane.tsx +41 -12
  141. package/src/components/seo/SeoIssueFixPanel.tsx +16 -4
  142. package/src/components/seo/primitives.tsx +7 -3
  143. package/src/components/ui/Card.tsx +5 -5
  144. package/src/components/ui/InspectorPane.tsx +3 -3
  145. package/src/components/ui/PanelSection.tsx +53 -0
  146. package/src/components/ui/ResizableAside.tsx +317 -0
  147. package/src/lib/admin-root-element.ts +15 -0
  148. package/src/lib/portal-container.ts +3 -2
  149. package/src/lib/seo-service.ts +143 -2
  150. package/src/views/ApiKeys.tsx +2 -2
  151. package/src/views/Dashboard.tsx +40 -53
  152. package/src/views/MediaBrowser.tsx +62 -12
  153. package/src/views/PageEditor.tsx +1 -1
  154. package/src/views/Posts/PostTypeEditor.tsx +3 -3
  155. package/src/views/SEO.tsx +6 -0
  156. package/src/views/ScriptTags.tsx +2 -2
  157. package/src/views/Users.tsx +1 -1
  158. package/src/views/page-editor/EditorTopBar.tsx +24 -0
  159. package/src/views/page-editor/PageSectionEditor.tsx +44 -4
  160. package/src/views/page-editor/SectionInspector.tsx +33 -27
  161. package/src/views/page-editor/SectionsPanel.tsx +1 -1
  162. package/src/views/post-editor/PostHeaderPanel.tsx +16 -12
  163. package/src/views/post-editor/PostSectionEditor.tsx +44 -4
  164. package/src/views/post-editor/PostTemplateEditor.tsx +1 -1
  165. package/src/views/seo/LinksTab.tsx +462 -0
  166. package/src/views/seo/OverviewTab.tsx +1 -1
  167. package/src/views/seo/RedirectsTab.tsx +97 -4
  168. package/src/views/seo/TechnicalTab.tsx +2 -2
  169. package/src/views/settings/AISettingsTab.tsx +3 -3
  170. package/src/views/settings/AiFeaturesCard.tsx +1 -1
  171. package/src/views/settings/AppearanceTab.tsx +1 -1
  172. package/src/views/settings/BrandVoiceCard.tsx +2 -2
  173. package/src/views/settings/EmailSettingsTab.tsx +2 -2
  174. package/src/views/settings/GeneralSettingsTab.tsx +3 -3
  175. package/src/views/settings/SecurityStatusCard.tsx +1 -1
  176. package/src/views/settings/SeoSettingsTab.tsx +6 -6
  177. package/src/views/settings/UpdatesTab.tsx +3 -3
  178. package/src/views/settings/components.tsx +3 -3
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useRef, useState } from 'react';
3
+ import { useEffect, useRef, useState } from 'react';
4
4
  import { Plus, Trash2, Upload, Download, Sparkles, ArrowRight, GitBranch, Check, X, Link2, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
- import { fetchRedirectOverview, fetchRedirectRules, fetchRedirectChains, fetchRedirectSuggestions, deleteRedirectRule, flattenRedirectChain, generate404RecoverySuggestions, acceptRedirectSuggestion, dismissRedirectSuggestion, exportRedirectsCsv, importRedirectsCsv, } from '../../lib/seo-service.js';
6
+ import { fetchRedirectOverview, fetchRedirectRules, fetchRedirectChains, fetchRedirectSuggestions, deleteRedirectRule, flattenRedirectChain, generate404RecoverySuggestions, fetchRedirectRecoverySettings, saveRedirectRecoverySettings, acceptRedirectSuggestion, dismissRedirectSuggestion, exportRedirectsCsv, importRedirectsCsv, } from '../../lib/seo-service.js';
7
7
  import { SectionCard, SeoLoading, SeoEmptyState, SeoErrorState, SeoStatusBadge, btnPrimary, btnSecondary, btnGhostIcon, } from '../../components/seo/primitives.js';
8
8
  import { RedirectEditorPane } from '../../components/seo/RedirectEditorPane.js';
9
9
  import { InspectorPane, SplitPaneLayout, SplitPaneList } from '../../components/ui/InspectorPane.js';
@@ -25,6 +25,36 @@ function OverviewCards({ onRefetchKey }) {
25
25
  ];
26
26
  return (_jsx("div", { className: "grid grid-cols-2 gap-4 lg:grid-cols-4", children: cards.map((c) => (_jsxs("div", { className: "border-border bg-card rounded-lg border p-4", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: c.label }), _jsx("p", { className: "text-foreground mt-1 text-2xl font-medium tabular-nums", children: c.value })] }, c.label))) }));
27
27
  }
28
+ function RecoverySettingsCard() {
29
+ const { data, loading, error, refetch } = useSeoResource(fetchRedirectRecoverySettings, []);
30
+ const [saving, setSaving] = useState(false);
31
+ const [local, setLocal] = useState(null);
32
+ useEffect(() => {
33
+ if (data)
34
+ setLocal(data);
35
+ }, [data]);
36
+ async function handleSave() {
37
+ if (!local)
38
+ return;
39
+ setSaving(true);
40
+ const res = await saveRedirectRecoverySettings(local);
41
+ setSaving(false);
42
+ if (res.error)
43
+ return toast.error(res.error);
44
+ toast.success('Recovery settings saved.');
45
+ refetch();
46
+ }
47
+ if (loading)
48
+ return null;
49
+ if (error)
50
+ return null;
51
+ if (!local)
52
+ return null;
53
+ return (_jsx(SectionCard, { title: "404 recovery settings", description: "Control AI re-ranking and optional auto-redirect for high-confidence matches", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("label", { className: "flex items-start gap-3", children: [_jsx("input", { type: "checkbox", className: "border-border mt-1 h-4 w-4 rounded", checked: local.aiRerank, onChange: (e) => setLocal({ ...local, aiRerank: e.target.checked }) }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: "AI re-ranking" }), _jsx("span", { className: "text-muted-foreground block text-sm", children: "Use semantic search to resolve ambiguous matches (40\u201384% heuristic confidence)." })] })] }), _jsxs("label", { className: "flex items-start gap-3", children: [_jsx("input", { type: "checkbox", className: "border-border mt-1 h-4 w-4 rounded", checked: local.autoApply, onChange: (e) => setLocal({ ...local, autoApply: e.target.checked }) }), _jsxs("span", { children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: "Auto-apply high-confidence redirects" }), _jsx("span", { className: "text-muted-foreground block text-sm", children: "Create 301 redirects automatically when confidence meets the threshold (off by default)." })] })] }), _jsxs("label", { className: "block max-w-xs", children: [_jsx("span", { className: "text-foreground text-sm font-medium", children: "Auto-apply minimum confidence" }), _jsx("input", { type: "number", min: 50, max: 100, value: local.autoApplyMinConfidence, disabled: !local.autoApply, onChange: (e) => setLocal({
54
+ ...local,
55
+ autoApplyMinConfidence: Math.max(50, Math.min(100, Number(e.target.value) || 85)),
56
+ }), className: "border-border bg-input-background text-foreground focus-visible:ring-ring mt-1 w-full rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none disabled:opacity-50" })] }), _jsx("button", { className: btnSecondary, onClick: handleSave, disabled: saving, children: saving ? 'Saving…' : 'Save settings' })] }) }));
57
+ }
28
58
  function Ai404RecoveryCard({ onApplied }) {
29
59
  const { data, loading, error, refetch } = useSeoResource(fetchRedirectSuggestions, []);
30
60
  const [generating, setGenerating] = useState(false);
@@ -36,7 +66,10 @@ function Ai404RecoveryCard({ onApplied }) {
36
66
  toast.error(res.error);
37
67
  return;
38
68
  }
39
- toast.success('Generated 404 recovery suggestions.');
69
+ const autoMsg = res.autoApplied && res.autoApplied > 0
70
+ ? ` ${res.autoApplied} high-confidence redirect${res.autoApplied === 1 ? '' : 's'} applied automatically.`
71
+ : '';
72
+ toast.success(`Generated 404 recovery suggestions.${autoMsg}`);
40
73
  refetch();
41
74
  }
42
75
  async function handleAccept(id) {
@@ -53,7 +86,7 @@ function Ai404RecoveryCard({ onApplied }) {
53
86
  return toast.error(res.error);
54
87
  refetch();
55
88
  }
56
- return (_jsx(SectionCard, { title: "AI 404 Recovery", description: "Suggested redirects for paths returning 404s", action: _jsxs("button", { className: btnSecondary, onClick: handleGenerate, disabled: generating, children: [_jsx(Sparkles, { className: `h-4 w-4 ${generating ? 'animate-pulse' : ''}`, "aria-hidden": true }), generating ? 'Analyzing…' : 'Generate suggestions'] }), children: loading ? (_jsx(SeoLoading, {})) : error ? (_jsx(SeoErrorState, { message: error, onRetry: refetch })) : (data ?? []).length === 0 ? (_jsx(SeoEmptyState, { icon: _jsx(Sparkles, { size: 24 }), title: "No suggestions", description: "Generate suggestions to recover traffic from broken URLs." })) : (_jsx("ul", { className: "divide-border divide-y", children: data.map((s) => (_jsxs("li", { className: "flex items-center justify-between gap-3 py-3 first:pt-0", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground flex items-center gap-2 text-sm", children: [_jsx("span", { className: "truncate font-medium", children: s.fromPath }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-muted-foreground truncate", children: s.toPath })] }), s.reason && _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: s.reason })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(SeoStatusBadge, { label: `${Math.round(s.confidence * 100)}%`, tone: s.confidence >= 0.7 ? 'good' : s.confidence >= 0.4 ? 'fair' : 'poor' }), _jsx("button", { onClick: () => handleAccept(s.id), className: "text-success hover:bg-accent focus-visible:ring-ring rounded-md p-1.5 focus-visible:ring-2 focus-visible:outline-none", "aria-label": `Accept redirect from ${s.fromPath}`, children: _jsx(Check, { className: "h-4 w-4", "aria-hidden": true }) }), _jsx("button", { onClick: () => handleDismiss(s.id), className: "text-muted-foreground hover:bg-accent focus-visible:ring-ring rounded-md p-1.5 focus-visible:ring-2 focus-visible:outline-none", "aria-label": `Dismiss suggestion for ${s.fromPath}`, children: _jsx(X, { className: "h-4 w-4", "aria-hidden": true }) })] })] }, s.id))) })) }));
89
+ return (_jsx(SectionCard, { title: "AI 404 Recovery", description: "Suggested redirects for paths returning 404s", action: _jsxs("button", { className: btnSecondary, onClick: handleGenerate, disabled: generating, children: [_jsx(Sparkles, { className: `h-4 w-4 ${generating ? 'animate-pulse' : ''}`, "aria-hidden": true }), generating ? 'Analyzing…' : 'Generate suggestions'] }), children: loading ? (_jsx(SeoLoading, {})) : error ? (_jsx(SeoErrorState, { message: error, onRetry: refetch })) : (data ?? []).length === 0 ? (_jsx(SeoEmptyState, { icon: _jsx(Sparkles, { size: 24 }), title: "No suggestions", description: "Generate suggestions to recover traffic from broken URLs." })) : (_jsx("ul", { className: "divide-border divide-y", children: data.map((s) => (_jsxs("li", { className: "flex items-center justify-between gap-3 py-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("p", { className: "text-foreground flex items-center gap-2 text-sm", children: [_jsx("span", { className: "truncate font-medium", children: s.fromPath }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-muted-foreground truncate", children: s.toPath })] }), s.reason && _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: s.reason })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx(SeoStatusBadge, { label: `${Math.round(s.confidence * 100)}%`, tone: s.confidence >= 0.7 ? 'good' : s.confidence >= 0.4 ? 'fair' : 'poor' }), _jsx("button", { onClick: () => handleAccept(s.id), className: "text-success hover:bg-accent focus-visible:ring-ring rounded-md p-1.5 focus-visible:ring-2 focus-visible:outline-none", "aria-label": `Accept redirect from ${s.fromPath}`, children: _jsx(Check, { className: "h-4 w-4", "aria-hidden": true }) }), _jsx("button", { onClick: () => handleDismiss(s.id), className: "text-muted-foreground hover:bg-accent focus-visible:ring-ring rounded-md p-1.5 focus-visible:ring-2 focus-visible:outline-none", "aria-label": `Dismiss suggestion for ${s.fromPath}`, children: _jsx(X, { className: "h-4 w-4", "aria-hidden": true }) })] })] }, s.id))) })) }));
57
90
  }
58
91
  function ChainMapCard({ onFlattened }) {
59
92
  const { data, loading, error, refetch } = useSeoResource(fetchRedirectChains, []);
@@ -71,7 +104,7 @@ function ChainMapCard({ onFlattened }) {
71
104
  return null;
72
105
  if (!data || data.length === 0)
73
106
  return null;
74
- return (_jsx(SectionCard, { title: "Redirect Chains & Loops", description: "Multi-hop redirects slow crawlers and lose link equity", children: _jsx("ul", { className: "space-y-3", children: data.map((chain) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4", "aria-hidden": true }), _jsx(SeoStatusBadge, { label: chain.kind === 'loop' ? 'Loop' : 'Chain', tone: chain.kind === 'loop' ? 'critical' : 'fair' })] }), _jsx("p", { className: "text-foreground flex flex-wrap items-center gap-1 text-sm", children: chain.hops.map((hop, i) => (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "truncate", children: hop }), i < chain.hops.length - 1 && (_jsx(ArrowRight, { className: "text-muted-foreground h-3 w-3", "aria-hidden": true }))] }, i))) })] }), chain.kind === 'chain' && (_jsx("button", { className: btnSecondary, onClick: () => handleFlatten(chain.id), children: "Flatten" }))] }, chain.id))) }) }));
107
+ return (_jsx(SectionCard, { title: "Redirect Chains & Loops", description: "Multi-hop redirects slow crawlers and lose link equity", children: _jsx("ul", { className: "space-y-3", children: data.map((chain) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "mb-1 flex items-center gap-2", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4", "aria-hidden": true }), _jsx(SeoStatusBadge, { label: chain.kind === 'loop' ? 'Loop' : 'Chain', tone: chain.kind === 'loop' ? 'critical' : 'fair' })] }), _jsx("p", { className: "text-foreground flex flex-wrap items-center gap-1 text-sm", children: chain.hops.map((hop, i) => (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "truncate", children: hop }), i < chain.hops.length - 1 && (_jsx(ArrowRight, { className: "text-muted-foreground h-3 w-3", "aria-hidden": true }))] }, i))) })] }), chain.kind === 'chain' && (_jsx("button", { className: btnSecondary, onClick: () => handleFlatten(chain.id), children: "Flatten" }))] }, chain.id))) }) }));
75
108
  }
76
109
  export function RedirectsTab() {
77
110
  const [refetchKey, setRefetchKey] = useState(0);
@@ -123,7 +156,7 @@ export function RedirectsTab() {
123
156
  }
124
157
  refetchAll();
125
158
  }
126
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(OverviewCards, { onRefetchKey: refetchKey }), _jsxs("div", { className: "grid grid-cols-1 gap-4 xl:grid-cols-2", children: [_jsx(Ai404RecoveryCard, { onApplied: refetchAll }), _jsx(ChainMapCard, { onFlattened: refetchAll })] }), _jsxs(SplitPaneLayout, { className: "h-[calc(100vh-280px)] min-h-[440px]", children: [_jsx(SplitPaneList, { children: _jsx(SectionCard, { title: "Redirect Rules", action: _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx("input", { ref: fileRef, type: "file", accept: ".csv,text/csv", className: "sr-only", "aria-hidden": true, tabIndex: -1, onChange: (e) => {
159
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(OverviewCards, { onRefetchKey: refetchKey }), _jsxs("div", { className: "grid grid-cols-1 gap-4 xl:grid-cols-2", children: [_jsx(RecoverySettingsCard, {}), _jsx(Ai404RecoveryCard, { onApplied: refetchAll }), _jsx(ChainMapCard, { onFlattened: refetchAll })] }), _jsxs(SplitPaneLayout, { className: "h-[calc(100vh-280px)] min-h-[440px]", children: [_jsx(SplitPaneList, { children: _jsx(SectionCard, { title: "Redirect Rules", action: _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx("input", { ref: fileRef, type: "file", accept: ".csv,text/csv", className: "sr-only", "aria-hidden": true, tabIndex: -1, onChange: (e) => {
127
160
  const f = e.target.files?.[0];
128
161
  if (f)
129
162
  handleImportFile(f);
@@ -1 +1 @@
1
- {"version":3,"file":"RedirectsTab.js","sourceRoot":"","sources":["../../../src/views/seo/RedirectsTab.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RedirectsTab.js","sourceRoot":"","sources":["../../../src/views/seo/RedirectsTab.tsx"],"names":[],"mappings":"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"}
@@ -42,7 +42,7 @@ const CRAWL_TOGGLES = [
42
42
  function Toggle({ checked, onChange, label, help, disabled, }) {
43
43
  const labelId = useId();
44
44
  const helpId = useId();
45
- return (_jsxs("div", { className: "flex items-center justify-between gap-3 py-2.5", children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { id: labelId, className: "text-foreground block text-sm font-medium", children: label }), _jsx("span", { id: helpId, className: "text-muted-foreground block text-sm", children: help })] }), _jsx(UiToggle, { checked: checked, onCheckedChange: onChange, disabled: disabled, "aria-labelledby": labelId, "aria-describedby": helpId })] }));
45
+ return (_jsxs("div", { className: "flex items-center justify-between gap-3 py-3.5", children: [_jsxs("span", { className: "min-w-0", children: [_jsx("span", { id: labelId, className: "text-foreground block text-sm font-medium", children: label }), _jsx("span", { id: helpId, className: "text-muted-foreground block text-sm", children: help })] }), _jsx(UiToggle, { checked: checked, onCheckedChange: onChange, disabled: disabled, "aria-labelledby": labelId, "aria-describedby": helpId })] }));
46
46
  }
47
47
  function SitemapCard() {
48
48
  const { data, loading, error, refetch } = useSeoResource(fetchSitemapStatus, []);
@@ -100,7 +100,7 @@ function RobotsCard() {
100
100
  toast.success('robots.txt saved.');
101
101
  refetch();
102
102
  }
103
- return (_jsx(SectionCard, { title: "robots.txt", description: "Controls which crawlers can access your site.", action: _jsx("button", { className: btnPrimary, onClick: handleSave, disabled: saving || loading || !validation.valid, children: saving ? 'Saving…' : 'Save' }), children: loading ? (_jsx(SeoLoading, { label: "Loading robots.txt\u2026" })) : error ? (_jsx(SeoErrorState, { message: error, onRetry: refetch })) : (_jsxs("div", { className: "space-y-3", children: [validation.blocksEntireSite && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 flex items-start gap-2 rounded-md border p-3", role: "alert", children: [_jsx(AlertTriangle, { className: "text-destructive mt-0.5 h-4 w-4 shrink-0", "aria-hidden": true }), _jsx("p", { className: "text-destructive text-sm", children: "This configuration blocks your entire site from all search engines. Pages will be removed from search results." })] })), _jsx("label", { className: "sr-only", htmlFor: "robots-editor", children: "robots.txt contents" }), _jsx("textarea", { id: "robots-editor", value: body, onChange: (e) => setBody(e.target.value), spellCheck: false, className: "border-border bg-input-background text-foreground focus-visible:ring-ring min-h-48 w-full rounded-md border p-3 font-mono text-sm focus-visible:ring-2 focus-visible:outline-none" }), validation.errors.length > 0 ? (_jsx("ul", { className: "space-y-1", children: validation.errors.map((e, i) => (_jsxs("li", { className: "text-destructive flex items-center gap-1.5 text-sm", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5", "aria-hidden": true }), " ", e] }, i))) })) : (_jsxs("p", { className: "text-success flex items-center gap-1.5 text-sm", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5", "aria-hidden": true }), " Valid robots.txt"] })), validation.warnings
103
+ return (_jsx(SectionCard, { title: "robots.txt", description: "Controls which crawlers can access your site.", action: _jsx("button", { className: btnPrimary, onClick: handleSave, disabled: saving || loading || !validation.valid, children: saving ? 'Saving…' : 'Save' }), children: loading ? (_jsx(SeoLoading, { label: "Loading robots.txt\u2026" })) : error ? (_jsx(SeoErrorState, { message: error, onRetry: refetch })) : (_jsxs("div", { className: "space-y-3", children: [validation.blocksEntireSite && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 flex items-start gap-2 rounded-md border p-4", role: "alert", children: [_jsx(AlertTriangle, { className: "text-destructive mt-0.5 h-4 w-4 shrink-0", "aria-hidden": true }), _jsx("p", { className: "text-destructive text-sm", children: "This configuration blocks your entire site from all search engines. Pages will be removed from search results." })] })), _jsx("label", { className: "sr-only", htmlFor: "robots-editor", children: "robots.txt contents" }), _jsx("textarea", { id: "robots-editor", value: body, onChange: (e) => setBody(e.target.value), spellCheck: false, className: "border-border bg-input-background text-foreground focus-visible:ring-ring min-h-48 w-full rounded-md border p-3 font-mono text-sm focus-visible:ring-2 focus-visible:outline-none" }), validation.errors.length > 0 ? (_jsx("ul", { className: "space-y-1", children: validation.errors.map((e, i) => (_jsxs("li", { className: "text-destructive flex items-center gap-1.5 text-sm", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5", "aria-hidden": true }), " ", e] }, i))) })) : (_jsxs("p", { className: "text-success flex items-center gap-1.5 text-sm", children: [_jsx(CheckCircle2, { className: "h-3.5 w-3.5", "aria-hidden": true }), " Valid robots.txt"] })), validation.warnings
104
104
  .filter((w) => !validation.blocksEntireSite || !w.includes('blocks the entire site'))
105
105
  .map((w, i) => (_jsxs("p", { className: "text-warning flex items-center gap-1.5 text-sm", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5", "aria-hidden": true }), " ", w] }, i)))] })) }));
106
106
  }
@@ -52,7 +52,7 @@ export function AISettingsTab({ role, config }) {
52
52
  if (ai.loading) {
53
53
  return (_jsxs("div", { className: "space-y-4", "aria-busy": "true", "aria-live": "polite", children: [_jsx("span", { className: "sr-only", children: "Loading AI settings\u2026" }), [0, 1, 2].map((i) => (_jsxs("div", { className: "border-border bg-card rounded-lg border p-6", children: [_jsx("div", { className: "bg-muted mb-4 h-4 w-40 animate-pulse rounded" }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" }), _jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" })] })] }, i)))] }));
54
54
  }
55
- return (_jsxs("div", { className: "space-y-4", children: [ai.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: ai.loadError }), _jsx("button", { type: "button", onClick: ai.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to AI settings. Only administrators can make changes."] })), _jsx(AssistantCard, { ai: ai, canEdit: canEdit }), _jsx(ProviderConnectionsSection, { ai: ai, canEdit: canEdit }), _jsx(AiFeaturesCard, { features: ai.form.features, models: ai.models, defaultModelId: ai.form.defaultModelId, canEdit: canEdit, onToggle: ai.toggleFeature, onSetFeatureModel: ai.setFeatureModel }), _jsx(BrandVoiceCard, { value: ai.form.brandVoice, canEdit: canEdit, onChange: ai.setBrandVoice, config: config, onAnalyze: canEdit ? ai.analyzeBrandVoice : undefined, onScore: canEdit ? ai.scoreBrandVoice : undefined, editMode: ai.brandVoiceEditMode, onEditModeChange: ai.setBrandVoiceEditMode, aiReadiness: brandVoiceAiReadiness }), _jsx(MonthlyUsageCard, { usage: ai.usage, monthlyTokenLimit: ai.form.monthlyTokenLimit, onChangeLimit: ai.setMonthlyTokenLimit, budgetError: ai.budgetError, canEdit: canEdit }), ai.saveState === 'error' && ai.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: ai.saveError })] })), _jsx(SettingsSaveBar, { dirty: ai.dirty, canEdit: canEdit, hasErrors: Boolean(ai.budgetError), saveState: ai.saveState, onSave: ai.save, onReset: ai.reset })] }));
55
+ return (_jsxs("div", { className: "space-y-4", children: [ai.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: ai.loadError }), _jsx("button", { type: "button", onClick: ai.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to AI settings. Only administrators can make changes."] })), _jsx(AssistantCard, { ai: ai, canEdit: canEdit }), _jsx(ProviderConnectionsSection, { ai: ai, canEdit: canEdit }), _jsx(AiFeaturesCard, { features: ai.form.features, models: ai.models, defaultModelId: ai.form.defaultModelId, canEdit: canEdit, onToggle: ai.toggleFeature, onSetFeatureModel: ai.setFeatureModel }), _jsx(BrandVoiceCard, { value: ai.form.brandVoice, canEdit: canEdit, onChange: ai.setBrandVoice, config: config, onAnalyze: canEdit ? ai.analyzeBrandVoice : undefined, onScore: canEdit ? ai.scoreBrandVoice : undefined, editMode: ai.brandVoiceEditMode, onEditModeChange: ai.setBrandVoiceEditMode, aiReadiness: brandVoiceAiReadiness }), _jsx(MonthlyUsageCard, { usage: ai.usage, monthlyTokenLimit: ai.form.monthlyTokenLimit, onChangeLimit: ai.setMonthlyTokenLimit, budgetError: ai.budgetError, canEdit: canEdit }), ai.saveState === 'error' && ai.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: ai.saveError })] })), _jsx(SettingsSaveBar, { dirty: ai.dirty, canEdit: canEdit, hasErrors: Boolean(ai.budgetError), saveState: ai.saveState, onSave: ai.save, onReset: ai.reset })] }));
56
56
  }
57
57
  // ---------------------------------------------------------------------------
58
58
  // AI Assistant — default provider + default model
@@ -24,7 +24,7 @@ function FeatureRow({ feature, models, defaultModelId, canEdit, onToggle, onSetF
24
24
  const defaultLabel = defaultModel
25
25
  ? `Use default (${defaultModel.displayName})`
26
26
  : 'Use default model';
27
- return (_jsxs("div", { className: "py-4 first:pt-0 last:pb-0", children: [_jsx(SettingsToggleRow, { label: feature.label, description: feature.description, checked: feature.enabled, disabled: !canEdit, onChange: (v) => onToggle(feature.key, v) }), feature.enabled && (_jsxs("div", { className: "mt-3 pl-0", children: [_jsx("label", { htmlFor: selectId, className: "text-muted-foreground mb-1 block text-sm", children: "Model" }), hasModels ? (_jsxs("select", { id: selectId, value: feature.modelId ?? '', disabled: !canEdit, onChange: (e) => onSetFeatureModel(feature.key, e.target.value), className: SELECT_CLASS, children: [_jsx("option", { value: "", children: defaultLabel }), models.map((m) => {
27
+ return (_jsxs("div", { className: "py-4", children: [_jsx(SettingsToggleRow, { label: feature.label, description: feature.description, checked: feature.enabled, disabled: !canEdit, onChange: (v) => onToggle(feature.key, v) }), feature.enabled && (_jsxs("div", { className: "mt-3 pl-0", children: [_jsx("label", { htmlFor: selectId, className: "text-muted-foreground mb-1 block text-sm", children: "Model" }), hasModels ? (_jsxs("select", { id: selectId, value: feature.modelId ?? '', disabled: !canEdit, onChange: (e) => onSetFeatureModel(feature.key, e.target.value), className: SELECT_CLASS, children: [_jsx("option", { value: "", children: defaultLabel }), models.map((m) => {
28
28
  const compatible = isModelCompatible(m, required);
29
29
  return (_jsxs("option", { value: m.id, disabled: !compatible, children: [m.displayName, m.status === 'unavailable' ? ' (unavailable)' : '', m.status !== 'unavailable' && !compatible ? ' (incompatible)' : ''] }, m.id));
30
30
  })] })) : (_jsx("p", { className: "text-muted-foreground text-sm", children: "Connect a provider and refresh models to route this feature." })), hasModels && !effective.isOverride && (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: effective.model
@@ -1 +1 @@
1
- {"version":3,"file":"AiFeaturesCard.js","sourceRoot":"","sources":["../../../src/views/settings/AiFeaturesCard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AiFeaturesCard.js","sourceRoot":"","sources":["../../../src/views/settings/AiFeaturesCard.tsx"],"names":[],"mappings":"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"}
@@ -19,6 +19,6 @@ export function AppearanceTab({ role, config }) {
19
19
  if (s.loadError) {
20
20
  return (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center justify-between gap-4 rounded-lg border p-4 text-sm", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(AlertTriangle, { size: 16, "aria-hidden": "true" }), " ", s.loadError] }), _jsxs("button", { type: "button", onClick: s.reload, className: "border-destructive/40 text-destructive hover:bg-destructive/10 inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5", children: [_jsx(Loader2, { size: 14, "aria-hidden": "true" }), " Retry"] })] }));
21
21
  }
22
- return (_jsxs("div", { className: "space-y-4", children: [!canEdit && (_jsx("p", { className: "text-muted-foreground border-border bg-muted rounded-lg border p-3 text-sm", children: "You have read-only access to appearance settings." })), _jsx(SettingsValidationSummary, { issues: s.issues }), _jsx(BrandingCard, { s: s, canEdit: canEdit }), _jsx(AdminThemeCard, { s: s, canEdit: canEdit }), _jsx(TypographyMotionCard, { s: s, canEdit: canEdit }), _jsx(BrandPreviewCard, { s: s }), _jsx(SettingsSaveBar, { dirty: s.dirty, canEdit: canEdit, hasErrors: s.issues.some((i) => i.severity === 'error'), saveState: s.saveState, onSave: s.save, onReset: s.reset })] }));
22
+ return (_jsxs("div", { className: "space-y-4", children: [!canEdit && (_jsx("p", { className: "text-muted-foreground border-border bg-muted rounded-lg border p-4 text-sm", children: "You have read-only access to appearance settings." })), _jsx(SettingsValidationSummary, { issues: s.issues }), _jsx(BrandingCard, { s: s, canEdit: canEdit }), _jsx(AdminThemeCard, { s: s, canEdit: canEdit }), _jsx(TypographyMotionCard, { s: s, canEdit: canEdit }), _jsx(BrandPreviewCard, { s: s }), _jsx(SettingsSaveBar, { dirty: s.dirty, canEdit: canEdit, hasErrors: s.issues.some((i) => i.severity === 'error'), saveState: s.saveState, onSave: s.save, onReset: s.reset })] }));
23
23
  }
24
24
  //# sourceMappingURL=AppearanceTab.js.map
@@ -220,7 +220,7 @@ export function BrandVoiceCard({ value, canEdit, onChange, config, onAnalyze, on
220
220
  setUploads((prev) => [...prev, ...next].slice(0, 5));
221
221
  toast.success(`Added ${next.length} upload${next.length === 1 ? '' : 's'}.`);
222
222
  }, []);
223
- return (_jsx(SettingsCard, { title: "Brand voice", description: "Teach the AI how your brand sounds. Applied to content writing and SEO copy.", children: _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Apply brand voice", description: "When on, generated copy follows the tone and guidelines below.", checked: value.enabled, disabled: disabled, onChange: (v) => onChange({ enabled: v }) }), aiReadiness && !aiReadiness.ready && aiReadiness.message && (_jsxs("div", { role: "status", className: "border-warning/40 bg-warning/10 text-foreground flex items-start gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "text-warning mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("p", { children: aiReadiness.message })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("button", { type: "button", onClick: handleExport, disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Download, { size: 14, "aria-hidden": "true" }), "Export .md"] }), _jsxs("button", { type: "button", onClick: () => importRef.current?.click(), disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(FileUp, { size: 14, "aria-hidden": "true" }), "Import .md"] }), _jsx("input", { ref: importRef, id: importInputId, type: "file", accept: ".md,text/markdown,text/plain", className: "sr-only", disabled: disabled, onChange: (e) => void handleImportFile(e.target.files?.[0]) }), !showAdvanced ? (_jsx("button", { type: "button", onClick: openAdvanced, disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Advanced profile document" })) : (_jsx("button", { type: "button", onClick: () => onEditModeChange('form'), disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Back to quick edit" }))] }), importError && (_jsx("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-3 text-sm", children: importError })), onAnalyze && (_jsxs("div", { id: generatePanelId, className: "border-border space-y-3 rounded-md border border-dashed p-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-foreground text-base font-medium", children: "Generate from content" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Scan published pages and posts, public URLs, or uploaded text files to draft a profile you can edit before saving." })] }), collections.length > 0 && (_jsxs("fieldset", { className: "space-y-2", disabled: disabled || analyzing, children: [_jsx("legend", { className: "text-foreground mb-1 text-sm font-medium", children: "CMS collections" }), collections.map((col) => {
223
+ return (_jsx(SettingsCard, { title: "Brand voice", description: "Teach the AI how your brand sounds. Applied to content writing and SEO copy.", children: _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Apply brand voice", description: "When on, generated copy follows the tone and guidelines below.", checked: value.enabled, disabled: disabled, onChange: (v) => onChange({ enabled: v }) }), aiReadiness && !aiReadiness.ready && aiReadiness.message && (_jsxs("div", { role: "status", className: "border-warning/40 bg-warning/10 text-foreground flex items-start gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "text-warning mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("p", { children: aiReadiness.message })] })), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("button", { type: "button", onClick: handleExport, disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Download, { size: 14, "aria-hidden": "true" }), "Export .md"] }), _jsxs("button", { type: "button", onClick: () => importRef.current?.click(), disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(FileUp, { size: 14, "aria-hidden": "true" }), "Import .md"] }), _jsx("input", { ref: importRef, id: importInputId, type: "file", accept: ".md,text/markdown,text/plain", className: "sr-only", disabled: disabled, onChange: (e) => void handleImportFile(e.target.files?.[0]) }), !showAdvanced ? (_jsx("button", { type: "button", onClick: openAdvanced, disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Advanced profile document" })) : (_jsx("button", { type: "button", onClick: () => onEditModeChange('form'), disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Back to quick edit" }))] }), importError && (_jsx("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-4 text-sm", children: importError })), onAnalyze && (_jsxs("div", { id: generatePanelId, className: "border-border space-y-3 rounded-md border border-dashed p-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-foreground text-base font-medium", children: "Generate from content" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Scan published pages and posts, public URLs, or uploaded text files to draft a profile you can edit before saving." })] }), collections.length > 0 && (_jsxs("fieldset", { className: "space-y-2", disabled: disabled || analyzing, children: [_jsx("legend", { className: "text-foreground mb-1 text-sm font-medium", children: "CMS collections" }), collections.map((col) => {
224
224
  const inputId = `${generatePanelId}-${col.slug}`;
225
225
  const checked = selectedCollections.includes(col.slug);
226
226
  return (_jsxs("label", { htmlFor: inputId, className: "text-foreground flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { id: inputId, type: "checkbox", checked: checked, disabled: disabled || analyzing, onChange: (e) => toggleCollection(col.slug, e.target.checked), className: "border-border text-primary focus-visible:ring-ring size-4 rounded border focus-visible:ring-2 focus-visible:outline-none" }), col.label] }, col.slug));
@@ -30,7 +30,7 @@ function Notice({ tone, children, }) {
30
30
  ? 'border-destructive/30 bg-destructive/10 text-destructive'
31
31
  : 'border-border bg-muted text-muted-foreground';
32
32
  const Icon = tone === 'success' ? CheckCircle2 : tone === 'info' ? Info : AlertTriangle;
33
- return (_jsxs("div", { role: "status", "aria-live": "polite", className: `flex items-start gap-2.5 rounded-lg border p-3 text-sm ${toneClass}`, children: [_jsx(Icon, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("div", { className: "min-w-0", children: children })] }));
33
+ return (_jsxs("div", { role: "status", "aria-live": "polite", className: `flex items-start gap-2.5 rounded-lg border p-4 text-sm ${toneClass}`, children: [_jsx(Icon, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("div", { className: "min-w-0", children: children })] }));
34
34
  }
35
35
  function ProviderFields({ s, canEdit }) {
36
36
  const ids = {
@@ -60,7 +60,7 @@ export function EmailSettingsTab({ role }) {
60
60
  return (_jsx("div", { className: "flex h-48 items-center justify-center", "aria-label": "Loading email settings", children: _jsx(Loader2, { className: "text-brand h-6 w-6 animate-spin", "aria-hidden": "true" }) }));
61
61
  }
62
62
  if (s.loadError) {
63
- return (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 20, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: s.loadError }), _jsx("button", { onClick: s.reload, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] }));
63
+ return (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 20, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: s.loadError }), _jsx("button", { onClick: s.reload, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] }));
64
64
  }
65
65
  const configured = s.form.provider !== '';
66
66
  return (_jsxs("div", { className: "space-y-4", children: [!canEdit && (_jsx(Notice, { tone: "info", children: "You have read-only access to email settings. Ask an administrator to make changes." })), s.platformAdapter && (_jsxs(Notice, { tone: "info", children: ["A platform email adapter is configured in code (", _jsx("code", { children: "platform.email" }), "); it takes precedence over the settings on this page."] })), !s.platformAdapter && s.env.provider && (_jsxs(Notice, { tone: "info", children: ["Environment variables currently configure", ' ', _jsx("strong", { children: PROVIDER_LABEL[s.env.provider] }), ". Settings saved here take precedence over the environment configuration."] })), configured && !s.factoryAvailable && (_jsxs(Notice, { tone: "warning", children: ["Sending with these settings requires the email plugin. Add ", _jsx("code", { children: "emailPlugin()" }), " from", ' ', _jsx("code", { children: "@actuate-media/plugin-email" }), " to your ", _jsx("code", { children: "actuate.config.ts" }), "."] })), _jsxs(SettingsCard, { title: "Email delivery", description: "Transactional email provider for invitations, password resets, and form notifications. Credentials are encrypted at rest.", actions: _jsxs("button", { type: "button", onClick: () => void s.sendTest(), disabled: s.testing || s.dirty || (!configured && !s.env.senderActive), title: s.dirty ? 'Save your changes before sending a test.' : undefined, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [s.testing ? (_jsx(Loader2, { size: 14, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Send, { size: 14, "aria-hidden": "true" })), "Send test email"] }), children: [_jsxs("div", { className: "space-y-5", children: [_jsxs("div", { children: [_jsx("span", { id: providerGroupId, className: LABEL_CLASS, children: "Provider" }), _jsx("div", { role: "radiogroup", "aria-labelledby": providerGroupId, className: "flex flex-wrap gap-2", children: [{ value: '', label: 'None' }, ...EMAIL_PROVIDER_OPTIONS].map((opt) => {
@@ -14,6 +14,6 @@ export function GeneralSettingsTab({ onNavigate, role }) {
14
14
  if (settings.loading) {
15
15
  return (_jsxs("div", { className: "space-y-4", "aria-busy": "true", "aria-live": "polite", children: [_jsx("span", { className: "sr-only", children: "Loading settings\u2026" }), [0, 1, 2, 3].map((i) => (_jsxs("div", { className: "border-border bg-card rounded-lg border p-6", children: [_jsx("div", { className: "bg-muted mb-4 h-4 w-40 animate-pulse rounded" }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" }), _jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" })] })] }, i)))] }));
16
16
  }
17
- return (_jsxs("div", { className: "space-y-4", children: [settings.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: settings.loadError }), _jsx("button", { type: "button", onClick: settings.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to settings. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: settings.issues }), _jsx(SiteIndexStatusCard, { status: settings.indexStatus, loading: settings.loading, onNavigate: onNavigate, onRunAudit: runAudit }), _jsx(SiteInformationCard, { form: settings.form, setField: settings.setField, sources: settings.sources, issues: settings.issues, canEdit: canEdit }), _jsx(LanguageRegionCard, { form: settings.form, setField: settings.setField, issues: settings.issues, canEdit: canEdit }), _jsx(SeoRobotsDefaultsCard, { form: settings.form, setField: settings.setField, isProduction: settings.isProduction, indexStatus: settings.indexStatus, canEdit: canEdit, onNavigate: onNavigate }), settings.saveState === 'error' && settings.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: settings.saveError }), _jsx("button", { type: "button", onClick: settings.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: settings.dirty, canEdit: canEdit, hasErrors: settings.hasErrors, saveState: settings.saveState, onSave: settings.save, onReset: settings.reset })] }));
17
+ return (_jsxs("div", { className: "space-y-4", children: [settings.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: settings.loadError }), _jsx("button", { type: "button", onClick: settings.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to settings. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: settings.issues }), _jsx(SiteIndexStatusCard, { status: settings.indexStatus, loading: settings.loading, onNavigate: onNavigate, onRunAudit: runAudit }), _jsx(SiteInformationCard, { form: settings.form, setField: settings.setField, sources: settings.sources, issues: settings.issues, canEdit: canEdit }), _jsx(LanguageRegionCard, { form: settings.form, setField: settings.setField, issues: settings.issues, canEdit: canEdit }), _jsx(SeoRobotsDefaultsCard, { form: settings.form, setField: settings.setField, isProduction: settings.isProduction, indexStatus: settings.indexStatus, canEdit: canEdit, onNavigate: onNavigate }), settings.saveState === 'error' && settings.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: settings.saveError }), _jsx("button", { type: "button", onClick: settings.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: settings.dirty, canEdit: canEdit, hasErrors: settings.hasErrors, saveState: settings.saveState, onSave: settings.save, onReset: settings.reset })] }));
18
18
  }
19
19
  //# sourceMappingURL=GeneralSettingsTab.js.map
@@ -29,6 +29,6 @@ const SEVERITY_STYLES = {
29
29
  export function SecurityStatusCard({ status, onNavigate, }) {
30
30
  const style = LEVEL_STYLES[status.status];
31
31
  const { Icon } = style;
32
- return (_jsxs(SettingsCard, { title: "Security Status", description: status.description, actions: _jsxs("span", { className: `inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-sm font-medium ${style.pill}`, children: [_jsx(Icon, { size: 15, "aria-hidden": "true" }), style.word] }), children: [_jsx("div", { className: "grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2", children: status.checks.map((check) => (_jsxs("button", { type: "button", disabled: !check.actionHref || !onNavigate, onClick: () => check.actionHref && onNavigate?.(check.actionHref), className: "enabled:hover:bg-accent/50 flex items-center justify-between gap-3 rounded-md py-1.5 text-left text-sm disabled:cursor-default", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(CheckIcon, { status: check.status }), _jsx("span", { className: "text-foreground", children: check.label })] }), check.value !== undefined && (_jsx("span", { className: "text-muted-foreground text-right", children: check.value }))] }, check.key))) }), status.warnings.length > 0 && (_jsx("div", { className: "mt-4 space-y-2", "aria-live": "polite", children: status.warnings.map((w) => (_jsxs("div", { role: "note", className: `flex items-start justify-between gap-3 rounded-lg border p-3 text-sm ${SEVERITY_STYLES[w.severity]}`, children: [_jsxs("div", { children: [_jsx("p", { className: "font-medium", children: w.title }), _jsx("p", { className: "mt-0.5 opacity-90", children: w.description })] }), w.actionHref && w.actionLabel && onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate(w.actionHref), className: "shrink-0 self-center rounded-md border border-current/30 px-2.5 py-1 text-xs font-medium hover:opacity-80", children: w.actionLabel }))] }, w.id))) }))] }));
32
+ return (_jsxs(SettingsCard, { title: "Security Status", description: status.description, actions: _jsxs("span", { className: `inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-sm font-medium ${style.pill}`, children: [_jsx(Icon, { size: 15, "aria-hidden": "true" }), style.word] }), children: [_jsx("div", { className: "grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2", children: status.checks.map((check) => (_jsxs("button", { type: "button", disabled: !check.actionHref || !onNavigate, onClick: () => check.actionHref && onNavigate?.(check.actionHref), className: "enabled:hover:bg-accent/50 flex items-center justify-between gap-3 rounded-md py-1.5 text-left text-sm disabled:cursor-default", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(CheckIcon, { status: check.status }), _jsx("span", { className: "text-foreground", children: check.label })] }), check.value !== undefined && (_jsx("span", { className: "text-muted-foreground text-right", children: check.value }))] }, check.key))) }), status.warnings.length > 0 && (_jsx("div", { className: "mt-4 space-y-2", "aria-live": "polite", children: status.warnings.map((w) => (_jsxs("div", { role: "note", className: `flex items-start justify-between gap-3 rounded-lg border p-4 text-sm ${SEVERITY_STYLES[w.severity]}`, children: [_jsxs("div", { children: [_jsx("p", { className: "font-medium", children: w.title }), _jsx("p", { className: "mt-0.5 opacity-90", children: w.description })] }), w.actionHref && w.actionLabel && onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate(w.actionHref), className: "shrink-0 self-center rounded-md border border-current/30 px-2.5 py-1 text-xs font-medium hover:opacity-80", children: w.actionLabel }))] }, w.id))) }))] }));
33
33
  }
34
34
  //# sourceMappingURL=SecurityStatusCard.js.map
@@ -44,7 +44,7 @@ export function SeoSettingsTab({ onNavigate, role }) {
44
44
  if (seo.loading) {
45
45
  return (_jsxs("div", { className: "space-y-4", "aria-busy": "true", "aria-live": "polite", children: [_jsx("span", { className: "sr-only", children: "Loading SEO settings\u2026" }), [0, 1, 2, 3].map((i) => (_jsxs("div", { className: "border-border bg-card rounded-lg border p-6", children: [_jsx("div", { className: "bg-muted mb-4 h-4 w-40 animate-pulse rounded" }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" }), _jsx("div", { className: "bg-muted h-9 w-full animate-pulse rounded" })] })] }, i)))] }));
46
46
  }
47
- return (_jsxs("div", { className: "space-y-4", children: [_jsx(SeoWorkspaceCallout, { onNavigate: onNavigate }), seo.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.loadError }), _jsx("button", { type: "button", onClick: seo.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to SEO defaults. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: seo.issues }), _jsx(MetaDefaultsCard, { seo: seo, canEdit: canEdit }), _jsx(OrganizationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchEngineVerificationCard, { seo: seo, canEdit: canEdit }), _jsx(SitemapDefaultsCard, { seo: seo, canEdit: canEdit, onNavigate: onNavigate }), _jsxs("details", { className: "border-border bg-card group rounded-lg border", children: [_jsxs("summary", { className: "text-foreground flex cursor-pointer list-none items-center justify-between p-4 text-base font-medium", children: [_jsx("span", { children: "Advanced & per-collection SEO" }), _jsx("span", { className: "text-muted-foreground text-sm font-normal group-open:hidden", children: "Show" }), _jsx("span", { className: "text-muted-foreground hidden text-sm font-normal group-open:inline", children: "Hide" })] }), _jsxs("div", { className: "border-border border-t p-4", children: [_jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Site name, social handle, per-collection schema, and route toggles. These share the same SEO configuration as the defaults above." }), _jsx(SEOConfigPanel, {})] })] }), seo.saveState === 'error' && seo.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.saveError }), _jsx("button", { type: "button", onClick: seo.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: seo.dirty, canEdit: canEdit, hasErrors: seo.hasErrors, saveState: seo.saveState, onSave: seo.save, onReset: seo.reset })] }));
47
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(SeoWorkspaceCallout, { onNavigate: onNavigate }), seo.loadError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.loadError }), _jsx("button", { type: "button", onClick: seo.refetch, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), !canEdit && (_jsxs("div", { className: "border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm", children: [_jsx(Info, { size: 16, className: "shrink-0", "aria-hidden": "true" }), "You have read-only access to SEO defaults. Only administrators can make changes."] })), _jsx(SettingsValidationSummary, { issues: seo.issues }), _jsx(MetaDefaultsCard, { seo: seo, canEdit: canEdit }), _jsx(OrganizationCard, { seo: seo, canEdit: canEdit }), _jsx(SearchEngineVerificationCard, { seo: seo, canEdit: canEdit }), _jsx(SitemapDefaultsCard, { seo: seo, canEdit: canEdit, onNavigate: onNavigate }), _jsxs("details", { className: "border-border bg-card group rounded-lg border", children: [_jsxs("summary", { className: "text-foreground flex cursor-pointer list-none items-center justify-between p-4 text-base font-medium", children: [_jsx("span", { children: "Advanced & per-collection SEO" }), _jsx("span", { className: "text-muted-foreground text-sm font-normal group-open:hidden", children: "Show" }), _jsx("span", { className: "text-muted-foreground hidden text-sm font-normal group-open:inline", children: "Hide" })] }), _jsxs("div", { className: "border-border border-t p-4", children: [_jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Site name, social handle, per-collection schema, and route toggles. These share the same SEO configuration as the defaults above." }), _jsx(SEOConfigPanel, {})] })] }), seo.saveState === 'error' && seo.saveError && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: seo.saveError }), _jsx("button", { type: "button", onClick: seo.save, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), _jsx(SettingsSaveBar, { dirty: seo.dirty, canEdit: canEdit, hasErrors: seo.hasErrors, saveState: seo.saveState, onSave: seo.save, onReset: seo.reset })] }));
48
48
  }
49
49
  // ---------------------------------------------------------------------------
50
50
  // Full SEO workspace callout
@@ -78,9 +78,9 @@ function MetaDefaultsCard({ seo, canEdit }) {
78
78
  }, className: "text-muted-foreground hover:text-destructive inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-sm transition-colors", children: [_jsx(X, { size: 14, "aria-hidden": "true" }), "Remove"] }))] }), _jsx("p", { className: "text-muted-foreground text-sm", children: "1200\u00D7630 recommended" })] })] })] })] }), _jsx(SeoPreviewCard, { title: previewTitle(form.titleTemplate, seo.siteName), url: seo.siteUrl || 'https://example.com', description: form.defaultMetaDescription.trim() || 'Your default meta description appears here.', image: form.defaultOgImage, siteName: seo.siteName }), _jsx(MediaPickerModal, { open: pickerOpen, onClose: () => setPickerOpen(false), accept: "image/*", onSelect: (url) => setField('defaultOgImage', url), onSelectItem: (item) => setField('defaultSocialImageAssetId', item.id) })] }));
79
79
  }
80
80
  function SeoPreviewCard({ title, url, description, image, siteName, }) {
81
- return (_jsxs("div", { className: "border-border mt-4 grid gap-4 border-t pt-4 sm:grid-cols-2", children: [_jsxs("div", { className: "border-border rounded-lg border p-3", children: [_jsx("p", { className: "text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase", children: "Search preview" }), _jsx("p", { className: "text-success truncate text-sm", children: url }), _jsx("p", { className: "text-primary truncate text-lg leading-snug", children: title }), _jsx("p", { className: "text-muted-foreground line-clamp-2 text-sm", children: description })] }), _jsxs("div", { className: "border-border overflow-hidden rounded-lg border", children: [_jsx("div", { className: "bg-muted flex aspect-1200/630 items-center justify-center", children: image ? (
81
+ return (_jsxs("div", { className: "border-border mt-4 grid gap-4 border-t pt-4 sm:grid-cols-2", children: [_jsxs("div", { className: "border-border rounded-lg border p-4", children: [_jsx("p", { className: "text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase", children: "Search preview" }), _jsx("p", { className: "text-success truncate text-sm", children: url }), _jsx("p", { className: "text-primary truncate text-lg leading-snug", children: title }), _jsx("p", { className: "text-muted-foreground line-clamp-2 text-sm", children: description })] }), _jsxs("div", { className: "border-border overflow-hidden rounded-lg border", children: [_jsx("div", { className: "bg-muted flex aspect-1200/630 items-center justify-center", children: image ? (
82
82
  // eslint-disable-next-line @next/next/no-img-element
83
- _jsx("img", { src: image, alt: "Social share preview", className: "h-full w-full object-cover" })) : (_jsx(ImageIcon, { size: 24, className: "text-muted-foreground", "aria-hidden": "true" })) }), _jsxs("div", { className: "p-3", children: [_jsx("p", { className: "text-muted-foreground truncate text-xs uppercase", children: siteName || new URL(url).hostname }), _jsx("p", { className: "text-foreground truncate text-sm font-medium", children: title }), _jsx("p", { className: "text-muted-foreground line-clamp-1 text-xs", children: description })] })] })] }));
83
+ _jsx("img", { src: image, alt: "Social share preview", className: "h-full w-full object-cover" })) : (_jsx(ImageIcon, { size: 24, className: "text-muted-foreground", "aria-hidden": "true" })) }), _jsxs("div", { className: "p-4", children: [_jsx("p", { className: "text-muted-foreground truncate text-xs uppercase", children: siteName || new URL(url).hostname }), _jsx("p", { className: "text-foreground truncate text-sm font-medium", children: title }), _jsx("p", { className: "text-muted-foreground line-clamp-1 text-xs", children: description })] })] })] }));
84
84
  }
85
85
  // ---------------------------------------------------------------------------
86
86
  // Organization (Schema.org)
@@ -133,7 +133,7 @@ function SitemapDefaultsCard({ seo, canEdit, onNavigate, }) {
133
133
  const lastGenerated = sitemap?.lastGeneratedAt
134
134
  ? new Date(sitemap.lastGeneratedAt).toLocaleString()
135
135
  : 'Never';
136
- return (_jsxs(SettingsCard, { title: "Sitemap", description: "Control XML sitemap generation and whether search engines are pinged on publish.", children: [!siteUrl && (_jsxs("div", { className: "border-warning/30 bg-warning/10 text-warning mb-4 flex items-start gap-2 rounded-md border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "Site URL is not set \u2014 sitemap URLs may be incorrect. Set it in Settings \u2192 General."] })), _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Auto-generate XML sitemap", description: "Rebuild the sitemap whenever content is published.", checked: form.autoGenerateSitemap, disabled: !canEdit, onChange: requestAutoGenerate }), _jsx(SettingsToggleRow, { label: "Ping search engines on publish", description: "Notify Google and Bing when the sitemap changes.", checked: form.pingOnPublish, disabled: !canEdit || !form.autoGenerateSitemap, onChange: (v) => setField('pingOnPublish', v) })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "Sitemap URL" }), sitemap?.sitemapUrl ? (_jsxs("a", { href: sitemap.sitemapUrl, target: "_blank", rel: "noreferrer", className: "text-brand inline-flex items-center gap-1 font-medium hover:underline", children: ["View sitemap", _jsx(ExternalLink, { size: 13, "aria-hidden": "true" })] })) : (_jsx("span", { className: "text-foreground font-medium", children: "/sitemap.xml" }))] }), _jsx(SummaryRow, { label: "Last generated", value: lastGenerated }), _jsx(SummaryRow, { label: "Included URLs", value: String(sitemap?.pagesIncluded ?? '—') }), _jsx(SummaryRow, { label: "Excluded URLs", value: String(sitemap?.pagesExcluded ?? '—') }), _jsxs("div", { className: "flex items-center justify-between gap-2 pt-1", children: [_jsxs("button", { type: "button", onClick: regenerateSitemap, disabled: !canEdit || regenerating, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-60", children: [regenerating ? (_jsx(Loader2, { size: 14, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(RefreshCw, { size: 14, "aria-hidden": "true" })), "Regenerate now"] }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/seo?tab=technical'), className: "text-brand text-sm hover:underline", children: "Manage in SEO Technical \u2192" }))] })] }), _jsx(ConfirmDangerousSettingDialog, { open: pendingDisable, title: "Stop auto-generating the sitemap on production?", description: "Your sitemap may go stale as content changes, which can hurt how quickly search engines discover new pages.", confirmLabel: "Turn Off", onConfirm: () => {
136
+ return (_jsxs(SettingsCard, { title: "Sitemap", description: "Control XML sitemap generation and whether search engines are pinged on publish.", children: [!siteUrl && (_jsxs("div", { className: "border-warning/30 bg-warning/10 text-warning mb-4 flex items-start gap-2 rounded-md border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), "Site URL is not set \u2014 sitemap URLs may be incorrect. Set it in Settings \u2192 General."] })), _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Auto-generate XML sitemap", description: "Rebuild the sitemap whenever content is published.", checked: form.autoGenerateSitemap, disabled: !canEdit, onChange: requestAutoGenerate }), _jsx(SettingsToggleRow, { label: "Ping search engines on publish", description: "Notify Google and Bing when the sitemap changes.", checked: form.pingOnPublish, disabled: !canEdit || !form.autoGenerateSitemap, onChange: (v) => setField('pingOnPublish', v) })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: "Sitemap URL" }), sitemap?.sitemapUrl ? (_jsxs("a", { href: sitemap.sitemapUrl, target: "_blank", rel: "noreferrer", className: "text-brand inline-flex items-center gap-1 font-medium hover:underline", children: ["View sitemap", _jsx(ExternalLink, { size: 13, "aria-hidden": "true" })] })) : (_jsx("span", { className: "text-foreground font-medium", children: "/sitemap.xml" }))] }), _jsx(SummaryRow, { label: "Last generated", value: lastGenerated }), _jsx(SummaryRow, { label: "Included URLs", value: String(sitemap?.pagesIncluded ?? '—') }), _jsx(SummaryRow, { label: "Excluded URLs", value: String(sitemap?.pagesExcluded ?? '—') }), _jsxs("div", { className: "flex items-center justify-between gap-2 pt-1", children: [_jsxs("button", { type: "button", onClick: regenerateSitemap, disabled: !canEdit || regenerating, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-60", children: [regenerating ? (_jsx(Loader2, { size: 14, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(RefreshCw, { size: 14, "aria-hidden": "true" })), "Regenerate now"] }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/seo?tab=technical'), className: "text-brand text-sm hover:underline", children: "Manage in SEO Technical \u2192" }))] })] }), _jsx(ConfirmDangerousSettingDialog, { open: pendingDisable, title: "Stop auto-generating the sitemap on production?", description: "Your sitemap may go stale as content changes, which can hurt how quickly search engines discover new pages.", confirmLabel: "Turn Off", onConfirm: () => {
137
137
  setField('autoGenerateSitemap', false);
138
138
  setPendingDisable(false);
139
139
  }, onCancel: () => setPendingDisable(false) })] }));
@@ -61,14 +61,14 @@ function Notice({ tone, icon, title, children, }) {
61
61
  const toneClass = tone === 'destructive'
62
62
  ? 'border-destructive/30 bg-destructive/10 text-destructive'
63
63
  : 'border-warning/30 bg-warning/10 text-warning';
64
- return (_jsxs("div", { className: `mt-3 flex items-start gap-2.5 rounded-md border p-3 ${toneClass}`, children: [_jsx("span", { className: "mt-0.5 shrink-0", "aria-hidden": "true", children: icon }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsx("p", { className: "font-medium", children: title }), children && _jsx("div", { className: "text-foreground/80 mt-1 space-y-1", children: children })] })] }));
64
+ return (_jsxs("div", { className: `mt-3 flex items-start gap-2.5 rounded-md border p-4 ${toneClass}`, children: [_jsx("span", { className: "mt-0.5 shrink-0", "aria-hidden": "true", children: icon }), _jsxs("div", { className: "min-w-0 text-sm", children: [_jsx("p", { className: "font-medium", children: title }), children && _jsx("div", { className: "text-foreground/80 mt-1 space-y-1", children: children })] })] }));
65
65
  }
66
66
  export function UpdatesTab({ role }) {
67
67
  const { info, checking, hasChecked, error, applying, prResult, canManage, form, setField, dirty, repoError, hasErrors, saveState, save, reset, check, apply, } = useUpdates({ role });
68
68
  const [showToken, setShowToken] = useState(false);
69
69
  const severity = info?.updateAvailable ? SEVERITY[info.severity ?? 'patch'] : null;
70
70
  const changelogGroups = info?.changelog ? groupByVersion(info.changelog) : [];
71
- return (_jsxs(_Fragment, { children: [_jsx(SettingsCard, { title: "Actuate CMS", description: "Keep your CMS up to date with the latest features and security patches.", actions: _jsxs("button", { type: "button", onClick: check, disabled: checking, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50", children: [_jsx(RefreshCw, { size: 16, className: checking ? 'animate-spin' : '', "aria-hidden": "true" }), checking ? 'Checking…' : 'Check for Updates'] }), children: _jsxs("p", { className: "text-muted-foreground text-sm", children: ["Current version:", ' ', _jsx("span", { className: "text-foreground font-mono font-medium", children: info?.current ?? '…' })] }) }), error && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm", children: [_jsx(AlertTriangle, { size: 20, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: error }), _jsx("button", { type: "button", onClick: check, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), hasChecked && info && !info.updateAvailable && !error && (_jsxs("div", { className: "border-success/30 bg-success/10 flex items-center gap-3 rounded-lg border p-4", children: [_jsx(CheckCircle2, { size: 24, className: "text-success shrink-0", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("h3", { className: "text-foreground font-medium", children: "You're up to date!" }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-sm", children: ["Actuate CMS ", _jsx("span", { className: "font-mono", children: info.current }), " is the latest version."] })] })] })), info?.updateAvailable && severity && (_jsxs("div", { className: `rounded-lg border p-4 ${severity.banner}`, children: [_jsxs("div", { className: "flex items-start gap-3", children: [info.severity === 'security' ? (_jsx(ShieldAlert, { size: 24, className: `mt-0.5 shrink-0 ${severity.text}`, "aria-hidden": "true" })) : (_jsx(ArrowUpCircle, { size: 24, className: `mt-0.5 shrink-0 ${severity.text}`, "aria-hidden": "true" })), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h3", { className: `font-medium ${severity.text}`, children: info.severity === 'security' ? 'Security update available' : 'Update available' }), _jsx("span", { className: `inline-flex items-center rounded border px-2 py-0.5 text-xs font-medium ${severity.banner} ${severity.text}`, children: severity.label })] }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [_jsx("span", { className: "font-mono", children: info.current }), " \u2192", ' ', _jsx("span", { className: "text-foreground font-mono font-medium", children: info.latest }), info.releaseDate && (_jsxs("span", { className: "ml-2 text-xs opacity-70", children: ["Released ", info.releaseDate] }))] })] })] }), info.hasMigrations && (_jsx(Notice, { tone: "warning", icon: _jsx(Database, { size: 16 }), title: "Database migrations required", children: _jsxs("p", { children: ["Run", ' ', _jsx("code", { className: "bg-muted rounded px-1 font-mono text-xs", children: "npx prisma migrate deploy" }), ' ', "after upgrading. On Vercel this runs automatically at build time."] }) })), info.breakingChanges && info.breakingChanges.length > 0 && (_jsx(Notice, { tone: "destructive", icon: _jsx(AlertTriangle, { size: 16 }), title: "Breaking changes in this release", children: _jsx("ul", { className: "list-disc space-y-1 pl-4", children: info.breakingChanges.map((c, i) => (_jsx("li", { children: c }, i))) }) })), _jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-3", children: [canManage ? (_jsx("button", { type: "button", onClick: apply, disabled: applying, className: "bg-brand text-brand-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:opacity-50", children: applying ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Creating PR\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(GitPullRequest, { size: 16, "aria-hidden": "true" }), "Create Update PR"] })) })) : (_jsxs("span", { className: "text-muted-foreground inline-flex items-center gap-1.5 text-xs", children: [_jsx(Lock, { size: 14, "aria-hidden": "true" }), "Ask an administrator to apply this update."] })), canManage && (_jsx("span", { className: "text-muted-foreground text-xs", children: "Opens a pull request on your repository" }))] }), info.updateCommand && (_jsxs("div", { className: "border-border bg-card mt-3 rounded-md border p-3", children: [_jsx("p", { className: "text-muted-foreground mb-1 text-xs", children: "Or update manually:" }), _jsx("code", { className: "bg-muted text-foreground block rounded px-2 py-1.5 font-mono text-xs select-all", children: info.updateCommand })] }))] })), info?.updateAvailable && changelogGroups.length > 0 && (_jsx(SettingsCard, { title: "Changelog", description: info.source === 'npm'
71
+ return (_jsxs(_Fragment, { children: [_jsx(SettingsCard, { title: "Actuate CMS", description: "Keep your CMS up to date with the latest features and security patches.", actions: _jsxs("button", { type: "button", onClick: check, disabled: checking, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50", children: [_jsx(RefreshCw, { size: 16, className: checking ? 'animate-spin' : '', "aria-hidden": "true" }), checking ? 'Checking…' : 'Check for Updates'] }), children: _jsxs("p", { className: "text-muted-foreground text-sm", children: ["Current version:", ' ', _jsx("span", { className: "text-foreground font-mono font-medium", children: info?.current ?? '…' })] }) }), error && (_jsxs("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm", children: [_jsx(AlertTriangle, { size: 20, className: "shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: error }), _jsx("button", { type: "button", onClick: check, className: "border-destructive/40 rounded-md border px-3 py-1 transition-colors hover:opacity-80", children: "Retry" })] })), hasChecked && info && !info.updateAvailable && !error && (_jsxs("div", { className: "border-success/30 bg-success/10 flex items-center gap-3 rounded-lg border p-4", children: [_jsx(CheckCircle2, { size: 24, className: "text-success shrink-0", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("h3", { className: "text-foreground font-medium", children: "You're up to date!" }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-sm", children: ["Actuate CMS ", _jsx("span", { className: "font-mono", children: info.current }), " is the latest version."] })] })] })), info?.updateAvailable && severity && (_jsxs("div", { className: `rounded-lg border p-4 ${severity.banner}`, children: [_jsxs("div", { className: "flex items-start gap-3", children: [info.severity === 'security' ? (_jsx(ShieldAlert, { size: 24, className: `mt-0.5 shrink-0 ${severity.text}`, "aria-hidden": "true" })) : (_jsx(ArrowUpCircle, { size: 24, className: `mt-0.5 shrink-0 ${severity.text}`, "aria-hidden": "true" })), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("h3", { className: `font-medium ${severity.text}`, children: info.severity === 'security' ? 'Security update available' : 'Update available' }), _jsx("span", { className: `inline-flex items-center rounded border px-2 py-0.5 text-xs font-medium ${severity.banner} ${severity.text}`, children: severity.label })] }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [_jsx("span", { className: "font-mono", children: info.current }), " \u2192", ' ', _jsx("span", { className: "text-foreground font-mono font-medium", children: info.latest }), info.releaseDate && (_jsxs("span", { className: "ml-2 text-xs opacity-70", children: ["Released ", info.releaseDate] }))] })] })] }), info.hasMigrations && (_jsx(Notice, { tone: "warning", icon: _jsx(Database, { size: 16 }), title: "Database migrations required", children: _jsxs("p", { children: ["Run", ' ', _jsx("code", { className: "bg-muted rounded px-1 font-mono text-xs", children: "npx prisma migrate deploy" }), ' ', "after upgrading. On Vercel this runs automatically at build time."] }) })), info.breakingChanges && info.breakingChanges.length > 0 && (_jsx(Notice, { tone: "destructive", icon: _jsx(AlertTriangle, { size: 16 }), title: "Breaking changes in this release", children: _jsx("ul", { className: "list-disc space-y-1 pl-4", children: info.breakingChanges.map((c, i) => (_jsx("li", { children: c }, i))) }) })), _jsxs("div", { className: "mt-4 flex flex-wrap items-center gap-3", children: [canManage ? (_jsx("button", { type: "button", onClick: apply, disabled: applying, className: "bg-brand text-brand-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:opacity-50", children: applying ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Creating PR\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(GitPullRequest, { size: 16, "aria-hidden": "true" }), "Create Update PR"] })) })) : (_jsxs("span", { className: "text-muted-foreground inline-flex items-center gap-1.5 text-xs", children: [_jsx(Lock, { size: 14, "aria-hidden": "true" }), "Ask an administrator to apply this update."] })), canManage && (_jsx("span", { className: "text-muted-foreground text-xs", children: "Opens a pull request on your repository" }))] }), info.updateCommand && (_jsxs("div", { className: "border-border bg-card mt-3 rounded-md border p-4", children: [_jsx("p", { className: "text-muted-foreground mb-1 text-xs", children: "Or update manually:" }), _jsx("code", { className: "bg-muted text-foreground block rounded px-2 py-1.5 font-mono text-xs select-all", children: info.updateCommand })] }))] })), info?.updateAvailable && changelogGroups.length > 0 && (_jsx(SettingsCard, { title: "Changelog", description: info.source === 'npm'
72
72
  ? 'Version history from npm. Connect the update server for full release notes.'
73
73
  : "What's new since your current version.", children: _jsx("div", { className: "max-h-80 space-y-4 overflow-y-auto pr-1", children: changelogGroups.map((group) => (_jsxs("div", { className: "border-border border-b pb-3 last:border-0 last:pb-0", children: [_jsxs("div", { className: "mb-1.5 flex items-baseline gap-3", children: [_jsx("span", { className: "text-foreground font-mono text-sm font-medium", children: group.version }), group.date && (_jsx("span", { className: "text-muted-foreground text-xs", children: group.date }))] }), _jsx("ul", { className: "space-y-1.5", children: group.items.map((item, i) => (_jsxs("li", { className: "flex items-start gap-2 text-sm", children: [_jsx(ChangeTypeBadge, { type: item.type }), _jsx("span", { className: "text-muted-foreground min-w-0", children: item.summary })] }, i))) })] }, group.version))) }) })), info?.updateAvailable && info.pluginCompatibility && info.pluginCompatibility.length > 0 && (_jsx(SettingsCard, { title: "Plugin compatibility", description: "Latest published versions of the official plugins for this release.", children: _jsx("ul", { className: "grid gap-2 sm:grid-cols-2", children: info.pluginCompatibility.map((plugin) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border px-3 py-2 text-sm", children: [_jsxs("span", { className: "text-foreground inline-flex min-w-0 items-center gap-2", children: [_jsx(Puzzle, { size: 14, className: "text-muted-foreground shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "truncate font-mono text-xs", children: plugin.name.replace('@actuate-media/', '') })] }), _jsxs("span", { className: "text-muted-foreground inline-flex shrink-0 items-center gap-1.5", children: [plugin.minVersion && (_jsx("span", { className: "font-mono text-xs", children: plugin.minVersion })), _jsx(CheckCircle2, { size: 14, className: "text-success", "aria-hidden": "true" })] })] }, plugin.name))) }) })), prResult && (_jsx("div", { className: "border-success/30 bg-success/10 rounded-lg border p-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(GitPullRequest, { size: 20, className: "text-success mt-0.5 shrink-0", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("h3", { className: "text-foreground font-medium", children: "Pull Request Created" }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: ["PR #", prResult.prNumber, " has been created on your repository. Review and merge it to apply the update, then run", ' ', _jsx("code", { className: "bg-muted rounded px-1 font-mono text-xs", children: "npx prisma migrate deploy" }), "."] }), _jsxs("a", { href: prResult.prUrl, target: "_blank", rel: "noopener noreferrer", className: "text-brand mt-2 inline-flex items-center gap-1.5 text-sm font-medium hover:underline", children: [_jsx(ExternalLink, { size: 16, "aria-hidden": "true" }), "View Pull Request"] })] })] }) })), canManage && (_jsxs(SettingsCard, { title: "GitHub Integration", description: "Connect your repository to enable one-click update PRs. Credentials are encrypted at rest (AES-256-GCM).", children: [_jsxs("div", { className: "space-y-4", children: [_jsx(SettingsControlRow, { label: "Repository", htmlFor: "updates-gh-repo", align: "start", description: _jsxs(_Fragment, { children: ["e.g.", ' ', _jsx("code", { className: "bg-muted rounded px-1 font-mono", children: "actuate-media/my-client-site" })] }), control: _jsxs("div", { className: "w-72 max-w-full", children: [_jsx("input", { id: "updates-gh-repo", type: "text", value: form.githubRepo, onChange: (e) => setField('githubRepo', e.target.value), placeholder: "owner/repo", "aria-invalid": Boolean(repoError), "aria-describedby": repoError ? 'updates-gh-repo-error' : undefined, className: ghInputClass }), repoError && (_jsx("p", { id: "updates-gh-repo-error", className: "text-destructive mt-1 text-xs", children: repoError }))] }) }), _jsx(SettingsControlRow, { label: _jsxs("span", { className: "inline-flex items-center gap-2", children: ["GitHub token", info?.hasGithubToken && !form.githubToken && (_jsx("span", { className: "text-success text-xs font-normal", children: "Saved" }))] }), htmlFor: "updates-gh-token", align: "start", description: _jsxs(_Fragment, { children: ["Needs ", _jsx("code", { className: "bg-muted rounded px-1 font-mono", children: "repo" }), " scope. Create one at", ' ', _jsx("a", { href: "https://github.com/settings/tokens", target: "_blank", rel: "noopener noreferrer", className: "text-brand hover:underline", children: "github.com/settings/tokens" }), "."] }), control: _jsxs("div", { className: "relative w-72 max-w-full", children: [_jsx("input", { id: "updates-gh-token", type: showToken ? 'text' : 'password', value: form.githubToken, onChange: (e) => setField('githubToken', e.target.value), placeholder: info?.hasGithubToken ? '••••••••••••••••' : 'ghp_… or github_pat_…', className: `${ghInputClass} pr-10` }), _jsx("button", { type: "button", onClick: () => setShowToken((s) => !s), "aria-label": showToken ? 'Hide token' : 'Show token', className: "text-muted-foreground hover:text-foreground absolute top-1/2 right-2 -translate-y-1/2 p-1", children: showToken ? (_jsx(EyeOff, { size: 16, "aria-hidden": "true" })) : (_jsx(Eye, { size: 16, "aria-hidden": "true" })) })] }) })] }), _jsx(SettingsSaveBar, { dirty: dirty, canEdit: canManage, hasErrors: hasErrors, saveState: saveState, onSave: save, onReset: reset })] })), _jsx(SettingsCard, { title: "How Updates Work", children: _jsx("ol", { className: "text-muted-foreground space-y-1.5 text-sm", children: [
74
74
  'Click “Check for Updates” to see if a new version is available.',
@@ -17,7 +17,7 @@ import { adminPortalContainer } from '../../lib/portal-container.js';
17
17
  */
18
18
  export function SettingsCard({ title, description, actions, children, className, headingLevel: Heading = 'h3', }) {
19
19
  const headingId = useId();
20
- return (_jsxs(Card, { padding: "none", "aria-labelledby": headingId, role: "region", className: className, children: [_jsxs(CardHeader, { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx(Heading, { id: headingId, className: "text-[length:var(--fs-card)] font-semibold text-[var(--txt)]", children: title }), description && _jsx(CardDescription, { children: description })] }), actions && _jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })] }), _jsx(CardContent, { className: "pt-0 text-[var(--txt)]", children: children })] }));
20
+ return (_jsxs(Card, { padding: "none", "aria-labelledby": headingId, role: "region", className: className, children: [_jsxs(CardHeader, { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsx(Heading, { id: headingId, className: "text-[length:var(--fs-card)] font-semibold text-[var(--txt)]", children: title }), description && _jsx(CardDescription, { children: description })] }), actions && _jsx("div", { className: "flex shrink-0 items-center gap-2", children: actions })] }), _jsx(CardContent, { className: "text-[var(--txt)]", children: children })] }));
21
21
  }
22
22
  /**
23
23
  * A sub-section inside a {@link SettingsCard}: a top divider plus a
@@ -25,7 +25,7 @@ export function SettingsCard({ title, description, actions, children, className,
25
25
  * within a single card (e.g. "Admin branding" under "Branding").
26
26
  */
27
27
  export function SettingsSubsection({ title, description, children, className, }) {
28
- return (_jsxs("div", { className: `border-border border-t pt-4 ${className ?? ''}`, children: [_jsx("div", { className: "text-foreground text-base font-medium", children: title }), description && _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: description }), children] }));
28
+ return (_jsxs("div", { className: `border-border border-t pt-4 ${className ?? ''}`, children: [_jsx("div", { className: "text-foreground text-base font-medium", children: title }), description && _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: description }), children ? _jsx("div", { className: "mt-4", children: children }) : null] }));
29
29
  }
30
30
  /**
31
31
  * A single setting row: an optional leading visual plus a label and
@@ -63,7 +63,7 @@ export function SettingsValidationSummary({ issues }) {
63
63
  const errors = issues.filter((i) => i.severity === 'error');
64
64
  const warnings = issues.filter((i) => i.severity === 'warning');
65
65
  const isError = errors.length > 0;
66
- return (_jsxs("div", { role: "alert", "aria-live": "polite", className: `flex items-start gap-3 rounded-lg border p-3 text-sm ${isError
66
+ return (_jsxs("div", { role: "alert", "aria-live": "polite", className: `flex items-start gap-3 rounded-lg border p-4 text-sm ${isError
67
67
  ? 'border-destructive/30 bg-destructive/10 text-destructive'
68
68
  : 'border-warning/30 bg-warning/10 text-warning'}`, children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("div", { className: "space-y-1", children: [...errors, ...warnings].map((issue, i) => (_jsx("p", { children: issue.message }, `${issue.field}-${i}`))) })] }));
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/views/settings/components.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/views/settings/components.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,KAAK,EAAkB,MAAM,OAAO,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC5F,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AAGpE;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,YAAY,EAAE,OAAO,GAAG,IAAI,GAU7B;IACC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,OAAO,CACL,MAAC,IAAI,IAAC,OAAO,EAAC,MAAM,qBAAkB,SAAS,EAAE,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,SAAS,aACjF,MAAC,UAAU,IAAC,SAAS,EAAC,wCAAwC,aAC5D,eAAK,SAAS,EAAC,SAAS,aACtB,KAAC,OAAO,IACN,EAAE,EAAE,SAAS,EACb,SAAS,EAAC,8DAA8D,YAEvE,KAAK,GACE,EACT,WAAW,IAAI,KAAC,eAAe,cAAE,WAAW,GAAmB,IAC5D,EACL,OAAO,IAAI,cAAK,SAAS,EAAC,kCAAkC,YAAE,OAAO,GAAO,IAClE,EACb,KAAC,WAAW,IAAC,SAAS,EAAC,mBAAmB,YAAE,QAAQ,GAAe,IAC9D,CACR,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,QAAQ,EACR,SAAS,GAMV;IACC,OAAO,CACL,eAAK,SAAS,EAAE,+BAA+B,SAAS,IAAI,EAAE,EAAE,aAC9D,cAAK,SAAS,EAAC,uCAAuC,YAAE,KAAK,GAAO,EACnE,WAAW,IAAI,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,EACpF,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,MAAM,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IACrD,CACP,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,GAAG,QAAQ,EAChB,SAAS,GAaV;IACC,MAAM,UAAU,GAAG,6CAA6C,CAAA;IAChE,OAAO,CACL,eACE,SAAS,EAAE,8BAA8B,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,IAAI,SAAS,IAAI,EAAE,EAAE,aAEjH,eAAK,SAAS,EAAC,iCAAiC,aAC7C,OAAO,EACR,eAAK,SAAS,EAAC,SAAS,aACrB,OAAO,CAAC,CAAC,CAAC,CACT,gBAAO,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,YAC3C,KAAK,GACA,CACT,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAE,UAAU,YAAG,KAAK,GAAQ,CAC5C,EACA,WAAW,IAAI,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,IACjF,IACF,EACN,cAAK,SAAS,EAAC,kCAAkC,YAAE,OAAO,GAAO,IAC7D,CACP,CAAA;AACH,CAAC;AAED,MAAM,YAAY,GAAqD;IACrE,MAAM,EAAE,gBAAgB;IACxB,WAAW,EAAE,qBAAqB;IAClC,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,UAAU;CACrB,CAAA;AAED,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,EAAE,IAAI,EAAqC;IAC7E,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IACvE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAA;IAC7B,OAAO,CACL,gBACE,SAAS,EAAC,qHAAqH,EAC/H,KAAK,EAAE,IAAI,CAAC,MAAM,aAEjB,MAAM,IAAI,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,EAC/C,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IACrB,CACR,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,KAAK,GAQN;IACC,OAAO,CACL,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,QAAQ,aACrB,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,uCAAuC,YAAE,KAAK,GAAQ,EACrE,KAAK,IACF,EACN,YAAG,SAAS,EAAC,sCAAsC,YAAE,WAAW,GAAK,IACjE,EACN,cAAK,SAAS,EAAC,iBAAiB,YAC9B,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,QAAQ,EACzB,QAAQ,EAAE,QAAQ,gBACN,KAAK,GACjB,GACE,IACF,CACP,CAAA;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,yBAAyB,CAAC,EAAE,MAAM,EAAiC;IACjF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACjC,OAAO,CACL,eACE,IAAI,EAAC,OAAO,eACF,QAAQ,EAClB,SAAS,EAAE,wDACT,OAAO;YACL,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,8CACN,EAAE,aAEF,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,iBAAa,MAAM,GAAG,EAC1E,cAAK,SAAS,EAAC,WAAW,YACvB,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1C,sBAAgC,KAAK,CAAC,OAAO,IAArC,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAqB,CACnD,CAAC,GACE,IACF,CACP,CAAA;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,EACN,OAAO,GAQR;IACC,MAAM,MAAM,GAAG,SAAS,KAAK,QAAQ,CAAA;IACrC,OAAO,CACL,eAAK,SAAS,EAAC,qHAAqH,aACjI,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CACpC,gBAAM,SAAS,EAAC,gDAAgD,eAAW,QAAQ,aACjF,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,cACjC,CACR,EACA,KAAK,IAAI,CAAC,MAAM,IAAI,CACnB,eAAM,SAAS,EAAC,+BAA+B,eAAW,QAAQ,gCAE3D,CACR,EACD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,CAAC,KAAK,IAAI,MAAM,EAC1B,SAAS,EAAC,8IAA8I,sBAGjJ,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,EACnD,SAAS,EAAC,sQAAsQ,aAE/Q,MAAM,IAAI,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,EAC3E,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,IAC7B,IACL,CACP,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,6BAA6B,CAAC,EAC5C,IAAI,EACJ,KAAK,EACL,WAAW,EACX,YAAY,GAAG,UAAU,EACzB,SAAS,EACT,QAAQ,GAQT;IACC,OAAO,CACL,KAAC,MAAM,CAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,YAC5D,MAAC,MAAM,CAAC,MAAM,IAAC,SAAS,EAAE,oBAAoB,EAAE,aAC9C,KAAC,MAAM,CAAC,OAAO,IAAC,SAAS,EAAC,gCAAgC,GAAG,EAC7D,MAAC,MAAM,CAAC,OAAO,IAAC,SAAS,EAAC,qIAAqI,aAC7J,eAAK,SAAS,EAAC,8BAA8B,aAC3C,eAAM,SAAS,EAAC,kFAAkF,YAChG,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,GACzC,EACP,KAAC,MAAM,CAAC,KAAK,IAAC,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAgB,IAChF,EACN,KAAC,MAAM,CAAC,WAAW,IAAC,SAAS,EAAC,oCAAoC,YAC/D,WAAW,GACO,EACrB,eAAK,SAAS,EAAC,qCAAqC,aAClD,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,uGAAuG,uBAG1G,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,2HAA2H,YAEpI,YAAY,GACN,IACL,IACS,IACH,GACJ,CACf,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-admin",
3
- "version": "0.72.3",
3
+ "version": "0.74.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",
@@ -95,7 +95,7 @@
95
95
  "tailwindcss": "^4.0.0",
96
96
  "typescript": "^5.7.0",
97
97
  "vitest": "^4.1.0",
98
- "@actuate-media/cms-core": "0.89.0",
98
+ "@actuate-media/cms-core": "0.90.0",
99
99
  "@actuate-media/component-blocks": "0.2.1"
100
100
  },
101
101
  "scripts": {