@prenta/admin 1.8.0 → 1.9.1
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 +17 -0
- package/design-system/tokens.css +38 -6
- package/design-system/tokens.json +36 -6
- package/design-system/tokens.scss +6 -6
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +14 -4
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/components/author-avatar.test.js +18 -1
- package/dist/__tests__/components/author-avatar.test.js.map +1 -1
- package/dist/__tests__/lib/logout-redirect.test.d.ts +2 -0
- package/dist/__tests__/lib/logout-redirect.test.d.ts.map +1 -0
- package/dist/__tests__/lib/logout-redirect.test.js +29 -0
- package/dist/__tests__/lib/logout-redirect.test.js.map +1 -0
- package/dist/__tests__/lib/pages-service.test.js +21 -6
- package/dist/__tests__/lib/pages-service.test.js.map +1 -1
- package/dist/__tests__/lib/utils.test.js +2 -1
- package/dist/__tests__/lib/utils.test.js.map +1 -1
- package/dist/__tests__/styles/tokens-drift.test.js +32 -0
- package/dist/__tests__/styles/tokens-drift.test.js.map +1 -1
- package/dist/__tests__/views/login-root.render.test.js +6 -0
- package/dist/__tests__/views/login-root.render.test.js.map +1 -1
- package/dist/__tests__/views/security-settings.render.test.js +1 -0
- package/dist/__tests__/views/security-settings.render.test.js.map +1 -1
- package/dist/__tests__/views/trash.render.test.js +33 -0
- package/dist/__tests__/views/trash.render.test.js.map +1 -1
- package/dist/__tests__/views/user-detail-drawer.render.test.js +1 -0
- package/dist/__tests__/views/user-detail-drawer.render.test.js.map +1 -1
- package/dist/__tests__/views/users-selected-deeplink.render.test.js +1 -0
- package/dist/__tests__/views/users-selected-deeplink.render.test.js.map +1 -1
- package/dist/components/LivePreview.d.ts.map +1 -1
- package/dist/components/LivePreview.js +2 -1
- package/dist/components/LivePreview.js.map +1 -1
- package/dist/components/PresenceIndicator.d.ts.map +1 -1
- package/dist/components/PresenceIndicator.js +3 -1
- package/dist/components/PresenceIndicator.js.map +1 -1
- package/dist/components/ui/AuthorAvatar.d.ts +12 -0
- package/dist/components/ui/AuthorAvatar.d.ts.map +1 -1
- package/dist/components/ui/AuthorAvatar.js +8 -8
- package/dist/components/ui/AuthorAvatar.js.map +1 -1
- package/dist/components/ui/DataTable.d.ts.map +1 -1
- package/dist/components/ui/DataTable.js +7 -1
- package/dist/components/ui/DataTable.js.map +1 -1
- package/dist/layout/Sidebar.js +1 -1
- package/dist/lib/logout-redirect.d.ts +19 -0
- package/dist/lib/logout-redirect.d.ts.map +1 -0
- package/dist/lib/logout-redirect.js +20 -0
- package/dist/lib/logout-redirect.js.map +1 -0
- package/dist/lib/pages-service.d.ts.map +1 -1
- package/dist/lib/pages-service.js +2 -16
- package/dist/lib/pages-service.js.map +1 -1
- package/dist/lib/sentry.d.ts.map +1 -1
- package/dist/lib/sentry.js +11 -0
- package/dist/lib/sentry.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/CollectionList.d.ts.map +1 -1
- package/dist/views/CollectionList.js +6 -2
- package/dist/views/CollectionList.js.map +1 -1
- package/dist/views/Dashboard.d.ts.map +1 -1
- package/dist/views/Dashboard.js +4 -5
- package/dist/views/Dashboard.js.map +1 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +4 -2
- package/dist/views/Login.js.map +1 -1
- package/dist/views/MediaBrowser.d.ts.map +1 -1
- package/dist/views/MediaBrowser.js +6 -5
- package/dist/views/MediaBrowser.js.map +1 -1
- package/dist/views/Posts/PostsListView.d.ts.map +1 -1
- package/dist/views/Posts/PostsListView.js +6 -5
- package/dist/views/Posts/PostsListView.js.map +1 -1
- package/dist/views/Redirects.d.ts.map +1 -1
- package/dist/views/Redirects.js +2 -1
- package/dist/views/Redirects.js.map +1 -1
- package/dist/views/settings/SessionPolicyCard.d.ts.map +1 -1
- package/dist/views/settings/SessionPolicyCard.js +3 -1
- package/dist/views/settings/SessionPolicyCard.js.map +1 -1
- package/dist/views/settings/useSecuritySettings.d.ts +2 -0
- package/dist/views/settings/useSecuritySettings.d.ts.map +1 -1
- package/dist/views/settings/useSecuritySettings.js +8 -0
- package/dist/views/settings/useSecuritySettings.js.map +1 -1
- package/dist/views/users/UserDetailDrawer.d.ts.map +1 -1
- package/dist/views/users/UserDetailDrawer.js +5 -5
- package/dist/views/users/UserDetailDrawer.js.map +1 -1
- package/package.json +4 -3
- package/src/AdminRoot.tsx +13 -4
- package/src/__tests__/components/author-avatar.test.tsx +22 -1
- package/src/__tests__/lib/logout-redirect.test.ts +35 -0
- package/src/__tests__/lib/pages-service.test.ts +22 -8
- package/src/__tests__/lib/utils.test.ts +2 -1
- package/src/__tests__/styles/tokens-drift.test.ts +46 -0
- package/src/__tests__/views/login-root.render.test.tsx +7 -0
- package/src/__tests__/views/security-settings.render.test.tsx +1 -0
- package/src/__tests__/views/trash.render.test.tsx +38 -0
- package/src/__tests__/views/user-detail-drawer.render.test.tsx +1 -0
- package/src/__tests__/views/users-selected-deeplink.render.test.tsx +1 -0
- package/src/components/LivePreview.tsx +2 -1
- package/src/components/PresenceIndicator.tsx +3 -1
- package/src/components/ui/AuthorAvatar.tsx +8 -8
- package/src/components/ui/DataTable.tsx +13 -1
- package/src/layout/Sidebar.tsx +1 -1
- package/src/lib/logout-redirect.ts +33 -0
- package/src/lib/pages-service.ts +1 -15
- package/src/lib/sentry.ts +11 -0
- package/src/styles/prenta-tokens.css +38 -6
- package/src/styles/theme.css +4 -2
- package/src/views/CollectionList.tsx +8 -4
- package/src/views/Dashboard.tsx +5 -11
- package/src/views/Login.tsx +15 -1
- package/src/views/MediaBrowser.tsx +35 -12
- package/src/views/Posts/PostsListView.tsx +13 -11
- package/src/views/Redirects.tsx +8 -5
- package/src/views/settings/SessionPolicyCard.tsx +40 -0
- package/src/views/settings/useSecuritySettings.ts +10 -0
- package/src/views/users/UserDetailDrawer.tsx +31 -5
|
@@ -191,7 +191,7 @@ export function UserDetailDrawer({ userId, open, onOpenChange, onChanged }) {
|
|
|
191
191
|
}
|
|
192
192
|
}, []);
|
|
193
193
|
const u = detail.data;
|
|
194
|
-
return (_jsx(_Fragment, { children: _jsxs(Drawer, { open: open, onOpenChange: onOpenChange, width: "max-w-xl", title: u ? u.name : detail.loading ? 'Loading…' : 'User', description: u?.email, headerExtra: u ? (_jsx("span", { className: `mr-1 inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${ROLE_PILL[u.roleName] ?? ROLE_PILL.Viewer}`, children: u.roleName })) : undefined, children: [detail.loading ? (_jsxs("div", { className: "space-y-3", children: [_jsx(Skeleton, { variant: "card" }), _jsx(Skeleton, { variant: "table-row", lines: 4 })] })) : detail.error || !u ? (_jsxs("div", { className: "flex items-center gap-3 py-6", children: [_jsx(AlertTriangle, { size: 18, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: detail.error ?? 'User not found.' }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => detail.refetch(), children: "Retry" })] })) : (_jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-1 overflow-x-auto border-b", "aria-label": "User detail sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-brand focus-visible:ring-ring -mb-px shrink-0 border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsxs(Tabs.Content, { value: "overview", tabIndex: -1, className: "focus:outline-none", children: [_jsxs("div", { className: "mb-4 flex items-center gap-2", children: [_jsxs("span", { className: `inline-flex items-center gap-1.5 text-sm ${STATUS_META[u.status].text}`, children: [_jsx("span", { className: `h-2 w-2 rounded-full ${STATUS_META[u.status].dot}`, "aria-hidden": true }), STATUS_META[u.status].label] }), u.isCurrentUser && (_jsx("span", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-xs", children: "You" })), u.externalDomain && (_jsx("span", { className: "bg-warning/10 text-warning rounded px-1.5 py-0.5 text-xs", children: "External domain" }))] }), _jsxs("dl", { className: "grid grid-cols-2 gap-x-4 gap-y-4", children: [_jsx(Fact, { label: "Role", value: u.roleName }), _jsx(Fact, { label: "Status", value: STATUS_META[u.status].label }), _jsx(Fact, { label: "Last active", value: relativeTime(u.lastActiveAt) }), _jsx(Fact, { label: "Last sign-in", value: relativeTime(u.lastLoginAt) }), _jsx(Fact, { label: "Created", value: formatDate(u.createdAt) }), _jsx(Fact, { label: "Accepted invite", value: formatDate(u.acceptedInviteAt) }), _jsx(Fact, { label: "Invited by", value: u.invitedBy ? (u.invitedBy.name) : (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) }), _jsx(Fact, { label: "Email domain", value: u.email.split('@')[1] ?? '—' }), _jsx(Fact, { label: "Content owned", value: `${u.contentOwnedCount} ${u.contentOwnedCount === 1 ? 'item' : 'items'}` }), _jsx(Fact, { label: "Email verified", value: u.emailVerified ? 'Yes' : _jsx("span", { className: "text-warning", children: "No" }) }), u.authProvider && _jsx(Fact, { label: "Auth provider", value: u.authProvider }), u.oauthProviders.length > 0 && (_jsx(Fact, { label: "Connected accounts", value: u.oauthProviders.join(', ') }))] }), u.contentOwnedCount > 0 && (_jsxs("div", { className: "border-info/30 bg-info/5 mt-4 flex items-start gap-2 rounded-md border p-3", children: [_jsx(FileText, { size: 14, className: "text-info mt-0.5 shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-muted-foreground text-xs", children: ["This user owns ", u.contentOwnedCount, " content", ' ', u.contentOwnedCount === 1 ? 'item' : 'items', ". Revoking access suspends the account and preserves their content and authorship \u2014 or reassign it to another member first."] }), _jsx(Button, { size: "sm", variant: "outline", className: "mt-2", leftIcon: _jsx(FileText, { size: 14, "aria-hidden": true }), onClick: () => setShowTransfer(true), children: "Transfer content" })] })] }))] }), _jsxs(Tabs.Content, { value: "security", tabIndex: -1, className: "focus:outline-none", children: [_jsx(SecurityRow, { icon: u.mfaEnabled ? _jsx(ShieldCheck, { size: 16 }) : _jsx(ShieldAlert, { size: 16 }), title: "Multi-factor authentication", description: u.mfaEnabled
|
|
194
|
+
return (_jsx(_Fragment, { children: _jsxs(Drawer, { open: open, onOpenChange: onOpenChange, width: "max-w-xl", title: u ? u.name : detail.loading ? 'Loading…' : 'User', description: u?.email, headerExtra: u ? (_jsx("span", { className: `mr-1 inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${ROLE_PILL[u.roleName] ?? ROLE_PILL.Viewer}`, children: u.roleName })) : undefined, children: [detail.loading ? (_jsxs("div", { className: "space-y-3", children: [_jsx(Skeleton, { variant: "card" }), _jsx(Skeleton, { variant: "table-row", lines: 4 })] })) : detail.error || !u ? (_jsxs("div", { className: "flex items-center gap-3 py-6", children: [_jsx(AlertTriangle, { size: 18, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: detail.error ?? 'User not found.' }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => detail.refetch(), children: "Retry" })] })) : (_jsxs(Tabs.Root, { value: tab, onValueChange: setTab, children: [_jsx(Tabs.List, { className: "border-border mb-4 flex gap-1 overflow-x-auto border-b", "aria-label": "User detail sections", children: TABS.map((t) => (_jsx(Tabs.Trigger, { value: t.id, className: "text-muted-foreground hover:text-foreground data-[state=active]:text-foreground data-[state=active]:border-brand focus-visible:ring-ring -mb-px shrink-0 border-b-2 border-transparent px-3 py-2 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", children: t.label }, t.id))) }), _jsxs(Tabs.Content, { value: "overview", tabIndex: -1, className: "focus:outline-none", children: [_jsxs("div", { className: "mb-4 flex items-center gap-2", children: [_jsxs("span", { className: `inline-flex items-center gap-1.5 text-sm ${STATUS_META[u.status].text}`, children: [_jsx("span", { className: `h-2 w-2 rounded-full ${STATUS_META[u.status].dot}`, "aria-hidden": true }), STATUS_META[u.status].label] }), u.isCurrentUser && (_jsx("span", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 text-xs", children: "You" })), u.externalDomain && (_jsx("span", { className: "bg-warning/10 text-warning rounded px-1.5 py-0.5 text-xs", children: "External domain" }))] }), _jsxs("dl", { className: "grid grid-cols-2 gap-x-4 gap-y-4", children: [_jsx(Fact, { label: "Role", value: u.roleName }), _jsx(Fact, { label: "Status", value: STATUS_META[u.status].label }), _jsx(Fact, { label: "Last active", value: relativeTime(u.lastActiveAt) }), _jsx(Fact, { label: "Last sign-in", value: relativeTime(u.lastLoginAt) }), _jsx(Fact, { label: "Created", value: formatDate(u.createdAt) }), _jsx(Fact, { label: "Accepted invite", value: formatDate(u.acceptedInviteAt) }), _jsx(Fact, { label: "Invited by", value: u.invitedBy ? (u.invitedBy.name) : (_jsx("span", { className: "text-muted-foreground", children: "\u2014" })) }), _jsx(Fact, { label: "Email domain", value: u.email.split('@')[1] ?? '—' }), _jsx(Fact, { label: "Content owned", value: `${u.contentOwnedCount} ${u.contentOwnedCount === 1 ? 'item' : 'items'}` }), _jsx(Fact, { label: "Live API keys", value: u.liveApiKeyCount > 0 ? (_jsxs("span", { className: "text-warning", children: [u.liveApiKeyCount, " ", u.liveApiKeyCount === 1 ? 'key' : 'keys'] })) : ('None') }), _jsx(Fact, { label: "Email verified", value: u.emailVerified ? 'Yes' : _jsx("span", { className: "text-warning", children: "No" }) }), u.authProvider && _jsx(Fact, { label: "Auth provider", value: u.authProvider }), u.oauthProviders.length > 0 && (_jsx(Fact, { label: "Connected accounts", value: u.oauthProviders.join(', ') }))] }), u.contentOwnedCount > 0 && (_jsxs("div", { className: "border-info/30 bg-info/5 mt-4 flex items-start gap-2 rounded-md border p-3", children: [_jsx(FileText, { size: 14, className: "text-info mt-0.5 shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "text-muted-foreground text-xs", children: ["This user owns ", u.contentOwnedCount, " content", ' ', u.contentOwnedCount === 1 ? 'item' : 'items', ". Revoking access suspends the account and preserves their content and authorship \u2014 or reassign it to another member first."] }), _jsx(Button, { size: "sm", variant: "outline", className: "mt-2", leftIcon: _jsx(FileText, { size: 14, "aria-hidden": true }), onClick: () => setShowTransfer(true), children: "Transfer content" })] })] }))] }), _jsxs(Tabs.Content, { value: "security", tabIndex: -1, className: "focus:outline-none", children: [_jsx(SecurityRow, { icon: u.mfaEnabled ? (_jsx(ShieldCheck, { size: 16, "aria-hidden": true })) : (_jsx(ShieldAlert, { size: 16, "aria-hidden": true })), title: "Multi-factor authentication", description: u.mfaEnabled
|
|
195
195
|
? 'Enabled for this account.'
|
|
196
196
|
: u.mfaRequired
|
|
197
197
|
? 'Required but not yet enrolled.'
|
|
@@ -204,7 +204,7 @@ export function UserDetailDrawer({ userId, open, onOpenChange, onChanged }) {
|
|
|
204
204
|
confirmLabel: 'Reset MFA',
|
|
205
205
|
destructive: true,
|
|
206
206
|
onConfirm: () => runAction('mfa-reset', `/users/${u.id}/mfa-reset`, { method: 'POST' }, { successMsg: 'MFA enrolment reset.', after: refreshAfterChange }),
|
|
207
|
-
}), children: "Reset MFA" })] }) }), _jsx(SecurityRow, { icon: _jsx(KeyRound, { size: 16 }), title: "Password", description: u.ssoOnly
|
|
207
|
+
}), children: "Reset MFA" })] }) }), _jsx(SecurityRow, { icon: _jsx(KeyRound, { size: 16, "aria-hidden": true }), title: "Password", description: u.ssoOnly
|
|
208
208
|
? 'Signs in via an external identity provider — no local password.'
|
|
209
209
|
: u.forcePasswordReset
|
|
210
210
|
? 'Must set a new password on next sign-in.'
|
|
@@ -218,13 +218,13 @@ export function UserDetailDrawer({ userId, open, onOpenChange, onChanged }) {
|
|
|
218
218
|
? 'Forced reset cleared.'
|
|
219
219
|
: 'User must reset password on next sign-in.',
|
|
220
220
|
after: refreshAfterChange,
|
|
221
|
-
}), children: u.forcePasswordReset ? 'Clear forced reset' : 'Force reset' })] }) }), _jsx(SecurityRow, { icon: _jsx(ShieldAlert, { size: 16 }), title: "Failed sign-ins", description: `${u.failedLoginCount} failed ${u.failedLoginCount === 1 ? 'attempt' : 'attempts'} on record.`, action: null }), _jsx(SecurityRow, { icon: u.status === 'locked' ? _jsx(Lock, { size: 16 }) : _jsx(Unlock, { size: 16 }), title: "Account lock", description: u.status === 'locked' ? 'Locked by a security policy or an admin.' : 'Not locked.', action: u.status === 'locked' ? (_jsx(Button, { size: "sm", variant: "outline", loading: pending === 'unlock', onClick: () => runAction('unlock', `/users/${u.id}/unlock`, { method: 'POST' }, { successMsg: 'Account unlocked.', after: refreshAfterChange }), children: "Unlock" })) : (_jsx(Button, { size: "sm", variant: "outline", disabled: u.isCurrentUser, title: u.isCurrentUser ? 'You cannot lock your own account' : undefined, loading: pending === 'lock', onClick: () => setConfirm({
|
|
221
|
+
}), children: u.forcePasswordReset ? 'Clear forced reset' : 'Force reset' })] }) }), _jsx(SecurityRow, { icon: _jsx(ShieldAlert, { size: 16, "aria-hidden": true }), title: "Failed sign-ins", description: `${u.failedLoginCount} failed ${u.failedLoginCount === 1 ? 'attempt' : 'attempts'} on record.`, action: null }), _jsx(SecurityRow, { icon: u.status === 'locked' ? (_jsx(Lock, { size: 16, "aria-hidden": true })) : (_jsx(Unlock, { size: 16, "aria-hidden": true })), title: "Account lock", description: u.status === 'locked' ? 'Locked by a security policy or an admin.' : 'Not locked.', action: u.status === 'locked' ? (_jsx(Button, { size: "sm", variant: "outline", loading: pending === 'unlock', onClick: () => runAction('unlock', `/users/${u.id}/unlock`, { method: 'POST' }, { successMsg: 'Account unlocked.', after: refreshAfterChange }), children: "Unlock" })) : (_jsx(Button, { size: "sm", variant: "outline", disabled: u.isCurrentUser, title: u.isCurrentUser ? 'You cannot lock your own account' : undefined, loading: pending === 'lock', onClick: () => setConfirm({
|
|
222
222
|
title: 'Lock account',
|
|
223
223
|
description: `${u.name} will be blocked from signing in and all their sessions will be revoked until you unlock the account.`,
|
|
224
224
|
confirmLabel: 'Lock account',
|
|
225
225
|
destructive: true,
|
|
226
226
|
onConfirm: () => runAction('lock', `/users/${u.id}/lock`, { method: 'POST' }, { successMsg: 'Account locked.', after: refreshAfterChange }),
|
|
227
|
-
}), children: "Lock" })) }), _jsx(SecurityRow, { icon: _jsx(Ban, { size: 16 }), title: "Account access", description: u.status === 'suspended'
|
|
227
|
+
}), children: "Lock" })) }), _jsx(SecurityRow, { icon: _jsx(Ban, { size: 16, "aria-hidden": true }), title: "Account access", description: u.status === 'suspended'
|
|
228
228
|
? 'Suspended — cannot sign in, history preserved.'
|
|
229
229
|
: 'Active — can sign in.', action: u.status === 'suspended' || u.status === 'deactivated' ? (_jsx(Button, { size: "sm", variant: "outline", loading: pending === 'reactivate', onClick: () => runAction('reactivate', `/users/${u.id}/reactivate`, { method: 'POST' }, { successMsg: 'Access restored.', after: refreshAfterChange }), children: "Reactivate" })) : (_jsx(Button, { size: "sm", variant: "outline", disabled: u.isCurrentUser, title: u.isCurrentUser ? 'You cannot suspend your own account' : undefined, loading: pending === 'suspend', onClick: () => setConfirm({
|
|
230
230
|
title: 'Suspend user',
|
|
@@ -240,7 +240,7 @@ export function UserDetailDrawer({ userId, open, onOpenChange, onChanged }) {
|
|
|
240
240
|
onConfirm: () => runAction('revoke-all', `/users/${u.id}/sessions/revoke-all`, { method: 'POST' }, { successMsg: 'Sessions revoked.', after: () => sessions.refetch() }),
|
|
241
241
|
}), children: "Revoke all" }) }), _jsx("ul", { className: "space-y-2", children: sessions.data
|
|
242
242
|
?.filter((s) => s.active)
|
|
243
|
-
.map((s) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx(Monitor, { size: 16, className: "text-muted-foreground shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "text-card-foreground flex items-center gap-1.5 text-sm", children: [_jsx("span", { className: "truncate", children: s.deviceLabel }), s.current && (_jsx("span", { className: "bg-success/10 text-success rounded px-1 text-[10px]", children: "This device" }))] }), _jsxs("div", { className: "text-muted-foreground text-xs", children: ["Signed in ", relativeTime(s.createdAt), " \u00B7 expires", ' ', formatDate(s.expiresAt)] })] })] }), _jsx("button", { type: "button", disabled: pending === `revoke-${s.id}`, onClick: () => runAction(`revoke-${s.id}`, `/users/${u.id}/sessions/${s.id}`, { method: 'DELETE' }, { successMsg: 'Session revoked.', after: () => sessions.refetch() }), className: "text-muted-foreground hover:text-destructive shrink-0 text-xs font-medium transition-colors disabled:opacity-50", children: "Revoke" })] }, s.id))) })] })) }), _jsx(Tabs.Content, { value: "activity", tabIndex: -1, className: "focus:outline-none", children: activity.loading ? (_jsx(Skeleton, { variant: "table-row", lines: 4 })) : activity.error ? (_jsxs("div", { className: "flex items-center gap-3 py-4", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: activity.error }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => activity.refetch(), children: "Retry" })] })) : (activity.data?.length ?? 0) === 0 ? (_jsx(EmptyState, { icon: _jsx(ActivityIcon, { size: 24, "aria-hidden": true }), title: "No recent activity", description: "Audit events for this user will appear here." })) : (_jsx("ul", { className: "space-y-1", children: activity.data?.map((e) => (_jsxs("li", { className: "hover:bg-accent/30 flex items-center justify-between gap-3 rounded-md px-2 py-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx(ActivityIcon, { size: 14, className: "text-muted-foreground shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-card-foreground truncate text-sm", children: humanizeEvent(e.event) }), _jsxs("div", { className: "text-muted-foreground text-xs", children: [e.role === 'target' ? 'Affected this user' : 'Performed by this user', e.ipAddress ? ` · ${e.ipAddress}` : ''] })] })] }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: relativeTime(e.timestamp) })] }, e.id))) })) }), _jsx(Tabs.Content, { value: "permissions", tabIndex: -1, className: "focus:outline-none", children: perms.loading ? (_jsx(Skeleton, { variant: "table-row", lines: 4 })) : perms.error ? (_jsxs("div", { className: "flex items-center gap-3 py-4", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: perms.error }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => perms.refetch(), children: "Retry" })] })) : perms.data ? (_jsxs(_Fragment, { children: [_jsxs("p", { className: "text-muted-foreground mb-3 text-sm", children: ["Effective role", ' ', _jsx("span", { className: "text-card-foreground font-medium", children: perms.data.roleName }), ' ', "grants ", perms.data.permissions.length, " permission", perms.data.permissions.length === 1 ? '' : 's', ". Permissions are derived from the role and managed in configuration."] }), _jsx("ul", { className: "flex flex-wrap gap-1.5", children: perms.data.permissions.map((p) => (_jsxs("li", { className: "border-border bg-muted/50 text-card-foreground inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs", children: [_jsx(Check, { size: 12, className: "text-success", "aria-hidden": true }), p] }, p))) })] })) : null })] })), confirm && (_jsx(ConfirmDialog, { open: !!confirm, onClose: () => setConfirm(null), onConfirm: confirm.onConfirm, title: confirm.title, description: confirm.description, confirmLabel: confirm.confirmLabel, destructive: confirm.destructive })), _jsx(ReauthDialog, { open: !!reauth, onClose: () => setReauth(null), onSubmit: async (password) => {
|
|
243
|
+
.map((s) => (_jsxs("li", { className: "border-border flex items-center justify-between gap-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx(Monitor, { size: 16, className: "text-muted-foreground shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "text-card-foreground flex items-center gap-1.5 text-sm", children: [_jsx("span", { className: "truncate", children: s.deviceLabel }), s.current && (_jsx("span", { className: "bg-success/10 text-success rounded px-1 text-[10px]", children: "This device" }))] }), _jsxs("div", { className: "text-muted-foreground text-xs", children: ["Signed in ", relativeTime(s.createdAt), " \u00B7 expires", ' ', formatDate(s.expiresAt)] })] })] }), _jsx("button", { type: "button", disabled: pending === `revoke-${s.id}`, "aria-label": `Revoke session on ${s.deviceLabel}`, onClick: () => runAction(`revoke-${s.id}`, `/users/${u.id}/sessions/${s.id}`, { method: 'DELETE' }, { successMsg: 'Session revoked.', after: () => sessions.refetch() }), className: "text-muted-foreground hover:text-destructive shrink-0 text-xs font-medium transition-colors disabled:opacity-50", children: "Revoke" })] }, s.id))) })] })) }), _jsx(Tabs.Content, { value: "activity", tabIndex: -1, className: "focus:outline-none", children: activity.loading ? (_jsx(Skeleton, { variant: "table-row", lines: 4 })) : activity.error ? (_jsxs("div", { className: "flex items-center gap-3 py-4", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: activity.error }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => activity.refetch(), children: "Retry" })] })) : (activity.data?.length ?? 0) === 0 ? (_jsx(EmptyState, { icon: _jsx(ActivityIcon, { size: 24, "aria-hidden": true }), title: "No recent activity", description: "Audit events for this user will appear here." })) : (_jsx("ul", { className: "space-y-1", children: activity.data?.map((e) => (_jsxs("li", { className: "hover:bg-accent/30 flex items-center justify-between gap-3 rounded-md px-2 py-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2.5", children: [_jsx(ActivityIcon, { size: 14, className: "text-muted-foreground shrink-0", "aria-hidden": true }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-card-foreground truncate text-sm", children: humanizeEvent(e.event) }), _jsxs("div", { className: "text-muted-foreground text-xs", children: [e.role === 'target' ? 'Affected this user' : 'Performed by this user', e.ipAddress ? ` · ${e.ipAddress}` : ''] })] })] }), _jsx("span", { className: "text-muted-foreground shrink-0 text-xs", children: relativeTime(e.timestamp) })] }, e.id))) })) }), _jsx(Tabs.Content, { value: "permissions", tabIndex: -1, className: "focus:outline-none", children: perms.loading ? (_jsx(Skeleton, { variant: "table-row", lines: 4 })) : perms.error ? (_jsxs("div", { className: "flex items-center gap-3 py-4", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive shrink-0", "aria-hidden": true }), _jsx("span", { className: "text-destructive flex-1 text-sm", children: perms.error }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => perms.refetch(), children: "Retry" })] })) : perms.data ? (_jsxs(_Fragment, { children: [_jsxs("p", { className: "text-muted-foreground mb-3 text-sm", children: ["Effective role", ' ', _jsx("span", { className: "text-card-foreground font-medium", children: perms.data.roleName }), ' ', "grants ", perms.data.permissions.length, " permission", perms.data.permissions.length === 1 ? '' : 's', ". Permissions are derived from the role and managed in configuration."] }), _jsx("ul", { className: "flex flex-wrap gap-1.5", children: perms.data.permissions.map((p) => (_jsxs("li", { className: "border-border bg-muted/50 text-card-foreground inline-flex items-center gap-1 rounded-md border px-2 py-1 text-xs", children: [_jsx(Check, { size: 12, className: "text-success", "aria-hidden": true }), p] }, p))) })] })) : null })] })), confirm && (_jsx(ConfirmDialog, { open: !!confirm, onClose: () => setConfirm(null), onConfirm: confirm.onConfirm, title: confirm.title, description: confirm.description, confirmLabel: confirm.confirmLabel, destructive: confirm.destructive })), _jsx(ReauthDialog, { open: !!reauth, onClose: () => setReauth(null), onSubmit: async (password) => {
|
|
244
244
|
if (reauth)
|
|
245
245
|
await reauth.run(password);
|
|
246
246
|
} }), u && (_jsx(TransferContentModal, { open: showTransfer, onClose: () => setShowTransfer(false), fromUser: { id: u.id, name: u.name, contentOwnedCount: u.contentOwnedCount }, onTransferred: refreshAfterChange }))] }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDetailDrawer.js","sourceRoot":"","sources":["../../../src/views/users/UserDetailDrawer.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserDetailDrawer.js","sourceRoot":"","sources":["../../../src/views/users/UserDetailDrawer.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prenta/admin",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"typescript": "^5.7.0",
|
|
100
100
|
"vitest": "^4.1.0",
|
|
101
101
|
"@prenta/component-blocks": "0.3.1",
|
|
102
|
-
"@prenta/core": "
|
|
102
|
+
"@prenta/core": "5.0.2",
|
|
103
103
|
"@prenta/plugin-ai": "1.0.0",
|
|
104
104
|
"@prenta/plugin-blocks": "0.2.0",
|
|
105
105
|
"@prenta/plugin-commerce": "0.2.1",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"@prenta/plugin-media": "0.2.0",
|
|
108
108
|
"@prenta/plugin-navigation": "0.3.0",
|
|
109
109
|
"@prenta/plugin-seo": "0.1.2",
|
|
110
|
-
"@prenta/sections-react": "0.17.
|
|
110
|
+
"@prenta/sections-react": "0.17.26"
|
|
111
111
|
},
|
|
112
112
|
"scripts": {
|
|
113
113
|
"build": "tsc --project tsconfig.json && npx @tailwindcss/cli -i src/styles/build-input.css -o dist/prenta-admin.css --minify",
|
|
@@ -118,6 +118,7 @@
|
|
|
118
118
|
"type-check": "tsc --noEmit",
|
|
119
119
|
"generate": "node scripts/generate-tokens.mjs",
|
|
120
120
|
"test": "vitest run",
|
|
121
|
+
"lint": "eslint src --max-warnings=-1",
|
|
121
122
|
"clean": "rm -rf dist .turbo"
|
|
122
123
|
}
|
|
123
124
|
}
|
package/src/AdminRoot.tsx
CHANGED
|
@@ -41,6 +41,7 @@ import { LocaleProvider } from './components/LocaleProvider.js'
|
|
|
41
41
|
import { useKeyboardShortcuts } from './hooks/useKeyboardShortcuts.js'
|
|
42
42
|
import { useAppearanceBootstrap } from './hooks/useAppearanceBootstrap.js'
|
|
43
43
|
import { useIdleLogout } from './hooks/useIdleLogout.js'
|
|
44
|
+
import { resolveLogoutRedirect } from './lib/logout-redirect.js'
|
|
44
45
|
import { PageSectionEditor } from './views/page-editor/PageSectionEditor.js'
|
|
45
46
|
import {
|
|
46
47
|
AdminSectionRenderersProvider,
|
|
@@ -159,17 +160,25 @@ function AdminShell({
|
|
|
159
160
|
const [shortcutHelpOpen, setShortcutHelpOpen] = useState(false)
|
|
160
161
|
|
|
161
162
|
// Sign out: revoke the server-side session (and clear the cookie) first, then
|
|
162
|
-
//
|
|
163
|
-
//
|
|
163
|
+
// send the user to a "logged out successfully" login screen. Split-login
|
|
164
|
+
// installs must leave this mount — staying here after `onLogout` would
|
|
165
|
+
// render the hidden 404. Inline login stays on the admin mount. We still
|
|
166
|
+
// clear local state even if the network call fails so the UI never stays
|
|
167
|
+
// "logged in".
|
|
164
168
|
const handleLogout = useCallback(async () => {
|
|
165
169
|
try {
|
|
166
170
|
await cmsApi('/auth/logout', { method: 'POST' })
|
|
167
171
|
} catch {
|
|
168
172
|
// Best-effort: proceed to clear client state regardless.
|
|
169
173
|
}
|
|
170
|
-
|
|
174
|
+
const dest = resolveLogoutRedirect({ loginPath, basePath })
|
|
175
|
+
if (dest.kind === 'external' && typeof window !== 'undefined') {
|
|
176
|
+
window.location.replace(dest.href)
|
|
177
|
+
} else {
|
|
178
|
+
navigate(dest.href)
|
|
179
|
+
}
|
|
171
180
|
await onLogout?.()
|
|
172
|
-
}, [
|
|
181
|
+
}, [loginPath, basePath, navigate, onLogout])
|
|
173
182
|
|
|
174
183
|
// Idle auto-logout (Settings → Security). The policy is read from the
|
|
175
184
|
// non-admin-gated /auth/session-policy endpoint so every member's client
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @vitest-environment happy-dom
|
|
2
2
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
3
3
|
import { cleanup, render } from '@testing-library/react'
|
|
4
|
-
import { AuthorAvatar, authorAvatar } from '../../components/ui/AuthorAvatar.js'
|
|
4
|
+
import { AuthorAvatar, authorAvatar, AVATAR_COLORS } from '../../components/ui/AuthorAvatar.js'
|
|
5
5
|
|
|
6
6
|
afterEach(cleanup)
|
|
7
7
|
|
|
@@ -26,8 +26,29 @@ describe('authorAvatar', () => {
|
|
|
26
26
|
expect(first).toBe(second)
|
|
27
27
|
expect(first).toMatch(/^#[0-9A-F]{6}$/i)
|
|
28
28
|
})
|
|
29
|
+
|
|
30
|
+
it('keeps every swatch at least 4.5:1 against white (axe color-contrast)', () => {
|
|
31
|
+
expect(AVATAR_COLORS).toHaveLength(7)
|
|
32
|
+
for (const color of AVATAR_COLORS) {
|
|
33
|
+
expect(contrast(color, '#ffffff'), color).toBeGreaterThanOrEqual(4.5)
|
|
34
|
+
}
|
|
35
|
+
})
|
|
29
36
|
})
|
|
30
37
|
|
|
38
|
+
/** WCAG 2.1 relative-luminance contrast ratio between two hex colors. */
|
|
39
|
+
function contrast(a: string, b: string): number {
|
|
40
|
+
const lum = (hex: string) => {
|
|
41
|
+
const n = hex.trim().replace('#', '')
|
|
42
|
+
const channels = [0, 2, 4].map((i) => parseInt(n.slice(i, i + 2), 16) / 255)
|
|
43
|
+
const [r, g, bl] = channels.map((c) =>
|
|
44
|
+
c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4,
|
|
45
|
+
)
|
|
46
|
+
return 0.2126 * r! + 0.7152 * g! + 0.0722 * bl!
|
|
47
|
+
}
|
|
48
|
+
const [hi, lo] = [lum(a), lum(b)].sort((x, y) => y - x)
|
|
49
|
+
return (hi! + 0.05) / (lo! + 0.05)
|
|
50
|
+
}
|
|
51
|
+
|
|
31
52
|
describe('AuthorAvatar', () => {
|
|
32
53
|
it('renders the initials in a colored circle, hidden from AT', () => {
|
|
33
54
|
const { container } = render(<AuthorAvatar name="Maria Kowalski" size={28} />)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import {
|
|
3
|
+
LOGGED_OUT_QUERY,
|
|
4
|
+
hasLoggedOutQuery,
|
|
5
|
+
resolveLogoutRedirect,
|
|
6
|
+
} from '../../lib/logout-redirect.js'
|
|
7
|
+
|
|
8
|
+
describe('resolveLogoutRedirect', () => {
|
|
9
|
+
it('sends split-login installs to the hidden login path', () => {
|
|
10
|
+
expect(resolveLogoutRedirect({ loginPath: '/securelogin', basePath: '/admin' })).toEqual({
|
|
11
|
+
kind: 'external',
|
|
12
|
+
href: `/securelogin?${LOGGED_OUT_QUERY}=1`,
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('stays on the admin mount when login is inline', () => {
|
|
17
|
+
expect(resolveLogoutRedirect({ basePath: '/admin' })).toEqual({
|
|
18
|
+
kind: 'internal',
|
|
19
|
+
href: `/?${LOGGED_OUT_QUERY}=1`,
|
|
20
|
+
})
|
|
21
|
+
expect(resolveLogoutRedirect({ loginPath: '/admin', basePath: '/admin' })).toEqual({
|
|
22
|
+
kind: 'internal',
|
|
23
|
+
href: `/?${LOGGED_OUT_QUERY}=1`,
|
|
24
|
+
})
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe('hasLoggedOutQuery', () => {
|
|
29
|
+
it('is true only for the explicit logged-out flag', () => {
|
|
30
|
+
expect(hasLoggedOutQuery(`?${LOGGED_OUT_QUERY}=1`)).toBe(true)
|
|
31
|
+
expect(hasLoggedOutQuery(`?${LOGGED_OUT_QUERY}=true`)).toBe(false)
|
|
32
|
+
expect(hasLoggedOutQuery('')).toBe(false)
|
|
33
|
+
expect(hasLoggedOutQuery('?other=1')).toBe(false)
|
|
34
|
+
})
|
|
35
|
+
})
|
|
@@ -25,8 +25,8 @@ function page(partial: Partial<Page> & Pick<Page, 'id' | 'title'>): Page {
|
|
|
25
25
|
scheduledDate: null,
|
|
26
26
|
lastModified: partial.lastModified ?? '2026-05-01',
|
|
27
27
|
seoScore: partial.seoScore ?? null,
|
|
28
|
-
seoTitle: null,
|
|
29
|
-
seoDescription: null,
|
|
28
|
+
seoTitle: partial.seoTitle ?? null,
|
|
29
|
+
seoDescription: partial.seoDescription ?? null,
|
|
30
30
|
templateId: null,
|
|
31
31
|
isHomepage: partial.isHomepage ?? false,
|
|
32
32
|
isSystemPage: false,
|
|
@@ -106,13 +106,27 @@ describe('applyPagesQuery', () => {
|
|
|
106
106
|
expect(out.map((p) => p.id).sort()).toEqual(['1', '2', '3'])
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
it('searches
|
|
109
|
+
it('searches the page title only', () => {
|
|
110
110
|
expect(applyPagesQuery(PAGES, { search: 'seo' }).map((p) => p.id)).toEqual(['3'])
|
|
111
|
-
expect(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
111
|
+
expect(applyPagesQuery(PAGES, { search: 'about' }).map((p) => p.id)).toEqual(['1'])
|
|
112
|
+
// Tag slug "core" is on About + Services, but it is not a title match.
|
|
113
|
+
expect(applyPagesQuery(PAGES, { search: 'core' })).toEqual([])
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
it('does not match path, slug, author, tags, or SEO metadata', () => {
|
|
117
|
+
const marketing = page({
|
|
118
|
+
id: '5',
|
|
119
|
+
title: 'Digital Marketing',
|
|
120
|
+
path: '/services/seo-audit',
|
|
121
|
+
slug: 'seo-audit',
|
|
122
|
+
authorName: 'SEO Specialist',
|
|
123
|
+
tags: ['seo'],
|
|
124
|
+
seoTitle: 'Digital Marketing & SEO Services | Acme',
|
|
125
|
+
seoDescription: 'Full-service SEO, PPC, and content marketing.',
|
|
126
|
+
})
|
|
127
|
+
expect(applyPagesQuery([...PAGES, marketing], { search: 'seo' }).map((p) => p.id)).toEqual([
|
|
128
|
+
'3',
|
|
129
|
+
])
|
|
116
130
|
})
|
|
117
131
|
|
|
118
132
|
it('sorts by seo descending', () => {
|
|
@@ -8,7 +8,8 @@ describe('cn', () => {
|
|
|
8
8
|
})
|
|
9
9
|
|
|
10
10
|
it('omits falsy conditional classes', () => {
|
|
11
|
-
|
|
11
|
+
const hidden = false
|
|
12
|
+
expect(cn('base', hidden && 'hidden', 'visible')).toBe('base visible')
|
|
12
13
|
expect(cn('x', undefined, null, 0, 'y')).toBe('x y')
|
|
13
14
|
})
|
|
14
15
|
|
|
@@ -81,6 +81,52 @@ describe('design token generation', () => {
|
|
|
81
81
|
expect(runtime.get('--motion-base')).toBe('var(--mo-base)')
|
|
82
82
|
})
|
|
83
83
|
|
|
84
|
+
it('keeps semantic text tokens above the WCAG AA threshold for small text', () => {
|
|
85
|
+
// StatusBadge (and most tinted chips) pair --{tone} on --{tone}-l at 11.5px.
|
|
86
|
+
// Handoff values fail: --suc #059669 is 3.57:1 on --suc-l (Pages Published),
|
|
87
|
+
// --warn #D97706 is 2.85:1, --err #DC2626 is 4.41:1, --info #0891B2 is 3.31:1.
|
|
88
|
+
const css = read(OUTPUTS.runtimeCss)
|
|
89
|
+
const [light, dark] = css.split('.prenta-admin[data-theme=')
|
|
90
|
+
const token = (block: string, name: string) => declarationMap(block).get(name)!
|
|
91
|
+
|
|
92
|
+
for (const [fg, bg] of [
|
|
93
|
+
['--suc', '--suc-l'],
|
|
94
|
+
['--warn', '--warn-l'],
|
|
95
|
+
['--err', '--err-l'],
|
|
96
|
+
['--info', '--info-l'],
|
|
97
|
+
] as const) {
|
|
98
|
+
expect(
|
|
99
|
+
contrast(token(light!, fg), token(light!, bg)),
|
|
100
|
+
`light ${fg} on ${bg}`,
|
|
101
|
+
).toBeGreaterThanOrEqual(4.5)
|
|
102
|
+
expect(contrast(token(light!, fg), '#ffffff'), `light ${fg} on white`).toBeGreaterThanOrEqual(
|
|
103
|
+
4.5,
|
|
104
|
+
)
|
|
105
|
+
expect(
|
|
106
|
+
contrast(token(dark!, fg), token(dark!, bg)),
|
|
107
|
+
`dark ${fg} on ${bg}`,
|
|
108
|
+
).toBeGreaterThanOrEqual(4.5)
|
|
109
|
+
}
|
|
110
|
+
// Tailwind /10 mixes as measured by axe on dashboard chips (not the raw tint).
|
|
111
|
+
expect(contrast(token(light!, '--warn'), '#f8eee6')).toBeGreaterThanOrEqual(4.5)
|
|
112
|
+
expect(contrast(token(light!, '--suc'), '#e6f2ee')).toBeGreaterThanOrEqual(4.5)
|
|
113
|
+
// Accent text on the token tint — not on bg-primary/15, which axe measured
|
|
114
|
+
// as #d9c8f7 (3.67:1) on the Posts type-tab count chips.
|
|
115
|
+
expect(contrast(token(light!, '--acc'), token(light!, '--acc-l'))).toBeGreaterThanOrEqual(4.5)
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
it('keeps editorial tag pills above the WCAG AA threshold for small text', () => {
|
|
119
|
+
const css = read(OUTPUTS.runtimeCss)
|
|
120
|
+
const [light] = css.split('.prenta-admin[data-theme=')
|
|
121
|
+
const token = (name: string) => declarationMap(light!).get(name)!
|
|
122
|
+
for (const hue of ['purple', 'green', 'orange', 'red', 'blue', 'pink', 'gray'] as const) {
|
|
123
|
+
expect(
|
|
124
|
+
contrast(token(`--tag-${hue}`), token(`--tag-${hue}-soft`)),
|
|
125
|
+
`--tag-${hue} on --tag-${hue}-soft`,
|
|
126
|
+
).toBeGreaterThanOrEqual(4.5)
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
|
|
84
130
|
it('keeps --muted above the WCAG AA threshold in both themes', () => {
|
|
85
131
|
// The handoff specifies #B0ADBE (2.2:1 on white). The admin renders --muted
|
|
86
132
|
// as real text, so the generator ships a corrected value recorded in
|
|
@@ -44,6 +44,13 @@ describe('LoginRoot', () => {
|
|
|
44
44
|
expect(screen.getByText('Sign in to your account')).toBeTruthy()
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
+
it('shows a logged-out confirmation when arriving with ?loggedOut=1', () => {
|
|
48
|
+
window.history.replaceState({}, '', '/securelogin?loggedOut=1')
|
|
49
|
+
render(<LoginRoot config={{}} session={null} onLogin={noopLogin} />)
|
|
50
|
+
expect(screen.getByRole('status').textContent).toMatch(/logged out successfully/i)
|
|
51
|
+
expect(screen.getByText('Sign in to your account')).toBeTruthy()
|
|
52
|
+
})
|
|
53
|
+
|
|
47
54
|
it('renders the setup wizard while setup is required (first-time install)', () => {
|
|
48
55
|
window.history.replaceState({}, '', '/securelogin/setup')
|
|
49
56
|
render(
|
|
@@ -41,6 +41,7 @@ function baseData(overrides: Record<string, unknown> = {}) {
|
|
|
41
41
|
mfa: { required: false, gracePeriodDays: 7 },
|
|
42
42
|
session: { maxConcurrentSessions: 5, timeoutHours: 168, idleLogoutEnabled: false },
|
|
43
43
|
access: { ipAllowlist: [], auditLoggingEnabled: true },
|
|
44
|
+
lockout: { threshold: 10, minutes: 15 },
|
|
44
45
|
},
|
|
45
46
|
status: {
|
|
46
47
|
status: 'needs_attention',
|
|
@@ -58,4 +58,42 @@ describe('Trash', () => {
|
|
|
58
58
|
expect(onNavigate).toHaveBeenCalledWith('/pages/p1')
|
|
59
59
|
})
|
|
60
60
|
})
|
|
61
|
+
|
|
62
|
+
it('tells the editor when restore hits a live slug conflict (BUG-11)', async () => {
|
|
63
|
+
cmsApi.mockImplementation(async (endpoint: string, options?: { method?: string }) => {
|
|
64
|
+
if (options?.method === 'POST' && String(endpoint).includes('/restore')) {
|
|
65
|
+
return {
|
|
66
|
+
data: { document: { id: 'p1' }, slugConflict: true, previousSlug: 'about' },
|
|
67
|
+
status: 200,
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (String(endpoint).includes('/collections/pages')) {
|
|
71
|
+
return {
|
|
72
|
+
data: {
|
|
73
|
+
docs: [
|
|
74
|
+
{
|
|
75
|
+
id: 'p1',
|
|
76
|
+
title: 'About',
|
|
77
|
+
slug: 'about',
|
|
78
|
+
deletedAt: '2026-08-01T00:00:00.000Z',
|
|
79
|
+
data: { slug: 'about' },
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
status: 200,
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { data: { docs: [] }, status: 200 }
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
render(<Trash onNavigate={vi.fn()} />)
|
|
90
|
+
expect(await screen.findByText('About')).toBeTruthy()
|
|
91
|
+
fireEvent.click(screen.getByRole('button', { name: 'Restore About' }))
|
|
92
|
+
await waitFor(() => {
|
|
93
|
+
expect(cmsApi).toHaveBeenCalledWith(
|
|
94
|
+
expect.stringContaining('/restore'),
|
|
95
|
+
expect.objectContaining({ method: 'POST' }),
|
|
96
|
+
)
|
|
97
|
+
})
|
|
98
|
+
})
|
|
61
99
|
})
|
|
@@ -146,7 +146,8 @@ export function LivePreview({
|
|
|
146
146
|
const handleRefresh = useCallback(() => {
|
|
147
147
|
if (iframeRef.current) {
|
|
148
148
|
setLoading(true)
|
|
149
|
-
|
|
149
|
+
const current = iframeRef.current.src
|
|
150
|
+
iframeRef.current.src = current
|
|
150
151
|
}
|
|
151
152
|
}, [])
|
|
152
153
|
|
|
@@ -30,7 +30,9 @@ export function PresenceIndicator({ documentId, currentUserId }: PresenceIndicat
|
|
|
30
30
|
try {
|
|
31
31
|
const data = JSON.parse(event.data) as PresenceUser[]
|
|
32
32
|
setUsers(data.filter((u) => u.userId !== currentUserId))
|
|
33
|
-
} catch {
|
|
33
|
+
} catch {
|
|
34
|
+
/* ignore malformed presence payloads */
|
|
35
|
+
}
|
|
34
36
|
})
|
|
35
37
|
|
|
36
38
|
es.onerror = () => {
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
* design-system exception for truly dynamic values (see Dashboard.tsx
|
|
12
12
|
* note). All swatches keep ≥4.5:1 contrast with white text.
|
|
13
13
|
*/
|
|
14
|
-
const AVATAR_COLORS = [
|
|
15
|
-
'#7C3AED', // purple
|
|
16
|
-
'#E11D48', // rose
|
|
17
|
-
'#
|
|
18
|
-
'#
|
|
19
|
-
'#
|
|
20
|
-
'#4F46E5', // indigo
|
|
21
|
-
'#DC2626', // red
|
|
14
|
+
export const AVATAR_COLORS = [
|
|
15
|
+
'#7C3AED', // purple-600 — 5.70:1 on white
|
|
16
|
+
'#E11D48', // rose-600 — 4.70:1 on white
|
|
17
|
+
'#047857', // emerald-700 — 5.48:1 (#059669 is 3.77:1)
|
|
18
|
+
'#0E7490', // cyan-700 — 5.36:1 (#0891B2 is 3.68:1)
|
|
19
|
+
'#92400E', // amber-800 — 7.09:1 (#D97706 is 3.18:1)
|
|
20
|
+
'#4F46E5', // indigo-600 — 6.29:1 on white
|
|
21
|
+
'#DC2626', // red-600 — 4.83:1 on white
|
|
22
22
|
] as const
|
|
23
23
|
|
|
24
24
|
function hashString(s: string): number {
|
|
@@ -70,7 +70,19 @@ export function DataTable({
|
|
|
70
70
|
/>
|
|
71
71
|
</th>
|
|
72
72
|
{columns.map((col) => (
|
|
73
|
-
<th
|
|
73
|
+
<th
|
|
74
|
+
key={col.key}
|
|
75
|
+
className="px-4 py-3 font-medium"
|
|
76
|
+
aria-sort={
|
|
77
|
+
col.sortable && onSort
|
|
78
|
+
? sortField === col.key
|
|
79
|
+
? sortDir === 'asc'
|
|
80
|
+
? 'ascending'
|
|
81
|
+
: 'descending'
|
|
82
|
+
: 'none'
|
|
83
|
+
: undefined
|
|
84
|
+
}
|
|
85
|
+
>
|
|
74
86
|
{col.sortable && onSort ? (
|
|
75
87
|
<button
|
|
76
88
|
onClick={() => onSort(col.key)}
|
package/src/layout/Sidebar.tsx
CHANGED
|
@@ -393,7 +393,7 @@ function renderNavTree(items: NavItem[], ctx: NavRenderContext): ReactNode {
|
|
|
393
393
|
</div>
|
|
394
394
|
) : (
|
|
395
395
|
<div key={`g-${item.group}`} className="px-3 pt-4 pb-1">
|
|
396
|
-
<span className="text-sidebar-foreground/
|
|
396
|
+
<span className="text-sidebar-foreground/80 text-[10px] font-medium tracking-wider uppercase">
|
|
397
397
|
{item.group}
|
|
398
398
|
</span>
|
|
399
399
|
</div>
|