@actuate-media/cms-admin 0.25.0 → 0.27.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.
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +3 -3
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/views/appearance-settings.render.test.d.ts +2 -0
- package/dist/__tests__/views/appearance-settings.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/appearance-settings.render.test.js +95 -0
- package/dist/__tests__/views/appearance-settings.render.test.js.map +1 -0
- package/dist/__tests__/views/general-settings.render.test.d.ts +2 -0
- package/dist/__tests__/views/general-settings.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/general-settings.render.test.js +105 -0
- package/dist/__tests__/views/general-settings.render.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/components/ThemeProvider.d.ts +47 -4
- package/dist/components/ThemeProvider.d.ts.map +1 -1
- package/dist/components/ThemeProvider.js +173 -27
- package/dist/components/ThemeProvider.js.map +1 -1
- package/dist/components/ui/Badge.d.ts +1 -1
- package/dist/components/ui/Button.d.ts +1 -1
- package/dist/components/ui/Card.d.ts +2 -2
- package/dist/components/ui/Input.d.ts +1 -1
- package/dist/components/ui/Select.d.ts +1 -1
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/Sidebar.js +47 -8
- package/dist/layout/Sidebar.js.map +1 -1
- package/dist/views/Settings.d.ts +3 -1
- package/dist/views/Settings.d.ts.map +1 -1
- package/dist/views/Settings.js +10 -33
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/settings/AdminThemeCard.d.ts +6 -0
- package/dist/views/settings/AdminThemeCard.d.ts.map +1 -0
- package/dist/views/settings/AdminThemeCard.js +31 -0
- package/dist/views/settings/AdminThemeCard.js.map +1 -0
- package/dist/views/settings/AppearanceTab.d.ts +7 -0
- package/dist/views/settings/AppearanceTab.d.ts.map +1 -0
- package/dist/views/settings/AppearanceTab.js +24 -0
- package/dist/views/settings/AppearanceTab.js.map +1 -0
- package/dist/views/settings/BrandPreviewCard.d.ts +5 -0
- package/dist/views/settings/BrandPreviewCard.d.ts.map +1 -0
- package/dist/views/settings/BrandPreviewCard.js +18 -0
- package/dist/views/settings/BrandPreviewCard.js.map +1 -0
- package/dist/views/settings/BrandingCard.d.ts +6 -0
- package/dist/views/settings/BrandingCard.d.ts.map +1 -0
- package/dist/views/settings/BrandingCard.js +38 -0
- package/dist/views/settings/BrandingCard.js.map +1 -0
- package/dist/views/settings/GeneralSettingsTab.d.ts +7 -0
- package/dist/views/settings/GeneralSettingsTab.d.ts.map +1 -0
- package/dist/views/settings/GeneralSettingsTab.js +19 -0
- package/dist/views/settings/GeneralSettingsTab.js.map +1 -0
- package/dist/views/settings/LanguageRegionCard.d.ts +10 -0
- package/dist/views/settings/LanguageRegionCard.d.ts.map +1 -0
- package/dist/views/settings/LanguageRegionCard.js +48 -0
- package/dist/views/settings/LanguageRegionCard.js.map +1 -0
- package/dist/views/settings/SeoRobotsDefaultsCard.d.ts +12 -0
- package/dist/views/settings/SeoRobotsDefaultsCard.d.ts.map +1 -0
- package/dist/views/settings/SeoRobotsDefaultsCard.js +45 -0
- package/dist/views/settings/SeoRobotsDefaultsCard.js.map +1 -0
- package/dist/views/settings/SiteIndexStatusCard.d.ts +12 -0
- package/dist/views/settings/SiteIndexStatusCard.d.ts.map +1 -0
- package/dist/views/settings/SiteIndexStatusCard.js +51 -0
- package/dist/views/settings/SiteIndexStatusCard.js.map +1 -0
- package/dist/views/settings/SiteInformationCard.d.ts +11 -0
- package/dist/views/settings/SiteInformationCard.d.ts.map +1 -0
- package/dist/views/settings/SiteInformationCard.js +21 -0
- package/dist/views/settings/SiteInformationCard.js.map +1 -0
- package/dist/views/settings/TypographyMotionCard.d.ts +6 -0
- package/dist/views/settings/TypographyMotionCard.d.ts.map +1 -0
- package/dist/views/settings/TypographyMotionCard.js +8 -0
- package/dist/views/settings/TypographyMotionCard.js.map +1 -0
- package/dist/views/settings/components.d.ts +38 -0
- package/dist/views/settings/components.d.ts.map +1 -0
- package/dist/views/settings/components.js +43 -0
- package/dist/views/settings/components.js.map +1 -0
- package/dist/views/settings/useAppearanceSettings.d.ts +69 -0
- package/dist/views/settings/useAppearanceSettings.d.ts.map +1 -0
- package/dist/views/settings/useAppearanceSettings.js +344 -0
- package/dist/views/settings/useAppearanceSettings.js.map +1 -0
- package/dist/views/settings/useGeneralSettings.d.ts +82 -0
- package/dist/views/settings/useGeneralSettings.d.ts.map +1 -0
- package/dist/views/settings/useGeneralSettings.js +286 -0
- package/dist/views/settings/useGeneralSettings.js.map +1 -0
- package/package.json +3 -3
- package/src/AdminRoot.tsx +5 -3
- package/src/__tests__/views/appearance-settings.render.test.tsx +132 -0
- package/src/__tests__/views/general-settings.render.test.tsx +135 -0
- package/src/components/ThemeProvider.tsx +249 -36
- package/src/layout/Sidebar.tsx +81 -13
- package/src/styles/theme.css +32 -2
- package/src/views/Settings.tsx +19 -155
- package/src/views/settings/AdminThemeCard.tsx +145 -0
- package/src/views/settings/AppearanceTab.tsx +81 -0
- package/src/views/settings/BrandPreviewCard.tsx +125 -0
- package/src/views/settings/BrandingCard.tsx +332 -0
- package/src/views/settings/GeneralSettingsTab.tsx +126 -0
- package/src/views/settings/LanguageRegionCard.tsx +119 -0
- package/src/views/settings/SeoRobotsDefaultsCard.tsx +149 -0
- package/src/views/settings/SiteIndexStatusCard.tsx +184 -0
- package/src/views/settings/SiteInformationCard.tsx +122 -0
- package/src/views/settings/TypographyMotionCard.tsx +65 -0
- package/src/views/settings/components.tsx +198 -0
- package/src/views/settings/useAppearanceSettings.ts +513 -0
- package/src/views/settings/useGeneralSettings.ts +379 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useMemo } from 'react';
|
|
4
|
+
const INPUT_CLASS = 'w-full rounded-md border border-border bg-input-background px-3 py-2 text-base text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
|
|
5
|
+
const LABEL_CLASS = 'mb-1 block text-sm font-medium text-foreground';
|
|
6
|
+
const LANGUAGES = [
|
|
7
|
+
{ value: 'en-US', label: 'English (US)' },
|
|
8
|
+
{ value: 'en-GB', label: 'English (UK)' },
|
|
9
|
+
{ value: 'es-ES', label: 'Spanish (Spain)' },
|
|
10
|
+
{ value: 'es-MX', label: 'Spanish (Mexico)' },
|
|
11
|
+
{ value: 'fr-FR', label: 'French (France)' },
|
|
12
|
+
{ value: 'de-DE', label: 'German (Germany)' },
|
|
13
|
+
{ value: 'en', label: 'English' },
|
|
14
|
+
];
|
|
15
|
+
const TIMEZONES = [
|
|
16
|
+
'UTC',
|
|
17
|
+
'America/New_York',
|
|
18
|
+
'America/Chicago',
|
|
19
|
+
'America/Denver',
|
|
20
|
+
'America/Los_Angeles',
|
|
21
|
+
'America/Anchorage',
|
|
22
|
+
'Europe/London',
|
|
23
|
+
'Europe/Paris',
|
|
24
|
+
'Europe/Berlin',
|
|
25
|
+
'Asia/Tokyo',
|
|
26
|
+
'Asia/Singapore',
|
|
27
|
+
'Australia/Sydney',
|
|
28
|
+
];
|
|
29
|
+
export function LanguageRegionCard({ form, setField, issues, canEdit }) {
|
|
30
|
+
const langId = useId();
|
|
31
|
+
const tzId = useId();
|
|
32
|
+
const langIssue = issues.find((i) => i.field === 'language');
|
|
33
|
+
const tzIssue = issues.find((i) => i.field === 'timezone');
|
|
34
|
+
// Surface the loaded value even when it isn't one of our presets, so a
|
|
35
|
+
// seeded/config value is never silently dropped from the select.
|
|
36
|
+
const languageOptions = useMemo(() => {
|
|
37
|
+
if (LANGUAGES.some((l) => l.value === form.language))
|
|
38
|
+
return LANGUAGES;
|
|
39
|
+
return [{ value: form.language, label: form.language }, ...LANGUAGES];
|
|
40
|
+
}, [form.language]);
|
|
41
|
+
const timezoneOptions = useMemo(() => {
|
|
42
|
+
if (TIMEZONES.includes(form.timezone))
|
|
43
|
+
return TIMEZONES;
|
|
44
|
+
return [form.timezone, ...TIMEZONES];
|
|
45
|
+
}, [form.timezone]);
|
|
46
|
+
return (_jsxs("section", { "aria-labelledby": `${langId}-heading`, className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h3", { id: `${langId}-heading`, className: "text-foreground mb-4 text-base font-medium", children: "Language & Region" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: langId, className: LABEL_CLASS, children: "Language" }), _jsx("select", { id: langId, value: form.language, disabled: !canEdit, "aria-invalid": Boolean(langIssue), onChange: (e) => setField('language', e.target.value), className: INPUT_CLASS, children: languageOptions.map((l) => (_jsx("option", { value: l.value, children: l.label }, l.value))) }), langIssue && _jsx("p", { className: "text-destructive mt-1 text-sm", children: langIssue.message })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: tzId, className: LABEL_CLASS, children: "Timezone" }), _jsx("select", { id: tzId, value: form.timezone, disabled: !canEdit, "aria-invalid": Boolean(tzIssue), onChange: (e) => setField('timezone', e.target.value), className: INPUT_CLASS, children: timezoneOptions.map((tz) => (_jsx("option", { value: tz, children: tz }, tz))) }), tzIssue ? (_jsx("p", { className: "text-destructive mt-1 text-sm", children: tzIssue.message })) : (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Applied to dashboard dates, audit logs, scheduled publishing, and form submissions." }))] })] })] }));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=LanguageRegionCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LanguageRegionCard.js","sourceRoot":"","sources":["../../../src/views/settings/LanguageRegionCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GeneralSettingsForm, SiteIndexStatus } from './useGeneralSettings.js';
|
|
2
|
+
interface SeoRobotsDefaultsCardProps {
|
|
3
|
+
form: GeneralSettingsForm;
|
|
4
|
+
setField: <K extends keyof GeneralSettingsForm>(key: K, value: GeneralSettingsForm[K]) => void;
|
|
5
|
+
isProduction: boolean;
|
|
6
|
+
indexStatus: SiteIndexStatus | null;
|
|
7
|
+
canEdit: boolean;
|
|
8
|
+
onNavigate?: (path: string) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function SeoRobotsDefaultsCard({ form, setField, isProduction, indexStatus, canEdit, onNavigate, }: SeoRobotsDefaultsCardProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=SeoRobotsDefaultsCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeoRobotsDefaultsCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SeoRobotsDefaultsCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEnF,UAAU,0BAA0B;IAClC,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9F,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,eAAe,GAAG,IAAI,CAAA;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAUD,wBAAgB,qBAAqB,CAAC,EACpC,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,OAAO,EACP,UAAU,GACX,EAAE,0BAA0B,2CA2G5B"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId, useState } from 'react';
|
|
4
|
+
import { ConfirmDangerousSettingDialog, SettingsToggleRow } from './components.js';
|
|
5
|
+
export function SeoRobotsDefaultsCard({ form, setField, isProduction, indexStatus, canEdit, onNavigate, }) {
|
|
6
|
+
const headingId = useId();
|
|
7
|
+
const [pending, setPending] = useState(null);
|
|
8
|
+
// Some toggles can take the whole production site out of search results, so
|
|
9
|
+
// they route through a confirmation step before being applied.
|
|
10
|
+
function requestToggle(field, value) {
|
|
11
|
+
if (field === 'defaultNoIndex' && value && isProduction) {
|
|
12
|
+
setPending({
|
|
13
|
+
field,
|
|
14
|
+
value,
|
|
15
|
+
title: 'Block this production site from search engines?',
|
|
16
|
+
description: 'This may prevent search engines from indexing your production site. Pages will be served with a noindex directive unless they explicitly opt in.',
|
|
17
|
+
confirmLabel: 'Enable No Index',
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (field === 'noIndexNonProduction' && !value) {
|
|
22
|
+
setPending({
|
|
23
|
+
field,
|
|
24
|
+
value,
|
|
25
|
+
title: 'Allow non-production environments to be indexed?',
|
|
26
|
+
description: 'Preview and staging environments may become indexable if publicly accessible. Search engines could index unfinished content.',
|
|
27
|
+
confirmLabel: 'Turn Off',
|
|
28
|
+
});
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
setField(field, value);
|
|
32
|
+
}
|
|
33
|
+
const effectiveProd = form.defaultNoIndex ? 'Blocked' : 'Indexable';
|
|
34
|
+
const sitemapCheck = indexStatus?.checks.find((c) => c.key === 'sitemap');
|
|
35
|
+
const sitemapStatus = sitemapCheck ? (sitemapCheck.value === 'Yes' ? 'Enabled' : 'Disabled') : '—';
|
|
36
|
+
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: "SEO & Robots Defaults" }), _jsx("p", { className: "text-muted-foreground mb-4 text-sm", children: "Set the site-wide default for search engine indexing. Individual pages can inherit or override these rules in their SEO panel. These share the same configuration as the SEO section." }), _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Default No Index", description: "Ask search engines not to index pages unless a page explicitly allows indexing.", checked: form.defaultNoIndex, disabled: !canEdit, onChange: (v) => requestToggle('defaultNoIndex', v) }), _jsx(SettingsToggleRow, { label: "Default No Follow", description: "Ask search engines not to follow page links unless a page explicitly allows following.", checked: form.defaultNoFollow, disabled: !canEdit, onChange: (v) => requestToggle('defaultNoFollow', v) }), _jsx(SettingsToggleRow, { label: "Noindex Non-Production Environments", description: "Force noindex when the deployed environment is not production.", checked: form.noIndexNonProduction, disabled: !canEdit, onChange: (v) => requestToggle('noIndexNonProduction', v) })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsx(SummaryRow, { label: "Effective production indexing", value: effectiveProd, danger: form.defaultNoIndex }), _jsx(SummaryRow, { label: "Effective current environment", value: indexStatus?.label ?? '—', danger: indexStatus?.severity === 'danger' }), _jsx(SummaryRow, { label: "Sitemap status", value: sitemapStatus }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/seo?tab=technical'), className: "text-brand mt-1 text-sm hover:underline", children: "Manage advanced robots.txt & sitemap in SEO \u2192" }))] }), _jsx(ConfirmDangerousSettingDialog, { open: pending !== null, title: pending?.title ?? '', description: pending?.description ?? '', confirmLabel: pending?.confirmLabel, onConfirm: () => {
|
|
37
|
+
if (pending)
|
|
38
|
+
setField(pending.field, pending.value);
|
|
39
|
+
setPending(null);
|
|
40
|
+
}, onCancel: () => setPending(null) })] }));
|
|
41
|
+
}
|
|
42
|
+
function SummaryRow({ label, value, danger }) {
|
|
43
|
+
return (_jsxs("div", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsx("span", { className: "text-muted-foreground", children: label }), _jsx("span", { className: danger ? 'text-destructive font-medium' : 'text-foreground font-medium', children: value })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=SeoRobotsDefaultsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeoRobotsDefaultsCard.js","sourceRoot":"","sources":["../../../src/views/settings/SeoRobotsDefaultsCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SiteIndexStatus } from './useGeneralSettings.js';
|
|
2
|
+
interface SiteIndexStatusCardProps {
|
|
3
|
+
status: SiteIndexStatus | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
/** Resolve an action href relative to the admin (e.g. /seo?tab=audit). */
|
|
6
|
+
onNavigate?: (path: string) => void;
|
|
7
|
+
/** Trigger the SEO audit flow when an action declares `action: run_seo_audit`. */
|
|
8
|
+
onRunAudit?: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function SiteIndexStatusCard({ status, loading, onNavigate, onRunAudit, }: SiteIndexStatusCardProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=SiteIndexStatusCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteIndexStatusCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SiteIndexStatusCard.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAE9D,UAAU,wBAAwB;IAChC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;CACxB;AAmCD,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,OAAO,EACP,UAAU,EACV,UAAU,GACX,EAAE,wBAAwB,2CAuE1B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { CheckCircle2, XCircle, AlertTriangle, HelpCircle, ShieldCheck, ExternalLink, Search, } from 'lucide-react';
|
|
4
|
+
const SEVERITY_STYLES = {
|
|
5
|
+
success: {
|
|
6
|
+
pill: 'bg-success/15 text-success border-success/30',
|
|
7
|
+
icon: _jsx(CheckCircle2, { size: 14, "aria-hidden": "true" }),
|
|
8
|
+
},
|
|
9
|
+
warning: {
|
|
10
|
+
pill: 'bg-warning/15 text-warning border-warning/30',
|
|
11
|
+
icon: _jsx(AlertTriangle, { size: 14, "aria-hidden": "true" }),
|
|
12
|
+
},
|
|
13
|
+
danger: {
|
|
14
|
+
pill: 'bg-destructive/10 text-destructive border-destructive/30',
|
|
15
|
+
icon: _jsx(XCircle, { size: 14, "aria-hidden": "true" }),
|
|
16
|
+
},
|
|
17
|
+
neutral: {
|
|
18
|
+
pill: 'bg-muted text-muted-foreground border-border',
|
|
19
|
+
icon: _jsx(HelpCircle, { size: 14, "aria-hidden": "true" }),
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const CHECK_ICON = {
|
|
23
|
+
pass: _jsx(CheckCircle2, { size: 14, className: "text-success", "aria-hidden": "true" }),
|
|
24
|
+
warning: _jsx(AlertTriangle, { size: 14, className: "text-warning", "aria-hidden": "true" }),
|
|
25
|
+
fail: _jsx(XCircle, { size: 14, className: "text-destructive", "aria-hidden": "true" }),
|
|
26
|
+
unknown: _jsx(HelpCircle, { size: 14, className: "text-muted-foreground", "aria-hidden": "true" }),
|
|
27
|
+
};
|
|
28
|
+
const CHECK_SR = {
|
|
29
|
+
pass: 'OK',
|
|
30
|
+
warning: 'Warning',
|
|
31
|
+
fail: 'Problem',
|
|
32
|
+
unknown: 'Unknown',
|
|
33
|
+
};
|
|
34
|
+
export function SiteIndexStatusCard({ status, loading, onNavigate, onRunAudit, }) {
|
|
35
|
+
return (_jsxs("section", { "aria-labelledby": "site-index-status-heading", className: "border-border bg-card rounded-lg border p-4", children: [_jsxs("div", { className: "mb-3 flex items-start justify-between gap-3", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(ShieldCheck, { size: 18, className: "text-muted-foreground mt-0.5", "aria-hidden": "true" }), _jsxs("div", { children: [_jsx("h3", { id: "site-index-status-heading", className: "text-foreground text-base font-medium", children: "Site Index Status" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "Current effective crawl and indexing state" })] })] }), status && (_jsxs("span", { className: `inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium ${SEVERITY_STYLES[status.severity].pill}`, children: [SEVERITY_STYLES[status.severity].icon, _jsx("span", { className: "sr-only", children: "Status: " }), status.label] }))] }), loading && !status ? (_jsxs("div", { className: "space-y-2", "aria-hidden": "true", children: [_jsx("div", { className: "bg-muted h-4 w-2/3 animate-pulse rounded" }), _jsx("div", { className: "bg-muted h-20 w-full animate-pulse rounded" })] })) : !status ? (_jsx("p", { className: "text-muted-foreground text-sm", children: "Index status is unavailable." })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-muted-foreground mb-3 text-sm", children: status.description }), _jsx("dl", { className: "border-border grid grid-cols-1 gap-x-6 gap-y-2 rounded-md border p-3 sm:grid-cols-2", children: status.checks.map((check) => (_jsxs("div", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsx("dt", { className: "text-muted-foreground", children: check.label }), _jsxs("dd", { className: "text-foreground flex items-center gap-1.5 font-medium", children: [_jsxs("span", { className: "sr-only", children: [CHECK_SR[check.status], ": "] }), CHECK_ICON[check.status], check.value] })] }, check.key))) }), status.actions.length > 0 && (_jsx("div", { className: "mt-3 flex flex-wrap gap-2", children: status.actions.map((action) => (_jsx(SiteIndexAction, { label: action.label, href: action.href, action: action.action, onNavigate: onNavigate, onRunAudit: onRunAudit }, action.label))) }))] }))] }));
|
|
36
|
+
}
|
|
37
|
+
function SiteIndexAction({ label, href, action, onNavigate, onRunAudit, }) {
|
|
38
|
+
const className = 'border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-sm transition-colors';
|
|
39
|
+
// The audit action stays in-app; robots/sitemap are real public URLs.
|
|
40
|
+
const isAudit = action === 'run_seo_audit';
|
|
41
|
+
const isAdminRoute = href?.startsWith('/seo');
|
|
42
|
+
const icon = isAudit ? (_jsx(Search, { size: 14, "aria-hidden": "true" })) : (_jsx(ExternalLink, { size: 14, "aria-hidden": "true" }));
|
|
43
|
+
if (isAudit && onRunAudit) {
|
|
44
|
+
return (_jsxs("button", { type: "button", onClick: onRunAudit, className: className, children: [icon, label] }));
|
|
45
|
+
}
|
|
46
|
+
if (isAdminRoute && onNavigate) {
|
|
47
|
+
return (_jsxs("button", { type: "button", onClick: () => onNavigate(href), className: className, children: [icon, label] }));
|
|
48
|
+
}
|
|
49
|
+
return (_jsxs("a", { href: href, target: "_blank", rel: "noopener noreferrer", className: className, children: [icon, label] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=SiteIndexStatusCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteIndexStatusCard.js","sourceRoot":"","sources":["../../../src/views/settings/SiteIndexStatusCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GeneralSettingsForm, SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js';
|
|
2
|
+
interface SiteInformationCardProps {
|
|
3
|
+
form: GeneralSettingsForm;
|
|
4
|
+
setField: <K extends keyof GeneralSettingsForm>(key: K, value: GeneralSettingsForm[K]) => void;
|
|
5
|
+
sources: Record<string, SettingsSourceMetadata>;
|
|
6
|
+
issues: ValidationIssue[];
|
|
7
|
+
canEdit: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function SiteInformationCard({ form, setField, sources, issues, canEdit, }: SiteInformationCardProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=SiteInformationCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteInformationCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SiteInformationCard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAMhC,UAAU,wBAAwB;IAChC,IAAI,EAAE,mBAAmB,CAAA;IACzB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9F,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAA;IAC/C,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,GACR,EAAE,wBAAwB,2CA4F1B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useId } from 'react';
|
|
4
|
+
import { CheckCircle2 } from 'lucide-react';
|
|
5
|
+
import { SettingsSourceBadge } from './components.js';
|
|
6
|
+
const INPUT_CLASS = 'w-full rounded-md border border-border bg-input-background px-3 py-2 text-base text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
|
|
7
|
+
const LABEL_CLASS = 'mb-1 flex items-center gap-2 text-sm font-medium text-foreground';
|
|
8
|
+
export function SiteInformationCard({ form, setField, sources, issues, canEdit, }) {
|
|
9
|
+
const titleId = useId();
|
|
10
|
+
const taglineId = useId();
|
|
11
|
+
const urlId = useId();
|
|
12
|
+
const urlErrId = useId();
|
|
13
|
+
const titleIssue = issues.find((i) => i.field === 'siteTitle');
|
|
14
|
+
const urlIssue = issues.find((i) => i.field === 'siteUrl');
|
|
15
|
+
const urlEditable = sources.siteUrl?.editable !== false && canEdit;
|
|
16
|
+
const urlValid = !urlIssue && form.siteUrl.trim().length > 0;
|
|
17
|
+
return (_jsxs("section", { "aria-labelledby": `${titleId}-heading`, className: "border-border bg-card rounded-lg border p-4", children: [_jsx("h3", { id: `${titleId}-heading`, className: "text-foreground mb-4 text-base font-medium", children: "Site Information" }), _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: titleId, className: LABEL_CLASS, children: "Site Title" }), _jsx("input", { id: titleId, type: "text", value: form.siteTitle, disabled: !canEdit, "aria-invalid": titleIssue?.severity === 'error', onChange: (e) => setField('siteTitle', e.target.value), className: INPUT_CLASS }), titleIssue && _jsx("p", { className: "text-destructive mt-1 text-sm", children: titleIssue.message })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: taglineId, className: LABEL_CLASS, children: "Tagline" }), _jsx("input", { id: taglineId, type: "text", value: form.tagline, disabled: !canEdit, onChange: (e) => setField('tagline', e.target.value), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: urlId, className: LABEL_CLASS, children: ["Site URL", _jsx(SettingsSourceBadge, { meta: sources.siteUrl })] }), _jsx("input", { id: urlId, type: "url", inputMode: "url", placeholder: "https://example.com", value: form.siteUrl, disabled: !urlEditable, "aria-invalid": urlIssue?.severity === 'error', "aria-describedby": urlIssue ? urlErrId : undefined, onChange: (e) => setField('siteUrl', e.target.value), className: INPUT_CLASS }), urlIssue ? (_jsx("p", { id: urlErrId, className: urlIssue.severity === 'error'
|
|
18
|
+
? 'text-destructive mt-1 text-sm'
|
|
19
|
+
: 'text-warning mt-1 text-sm', children: urlIssue.message })) : urlValid ? (_jsxs("p", { className: "text-muted-foreground mt-1 flex items-center gap-1.5 text-sm", children: [_jsx(CheckCircle2, { size: 13, className: "text-success", "aria-hidden": "true" }), "Valid \u2014 used for canonical URLs, sitemap, robots.txt, and Open Graph."] })) : (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Used for canonical URLs, sitemap, robots.txt, and Open Graph fallbacks." }))] })] })] }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=SiteInformationCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SiteInformationCard.js","sourceRoot":"","sources":["../../../src/views/settings/SiteInformationCard.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,38 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { SettingsSourceMetadata, ValidationIssue } from './useGeneralSettings.js';
|
|
3
|
+
/** Small badge showing where a setting's value comes from. */
|
|
4
|
+
export declare function SettingsSourceBadge({ meta }: {
|
|
5
|
+
meta?: SettingsSourceMetadata;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
+
/** A labelled switch row with description, used for the SEO defaults. */
|
|
8
|
+
export declare function SettingsToggleRow({ label, description, checked, onChange, disabled, badge, }: {
|
|
9
|
+
label: string;
|
|
10
|
+
description: string;
|
|
11
|
+
checked: boolean;
|
|
12
|
+
onChange: (value: boolean) => void;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
badge?: ReactNode;
|
|
15
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/** Aggregated validation messages shown above the cards. */
|
|
17
|
+
export declare function SettingsValidationSummary({ issues }: {
|
|
18
|
+
issues: ValidationIssue[];
|
|
19
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
20
|
+
/** Sticky footer with Reset + Save, gated on dirty state. */
|
|
21
|
+
export declare function SettingsSaveBar({ dirty, canEdit, hasErrors, saveState, onSave, onReset, }: {
|
|
22
|
+
dirty: boolean;
|
|
23
|
+
canEdit: boolean;
|
|
24
|
+
hasErrors: boolean;
|
|
25
|
+
saveState: 'idle' | 'saving' | 'success' | 'error';
|
|
26
|
+
onSave: () => void;
|
|
27
|
+
onReset: () => void;
|
|
28
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
/** Confirmation dialog for dangerous indexing changes. */
|
|
30
|
+
export declare function ConfirmDangerousSettingDialog({ open, title, description, confirmLabel, onConfirm, onCancel, }: {
|
|
31
|
+
open: boolean;
|
|
32
|
+
title: string;
|
|
33
|
+
description: string;
|
|
34
|
+
confirmLabel?: string;
|
|
35
|
+
onConfirm: () => void;
|
|
36
|
+
onCancel: () => void;
|
|
37
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/views/settings/components.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAUtF,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,sBAAsB,CAAA;CAAE,kDAY9E;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAW,EACX,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,2CA6BA;AAED,4DAA4D;AAC5D,wBAAgB,yBAAyB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,kDAuBlF;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,EACN,OAAO,GACR,EAAE;IACD,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;IAClD,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,2CA4BA;AAED,0DAA0D;AAC1D,wBAAgB,6BAA6B,CAAC,EAC5C,IAAI,EACJ,KAAK,EACL,WAAW,EACX,YAAyB,EACzB,SAAS,EACT,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,2CAmCA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as Dialog from '@radix-ui/react-dialog';
|
|
4
|
+
import { AlertTriangle, Check, Loader2, Lock } from 'lucide-react';
|
|
5
|
+
const SOURCE_LABEL = {
|
|
6
|
+
config: 'Config-managed',
|
|
7
|
+
environment: 'Environment-managed',
|
|
8
|
+
database: 'Editable',
|
|
9
|
+
plugin: 'Plugin setting',
|
|
10
|
+
computed: 'Computed',
|
|
11
|
+
};
|
|
12
|
+
/** Small badge showing where a setting's value comes from. */
|
|
13
|
+
export function SettingsSourceBadge({ meta }) {
|
|
14
|
+
if (!meta || (meta.source === 'database' && meta.editable))
|
|
15
|
+
return null;
|
|
16
|
+
const locked = !meta.editable;
|
|
17
|
+
return (_jsxs("span", { className: "text-muted-foreground border-border bg-muted inline-flex items-center gap-1 rounded-md border px-1.5 py-0.5 text-xs", title: meta.reason, children: [locked && _jsx(Lock, { size: 11, "aria-hidden": "true" }), SOURCE_LABEL[meta.source]] }));
|
|
18
|
+
}
|
|
19
|
+
/** A labelled switch row with description, used for the SEO defaults. */
|
|
20
|
+
export function SettingsToggleRow({ label, description, checked, onChange, disabled = false, badge, }) {
|
|
21
|
+
return (_jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-foreground text-base font-medium", children: label }), badge] }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: description })] }), _jsx("button", { type: "button", role: "switch", "aria-checked": checked, "aria-label": label, disabled: disabled, onClick: () => onChange(!checked), className: `focus-visible:ring-ring relative mt-0.5 h-6 w-11 shrink-0 rounded-full transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 ${checked ? 'bg-brand' : 'bg-switch-background'}`, children: _jsx("span", { className: `absolute top-0.5 block h-5 w-5 rounded-full bg-white shadow-sm transition-transform ${checked ? 'translate-x-[22px]' : 'translate-x-0.5'}` }) })] }));
|
|
22
|
+
}
|
|
23
|
+
/** Aggregated validation messages shown above the cards. */
|
|
24
|
+
export function SettingsValidationSummary({ issues }) {
|
|
25
|
+
if (issues.length === 0)
|
|
26
|
+
return null;
|
|
27
|
+
const errors = issues.filter((i) => i.severity === 'error');
|
|
28
|
+
const warnings = issues.filter((i) => i.severity === 'warning');
|
|
29
|
+
const isError = errors.length > 0;
|
|
30
|
+
return (_jsxs("div", { role: "alert", "aria-live": "polite", className: `flex items-start gap-3 rounded-lg border p-3 text-sm ${isError
|
|
31
|
+
? 'border-destructive/30 bg-destructive/10 text-destructive'
|
|
32
|
+
: 'border-warning/30 bg-warning/10 text-warning'}`, children: [_jsx(AlertTriangle, { size: 16, className: "mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("div", { className: "space-y-1", children: [...errors, ...warnings].map((issue, i) => (_jsx("p", { children: issue.message }, `${issue.field}-${i}`))) })] }));
|
|
33
|
+
}
|
|
34
|
+
/** Sticky footer with Reset + Save, gated on dirty state. */
|
|
35
|
+
export function SettingsSaveBar({ dirty, canEdit, hasErrors, saveState, onSave, onReset, }) {
|
|
36
|
+
const saving = saveState === 'saving';
|
|
37
|
+
return (_jsxs("div", { className: "border-border bg-background/80 sticky bottom-0 z-10 flex items-center justify-end gap-4 border-t py-3 backdrop-blur", children: [saveState === 'success' && !dirty && (_jsxs("span", { className: "text-success flex items-center gap-1.5 text-sm", "aria-live": "polite", children: [_jsx(Check, { size: 16, "aria-hidden": "true" }), " Saved"] })), _jsx("button", { type: "button", onClick: onReset, disabled: !dirty || saving, className: "text-muted-foreground hover:text-foreground rounded-md px-3 py-2 text-base transition-colors disabled:cursor-not-allowed disabled:opacity-40", children: "Reset" }), _jsxs("button", { type: "button", onClick: onSave, disabled: !canEdit || !dirty || hasErrors || saving, className: "bg-brand text-brand-foreground focus-visible:ring-ring inline-flex items-center gap-2 rounded-md px-5 py-2 text-base font-medium transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", children: [saving && _jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), saving ? 'Saving…' : 'Save Changes'] })] }));
|
|
38
|
+
}
|
|
39
|
+
/** Confirmation dialog for dangerous indexing changes. */
|
|
40
|
+
export function ConfirmDangerousSettingDialog({ open, title, description, confirmLabel = 'Continue', onConfirm, onCancel, }) {
|
|
41
|
+
return (_jsx(Dialog.Root, { open: open, onOpenChange: (o) => !o && onCancel(), children: _jsxs(Dialog.Portal, { children: [_jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/50" }), _jsxs(Dialog.Content, { className: "bg-card text-card-foreground fixed top-1/2 left-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg p-6 shadow-lg", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx("span", { className: "bg-warning/15 text-warning flex h-9 w-9 items-center justify-center rounded-full", children: _jsx(AlertTriangle, { size: 20, "aria-hidden": "true" }) }), _jsx(Dialog.Title, { className: "text-foreground text-lg font-medium", children: title })] }), _jsx(Dialog.Description, { className: "text-muted-foreground mb-5 text-sm", children: description }), _jsxs("div", { className: "flex items-center justify-end gap-3", children: [_jsx("button", { type: "button", onClick: onCancel, className: "border-border text-foreground hover:bg-accent rounded-md border px-4 py-2 text-base transition-colors", children: "Cancel" }), _jsx("button", { type: "button", onClick: onConfirm, className: "bg-destructive text-destructive-foreground rounded-md px-4 py-2 text-base font-medium transition-opacity hover:opacity-90", children: confirmLabel })] })] })] }) }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/views/settings/components.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|