@actuate-media/cms-admin 0.56.0 → 0.56.2

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 (216) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__tests__/components/posts-badges.test.js +3 -3
  3. package/dist/__tests__/components/posts-badges.test.js.map +1 -1
  4. package/dist/actuate-admin.css +1 -1
  5. package/dist/components/AICoauthorBubbleMenu.js +2 -2
  6. package/dist/components/AICoauthorBubbleMenu.js.map +1 -1
  7. package/dist/components/Breadcrumbs.js +2 -2
  8. package/dist/components/Breadcrumbs.js.map +1 -1
  9. package/dist/components/CoauthorResultPopover.d.ts.map +1 -1
  10. package/dist/components/CoauthorResultPopover.js +1 -1
  11. package/dist/components/CoauthorResultPopover.js.map +1 -1
  12. package/dist/components/CommandPalette.d.ts.map +1 -1
  13. package/dist/components/CommandPalette.js +11 -11
  14. package/dist/components/CommandPalette.js.map +1 -1
  15. package/dist/components/CommentSidePanel.js +11 -11
  16. package/dist/components/CommentSidePanel.js.map +1 -1
  17. package/dist/components/ContentOverviewChart.js +2 -2
  18. package/dist/components/ContentOverviewChart.js.map +1 -1
  19. package/dist/components/FocalPointPicker.js +1 -1
  20. package/dist/components/FocalPointPicker.js.map +1 -1
  21. package/dist/components/LivePreview.d.ts.map +1 -1
  22. package/dist/components/LivePreview.js +5 -5
  23. package/dist/components/LivePreview.js.map +1 -1
  24. package/dist/components/LogoPlaceholder.js +1 -1
  25. package/dist/components/LogoPlaceholder.js.map +1 -1
  26. package/dist/components/MentionableTextarea.js +3 -3
  27. package/dist/components/MentionableTextarea.js.map +1 -1
  28. package/dist/components/NotificationBell.js +1 -1
  29. package/dist/components/NotificationBell.js.map +1 -1
  30. package/dist/components/OfflineStatus.js +8 -8
  31. package/dist/components/OfflineStatus.js.map +1 -1
  32. package/dist/components/PresenceChips.d.ts.map +1 -1
  33. package/dist/components/PresenceChips.js +10 -6
  34. package/dist/components/PresenceChips.js.map +1 -1
  35. package/dist/components/SEOConfigPanel.d.ts.map +1 -1
  36. package/dist/components/SEOConfigPanel.js +10 -10
  37. package/dist/components/SEOConfigPanel.js.map +1 -1
  38. package/dist/components/SEOPanel.js +12 -12
  39. package/dist/components/SEOPanel.js.map +1 -1
  40. package/dist/components/SEOPerformance.d.ts.map +1 -1
  41. package/dist/components/SEOPerformance.js +3 -3
  42. package/dist/components/SEOPerformance.js.map +1 -1
  43. package/dist/components/TipTapEditor.js +6 -6
  44. package/dist/components/TipTapEditor.js.map +1 -1
  45. package/dist/components/pages/tag-badges.js +6 -6
  46. package/dist/components/pages/tag-badges.js.map +1 -1
  47. package/dist/components/posts/badges.d.ts +0 -4
  48. package/dist/components/posts/badges.d.ts.map +1 -1
  49. package/dist/components/posts/badges.js +28 -42
  50. package/dist/components/posts/badges.js.map +1 -1
  51. package/dist/components/ui/Badge.js +5 -5
  52. package/dist/components/ui/Badge.js.map +1 -1
  53. package/dist/components/ui/Toast.d.ts.map +1 -1
  54. package/dist/components/ui/Toast.js +4 -4
  55. package/dist/components/ui/Toast.js.map +1 -1
  56. package/dist/fields/ComponentBlockField.js +2 -2
  57. package/dist/fields/ComponentBlockField.js.map +1 -1
  58. package/dist/fields/FieldRenderer.js +1 -1
  59. package/dist/fields/FieldRenderer.js.map +1 -1
  60. package/dist/fields/PropInput.js +1 -1
  61. package/dist/fields/PropInput.js.map +1 -1
  62. package/dist/fields/RelationshipField.js +5 -5
  63. package/dist/fields/RelationshipField.js.map +1 -1
  64. package/dist/fields/ToggleField.js +1 -1
  65. package/dist/fields/ToggleField.js.map +1 -1
  66. package/dist/views/Dashboard.js +5 -5
  67. package/dist/views/Dashboard.js.map +1 -1
  68. package/dist/views/DocumentEdit.d.ts.map +1 -1
  69. package/dist/views/DocumentEdit.js +5 -5
  70. package/dist/views/DocumentEdit.js.map +1 -1
  71. package/dist/views/ForgotPassword.d.ts.map +1 -1
  72. package/dist/views/ForgotPassword.js +3 -2
  73. package/dist/views/ForgotPassword.js.map +1 -1
  74. package/dist/views/FormEditor.d.ts.map +1 -1
  75. package/dist/views/FormEditor.js +5 -5
  76. package/dist/views/FormEditor.js.map +1 -1
  77. package/dist/views/Login.d.ts.map +1 -1
  78. package/dist/views/Login.js +17 -17
  79. package/dist/views/Login.js.map +1 -1
  80. package/dist/views/PageEditor.d.ts.map +1 -1
  81. package/dist/views/PageEditor.js +2 -2
  82. package/dist/views/PageEditor.js.map +1 -1
  83. package/dist/views/Pages/PagesListView.js +6 -6
  84. package/dist/views/Pages/PagesListView.js.map +1 -1
  85. package/dist/views/Pages.d.ts.map +1 -1
  86. package/dist/views/Pages.js +16 -19
  87. package/dist/views/Pages.js.map +1 -1
  88. package/dist/views/ResetPassword.d.ts.map +1 -1
  89. package/dist/views/ResetPassword.js +3 -2
  90. package/dist/views/ResetPassword.js.map +1 -1
  91. package/dist/views/Settings.js +2 -2
  92. package/dist/views/Settings.js.map +1 -1
  93. package/dist/views/SetupWizard.d.ts.map +1 -1
  94. package/dist/views/SetupWizard.js +6 -5
  95. package/dist/views/SetupWizard.js.map +1 -1
  96. package/dist/views/page-builder/DesignScore.js +12 -12
  97. package/dist/views/page-builder/DesignScore.js.map +1 -1
  98. package/dist/views/page-builder/SEOPanel.js +9 -9
  99. package/dist/views/page-builder/SEOPanel.js.map +1 -1
  100. package/dist/views/page-editor/EditorCanvas.js +1 -1
  101. package/dist/views/page-editor/EditorCanvas.js.map +1 -1
  102. package/dist/views/page-editor/EditorTopBar.js +2 -2
  103. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  104. package/dist/views/page-editor/PagePreview.js +1 -1
  105. package/dist/views/page-editor/PagePreview.js.map +1 -1
  106. package/dist/views/page-editor/SectionInspector.js +1 -1
  107. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  108. package/dist/views/page-editor/SitePreviewFrame.js +1 -1
  109. package/dist/views/page-editor/SitePreviewFrame.js.map +1 -1
  110. package/dist/views/page-editor/sections/ArticleBodySection.js +1 -1
  111. package/dist/views/page-editor/sections/ArticleBodySection.js.map +1 -1
  112. package/dist/views/page-editor/sections/AuthorBioSection.js +2 -2
  113. package/dist/views/page-editor/sections/AuthorBioSection.js.map +1 -1
  114. package/dist/views/page-editor/sections/ByTheNumbersSection.js +1 -1
  115. package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -1
  116. package/dist/views/page-editor/sections/CtaBannerSection.js +1 -1
  117. package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -1
  118. package/dist/views/page-editor/sections/EmbedSection.d.ts.map +1 -1
  119. package/dist/views/page-editor/sections/EmbedSection.js +1 -1
  120. package/dist/views/page-editor/sections/EmbedSection.js.map +1 -1
  121. package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -1
  122. package/dist/views/page-editor/sections/FeatureHighlightSection.js +2 -2
  123. package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -1
  124. package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -1
  125. package/dist/views/page-editor/sections/GallerySection.js +1 -1
  126. package/dist/views/page-editor/sections/GallerySection.js.map +1 -1
  127. package/dist/views/page-editor/sections/HeroBannerSection.js +1 -1
  128. package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -1
  129. package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -1
  130. package/dist/views/page-editor/sections/MissionSection.js +1 -1
  131. package/dist/views/page-editor/sections/MissionSection.js.map +1 -1
  132. package/dist/views/page-editor/sections/PullQuoteSection.js +1 -1
  133. package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -1
  134. package/dist/views/page-editor/sections/RelatedPostsSection.js +1 -1
  135. package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -1
  136. package/dist/views/page-editor/sections/SectionRenderer.js +1 -1
  137. package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
  138. package/dist/views/page-editor/sections/parts.js +6 -6
  139. package/dist/views/page-editor/sections/parts.js.map +1 -1
  140. package/dist/views/post-editor/PostEditorCanvas.js +2 -2
  141. package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
  142. package/dist/views/post-editor/PostHeader.js +2 -2
  143. package/dist/views/post-editor/PostHeader.js.map +1 -1
  144. package/dist/views/post-editor/PostHeaderPanel.js +1 -1
  145. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  146. package/dist/views/post-editor/PostPreview.js +1 -1
  147. package/dist/views/post-editor/PostPreview.js.map +1 -1
  148. package/dist/views/profile/AccountSecurity.js +1 -1
  149. package/dist/views/profile/AccountSecurity.js.map +1 -1
  150. package/dist/views/settings/components.js +1 -1
  151. package/dist/views/settings/components.js.map +1 -1
  152. package/package.json +2 -2
  153. package/src/__tests__/components/posts-badges.test.tsx +3 -3
  154. package/src/components/AICoauthorBubbleMenu.tsx +4 -4
  155. package/src/components/Breadcrumbs.tsx +5 -5
  156. package/src/components/CoauthorResultPopover.tsx +26 -23
  157. package/src/components/CommandPalette.tsx +41 -39
  158. package/src/components/CommentSidePanel.tsx +20 -20
  159. package/src/components/ContentOverviewChart.tsx +4 -4
  160. package/src/components/FocalPointPicker.tsx +2 -2
  161. package/src/components/LivePreview.tsx +20 -17
  162. package/src/components/LogoPlaceholder.tsx +1 -1
  163. package/src/components/MentionableTextarea.tsx +5 -5
  164. package/src/components/NotificationBell.tsx +10 -10
  165. package/src/components/OfflineStatus.tsx +8 -8
  166. package/src/components/PresenceChips.tsx +12 -8
  167. package/src/components/SEOConfigPanel.tsx +40 -38
  168. package/src/components/SEOPanel.tsx +15 -15
  169. package/src/components/SEOPerformance.tsx +25 -23
  170. package/src/components/TipTapEditor.tsx +7 -7
  171. package/src/components/pages/tag-badges.tsx +6 -6
  172. package/src/components/posts/badges.tsx +28 -46
  173. package/src/components/ui/Badge.tsx +5 -5
  174. package/src/components/ui/Toast.tsx +4 -5
  175. package/src/fields/ComponentBlockField.tsx +2 -2
  176. package/src/fields/FieldRenderer.tsx +1 -1
  177. package/src/fields/PropInput.tsx +1 -1
  178. package/src/fields/RelationshipField.tsx +5 -5
  179. package/src/fields/ToggleField.tsx +1 -1
  180. package/src/views/Dashboard.tsx +5 -5
  181. package/src/views/DocumentEdit.tsx +13 -11
  182. package/src/views/ForgotPassword.tsx +21 -18
  183. package/src/views/FormEditor.tsx +74 -69
  184. package/src/views/Login.tsx +45 -39
  185. package/src/views/PageEditor.tsx +26 -22
  186. package/src/views/Pages/PagesListView.tsx +6 -6
  187. package/src/views/Pages.tsx +64 -65
  188. package/src/views/ResetPassword.tsx +32 -29
  189. package/src/views/Settings.tsx +2 -2
  190. package/src/views/SetupWizard.tsx +42 -33
  191. package/src/views/page-builder/DesignScore.tsx +12 -12
  192. package/src/views/page-builder/SEOPanel.tsx +12 -12
  193. package/src/views/page-editor/EditorCanvas.tsx +1 -1
  194. package/src/views/page-editor/EditorTopBar.tsx +2 -2
  195. package/src/views/page-editor/PagePreview.tsx +1 -1
  196. package/src/views/page-editor/SectionInspector.tsx +1 -1
  197. package/src/views/page-editor/SitePreviewFrame.tsx +1 -1
  198. package/src/views/page-editor/sections/ArticleBodySection.tsx +5 -5
  199. package/src/views/page-editor/sections/AuthorBioSection.tsx +6 -6
  200. package/src/views/page-editor/sections/ByTheNumbersSection.tsx +5 -5
  201. package/src/views/page-editor/sections/CtaBannerSection.tsx +1 -1
  202. package/src/views/page-editor/sections/EmbedSection.tsx +6 -4
  203. package/src/views/page-editor/sections/FeatureHighlightSection.tsx +7 -5
  204. package/src/views/page-editor/sections/GallerySection.tsx +6 -4
  205. package/src/views/page-editor/sections/HeroBannerSection.tsx +2 -2
  206. package/src/views/page-editor/sections/MissionSection.tsx +4 -2
  207. package/src/views/page-editor/sections/PullQuoteSection.tsx +4 -4
  208. package/src/views/page-editor/sections/RelatedPostsSection.tsx +5 -5
  209. package/src/views/page-editor/sections/SectionRenderer.tsx +2 -2
  210. package/src/views/page-editor/sections/parts.tsx +6 -6
  211. package/src/views/post-editor/PostEditorCanvas.tsx +4 -4
  212. package/src/views/post-editor/PostHeader.tsx +5 -5
  213. package/src/views/post-editor/PostHeaderPanel.tsx +1 -1
  214. package/src/views/post-editor/PostPreview.tsx +1 -1
  215. package/src/views/profile/AccountSecurity.tsx +1 -1
  216. package/src/views/settings/components.tsx +1 -1
@@ -81,20 +81,23 @@ export function CoauthorResultPopover({
81
81
  aria-label={`AI ${coauthorActionLabel(action)} result`}
82
82
  tabIndex={-1}
83
83
  onClick={(e) => e.stopPropagation()}
84
- className="w-full max-w-2xl rounded-lg bg-white shadow-2xl outline-none"
84
+ className="bg-card w-full max-w-2xl rounded-lg shadow-2xl outline-none"
85
85
  >
86
- <div className="flex items-center justify-between border-b border-gray-200 px-4 py-3">
87
- <div className="flex items-center gap-2 text-sm font-medium text-gray-900">
88
- <Sparkles className="h-4 w-4 text-blue-600" aria-hidden />
86
+ <div className="border-border flex items-center justify-between border-b px-4 py-3">
87
+ <div className="text-foreground flex items-center gap-2 text-sm font-medium">
88
+ <Sparkles className="text-primary h-4 w-4" aria-hidden />
89
89
  <span>AI {coauthorActionLabel(action)}</span>
90
90
  {loading && (
91
- <Loader2 className="ml-1 h-4 w-4 animate-spin text-gray-400" aria-label="Loading" />
91
+ <Loader2
92
+ className="text-muted-foreground ml-1 h-4 w-4 animate-spin"
93
+ aria-label="Loading"
94
+ />
92
95
  )}
93
96
  </div>
94
97
  <button
95
98
  type="button"
96
99
  onClick={onDiscard}
97
- className="rounded p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600"
100
+ className="text-muted-foreground hover:bg-accent hover:text-muted-foreground rounded p-1"
98
101
  aria-label="Close"
99
102
  >
100
103
  <X className="h-4 w-4" />
@@ -105,34 +108,34 @@ export function CoauthorResultPopover({
105
108
  <section aria-labelledby="coauthor-before">
106
109
  <h3
107
110
  id="coauthor-before"
108
- className="mb-2 text-xs font-medium tracking-wide text-gray-500 uppercase"
111
+ className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase"
109
112
  >
110
113
  Before
111
114
  </h3>
112
- <pre className="max-h-72 overflow-auto rounded border border-gray-200 bg-gray-50 p-3 text-sm whitespace-pre-wrap text-gray-700">
115
+ <pre className="border-border bg-muted text-foreground max-h-72 overflow-auto rounded border p-3 text-sm whitespace-pre-wrap">
113
116
  {before}
114
117
  </pre>
115
118
  </section>
116
119
  <section aria-labelledby="coauthor-after">
117
120
  <h3
118
121
  id="coauthor-after"
119
- className="mb-2 text-xs font-medium tracking-wide text-gray-500 uppercase"
122
+ className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase"
120
123
  >
121
124
  After
122
125
  </h3>
123
126
  {loading ? (
124
127
  <div
125
- className="flex h-72 items-center justify-center rounded border border-dashed border-gray-200 bg-gray-50 text-sm text-gray-400"
128
+ className="border-border bg-muted text-muted-foreground flex h-72 items-center justify-center rounded border border-dashed text-sm"
126
129
  role="status"
127
130
  >
128
131
  Thinking…
129
132
  </div>
130
133
  ) : error ? (
131
- <div className="flex h-72 items-center justify-center rounded border border-dashed border-red-200 bg-red-50 p-3 text-sm text-red-600">
134
+ <div className="border-destructive/30 bg-destructive/10 text-destructive flex h-72 items-center justify-center rounded border border-dashed p-3 text-sm">
132
135
  {error}
133
136
  </div>
134
137
  ) : (
135
- <pre className="max-h-72 overflow-auto rounded border border-blue-200 bg-blue-50 p-3 text-sm whitespace-pre-wrap text-gray-900">
138
+ <pre className="border-info/30 bg-info/10 text-foreground max-h-72 overflow-auto rounded border p-3 text-sm whitespace-pre-wrap">
136
139
  {after}
137
140
  </pre>
138
141
  )}
@@ -140,18 +143,18 @@ export function CoauthorResultPopover({
140
143
  </div>
141
144
 
142
145
  {changes && changes.length > 0 && !loading && !error && (
143
- <div className="border-t border-gray-200 px-4 py-3">
144
- <h3 className="mb-2 text-xs font-medium tracking-wide text-gray-500 uppercase">
146
+ <div className="border-border border-t px-4 py-3">
147
+ <h3 className="text-muted-foreground mb-2 text-xs font-medium tracking-wide uppercase">
145
148
  Changes ({changes.length})
146
149
  </h3>
147
150
  <ul className="max-h-32 space-y-1 overflow-auto text-xs">
148
151
  {changes.map((change, i) => (
149
- <li key={i} className="flex items-start gap-2 rounded bg-gray-50 px-2 py-1">
150
- <span className="text-red-600 line-through">{change.original}</span>
151
- <span className="text-gray-400">→</span>
152
- <span className="text-green-700">{change.corrected}</span>
152
+ <li key={i} className="bg-muted flex items-start gap-2 rounded px-2 py-1">
153
+ <span className="text-destructive line-through">{change.original}</span>
154
+ <span className="text-muted-foreground">→</span>
155
+ <span className="text-success">{change.corrected}</span>
153
156
  {change.reason && (
154
- <span className="ml-auto text-gray-500 italic">{change.reason}</span>
157
+ <span className="text-muted-foreground ml-auto italic">{change.reason}</span>
155
158
  )}
156
159
  </li>
157
160
  ))}
@@ -159,11 +162,11 @@ export function CoauthorResultPopover({
159
162
  </div>
160
163
  )}
161
164
 
162
- <div className="flex items-center justify-end gap-2 border-t border-gray-200 bg-gray-50 px-4 py-3">
165
+ <div className="border-border bg-muted flex items-center justify-end gap-2 border-t px-4 py-3">
163
166
  <button
164
167
  type="button"
165
168
  onClick={onDiscard}
166
- className="rounded-md border border-gray-200 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-50"
169
+ className="border-border bg-card text-foreground hover:bg-accent rounded-md border px-3 py-1.5 text-sm"
167
170
  >
168
171
  <X className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
169
172
  Discard
@@ -172,7 +175,7 @@ export function CoauthorResultPopover({
172
175
  type="button"
173
176
  onClick={onCopy}
174
177
  disabled={copyDisabled}
175
- className="rounded-md border border-gray-200 bg-white px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50"
178
+ className="border-border bg-card text-foreground hover:bg-accent rounded-md border px-3 py-1.5 text-sm disabled:cursor-not-allowed disabled:opacity-50"
176
179
  >
177
180
  <Copy className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
178
181
  Copy
@@ -181,7 +184,7 @@ export function CoauthorResultPopover({
181
184
  type="button"
182
185
  onClick={onApply}
183
186
  disabled={applyDisabled}
184
- className="rounded-md bg-blue-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50"
187
+ className="bg-primary hover:bg-primary/90 rounded-md px-3 py-1.5 text-sm font-medium text-white disabled:cursor-not-allowed disabled:opacity-50"
185
188
  >
186
189
  <Check className="mr-1.5 inline h-3.5 w-3.5" aria-hidden />
187
190
  {applyLabel ?? 'Apply'}
@@ -340,7 +340,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
340
340
  onClick={(e) => e.stopPropagation()}
341
341
  >
342
342
  <Command
343
- className="w-full overflow-hidden rounded-lg bg-white shadow-2xl"
343
+ className="bg-card w-full overflow-hidden rounded-lg shadow-2xl"
344
344
  onKeyDown={(e) => {
345
345
  if (e.key === 'Escape') {
346
346
  onOpenChange(false)
@@ -349,30 +349,30 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
349
349
  }}
350
350
  shouldFilter={!hasQuery}
351
351
  >
352
- <div className="flex items-center border-b border-gray-200 px-4">
353
- <Search className="mr-3 h-5 w-5 shrink-0 text-gray-400" />
352
+ <div className="border-border flex items-center border-b px-4">
353
+ <Search className="text-muted-foreground mr-3 h-5 w-5 shrink-0" />
354
354
  <Command.Input
355
355
  value={search}
356
356
  onValueChange={setSearch}
357
357
  placeholder="Search, jump to, or type /ai to use the AI co-author…"
358
- className="w-full bg-transparent py-4 text-base placeholder:text-gray-400 focus:outline-none"
358
+ className="placeholder:text-muted-foreground w-full bg-transparent py-4 text-base focus:outline-none"
359
359
  />
360
360
  {loading && (
361
- <div className="mr-2 h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-gray-300 border-t-gray-600" />
361
+ <div className="border-border mr-2 h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-t-gray-600" />
362
362
  )}
363
- <kbd className="hidden shrink-0 rounded bg-gray-100 px-2 py-1 font-mono text-xs text-gray-600 sm:inline-block">
363
+ <kbd className="bg-muted text-muted-foreground hidden shrink-0 rounded px-2 py-1 font-mono text-xs sm:inline-block">
364
364
  ESC
365
365
  </kbd>
366
366
  </div>
367
367
 
368
368
  <Command.List className="max-h-[400px] overflow-y-auto p-2">
369
- <Command.Empty className="py-6 text-center text-sm text-gray-500">
369
+ <Command.Empty className="text-muted-foreground py-6 text-center text-sm">
370
370
  {loading ? 'Searching...' : 'No results found.'}
371
371
  </Command.Empty>
372
372
 
373
373
  {isAiMode && (
374
374
  <Command.Group heading="AI co-author" className="px-2 py-2">
375
- <div className="mb-2 flex items-center gap-1 text-xs font-medium text-gray-500">
375
+ <div className="text-muted-foreground mb-2 flex items-center gap-1 text-xs font-medium">
376
376
  <Sparkles className="h-3 w-3" aria-hidden /> AI CO-AUTHOR
377
377
  </div>
378
378
  {aiActions.map((action) => {
@@ -384,23 +384,23 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
384
384
  key={`ai-${action}`}
385
385
  value={`ai ${action}`}
386
386
  onSelect={() => runSlashAction(action, aiPayload)}
387
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
387
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
388
388
  >
389
- <Icon className="h-4 w-4 text-blue-600" />
389
+ <Icon className="text-primary h-4 w-4" />
390
390
  <div className="flex min-w-0 flex-col">
391
391
  <span className="font-medium">
392
392
  {coauthorActionLabel(action)}
393
393
  {previewable && (
394
- <span className="ml-1 font-normal text-gray-500">
394
+ <span className="text-muted-foreground ml-1 font-normal">
395
395
  “{truncatePreview(aiPayload)}”
396
396
  </span>
397
397
  )}
398
398
  </span>
399
- <span className="text-xs text-gray-400">
399
+ <span className="text-muted-foreground text-xs">
400
400
  {coauthorActionDescription(action)}
401
401
  </span>
402
402
  </div>
403
- <kbd className="ml-auto rounded bg-gray-100 px-1.5 py-0.5 font-mono text-[10px] text-gray-500">
403
+ <kbd className="bg-muted text-muted-foreground ml-auto rounded px-1.5 py-0.5 font-mono text-[10px]">
404
404
  /ai {action}
405
405
  </kbd>
406
406
  </Command.Item>
@@ -411,17 +411,19 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
411
411
 
412
412
  {!isAiMode && !hasQuery && recentItems.length > 0 && (
413
413
  <Command.Group heading="Recent" className="px-2 py-2">
414
- <div className="mb-2 text-xs font-medium text-gray-500">RECENT</div>
414
+ <div className="text-muted-foreground mb-2 text-xs font-medium">RECENT</div>
415
415
  {recentItems.map((item) => (
416
416
  <Command.Item
417
417
  key={`recent-${item.id}`}
418
418
  value={`recent ${item.label}`}
419
419
  onSelect={() => handleSelect(item.path, item)}
420
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
420
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
421
421
  >
422
- <Clock className="h-4 w-4 text-gray-400" />
422
+ <Clock className="text-muted-foreground h-4 w-4" />
423
423
  <span>{item.label}</span>
424
- <span className="ml-auto text-xs text-gray-400 capitalize">{item.type}</span>
424
+ <span className="text-muted-foreground ml-auto text-xs capitalize">
425
+ {item.type}
426
+ </span>
425
427
  </Command.Item>
426
428
  ))}
427
429
  </Command.Group>
@@ -429,7 +431,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
429
431
 
430
432
  {!isAiMode && hasQuery && documents.length > 0 && (
431
433
  <Command.Group heading="Documents" className="px-2 py-2">
432
- <div className="mb-2 text-xs font-medium text-gray-500">DOCUMENTS</div>
434
+ <div className="text-muted-foreground mb-2 text-xs font-medium">DOCUMENTS</div>
433
435
  {documents.map((doc) => (
434
436
  <Command.Item
435
437
  key={`doc-${doc.id}`}
@@ -442,12 +444,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
442
444
  type: 'document',
443
445
  })
444
446
  }
445
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
447
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
446
448
  >
447
- <FileText className="h-4 w-4 text-gray-500" />
449
+ <FileText className="text-muted-foreground h-4 w-4" />
448
450
  <div className="flex min-w-0 flex-col">
449
451
  <span className="truncate">{doc.title ?? doc.slug ?? doc.id}</span>
450
- <span className="text-xs text-gray-400">
452
+ <span className="text-muted-foreground text-xs">
451
453
  {doc.collection} &middot; {doc.status}
452
454
  </span>
453
455
  </div>
@@ -458,7 +460,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
458
460
 
459
461
  {!isAiMode && hasQuery && media.length > 0 && (
460
462
  <Command.Group heading="Media" className="mt-1 px-2 py-2">
461
- <div className="mb-2 text-xs font-medium text-gray-500">MEDIA</div>
463
+ <div className="text-muted-foreground mb-2 text-xs font-medium">MEDIA</div>
462
464
  {media.map((m) => (
463
465
  <Command.Item
464
466
  key={`media-${m.id}`}
@@ -471,12 +473,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
471
473
  type: 'media',
472
474
  })
473
475
  }
474
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
476
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
475
477
  >
476
- <Image className="h-4 w-4 text-gray-500" />
478
+ <Image className="text-muted-foreground h-4 w-4" />
477
479
  <div className="flex min-w-0 flex-col">
478
480
  <span className="truncate">{m.filename}</span>
479
- <span className="text-xs text-gray-400">{m.mimeType}</span>
481
+ <span className="text-muted-foreground text-xs">{m.mimeType}</span>
480
482
  </div>
481
483
  </Command.Item>
482
484
  ))}
@@ -485,7 +487,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
485
487
 
486
488
  {!isAiMode && hasQuery && users.length > 0 && (
487
489
  <Command.Group heading="Users" className="mt-1 px-2 py-2">
488
- <div className="mb-2 text-xs font-medium text-gray-500">USERS</div>
490
+ <div className="text-muted-foreground mb-2 text-xs font-medium">USERS</div>
489
491
  {users.map((u) => (
490
492
  <Command.Item
491
493
  key={`user-${u.id}`}
@@ -498,12 +500,12 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
498
500
  type: 'user',
499
501
  })
500
502
  }
501
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
503
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
502
504
  >
503
- <Users className="h-4 w-4 text-gray-500" />
505
+ <Users className="text-muted-foreground h-4 w-4" />
504
506
  <div className="flex min-w-0 flex-col">
505
507
  <span className="truncate">{u.name}</span>
506
- <span className="text-xs text-gray-400">
508
+ <span className="text-muted-foreground text-xs">
507
509
  {u.email} &middot; {u.role}
508
510
  </span>
509
511
  </div>
@@ -514,7 +516,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
514
516
 
515
517
  {!isAiMode && (!hasQuery || !hasResults) && (
516
518
  <Command.Group heading="Navigation" className="px-2 py-2">
517
- <div className="mb-2 text-xs font-medium text-gray-500">NAVIGATION</div>
519
+ <div className="text-muted-foreground mb-2 text-xs font-medium">NAVIGATION</div>
518
520
  {navigationCommands.map((cmd) => {
519
521
  const Icon = cmd.icon
520
522
  return (
@@ -522,9 +524,9 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
522
524
  key={cmd.id}
523
525
  value={cmd.label}
524
526
  onSelect={() => handleSelect(cmd.action)}
525
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
527
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
526
528
  >
527
- <Icon className="h-4 w-4 text-gray-500" />
529
+ <Icon className="text-muted-foreground h-4 w-4" />
528
530
  <span>{cmd.label}</span>
529
531
  </Command.Item>
530
532
  )
@@ -534,7 +536,7 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
534
536
 
535
537
  {!isAiMode && (
536
538
  <Command.Group heading="Actions" className="mt-2 px-2 py-2">
537
- <div className="mb-2 text-xs font-medium text-gray-500">ACTIONS</div>
539
+ <div className="text-muted-foreground mb-2 text-xs font-medium">ACTIONS</div>
538
540
  {staticActions.map((cmd) => {
539
541
  const Icon = cmd.icon
540
542
  return (
@@ -549,9 +551,9 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
549
551
  type: 'action',
550
552
  })
551
553
  }
552
- className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-100 data-[selected=true]:bg-gray-100"
554
+ className="hover:bg-accent data-[selected=true]:bg-muted flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2"
553
555
  >
554
- <Icon className="h-4 w-4 text-gray-500" />
556
+ <Icon className="text-muted-foreground h-4 w-4" />
555
557
  <span>{cmd.label}</span>
556
558
  </Command.Item>
557
559
  )
@@ -560,19 +562,19 @@ export function CommandPalette({ open, onOpenChange, onNavigate }: CommandPalett
560
562
  )}
561
563
  </Command.List>
562
564
 
563
- <div className="flex items-center justify-between border-t border-gray-200 bg-gray-50 px-4 py-3 text-xs text-gray-500">
565
+ <div className="border-border bg-muted text-muted-foreground flex items-center justify-between border-t px-4 py-3 text-xs">
564
566
  <div className="flex items-center gap-4">
565
567
  <span className="flex items-center gap-1">
566
- <kbd className="rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]">
568
+ <kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
567
569
 
568
570
  </kbd>
569
- <kbd className="rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]">
571
+ <kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
570
572
 
571
573
  </kbd>
572
574
  to navigate
573
575
  </span>
574
576
  <span className="flex items-center gap-1">
575
- <kbd className="rounded border border-gray-300 bg-white px-1.5 py-0.5 text-[10px]">
577
+ <kbd className="border-border bg-card rounded border px-1.5 py-0.5 text-[10px]">
576
578
 
577
579
  </kbd>
578
580
  to select
@@ -228,13 +228,13 @@ export function CommentSidePanel({
228
228
  [api, onError, refresh, activeCommentId, setActive],
229
229
  )
230
230
 
231
- const wrapperClass = `flex h-full flex-col gap-3 border-l border-gray-200 bg-white p-3 ${className ?? ''}`
231
+ const wrapperClass = `flex h-full flex-col gap-3 border-l border-border bg-card p-3 ${className ?? ''}`
232
232
 
233
233
  return (
234
234
  <aside className={wrapperClass} data-testid="comment-side-panel">
235
235
  <header className="flex items-center justify-between">
236
- <h2 className="text-sm font-medium text-gray-900">Comments</h2>
237
- <label className="flex cursor-pointer items-center gap-1 text-xs text-gray-600">
236
+ <h2 className="text-foreground text-sm font-medium">Comments</h2>
237
+ <label className="text-muted-foreground flex cursor-pointer items-center gap-1 text-xs">
238
238
  <input
239
239
  type="checkbox"
240
240
  checked={includeResolved}
@@ -247,7 +247,7 @@ export function CommentSidePanel({
247
247
 
248
248
  <section className="flex flex-col gap-1.5">
249
249
  <MentionableTextarea
250
- className="w-full resize-none rounded border border-gray-300 p-2 text-sm focus:border-blue-500 focus:outline-none"
250
+ className="border-border focus-visible:border-ring w-full resize-none rounded border p-2 text-sm focus:outline-none"
251
251
  rows={3}
252
252
  placeholder="Write a comment… Type @ to mention a teammate."
253
253
  value={draft}
@@ -258,7 +258,7 @@ export function CommentSidePanel({
258
258
  <div className="flex justify-end">
259
259
  <button
260
260
  type="button"
261
- className="rounded bg-blue-600 px-3 py-1 text-xs font-medium text-white hover:bg-blue-500 disabled:opacity-50"
261
+ className="bg-primary hover:bg-info rounded px-3 py-1 text-xs font-medium text-white disabled:opacity-50"
262
262
  disabled={!draft.trim()}
263
263
  onClick={handleCompose}
264
264
  data-testid="comment-submit"
@@ -270,9 +270,9 @@ export function CommentSidePanel({
270
270
 
271
271
  <section className="flex-1 overflow-y-auto" aria-busy={loading} data-testid="comment-list">
272
272
  {loading ? (
273
- <p className="text-xs text-gray-500">Loading…</p>
273
+ <p className="text-muted-foreground text-xs">Loading…</p>
274
274
  ) : threads.length === 0 ? (
275
- <p className="text-xs text-gray-500">No comments yet.</p>
275
+ <p className="text-muted-foreground text-xs">No comments yet.</p>
276
276
  ) : (
277
277
  <ul className="flex flex-col gap-2">
278
278
  {threads.map((thread) => (
@@ -323,8 +323,8 @@ function CommentThreadView({
323
323
  mentionSearch,
324
324
  }: CommentThreadViewProps): React.JSX.Element {
325
325
  const [replyDraft, setReplyDraft] = useState('')
326
- const cardClass = `rounded border bg-gray-50 p-2 ${
327
- isActive ? 'border-yellow-400 ring-1 ring-yellow-300' : 'border-gray-200'
326
+ const cardClass = `rounded border bg-muted p-2 ${
327
+ isActive ? 'border-yellow-400 ring-1 ring-yellow-300' : 'border-border'
328
328
  }`
329
329
 
330
330
  return (
@@ -344,7 +344,7 @@ function CommentThreadView({
344
344
  mentionSearch={mentionSearch}
345
345
  />
346
346
  {thread.replies.length > 0 && (
347
- <ul className="mt-2 flex flex-col gap-1 border-l-2 border-gray-200 pl-2">
347
+ <ul className="border-border mt-2 flex flex-col gap-1 border-l-2 pl-2">
348
348
  {thread.replies.map((reply) => (
349
349
  <li key={reply.id}>
350
350
  <CommentRow
@@ -365,7 +365,7 @@ function CommentThreadView({
365
365
  <div className="mt-2 flex items-start gap-1">
366
366
  <div className="flex-1">
367
367
  <MentionableTextarea
368
- className="w-full resize-none rounded border border-gray-300 px-2 py-1 text-xs focus:border-blue-500 focus:outline-none"
368
+ className="border-border focus-visible:border-ring w-full resize-none rounded border px-2 py-1 text-xs focus:outline-none"
369
369
  placeholder="Reply… Type @ to mention."
370
370
  rows={1}
371
371
  value={replyDraft}
@@ -377,7 +377,7 @@ function CommentThreadView({
377
377
  </div>
378
378
  <button
379
379
  type="button"
380
- className="rounded bg-gray-700 px-2 py-1 text-xs font-medium text-white hover:bg-gray-600 disabled:opacity-50"
380
+ className="bg-foreground hover:bg-foreground/90 rounded px-2 py-1 text-xs font-medium text-white disabled:opacity-50"
381
381
  disabled={!replyDraft.trim()}
382
382
  onClick={(e) => {
383
383
  e.stopPropagation()
@@ -420,7 +420,7 @@ function CommentRow({
420
420
 
421
421
  const canMutate = isAdmin || comment.userId === currentUserId
422
422
  const meta = (
423
- <div className="text-xs text-gray-500">
423
+ <div className="text-muted-foreground text-xs">
424
424
  {comment.userId ?? 'deleted user'} · {formatRelative(comment.createdAt)}
425
425
  {comment.isResolved ? ' · resolved' : null}
426
426
  </div>
@@ -432,7 +432,7 @@ function CommentRow({
432
432
  {editing ? (
433
433
  <>
434
434
  <MentionableTextarea
435
- className="w-full resize-none rounded border border-gray-300 p-1 text-sm"
435
+ className="border-border w-full resize-none rounded border p-1 text-sm"
436
436
  rows={3}
437
437
  value={draft}
438
438
  onChange={setDraft}
@@ -443,7 +443,7 @@ function CommentRow({
443
443
  <div className="flex gap-1">
444
444
  <button
445
445
  type="button"
446
- className="rounded bg-blue-600 px-2 py-1 text-xs font-medium text-white"
446
+ className="bg-primary rounded px-2 py-1 text-xs font-medium text-white"
447
447
  onClick={async (e) => {
448
448
  e.stopPropagation()
449
449
  const ok = await onEdit(comment.id, draft)
@@ -455,7 +455,7 @@ function CommentRow({
455
455
  </button>
456
456
  <button
457
457
  type="button"
458
- className="rounded border border-gray-300 px-2 py-1 text-xs"
458
+ className="border-border rounded border px-2 py-1 text-xs"
459
459
  onClick={(e) => {
460
460
  e.stopPropagation()
461
461
  setDraft(comment.body)
@@ -469,7 +469,7 @@ function CommentRow({
469
469
  </>
470
470
  ) : (
471
471
  <p
472
- className="text-sm whitespace-pre-wrap text-gray-900"
472
+ className="text-foreground text-sm whitespace-pre-wrap"
473
473
  data-testid={`comment-body-${comment.id}`}
474
474
  >
475
475
  {comment.body}
@@ -480,7 +480,7 @@ function CommentRow({
480
480
  {canMutate && (
481
481
  <button
482
482
  type="button"
483
- className="text-gray-600 hover:text-gray-900"
483
+ className="text-muted-foreground hover:text-foreground"
484
484
  onClick={(e) => {
485
485
  e.stopPropagation()
486
486
  setEditing(true)
@@ -493,7 +493,7 @@ function CommentRow({
493
493
  {onToggleResolve && (
494
494
  <button
495
495
  type="button"
496
- className="text-gray-600 hover:text-gray-900"
496
+ className="text-muted-foreground hover:text-foreground"
497
497
  onClick={(e) => {
498
498
  e.stopPropagation()
499
499
  onToggleResolve()
@@ -506,7 +506,7 @@ function CommentRow({
506
506
  {canMutate && (
507
507
  <button
508
508
  type="button"
509
- className="text-red-600 hover:text-red-700"
509
+ className="text-destructive hover:text-destructive"
510
510
  onClick={(e) => {
511
511
  e.stopPropagation()
512
512
  onDelete()
@@ -20,7 +20,7 @@ export function ContentOverviewChart({ published, drafts, scheduled }: ContentOv
20
20
 
21
21
  if (total === 0) {
22
22
  return (
23
- <div className="flex h-full items-center justify-center text-sm text-gray-400">
23
+ <div className="text-muted-foreground flex h-full items-center justify-center text-sm">
24
24
  No content yet
25
25
  </div>
26
26
  )
@@ -58,12 +58,12 @@ export function ContentOverviewChart({ published, drafts, scheduled }: ContentOv
58
58
  style={{ backgroundColor: COLORS[idx] }}
59
59
  />
60
60
  <div className="min-w-0">
61
- <span className="text-sm text-gray-700">{entry.name}</span>
61
+ <span className="text-foreground text-sm">{entry.name}</span>
62
62
  <div className="flex items-baseline gap-2">
63
- <span className="text-lg font-medium text-gray-900">
63
+ <span className="text-foreground text-lg font-medium">
64
64
  {entry.value.toLocaleString()}
65
65
  </span>
66
- <span className="text-xs text-gray-400">{pct}%</span>
66
+ <span className="text-muted-foreground text-xs">{pct}%</span>
67
67
  </div>
68
68
  </div>
69
69
  </div>
@@ -50,10 +50,10 @@ export function FocalPointPicker({ imageUrl, focalX, focalY, onChange }: FocalPo
50
50
  draggable={false}
51
51
  />
52
52
  <div
53
- className="pointer-events-none absolute -mt-3 -ml-3 h-6 w-6 rounded-full border-2 border-white bg-blue-500/50 shadow-lg"
53
+ className="bg-info/50 pointer-events-none absolute -mt-3 -ml-3 h-6 w-6 rounded-full border-2 border-white shadow-lg"
54
54
  style={{ left: `${focalX * 100}%`, top: `${focalY * 100}%` }}
55
55
  >
56
- <div className="absolute inset-1 rounded-full bg-white" />
56
+ <div className="bg-card absolute inset-1 rounded-full" />
57
57
  </div>
58
58
  </div>
59
59
  <p className="text-xs text-[var(--muted-foreground)]">