@actuate-media/cms-admin 0.49.1 → 0.49.4

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 (113) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/AdminRoot.js +2 -2
  3. package/dist/AdminRoot.js.map +1 -1
  4. package/dist/actuate-admin.css +1 -1
  5. package/dist/components/CoauthorResultPopover.js +1 -1
  6. package/dist/components/CoauthorResultPopover.js.map +1 -1
  7. package/dist/components/CommentSidePanel.js +1 -1
  8. package/dist/components/CommentSidePanel.js.map +1 -1
  9. package/dist/components/ContentOverviewChart.js +1 -1
  10. package/dist/components/ContentOverviewChart.js.map +1 -1
  11. package/dist/components/FolderTree.js +19 -19
  12. package/dist/components/FolderTree.js.map +1 -1
  13. package/dist/components/NotificationBell.js +1 -1
  14. package/dist/components/NotificationBell.js.map +1 -1
  15. package/dist/components/PresenceChips.js +1 -1
  16. package/dist/components/PresenceChips.js.map +1 -1
  17. package/dist/components/SEOConfigPanel.js +2 -2
  18. package/dist/components/SEOConfigPanel.js.map +1 -1
  19. package/dist/components/SEOPanel.d.ts.map +1 -1
  20. package/dist/components/SEOPanel.js +2 -2
  21. package/dist/components/SEOPanel.js.map +1 -1
  22. package/dist/components/SEOPerformance.js +2 -2
  23. package/dist/components/SEOPerformance.js.map +1 -1
  24. package/dist/components/forms/EntriesTable.js +1 -1
  25. package/dist/components/forms/EntriesTable.js.map +1 -1
  26. package/dist/components/ui/Card.js +1 -1
  27. package/dist/components/ui/Card.js.map +1 -1
  28. package/dist/components/ui/EmptyState.js +1 -1
  29. package/dist/components/ui/EmptyState.js.map +1 -1
  30. package/dist/layout/Sidebar.js +1 -1
  31. package/dist/layout/Sidebar.js.map +1 -1
  32. package/dist/layout/primitives/PageContainer.js +1 -1
  33. package/dist/layout/primitives/PageContainer.js.map +1 -1
  34. package/dist/views/CollectionList.js +1 -1
  35. package/dist/views/CollectionList.js.map +1 -1
  36. package/dist/views/Dashboard.js +8 -8
  37. package/dist/views/Dashboard.js.map +1 -1
  38. package/dist/views/DocumentEdit.js +1 -1
  39. package/dist/views/DocumentEdit.js.map +1 -1
  40. package/dist/views/ForgotPassword.js +1 -1
  41. package/dist/views/ForgotPassword.js.map +1 -1
  42. package/dist/views/FormEditor.d.ts.map +1 -1
  43. package/dist/views/FormEditor.js +1 -1
  44. package/dist/views/FormEditor.js.map +1 -1
  45. package/dist/views/Login.js +1 -1
  46. package/dist/views/Login.js.map +1 -1
  47. package/dist/views/MediaBrowser.d.ts.map +1 -1
  48. package/dist/views/MediaBrowser.js +16 -16
  49. package/dist/views/MediaBrowser.js.map +1 -1
  50. package/dist/views/PageEditor.js +1 -1
  51. package/dist/views/PageEditor.js.map +1 -1
  52. package/dist/views/Pages/PagesListView.d.ts.map +1 -1
  53. package/dist/views/Pages/PagesListView.js +5 -5
  54. package/dist/views/Pages/PagesListView.js.map +1 -1
  55. package/dist/views/Pages.js +1 -1
  56. package/dist/views/Pages.js.map +1 -1
  57. package/dist/views/Posts/PostsListView.d.ts.map +1 -1
  58. package/dist/views/Posts/PostsListView.js +4 -4
  59. package/dist/views/Posts/PostsListView.js.map +1 -1
  60. package/dist/views/Redirects.d.ts.map +1 -1
  61. package/dist/views/Redirects.js +7 -7
  62. package/dist/views/Redirects.js.map +1 -1
  63. package/dist/views/ResetPassword.js +2 -2
  64. package/dist/views/ResetPassword.js.map +1 -1
  65. package/dist/views/ScriptTagEditor.js +4 -4
  66. package/dist/views/ScriptTagEditor.js.map +1 -1
  67. package/dist/views/ScriptTags.d.ts.map +1 -1
  68. package/dist/views/ScriptTags.js +5 -5
  69. package/dist/views/ScriptTags.js.map +1 -1
  70. package/dist/views/SetupWizard.js +2 -2
  71. package/dist/views/SetupWizard.js.map +1 -1
  72. package/dist/views/page-editor/SectionInspector.js +2 -2
  73. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  74. package/dist/views/post-editor/PostHeader.d.ts.map +1 -1
  75. package/dist/views/post-editor/PostHeader.js +2 -2
  76. package/dist/views/post-editor/PostHeader.js.map +1 -1
  77. package/dist/views/post-editor/PostHeaderPanel.js +1 -1
  78. package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/AdminRoot.tsx +2 -2
  81. package/src/components/CoauthorResultPopover.tsx +1 -1
  82. package/src/components/CommentSidePanel.tsx +1 -1
  83. package/src/components/ContentOverviewChart.tsx +1 -1
  84. package/src/components/FolderTree.tsx +32 -32
  85. package/src/components/NotificationBell.tsx +2 -2
  86. package/src/components/PresenceChips.tsx +1 -1
  87. package/src/components/SEOConfigPanel.tsx +3 -3
  88. package/src/components/SEOPanel.tsx +8 -6
  89. package/src/components/SEOPerformance.tsx +5 -5
  90. package/src/components/forms/EntriesTable.tsx +1 -1
  91. package/src/components/ui/Card.tsx +1 -1
  92. package/src/components/ui/EmptyState.tsx +1 -1
  93. package/src/layout/Sidebar.tsx +1 -1
  94. package/src/layout/primitives/PageContainer.tsx +1 -1
  95. package/src/views/CollectionList.tsx +1 -1
  96. package/src/views/Dashboard.tsx +12 -12
  97. package/src/views/DocumentEdit.tsx +4 -4
  98. package/src/views/ForgotPassword.tsx +1 -1
  99. package/src/views/FormEditor.tsx +1 -3
  100. package/src/views/Login.tsx +2 -2
  101. package/src/views/MediaBrowser.tsx +126 -120
  102. package/src/views/PageEditor.tsx +2 -2
  103. package/src/views/Pages/PagesListView.tsx +126 -118
  104. package/src/views/Pages.tsx +1 -1
  105. package/src/views/Posts/PostsListView.tsx +115 -111
  106. package/src/views/Redirects.tsx +48 -44
  107. package/src/views/ResetPassword.tsx +2 -2
  108. package/src/views/ScriptTagEditor.tsx +40 -40
  109. package/src/views/ScriptTags.tsx +34 -30
  110. package/src/views/SetupWizard.tsx +2 -2
  111. package/src/views/page-editor/SectionInspector.tsx +4 -4
  112. package/src/views/post-editor/PostHeader.tsx +2 -4
  113. package/src/views/post-editor/PostHeaderPanel.tsx +2 -2
@@ -191,10 +191,10 @@ export function FolderTree({
191
191
  <div
192
192
  className={`group flex cursor-pointer items-center gap-1 rounded-md px-2 py-1.5 text-sm transition-colors ${
193
193
  isActive
194
- ? 'bg-blue-50 font-medium text-blue-700'
194
+ ? 'bg-primary/10 text-primary font-medium'
195
195
  : isDragOver
196
- ? 'bg-blue-100 ring-2 ring-blue-300'
197
- : 'text-gray-700 hover:bg-gray-100'
196
+ ? 'bg-primary/15 ring-primary/40 ring-2'
197
+ : 'text-foreground hover:bg-muted'
198
198
  }`}
199
199
  style={{ paddingLeft: `${8 + depth * 16}px` }}
200
200
  onClick={() => onSelect({ type: 'folder', folderId: folder.id })}
@@ -208,7 +208,7 @@ export function FolderTree({
208
208
  >
209
209
  <button
210
210
  type="button"
211
- className={`rounded p-0.5 transition-colors hover:bg-gray-200 ${hasChildren ? '' : 'invisible'}`}
211
+ className={`hover:bg-muted rounded p-0.5 transition-colors ${hasChildren ? '' : 'invisible'}`}
212
212
  onClick={(e) => {
213
213
  e.stopPropagation()
214
214
  toggleExpand(folder.id)
@@ -222,9 +222,9 @@ export function FolderTree({
222
222
  </button>
223
223
 
224
224
  {isExpanded ? (
225
- <FolderOpen className="h-4 w-4 shrink-0 text-blue-500" />
225
+ <FolderOpen className="text-primary h-4 w-4 shrink-0" />
226
226
  ) : (
227
- <FolderIcon className="h-4 w-4 shrink-0 text-gray-400" />
227
+ <FolderIcon className="text-muted-foreground h-4 w-4 shrink-0" />
228
228
  )}
229
229
 
230
230
  {editingId === folder.id ? (
@@ -238,7 +238,7 @@ export function FolderTree({
238
238
  if (e.key === 'Enter') handleRename(folder.id)
239
239
  if (e.key === 'Escape') setEditingId(null)
240
240
  }}
241
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
241
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
242
242
  onClick={(e) => e.stopPropagation()}
243
243
  />
244
244
  ) : (
@@ -246,18 +246,18 @@ export function FolderTree({
246
246
  )}
247
247
 
248
248
  {count !== undefined && !editingId && (
249
- <span className="text-xs text-gray-400 tabular-nums">{count}</span>
249
+ <span className="text-muted-foreground text-xs tabular-nums">{count}</span>
250
250
  )}
251
251
 
252
252
  <button
253
253
  type="button"
254
- className="rounded p-0.5 opacity-0 transition-all group-hover:opacity-100 hover:bg-gray-200"
254
+ className="hover:bg-muted rounded p-0.5 opacity-0 transition-all group-hover:opacity-100"
255
255
  onClick={(e) => {
256
256
  e.stopPropagation()
257
257
  setContextMenu({ id: folder.id, x: e.clientX, y: e.clientY })
258
258
  }}
259
259
  >
260
- <MoreHorizontal className="h-3.5 w-3.5 text-gray-500" />
260
+ <MoreHorizontal className="text-muted-foreground h-3.5 w-3.5" />
261
261
  </button>
262
262
  </div>
263
263
 
@@ -269,7 +269,7 @@ export function FolderTree({
269
269
  className="flex items-center gap-1 px-2 py-1"
270
270
  style={{ paddingLeft: `${24 + (depth + 1) * 16}px` }}
271
271
  >
272
- <FolderIcon className="h-4 w-4 shrink-0 text-gray-400" />
272
+ <FolderIcon className="text-muted-foreground h-4 w-4 shrink-0" />
273
273
  <input
274
274
  ref={newFolderInputRef}
275
275
  type="text"
@@ -284,7 +284,7 @@ export function FolderTree({
284
284
  }
285
285
  }}
286
286
  placeholder="Folder name..."
287
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
287
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
288
288
  />
289
289
  </div>
290
290
  )}
@@ -297,7 +297,7 @@ export function FolderTree({
297
297
  if (loading) {
298
298
  return (
299
299
  <div className="flex items-center justify-center py-8">
300
- <Loader2 className="h-5 w-5 animate-spin text-gray-400" />
300
+ <Loader2 className="text-muted-foreground h-5 w-5 animate-spin" />
301
301
  </div>
302
302
  )
303
303
  }
@@ -309,8 +309,8 @@ export function FolderTree({
309
309
  type="button"
310
310
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
311
311
  isSelected({ type: 'smart', smart: 'all' })
312
- ? 'bg-blue-50 font-medium text-blue-700'
313
- : 'text-gray-700 hover:bg-gray-100'
312
+ ? 'bg-primary/10 text-primary font-medium'
313
+ : 'text-foreground hover:bg-muted'
314
314
  }`}
315
315
  onClick={() => onSelect({ type: 'smart', smart: 'all' })}
316
316
  onDragOver={(e) => handleDragOver(e, null)}
@@ -320,7 +320,7 @@ export function FolderTree({
320
320
  <LayoutGrid className="h-4 w-4 shrink-0" />
321
321
  <span className="flex-1 text-left">All</span>
322
322
  {totalCount !== undefined && (
323
- <span className="text-xs text-gray-400 tabular-nums">{totalCount}</span>
323
+ <span className="text-muted-foreground text-xs tabular-nums">{totalCount}</span>
324
324
  )}
325
325
  </button>
326
326
 
@@ -328,15 +328,15 @@ export function FolderTree({
328
328
  type="button"
329
329
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
330
330
  isSelected({ type: 'smart', smart: 'recent' })
331
- ? 'bg-blue-50 font-medium text-blue-700'
332
- : 'text-gray-700 hover:bg-gray-100'
331
+ ? 'bg-primary/10 text-primary font-medium'
332
+ : 'text-foreground hover:bg-muted'
333
333
  }`}
334
334
  onClick={() => onSelect({ type: 'smart', smart: 'recent' })}
335
335
  >
336
336
  <Clock className="h-4 w-4 shrink-0" />
337
337
  <span className="flex-1 text-left">Recent</span>
338
338
  {recentCount !== undefined && (
339
- <span className="text-xs text-gray-400 tabular-nums">{recentCount}</span>
339
+ <span className="text-muted-foreground text-xs tabular-nums">{recentCount}</span>
340
340
  )}
341
341
  </button>
342
342
 
@@ -344,27 +344,27 @@ export function FolderTree({
344
344
  type="button"
345
345
  className={`flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors ${
346
346
  isSelected({ type: 'smart', smart: 'uncategorized' })
347
- ? 'bg-blue-50 font-medium text-blue-700'
348
- : 'text-gray-700 hover:bg-gray-100'
347
+ ? 'bg-primary/10 text-primary font-medium'
348
+ : 'text-foreground hover:bg-muted'
349
349
  }`}
350
350
  onClick={() => onSelect({ type: 'smart', smart: 'uncategorized' })}
351
351
  >
352
352
  <Inbox className="h-4 w-4 shrink-0" />
353
353
  <span className="flex-1 text-left">Uncategorized</span>
354
354
  {uncategorizedCount !== undefined && (
355
- <span className="text-xs text-gray-400 tabular-nums">{uncategorizedCount}</span>
355
+ <span className="text-muted-foreground text-xs tabular-nums">{uncategorizedCount}</span>
356
356
  )}
357
357
  </button>
358
358
  </div>
359
359
 
360
- <div className="my-1 border-t border-gray-200" />
360
+ <div className="border-border my-1 border-t" />
361
361
 
362
362
  <div className="flex-1 space-y-0.5 overflow-y-auto px-1 py-1">
363
363
  {folders.map((folder) => renderFolder(folder, 0))}
364
364
 
365
365
  {creatingIn === null && (
366
366
  <div className="flex items-center gap-1 px-2 py-1">
367
- <FolderIcon className="ml-5 h-4 w-4 shrink-0 text-gray-400" />
367
+ <FolderIcon className="text-muted-foreground ml-5 h-4 w-4 shrink-0" />
368
368
  <input
369
369
  ref={newFolderInputRef}
370
370
  type="text"
@@ -379,20 +379,20 @@ export function FolderTree({
379
379
  }
380
380
  }}
381
381
  placeholder="Folder name..."
382
- className="min-w-0 flex-1 rounded border border-blue-300 px-1 py-0 text-sm focus:ring-1 focus:ring-blue-500 focus:outline-none"
382
+ className="border-primary/50 focus:ring-ring min-w-0 flex-1 rounded border px-1 py-0 text-sm focus:ring-1 focus:outline-none"
383
383
  />
384
384
  </div>
385
385
  )}
386
386
  </div>
387
387
 
388
- <div className="border-t border-gray-200 p-2">
388
+ <div className="border-border border-t p-2">
389
389
  <button
390
390
  type="button"
391
391
  onClick={() => {
392
392
  setCreatingIn(null)
393
393
  setNewFolderName('')
394
394
  }}
395
- className="flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-100"
395
+ className="text-muted-foreground hover:bg-muted flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors"
396
396
  >
397
397
  <Plus className="h-4 w-4" />
398
398
  New Folder
@@ -401,12 +401,12 @@ export function FolderTree({
401
401
 
402
402
  {contextMenu && (
403
403
  <div
404
- className="fixed z-50 min-w-[160px] rounded-lg border border-gray-200 bg-white py-1 shadow-lg"
404
+ className="border-border bg-card fixed z-50 min-w-[160px] rounded-lg border py-1 shadow-lg"
405
405
  style={{ left: contextMenu.x, top: contextMenu.y }}
406
406
  >
407
407
  <button
408
408
  type="button"
409
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100"
409
+ className="text-foreground hover:bg-muted flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
410
410
  onClick={() => {
411
411
  const folder = findFolder(folders, contextMenu.id)
412
412
  if (folder) {
@@ -421,7 +421,7 @@ export function FolderTree({
421
421
  </button>
422
422
  <button
423
423
  type="button"
424
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-gray-700 transition-colors hover:bg-gray-100"
424
+ className="text-foreground hover:bg-muted flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
425
425
  onClick={() => {
426
426
  setCreatingIn(contextMenu.id)
427
427
  setNewFolderName('')
@@ -432,10 +432,10 @@ export function FolderTree({
432
432
  <FolderPlus className="h-3.5 w-3.5" />
433
433
  New Subfolder
434
434
  </button>
435
- <div className="my-1 border-t border-gray-200" />
435
+ <div className="border-border my-1 border-t" />
436
436
  <button
437
437
  type="button"
438
- className="flex w-full items-center gap-2 px-3 py-1.5 text-sm text-red-600 transition-colors hover:bg-red-50"
438
+ className="text-destructive hover:bg-destructive/10 flex w-full items-center gap-2 px-3 py-1.5 text-sm transition-colors"
439
439
  onClick={() => {
440
440
  handleDelete(contextMenu.id)
441
441
  setContextMenu(null)
@@ -256,7 +256,7 @@ export function NotificationBell({
256
256
  <BellIcon />
257
257
  {unread > 0 && (
258
258
  <span
259
- className="absolute -top-0.5 -right-0.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-red-600 px-1 text-[10px] font-semibold text-white"
259
+ className="absolute -top-0.5 -right-0.5 inline-flex h-4 min-w-4 items-center justify-center rounded-full bg-red-600 px-1 text-[10px] font-medium text-white"
260
260
  data-testid="bell-badge"
261
261
  >
262
262
  {unread > 99 ? '99+' : unread}
@@ -270,7 +270,7 @@ export function NotificationBell({
270
270
  data-testid="bell-dropdown"
271
271
  >
272
272
  <header className="flex items-center justify-between border-b border-gray-100 px-3 py-2">
273
- <span className="text-sm font-semibold text-gray-900">Notifications</span>
273
+ <span className="text-sm font-medium text-gray-900">Notifications</span>
274
274
  <button
275
275
  type="button"
276
276
  className="text-xs text-gray-600 hover:text-gray-900 disabled:opacity-50"
@@ -125,7 +125,7 @@ function Chip({ name, color, avatarUrl }: { name: string; color: string; avatarU
125
125
  ) : (
126
126
  <span
127
127
  aria-hidden="true"
128
- className="flex h-4 w-4 items-center justify-center rounded-full text-[8px] font-semibold text-white"
128
+ className="flex h-4 w-4 items-center justify-center rounded-full text-[8px] font-medium text-white"
129
129
  style={{ backgroundColor: color }}
130
130
  >
131
131
  {initials}
@@ -242,7 +242,7 @@ export function SEOConfigPanel() {
242
242
  <section className="rounded-lg border border-gray-200 bg-white">
243
243
  <header className="flex items-center gap-2 border-b border-gray-200 px-4 py-3">
244
244
  <Globe className="h-4 w-4 text-blue-600" />
245
- <h3 className="text-sm font-semibold text-gray-900">Site-wide defaults</h3>
245
+ <h3 className="text-sm font-medium text-gray-900">Site-wide defaults</h3>
246
246
  </header>
247
247
  <div className="grid grid-cols-1 gap-4 p-4 md:grid-cols-2">
248
248
  <Field
@@ -333,7 +333,7 @@ export function SEOConfigPanel() {
333
333
  <section className="rounded-lg border border-gray-200 bg-white">
334
334
  <header className="flex items-center gap-2 border-b border-gray-200 px-4 py-3">
335
335
  <FileText className="h-4 w-4 text-blue-600" />
336
- <h3 className="text-sm font-semibold text-gray-900">Per-collection defaults</h3>
336
+ <h3 className="text-sm font-medium text-gray-900">Per-collection defaults</h3>
337
337
  <span className="text-xs text-gray-500">
338
338
  — shown placeholders are the static defaults
339
339
  </span>
@@ -346,7 +346,7 @@ export function SEOConfigPanel() {
346
346
  <div key={col.slug} className="p-4">
347
347
  <div className="mb-3 flex items-baseline justify-between gap-4">
348
348
  <div>
349
- <h4 className="text-sm font-semibold text-gray-900">{col.label}</h4>
349
+ <h4 className="text-sm font-medium text-gray-900">{col.label}</h4>
350
350
  <p className="text-xs text-gray-500">
351
351
  <code className="rounded bg-gray-100 px-1 py-0.5">{col.slug}</code>
352
352
  {col.urlPrefix !== undefined && (
@@ -414,7 +414,7 @@ function ScoreRing({ score }: { score: number }) {
414
414
  className="transition-all duration-500"
415
415
  />
416
416
  </svg>
417
- <span className="absolute text-sm font-bold" style={{ color }}>
417
+ <span className="absolute text-sm font-medium" style={{ color }}>
418
418
  {score}
419
419
  </span>
420
420
  </div>
@@ -624,7 +624,7 @@ export function SEOPanel({
624
624
  <div className="rounded-lg border border-[var(--border)] bg-[var(--card)]">
625
625
  {/* Header */}
626
626
  <div className="flex items-center justify-between border-b border-[var(--border)] px-4 py-3">
627
- <h3 className="flex items-center gap-2 text-sm font-semibold text-[var(--foreground)]">
627
+ <h3 className="flex items-center gap-2 text-sm font-medium text-[var(--foreground)]">
628
628
  <Search className="h-4 w-4" />
629
629
  SEO
630
630
  </h3>
@@ -692,24 +692,26 @@ export function SEOPanel({
692
692
  <div className="grid grid-cols-2 gap-3">
693
693
  <div className="rounded-lg bg-[var(--muted)] p-2.5">
694
694
  <p className="text-xs text-[var(--muted-foreground)]">Flesch Score</p>
695
- <p className={`text-lg font-bold ${fleschColor}`}>{readability.fleschScore}</p>
695
+ <p className={`text-lg font-medium ${fleschColor}`}>{readability.fleschScore}</p>
696
696
  <p className={`text-[10px] ${fleschColor}`}>{fleschLabel}</p>
697
697
  </div>
698
698
  <div className="rounded-lg bg-[var(--muted)] p-2.5">
699
699
  <p className="text-xs text-[var(--muted-foreground)]">Word Count</p>
700
- <p className="text-lg font-bold text-[var(--foreground)]">{readability.wordCount}</p>
700
+ <p className="text-lg font-medium text-[var(--foreground)]">
701
+ {readability.wordCount}
702
+ </p>
701
703
  <p className="text-[10px] text-[var(--muted-foreground)]">words</p>
702
704
  </div>
703
705
  <div className="rounded-lg bg-[var(--muted)] p-2.5">
704
706
  <p className="text-xs text-[var(--muted-foreground)]">Avg. Sentence</p>
705
- <p className="text-lg font-bold text-[var(--foreground)]">
707
+ <p className="text-lg font-medium text-[var(--foreground)]">
706
708
  {readability.avgSentenceLength.toFixed(1)}
707
709
  </p>
708
710
  <p className="text-[10px] text-[var(--muted-foreground)]">words/sentence</p>
709
711
  </div>
710
712
  <div className="rounded-lg bg-[var(--muted)] p-2.5">
711
713
  <p className="text-xs text-[var(--muted-foreground)]">Reading Time</p>
712
- <p className="text-lg font-bold text-[var(--foreground)]">
714
+ <p className="text-lg font-medium text-[var(--foreground)]">
713
715
  {readability.readingTime}
714
716
  </p>
715
717
  <p className="text-[10px] text-[var(--muted-foreground)]">min</p>
@@ -27,7 +27,7 @@ function ScoreBadge({ score }: { score: number }) {
27
27
  const bg = score >= 80 ? 'bg-green-50' : score >= 60 ? 'bg-amber-50' : 'bg-red-50'
28
28
  return (
29
29
  <span
30
- className={`inline-flex h-9 w-9 items-center justify-center rounded-full text-sm font-semibold ${color} ${bg}`}
30
+ className={`inline-flex h-9 w-9 items-center justify-center rounded-full text-sm font-medium ${color} ${bg}`}
31
31
  >
32
32
  {score}
33
33
  </span>
@@ -57,7 +57,7 @@ export function SEOPerformance({ onNavigate }: SEOPerformanceProps) {
57
57
  <div className="flex items-center justify-between border-b border-gray-200 p-4">
58
58
  <div className="flex items-center gap-2">
59
59
  <Search className="h-4 w-4 text-gray-500" />
60
- <h2 className="text-sm font-semibold text-gray-900">SEO Performance</h2>
60
+ <h2 className="text-sm font-medium text-gray-900">SEO Performance</h2>
61
61
  </div>
62
62
  {totalIssues > 0 && (
63
63
  <span className="text-xs text-gray-500">
@@ -120,7 +120,7 @@ export function SEOPerformance({ onNavigate }: SEOPerformanceProps) {
120
120
  <FileWarning className="h-4 w-4 text-red-400" />
121
121
  <span className="text-sm text-gray-700">Missing meta descriptions</span>
122
122
  </div>
123
- <span className="text-sm font-semibold text-gray-900">
123
+ <span className="text-sm font-medium text-gray-900">
124
124
  {issues.missingMetaDescriptions}
125
125
  </span>
126
126
  </div>
@@ -129,7 +129,7 @@ export function SEOPerformance({ onNavigate }: SEOPerformanceProps) {
129
129
  <LinkIcon className="h-4 w-4 text-red-400" />
130
130
  <span className="text-sm text-gray-700">Broken internal links</span>
131
131
  </div>
132
- <span className="text-sm font-semibold text-gray-900">
132
+ <span className="text-sm font-medium text-gray-900">
133
133
  {issues.brokenInternalLinks}
134
134
  </span>
135
135
  </div>
@@ -138,7 +138,7 @@ export function SEOPerformance({ onNavigate }: SEOPerformanceProps) {
138
138
  <ImageOff className="h-4 w-4 text-red-400" />
139
139
  <span className="text-sm text-gray-700">Missing alt text</span>
140
140
  </div>
141
- <span className="text-sm font-semibold text-gray-900">{issues.missingAltText}</span>
141
+ <span className="text-sm font-medium text-gray-900">{issues.missingAltText}</span>
142
142
  </div>
143
143
  </div>
144
144
  {totalIssues > 0 && (
@@ -130,7 +130,7 @@ export function EntriesTable({
130
130
  />
131
131
  )}
132
132
  <span
133
- className={`text-foreground truncate ${entry.unread ? 'font-semibold' : 'font-medium'}`}
133
+ className={`text-foreground truncate ${entry.unread ? 'font-medium' : 'font-medium'}`}
134
134
  >
135
135
  {name}
136
136
  </span>
@@ -62,7 +62,7 @@ export function CardTitle({
62
62
  }: HTMLAttributes<HTMLHeadingElement>) {
63
63
  return (
64
64
  <h3
65
- className={`text-lg leading-tight font-semibold tracking-tight text-[var(--card-foreground)] ${className}`}
65
+ className={`text-lg leading-tight font-medium tracking-tight text-[var(--card-foreground)] ${className}`}
66
66
  {...rest}
67
67
  >
68
68
  {children}
@@ -13,7 +13,7 @@ export function EmptyState({ icon, title, description, actionLabel, onAction }:
13
13
  return (
14
14
  <div className="flex flex-col items-center justify-center py-16 text-center">
15
15
  {icon && <div className="mb-4 text-[var(--muted-foreground)]">{icon}</div>}
16
- <h3 className="text-lg font-semibold">{title}</h3>
16
+ <h3 className="text-lg font-medium">{title}</h3>
17
17
  {description && (
18
18
  <p className="mt-1 max-w-sm text-sm text-[var(--muted-foreground)]">{description}</p>
19
19
  )}
@@ -390,7 +390,7 @@ function renderNavTree(items: NavItem[], ctx: NavRenderContext): ReactNode {
390
390
  </div>
391
391
  ) : (
392
392
  <div key={`g-${item.group}`} className="px-3 pt-4 pb-1">
393
- <span className="text-sidebar-foreground/55 text-[10px] font-semibold tracking-wider uppercase">
393
+ <span className="text-sidebar-foreground/55 text-[10px] font-medium tracking-wider uppercase">
394
394
  {item.group}
395
395
  </span>
396
396
  </div>
@@ -79,7 +79,7 @@ export function PageContainer({
79
79
  {(title || description) && (
80
80
  <div className="min-w-0">
81
81
  {title && (
82
- <h1 className="text-foreground truncate text-2xl font-semibold tracking-tight">
82
+ <h1 className="text-foreground truncate text-2xl font-medium tracking-tight">
83
83
  {title}
84
84
  </h1>
85
85
  )}
@@ -284,7 +284,7 @@ export function CollectionList({ collectionSlug, config, onNavigate }: Collectio
284
284
  <div className="mb-4 flex flex-wrap items-center justify-between gap-3">
285
285
  <div>
286
286
  <h1
287
- className="text-xl font-semibold sm:text-2xl"
287
+ className="text-xl font-medium sm:text-2xl"
288
288
  style={{ color: 'var(--actuate-text, #111827)' }}
289
289
  >
290
290
  {labels.plural}
@@ -584,7 +584,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
584
584
  consistent across navigation. The on-page secondary action row
585
585
  below covers the same creation paths plus authoring shortcuts. */}
586
586
  <div className="flex flex-col gap-1 sm:gap-0.5">
587
- <h1 className="text-foreground text-xl font-semibold tracking-tight sm:text-2xl">
587
+ <h1 className="text-foreground text-xl font-medium tracking-tight sm:text-2xl">
588
588
  {greeting}, {userName} <span aria-hidden>👋</span>
589
589
  </h1>
590
590
  <p className="text-muted-foreground text-sm">
@@ -623,7 +623,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
623
623
  <card.icon className={`h-4 w-4 ${card.iconColor}`} />
624
624
  </div>
625
625
  <div className="flex items-baseline gap-1">
626
- <span className="text-foreground text-2xl leading-none font-semibold tracking-tight">
626
+ <span className="text-foreground text-2xl leading-none font-medium tracking-tight">
627
627
  {card.value}
628
628
  </span>
629
629
  {card.unit && (
@@ -664,7 +664,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
664
664
  <section className="bg-card border-border overflow-hidden rounded-xl border shadow-sm">
665
665
  <header className="border-border flex items-center justify-between border-b px-4 py-3">
666
666
  <div className="min-w-0">
667
- <h2 className="text-foreground text-sm font-semibold">Recent Activity</h2>
667
+ <h2 className="text-foreground text-sm font-medium">Recent Activity</h2>
668
668
  <p className="text-muted-foreground mt-0.5 text-xs">Last 7 days across all content</p>
669
669
  </div>
670
670
  {(stats?.recentDocuments?.length ?? 0) > 8 && (
@@ -693,7 +693,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
693
693
  >
694
694
  <div className="flex min-w-0 items-start gap-3">
695
695
  <div
696
- className="mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-[11px] font-bold text-white"
696
+ className="mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-full text-[11px] font-medium text-white"
697
697
  style={{ background: it.avatar.color }}
698
698
  aria-hidden
699
699
  >
@@ -701,7 +701,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
701
701
  </div>
702
702
  <div className="min-w-0 flex-1">
703
703
  <p className="text-foreground truncate text-sm leading-snug">
704
- <span className="font-semibold">
704
+ <span className="font-medium">
705
705
  &ldquo;{it.title || 'Untitled'}&rdquo;
706
706
  </span>{' '}
707
707
  <span className="text-muted-foreground">— {it.typeLabel}</span>
@@ -731,7 +731,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
731
731
  <section className="bg-card border-border overflow-hidden rounded-xl border shadow-sm">
732
732
  <header className="border-border flex items-center justify-between border-b px-4 py-3">
733
733
  <div className="min-w-0">
734
- <h2 className="text-foreground text-sm font-semibold">Publishing Queue</h2>
734
+ <h2 className="text-foreground text-sm font-medium">Publishing Queue</h2>
735
735
  <p className="text-muted-foreground mt-0.5 text-xs">
736
736
  {publishQueue.length} item{publishQueue.length === 1 ? '' : 's'} scheduled
737
737
  </p>
@@ -787,7 +787,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
787
787
  <section className="bg-card border-border overflow-hidden rounded-xl border shadow-sm">
788
788
  <header className="border-border flex items-center justify-between border-b px-4 py-3">
789
789
  <div className="min-w-0">
790
- <h2 className="text-foreground text-sm font-semibold">Content Health</h2>
790
+ <h2 className="text-foreground text-sm font-medium">Content Health</h2>
791
791
  <p className="text-muted-foreground mt-0.5 text-xs">SEO &amp; quality issues</p>
792
792
  </div>
793
793
  <button
@@ -799,7 +799,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
799
799
  </header>
800
800
  <div className="px-4 pt-3.5 pb-2.5">
801
801
  <div className="mb-1.5 flex items-baseline justify-between">
802
- <p className="text-foreground text-2xl leading-none font-semibold tracking-tight">
802
+ <p className="text-foreground text-2xl leading-none font-medium tracking-tight">
803
803
  {contentHealth.score > 0 ? contentHealth.score : '—'}
804
804
  {contentHealth.score > 0 && (
805
805
  <span className="text-muted-foreground ml-0.5 text-sm font-normal">/100</span>
@@ -861,7 +861,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
861
861
  {iss.label}
862
862
  </span>
863
863
  <span
864
- className={`shrink-0 text-sm font-semibold ${
864
+ className={`shrink-0 text-sm font-medium ${
865
865
  iss.tone === 'err'
866
866
  ? 'text-red-600 dark:text-red-400'
867
867
  : iss.tone === 'warn'
@@ -892,7 +892,7 @@ export function Dashboard({ config, session, onNavigate }: DashboardProps) {
892
892
  <section className="bg-card border-border overflow-hidden rounded-xl border shadow-sm">
893
893
  <header className="border-border flex items-center justify-between border-b px-4 py-3">
894
894
  <div className="min-w-0">
895
- <h2 className="text-foreground text-sm font-semibold">Delivery API</h2>
895
+ <h2 className="text-foreground text-sm font-medium">Delivery API</h2>
896
896
  <p className="text-muted-foreground mt-0.5 text-xs">
897
897
  Headless content delivery · last 24 hours
898
898
  </p>
@@ -1030,7 +1030,7 @@ function EmptyState({
1030
1030
  className={`flex flex-col items-center justify-center gap-1.5 text-center ${compact ? 'px-4 py-6' : 'px-6 py-10'}`}
1031
1031
  >
1032
1032
  <Icon className="text-muted-foreground/50 mb-1 h-7 w-7" aria-hidden />
1033
- <p className="text-foreground text-sm font-semibold">{title}</p>
1033
+ <p className="text-foreground text-sm font-medium">{title}</p>
1034
1034
  <p className="text-muted-foreground max-w-xs text-xs">{subtitle}</p>
1035
1035
  </div>
1036
1036
  )
@@ -1065,7 +1065,7 @@ function DeliveryTile({
1065
1065
  <Icon className="h-3.5 w-3.5" aria-hidden />
1066
1066
  <span className="text-[11px] font-medium">{label}</span>
1067
1067
  </div>
1068
- <p className="text-foreground text-xl leading-tight font-semibold tracking-tight">{value}</p>
1068
+ <p className="text-foreground text-xl leading-tight font-medium tracking-tight">{value}</p>
1069
1069
  {sub && (
1070
1070
  <p className={`mt-0.5 inline-flex items-center gap-1 text-[11px] ${subTone}`}>
1071
1071
  {SubIcon && <SubIcon className="h-3 w-3 shrink-0" aria-hidden />}
@@ -308,7 +308,7 @@ export function DocumentEdit({
308
308
  <div className="space-y-4">
309
309
  <div className="flex items-center justify-between">
310
310
  <div className="flex items-center gap-3">
311
- <h1 className="text-2xl font-bold">{displayTitle}</h1>
311
+ <h1 className="text-2xl font-medium">{displayTitle}</h1>
312
312
  <span
313
313
  className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium ${statusColor}`}
314
314
  >
@@ -384,7 +384,7 @@ export function DocumentEdit({
384
384
 
385
385
  <div className="space-y-6">
386
386
  <div className="rounded-lg border border-[var(--border)] bg-[var(--card)] p-4">
387
- <h3 className="mb-4 font-semibold">Status</h3>
387
+ <h3 className="mb-4 font-medium">Status</h3>
388
388
  <div className="space-y-3">
389
389
  {!isNew && docStatus === 'DRAFT' && (
390
390
  <Button
@@ -436,7 +436,7 @@ export function DocumentEdit({
436
436
 
437
437
  {sidebarFields.length > 0 && (
438
438
  <div className="rounded-lg border border-[var(--border)] bg-[var(--card)] p-4">
439
- <h3 className="mb-4 font-semibold">Metadata</h3>
439
+ <h3 className="mb-4 font-medium">Metadata</h3>
440
440
  {sidebarFields.map((field: any) => (
441
441
  <div key={field.name} className="mb-4">
442
442
  <FieldRenderer
@@ -460,7 +460,7 @@ export function DocumentEdit({
460
460
 
461
461
  {hasLayout && (
462
462
  <div className="rounded-lg border border-[var(--border)] bg-[var(--card)] p-4">
463
- <h3 className="mb-1 font-semibold">Layout</h3>
463
+ <h3 className="mb-1 font-medium">Layout</h3>
464
464
  <p className="mb-4 text-xs text-[var(--muted-foreground)]">
465
465
  Assign header/footer variants. Child pages inherit from ancestors.
466
466
  </p>
@@ -48,7 +48,7 @@ export function ForgotPassword({ onNavigate }: ForgotPasswordProps) {
48
48
  <div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-xl bg-blue-600">
49
49
  <Shield className="h-7 w-7 text-white" />
50
50
  </div>
51
- <h1 className="text-2xl font-bold text-gray-900">Reset Password</h1>
51
+ <h1 className="text-2xl font-medium text-gray-900">Reset Password</h1>
52
52
  <p className="mt-2 text-gray-600">
53
53
  {sent
54
54
  ? 'Check your inbox for a reset link'
@@ -191,9 +191,7 @@ export function FormEditor({ formId, onNavigate }: FormEditorProps) {
191
191
  <ArrowLeft className="h-5 w-5 text-gray-600" />
192
192
  </button>
193
193
  <div className="flex-1">
194
- <h1 className="text-xl font-semibold text-gray-900">
195
- {isNew ? 'New Form' : 'Edit Form'}
196
- </h1>
194
+ <h1 className="text-xl font-medium text-gray-900">{isNew ? 'New Form' : 'Edit Form'}</h1>
197
195
  </div>
198
196
  <button
199
197
  onClick={handleSave}
@@ -393,7 +393,7 @@ export function Login({
393
393
  ) : (
394
394
  <ActuateBrandLogo className="mx-auto mb-4 h-14 w-auto" />
395
395
  ))}
396
- <h1 className="text-2xl font-bold text-gray-900">{brandName}</h1>
396
+ <h1 className="text-2xl font-medium text-gray-900">{brandName}</h1>
397
397
  <p className="mt-2 text-gray-600">{brandTagline}</p>
398
398
  </div>
399
399
 
@@ -403,7 +403,7 @@ export function Login({
403
403
  className="space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm"
404
404
  >
405
405
  <div>
406
- <h2 className="text-lg font-semibold text-gray-900">Two-factor authentication</h2>
406
+ <h2 className="text-lg font-medium text-gray-900">Two-factor authentication</h2>
407
407
  <p className="mt-1 text-sm text-gray-600">
408
408
  {useBackupCode
409
409
  ? 'Enter one of your one-time backup codes.'