@actuate-media/cms-admin 0.73.0 → 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 (161) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +3 -2
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/LoginRoot.d.ts.map +1 -1
  6. package/dist/LoginRoot.js +2 -1
  7. package/dist/LoginRoot.js.map +1 -1
  8. package/dist/__tests__/components/theme-provider-accent.test.d.ts +2 -0
  9. package/dist/__tests__/components/theme-provider-accent.test.d.ts.map +1 -0
  10. package/dist/__tests__/components/theme-provider-accent.test.js +64 -0
  11. package/dist/__tests__/components/theme-provider-accent.test.js.map +1 -0
  12. package/dist/__tests__/views/portal-container.test.js +13 -0
  13. package/dist/__tests__/views/portal-container.test.js.map +1 -1
  14. package/dist/__tests__/views/redirects-pane.render.test.js +6 -0
  15. package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
  16. package/dist/__tests__/views/seo-content-pane.render.test.js +13 -4
  17. package/dist/__tests__/views/seo-content-pane.render.test.js.map +1 -1
  18. package/dist/actuate-admin.css +1 -1
  19. package/dist/components/CoauthorResultPopover.js +1 -1
  20. package/dist/components/EditorSeoAside.d.ts +20 -0
  21. package/dist/components/EditorSeoAside.d.ts.map +1 -0
  22. package/dist/components/EditorSeoAside.js +30 -0
  23. package/dist/components/EditorSeoAside.js.map +1 -0
  24. package/dist/components/MediaPickerModal.js +1 -1
  25. package/dist/components/SEOConfigPanel.js +1 -1
  26. package/dist/components/SchedulePublishDialog.js +1 -1
  27. package/dist/components/SharePreviewLinkDialog.js +1 -1
  28. package/dist/components/ThemeProvider.d.ts.map +1 -1
  29. package/dist/components/ThemeProvider.js +2 -1
  30. package/dist/components/ThemeProvider.js.map +1 -1
  31. package/dist/components/VersionHistory.js +1 -1
  32. package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
  33. package/dist/components/seo/SeoEditorPane.js +28 -8
  34. package/dist/components/seo/SeoEditorPane.js.map +1 -1
  35. package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
  36. package/dist/components/seo/SeoIssueFixPanel.js +13 -3
  37. package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
  38. package/dist/components/seo/primitives.d.ts.map +1 -1
  39. package/dist/components/seo/primitives.js +3 -3
  40. package/dist/components/seo/primitives.js.map +1 -1
  41. package/dist/components/ui/Card.js +5 -5
  42. package/dist/components/ui/Card.js.map +1 -1
  43. package/dist/components/ui/InspectorPane.js +3 -3
  44. package/dist/components/ui/InspectorPane.js.map +1 -1
  45. package/dist/components/ui/PanelSection.d.ts +16 -0
  46. package/dist/components/ui/PanelSection.d.ts.map +1 -0
  47. package/dist/components/ui/PanelSection.js +15 -0
  48. package/dist/components/ui/PanelSection.js.map +1 -0
  49. package/dist/lib/admin-root-element.d.ts +9 -0
  50. package/dist/lib/admin-root-element.d.ts.map +1 -0
  51. package/dist/lib/admin-root-element.js +14 -0
  52. package/dist/lib/admin-root-element.js.map +1 -0
  53. package/dist/lib/portal-container.d.ts.map +1 -1
  54. package/dist/lib/portal-container.js +2 -3
  55. package/dist/lib/portal-container.js.map +1 -1
  56. package/dist/lib/seo-service.d.ts +89 -0
  57. package/dist/lib/seo-service.d.ts.map +1 -1
  58. package/dist/lib/seo-service.js +50 -2
  59. package/dist/lib/seo-service.js.map +1 -1
  60. package/dist/views/ApiKeys.js +2 -2
  61. package/dist/views/Dashboard.d.ts.map +1 -1
  62. package/dist/views/Dashboard.js +12 -14
  63. package/dist/views/Dashboard.js.map +1 -1
  64. package/dist/views/MediaBrowser.d.ts.map +1 -1
  65. package/dist/views/MediaBrowser.js +35 -6
  66. package/dist/views/MediaBrowser.js.map +1 -1
  67. package/dist/views/PageEditor.js +1 -1
  68. package/dist/views/Posts/PostTypeEditor.js +3 -3
  69. package/dist/views/SEO.d.ts.map +1 -1
  70. package/dist/views/SEO.js +4 -2
  71. package/dist/views/SEO.js.map +1 -1
  72. package/dist/views/ScriptTags.js +1 -1
  73. package/dist/views/ScriptTags.js.map +1 -1
  74. package/dist/views/Users.js +1 -1
  75. package/dist/views/page-editor/EditorTopBar.d.ts +4 -1
  76. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  77. package/dist/views/page-editor/EditorTopBar.js +5 -3
  78. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  79. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  80. package/dist/views/page-editor/PageSectionEditor.js +24 -1
  81. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  82. package/dist/views/page-editor/SectionInspector.js +2 -2
  83. package/dist/views/page-editor/SectionsPanel.js +1 -1
  84. package/dist/views/post-editor/PostHeaderPanel.js +1 -1
  85. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  86. package/dist/views/post-editor/PostSectionEditor.js +24 -1
  87. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  88. package/dist/views/seo/LinksTab.d.ts +4 -0
  89. package/dist/views/seo/LinksTab.d.ts.map +1 -0
  90. package/dist/views/seo/LinksTab.js +111 -0
  91. package/dist/views/seo/LinksTab.js.map +1 -0
  92. package/dist/views/seo/OverviewTab.js +1 -1
  93. package/dist/views/seo/OverviewTab.js.map +1 -1
  94. package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
  95. package/dist/views/seo/RedirectsTab.js +39 -6
  96. package/dist/views/seo/RedirectsTab.js.map +1 -1
  97. package/dist/views/seo/TechnicalTab.js +2 -2
  98. package/dist/views/settings/AISettingsTab.js +1 -1
  99. package/dist/views/settings/AiFeaturesCard.js +1 -1
  100. package/dist/views/settings/AiFeaturesCard.js.map +1 -1
  101. package/dist/views/settings/AppearanceTab.js +1 -1
  102. package/dist/views/settings/BrandVoiceCard.js +1 -1
  103. package/dist/views/settings/EmailSettingsTab.js +2 -2
  104. package/dist/views/settings/GeneralSettingsTab.js +1 -1
  105. package/dist/views/settings/SecurityStatusCard.js +1 -1
  106. package/dist/views/settings/SeoSettingsTab.js +4 -4
  107. package/dist/views/settings/UpdatesTab.js +2 -2
  108. package/dist/views/settings/components.js +3 -3
  109. package/dist/views/settings/components.js.map +1 -1
  110. package/package.json +2 -2
  111. package/src/AdminRoot.tsx +3 -2
  112. package/src/LoginRoot.tsx +2 -1
  113. package/src/__tests__/components/theme-provider-accent.test.tsx +84 -0
  114. package/src/__tests__/views/portal-container.test.tsx +14 -0
  115. package/src/__tests__/views/redirects-pane.render.test.tsx +6 -0
  116. package/src/__tests__/views/seo-content-pane.render.test.tsx +14 -4
  117. package/src/components/CoauthorResultPopover.tsx +1 -1
  118. package/src/components/EditorSeoAside.tsx +149 -0
  119. package/src/components/MediaPickerModal.tsx +1 -1
  120. package/src/components/SEOConfigPanel.tsx +2 -2
  121. package/src/components/SchedulePublishDialog.tsx +1 -1
  122. package/src/components/SharePreviewLinkDialog.tsx +1 -1
  123. package/src/components/ThemeProvider.tsx +3 -1
  124. package/src/components/VersionHistory.tsx +1 -1
  125. package/src/components/seo/SeoEditorPane.tsx +41 -12
  126. package/src/components/seo/SeoIssueFixPanel.tsx +16 -4
  127. package/src/components/seo/primitives.tsx +7 -3
  128. package/src/components/ui/Card.tsx +5 -5
  129. package/src/components/ui/InspectorPane.tsx +3 -3
  130. package/src/components/ui/PanelSection.tsx +53 -0
  131. package/src/lib/admin-root-element.ts +15 -0
  132. package/src/lib/portal-container.ts +3 -2
  133. package/src/lib/seo-service.ts +143 -2
  134. package/src/views/ApiKeys.tsx +2 -2
  135. package/src/views/Dashboard.tsx +40 -53
  136. package/src/views/MediaBrowser.tsx +62 -12
  137. package/src/views/PageEditor.tsx +1 -1
  138. package/src/views/Posts/PostTypeEditor.tsx +3 -3
  139. package/src/views/SEO.tsx +6 -0
  140. package/src/views/ScriptTags.tsx +2 -2
  141. package/src/views/Users.tsx +1 -1
  142. package/src/views/page-editor/EditorTopBar.tsx +24 -0
  143. package/src/views/page-editor/PageSectionEditor.tsx +43 -3
  144. package/src/views/page-editor/SectionInspector.tsx +2 -2
  145. package/src/views/page-editor/SectionsPanel.tsx +1 -1
  146. package/src/views/post-editor/PostHeaderPanel.tsx +1 -1
  147. package/src/views/post-editor/PostSectionEditor.tsx +43 -3
  148. package/src/views/seo/LinksTab.tsx +462 -0
  149. package/src/views/seo/OverviewTab.tsx +1 -1
  150. package/src/views/seo/RedirectsTab.tsx +97 -4
  151. package/src/views/seo/TechnicalTab.tsx +2 -2
  152. package/src/views/settings/AISettingsTab.tsx +3 -3
  153. package/src/views/settings/AiFeaturesCard.tsx +1 -1
  154. package/src/views/settings/AppearanceTab.tsx +1 -1
  155. package/src/views/settings/BrandVoiceCard.tsx +2 -2
  156. package/src/views/settings/EmailSettingsTab.tsx +2 -2
  157. package/src/views/settings/GeneralSettingsTab.tsx +3 -3
  158. package/src/views/settings/SecurityStatusCard.tsx +1 -1
  159. package/src/views/settings/SeoSettingsTab.tsx +6 -6
  160. package/src/views/settings/UpdatesTab.tsx +3 -3
  161. package/src/views/settings/components.tsx +3 -3
@@ -56,7 +56,7 @@ export function AppearanceTab({ role, config }: AppearanceTabProps) {
56
56
  return (
57
57
  <div className="space-y-4">
58
58
  {!canEdit && (
59
- <p className="text-muted-foreground border-border bg-muted rounded-lg border p-3 text-sm">
59
+ <p className="text-muted-foreground border-border bg-muted rounded-lg border p-4 text-sm">
60
60
  You have read-only access to appearance settings.
61
61
  </p>
62
62
  )}
@@ -341,7 +341,7 @@ export function BrandVoiceCard({
341
341
  {aiReadiness && !aiReadiness.ready && aiReadiness.message && (
342
342
  <div
343
343
  role="status"
344
- className="border-warning/40 bg-warning/10 text-foreground flex items-start gap-3 rounded-lg border p-3 text-sm"
344
+ className="border-warning/40 bg-warning/10 text-foreground flex items-start gap-3 rounded-lg border p-4 text-sm"
345
345
  >
346
346
  <AlertTriangle size={16} className="text-warning mt-0.5 shrink-0" aria-hidden="true" />
347
347
  <p>{aiReadiness.message}</p>
@@ -400,7 +400,7 @@ export function BrandVoiceCard({
400
400
  {importError && (
401
401
  <div
402
402
  role="alert"
403
- className="border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-3 text-sm"
403
+ className="border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-4 text-sm"
404
404
  >
405
405
  {importError}
406
406
  </div>
@@ -115,7 +115,7 @@ function Notice({
115
115
  <div
116
116
  role="status"
117
117
  aria-live="polite"
118
- className={`flex items-start gap-2.5 rounded-lg border p-3 text-sm ${toneClass}`}
118
+ className={`flex items-start gap-2.5 rounded-lg border p-4 text-sm ${toneClass}`}
119
119
  >
120
120
  <Icon size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
121
121
  <div className="min-w-0">{children}</div>
@@ -294,7 +294,7 @@ export function EmailSettingsTab({ role }: { role?: string }) {
294
294
  return (
295
295
  <div
296
296
  role="alert"
297
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
297
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
298
298
  >
299
299
  <AlertTriangle size={20} className="shrink-0" aria-hidden="true" />
300
300
  <span className="flex-1">{s.loadError}</span>
@@ -42,7 +42,7 @@ export function GeneralSettingsTab({ onNavigate, role }: GeneralSettingsTabProps
42
42
  {settings.loadError && (
43
43
  <div
44
44
  role="alert"
45
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
45
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
46
46
  >
47
47
  <AlertTriangle size={16} className="shrink-0" aria-hidden="true" />
48
48
  <span className="flex-1">{settings.loadError}</span>
@@ -57,7 +57,7 @@ export function GeneralSettingsTab({ onNavigate, role }: GeneralSettingsTabProps
57
57
  )}
58
58
 
59
59
  {!canEdit && (
60
- <div className="border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-sm">
60
+ <div className="border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm">
61
61
  <Info size={16} className="shrink-0" aria-hidden="true" />
62
62
  You have read-only access to settings. Only administrators can make changes.
63
63
  </div>
@@ -99,7 +99,7 @@ export function GeneralSettingsTab({ onNavigate, role }: GeneralSettingsTabProps
99
99
  {settings.saveState === 'error' && settings.saveError && (
100
100
  <div
101
101
  role="alert"
102
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
102
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
103
103
  >
104
104
  <AlertTriangle size={16} className="shrink-0" aria-hidden="true" />
105
105
  <span className="flex-1">{settings.saveError}</span>
@@ -83,7 +83,7 @@ export function SecurityStatusCard({
83
83
  <div
84
84
  key={w.id}
85
85
  role="note"
86
- className={`flex items-start justify-between gap-3 rounded-lg border p-3 text-sm ${SEVERITY_STYLES[w.severity]}`}
86
+ className={`flex items-start justify-between gap-3 rounded-lg border p-4 text-sm ${SEVERITY_STYLES[w.severity]}`}
87
87
  >
88
88
  <div>
89
89
  <p className="font-medium">{w.title}</p>
@@ -102,7 +102,7 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
102
102
  {seo.loadError && (
103
103
  <div
104
104
  role="alert"
105
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
105
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
106
106
  >
107
107
  <AlertTriangle size={16} className="shrink-0" aria-hidden="true" />
108
108
  <span className="flex-1">{seo.loadError}</span>
@@ -117,7 +117,7 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
117
117
  )}
118
118
 
119
119
  {!canEdit && (
120
- <div className="border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-3 text-sm">
120
+ <div className="border-border bg-muted text-muted-foreground flex items-center gap-2 rounded-lg border p-4 text-sm">
121
121
  <Info size={16} className="shrink-0" aria-hidden="true" />
122
122
  You have read-only access to SEO defaults. Only administrators can make changes.
123
123
  </div>
@@ -150,7 +150,7 @@ export function SeoSettingsTab({ onNavigate, role }: SeoSettingsTabProps) {
150
150
  {seo.saveState === 'error' && seo.saveError && (
151
151
  <div
152
152
  role="alert"
153
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
153
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
154
154
  >
155
155
  <AlertTriangle size={16} className="shrink-0" aria-hidden="true" />
156
156
  <span className="flex-1">{seo.saveError}</span>
@@ -381,7 +381,7 @@ function SeoPreviewCard({
381
381
  }) {
382
382
  return (
383
383
  <div className="border-border mt-4 grid gap-4 border-t pt-4 sm:grid-cols-2">
384
- <div className="border-border rounded-lg border p-3">
384
+ <div className="border-border rounded-lg border p-4">
385
385
  <p className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase">
386
386
  Search preview
387
387
  </p>
@@ -398,7 +398,7 @@ function SeoPreviewCard({
398
398
  <ImageIcon size={24} className="text-muted-foreground" aria-hidden="true" />
399
399
  )}
400
400
  </div>
401
- <div className="p-3">
401
+ <div className="p-4">
402
402
  <p className="text-muted-foreground truncate text-xs uppercase">
403
403
  {siteName || new URL(url).hostname}
404
404
  </p>
@@ -700,7 +700,7 @@ function SitemapDefaultsCard({
700
700
  description="Control XML sitemap generation and whether search engines are pinged on publish."
701
701
  >
702
702
  {!siteUrl && (
703
- <div className="border-warning/30 bg-warning/10 text-warning mb-4 flex items-start gap-2 rounded-md border p-3 text-sm">
703
+ <div className="border-warning/30 bg-warning/10 text-warning mb-4 flex items-start gap-2 rounded-md border p-4 text-sm">
704
704
  <AlertTriangle size={16} className="mt-0.5 shrink-0" aria-hidden="true" />
705
705
  Site URL is not set — sitemap URLs may be incorrect. Set it in Settings → General.
706
706
  </div>
@@ -109,7 +109,7 @@ function Notice({
109
109
  ? 'border-destructive/30 bg-destructive/10 text-destructive'
110
110
  : 'border-warning/30 bg-warning/10 text-warning'
111
111
  return (
112
- <div className={`mt-3 flex items-start gap-2.5 rounded-md border p-3 ${toneClass}`}>
112
+ <div className={`mt-3 flex items-start gap-2.5 rounded-md border p-4 ${toneClass}`}>
113
113
  <span className="mt-0.5 shrink-0" aria-hidden="true">
114
114
  {icon}
115
115
  </span>
@@ -180,7 +180,7 @@ export function UpdatesTab({ role }: UpdatesTabProps) {
180
180
  {error && (
181
181
  <div
182
182
  role="alert"
183
- className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-3 text-sm"
183
+ className="border-destructive/30 bg-destructive/10 text-destructive flex items-center gap-3 rounded-lg border p-4 text-sm"
184
184
  >
185
185
  <AlertTriangle size={20} className="shrink-0" aria-hidden="true" />
186
186
  <span className="flex-1">{error}</span>
@@ -309,7 +309,7 @@ export function UpdatesTab({ role }: UpdatesTabProps) {
309
309
  </div>
310
310
 
311
311
  {info.updateCommand && (
312
- <div className="border-border bg-card mt-3 rounded-md border p-3">
312
+ <div className="border-border bg-card mt-3 rounded-md border p-4">
313
313
  <p className="text-muted-foreground mb-1 text-xs">Or update manually:</p>
314
314
  <code className="bg-muted text-foreground block rounded px-2 py-1.5 font-mono text-xs select-all">
315
315
  {info.updateCommand}
@@ -49,7 +49,7 @@ export function SettingsCard({
49
49
  </div>
50
50
  {actions && <div className="flex shrink-0 items-center gap-2">{actions}</div>}
51
51
  </CardHeader>
52
- <CardContent className="pt-0 text-[var(--txt)]">{children}</CardContent>
52
+ <CardContent className="text-[var(--txt)]">{children}</CardContent>
53
53
  </Card>
54
54
  )
55
55
  }
@@ -74,7 +74,7 @@ export function SettingsSubsection({
74
74
  <div className={`border-border border-t pt-4 ${className ?? ''}`}>
75
75
  <div className="text-foreground text-base font-medium">{title}</div>
76
76
  {description && <p className="text-muted-foreground mt-0.5 text-sm">{description}</p>}
77
- {children}
77
+ {children ? <div className="mt-4">{children}</div> : null}
78
78
  </div>
79
79
  )
80
80
  }
@@ -200,7 +200,7 @@ export function SettingsValidationSummary({ issues }: { issues: ValidationIssue[
200
200
  <div
201
201
  role="alert"
202
202
  aria-live="polite"
203
- className={`flex items-start gap-3 rounded-lg border p-3 text-sm ${
203
+ className={`flex items-start gap-3 rounded-lg border p-4 text-sm ${
204
204
  isError
205
205
  ? 'border-destructive/30 bg-destructive/10 text-destructive'
206
206
  : 'border-warning/30 bg-warning/10 text-warning'