@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.
- package/CHANGELOG.md +9 -0
- package/dist/__tests__/views/ai-settings.render.test.js +34 -0
- package/dist/__tests__/views/ai-settings.render.test.js.map +1 -1
- package/dist/actuate-admin.css +1 -1
- package/dist/components/AICoauthorBubbleMenu.d.ts.map +1 -1
- package/dist/components/AICoauthorBubbleMenu.js +5 -1
- package/dist/components/AICoauthorBubbleMenu.js.map +1 -1
- package/dist/components/BrandVoiceAlignmentBadge.d.ts +6 -0
- package/dist/components/BrandVoiceAlignmentBadge.d.ts.map +1 -0
- package/dist/components/BrandVoiceAlignmentBadge.js +11 -0
- package/dist/components/BrandVoiceAlignmentBadge.js.map +1 -0
- package/dist/components/CoauthorResultPopover.d.ts +5 -1
- package/dist/components/CoauthorResultPopover.d.ts.map +1 -1
- package/dist/components/CoauthorResultPopover.js +35 -6
- package/dist/components/CoauthorResultPopover.js.map +1 -1
- package/dist/components/CommandPalette.d.ts.map +1 -1
- package/dist/components/CommandPalette.js +5 -1
- package/dist/components/CommandPalette.js.map +1 -1
- package/dist/components/seo/SeoEditorDrawer.d.ts.map +1 -1
- package/dist/components/seo/SeoEditorDrawer.js +43 -2
- package/dist/components/seo/SeoEditorDrawer.js.map +1 -1
- package/dist/components/ui/Badge.d.ts +1 -1
- package/dist/lib/brand-voice-client.d.ts +21 -0
- package/dist/lib/brand-voice-client.d.ts.map +1 -0
- package/dist/lib/brand-voice-client.js +27 -0
- package/dist/lib/brand-voice-client.js.map +1 -0
- package/dist/lib/coauthor-client.d.ts +2 -0
- package/dist/lib/coauthor-client.d.ts.map +1 -1
- package/dist/lib/coauthor-client.js +1 -0
- package/dist/lib/coauthor-client.js.map +1 -1
- package/dist/lib/seo-service.d.ts +12 -0
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +0 -10
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/views/Settings.js +1 -1
- package/dist/views/Settings.js.map +1 -1
- package/dist/views/settings/AISettingsTab.d.ts +3 -1
- package/dist/views/settings/AISettingsTab.d.ts.map +1 -1
- package/dist/views/settings/AISettingsTab.js +2 -2
- package/dist/views/settings/AISettingsTab.js.map +1 -1
- package/dist/views/settings/BrandVoiceCard.d.ts +39 -2
- package/dist/views/settings/BrandVoiceCard.d.ts.map +1 -1
- package/dist/views/settings/BrandVoiceCard.js +215 -3
- package/dist/views/settings/BrandVoiceCard.js.map +1 -1
- package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.d.ts +13 -0
- package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.d.ts.map +1 -0
- package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.js +74 -0
- package/dist/views/settings/brand-voice/BrandVoiceAlignmentPanel.js.map +1 -0
- package/dist/views/settings/brand-voice/BrandVoiceRulesSections.d.ts +7 -0
- package/dist/views/settings/brand-voice/BrandVoiceRulesSections.d.ts.map +1 -0
- package/dist/views/settings/brand-voice/BrandVoiceRulesSections.js +54 -0
- package/dist/views/settings/brand-voice/BrandVoiceRulesSections.js.map +1 -0
- package/dist/views/settings/useAiSettings.d.ts +32 -0
- package/dist/views/settings/useAiSettings.d.ts.map +1 -1
- package/dist/views/settings/useAiSettings.js +85 -3
- package/dist/views/settings/useAiSettings.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/views/ai-settings.render.test.tsx +50 -0
- package/src/components/AICoauthorBubbleMenu.tsx +12 -0
- package/src/components/BrandVoiceAlignmentBadge.tsx +39 -0
- package/src/components/CoauthorResultPopover.tsx +62 -4
- package/src/components/CommandPalette.tsx +12 -0
- package/src/components/seo/SeoEditorDrawer.tsx +65 -1
- package/src/lib/brand-voice-client.ts +38 -0
- package/src/lib/coauthor-client.ts +4 -0
- package/src/lib/seo-service.ts +2 -0
- package/src/views/Settings.tsx +1 -1
- package/src/views/settings/AISettingsTab.tsx +13 -2
- package/src/views/settings/BrandVoiceCard.tsx +592 -76
- package/src/views/settings/brand-voice/BrandVoiceAlignmentPanel.tsx +205 -0
- package/src/views/settings/brand-voice/BrandVoiceRulesSections.tsx +321 -0
- 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 {
|
|
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
|
-
|
|
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":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,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,WAAW,GAAG,gDAAgD,CAAA;AAEpE,MAAM,QAAQ,GAAG,GAAG,CAAA;AACpB,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,UAAU,GAAG,IAAI,CAAA;AAEvB;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,OAAO,EACP,QAAQ,GAKT;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,QAAQ,GAAG,CAAC,OAAO,CAAA;IAEzB,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,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,IACF,IACF,GACO,CAChB,CAAA;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"BrandVoiceCard.js","sourceRoot":"","sources":["../../../src/views/settings/BrandVoiceCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,YAAY,CAAA;;AAGZ,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAEzE,MAAM,WAAW,GACf,wNAAwN,CAAA;AAC1N,MAAM,cAAc,GAAG,GAAG,WAAW,yBAAyB,CAAA;AAC9D,MAAM,WAAW,GAAG,gDAAgD,CAAA;AAEpE,SAAS,SAAS,CAAC,KAAa;IAC9B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,cAAc,CAAA;IACtC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,cAAc,CAAA;IACtC,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,EACR,OAAO,GAQR;IACC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAmC,IAAI,CAAC,CAAA;IAC5E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAEvD,KAAK,UAAU,QAAQ;QACrB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAM;QAC3B,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC;gBACxB,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvB,OAAO,EAAE,OAAO,IAAI,SAAS;aAC9B,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,SAAS,CAAC,IAAI,CAAC,CAAA;gBACf,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,4BAA4B,CAAC,CAAA;gBACnD,OAAM;YACR,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,KAAK,UAAU,MAAM;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAM;QAC3B,SAAS,CAAC,IAAI,CAAC,CAAA;QACf,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;gBACrC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvB,OAAO,EAAE,OAAO,IAAI,SAAS;aAC9B,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,0BAA0B,CAAC,CAAA;gBACjD,OAAM;YACR,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC3B,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAChC,KAAK,CAAC,OAAO,CACX,GAAG,CAAC,MAAM,CAAC,MAAM;gBACf,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,iCAAiC,CACtC,CAAA;QACH,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,6DAA6D,aAC1E,0BACE,aAAI,SAAS,EAAC,uCAAuC,gCAAqB,EAC1E,YAAG,SAAS,EAAC,oCAAoC,2GAE7C,IACA,EAEN,eAAK,SAAS,EAAC,qCAAqC,aAClD,0BACE,gBAAO,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,2BAEzC,EACR,mBACE,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAC7B,WAAW,EAAC,4DAA4D,EACxE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,cAAc,GACzB,IACE,EACN,0BACE,gBAAO,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,mCAEzC,EACR,kBACE,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,WAAW,aAEtB,iBAAQ,KAAK,EAAC,EAAE,wBAAiB,EAChC,2BAA2B,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC3C,iBAAwB,KAAK,EAAE,MAAM,CAAC,EAAE,YACrC,MAAM,CAAC,KAAK,IADF,MAAM,CAAC,EAAE,CAEb,CACV,CAAC,IACK,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAChD,SAAS,EAAC,2NAA2N,aAEpO,OAAO,IAAI,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,kBAEtE,IACL,IACF,EAEL,KAAK,IAAI,CACR,cACE,IAAI,EAAC,OAAO,EACZ,SAAS,EAAC,wFAAwF,YAEjG,KAAK,GACF,CACP,EAEA,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,WAAW,eAAW,QAAQ,aAC3C,eAAK,SAAS,EAAC,mCAAmC,aAChD,aAAG,SAAS,EAAE,wBAAwB,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,aAAG,MAAM,CAAC,KAAK,YAAS,EACvF,YAAG,SAAS,EAAC,+BAA+B,YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,GACnF,EACH,MAAM,CAAC,KAAK,GAAG,EAAE,IAAI,CACpB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,IAAI,MAAM,IAAI,OAAO,EACvC,SAAS,EAAC,8KAA8K,aAEvL,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,iBAAa,MAAM,GAAG,CAClE,CAAC,CAAC,CAAC,CACF,KAAC,KAAK,IAAC,IAAI,EAAE,EAAE,iBAAc,MAAM,GAAG,CACvC,gCAEM,CACV,IACG,EAEL,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,aAAI,SAAS,EAAC,WAAW,YACtB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B,cAEE,SAAS,EAAC,+DAA+D,aAEzE,YAAG,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,OAAO,GAAK,EACjD,KAAK,CAAC,UAAU,IAAI,CACnB,YAAG,SAAS,EAAC,4BAA4B,YAAE,KAAK,CAAC,UAAU,GAAK,CACjE,KANI,KAAK,CAAC,EAAE,CAOV,CACN,CAAC,GACC,CACN,EAEA,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAC/B,cAAK,SAAS,EAAC,2BAA2B,YACvC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CACpC,eAA0B,SAAS,EAAC,2CAA2C,aAC7E,eAAK,SAAS,EAAC,yCAAyC,aACtD,YAAG,SAAS,EAAC,qCAAqC,YAAE,SAAS,CAAC,IAAI,GAAK,EACvE,YAAG,SAAS,EAAE,WAAW,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,YAAG,SAAS,CAAC,KAAK,GAAK,IACxE,EACN,YAAG,SAAS,EAAC,oCAAoC,YAAE,SAAS,CAAC,QAAQ,GAAK,KALlE,SAAS,CAAC,IAAI,CAMlB,CACP,CAAC,GACE,CACP,IACG,CACP,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"useAiSettings.d.ts","sourceRoot":"","sources":["../../../src/views/settings/useAiSettings.ts"],"names":[],"mappings":"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"}
|