@actuate-media/cms-admin 0.26.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/__tests__/views/appearance-settings.render.test.d.ts +2 -0
  2. package/dist/__tests__/views/appearance-settings.render.test.d.ts.map +1 -0
  3. package/dist/__tests__/views/appearance-settings.render.test.js +95 -0
  4. package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -0
  5. package/dist/__tests__/views/security-settings.render.test.d.ts +2 -0
  6. package/dist/__tests__/views/security-settings.render.test.d.ts.map +1 -0
  7. package/dist/__tests__/views/security-settings.render.test.js +175 -0
  8. package/dist/__tests__/views/security-settings.render.test.js.map +1 -0
  9. package/dist/actuate-admin.css +1 -1
  10. package/dist/components/ThemeProvider.d.ts +47 -4
  11. package/dist/components/ThemeProvider.d.ts.map +1 -1
  12. package/dist/components/ThemeProvider.js +173 -27
  13. package/dist/components/ThemeProvider.js.map +1 -1
  14. package/dist/components/ui/Badge.d.ts +1 -1
  15. package/dist/components/ui/Button.d.ts +1 -1
  16. package/dist/components/ui/Card.d.ts +2 -2
  17. package/dist/components/ui/Input.d.ts +1 -1
  18. package/dist/components/ui/Select.d.ts +1 -1
  19. package/dist/layout/Sidebar.d.ts.map +1 -1
  20. package/dist/layout/Sidebar.js +47 -8
  21. package/dist/layout/Sidebar.js.map +1 -1
  22. package/dist/views/Settings.d.ts.map +1 -1
  23. package/dist/views/Settings.js +5 -17
  24. package/dist/views/Settings.js.map +1 -1
  25. package/dist/views/settings/AccessProtectionCard.d.ts +10 -0
  26. package/dist/views/settings/AccessProtectionCard.d.ts.map +1 -0
  27. package/dist/views/settings/AccessProtectionCard.js +20 -0
  28. package/dist/views/settings/AccessProtectionCard.js.map +1 -0
  29. package/dist/views/settings/AdminThemeCard.d.ts +6 -0
  30. package/dist/views/settings/AdminThemeCard.d.ts.map +1 -0
  31. package/dist/views/settings/AdminThemeCard.js +31 -0
  32. package/dist/views/settings/AdminThemeCard.js.map +1 -0
  33. package/dist/views/settings/AppearanceTab.d.ts +7 -0
  34. package/dist/views/settings/AppearanceTab.d.ts.map +1 -0
  35. package/dist/views/settings/AppearanceTab.js +24 -0
  36. package/dist/views/settings/AppearanceTab.js.map +1 -0
  37. package/dist/views/settings/AuthMfaCard.d.ts +10 -0
  38. package/dist/views/settings/AuthMfaCard.d.ts.map +1 -0
  39. package/dist/views/settings/AuthMfaCard.js +33 -0
  40. package/dist/views/settings/AuthMfaCard.js.map +1 -0
  41. package/dist/views/settings/BrandPreviewCard.d.ts +5 -0
  42. package/dist/views/settings/BrandPreviewCard.d.ts.map +1 -0
  43. package/dist/views/settings/BrandPreviewCard.js +18 -0
  44. package/dist/views/settings/BrandPreviewCard.js.map +1 -0
  45. package/dist/views/settings/BrandingCard.d.ts +6 -0
  46. package/dist/views/settings/BrandingCard.d.ts.map +1 -0
  47. package/dist/views/settings/BrandingCard.js +38 -0
  48. package/dist/views/settings/BrandingCard.js.map +1 -0
  49. package/dist/views/settings/SecretsAuditCard.d.ts +11 -0
  50. package/dist/views/settings/SecretsAuditCard.d.ts.map +1 -0
  51. package/dist/views/settings/SecretsAuditCard.js +22 -0
  52. package/dist/views/settings/SecretsAuditCard.js.map +1 -0
  53. package/dist/views/settings/SecurityStatusCard.d.ts +6 -0
  54. package/dist/views/settings/SecurityStatusCard.d.ts.map +1 -0
  55. package/dist/views/settings/SecurityStatusCard.js +35 -0
  56. package/dist/views/settings/SecurityStatusCard.js.map +1 -0
  57. package/dist/views/settings/SecurityTab.d.ts +5 -0
  58. package/dist/views/settings/SecurityTab.d.ts.map +1 -0
  59. package/dist/views/settings/SecurityTab.js +41 -0
  60. package/dist/views/settings/SecurityTab.js.map +1 -0
  61. package/dist/views/settings/SessionPolicyCard.d.ts +11 -0
  62. package/dist/views/settings/SessionPolicyCard.d.ts.map +1 -0
  63. package/dist/views/settings/SessionPolicyCard.js +21 -0
  64. package/dist/views/settings/SessionPolicyCard.js.map +1 -0
  65. package/dist/views/settings/TypographyMotionCard.d.ts +6 -0
  66. package/dist/views/settings/TypographyMotionCard.d.ts.map +1 -0
  67. package/dist/views/settings/TypographyMotionCard.js +8 -0
  68. package/dist/views/settings/TypographyMotionCard.js.map +1 -0
  69. package/dist/views/settings/securityPrimitives.d.ts +21 -0
  70. package/dist/views/settings/securityPrimitives.d.ts.map +1 -0
  71. package/dist/views/settings/securityPrimitives.js +31 -0
  72. package/dist/views/settings/securityPrimitives.js.map +1 -0
  73. package/dist/views/settings/useAppearanceSettings.d.ts +69 -0
  74. package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -0
  75. package/dist/views/settings/useAppearanceSettings.js +344 -0
  76. package/dist/views/settings/useAppearanceSettings.js.map +1 -0
  77. package/dist/views/settings/useGeneralSettings.d.ts +4 -1
  78. package/dist/views/settings/useGeneralSettings.d.ts.map +1 -1
  79. package/dist/views/settings/useGeneralSettings.js.map +1 -1
  80. package/dist/views/settings/useSecuritySettings.d.ts +37 -0
  81. package/dist/views/settings/useSecuritySettings.d.ts.map +1 -0
  82. package/dist/views/settings/useSecuritySettings.js +154 -0
  83. package/dist/views/settings/useSecuritySettings.js.map +1 -0
  84. package/package.json +2 -2
  85. package/src/__tests__/views/appearance-settings.render.test.tsx +132 -0
  86. package/src/__tests__/views/security-settings.render.test.tsx +212 -0
  87. package/src/components/ThemeProvider.tsx +249 -36
  88. package/src/layout/Sidebar.tsx +81 -13
  89. package/src/styles/theme.css +32 -2
  90. package/src/views/Settings.tsx +5 -68
  91. package/src/views/settings/AccessProtectionCard.tsx +143 -0
  92. package/src/views/settings/AdminThemeCard.tsx +145 -0
  93. package/src/views/settings/AppearanceTab.tsx +81 -0
  94. package/src/views/settings/AuthMfaCard.tsx +118 -0
  95. package/src/views/settings/BrandPreviewCard.tsx +125 -0
  96. package/src/views/settings/BrandingCard.tsx +332 -0
  97. package/src/views/settings/SecretsAuditCard.tsx +129 -0
  98. package/src/views/settings/SecurityStatusCard.tsx +110 -0
  99. package/src/views/settings/SecurityTab.tsx +162 -0
  100. package/src/views/settings/SessionPolicyCard.tsx +123 -0
  101. package/src/views/settings/TypographyMotionCard.tsx +65 -0
  102. package/src/views/settings/securityPrimitives.tsx +75 -0
  103. package/src/views/settings/useAppearanceSettings.ts +513 -0
  104. package/src/views/settings/useGeneralSettings.ts +4 -1
  105. package/src/views/settings/useSecuritySettings.ts +197 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandingCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandingCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ApiKeysSecuritySummary, SecretsStatus, SecuritySourceMetadata, UsersSecuritySummary } from '@actuate-media/cms-core/security-center';
2
+ export declare function SecretsAuditCard({ secrets, auditEnabled, failedLogins24h, users, apiKeys, sources, onNavigate, }: {
3
+ secrets: SecretsStatus;
4
+ auditEnabled: boolean;
5
+ failedLogins24h: number;
6
+ users: UsersSecuritySummary;
7
+ apiKeys: ApiKeysSecuritySummary;
8
+ sources: Record<string, SecuritySourceMetadata>;
9
+ onNavigate?: (path: string) => void;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=SecretsAuditCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsAuditCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SecretsAuditCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EAEtB,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,yCAAyC,CAAA;AAiBhD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,eAAe,EACf,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE;IACD,OAAO,EAAE,aAAa,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,KAAK,EAAE,oBAAoB,CAAA;IAC3B,OAAO,EAAE,sBAAsB,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAsFA"}
@@ -0,0 +1,22 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import { SettingsSourceBadge } from './components.js';
5
+ import { SecurityCard, StatusRow } from './securityPrimitives.js';
6
+ function secretValue(status) {
7
+ switch (status) {
8
+ case 'pass':
9
+ return 'Configured';
10
+ case 'warning':
11
+ return 'Not configured';
12
+ case 'fail':
13
+ return 'Missing / invalid';
14
+ default:
15
+ return 'Unknown';
16
+ }
17
+ }
18
+ export function SecretsAuditCard({ secrets, auditEnabled, failedLogins24h, users, apiKeys, sources, onNavigate, }) {
19
+ const headingId = useId();
20
+ return (_jsxs(SecurityCard, { headingId: headingId, title: "Secrets, Encryption & Audit", description: "Platform secret status (values are never shown), audit logging, and cross-module risk.", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(StatusRow, { status: secrets.cmsSecret, label: "CMS signing secret", value: secretValue(secrets.cmsSecret), badge: _jsx(SettingsSourceBadge, { meta: sources.cmsSecret }) }), _jsx(StatusRow, { status: secrets.encryptionKey, label: "Encryption key", value: secretValue(secrets.encryptionKey), badge: _jsx(SettingsSourceBadge, { meta: sources.encryptionKey }) }), _jsx(StatusRow, { status: "pass", label: "API keys hashed at rest", value: "Yes" }), _jsx(StatusRow, { status: secrets.webhookSecretsEncrypted ? 'pass' : 'warning', label: "Webhook secrets encrypted", value: secrets.webhookSecretsEncrypted ? 'Yes' : 'Plaintext fallback' })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsx(StatusRow, { status: auditEnabled ? 'pass' : 'warning', label: "Audit logging", value: auditEnabled ? 'Enabled' : 'Disabled', badge: _jsx(SettingsSourceBadge, { meta: sources.audit }) }), _jsx(StatusRow, { status: failedLogins24h >= 20 ? 'warning' : 'pass', label: "Failed logins (24h)", value: String(failedLogins24h) })] }), _jsxs("div", { className: "border-border mt-4 space-y-3 border-t pt-4", children: [_jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "text-foreground font-medium", children: "Users" }), _jsxs("p", { className: "text-muted-foreground", children: [users.totalAdmins, " admin", users.totalAdmins === 1 ? '' : 's', ",", ' ', users.adminsWithoutMfa, " without MFA", users.inactive > 0 ? `, ${users.inactive} inactive` : ''] })] }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/settings?tab=users'), className: "text-brand shrink-0 text-sm hover:underline", children: "Review users \u2192" }))] }), _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "text-sm", children: [_jsx("p", { className: "text-foreground font-medium", children: "API keys" }), _jsxs("p", { className: "text-muted-foreground", children: [apiKeys.active, " active, ", apiKeys.broadScope, " broad-scope, ", apiKeys.withoutExpiration, ' ', "without expiry"] })] }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/settings?tab=api-keys'), className: "text-brand shrink-0 text-sm hover:underline", children: "Review API keys \u2192" }))] })] })] }));
21
+ }
22
+ //# sourceMappingURL=SecretsAuditCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsAuditCard.js","sourceRoot":"","sources":["../../../src/views/settings/SecretsAuditCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAQ7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAEjE,SAAS,WAAW,CAAC,MAAmB;IACtC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,YAAY,CAAA;QACrB,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAA;QACzB,KAAK,MAAM;YACT,OAAO,mBAAmB,CAAA;QAC5B;YACE,OAAO,SAAS,CAAA;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,YAAY,EACZ,eAAe,EACf,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,GASX;IACC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IAEzB,OAAO,CACL,MAAC,YAAY,IACX,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,6BAA6B,EACnC,WAAW,EAAC,wFAAwF,aAEpG,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,SAAS,IACR,MAAM,EAAE,OAAO,CAAC,SAAS,EACzB,KAAK,EAAC,oBAAoB,EAC1B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EACrC,KAAK,EAAE,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,SAAS,GAAI,GACvD,EACF,KAAC,SAAS,IACR,MAAM,EAAE,OAAO,CAAC,aAAa,EAC7B,KAAK,EAAC,gBAAgB,EACtB,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,EACzC,KAAK,EAAE,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,aAAa,GAAI,GAC3D,EACF,KAAC,SAAS,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,yBAAyB,EAAC,KAAK,EAAC,KAAK,GAAG,EACvE,KAAC,SAAS,IACR,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC5D,KAAK,EAAC,2BAA2B,EACjC,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,GACrE,IACE,EAEN,eAAK,SAAS,EAAC,4CAA4C,aACzD,KAAC,SAAS,IACR,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACzC,KAAK,EAAC,eAAe,EACrB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAC5C,KAAK,EAAE,KAAC,mBAAmB,IAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAI,GACnD,EACF,KAAC,SAAS,IACR,MAAM,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAClD,KAAK,EAAC,qBAAqB,EAC3B,KAAK,EAAE,MAAM,CAAC,eAAe,CAAC,GAC9B,IACE,EAGN,eAAK,SAAS,EAAC,4CAA4C,aACzD,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,SAAS,aACtB,YAAG,SAAS,EAAC,6BAA6B,sBAAU,EACpD,aAAG,SAAS,EAAC,uBAAuB,aACjC,KAAK,CAAC,WAAW,YAAQ,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAG,GAAG,EACjE,KAAK,CAAC,gBAAgB,kBACtB,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,CAAC,CAAC,CAAC,EAAE,IACvD,IACA,EACL,UAAU,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAChD,SAAS,EAAC,6CAA6C,oCAGhD,CACV,IACG,EACN,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,SAAS,aACtB,YAAG,SAAS,EAAC,6BAA6B,yBAAa,EACvD,aAAG,SAAS,EAAC,uBAAuB,aACjC,OAAO,CAAC,MAAM,eAAW,OAAO,CAAC,UAAU,oBAAgB,OAAO,CAAC,iBAAiB,EAAE,GAAG,sBAExF,IACA,EACL,UAAU,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,wBAAwB,CAAC,EACnD,SAAS,EAAC,6CAA6C,uCAGhD,CACV,IACG,IACF,IACO,CAChB,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SecurityStatus } from '@actuate-media/cms-core/security-center';
2
+ export declare function SecurityStatusCard({ status, onNavigate, }: {
3
+ status: SecurityStatus;
4
+ onNavigate?: (path: string) => void;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=SecurityStatusCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityStatusCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SecurityStatusCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,yCAAyC,CAAA;AA+B9F,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,UAAU,GACX,EAAE;IACD,MAAM,EAAE,cAAc,CAAA;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAoEA"}
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import { Shield, ShieldAlert, ShieldCheck, ShieldX } from 'lucide-react';
5
+ import { CheckIcon } from './securityPrimitives.js';
6
+ const LEVEL_STYLES = {
7
+ secure: {
8
+ pill: 'bg-success/15 text-success border-success/30',
9
+ Icon: ShieldCheck,
10
+ word: 'Secure',
11
+ },
12
+ needs_attention: {
13
+ pill: 'bg-warning/15 text-warning border-warning/30',
14
+ Icon: ShieldAlert,
15
+ word: 'Needs attention',
16
+ },
17
+ at_risk: {
18
+ pill: 'bg-destructive/15 text-destructive border-destructive/30',
19
+ Icon: ShieldX,
20
+ word: 'At risk',
21
+ },
22
+ unknown: { pill: 'bg-muted text-muted-foreground border-border', Icon: Shield, word: 'Unknown' },
23
+ };
24
+ const SEVERITY_STYLES = {
25
+ critical: 'border-destructive/30 bg-destructive/10 text-destructive',
26
+ warning: 'border-warning/30 bg-warning/10 text-warning',
27
+ info: 'border-border bg-muted text-muted-foreground',
28
+ };
29
+ export function SecurityStatusCard({ status, onNavigate, }) {
30
+ const headingId = useId();
31
+ const style = LEVEL_STYLES[status.status];
32
+ const { Icon } = style;
33
+ return (_jsxs("section", { "aria-labelledby": headingId, className: "border-border bg-card rounded-lg border p-4", children: [_jsxs("div", { className: "mb-1 flex items-start justify-between gap-3", children: [_jsx("h3", { id: headingId, className: "text-foreground text-base font-medium", children: "Security Status" }), _jsxs("span", { className: `inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-sm font-medium ${style.pill}`, children: [_jsx(Icon, { size: 15, "aria-hidden": "true" }), style.word] })] }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: status.description }), _jsx("div", { className: "grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2", children: status.checks.map((check) => (_jsxs("button", { type: "button", disabled: !check.actionHref || !onNavigate, onClick: () => check.actionHref && onNavigate?.(check.actionHref), className: "enabled:hover:bg-accent/50 flex items-center justify-between gap-3 rounded-md py-1.5 text-left text-sm disabled:cursor-default", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(CheckIcon, { status: check.status }), _jsx("span", { className: "text-foreground", children: check.label })] }), check.value !== undefined && (_jsx("span", { className: "text-muted-foreground text-right", children: check.value }))] }, check.key))) }), status.warnings.length > 0 && (_jsx("div", { className: "mt-4 space-y-2", "aria-live": "polite", children: status.warnings.map((w) => (_jsxs("div", { role: "note", className: `flex items-start justify-between gap-3 rounded-lg border p-3 text-sm ${SEVERITY_STYLES[w.severity]}`, children: [_jsxs("div", { children: [_jsx("p", { className: "font-medium", children: w.title }), _jsx("p", { className: "mt-0.5 opacity-90", children: w.description })] }), w.actionHref && w.actionLabel && onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate(w.actionHref), className: "shrink-0 self-center rounded-md border border-current/30 px-2.5 py-1 text-xs font-medium hover:opacity-80", children: w.actionLabel }))] }, w.id))) }))] }));
34
+ }
35
+ //# sourceMappingURL=SecurityStatusCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityStatusCard.js","sourceRoot":"","sources":["../../../src/views/settings/SecurityStatusCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function SecurityTab({ role, onNavigate, }: {
2
+ role?: string;
3
+ onNavigate?: (path: string) => void;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=SecurityTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityTab.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SecurityTab.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAkIA"}
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect } from 'react';
4
+ import { ShieldAlert } from 'lucide-react';
5
+ import { SettingsSaveBar, SettingsValidationSummary } from './components.js';
6
+ import { AccessProtectionCard } from './AccessProtectionCard.js';
7
+ import { AuthMfaCard } from './AuthMfaCard.js';
8
+ import { SecretsAuditCard } from './SecretsAuditCard.js';
9
+ import { SecurityStatusCard } from './SecurityStatusCard.js';
10
+ import { SessionPolicyCard } from './SessionPolicyCard.js';
11
+ import { useSecuritySettings } from './useSecuritySettings.js';
12
+ function CardSkeleton() {
13
+ return (_jsxs("div", { className: "border-border bg-card animate-pulse rounded-lg border p-4", children: [_jsx("div", { className: "bg-muted mb-3 h-4 w-40 rounded" }), _jsx("div", { className: "bg-muted mb-4 h-3 w-72 rounded" }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "bg-muted h-3 w-full rounded" }), _jsx("div", { className: "bg-muted h-3 w-2/3 rounded" })] })] }));
14
+ }
15
+ export function SecurityTab({ role, onNavigate, }) {
16
+ const canEdit = role === 'ADMIN';
17
+ const { loading, loadError, data, form, setField, dirty, issues, hasErrors, saveState, save, reset, revokeState, revokeAllOtherSessions, } = useSecuritySettings(canEdit);
18
+ // Deep-link support: /settings?tab=security&section=sessions|ip-allowlist|audit
19
+ useEffect(() => {
20
+ if (loading || typeof window === 'undefined')
21
+ return;
22
+ const section = new URLSearchParams(window.location.search).get('section');
23
+ if (!section)
24
+ return;
25
+ const el = document.getElementById(`security-${section}`);
26
+ el?.scrollIntoView({ behavior: 'smooth', block: 'start' });
27
+ }, [loading]);
28
+ if (loading) {
29
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx(CardSkeleton, {}), _jsx(CardSkeleton, {}), _jsx(CardSkeleton, {})] }));
30
+ }
31
+ if (loadError || !data) {
32
+ const forbidden = /forbidden|permission|insufficient/i.test(loadError ?? '');
33
+ return (_jsxs("div", { className: "border-border bg-card text-muted-foreground flex items-start gap-3 rounded-lg border p-6 text-sm", children: [_jsx(ShieldAlert, { size: 20, className: "text-warning mt-0.5 shrink-0", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground font-medium", children: forbidden
34
+ ? 'You do not have access to security settings'
35
+ : 'Security settings unavailable' }), _jsx("p", { className: "mt-1", children: forbidden
36
+ ? 'Ask an administrator to review the Security tab.'
37
+ : (loadError ?? 'The security service could not be reached. Try again shortly.') })] })] }));
38
+ }
39
+ return (_jsxs("div", { className: "space-y-4 pb-4", children: [_jsx(SecurityStatusCard, { status: data.status, onNavigate: onNavigate }), issues.length > 0 && _jsx(SettingsValidationSummary, { issues: issues }), !canEdit && (_jsx("p", { className: "text-muted-foreground text-sm", children: "You have read-only access. Only administrators can change security settings." })), _jsx(AuthMfaCard, { form: form, setField: setField, canEdit: canEdit, viewerHasMfa: data.viewerHasMfa, withMfa: data.users.withMfa, totalAdmins: data.users.totalAdmins }), _jsx("div", { id: "security-sessions", children: _jsx(SessionPolicyCard, { form: form, setField: setField, canEdit: canEdit, sessionMaxAgeHours: data.sessionMaxAgeHours, activeSessions: data.activeSessions, revokeState: revokeState, onRevokeAll: () => void revokeAllOtherSessions() }) }), _jsx("div", { id: "security-ip-allowlist", children: _jsx(AccessProtectionCard, { ipAllowlist: data.ipAllowlist, secrets: data.secrets, csrfEnabled: data.csrfEnabled, uploadValidation: data.uploadValidation, sources: data.sources, onNavigate: onNavigate }) }), _jsx("div", { id: "security-audit", children: _jsx(SecretsAuditCard, { secrets: data.secrets, auditEnabled: data.auditEnabled, failedLogins24h: data.failedLogins24h, users: data.users, apiKeys: data.apiKeys, sources: data.sources, onNavigate: onNavigate }) }), saveState === 'error' && (_jsx("p", { className: "text-destructive text-sm", role: "alert", children: "Failed to save security settings. Please try again." })), _jsx(SettingsSaveBar, { dirty: dirty, canEdit: canEdit, hasErrors: hasErrors, saveState: saveState, onSave: () => void save(), onReset: reset })] }));
40
+ }
41
+ //# sourceMappingURL=SecurityTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecurityTab.js","sourceRoot":"","sources":["../../../src/views/settings/SecurityTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SecurityForm } from './useSecuritySettings.js';
2
+ export declare function SessionPolicyCard({ form, setField, canEdit, sessionMaxAgeHours, activeSessions, revokeState, onRevokeAll, }: {
3
+ form: SecurityForm;
4
+ setField: <K extends keyof SecurityForm>(key: K, value: SecurityForm[K]) => void;
5
+ canEdit: boolean;
6
+ sessionMaxAgeHours: number;
7
+ activeSessions: number;
8
+ revokeState: 'idle' | 'working' | 'done' | 'error';
9
+ onRevokeAll: () => void;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=SessionPolicyCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionPolicyCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SessionPolicyCard.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAM5D,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,WAAW,GACZ,EAAE;IACD,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAChF,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAA;IAClD,WAAW,EAAE,MAAM,IAAI,CAAA;CACxB,2CA6FA"}
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useState } from 'react';
4
+ import { Loader2 } from 'lucide-react';
5
+ import { MAX_CONCURRENT_SESSION_OPTIONS } from '@actuate-media/cms-core/security-center';
6
+ import { ConfirmDangerousSettingDialog } from './components.js';
7
+ import { SecurityCard, StatusRow } from './securityPrimitives.js';
8
+ function sessionsLabel(n) {
9
+ return n === 0 ? 'Unlimited' : String(n);
10
+ }
11
+ export function SessionPolicyCard({ form, setField, canEdit, sessionMaxAgeHours, activeSessions, revokeState, onRevokeAll, }) {
12
+ const headingId = useId();
13
+ const maxId = useId();
14
+ const [confirmRevoke, setConfirmRevoke] = useState(false);
15
+ const maxAgeDays = Math.round(sessionMaxAgeHours / 24);
16
+ return (_jsxs(SecurityCard, { headingId: headingId, title: "Session Policy", description: "Control how many sessions an account can hold and revoke active sessions.", children: [_jsx("div", { className: "space-y-4", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("label", { htmlFor: maxId, className: "flex-1", children: [_jsx("span", { className: "text-foreground text-base font-medium", children: "Maximum concurrent sessions" }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: "Oldest sessions are signed out when a user exceeds this. Choose Unlimited to disable the cap." })] }), _jsx("select", { id: maxId, value: form.maxConcurrentSessions, disabled: !canEdit, onChange: (e) => setField('maxConcurrentSessions', Number(e.target.value)), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", children: MAX_CONCURRENT_SESSION_OPTIONS.map((n) => (_jsx("option", { value: n, children: sessionsLabel(n) }, n))) })] }) }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsx(StatusRow, { status: "pass", label: "Active admin sessions", value: String(activeSessions) }), _jsx(StatusRow, { status: "pass", label: "Maximum session age", value: `${maxAgeDays} day${maxAgeDays === 1 ? '' : 's'}` }), _jsx(StatusRow, { status: "pass", label: "Revoke sessions on password change", value: "Enabled" })] }), _jsxs("div", { className: "border-border mt-4 flex items-center justify-between gap-3 border-t pt-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: "Revoke other sessions" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Sign out every session except this one. Useful after a suspected compromise." }), revokeState === 'done' && (_jsx("p", { className: "text-success mt-1 text-sm", "aria-live": "polite", children: "Other sessions revoked." })), revokeState === 'error' && (_jsx("p", { className: "text-destructive mt-1 text-sm", "aria-live": "polite", children: "Could not revoke sessions. Try again." }))] }), _jsxs("button", { type: "button", disabled: !canEdit || revokeState === 'working', onClick: () => setConfirmRevoke(true), className: "border-border text-foreground hover:bg-accent inline-flex shrink-0 items-center gap-2 rounded-md border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [revokeState === 'working' && (_jsx(Loader2, { size: 15, className: "animate-spin", "aria-hidden": "true" })), "Revoke other sessions"] })] }), _jsx(ConfirmDangerousSettingDialog, { open: confirmRevoke, title: "Revoke all other sessions?", description: "Every active session except your current one will be signed out immediately. Those users (and your other devices) will need to sign in again.", confirmLabel: "Revoke sessions", onConfirm: () => {
17
+ setConfirmRevoke(false);
18
+ onRevokeAll();
19
+ }, onCancel: () => setConfirmRevoke(false) })] }));
20
+ }
21
+ //# sourceMappingURL=SessionPolicyCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionPolicyCard.js","sourceRoot":"","sources":["../../../src/views/settings/SessionPolicyCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { UseAppearanceSettings } from './useAppearanceSettings.js';
2
+ export declare function TypographyMotionCard({ s, canEdit, }: {
3
+ s: UseAppearanceSettings;
4
+ canEdit: boolean;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=TypographyMotionCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypographyMotionCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/TypographyMotionCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAEvE,wBAAgB,oBAAoB,CAAC,EACnC,CAAC,EACD,OAAO,GACR,EAAE;IACD,CAAC,EAAE,qBAAqB,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;CACjB,2CAoDA"}
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { SettingsToggleRow } from './components.js';
4
+ import { AVAILABLE_FONTS } from '../../components/ThemeProvider.js';
5
+ export function TypographyMotionCard({ s, canEdit, }) {
6
+ return (_jsxs("section", { className: "border-border bg-card rounded-lg border p-6", children: [_jsxs("header", { className: "mb-4", children: [_jsx("h3", { className: "text-foreground text-lg font-medium", children: "Typography & Motion" }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: "Admin UI font and motion preferences." })] }), _jsxs("div", { className: "space-y-5", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "content-font", className: "text-foreground mb-1 block text-base font-medium", children: "Content font" }), _jsx("p", { className: "text-muted-foreground mb-2 text-sm", children: "Applies to the admin UI. Falls back to the system font if not installed." }), _jsxs("select", { id: "content-font", value: s.appearance.font, disabled: !canEdit, onChange: (e) => s.setFont(e.target.value), className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-full max-w-md rounded-md border px-3 py-2 text-base focus-visible:ring-2 focus-visible:outline-none disabled:opacity-50", children: [AVAILABLE_FONTS.map((font) => (_jsx("option", { value: font, children: font }, font))), !AVAILABLE_FONTS.includes(s.appearance.font) && (_jsx("option", { value: s.appearance.font, children: s.appearance.font }))] })] }), _jsx("div", { className: "border-border border-t pt-4", children: _jsx(SettingsToggleRow, { label: "Reduce motion", description: "Minimize animations and transitions across the admin. Focus and state changes are preserved.", checked: s.appearance.reduceMotion, onChange: s.setReduceMotion, disabled: !canEdit }) })] })] }));
7
+ }
8
+ //# sourceMappingURL=TypographyMotionCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypographyMotionCard.js","sourceRoot":"","sources":["../../../src/views/settings/TypographyMotionCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAGnE,MAAM,UAAU,oBAAoB,CAAC,EACnC,CAAC,EACD,OAAO,GAIR;IACC,OAAO,CACL,mBAAS,SAAS,EAAC,6CAA6C,aAC9D,kBAAQ,SAAS,EAAC,MAAM,aACtB,aAAI,SAAS,EAAC,qCAAqC,oCAA6B,EAChF,YAAG,SAAS,EAAC,sCAAsC,sDAE/C,IACG,EAET,eAAK,SAAS,EAAC,WAAW,aACxB,0BACE,gBACE,OAAO,EAAC,cAAc,EACtB,SAAS,EAAC,kDAAkD,6BAGtD,EACR,YAAG,SAAS,EAAC,oCAAoC,yFAE7C,EACJ,kBACE,EAAE,EAAC,cAAc,EACjB,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,EACxB,QAAQ,EAAE,CAAC,OAAO,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC1C,SAAS,EAAC,qMAAqM,aAE9M,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC7B,iBAAmB,KAAK,EAAE,IAAI,YAC3B,IAAI,IADM,IAAI,CAER,CACV,CAAC,EAED,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAwC,CAAC,IAAI,CACnF,iBAAQ,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,YAAG,CAAC,CAAC,UAAU,CAAC,IAAI,GAAU,CAC/D,IACM,IACL,EAEN,cAAK,SAAS,EAAC,6BAA6B,YAC1C,KAAC,iBAAiB,IAChB,KAAK,EAAC,eAAe,EACrB,WAAW,EAAC,8FAA8F,EAC1G,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,YAAY,EAClC,QAAQ,EAAE,CAAC,CAAC,eAAe,EAC3B,QAAQ,EAAE,CAAC,OAAO,GAClB,GACE,IACF,IACE,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { CheckStatus } from '@actuate-media/cms-core/security-center';
3
+ /** Small status icon used in check/summary rows. Text label always accompanies it. */
4
+ export declare function CheckIcon({ status }: {
5
+ status: CheckStatus;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ /** A status row: icon + label on the left, value on the right. */
8
+ export declare function StatusRow({ status, label, value, badge, }: {
9
+ status: CheckStatus;
10
+ label: string;
11
+ value?: ReactNode;
12
+ badge?: ReactNode;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ /** Section wrapper matching the other settings cards. */
15
+ export declare function SecurityCard({ headingId, title, description, children, }: {
16
+ headingId: string;
17
+ title: string;
18
+ description: string;
19
+ children: ReactNode;
20
+ }): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=securityPrimitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityPrimitives.d.ts","sourceRoot":"","sources":["../../../src/views/settings/securityPrimitives.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAA;AAE1E,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,2CAW5D;AASD,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GACN,EAAE;IACD,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,2CAaA;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,WAAW,EACX,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,SAAS,CAAA;CACpB,2CAUA"}
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertTriangle, Check, CircleHelp, X } from 'lucide-react';
4
+ /** Small status icon used in check/summary rows. Text label always accompanies it. */
5
+ export function CheckIcon({ status }) {
6
+ switch (status) {
7
+ case 'pass':
8
+ return _jsx(Check, { size: 15, className: "text-success shrink-0", "aria-hidden": "true" });
9
+ case 'warning':
10
+ return _jsx(AlertTriangle, { size: 15, className: "text-warning shrink-0", "aria-hidden": "true" });
11
+ case 'fail':
12
+ return _jsx(X, { size: 15, className: "text-destructive shrink-0", "aria-hidden": "true" });
13
+ default:
14
+ return _jsx(CircleHelp, { size: 15, className: "text-muted-foreground shrink-0", "aria-hidden": "true" });
15
+ }
16
+ }
17
+ const STATUS_WORD = {
18
+ pass: 'Pass',
19
+ warning: 'Warning',
20
+ fail: 'Fail',
21
+ unknown: 'Unknown',
22
+ };
23
+ /** A status row: icon + label on the left, value on the right. */
24
+ export function StatusRow({ status, label, value, badge, }) {
25
+ return (_jsxs("div", { className: "flex items-center justify-between gap-3 py-1.5 text-sm", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx(CheckIcon, { status: status }), _jsxs("span", { className: "sr-only", children: [STATUS_WORD[status], ": "] }), _jsx("span", { className: "text-foreground", children: label }), badge] }), value !== undefined && _jsx("span", { className: "text-muted-foreground text-right", children: value })] }));
26
+ }
27
+ /** Section wrapper matching the other settings cards. */
28
+ export function SecurityCard({ headingId, title, description, children, }) {
29
+ return (_jsxs("section", { "aria-labelledby": headingId, className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h3", { id: headingId, className: "text-foreground mb-1 text-base font-medium", children: title }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: description }), children] }));
30
+ }
31
+ //# sourceMappingURL=securityPrimitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityPrimitives.js","sourceRoot":"","sources":["../../../src/views/settings/securityPrimitives.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAIlE,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAA2B;IAC3D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,CAAA;QACjF,KAAK,SAAS;YACZ,OAAO,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,CAAA;QACzF,KAAK,MAAM;YACT,OAAO,KAAC,CAAC,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,2BAA2B,iBAAa,MAAM,GAAG,CAAA;QACjF;YACE,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,gCAAgC,iBAAa,MAAM,GAAG,CAAA;IACjG,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAgC;IAC/C,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;CACnB,CAAA;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GAMN;IACC,OAAO,CACL,eAAK,SAAS,EAAC,wDAAwD,aACrE,gBAAM,SAAS,EAAC,yBAAyB,aACvC,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,GAAI,EAE7B,gBAAM,SAAS,EAAC,SAAS,aAAE,WAAW,CAAC,MAAM,CAAC,UAAU,EACxD,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAQ,EAC/C,KAAK,IACD,EACN,KAAK,KAAK,SAAS,IAAI,eAAM,SAAS,EAAC,kCAAkC,YAAE,KAAK,GAAQ,IACrF,CACP,CAAA;AACH,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,YAAY,CAAC,EAC3B,SAAS,EACT,KAAK,EACL,WAAW,EACX,QAAQ,GAMT;IACC,OAAO,CACL,sCAA0B,SAAS,EAAE,SAAS,EAAC,6CAA6C,aAC1F,aAAI,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,4CAA4C,YACtE,KAAK,GACH,EACL,YAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,GAAK,EAClE,QAAQ,IACD,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { type AdminBrandingMode, type BrandAssetRole, type ColorMode, type LogoShape, type ResolvedAdminBrand, type ResolvedPublicBrand, type SidebarDensity } from '@actuate-media/cms-core/appearance';
2
+ import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js';
3
+ export type SaveState = 'idle' | 'saving' | 'success' | 'error';
4
+ /** Theme + typography + motion form (the `appearance` settings blob). */
5
+ export interface AppearanceForm {
6
+ colorMode: ColorMode;
7
+ accent: string;
8
+ density: SidebarDensity;
9
+ font: string;
10
+ reduceMotion: boolean;
11
+ }
12
+ /** Brand asset references + admin branding mode (the `brand` settings blob). */
13
+ export interface BrandForm {
14
+ mode: AdminBrandingMode;
15
+ publicPrimaryLogoAssetId?: string;
16
+ publicLogoMarkAssetId?: string;
17
+ publicDarkLogoAssetId?: string;
18
+ adminPrimaryLogoAssetId?: string;
19
+ adminLogoMarkAssetId?: string;
20
+ adminDarkLogoAssetId?: string;
21
+ faviconSourceAssetId?: string;
22
+ defaultLogoAltText?: string;
23
+ }
24
+ /** A brand-form field that points at a media asset, plus its asset role. */
25
+ export type BrandAssetField = 'publicPrimaryLogoAssetId' | 'publicLogoMarkAssetId' | 'publicDarkLogoAssetId' | 'adminPrimaryLogoAssetId' | 'adminLogoMarkAssetId' | 'adminDarkLogoAssetId' | 'faviconSourceAssetId';
26
+ export declare const FIELD_ROLE: Record<BrandAssetField, BrandAssetRole>;
27
+ export interface AssetPreview {
28
+ id: string;
29
+ url: string;
30
+ mimeType: string;
31
+ width?: number;
32
+ height?: number;
33
+ shape: LogoShape;
34
+ }
35
+ export interface UseAppearanceSettings {
36
+ loading: boolean;
37
+ loadError: string | null;
38
+ appearance: AppearanceForm;
39
+ brand: BrandForm;
40
+ /** Per-asset-id preview metadata (loaded + freshly uploaded). */
41
+ assets: Record<string, AssetPreview>;
42
+ sources: Record<string, SettingsSourceMetadata>;
43
+ issues: ValidationIssue[];
44
+ preview: {
45
+ admin: ResolvedAdminBrand;
46
+ public: ResolvedPublicBrand;
47
+ faviconUrl: string | null;
48
+ };
49
+ dirty: boolean;
50
+ saveState: SaveState;
51
+ saveError: string | null;
52
+ uploadingField: BrandAssetField | null;
53
+ showAdvanced: boolean;
54
+ setShowAdvanced: (v: boolean) => void;
55
+ setColorMode: (v: ColorMode) => void;
56
+ setAccent: (v: string) => void;
57
+ setDensity: (v: SidebarDensity) => void;
58
+ setFont: (v: string) => void;
59
+ setReduceMotion: (v: boolean) => void;
60
+ setBrandingMode: (v: AdminBrandingMode) => void;
61
+ setAltText: (v: string) => void;
62
+ uploadAsset: (field: BrandAssetField, file: File) => Promise<void>;
63
+ removeAsset: (field: BrandAssetField) => void;
64
+ save: () => Promise<void>;
65
+ reset: () => void;
66
+ reload: () => void;
67
+ }
68
+ export declare function useAppearanceSettings(canEdit: boolean, config?: Record<string, unknown>): UseAppearanceSettings;
69
+ //# sourceMappingURL=useAppearanceSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppearanceSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAppearanceSettings.ts"],"names":[],"mappings":"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"}