@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.
- package/CHANGELOG.md +32 -0
- package/dist/AdminRoot.js +2 -2
- package/dist/AdminRoot.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/CoauthorResultPopover.js +1 -1
- package/dist/components/CoauthorResultPopover.js.map +1 -1
- package/dist/components/CommentSidePanel.js +1 -1
- package/dist/components/CommentSidePanel.js.map +1 -1
- package/dist/components/ContentOverviewChart.js +1 -1
- package/dist/components/ContentOverviewChart.js.map +1 -1
- package/dist/components/FolderTree.js +19 -19
- package/dist/components/FolderTree.js.map +1 -1
- package/dist/components/NotificationBell.js +1 -1
- package/dist/components/NotificationBell.js.map +1 -1
- package/dist/components/PresenceChips.js +1 -1
- package/dist/components/PresenceChips.js.map +1 -1
- package/dist/components/SEOConfigPanel.js +2 -2
- package/dist/components/SEOConfigPanel.js.map +1 -1
- package/dist/components/SEOPanel.d.ts.map +1 -1
- package/dist/components/SEOPanel.js +2 -2
- package/dist/components/SEOPanel.js.map +1 -1
- package/dist/components/SEOPerformance.js +2 -2
- package/dist/components/SEOPerformance.js.map +1 -1
- package/dist/components/forms/EntriesTable.js +1 -1
- package/dist/components/forms/EntriesTable.js.map +1 -1
- package/dist/components/ui/Card.js +1 -1
- package/dist/components/ui/Card.js.map +1 -1
- package/dist/components/ui/EmptyState.js +1 -1
- package/dist/components/ui/EmptyState.js.map +1 -1
- package/dist/layout/Sidebar.js +1 -1
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/layout/primitives/PageContainer.js +1 -1
- package/dist/layout/primitives/PageContainer.js.map +1 -1
- package/dist/views/CollectionList.js +1 -1
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.js +8 -8
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/DocumentEdit.js +1 -1
- package/dist/views/DocumentEdit.js.map +1 -1
- package/dist/views/ForgotPassword.js +1 -1
- package/dist/views/ForgotPassword.js.map +1 -1
- package/dist/views/FormEditor.d.ts.map +1 -1
- package/dist/views/FormEditor.js +1 -1
- package/dist/views/FormEditor.js.map +1 -1
- package/dist/views/Login.js +1 -1
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +16 -16
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/PageEditor.js +1 -1
- package/dist/views/PageEditor.js.map +1 -1
- package/dist/views/Pages/PagesListView.d.ts.map +1 -1
- package/dist/views/Pages/PagesListView.js +5 -5
- package/dist/views/Pages/PagesListView.js.map +1 -1
- package/dist/views/Pages.js +1 -1
- package/dist/views/Pages.js.map +1 -1
- package/dist/views/Posts/PostsListView.d.ts.map +1 -1
- package/dist/views/Posts/PostsListView.js +4 -4
- package/dist/views/Posts/PostsListView.js.map +1 -1
- package/dist/views/Redirects.d.ts.map +1 -1
- package/dist/views/Redirects.js +7 -7
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/ResetPassword.js +2 -2
- package/dist/views/ResetPassword.js.map +1 -1
- package/dist/views/ScriptTagEditor.js +4 -4
- package/dist/views/ScriptTagEditor.js.map +1 -1
- package/dist/views/ScriptTags.d.ts.map +1 -1
- package/dist/views/ScriptTags.js +5 -5
- package/dist/views/ScriptTags.js.map +1 -1
- package/dist/views/SetupWizard.js +2 -2
- package/dist/views/SetupWizard.js.map +1 -1
- package/dist/views/page-editor/SectionInspector.js +2 -2
- package/dist/views/page-editor/SectionInspector.js.map +1 -1
- package/dist/views/post-editor/PostHeader.d.ts.map +1 -1
- package/dist/views/post-editor/PostHeader.js +2 -2
- package/dist/views/post-editor/PostHeader.js.map +1 -1
- package/dist/views/post-editor/PostHeaderPanel.js +1 -1
- package/dist/views/post-editor/PostHeaderPanel.js.map +1 -1
- package/package.json +1 -1
- package/src/AdminRoot.tsx +2 -2
- package/src/components/CoauthorResultPopover.tsx +1 -1
- package/src/components/CommentSidePanel.tsx +1 -1
- package/src/components/ContentOverviewChart.tsx +1 -1
- package/src/components/FolderTree.tsx +32 -32
- package/src/components/NotificationBell.tsx +2 -2
- package/src/components/PresenceChips.tsx +1 -1
- package/src/components/SEOConfigPanel.tsx +3 -3
- package/src/components/SEOPanel.tsx +8 -6
- package/src/components/SEOPerformance.tsx +5 -5
- package/src/components/forms/EntriesTable.tsx +1 -1
- package/src/components/ui/Card.tsx +1 -1
- package/src/components/ui/EmptyState.tsx +1 -1
- package/src/layout/Sidebar.tsx +1 -1
- package/src/layout/primitives/PageContainer.tsx +1 -1
- package/src/views/CollectionList.tsx +1 -1
- package/src/views/Dashboard.tsx +12 -12
- package/src/views/DocumentEdit.tsx +4 -4
- package/src/views/ForgotPassword.tsx +1 -1
- package/src/views/FormEditor.tsx +1 -3
- package/src/views/Login.tsx +2 -2
- package/src/views/MediaBrowser.tsx +126 -120
- package/src/views/PageEditor.tsx +2 -2
- package/src/views/Pages/PagesListView.tsx +126 -118
- package/src/views/Pages.tsx +1 -1
- package/src/views/Posts/PostsListView.tsx +115 -111
- package/src/views/Redirects.tsx +48 -44
- package/src/views/ResetPassword.tsx +2 -2
- package/src/views/ScriptTagEditor.tsx +40 -40
- package/src/views/ScriptTags.tsx +34 -30
- package/src/views/SetupWizard.tsx +2 -2
- package/src/views/page-editor/SectionInspector.tsx +4 -4
- package/src/views/post-editor/PostHeader.tsx +2 -4
- 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-
|
|
194
|
+
? 'bg-primary/10 text-primary font-medium'
|
|
195
195
|
: isDragOver
|
|
196
|
-
? 'bg-
|
|
197
|
-
: 'text-
|
|
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
|
|
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
|
|
225
|
+
<FolderOpen className="text-primary h-4 w-4 shrink-0" />
|
|
226
226
|
) : (
|
|
227
|
-
<FolderIcon className="h-4 w-4 shrink-0
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
313
|
-
: 'text-
|
|
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-
|
|
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-
|
|
332
|
-
: 'text-
|
|
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-
|
|
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-
|
|
348
|
-
: 'text-
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
)}
|
package/src/layout/Sidebar.tsx
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
287
|
+
className="text-xl font-medium sm:text-2xl"
|
|
288
288
|
style={{ color: 'var(--actuate-text, #111827)' }}
|
|
289
289
|
>
|
|
290
290
|
{labels.plural}
|
package/src/views/Dashboard.tsx
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
704
|
+
<span className="font-medium">
|
|
705
705
|
“{it.title || 'Untitled'}”
|
|
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-
|
|
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-
|
|
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 & 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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'
|
package/src/views/FormEditor.tsx
CHANGED
|
@@ -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-
|
|
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}
|
package/src/views/Login.tsx
CHANGED
|
@@ -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-
|
|
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-
|
|
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.'
|