@actuate-media/cms-admin 0.56.2 → 0.57.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 (72) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/__tests__/views/ai-settings.render.test.js +34 -0
  3. package/dist/__tests__/views/ai-settings.render.test.js.map +1 -1
  4. package/dist/actuate-admin.css +1 -1
  5. package/dist/components/AICoauthorBubbleMenu.d.ts.map +1 -1
  6. package/dist/components/AICoauthorBubbleMenu.js +5 -1
  7. package/dist/components/AICoauthorBubbleMenu.js.map +1 -1
  8. package/dist/components/BrandVoiceAlignmentBadge.d.ts +6 -0
  9. package/dist/components/BrandVoiceAlignmentBadge.d.ts.map +1 -0
  10. package/dist/components/BrandVoiceAlignmentBadge.js +11 -0
  11. package/dist/components/BrandVoiceAlignmentBadge.js.map +1 -0
  12. package/dist/components/CoauthorResultPopover.d.ts +5 -1
  13. package/dist/components/CoauthorResultPopover.d.ts.map +1 -1
  14. package/dist/components/CoauthorResultPopover.js +35 -6
  15. package/dist/components/CoauthorResultPopover.js.map +1 -1
  16. package/dist/components/CommandPalette.d.ts.map +1 -1
  17. package/dist/components/CommandPalette.js +5 -1
  18. package/dist/components/CommandPalette.js.map +1 -1
  19. package/dist/components/seo/SeoEditorDrawer.d.ts.map +1 -1
  20. package/dist/components/seo/SeoEditorDrawer.js +43 -2
  21. package/dist/components/seo/SeoEditorDrawer.js.map +1 -1
  22. package/dist/components/ui/Badge.d.ts +1 -1
  23. package/dist/lib/brand-voice-client.d.ts +21 -0
  24. package/dist/lib/brand-voice-client.d.ts.map +1 -0
  25. package/dist/lib/brand-voice-client.js +27 -0
  26. package/dist/lib/brand-voice-client.js.map +1 -0
  27. package/dist/lib/coauthor-client.d.ts +2 -0
  28. package/dist/lib/coauthor-client.d.ts.map +1 -1
  29. package/dist/lib/coauthor-client.js +1 -0
  30. package/dist/lib/coauthor-client.js.map +1 -1
  31. package/dist/lib/seo-service.d.ts +12 -0
  32. package/dist/lib/seo-service.d.ts.map +1 -1
  33. package/dist/lib/seo-service.js +0 -10
  34. package/dist/lib/seo-service.js.map +1 -1
  35. package/dist/views/Settings.js +1 -1
  36. package/dist/views/Settings.js.map +1 -1
  37. package/dist/views/settings/AISettingsTab.d.ts +3 -1
  38. package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
  39. package/dist/views/settings/AISettingsTab.js +2 -2
  40. package/dist/views/settings/AISettingsTab.js.map +1 -1
  41. package/dist/views/settings/BrandVoiceCard.d.ts +39 -2
  42. package/dist/views/settings/BrandVoiceCard.d.ts.map +1 -1
  43. package/dist/views/settings/BrandVoiceCard.js +215 -3
  44. package/dist/views/settings/BrandVoiceCard.js.map +1 -1
  45. package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.d.ts +13 -0
  46. package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.d.ts.map +1 -0
  47. package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.js +74 -0
  48. package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.js.map +1 -0
  49. package/dist/views/settings/brand-voice/BrandVoiceRulesSections.d.ts +7 -0
  50. package/dist/views/settings/brand-voice/BrandVoiceRulesSections.d.ts.map +1 -0
  51. package/dist/views/settings/brand-voice/BrandVoiceRulesSections.js +54 -0
  52. package/dist/views/settings/brand-voice/BrandVoiceRulesSections.js.map +1 -0
  53. package/dist/views/settings/useAiSettings.d.ts +32 -0
  54. package/dist/views/settings/useAiSettings.d.ts.map +1 -1
  55. package/dist/views/settings/useAiSettings.js +85 -3
  56. package/dist/views/settings/useAiSettings.js.map +1 -1
  57. package/package.json +2 -2
  58. package/src/__tests__/views/ai-settings.render.test.tsx +50 -0
  59. package/src/components/AICoauthorBubbleMenu.tsx +12 -0
  60. package/src/components/BrandVoiceAlignmentBadge.tsx +39 -0
  61. package/src/components/CoauthorResultPopover.tsx +62 -4
  62. package/src/components/CommandPalette.tsx +12 -0
  63. package/src/components/seo/SeoEditorDrawer.tsx +65 -1
  64. package/src/lib/brand-voice-client.ts +38 -0
  65. package/src/lib/coauthor-client.ts +4 -0
  66. package/src/lib/seo-service.ts +2 -0
  67. package/src/views/Settings.tsx +1 -1
  68. package/src/views/settings/AISettingsTab.tsx +13 -2
  69. package/src/views/settings/BrandVoiceCard.tsx +592 -76
  70. package/src/views/settings/brand-voice/BrandVoiceAlignmentPanel.tsx +205 -0
  71. package/src/views/settings/brand-voice/BrandVoiceRulesSections.tsx +321 -0
  72. package/src/views/settings/useAiSettings.ts +134 -3
@@ -1,25 +1,237 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useId } from 'react';
3
+ import { applyStructuredProfileToDocument, BRAND_VOICE_EXPORT_FILENAME, ensureBrandVoiceDocument, parseBrandVoiceDocument, parseStructuredProfile, } from '@actuate-media/cms-core/brand-voice';
4
+ import { Download, FileUp, Link2, Loader2, Sparkles } from 'lucide-react';
5
+ import { useCallback, useId, useMemo, useRef, useState } from 'react';
6
+ import { toast } from 'sonner';
7
+ import { BrandVoiceAlignmentPanel } from './brand-voice/BrandVoiceAlignmentPanel.js';
8
+ import { BrandVoiceRulesSections } from './brand-voice/BrandVoiceRulesSections.js';
4
9
  import { SettingsCard, SettingsToggleRow } from './components.js';
5
10
  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';
6
11
  const TEXTAREA_CLASS = `${INPUT_CLASS} min-h-[88px] resize-y`;
12
+ const DOCUMENT_TEXTAREA_CLASS = `${INPUT_CLASS} min-h-[280px] resize-y font-mono text-sm`;
7
13
  const LABEL_CLASS = 'mb-1 block text-sm font-medium text-foreground';
8
14
  const TONE_MAX = 400;
9
15
  const GUIDELINES_MAX = 2000;
10
16
  const SAMPLE_MAX = 2000;
17
+ function contentCollections(config) {
18
+ const cfg = config;
19
+ if (!cfg?.collections)
20
+ return [];
21
+ const raw = cfg.collections;
22
+ const list = Array.isArray(raw)
23
+ ? raw
24
+ : Object.values(raw);
25
+ return list
26
+ .filter((c) => (c.type === 'page' || c.type === 'post') && !c.admin?.hidden && c.slug)
27
+ .map((c) => ({
28
+ slug: c.slug,
29
+ label: c.labels?.plural ?? c.slug.charAt(0).toUpperCase() + c.slug.slice(1),
30
+ }));
31
+ }
32
+ function downloadTextFile(filename, contents) {
33
+ const blob = new Blob([contents], { type: 'text/markdown;charset=utf-8' });
34
+ const url = URL.createObjectURL(blob);
35
+ const anchor = document.createElement('a');
36
+ anchor.href = url;
37
+ anchor.download = filename;
38
+ anchor.click();
39
+ URL.revokeObjectURL(url);
40
+ }
11
41
  /**
12
42
  * Brand voice — a reusable description of how generated copy should sound. When
13
43
  * enabled, it is injected into the system prompt of content-generation features
14
44
  * (co-author, SEO titles/descriptions) so every AI surface writes on-brand.
15
45
  */
16
- export function BrandVoiceCard({ value, canEdit, onChange, }) {
46
+ export function BrandVoiceCard({ value, canEdit, onChange, config, onAnalyze, onScore, editMode, onEditModeChange, }) {
17
47
  const nameId = useId();
18
48
  const toneId = useId();
19
49
  const audienceId = useId();
20
50
  const guidelinesId = useId();
21
51
  const sampleId = useId();
52
+ const documentId = useId();
53
+ const generatePanelId = useId();
54
+ const importInputId = useId();
55
+ const urlInputId = useId();
56
+ const uploadInputId = useId();
57
+ const importRef = useRef(null);
58
+ const uploadRef = useRef(null);
22
59
  const disabled = !canEdit;
23
- return (_jsx(SettingsCard, { title: "Brand voice", description: "Teach the AI how your brand sounds. Applied to content writing and SEO copy.", children: _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Apply brand voice", description: "When on, generated copy follows the tone and guidelines below.", checked: value.enabled, disabled: disabled, onChange: (v) => onChange({ enabled: v }) }), _jsxs("div", { className: "border-border space-y-4 border-t pt-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: nameId, className: LABEL_CLASS, children: "Name" }), _jsx("input", { id: nameId, type: "text", value: value.name, disabled: disabled, placeholder: "e.g. Acme Marketing", onChange: (e) => onChange({ name: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: toneId, className: LABEL_CLASS, children: "Tone" }), _jsx("input", { id: toneId, type: "text", value: value.tone, disabled: disabled, maxLength: TONE_MAX, placeholder: "e.g. confident, warm, plain-spoken", onChange: (e) => onChange({ tone: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: audienceId, className: LABEL_CLASS, children: ["Audience ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("input", { id: audienceId, type: "text", value: value.audience, disabled: disabled, placeholder: "e.g. busy IT directors at mid-market SaaS companies", onChange: (e) => onChange({ audience: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: guidelinesId, className: LABEL_CLASS, children: ["Guidelines ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: guidelinesId, value: value.guidelines, disabled: disabled, maxLength: GUIDELINES_MAX, placeholder: 'Do: lead with the benefit, use active voice.\nDon\u2019t: use jargon, exclamation points, or hype.', onChange: (e) => onChange({ guidelines: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.guidelines.length, "/", GUIDELINES_MAX] })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: sampleId, className: LABEL_CLASS, children: ["Sample copy ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: sampleId, value: value.sampleText, disabled: disabled, maxLength: SAMPLE_MAX, placeholder: "Paste a paragraph of on-brand copy the AI can pattern-match against.", onChange: (e) => onChange({ sampleText: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.sampleText.length, "/", SAMPLE_MAX] })] })] })] }) }));
60
+ const collections = useMemo(() => contentCollections(config), [config]);
61
+ const [selectedCollections, setSelectedCollections] = useState(() => collections.map((c) => c.slug));
62
+ const [analyzing, setAnalyzing] = useState(false);
63
+ const [lastSampleCount, setLastSampleCount] = useState(null);
64
+ const [urlInput, setUrlInput] = useState('');
65
+ const [uploads, setUploads] = useState([]);
66
+ const [importError, setImportError] = useState(null);
67
+ const showAdvanced = editMode === 'document';
68
+ const handleStructuredChange = useCallback((structured) => {
69
+ const document = applyStructuredProfileToDocument(value.document.trim() || ensureBrandVoiceDocument(value), structured);
70
+ const sampleText = structured.workedExamples.find((example) => example.onBrand.trim())?.onBrand ??
71
+ value.sampleText;
72
+ onChange({ structured, document, sampleText });
73
+ }, [onChange, value]);
74
+ const toggleCollection = useCallback((slug, checked) => {
75
+ setSelectedCollections((prev) => {
76
+ if (checked)
77
+ return prev.includes(slug) ? prev : [...prev, slug];
78
+ return prev.filter((s) => s !== slug);
79
+ });
80
+ }, []);
81
+ const parsedUrls = useMemo(() => urlInput
82
+ .split('\n')
83
+ .map((line) => line.trim())
84
+ .filter(Boolean)
85
+ .slice(0, 5), [urlInput]);
86
+ const canAnalyze = !disabled &&
87
+ !analyzing &&
88
+ (selectedCollections.length > 0 || parsedUrls.length > 0 || uploads.length > 0);
89
+ const handleAnalyze = useCallback(async () => {
90
+ if (!onAnalyze || !canAnalyze)
91
+ return;
92
+ setAnalyzing(true);
93
+ setLastSampleCount(null);
94
+ try {
95
+ const res = await onAnalyze({
96
+ collections: selectedCollections,
97
+ urls: parsedUrls.length ? parsedUrls : undefined,
98
+ uploads: uploads.length ? uploads : undefined,
99
+ });
100
+ if (!res.ok || !res.draft) {
101
+ toast.error(res.error ?? 'Brand voice analysis failed.');
102
+ return;
103
+ }
104
+ onChange({
105
+ ...res.draft,
106
+ enabled: value.enabled || true,
107
+ version: res.draft.version ?? 1,
108
+ status: res.draft.status ?? 'draft',
109
+ generatedFrom: res.draft.generatedFrom ?? [],
110
+ document: res.draft.document ?? '',
111
+ structured: res.draft.document?.trim()
112
+ ? parseStructuredProfile(res.draft.document)
113
+ : value.structured,
114
+ });
115
+ onEditModeChange('form');
116
+ setLastSampleCount(res.sampleCount ?? null);
117
+ toast.success(res.sampleCount
118
+ ? `Draft profile generated from ${res.sampleCount} content sample${res.sampleCount === 1 ? '' : 's'}. Review and save when ready.`
119
+ : 'Draft profile generated. Review and save when ready.');
120
+ }
121
+ finally {
122
+ setAnalyzing(false);
123
+ }
124
+ }, [
125
+ canAnalyze,
126
+ onAnalyze,
127
+ onChange,
128
+ onEditModeChange,
129
+ parsedUrls,
130
+ selectedCollections,
131
+ uploads,
132
+ value.enabled,
133
+ ]);
134
+ const handleExport = useCallback(() => {
135
+ const markdown = ensureBrandVoiceDocument(value);
136
+ downloadTextFile(BRAND_VOICE_EXPORT_FILENAME, markdown);
137
+ toast.success('Brand voice profile exported.');
138
+ }, [value]);
139
+ const handleImportFile = useCallback(async (file) => {
140
+ if (!file)
141
+ return;
142
+ setImportError(null);
143
+ try {
144
+ const text = await file.text();
145
+ const parsed = parseBrandVoiceDocument(text);
146
+ if (!parsed.ok) {
147
+ setImportError(parsed.error);
148
+ toast.error(parsed.error);
149
+ return;
150
+ }
151
+ onChange({
152
+ name: parsed.value.fields.name,
153
+ tone: parsed.value.fields.tone,
154
+ audience: parsed.value.fields.audience,
155
+ guidelines: parsed.value.fields.guidelines,
156
+ sampleText: parsed.value.fields.sampleText,
157
+ document: parsed.value.document,
158
+ version: parsed.value.meta.version,
159
+ status: parsed.value.meta.status,
160
+ generatedFrom: parsed.value.meta.generatedFrom,
161
+ structured: parseStructuredProfile(parsed.value.document),
162
+ enabled: value.enabled || true,
163
+ });
164
+ onEditModeChange('document');
165
+ toast.success('Profile imported. Review and save when ready.');
166
+ }
167
+ catch {
168
+ const message = 'Could not read the selected file.';
169
+ setImportError(message);
170
+ toast.error(message);
171
+ }
172
+ finally {
173
+ if (importRef.current)
174
+ importRef.current.value = '';
175
+ }
176
+ }, [onChange, onEditModeChange, value.enabled]);
177
+ const openAdvanced = useCallback(() => {
178
+ onEditModeChange('document');
179
+ if (!value.document.trim()) {
180
+ onChange({ document: ensureBrandVoiceDocument(value) });
181
+ }
182
+ }, [onChange, onEditModeChange, value]);
183
+ const applyDocumentToFields = useCallback(() => {
184
+ const parsed = parseBrandVoiceDocument(value.document);
185
+ if (!parsed.ok) {
186
+ setImportError(parsed.error);
187
+ toast.error(parsed.error);
188
+ return;
189
+ }
190
+ setImportError(null);
191
+ onChange({
192
+ name: parsed.value.fields.name,
193
+ tone: parsed.value.fields.tone,
194
+ audience: parsed.value.fields.audience,
195
+ guidelines: parsed.value.fields.guidelines,
196
+ sampleText: parsed.value.fields.sampleText,
197
+ version: parsed.value.meta.version,
198
+ status: parsed.value.meta.status,
199
+ generatedFrom: parsed.value.meta.generatedFrom,
200
+ structured: parseStructuredProfile(value.document),
201
+ });
202
+ onEditModeChange('form');
203
+ toast.success('Quick-edit fields updated from the profile document.');
204
+ }, [onChange, onEditModeChange, value.document]);
205
+ const handleUploadFiles = useCallback(async (files) => {
206
+ if (!files?.length)
207
+ return;
208
+ const next = [];
209
+ for (const file of Array.from(files).slice(0, 5)) {
210
+ if (!file.type.startsWith('text/') &&
211
+ !file.name.endsWith('.md') &&
212
+ !file.name.endsWith('.txt')) {
213
+ toast.error(`Skipped ${file.name}: only text or markdown files are supported.`);
214
+ continue;
215
+ }
216
+ const text = await file.text();
217
+ if (!text.trim())
218
+ continue;
219
+ next.push({ name: file.name, text });
220
+ }
221
+ if (next.length === 0) {
222
+ toast.error('No readable text found in the selected files.');
223
+ return;
224
+ }
225
+ setUploads((prev) => [...prev, ...next].slice(0, 5));
226
+ toast.success(`Added ${next.length} upload${next.length === 1 ? '' : 's'}.`);
227
+ }, []);
228
+ return (_jsx(SettingsCard, { title: "Brand voice", description: "Teach the AI how your brand sounds. Applied to content writing and SEO copy.", children: _jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Apply brand voice", description: "When on, generated copy follows the tone and guidelines below.", checked: value.enabled, disabled: disabled, onChange: (v) => onChange({ enabled: v }) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("button", { type: "button", onClick: handleExport, disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(Download, { size: 14, "aria-hidden": "true" }), "Export .md"] }), _jsxs("button", { type: "button", onClick: () => importRef.current?.click(), disabled: disabled, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(FileUp, { size: 14, "aria-hidden": "true" }), "Import .md"] }), _jsx("input", { ref: importRef, id: importInputId, type: "file", accept: ".md,text/markdown,text/plain", className: "sr-only", disabled: disabled, onChange: (e) => void handleImportFile(e.target.files?.[0]) }), !showAdvanced ? (_jsx("button", { type: "button", onClick: openAdvanced, disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Advanced profile document" })) : (_jsx("button", { type: "button", onClick: () => onEditModeChange('form'), disabled: disabled, className: "text-primary hover:text-primary/80 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Back to quick edit" }))] }), importError && (_jsx("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-3 text-sm", children: importError })), onAnalyze && (_jsxs("div", { id: generatePanelId, className: "border-border space-y-3 rounded-md border border-dashed p-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-foreground text-base font-medium", children: "Generate from content" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Scan published pages and posts, public URLs, or uploaded text files to draft a profile you can edit before saving." })] }), collections.length > 0 && (_jsxs("fieldset", { className: "space-y-2", disabled: disabled || analyzing, children: [_jsx("legend", { className: "text-foreground mb-1 text-sm font-medium", children: "CMS collections" }), collections.map((col) => {
229
+ const inputId = `${generatePanelId}-${col.slug}`;
230
+ const checked = selectedCollections.includes(col.slug);
231
+ return (_jsxs("label", { htmlFor: inputId, className: "text-foreground flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { id: inputId, type: "checkbox", checked: checked, disabled: disabled || analyzing, onChange: (e) => toggleCollection(col.slug, e.target.checked), className: "border-border text-primary focus-visible:ring-ring size-4 rounded border focus-visible:ring-2 focus-visible:outline-none" }), col.label] }, col.slug));
232
+ })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: urlInputId, className: LABEL_CLASS, children: "Public URLs (optional)" }), _jsx("textarea", { id: urlInputId, value: urlInput, disabled: disabled || analyzing, placeholder: 'https://example.com/about\nOne URL per line, up to 5', onChange: (e) => setUrlInput(e.target.value), className: `${TEXTAREA_CLASS} min-h-[72px] font-mono text-sm` })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: uploadInputId, className: LABEL_CLASS, children: "Upload text files (optional)" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("button", { type: "button", disabled: disabled || analyzing || uploads.length >= 5, onClick: () => uploadRef.current?.click(), className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: [_jsx(FileUp, { size: 16, "aria-hidden": "true" }), "Choose files"] }), uploads.length > 0 && (_jsx("ul", { className: "text-muted-foreground text-sm", children: uploads.map((file) => (_jsxs("li", { className: "flex items-center gap-2", children: [_jsx(Link2, { size: 14, "aria-hidden": "true" }), file.name, _jsx("button", { type: "button", className: "text-primary text-xs", onClick: () => setUploads((prev) => prev.filter((u) => u.name !== file.name)), children: "Remove" })] }, file.name))) }))] }), _jsx("input", { ref: uploadRef, id: uploadInputId, type: "file", accept: ".txt,.md,text/plain,text/markdown", multiple: true, className: "sr-only", onChange: (e) => {
233
+ void handleUploadFiles(e.target.files);
234
+ e.target.value = '';
235
+ } })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("button", { type: "button", onClick: handleAnalyze, disabled: !canAnalyze, className: "bg-primary text-primary-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: [analyzing ? (_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Sparkles, { size: 16, "aria-hidden": "true" })), analyzing ? 'Analyzing…' : 'Analyze & draft profile'] }), lastSampleCount != null && (_jsxs("p", { className: "text-muted-foreground text-sm", "aria-live": "polite", children: ["Last run used ", lastSampleCount, " sample", lastSampleCount === 1 ? '' : 's', "."] }))] })] })), showAdvanced ? (_jsxs("div", { className: "border-border space-y-3 border-t pt-4", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-foreground text-base font-medium", children: "Profile document" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Portable markdown with YAML rules and human guidance. Saving uses this document as the source of truth." })] }), _jsxs("p", { className: "text-muted-foreground text-sm", children: ["v", value.version, " \u00B7 ", value.status] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: documentId, className: LABEL_CLASS, children: "brand-voice-profile.md" }), _jsx("textarea", { id: documentId, value: value.document, disabled: disabled, onChange: (e) => onChange({ document: e.target.value }), className: DOCUMENT_TEXTAREA_CLASS, spellCheck: false })] }), _jsx("div", { className: "flex flex-wrap gap-3", children: _jsx("button", { type: "button", onClick: applyDocumentToFields, disabled: disabled || !value.document.trim(), className: "border-border text-foreground hover:bg-accent rounded-md border px-3 py-2 text-sm transition-colors disabled:cursor-not-allowed disabled:opacity-50", children: "Apply to quick-edit fields" }) })] })) : (_jsxs("div", { className: "border-border space-y-4 border-t pt-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: nameId, className: LABEL_CLASS, children: "Name" }), _jsx("input", { id: nameId, type: "text", value: value.name, disabled: disabled, placeholder: "e.g. Acme Marketing", onChange: (e) => onChange({ name: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: toneId, className: LABEL_CLASS, children: "Tone" }), _jsx("input", { id: toneId, type: "text", value: value.tone, disabled: disabled, maxLength: TONE_MAX, placeholder: "e.g. confident, warm, plain-spoken", onChange: (e) => onChange({ tone: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: audienceId, className: LABEL_CLASS, children: ["Audience ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("input", { id: audienceId, type: "text", value: value.audience, disabled: disabled, placeholder: "e.g. busy IT directors at mid-market SaaS companies", onChange: (e) => onChange({ audience: e.target.value }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: guidelinesId, className: LABEL_CLASS, children: ["Guidelines ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: guidelinesId, value: value.guidelines, disabled: disabled, maxLength: GUIDELINES_MAX, placeholder: 'Do: lead with the benefit, use active voice.\nDon\u2019t: use jargon, exclamation points, or hype.', onChange: (e) => onChange({ guidelines: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.guidelines.length, "/", GUIDELINES_MAX] })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: sampleId, className: LABEL_CLASS, children: ["Sample copy ", _jsx("span", { className: "text-muted-foreground font-normal", children: "(optional)" })] }), _jsx("textarea", { id: sampleId, value: value.sampleText, disabled: disabled, maxLength: SAMPLE_MAX, placeholder: "Paste a paragraph of on-brand copy the AI can pattern-match against.", onChange: (e) => onChange({ sampleText: e.target.value }), className: TEXTAREA_CLASS }), _jsxs("p", { className: "text-muted-foreground mt-1 text-sm", children: [value.sampleText.length, "/", SAMPLE_MAX] })] }), _jsx(BrandVoiceRulesSections, { structured: value.structured, disabled: disabled, onChange: handleStructuredChange }), onScore && _jsx(BrandVoiceAlignmentPanel, { disabled: disabled, onScore: onScore })] }))] }) }));
24
236
  }
25
237
  //# sourceMappingURL=BrandVoiceCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrandVoiceCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandVoiceCard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BrandVoiceCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandVoiceCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,GAGvB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGjE,MAAM,WAAW,GACf,wNAAwN,CAAA;AAC1N,MAAM,cAAc,GAAG,GAAG,WAAW,wBAAwB,CAAA;AAC7D,MAAM,uBAAuB,GAAG,GAAG,WAAW,2CAA2C,CAAA;AACzF,MAAM,WAAW,GAAG,gDAAgD,CAAA;AAEpE,MAAM,QAAQ,GAAG,GAAG,CAAA;AACpB,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,UAAU,GAAG,IAAI,CAAA;AAiCvB,SAAS,kBAAkB,CAAC,MAAe;IACzC,MAAM,GAAG,GAAG,MAA2E,CAAA;IACvF,IAAI,CAAC,GAAG,EAAE,WAAW;QAAE,OAAO,EAAE,CAAA;IAChC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,MAAM,IAAI,GAKL,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACrB,CAAC,CAAE,GAAmB;QACtB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAA4C,CAAC,CAAA;IAC/D,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;SACrF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAK;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,IAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAK,CAAC,KAAK,CAAC,CAAC,CAAC;KAC9E,CAAC,CAAC,CAAA;AACP,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;IAC1D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAA;IAC1E,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC1C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAA;IACjB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,CAAA;IACd,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,OAAO,EACP,QAAQ,EACR,gBAAgB,GAUjB;IACC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;IACtB,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;IACtB,MAAM,UAAU,GAAG,KAAK,EAAE,CAAA;IAC1B,MAAM,YAAY,GAAG,KAAK,EAAE,CAAA;IAC5B,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAA;IACxB,MAAM,UAAU,GAAG,KAAK,EAAE,CAAA;IAC1B,MAAM,eAAe,GAAG,KAAK,EAAE,CAAA;IAC/B,MAAM,aAAa,GAAG,KAAK,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,KAAK,EAAE,CAAA;IAC1B,MAAM,aAAa,GAAG,KAAK,EAAE,CAAA;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAA;IAEzB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACvE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAC5E,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/B,CAAA;IACD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAC3E,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAwC,EAAE,CAAC,CAAA;IACjF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACnE,MAAM,YAAY,GAAG,QAAQ,KAAK,UAAU,CAAA;IAE5C,MAAM,sBAAsB,GAAG,WAAW,CACxC,CAAC,UAAuC,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,gCAAgC,CAC/C,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,wBAAwB,CAAC,KAAK,CAAC,EACxD,UAAU,CACX,CAAA;QACD,MAAM,UAAU,GACd,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO;YAC5E,KAAK,CAAC,UAAU,CAAA;QAClB,QAAQ,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAA;IAChD,CAAC,EACD,CAAC,QAAQ,EAAE,KAAK,CAAC,CAClB,CAAA;IAED,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE;QACtE,sBAAsB,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,OAAO;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAA;YAChE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CACH,QAAQ;SACL,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAChB,CAAC,QAAQ,CAAC,CACX,CAAA;IAED,MAAM,UAAU,GACd,CAAC,QAAQ;QACT,CAAC,SAAS;QACV,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEjF,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU;YAAE,OAAM;QACrC,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;gBAC1B,WAAW,EAAE,mBAAmB;gBAChC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBAChD,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAA;gBACxD,OAAM;YACR,CAAC;YACD,QAAQ,CAAC;gBACP,GAAG,GAAG,CAAC,KAAK;gBACZ,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;gBAC9B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC;gBAC/B,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,OAAO;gBACnC,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE;gBAC5C,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE;gBAClC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;oBACpC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;oBAC5C,CAAC,CAAC,KAAK,CAAC,UAAU;aACrB,CAAC,CAAA;YACF,gBAAgB,CAAC,MAAM,CAAC,CAAA;YACxB,kBAAkB,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAA;YAC3C,KAAK,CAAC,OAAO,CACX,GAAG,CAAC,WAAW;gBACb,CAAC,CAAC,gCAAgC,GAAG,CAAC,WAAW,kBAAkB,GAAG,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,+BAA+B;gBAClI,CAAC,CAAC,sDAAsD,CAC3D,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,EAAE;QACD,UAAU;QACV,SAAS;QACT,QAAQ;QACR,gBAAgB;QAChB,UAAU;QACV,mBAAmB;QACnB,OAAO;QACP,KAAK,CAAC,OAAO;KACd,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAA;QAChD,gBAAgB,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAA;QACvD,KAAK,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAA;IAChD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,gBAAgB,GAAG,WAAW,CAClC,KAAK,EAAE,IAAsB,EAAE,EAAE;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9B,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC5B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACzB,OAAM;YACR,CAAC;YACD,QAAQ,CAAC;gBACP,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;gBAC9B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;gBAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;gBACtC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;gBAC1C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;gBAC1C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC/B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;gBAClC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;gBAChC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa;gBAC9C,UAAU,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACzD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;aAC/B,CAAC,CAAA;YACF,gBAAgB,CAAC,UAAU,CAAC,CAAA;YAC5B,KAAK,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAA;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,OAAO,GAAG,mCAAmC,CAAA;YACnD,cAAc,CAAC,OAAO,CAAC,CAAA;YACvB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,CAAC,OAAO;gBAAE,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAA;QACrD,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,OAAO,CAAC,CAC5C,CAAA;IAED,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACzD,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAA;IAEvC,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC5B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACzB,OAAM;QACR,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,QAAQ,CAAC;YACP,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;YAC9B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI;YAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;YACtC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;YAC1C,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;YAC1C,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;YAClC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM;YAChC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa;YAC9C,UAAU,EAAE,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC;SACnD,CAAC,CAAA;QACF,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACxB,KAAK,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAA;IACvE,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEhD,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAsB,EAAE,EAAE;QACrE,IAAI,CAAC,KAAK,EAAE,MAAM;YAAE,OAAM;QAC1B,MAAM,IAAI,GAA0C,EAAE,CAAA;QACtD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,IACE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC3B,CAAC;gBACD,KAAK,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,8CAA8C,CAAC,CAAA;gBAC/E,SAAQ;YACV,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAQ;YAC1B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAA;YAC5D,OAAM;QACR,CAAC;QACD,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACpD,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAC9E,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,KAAC,YAAY,IACX,KAAK,EAAC,aAAa,EACnB,WAAW,EAAC,8EAA8E,YAE1F,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,iBAAiB,IAChB,KAAK,EAAC,mBAAmB,EACzB,WAAW,EAAC,gEAAgE,EAC5E,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,GACzC,EAEF,eAAK,SAAS,EAAC,mCAAmC,aAChD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,wLAAwL,aAElM,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,kBAElC,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EACzC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,wLAAwL,aAElM,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,kBAEhC,EACT,gBACE,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,aAAa,EACjB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,8BAA8B,EACrC,SAAS,EAAC,SAAS,EACnB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAC3D,EACD,CAAC,YAAY,CAAC,CAAC,CAAC,CACf,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,8GAA8G,0CAGjH,CACV,CAAC,CAAC,CAAC,CACF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,EACvC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAC,8GAA8G,mCAGjH,CACV,IACG,EAEL,WAAW,IAAI,CACd,cACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,wFAAwF,YAEjG,WAAW,GACR,CACP,EAEA,SAAS,IAAI,CACZ,eACE,EAAE,EAAE,eAAe,EACnB,SAAS,EAAC,6DAA6D,aAEvE,0BACE,YAAG,SAAS,EAAC,uCAAuC,sCAA0B,EAC9E,YAAG,SAAS,EAAC,oCAAoC,mIAG7C,IACA,EAEL,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CACzB,oBAAU,SAAS,EAAC,WAAW,EAAC,QAAQ,EAAE,QAAQ,IAAI,SAAS,aAC7D,iBAAQ,SAAS,EAAC,0CAA0C,gCAEnD,EACR,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oCACvB,MAAM,OAAO,GAAG,GAAG,eAAe,IAAI,GAAG,CAAC,IAAI,EAAE,CAAA;oCAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oCACtD,OAAO,CACL,iBAEE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,gEAAgE,aAE1E,gBACE,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAC7D,SAAS,EAAC,0HAA0H,GACpI,EACD,GAAG,CAAC,KAAK,KAZL,GAAG,CAAC,IAAI,CAaP,CACT,CAAA;gCACH,CAAC,CAAC,IACO,CACZ,EAED,0BACE,gBAAO,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,uCAE1C,EACR,mBACE,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAC/B,WAAW,EAAE,sDAAsD,EACnE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,SAAS,EAAE,GAAG,cAAc,iCAAiC,GAC7D,IACE,EAEN,0BACE,gBAAO,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,6CAE7C,EACR,eAAK,SAAS,EAAC,mCAAmC,aAChD,kBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EACtD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EACzC,SAAS,EAAC,wLAAwL,aAElM,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,oBAEhC,EACR,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,aAAI,SAAS,EAAC,+BAA+B,YAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACrB,cAAoB,SAAS,EAAC,yBAAyB,aACrD,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,EACrC,IAAI,CAAC,IAAI,EACV,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,sBAAsB,EAChC,OAAO,EAAE,GAAG,EAAE,CACZ,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,uBAIzD,KAXF,IAAI,CAAC,IAAI,CAYb,CACN,CAAC,GACC,CACN,IACG,EACN,gBACE,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,aAAa,EACjB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,mCAAmC,EAC1C,QAAQ,QACR,SAAS,EAAC,SAAS,EACnB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wCACd,KAAK,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;wCACtC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAA;oCACrB,CAAC,GACD,IACE,EAEN,eAAK,SAAS,EAAC,mCAAmC,aAChD,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,CAAC,UAAU,EACrB,SAAS,EAAC,gMAAgM,aAEzM,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,CAClE,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,CAC1C,EACA,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,yBAAyB,IAC9C,EACR,eAAe,IAAI,IAAI,IAAI,CAC1B,aAAG,SAAS,EAAC,+BAA+B,eAAW,QAAQ,+BAC9C,eAAe,aAAS,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SACrE,CACL,IACG,IACF,CACP,EAEA,YAAY,CAAC,CAAC,CAAC,CACd,eAAK,SAAS,EAAC,uCAAuC,aACpD,eAAK,SAAS,EAAC,mDAAmD,aAChE,0BACE,YAAG,SAAS,EAAC,uCAAuC,iCAAqB,EACzE,YAAG,SAAS,EAAC,oCAAoC,wHAG7C,IACA,EACN,aAAG,SAAS,EAAC,+BAA+B,kBACxC,KAAK,CAAC,OAAO,cAAK,KAAK,CAAC,MAAM,IAC9B,IACA,EACN,0BACE,gBAAO,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,uCAE1C,EACR,mBACE,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACvD,SAAS,EAAE,uBAAuB,EAClC,UAAU,EAAE,KAAK,GACjB,IACE,EACN,cAAK,SAAS,EAAC,sBAAsB,YACnC,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAC5C,SAAS,EAAC,qJAAqJ,2CAGxJ,GACL,IACF,CACP,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,uCAAuC,aACpD,0BACE,gBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,qBAEtC,EACR,gBACE,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,qBAAqB,EACjC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACnD,SAAS,EAAE,WAAW,GACtB,IACE,EAEN,0BACE,gBAAO,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,qBAEtC,EACR,gBACE,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,CAAC,IAAI,EACjB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,QAAQ,EACnB,WAAW,EAAC,oCAAoC,EAChD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACnD,SAAS,EAAE,WAAW,GACtB,IACE,EAEN,0BACE,iBAAO,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,0BACvC,eAAM,SAAS,EAAC,mCAAmC,2BAAkB,IACxE,EACR,gBACE,EAAE,EAAE,UAAU,EACd,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,CAAC,QAAQ,EACrB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAC,qDAAqD,EACjE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACvD,SAAS,EAAE,WAAW,GACtB,IACE,EAEN,0BACE,iBAAO,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,4BACvC,eAAM,SAAS,EAAC,mCAAmC,2BAAkB,IAC1E,EACR,mBACE,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,KAAK,CAAC,UAAU,EACvB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,cAAc,EACzB,WAAW,EACT,oGAAoG,EAEtG,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACzD,SAAS,EAAE,cAAc,GACzB,EACF,aAAG,SAAS,EAAC,oCAAoC,aAC9C,KAAK,CAAC,UAAU,CAAC,MAAM,OAAG,cAAc,IACvC,IACA,EAEN,0BACE,iBAAO,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,6BAClC,eAAM,SAAS,EAAC,mCAAmC,2BAAkB,IAC3E,EACR,mBACE,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,KAAK,CAAC,UAAU,EACvB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,UAAU,EACrB,WAAW,EAAC,sEAAsE,EAClF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EACzD,SAAS,EAAE,cAAc,GACzB,EACF,aAAG,SAAS,EAAC,oCAAoC,aAC9C,KAAK,CAAC,UAAU,CAAC,MAAM,OAAG,UAAU,IACnC,IACA,EAEN,KAAC,uBAAuB,IACtB,UAAU,EAAE,KAAK,CAAC,UAAU,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,sBAAsB,GAChC,EAED,OAAO,IAAI,KAAC,wBAAwB,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAI,IAC1E,CACP,IACG,GACO,CAChB,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { BrandAlignmentScoreResult } from '@actuate-media/cms-core/brand-voice';
2
+ export declare function BrandVoiceAlignmentPanel({ disabled, onScore, }: {
3
+ disabled: boolean;
4
+ onScore: (input: {
5
+ content: string;
6
+ channel?: string;
7
+ }) => Promise<{
8
+ ok: boolean;
9
+ result?: BrandAlignmentScoreResult;
10
+ error?: string;
11
+ }>;
12
+ }): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=BrandVoiceAlignmentPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceAlignmentPanel.d.ts","sourceRoot":"","sources":["../../../../src/views/settings/brand-voice/BrandVoiceAlignmentPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAkBpF,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QACjE,EAAE,EAAE,OAAO,CAAA;QACX,MAAM,CAAC,EAAE,yBAAyB,CAAA;QAClC,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACH,2CA8KA"}
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { BRAND_VOICE_CHANNEL_PRESETS } from '@actuate-media/cms-core/brand-voice';
4
+ import { Loader2, Wand2 } from 'lucide-react';
5
+ import { useId, useState } from 'react';
6
+ import { toast } from 'sonner';
7
+ import { fixBrandVoiceContent } from '../../../lib/brand-voice-client.js';
8
+ 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';
9
+ const TEXTAREA_CLASS = `${INPUT_CLASS} min-h-[120px] resize-y`;
10
+ const LABEL_CLASS = 'mb-1 block text-sm font-medium text-foreground';
11
+ function scoreTone(score) {
12
+ if (score >= 85)
13
+ return 'text-success';
14
+ if (score >= 65)
15
+ return 'text-warning';
16
+ return 'text-destructive';
17
+ }
18
+ export function BrandVoiceAlignmentPanel({ disabled, onScore, }) {
19
+ const contentId = useId();
20
+ const channelId = useId();
21
+ const [content, setContent] = useState('');
22
+ const [channel, setChannel] = useState('');
23
+ const [loading, setLoading] = useState(false);
24
+ const [fixing, setFixing] = useState(false);
25
+ const [result, setResult] = useState(null);
26
+ const [error, setError] = useState(null);
27
+ async function runScore() {
28
+ if (!content.trim())
29
+ return;
30
+ setLoading(true);
31
+ setError(null);
32
+ try {
33
+ const res = await onScore({
34
+ content: content.trim(),
35
+ channel: channel || undefined,
36
+ });
37
+ if (!res.ok || !res.result) {
38
+ setResult(null);
39
+ setError(res.error ?? 'Could not score this copy.');
40
+ return;
41
+ }
42
+ setResult(res.result);
43
+ }
44
+ finally {
45
+ setLoading(false);
46
+ }
47
+ }
48
+ async function runFix() {
49
+ if (!content.trim())
50
+ return;
51
+ setFixing(true);
52
+ setError(null);
53
+ try {
54
+ const res = await fixBrandVoiceContent({
55
+ content: content.trim(),
56
+ channel: channel || undefined,
57
+ });
58
+ if (!res.ok || !res.result) {
59
+ setError(res.error ?? 'Could not fix this copy.');
60
+ return;
61
+ }
62
+ setContent(res.result.text);
63
+ setResult(res.result.afterScore);
64
+ toast.success(res.result.usedAi
65
+ ? 'Copy revised to match brand voice.'
66
+ : 'Applied brand voice rule fixes.');
67
+ }
68
+ finally {
69
+ setFixing(false);
70
+ }
71
+ }
72
+ return (_jsxs("div", { className: "border-border space-y-4 rounded-md border border-dashed p-4", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-foreground text-base font-medium", children: "Check alignment" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Paste draft copy to score it against your vocabulary rules, mechanics, and channel limits." })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-[1fr_220px]", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: contentId, className: LABEL_CLASS, children: "Draft copy" }), _jsx("textarea", { id: contentId, value: content, disabled: disabled || loading, placeholder: "Paste a headline, meta description, or paragraph to score.", onChange: (e) => setContent(e.target.value), className: TEXTAREA_CLASS })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: channelId, className: LABEL_CLASS, children: "Channel (optional)" }), _jsxs("select", { id: channelId, value: channel, disabled: disabled || loading, onChange: (e) => setChannel(e.target.value), className: INPUT_CLASS, children: [_jsx("option", { value: "", children: "General" }), BRAND_VOICE_CHANNEL_PRESETS.map((preset) => (_jsx("option", { value: preset.id, children: preset.label }, preset.id)))] }), _jsxs("button", { type: "button", onClick: runScore, disabled: disabled || loading || !content.trim(), className: "bg-primary text-primary-foreground mt-3 inline-flex w-full items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: [loading && _jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Score copy"] })] })] }), error && (_jsx("div", { role: "alert", className: "border-destructive/30 bg-destructive/10 text-destructive rounded-md border p-3 text-sm", children: error })), result && (_jsxs("div", { className: "space-y-3", "aria-live": "polite", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("p", { className: `text-2xl font-medium ${scoreTone(result.score)}`, children: [result.score, "/100"] }), _jsx("p", { className: "text-muted-foreground text-sm", children: result.channel ? `Scored for ${result.channel.replace(/_/g, ' ')}` : 'General score' }), result.score < 85 && (_jsxs("button", { type: "button", onClick: runFix, disabled: disabled || fixing || loading, className: "border-border bg-card text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm disabled:cursor-not-allowed disabled:opacity-50", children: [fixing ? (_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Wand2, { size: 16, "aria-hidden": "true" })), "Fix to match brand voice"] }))] }), result.issues.length > 0 && (_jsx("ul", { className: "space-y-2", children: result.issues.map((issue) => (_jsxs("li", { className: "border-border bg-muted/30 rounded-md border px-3 py-2 text-sm", children: [_jsx("p", { className: "text-foreground", children: issue.message }), issue.suggestion && (_jsx("p", { className: "text-muted-foreground mt-1", children: issue.suggestion }))] }, issue.id))) })), result.dimensions.length > 0 && (_jsx("div", { className: "grid gap-2 sm:grid-cols-2", children: result.dimensions.map((dimension) => (_jsxs("div", { className: "border-border rounded-md border px-3 py-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: dimension.name }), _jsx("p", { className: `text-sm ${scoreTone(dimension.score)}`, children: dimension.score })] }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: dimension.feedback })] }, dimension.name))) }))] }))] }));
73
+ }
74
+ //# sourceMappingURL=BrandVoiceAlignmentPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceAlignmentPanel.js","sourceRoot":"","sources":["../../../../src/views/settings/brand-voice/BrandVoiceAlignmentPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { BrandVoiceStructuredProfile } from '@actuate-media/cms-core/brand-voice';
2
+ export declare function BrandVoiceRulesSections({ structured, disabled, onChange, }: {
3
+ structured: BrandVoiceStructuredProfile;
4
+ disabled: boolean;
5
+ onChange: (next: BrandVoiceStructuredProfile) => void;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=BrandVoiceRulesSections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceRulesSections.d.ts","sourceRoot":"","sources":["../../../../src/views/settings/brand-voice/BrandVoiceRulesSections.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,2BAA2B,EAE5B,MAAM,qCAAqC,CAAA;AAa5C,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,2BAA2B,CAAA;IACvC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,2BAA2B,KAAK,IAAI,CAAA;CACtD,2CAoSA"}
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { MAX_BANNED_TERMS, MAX_PREFERRED_TERMS, MAX_WORKED_EXAMPLES, } from '@actuate-media/cms-core/brand-voice';
4
+ import { Plus, Trash2 } from 'lucide-react';
5
+ import { useId } from 'react';
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 block text-sm font-medium text-foreground';
8
+ export function BrandVoiceRulesSections({ structured, disabled, onChange, }) {
9
+ const preferredId = useId();
10
+ const patternId = useId();
11
+ function update(patch) {
12
+ onChange({ ...structured, ...patch });
13
+ }
14
+ function updateBanned(index, patch) {
15
+ const bannedTerms = structured.bannedTerms.map((row, i) => i === index ? { ...row, ...patch } : row);
16
+ update({ bannedTerms });
17
+ }
18
+ function updateChannel(index, patch) {
19
+ const channels = structured.channels.map((row, i) => (i === index ? { ...row, ...patch } : row));
20
+ update({ channels });
21
+ }
22
+ function updateExample(index, patch) {
23
+ const workedExamples = structured.workedExamples.map((row, i) => i === index ? { ...row, ...patch } : row);
24
+ update({ workedExamples });
25
+ }
26
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs("section", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-foreground text-base font-medium", children: "Vocabulary rules" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Banned terms produce deterministic alignment errors. Preferred terms are scored as bonuses." })] }), _jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-foreground text-sm font-medium", children: "Banned terms" }), structured.bannedTerms.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "No banned terms yet." })), structured.bannedTerms.map((row, index) => (_jsxs("div", { className: "grid gap-2 md:grid-cols-[1fr_1fr_auto]", children: [_jsx("input", { type: "text", value: row.term, disabled: disabled, placeholder: "e.g. cheap", "aria-label": `Banned term ${index + 1}`, onChange: (e) => updateBanned(index, { term: e.target.value }), className: INPUT_CLASS }), _jsx("input", { type: "text", value: row.useInstead, disabled: disabled, placeholder: "Use instead (optional)", "aria-label": `Replacement for banned term ${index + 1}`, onChange: (e) => updateBanned(index, { useInstead: e.target.value }), className: INPUT_CLASS }), _jsx("button", { type: "button", disabled: disabled, "aria-label": `Remove banned term ${index + 1}`, onClick: () => update({ bannedTerms: structured.bannedTerms.filter((_, i) => i !== index) }), className: "border-border text-muted-foreground hover:bg-accent inline-flex items-center justify-center rounded-md border px-3 py-2 transition-colors disabled:opacity-50", children: _jsx(Trash2, { size: 16, "aria-hidden": "true" }) })] }, `banned-${index}`))), _jsxs("button", { type: "button", disabled: disabled || structured.bannedTerms.length >= MAX_BANNED_TERMS, onClick: () => update({ bannedTerms: [...structured.bannedTerms, { term: '', useInstead: '' }] }), className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:opacity-50", children: [_jsx(Plus, { size: 14, "aria-hidden": "true" }), "Add banned term"] })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: preferredId, className: LABEL_CLASS, children: "Preferred terms" }), _jsx("input", { id: preferredId, type: "text", disabled: disabled, placeholder: "Comma-separated, e.g. ecommerce, sign up", value: structured.preferredTerms.join(', '), onChange: (e) => update({
27
+ preferredTerms: e.target.value
28
+ .split(',')
29
+ .map((t) => t.trim())
30
+ .filter(Boolean)
31
+ .slice(0, MAX_PREFERRED_TERMS),
32
+ }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: patternId, className: LABEL_CLASS, children: "Avoid patterns" }), _jsx("textarea", { id: patternId, disabled: disabled, placeholder: 'One per line, e.g.\nhype stacking (multiple superlatives in one sentence)', value: structured.avoidPatterns.join('\n'), onChange: (e) => update({
33
+ avoidPatterns: e.target.value
34
+ .split('\n')
35
+ .map((line) => line.trim())
36
+ .filter(Boolean),
37
+ }), className: `${INPUT_CLASS} min-h-[88px] resize-y` })] })] }), _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-foreground text-base font-medium", children: "Channel overrides" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Length limits and notes used when scoring copy for a specific channel." })] }), _jsx("div", { className: "space-y-3", children: structured.channels.map((channel, index) => (_jsxs("div", { className: "border-border rounded-md border p-4", children: [_jsx("p", { className: "text-foreground mb-3 text-sm font-medium", children: channel.label }), _jsxs("div", { className: "grid gap-3 md:grid-cols-3", children: [channel.id === 'google_ads' ? (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Max headline chars" }), _jsx("input", { type: "number", min: 1, disabled: disabled, value: channel.maxHeadlineChars ?? '', onChange: (e) => updateChannel(index, {
38
+ maxHeadlineChars: e.target.value ? Number(e.target.value) : undefined,
39
+ }), className: INPUT_CLASS })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Max description chars" }), _jsx("input", { type: "number", min: 1, disabled: disabled, value: channel.maxDescriptionChars ?? '', onChange: (e) => updateChannel(index, {
40
+ maxDescriptionChars: e.target.value
41
+ ? Number(e.target.value)
42
+ : undefined,
43
+ }), className: INPUT_CLASS })] })] })) : (_jsxs("div", { children: [_jsx("label", { className: LABEL_CLASS, children: "Max characters" }), _jsx("input", { type: "number", min: 1, disabled: disabled, value: channel.maxChars ?? '', onChange: (e) => updateChannel(index, {
44
+ maxChars: e.target.value ? Number(e.target.value) : undefined,
45
+ }), className: INPUT_CLASS })] })), _jsxs("div", { className: channel.id === 'google_ads' ? 'md:col-span-1' : 'md:col-span-2', children: [_jsx("label", { className: LABEL_CLASS, children: "Note" }), _jsx("input", { type: "text", disabled: disabled, value: channel.note ?? '', onChange: (e) => updateChannel(index, { note: e.target.value }), className: INPUT_CLASS })] })] })] }, channel.id))) })] }), _jsxs("section", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "text-foreground text-base font-medium", children: "Worked examples" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Off-brand vs on-brand pairs anchor scoring feedback and the sample copy field." })] }), structured.workedExamples.length === 0 && (_jsx("p", { className: "text-muted-foreground text-sm", children: "No worked examples yet." })), structured.workedExamples.map((example, index) => (_jsxs("div", { className: "border-border space-y-2 rounded-md border p-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("p", { className: "text-foreground text-sm font-medium", children: ["Example ", index + 1] }), _jsx("button", { type: "button", disabled: disabled, "aria-label": `Remove worked example ${index + 1}`, onClick: () => update({
46
+ workedExamples: structured.workedExamples.filter((_, i) => i !== index),
47
+ }), className: "border-border text-muted-foreground hover:bg-accent inline-flex items-center justify-center rounded-md border px-2 py-1 transition-colors disabled:opacity-50", children: _jsx(Trash2, { size: 14, "aria-hidden": "true" }) })] }), _jsx("input", { type: "text", disabled: disabled, placeholder: "Off-brand copy", "aria-label": `Off-brand example ${index + 1}`, value: example.offBrand, onChange: (e) => updateExample(index, { offBrand: e.target.value }), className: INPUT_CLASS }), _jsx("input", { type: "text", disabled: disabled, placeholder: "On-brand rewrite", "aria-label": `On-brand example ${index + 1}`, value: example.onBrand, onChange: (e) => updateExample(index, { onBrand: e.target.value }), className: INPUT_CLASS }), _jsx("input", { type: "text", disabled: disabled, placeholder: "Why this is better", "aria-label": `Why example ${index + 1} is on-brand`, value: example.why, onChange: (e) => updateExample(index, { why: e.target.value }), className: INPUT_CLASS })] }, `example-${index}`))), _jsxs("button", { type: "button", disabled: disabled || structured.workedExamples.length >= MAX_WORKED_EXAMPLES, onClick: () => update({
48
+ workedExamples: [
49
+ ...structured.workedExamples,
50
+ { offBrand: '', onBrand: '', why: '' },
51
+ ],
52
+ }), className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm transition-colors disabled:opacity-50", children: [_jsx(Plus, { size: 14, "aria-hidden": "true" }), "Add worked example"] })] })] }));
53
+ }
54
+ //# sourceMappingURL=BrandVoiceRulesSections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandVoiceRulesSections.js","sourceRoot":"","sources":["../../../../src/views/settings/brand-voice/BrandVoiceRulesSections.tsx"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { type BrandAlignmentScoreResult, type BrandVoiceStructuredProfile } from '@actuate-media/cms-core/brand-voice';
1
2
  /**
2
3
  * Settings → AI state.
3
4
  *
@@ -84,7 +85,13 @@ export interface BrandVoiceForm {
84
85
  audience: string;
85
86
  guidelines: string;
86
87
  sampleText: string;
88
+ document: string;
89
+ version: number;
90
+ status: 'draft' | 'reviewed' | 'approved';
91
+ generatedFrom: string[];
92
+ structured: BrandVoiceStructuredProfile;
87
93
  }
94
+ export type BrandVoiceEditMode = 'form' | 'document';
88
95
  /** The buffered (Save-bar) portion of AI settings. */
89
96
  export interface AiSettingsForm {
90
97
  defaultProviderId: string;
@@ -120,6 +127,31 @@ export interface UseAiSettings {
120
127
  setFeatureModel: (key: string, modelId: string) => void;
121
128
  /** Patch one or more brand voice fields. */
122
129
  setBrandVoice: (patch: Partial<BrandVoiceForm>) => void;
130
+ /** Whether saves should trust the markdown document or quick-edit fields. */
131
+ brandVoiceEditMode: BrandVoiceEditMode;
132
+ setBrandVoiceEditMode: (mode: BrandVoiceEditMode) => void;
133
+ /** Scan published content and draft brand voice fields (does not save). */
134
+ analyzeBrandVoice: (input: {
135
+ collections: string[];
136
+ urls?: string[];
137
+ uploads?: Array<{
138
+ name: string;
139
+ text: string;
140
+ }>;
141
+ }) => Promise<{
142
+ ok: boolean;
143
+ draft?: Partial<BrandVoiceForm>;
144
+ sampleCount?: number;
145
+ error?: string;
146
+ }>;
147
+ scoreBrandVoice: (input: {
148
+ content: string;
149
+ channel?: string;
150
+ }) => Promise<{
151
+ ok: boolean;
152
+ result?: BrandAlignmentScoreResult;
153
+ error?: string;
154
+ }>;
123
155
  dirty: boolean;
124
156
  budgetError: string | null;
125
157
  saveState: SaveState;
@@ -1 +1 @@
1
- {"version":3,"file":"useAiSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAiSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EACjC,MAAM,qCAAqC,CAAA;AAG5C;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,CAAA;AACrE,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,aAAa,GACb,cAAc,GACd,eAAe,GACf,aAAa,GACb,SAAS,CAAA;AACb,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,CAAA;AAElF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,aAAa,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,aAAa,CAAA;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,OAAO,CAAC,EAAE;QACR,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,aAAa,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,kBAAkB,CAAA;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAA;IACnD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;IACzC,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,UAAU,EAAE,2BAA2B,CAAA;CACxC;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,UAAU,CAAA;AAgBpD,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,cAAc,CAAA;CAC3B;AAyBD,KAAK,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;AAsDxD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,WAAW,GAAG,IAAI,CAAA;IAChC,IAAI,EAAE,cAAc,CAAA;IACpB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtD,mFAAmF;IACnF,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACvD,4CAA4C;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;IACvD,6EAA6E;IAC7E,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,qBAAqB,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACzD,2EAA2E;IAC3E,iBAAiB,EAAE,CAAC,KAAK,EAAE;QACzB,WAAW,EAAE,MAAM,EAAE,CAAA;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAChD,KAAK,OAAO,CAAC;QACZ,EAAE,EAAE,OAAO,CAAA;QACX,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;QAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;IACF,eAAe,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QACzE,EAAE,EAAE,OAAO,CAAA;QACX,MAAM,CAAC,EAAE,yBAAyB,CAAA;QAClC,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;IACF,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,yDAAyD;IACzD,cAAc,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClF,cAAc,EAAE,CACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACvE,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7C,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACxE,YAAY,EAAE,CACZ,EAAE,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5F,UAAU,EAAE,CACV,EAAE,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CA2Y7D"}