@powerhousedao/service-offering 1.0.0-dev.31 → 1.0.0-dev.32

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.
@@ -1 +1 @@
1
- {"version":3,"file":"editor-BDOeH1Jb.mjs","names":["styles"],"sources":["../../editors/resource-template-editor/components/markdown-editor.tsx","../../editors/resource-template-editor/components/TemplateInfo.tsx","../../editors/resource-template-editor/components/FacetTargeting.tsx","../../editors/resource-template-editor/editor.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeSlug from \"rehype-slug\";\nimport { useLocalStorage } from \"usehooks-ts\";\n\n// Custom preview renderer to make links open in new tabs and ensure proper list rendering\nconst previewOptions = {\n components: {\n a: ({ ...props }: { node: unknown; [key: string]: unknown }) => (\n <a {...props} target=\"_blank\" rel=\"noopener noreferrer\" />\n ),\n },\n rehypePlugins: [rehypeSlug],\n remarkPlugins: [remarkGfm],\n};\nexport type MarkdownEditorMode = \"preview\" | \"edit\" | \"live\";\n\ninterface MarkdownEditorProps {\n value: string | null;\n onChange: (value: string) => void;\n onBlur?: (value: string) => void;\n height?: number;\n label?: string;\n labelClassName?: string;\n}\n\nexport function MarkdownEditor({\n value,\n onChange,\n onBlur,\n height = 350,\n label = \"Content\",\n labelClassName = \"text-sm leading-4 mb-3 font-medium\",\n}: MarkdownEditorProps) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const [MDEditor, setMDEditor] = useState<any>(null);\n const [contentValue, setContentValue] = useState<string>(\"\");\n const [isLoaded, setIsLoaded] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const [viewMarkdownMode, setViewMarkdownMode] =\n useLocalStorage<MarkdownEditorMode>(\"markdown-editor-view-mode\", \"live\");\n\n // Ensure we have a valid mode for the editor\n const editorMode = viewMarkdownMode;\n\n // Load the MDEditor component dynamically\n useEffect(() => {\n // Use a more robust dynamic import approach\n const loadEditor = async () => {\n try {\n const module = await import(\"@uiw/react-md-editor\");\n\n setMDEditor(() => module.default);\n setIsLoaded(true);\n setLoadError(null);\n } catch (error) {\n console.error(\"Failed to load MDEditor:\", error);\n setLoadError(\n error instanceof Error ? error.message : \"Failed to load editor\",\n );\n setIsLoaded(true);\n }\n };\n\n // Add a small delay to ensure DOM is ready\n const timer = setTimeout(() => void loadEditor(), 0);\n return () => clearTimeout(timer);\n }, []);\n\n // Update contentValue when value prop changes\n useEffect(() => {\n if (isLoaded) {\n // Handle null/undefined but preserve empty strings, whitespace, and newlines\n const stringValue = value ?? \"\";\n setContentValue(stringValue);\n }\n }, [value, isLoaded]);\n\n useEffect(() => {\n if (!MDEditor) return;\n\n const handleViewButtonClick = () => {\n const buttonLive = document.querySelector(\"button[data-name='live']\");\n const buttonEdit = document.querySelector(\"button[data-name='edit']\");\n const buttonPreview = document.querySelector(\n \"button[data-name='preview']\",\n );\n\n const liveLi = buttonLive?.closest(\"li\");\n const editLi = buttonEdit?.closest(\"li\");\n const previewLi = buttonPreview?.closest(\"li\");\n\n if (previewLi && previewLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"preview\");\n }\n if (editLi && editLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"edit\");\n }\n if (liveLi && liveLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"live\");\n }\n };\n\n document.addEventListener(\"click\", handleViewButtonClick, true);\n return () => {\n document.removeEventListener(\"click\", handleViewButtonClick, true);\n };\n }, [MDEditor, setViewMarkdownMode]);\n\n // Handle content changes\n const handleContentChange = (newValue: string | undefined) => {\n // Handle null/undefined but preserve all string content including empty strings\n const stringValue = newValue ?? \"\";\n setContentValue(stringValue);\n onChange(stringValue);\n };\n\n // Handle content blur\n const handleContentBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (onBlur) {\n onBlur(e.target.value);\n }\n };\n\n return (\n <div className=\"w-full\">\n <style>\n {`\n .w-md-editor-preview ul {\n list-style-type: disc !important;\n padding-left: 2em !important;\n }\n\n .w-md-editor-preview ol {\n list-style-type: decimal !important;\n padding-left: 2em !important;\n }\n\n /* Ensure proper table styling */\n .w-md-editor-preview table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n .w-md-editor-preview th,\n .w-md-editor-preview td {\n border: 1px solid #ddd;\n padding: 8px;\n text-align: left;\n }\n\n .w-md-editor-preview th {\n background-color: #f5f5f5;\n }\n \n .w-md-editor-text-pre code, .w-md-editor-text-pre div {\n font-size: 16px !important;\n line-height: 24px !important;\n }\n .w-md-editor-text-input {\n font-size: 16px !important;\n line-height: 24px !important;\n }\n \n `}\n </style>\n\n {label && <p className={labelClassName}>{label}</p>}\n {!isLoaded && (\n <div\n className=\"w-full border border-gray-300 rounded-md p-3 bg-white\"\n style={{ height: `${height}px` }}\n >\n <div className=\"w-full h-full flex items-center justify-center text-gray-500\">\n Loading editor...\n </div>\n </div>\n )}\n {isLoaded && loadError && (\n <div\n className=\"w-full border border-red-300 rounded-md p-3 bg-red-50\"\n style={{ height: `${height}px` }}\n >\n <div className=\"w-full h-full flex flex-col items-center justify-center text-red-600\">\n <p className=\"text-sm font-medium mb-2\">\n Failed to load markdown editor\n </p>\n <p className=\"text-xs text-red-500\">{loadError}</p>\n <textarea\n className=\"w-full h-full mt-2 p-2 border border-gray-300 rounded text-sm\"\n placeholder=\"Fallback text editor - write your content here...\"\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onBlur={(e) => onBlur?.(e.target.value)}\n />\n </div>\n </div>\n )}\n {isLoaded && MDEditor && (\n <div data-color-mode=\"light\" className=\"w-full\">\n <MDEditor\n height={height}\n value={contentValue || \" \"}\n onChange={handleContentChange}\n onBlur={handleContentBlur}\n previewOptions={previewOptions}\n enableScroll={true}\n preview={editorMode}\n textareaProps={{\n placeholder: \"Write your content here...\",\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport { generateId } from \"document-model/core\";\nimport type { DocumentDispatch } from \"@powerhousedao/reactor-browser\";\nimport type {\n ResourceTemplateDocument,\n ResourceTemplateAction,\n TargetAudience,\n FaqField,\n ContentSection,\n} from \"document-models/resource-template\";\nimport {\n updateTemplateInfo,\n updateTemplateStatus,\n setOperator,\n setWeight,\n addTargetAudience,\n removeTargetAudience,\n setSetupServices,\n setRecurringServices,\n addFaq,\n updateFaq,\n deleteFaq,\n reorderFaqs,\n addContentSection,\n updateContentSection,\n deleteContentSection,\n reorderContentSections,\n} from \"../../../document-models/resource-template/v1/gen/creators.js\";\nimport { MarkdownEditor } from \"./markdown-editor.js\";\n\ninterface TemplateInfoProps {\n document: ResourceTemplateDocument;\n dispatch: DocumentDispatch<ResourceTemplateAction>;\n}\n\nconst STATUS_OPTIONS = [\n { value: \"DRAFT\", label: \"Draft\", color: \"slate\" },\n { value: \"COMING_SOON\", label: \"Coming Soon\", color: \"sky\" },\n { value: \"ACTIVE\", label: \"Active\", color: \"emerald\" },\n { value: \"DEPRECATED\", label: \"Deprecated\", color: \"rose\" },\n] as const;\n\nconst AUDIENCE_PRESETS = [\n { label: \"Builders\", color: \"#0ea5e9\" },\n { label: \"Networks\", color: \"#10b981\" },\n];\n\n// Service templates for quick-add functionality\ninterface ServiceTemplate {\n title: string;\n description: string;\n icon: string;\n}\n\nconst SETUP_SERVICE_TEMPLATES: Record<string, ServiceTemplate[]> = {\n \"Legal Services\": [\n {\n title: \"Swiss association entity\",\n description: \"Legal entity formation as a Swiss association\",\n icon: \"🏛️\",\n },\n {\n title: \"Registered address (Zug)\",\n description: \"Official registered address in Zug, Switzerland\",\n icon: \"📍\",\n },\n {\n title: \"Legal document templates\",\n description: \"Access to standardized legal document templates\",\n icon: \"📋\",\n },\n ],\n};\n\nconst RECURRING_SERVICE_TEMPLATES: Record<string, ServiceTemplate[]> = {\n \"Operations & Finance\": [\n {\n title: \"Invoice management\",\n description: \"Professional invoice processing and management\",\n icon: \"📄\",\n },\n {\n title: \"Annual tax filing\",\n description: \"Yearly tax preparation and filing services\",\n icon: \"💰\",\n },\n {\n title: \"Monthly accounting & close\",\n description: \"Monthly bookkeeping and financial close\",\n icon: \"📊\",\n },\n ],\n \"Contributor & Payments\": [\n {\n title: \"Contributor operations\",\n description: \"Management of contributor payments and operations\",\n icon: \"👥\",\n },\n {\n title: \"Multi-currency payouts\",\n description: \"Support for payments in multiple currencies\",\n icon: \"💱\",\n },\n {\n title: \"Multiple entities\",\n description: \"Support for managing multiple legal entities\",\n icon: \"🏢\",\n },\n ],\n \"Support & Advisory\": [\n {\n title: \"Dedicated ops support\",\n description: \"Dedicated operations support team\",\n icon: \"🎯\",\n },\n {\n title: \"Dedicated account manager\",\n description: \"Personal point of contact for all needs\",\n icon: \"👤\",\n },\n ],\n};\n\nexport function TemplateInfo({ document, dispatch }: TemplateInfoProps) {\n const { state } = document;\n const globalState = state.global;\n\n const [formData, setFormData] = useState({\n title: globalState.title || \"\",\n subtitle: globalState.subtitle || \"\",\n summary: globalState.summary || \"\",\n description: globalState.description || \"\",\n operatorId: globalState.operatorId || \"\",\n thumbnailUrl: globalState.thumbnailUrl || \"\",\n infoLink: globalState.infoLink || \"\",\n status: globalState.status,\n });\n\n const [newSetupService, setNewSetupService] = useState(\"\");\n const [newRecurringService, setNewRecurringService] = useState(\"\");\n const [newAudienceLabel, setNewAudienceLabel] = useState(\"\");\n const [showAudienceInput, setShowAudienceInput] = useState(false);\n const [showSetupTemplates, setShowSetupTemplates] = useState(false);\n const [showRecurringTemplates, setShowRecurringTemplates] = useState(false);\n const [newFaqQuestion, setNewFaqQuestion] = useState(\"\");\n const [newFaqAnswer, setNewFaqAnswer] = useState(\"\");\n const [editingFaqId, setEditingFaqId] = useState<string | null>(null);\n const [editingFaqQuestion, setEditingFaqQuestion] = useState(\"\");\n const [editingFaqAnswer, setEditingFaqAnswer] = useState(\"\");\n const [newSectionTitle, setNewSectionTitle] = useState(\"\");\n const [newSectionContent, setNewSectionContent] = useState(\"\");\n const [editingSectionId, setEditingSectionId] = useState<string | null>(null);\n const [editingSectionTitle, setEditingSectionTitle] = useState(\"\");\n const [editingSectionContent, setEditingSectionContent] = useState(\"\");\n const [expandedSections, setExpandedSections] = useState<Set<string>>(\n new Set(),\n );\n const setupServiceInputRef = useRef<HTMLInputElement>(null);\n const recurringServiceInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setFormData({\n title: globalState.title || \"\",\n subtitle: globalState.subtitle || \"\",\n summary: globalState.summary || \"\",\n description: globalState.description || \"\",\n operatorId: globalState.operatorId || \"\",\n thumbnailUrl: globalState.thumbnailUrl || \"\",\n infoLink: globalState.infoLink || \"\",\n status: globalState.status,\n });\n }, [\n globalState.title,\n globalState.subtitle,\n globalState.summary,\n globalState.description,\n globalState.operatorId,\n globalState.thumbnailUrl,\n globalState.infoLink,\n globalState.status,\n ]);\n\n const handleFieldChange = (field: keyof typeof formData, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleInfoBlur = () => {\n const changes: Record<string, string | null> = {};\n let hasChanges = false;\n\n if (formData.title !== globalState.title) {\n changes.title = formData.title;\n hasChanges = true;\n }\n if (formData.summary !== globalState.summary) {\n changes.summary = formData.summary;\n hasChanges = true;\n }\n if (formData.description !== (globalState.description || \"\")) {\n changes.description = formData.description || null;\n hasChanges = true;\n }\n if (formData.thumbnailUrl !== (globalState.thumbnailUrl || \"\")) {\n changes.thumbnailUrl = formData.thumbnailUrl || null;\n hasChanges = true;\n }\n if (formData.infoLink !== (globalState.infoLink || \"\")) {\n changes.infoLink = formData.infoLink || null;\n hasChanges = true;\n }\n if (formData.subtitle !== (globalState.subtitle || \"\")) {\n changes.subtitle = formData.subtitle || null;\n hasChanges = true;\n }\n\n if (hasChanges) {\n dispatch(\n updateTemplateInfo({\n ...changes,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n };\n\n const handleOperatorBlur = () => {\n if (formData.operatorId !== globalState.operatorId) {\n dispatch(\n setOperator({\n operatorId: formData.operatorId,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n };\n\n const handleStatusChange = (value: string) => {\n const status = value as \"DRAFT\" | \"COMING_SOON\" | \"ACTIVE\" | \"DEPRECATED\";\n setFormData((prev) => ({ ...prev, status }));\n dispatch(\n updateTemplateStatus({\n status,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddAudience = (label: string, color?: string) => {\n if (!label.trim()) return;\n dispatch(\n addTargetAudience({\n id: generateId(),\n label: label.trim(),\n color: color || null,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewAudienceLabel(\"\");\n setShowAudienceInput(false);\n };\n\n const handleRemoveAudience = (id: string) => {\n dispatch(\n removeTargetAudience({\n id,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddSetupService = () => {\n if (!newSetupService.trim()) return;\n const updatedServices = [\n ...globalState.setupServices,\n newSetupService.trim(),\n ];\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewSetupService(\"\");\n setupServiceInputRef.current?.focus();\n };\n\n const handleRemoveSetupService = (index: number) => {\n const updatedServices = globalState.setupServices.filter(\n (_, i) => i !== index,\n );\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddRecurringService = () => {\n if (!newRecurringService.trim()) return;\n const updatedServices = [\n ...globalState.recurringServices,\n newRecurringService.trim(),\n ];\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewRecurringService(\"\");\n recurringServiceInputRef.current?.focus();\n };\n\n const handleRemoveRecurringService = (index: number) => {\n const updatedServices = globalState.recurringServices.filter(\n (_, i) => i !== index,\n );\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddSetupFromTemplate = (template: ServiceTemplate) => {\n if (globalState.setupServices.includes(template.title)) return;\n const updatedServices = [...globalState.setupServices, template.title];\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddRecurringFromTemplate = (template: ServiceTemplate) => {\n if (globalState.recurringServices.includes(template.title)) return;\n const updatedServices = [...globalState.recurringServices, template.title];\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveSetupService = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= globalState.setupServices.length) return;\n\n const reorderedServices = [...globalState.setupServices];\n [reorderedServices[index], reorderedServices[newIndex]] = [\n reorderedServices[newIndex],\n reorderedServices[index],\n ];\n\n dispatch(\n setSetupServices({\n services: reorderedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveRecurringService = (\n index: number,\n direction: \"up\" | \"down\",\n ) => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= globalState.recurringServices.length)\n return;\n\n const reorderedServices = [...globalState.recurringServices];\n [reorderedServices[index], reorderedServices[newIndex]] = [\n reorderedServices[newIndex],\n reorderedServices[index],\n ];\n\n dispatch(\n setRecurringServices({\n services: reorderedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n // FAQ Handlers\n const faqFields = globalState.faqFields || [];\n const sortedFaqs = [...faqFields].sort(\n (a, b) => a.displayOrder - b.displayOrder,\n );\n\n const handleAddFaq = () => {\n if (!newFaqQuestion.trim() || !newFaqAnswer.trim()) return;\n dispatch(\n addFaq({\n id: generateId(),\n question: newFaqQuestion.trim(),\n answer: newFaqAnswer.trim(),\n displayOrder: faqFields.length,\n }),\n );\n setNewFaqQuestion(\"\");\n setNewFaqAnswer(\"\");\n };\n\n const handleMoveFaq = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= sortedFaqs.length) return;\n\n const reorderedIds = sortedFaqs.map((f) => f.id);\n [reorderedIds[index], reorderedIds[newIndex]] = [\n reorderedIds[newIndex],\n reorderedIds[index],\n ];\n\n dispatch(\n reorderFaqs({\n faqIds: reorderedIds,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleStartEditFaq = (faq: FaqField) => {\n setEditingFaqId(faq.id);\n setEditingFaqQuestion(faq.question || \"\");\n setEditingFaqAnswer(faq.answer || \"\");\n };\n\n const handleSaveFaqEdit = () => {\n if (!editingFaqId || !editingFaqQuestion.trim() || !editingFaqAnswer.trim())\n return;\n dispatch(\n updateFaq({\n id: editingFaqId,\n question: editingFaqQuestion.trim(),\n answer: editingFaqAnswer.trim(),\n }),\n );\n setEditingFaqId(null);\n setEditingFaqQuestion(\"\");\n setEditingFaqAnswer(\"\");\n };\n\n const handleCancelFaqEdit = () => {\n setEditingFaqId(null);\n setEditingFaqQuestion(\"\");\n setEditingFaqAnswer(\"\");\n };\n\n const handleDeleteFaq = (id: string) => {\n dispatch(\n deleteFaq({\n id,\n }),\n );\n };\n\n // Content Section Handlers\n const contentSections = globalState.contentSections;\n const sortedSections = [...contentSections].sort(\n (a, b) => a.displayOrder - b.displayOrder,\n );\n\n const handleAddContentSection = () => {\n if (!newSectionTitle.trim() || !newSectionContent.trim()) return;\n dispatch(\n addContentSection({\n id: generateId(),\n title: newSectionTitle.trim(),\n content: newSectionContent.trim(),\n displayOrder: contentSections.length,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewSectionTitle(\"\");\n setNewSectionContent(\"\");\n };\n\n const handleStartEditSection = (section: ContentSection) => {\n setEditingSectionId(section.id);\n setEditingSectionTitle(section.title);\n setEditingSectionContent(section.content);\n };\n\n const handleSaveSectionEdit = () => {\n if (\n !editingSectionId ||\n !editingSectionTitle.trim() ||\n !editingSectionContent.trim()\n )\n return;\n dispatch(\n updateContentSection({\n id: editingSectionId,\n title: editingSectionTitle.trim(),\n content: editingSectionContent.trim(),\n lastModified: new Date().toISOString(),\n }),\n );\n setEditingSectionId(null);\n setEditingSectionTitle(\"\");\n setEditingSectionContent(\"\");\n };\n\n const handleCancelSectionEdit = () => {\n setEditingSectionId(null);\n setEditingSectionTitle(\"\");\n setEditingSectionContent(\"\");\n };\n\n const handleDeleteContentSection = (id: string) => {\n dispatch(\n deleteContentSection({\n id,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveSection = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= sortedSections.length) return;\n\n const reorderedIds = sortedSections.map((s) => s.id);\n [reorderedIds[index], reorderedIds[newIndex]] = [\n reorderedIds[newIndex],\n reorderedIds[index],\n ];\n\n dispatch(\n reorderContentSections({\n sectionIds: reorderedIds,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const toggleSectionExpanded = (id: string) => {\n setExpandedSections((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const currentStatus = STATUS_OPTIONS.find((s) => s.value === formData.status);\n\n const availablePresets = AUDIENCE_PRESETS.filter(\n (preset) =>\n !globalState.targetAudiences.some((a) => a.label === preset.label),\n );\n\n return (\n <>\n <style>{styles}</style>\n <div className=\"template-editor\">\n {/* Hero Section - Thumbnail & Core Identity */}\n <section className=\"template-editor__hero\">\n <div className=\"template-editor__thumbnail-area\">\n <div\n className=\"template-editor__thumbnail\"\n style={{\n backgroundImage: formData.thumbnailUrl\n ? `url(${formData.thumbnailUrl})`\n : undefined,\n }}\n >\n {!formData.thumbnailUrl && (\n <div className=\"template-editor__thumbnail-placeholder\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <path d=\"M21 15l-5-5L5 21\" />\n </svg>\n <span>Add Thumbnail</span>\n </div>\n )}\n {formData.thumbnailUrl && (\n <div\n className={`template-editor__status-badge template-editor__status-badge--${currentStatus?.color}`}\n >\n {currentStatus?.label}\n </div>\n )}\n </div>\n <div className=\"template-editor__thumbnail-input\">\n <input\n type=\"text\"\n value={formData.thumbnailUrl}\n onChange={(e) =>\n handleFieldChange(\"thumbnailUrl\", e.target.value)\n }\n onBlur={handleInfoBlur}\n placeholder=\"https://example.com/image.jpg\"\n className=\"template-editor__input template-editor__input--sm\"\n />\n </div>\n </div>\n\n <div className=\"template-editor__identity\">\n <div className=\"template-editor__title-row\">\n <input\n type=\"text\"\n value={formData.title}\n onChange={(e) => handleFieldChange(\"title\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__title-input\"\n placeholder=\"Product Title\"\n />\n <div className=\"template-editor__status-select\">\n <select\n value={formData.status}\n onChange={(e) => handleStatusChange(e.target.value)}\n className=\"template-editor__select\"\n data-status={currentStatus?.color}\n >\n {STATUS_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <span\n className={`template-editor__status-indicator template-editor__status-indicator--${currentStatus?.color}`}\n />\n </div>\n </div>\n\n <input\n type=\"text\"\n value={formData.subtitle}\n onChange={(e) => handleFieldChange(\"subtitle\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__title-input\"\n placeholder=\"Subtitle / Tagline\"\n style={{\n fontSize: \"0.95rem\",\n fontWeight: 400,\n color: \"var(--rt-slate-600, #475569)\",\n marginTop: \"-4px\",\n }}\n />\n\n {/* Target Audiences */}\n <div className=\"template-editor__audiences\">\n {globalState.targetAudiences.map((audience: TargetAudience) => (\n <span\n key={audience.id}\n className=\"template-editor__audience-tag\"\n style={\n audience.color\n ? {\n backgroundColor: `${audience.color}15`,\n borderColor: `${audience.color}40`,\n color: audience.color,\n }\n : undefined\n }\n >\n {audience.label}\n <button\n type=\"button\"\n onClick={() => handleRemoveAudience(audience.id)}\n className=\"template-editor__audience-remove\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </span>\n ))}\n\n {showAudienceInput ? (\n <div className=\"template-editor__audience-input-wrap\">\n <input\n type=\"text\"\n value={newAudienceLabel}\n onChange={(e) => setNewAudienceLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\")\n handleAddAudience(newAudienceLabel);\n if (e.key === \"Escape\") setShowAudienceInput(false);\n }}\n placeholder=\"Audience name...\"\n className=\"template-editor__audience-input\"\n autoFocus\n />\n <button\n type=\"button\"\n onClick={() => handleAddAudience(newAudienceLabel)}\n className=\"template-editor__audience-add-btn\"\n >\n Add\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setShowAudienceInput(true)}\n className=\"template-editor__add-audience-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add Audience\n </button>\n )}\n </div>\n\n {availablePresets.length > 0 && (\n <div className=\"template-editor__audience-presets\">\n <span className=\"template-editor__presets-label\">\n Quick add:\n </span>\n {availablePresets.slice(0, 4).map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() =>\n handleAddAudience(preset.label, preset.color)\n }\n className=\"template-editor__preset-btn\"\n style={{ color: preset.color }}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n <textarea\n value={formData.summary}\n onChange={(e) => handleFieldChange(\"summary\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__summary\"\n placeholder=\"Brief summary of your product...\"\n rows={2}\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n marginTop: \"8px\",\n }}\n >\n <label\n style={{\n fontSize: \"0.75rem\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"var(--rt-slate-500, #64748b)\",\n whiteSpace: \"nowrap\",\n }}\n >\n Sort Weight\n </label>\n <input\n type=\"number\"\n value={globalState.weight ?? \"\"}\n onChange={(e) => {\n const val =\n e.target.value === \"\" ? null : parseInt(e.target.value, 10);\n dispatch(\n setWeight({\n weight: Number.isNaN(val) ? null : val,\n lastModified: new Date().toISOString(),\n }),\n );\n }}\n placeholder=\"—\"\n style={{\n width: \"72px\",\n padding: \"4px 8px\",\n fontSize: \"0.8125rem\",\n border: \"1px solid var(--rt-slate-200, #e2e8f0)\",\n borderRadius: \"6px\",\n outline: \"none\",\n textAlign: \"center\",\n fontFamily: \"var(--rt-font-mono, monospace)\",\n }}\n />\n <span\n style={{\n fontSize: \"0.6875rem\",\n color: \"var(--rt-slate-400, #94a3b8)\",\n }}\n >\n Lower = higher priority\n </span>\n </div>\n </div>\n </section>\n\n {/* Description */}\n {/* <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--violet\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h10\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">Description</h3>\n <p className=\"template-editor__card-subtitle\">\n Detailed description of your product\n </p>\n </div>\n </div>\n <textarea\n value={formData.description}\n onChange={(e) => handleFieldChange(\"description\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__textarea\"\n placeholder=\"Provide a comprehensive description of your product, including what makes it unique and valuable...\"\n rows={4}\n />\n </section> */}\n\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--violet\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h10\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">Description</h3>\n <p className=\"template-editor__card-subtitle\">\n Detailed description of your product\n </p>\n </div>\n </div>\n <MarkdownEditor\n label=\"\"\n height={350}\n value={formData.description}\n onChange={(value: string) =>\n handleFieldChange(\"description\", value)\n }\n onBlur={handleInfoBlur}\n />\n </section>\n\n {/* Expandable Content Sections */}\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--indigo\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 10h16M4 14h10M4 18h6\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Expandable Content Sections\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Add long-form article content with expandable titles\n </p>\n </div>\n </div>\n\n <div className=\"template-editor__sections-list\">\n {sortedSections.map((section: ContentSection, index: number) => (\n <div\n key={section.id}\n className={`template-editor__section-item ${editingSectionId === section.id ? \"template-editor__section-item--editing\" : \"\"}`}\n >\n {editingSectionId === section.id ? (\n <div className=\"template-editor__section-edit-form\">\n <input\n type=\"text\"\n value={editingSectionTitle}\n onChange={(e) => setEditingSectionTitle(e.target.value)}\n className=\"template-editor__section-edit-title\"\n placeholder=\"Section title\"\n autoFocus\n />\n <textarea\n value={editingSectionContent}\n onChange={(e) => setEditingSectionContent(e.target.value)}\n className=\"template-editor__section-edit-content\"\n placeholder=\"Section content...\"\n rows={6}\n />\n <div className=\"template-editor__section-edit-actions\">\n <button\n type=\"button\"\n onClick={handleSaveSectionEdit}\n className=\"template-editor__section-save-btn\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelSectionEdit}\n className=\"template-editor__section-cancel-btn\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"template-editor__section-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveSection(index, \"up\")}\n className=\"template-editor__section-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveSection(index, \"down\")}\n className=\"template-editor__section-reorder-btn\"\n disabled={index === sortedSections.length - 1}\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => toggleSectionExpanded(section.id)}\n className=\"template-editor__section-toggle\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={`template-editor__section-chevron ${expandedSections.has(section.id) ? \"template-editor__section-chevron--expanded\" : \"\"}`}\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n <div className=\"template-editor__section-main\">\n <div\n className=\"template-editor__section-header\"\n onClick={() => toggleSectionExpanded(section.id)}\n >\n <span className=\"template-editor__section-title\">\n {section.title}\n </span>\n <span className=\"template-editor__section-preview\">\n {section.content.length > 80\n ? `${section.content.substring(0, 80)}...`\n : section.content}\n </span>\n </div>\n {expandedSections.has(section.id) && (\n <div className=\"template-editor__section-content\">\n {section.content}\n </div>\n )}\n </div>\n <div className=\"template-editor__section-actions\">\n <button\n type=\"button\"\n onClick={() => handleStartEditSection(section)}\n className=\"template-editor__section-action-btn\"\n title=\"Edit section\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleDeleteContentSection(section.id)}\n className=\"template-editor__section-action-btn template-editor__section-action-btn--delete\"\n title=\"Delete section\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\n </svg>\n </button>\n </div>\n </>\n )}\n </div>\n ))}\n </div>\n\n {/* Add new section form */}\n <div className=\"template-editor__section-add-form\">\n <input\n type=\"text\"\n value={newSectionTitle}\n onChange={(e) => setNewSectionTitle(e.target.value)}\n placeholder=\"New section title...\"\n className=\"template-editor__section-new-title\"\n />\n <textarea\n value={newSectionContent}\n onChange={(e) => setNewSectionContent(e.target.value)}\n placeholder=\"Section content (long-form article content)...\"\n className=\"template-editor__section-new-content\"\n rows={4}\n />\n {(newSectionTitle || newSectionContent) && (\n <button\n type=\"button\"\n onClick={handleAddContentSection}\n className=\"template-editor__section-add-btn\"\n disabled={!newSectionTitle.trim() || !newSectionContent.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add Section\n </button>\n )}\n </div>\n </section>\n\n {/* FAQ Section */}\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--sky\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Frequently Asked Questions\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Common questions and answers about this product\n </p>\n </div>\n </div>\n\n <div className=\"template-editor__faq-list\">\n {sortedFaqs.map((faq: FaqField, index: number) => (\n <div\n key={faq.id}\n className={`template-editor__faq-item ${editingFaqId === faq.id ? \"template-editor__faq-item--editing\" : \"\"}`}\n >\n {editingFaqId === faq.id ? (\n <div className=\"template-editor__faq-edit-form\">\n <input\n type=\"text\"\n value={editingFaqQuestion}\n onChange={(e) => setEditingFaqQuestion(e.target.value)}\n className=\"template-editor__faq-edit-question\"\n placeholder=\"Question\"\n autoFocus\n />\n <textarea\n value={editingFaqAnswer}\n onChange={(e) => setEditingFaqAnswer(e.target.value)}\n className=\"template-editor__faq-edit-answer\"\n placeholder=\"Answer\"\n rows={3}\n />\n <div className=\"template-editor__faq-edit-actions\">\n <button\n type=\"button\"\n onClick={handleSaveFaqEdit}\n className=\"template-editor__faq-save-btn\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelFaqEdit}\n className=\"template-editor__faq-cancel-btn\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"template-editor__faq-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveFaq(index, \"up\")}\n className=\"template-editor__faq-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveFaq(index, \"down\")}\n className=\"template-editor__faq-reorder-btn\"\n disabled={index === sortedFaqs.length - 1}\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <div className=\"template-editor__faq-number\">\n {index + 1}\n </div>\n <div className=\"template-editor__faq-content\">\n <div className=\"template-editor__faq-question\">\n {faq.question}\n </div>\n <div className=\"template-editor__faq-answer\">\n {faq.answer}\n </div>\n </div>\n <div className=\"template-editor__faq-actions\">\n <button\n type=\"button\"\n onClick={() => handleStartEditFaq(faq)}\n className=\"template-editor__faq-action-btn\"\n title=\"Edit FAQ\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleDeleteFaq(faq.id)}\n className=\"template-editor__faq-action-btn template-editor__faq-action-btn--delete\"\n title=\"Delete FAQ\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\n </svg>\n </button>\n </div>\n </>\n )}\n </div>\n ))}\n </div>\n\n {/* Add new FAQ form */}\n <div className=\"template-editor__faq-add-form\">\n <input\n type=\"text\"\n value={newFaqQuestion}\n onChange={(e) => setNewFaqQuestion(e.target.value)}\n placeholder=\"New question...\"\n className=\"template-editor__faq-new-question\"\n />\n <textarea\n value={newFaqAnswer}\n onChange={(e) => setNewFaqAnswer(e.target.value)}\n placeholder=\"Answer to the question...\"\n className=\"template-editor__faq-new-answer\"\n rows={2}\n />\n {(newFaqQuestion || newFaqAnswer) && (\n <button\n type=\"button\"\n onClick={handleAddFaq}\n className=\"template-editor__faq-add-btn\"\n disabled={!newFaqQuestion.trim() || !newFaqAnswer.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add FAQ\n </button>\n )}\n </div>\n </section>\n\n {/* Services Information Section Divider */}\n <div className=\"template-editor__section-divider\">\n <div className=\"template-editor__section-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n Services Information\n </div>\n <div className=\"template-editor__section-divider-line\" />\n </div>\n\n {/* Services Grid */}\n <div className=\"template-editor__grid\">\n <section className=\"template-editor__card\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--emerald\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Formation & Setup\n </h3>\n <p className=\"template-editor__card-subtitle\">\n One-time setup services\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowSetupTemplates(!showSetupTemplates)}\n className={`template-editor__templates-toggle ${showSetupTemplates ? \"template-editor__templates-toggle--active\" : \"\"}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Templates\n </button>\n </div>\n\n {showSetupTemplates && (\n <div className=\"template-editor__templates-panel\">\n {Object.entries(SETUP_SERVICE_TEMPLATES).map(\n ([category, templates]) => (\n <div\n key={category}\n className=\"template-editor__template-category\"\n >\n <span className=\"template-editor__template-category-label\">\n {category}\n </span>\n <div className=\"template-editor__template-items\">\n {templates.map((template) => {\n const isAdded = globalState.setupServices.includes(\n template.title,\n );\n return (\n <button\n key={template.title}\n type=\"button\"\n onClick={() =>\n handleAddSetupFromTemplate(template)\n }\n disabled={isAdded}\n className={`template-editor__template-item ${isAdded ? \"template-editor__template-item--added\" : \"\"}`}\n title={template.description}\n >\n <span className=\"template-editor__template-icon\">\n {template.icon}\n </span>\n <span className=\"template-editor__template-title\">\n {template.title}\n </span>\n {isAdded && (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className=\"template-editor__template-check\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n\n <div className=\"template-editor__services\">\n {globalState.setupServices.map(\n (service: string, index: number) => (\n <div key={index} className=\"template-editor__service\">\n <div className=\"template-editor__service-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveSetupService(index, \"up\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveSetupService(index, \"down\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={\n index === globalState.setupServices.length - 1\n }\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <span className=\"template-editor__service-bullet\" />\n <span className=\"template-editor__service-text\">\n {service}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveSetupService(index)}\n className=\"template-editor__service-remove\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </div>\n ),\n )}\n <div className=\"template-editor__add-service\">\n <span className=\"template-editor__service-bullet template-editor__service-bullet--ghost\" />\n <input\n ref={setupServiceInputRef}\n type=\"text\"\n value={newSetupService}\n onChange={(e) => setNewSetupService(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddSetupService();\n }}\n placeholder=\"Add a setup service...\"\n className=\"template-editor__service-new-input\"\n />\n {newSetupService && (\n <button\n type=\"button\"\n onClick={handleAddSetupService}\n className=\"template-editor__service-add-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </section>\n\n <section className=\"template-editor__card\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--amber\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M12 8v4l3 3\" />\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Recurring Services\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Ongoing services included\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n setShowRecurringTemplates(!showRecurringTemplates)\n }\n className={`template-editor__templates-toggle template-editor__templates-toggle--amber ${showRecurringTemplates ? \"template-editor__templates-toggle--active\" : \"\"}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Templates\n </button>\n </div>\n\n {showRecurringTemplates && (\n <div className=\"template-editor__templates-panel template-editor__templates-panel--amber\">\n {Object.entries(RECURRING_SERVICE_TEMPLATES).map(\n ([category, templates]) => (\n <div\n key={category}\n className=\"template-editor__template-category\"\n >\n <span className=\"template-editor__template-category-label\">\n {category}\n </span>\n <div className=\"template-editor__template-items\">\n {templates.map((template) => {\n const isAdded =\n globalState.recurringServices.includes(\n template.title,\n );\n return (\n <button\n key={template.title}\n type=\"button\"\n onClick={() =>\n handleAddRecurringFromTemplate(template)\n }\n disabled={isAdded}\n className={`template-editor__template-item template-editor__template-item--amber ${isAdded ? \"template-editor__template-item--added\" : \"\"}`}\n title={template.description}\n >\n <span className=\"template-editor__template-icon\">\n {template.icon}\n </span>\n <span className=\"template-editor__template-title\">\n {template.title}\n </span>\n {isAdded && (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className=\"template-editor__template-check\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n\n <div className=\"template-editor__services\">\n {globalState.recurringServices.map(\n (service: string, index: number) => (\n <div key={index} className=\"template-editor__service\">\n <div className=\"template-editor__service-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveRecurringService(index, \"up\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n handleMoveRecurringService(index, \"down\")\n }\n className=\"template-editor__service-reorder-btn\"\n disabled={\n index === globalState.recurringServices.length - 1\n }\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <span className=\"template-editor__service-bullet template-editor__service-bullet--recurring\" />\n <span className=\"template-editor__service-text\">\n {service}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveRecurringService(index)}\n className=\"template-editor__service-remove\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </div>\n ),\n )}\n <div className=\"template-editor__add-service\">\n <span className=\"template-editor__service-bullet template-editor__service-bullet--ghost\" />\n <input\n ref={recurringServiceInputRef}\n type=\"text\"\n value={newRecurringService}\n onChange={(e) => setNewRecurringService(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddRecurringService();\n }}\n placeholder=\"Add a recurring service...\"\n className=\"template-editor__service-new-input\"\n />\n {newRecurringService && (\n <button\n type=\"button\"\n onClick={handleAddRecurringService}\n className=\"template-editor__service-add-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </section>\n </div>\n\n {/* Metadata Row */}\n <section className=\"template-editor__metadata\">\n <div className=\"template-editor__meta-field\">\n <label className=\"template-editor__label\">Operator ID</label>\n <input\n type=\"text\"\n value={formData.operatorId}\n onChange={(e) => handleFieldChange(\"operatorId\", e.target.value)}\n onBlur={handleOperatorBlur}\n className=\"template-editor__input template-editor__input--mono\"\n placeholder=\"operator-123\"\n />\n </div>\n <div className=\"template-editor__meta-field\">\n <label className=\"template-editor__label\">More Info Link</label>\n <input\n type=\"text\"\n value={formData.infoLink}\n onChange={(e) => handleFieldChange(\"infoLink\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__input\"\n placeholder=\"https://example.com/more-info\"\n />\n </div>\n </section>\n </div>\n </>\n );\n}\n\nconst styles = `\n @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400;500;600;700&display=swap');\n\n .template-editor {\n --te-font: 'Instrument Sans', system-ui, sans-serif;\n --te-mono: 'DM Mono', 'SF Mono', monospace;\n\n --te-ink: #1a1f36;\n --te-ink-light: #4a5578;\n --te-ink-muted: #8792a8;\n --te-surface: #ffffff;\n --te-surface-raised: #fafbfc;\n --te-border: #e4e8f0;\n --te-border-light: #f0f2f7;\n\n --te-violet: #7c5cff;\n --te-violet-light: #f4f1ff;\n --te-amber: #f59e0b;\n --te-amber-light: #fef7e6;\n --te-emerald: #10b981;\n --te-emerald-light: #e8faf3;\n --te-sky: #0ea5e9;\n --te-sky-light: #e8f7fc;\n --te-rose: #f43f5e;\n --te-rose-light: #fef1f3;\n --te-slate: #64748b;\n --te-slate-light: #f1f5f9;\n --te-teal: #14b8a6;\n --te-teal-light: #ccfbf1;\n\n font-family: var(--te-font);\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* Hero Section */\n .template-editor__hero {\n display: grid;\n grid-template-columns: 160px 1fr;\n gap: 28px;\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n border-left: 4px solid var(--te-teal);\n }\n\n .template-editor__thumbnail-area {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .template-editor__thumbnail {\n width: 160px;\n height: 120px;\n border-radius: 12px;\n background: linear-gradient(135deg, var(--te-border-light) 0%, var(--te-border) 100%);\n background-size: cover;\n background-position: center;\n position: relative;\n overflow: hidden;\n transition: transform 0.2s ease;\n }\n\n .template-editor__thumbnail:hover {\n transform: scale(1.02);\n }\n\n .template-editor__thumbnail-placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: var(--te-ink-muted);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .template-editor__thumbnail-placeholder svg {\n width: 32px;\n height: 32px;\n opacity: 0.5;\n }\n\n .template-editor__status-badge {\n position: absolute;\n top: 8px;\n left: 8px;\n padding: 4px 10px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-radius: 100px;\n backdrop-filter: blur(8px);\n }\n\n .template-editor__status-badge--emerald {\n background: rgba(16, 185, 129, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--sky {\n background: rgba(14, 165, 233, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--slate {\n background: rgba(100, 116, 139, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--rose {\n background: rgba(244, 63, 94, 0.9);\n color: white;\n }\n\n .template-editor__thumbnail-input {\n width: 100%;\n }\n\n .template-editor__identity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .template-editor__title-row {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .template-editor__title-input {\n flex: 1;\n font-family: var(--te-font);\n font-size: 1.75rem;\n font-weight: 700;\n color: var(--te-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n letter-spacing: -0.02em;\n }\n\n .template-editor__title-input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__status-select {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .template-editor__select {\n appearance: none;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n padding: 8px 32px 8px 28px;\n border-radius: 100px;\n border: 1.5px solid var(--te-border);\n background: var(--te-surface-raised);\n color: var(--te-ink-light);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__select:hover {\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__select:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__status-indicator {\n position: absolute;\n left: 10px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .template-editor__status-indicator--emerald { background: var(--te-emerald); }\n .template-editor__status-indicator--sky { background: var(--te-sky); }\n .template-editor__status-indicator--slate { background: var(--te-slate); }\n .template-editor__status-indicator--rose { background: var(--te-rose); }\n\n /* Audiences */\n .template-editor__audiences {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n }\n\n .template-editor__audience-tag {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.8125rem;\n font-weight: 600;\n border-radius: 100px;\n background: var(--te-teal-light);\n border: 1px solid rgba(20, 184, 166, 0.2);\n color: var(--te-teal);\n transition: all 0.15s ease;\n }\n\n .template-editor__audience-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__audience-remove:hover {\n opacity: 1;\n }\n\n .template-editor__audience-remove svg {\n width: 12px;\n height: 12px;\n }\n\n .template-editor__add-audience-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--te-ink-muted);\n background: transparent;\n border: 1.5px dashed var(--te-border);\n border-radius: 100px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__add-audience-btn:hover {\n border-color: var(--te-ink-muted);\n color: var(--te-ink-light);\n }\n\n .template-editor__add-audience-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__audience-input-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .template-editor__audience-input {\n width: 140px;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n border: 1.5px solid var(--te-teal);\n border-radius: 100px;\n outline: none;\n background: var(--te-surface);\n }\n\n .template-editor__audience-add-btn {\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 600;\n color: white;\n background: var(--te-teal);\n border: none;\n border-radius: 100px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__audience-add-btn:hover {\n background: #0d9488;\n }\n\n .template-editor__audience-presets {\n display: flex;\n align-items: center;\n gap: 8px;\n padding-top: 4px;\n }\n\n .template-editor__presets-label {\n font-size: 0.75rem;\n color: var(--te-ink-muted);\n }\n\n .template-editor__preset-btn {\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 500;\n padding: 4px 8px;\n background: transparent;\n border: none;\n cursor: pointer;\n opacity: 0.7;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__preset-btn:hover {\n opacity: 1;\n }\n\n .template-editor__summary {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n line-height: 1.6;\n color: var(--te-ink-light);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n padding: 0;\n }\n\n .template-editor__summary::placeholder {\n color: var(--te-ink-muted);\n }\n\n /* Section Divider */\n .template-editor__section-divider {\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 8px 0;\n }\n\n .template-editor__section-divider-line {\n flex: 1;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--te-border), transparent);\n }\n\n .template-editor__section-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, var(--te-emerald-light) 0%, var(--te-teal-light) 100%);\n color: var(--te-emerald);\n border-radius: 100px;\n font-size: 0.8125rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n white-space: nowrap;\n }\n\n .template-editor__section-badge svg {\n width: 16px;\n height: 16px;\n }\n\n /* Grid Cards */\n .template-editor__grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n }\n\n .template-editor__card {\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__card-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n margin-bottom: 20px;\n }\n\n .template-editor__card-icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .template-editor__card-icon svg {\n width: 20px;\n height: 20px;\n }\n\n .template-editor__card-icon--violet {\n background: var(--te-violet-light);\n color: var(--te-violet);\n }\n\n .template-editor__card-icon--amber {\n background: var(--te-amber-light);\n color: var(--te-amber);\n }\n\n .template-editor__card-icon--emerald {\n background: var(--te-emerald-light);\n color: var(--te-emerald);\n }\n\n .template-editor__card--full {\n grid-column: 1 / -1;\n }\n\n .template-editor__card-title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--te-ink);\n margin: 0 0 2px;\n }\n\n .template-editor__card-subtitle {\n font-size: 0.8125rem;\n color: var(--te-ink-muted);\n margin: 0;\n }\n\n .template-editor__textarea {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n line-height: 1.7;\n color: var(--te-ink);\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n padding: 16px;\n resize: vertical;\n transition: all 0.15s ease;\n }\n\n .template-editor__textarea:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__textarea:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__textarea::placeholder {\n color: var(--te-ink-muted);\n }\n\n /* Services */\n .template-editor__services {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-editor__service {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--te-surface-raised);\n border-radius: 8px;\n transition: background 0.15s ease;\n }\n\n .template-editor__service:hover {\n background: var(--te-border-light);\n }\n\n .template-editor__service-bullet {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--te-emerald);\n flex-shrink: 0;\n }\n\n .template-editor__service-bullet--recurring {\n background: var(--te-amber);\n }\n\n .template-editor__service-bullet--ghost {\n background: var(--te-border);\n }\n\n .template-editor__service-text {\n flex: 1;\n font-size: 0.875rem;\n color: var(--te-ink);\n }\n\n .template-editor__service-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--te-ink-muted);\n opacity: 0;\n transition: all 0.15s ease;\n }\n\n .template-editor__service:hover .template-editor__service-remove {\n opacity: 1;\n }\n\n .template-editor__service-remove:hover {\n background: var(--te-rose-light);\n color: var(--te-rose);\n }\n\n .template-editor__service-remove svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__service-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__service:hover .template-editor__service-reorder {\n opacity: 1;\n }\n\n .template-editor__service-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 14px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__service-reorder-btn:hover:not(:disabled) {\n background: var(--te-emerald-light);\n color: var(--te-emerald);\n }\n\n .template-editor__service-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__service-reorder-btn svg {\n width: 12px;\n height: 12px;\n }\n\n .template-editor__add-service {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: transparent;\n border: 1.5px dashed var(--te-border);\n border-radius: 8px;\n transition: all 0.15s ease;\n }\n\n .template-editor__add-service:focus-within {\n border-color: var(--te-teal);\n border-style: solid;\n }\n\n .template-editor__service-new-input {\n flex: 1;\n font-family: var(--te-font);\n font-size: 0.875rem;\n background: transparent;\n border: none;\n outline: none;\n color: var(--te-ink);\n }\n\n .template-editor__service-new-input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__service-add-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: var(--te-teal);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: white;\n transition: background 0.15s ease;\n }\n\n .template-editor__service-add-btn:hover {\n background: #0d9488;\n }\n\n .template-editor__service-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Metadata */\n .template-editor__metadata {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__meta-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-editor__label {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--te-ink-muted);\n }\n\n .template-editor__input {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n padding: 12px 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 10px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__input:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__input:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__input--sm {\n font-size: 0.8125rem;\n padding: 8px 12px;\n }\n\n .template-editor__input--mono {\n font-family: var(--te-mono);\n font-size: 0.875rem;\n }\n\n /* Facet Targeting */\n .template-editor__facets {\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__facets-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n margin-bottom: 20px;\n }\n\n .template-editor__card-icon--sky {\n background: var(--te-sky-light);\n color: var(--te-sky);\n }\n\n .template-editor__facets-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n }\n\n .template-editor__facet-card {\n background: var(--te-surface-raised);\n border: 1px solid var(--te-border-light);\n border-radius: 12px;\n padding: 16px;\n transition: border-color 0.15s ease;\n }\n\n .template-editor__facet-card:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__facet-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n }\n\n .template-editor__facet-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--te-ink);\n }\n\n .template-editor__facet-clear {\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 500;\n padding: 4px 8px;\n background: transparent;\n border: none;\n color: var(--te-ink-muted);\n cursor: pointer;\n transition: color 0.15s ease;\n }\n\n .template-editor__facet-clear:hover {\n color: var(--te-rose);\n }\n\n .template-editor__facet-desc {\n font-size: 0.75rem;\n color: var(--te-ink-muted);\n margin: 0 0 12px;\n }\n\n .template-editor__facet-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .template-editor__facet-option {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__facet-option:hover {\n border-color: var(--te-border);\n background: var(--te-surface);\n }\n\n .template-editor__facet-option--selected {\n border-color: var(--te-teal);\n background: var(--te-teal-light);\n color: var(--te-ink);\n }\n\n .template-editor__facet-option--selected:hover {\n border-color: var(--te-teal);\n background: var(--te-teal-light);\n }\n\n .template-editor__facet-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n transition: all 0.15s ease;\n }\n\n .template-editor__facet-option--selected .template-editor__facet-checkbox {\n background: var(--te-teal);\n border-color: var(--te-teal);\n }\n\n .template-editor__facet-checkbox svg {\n width: 12px;\n height: 12px;\n color: white;\n }\n\n /* Templates Panel */\n .template-editor__templates-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--te-emerald);\n background: var(--te-emerald-light);\n border: 1.5px solid transparent;\n border-radius: 100px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__templates-toggle svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__templates-toggle:hover {\n border-color: var(--te-emerald);\n }\n\n .template-editor__templates-toggle--active {\n background: var(--te-emerald);\n color: white;\n }\n\n .template-editor__templates-toggle--amber {\n color: var(--te-amber);\n background: var(--te-amber-light);\n }\n\n .template-editor__templates-toggle--amber:hover {\n border-color: var(--te-amber);\n }\n\n .template-editor__templates-toggle--amber.template-editor__templates-toggle--active {\n background: var(--te-amber);\n color: white;\n }\n\n .template-editor__templates-panel {\n background: var(--te-emerald-light);\n border: 1px solid rgba(16, 185, 129, 0.2);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n animation: templatesPanelSlide 0.2s ease-out;\n }\n\n .template-editor__templates-panel--amber {\n background: var(--te-amber-light);\n border-color: rgba(245, 158, 11, 0.2);\n }\n\n @keyframes templatesPanelSlide {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .template-editor__template-category {\n margin-bottom: 12px;\n }\n\n .template-editor__template-category:last-child {\n margin-bottom: 0;\n }\n\n .template-editor__template-category-label {\n display: block;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--te-ink-muted);\n margin-bottom: 8px;\n }\n\n .template-editor__template-items {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .template-editor__template-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--te-ink);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__template-item:hover:not(:disabled) {\n border-color: var(--te-emerald);\n background: white;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15);\n }\n\n .template-editor__template-item--amber:hover:not(:disabled) {\n border-color: var(--te-amber);\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.15);\n }\n\n .template-editor__template-item--added {\n background: var(--te-emerald-light);\n border-color: var(--te-emerald);\n color: var(--te-emerald);\n cursor: default;\n }\n\n .template-editor__template-item--amber.template-editor__template-item--added {\n background: var(--te-amber-light);\n border-color: var(--te-amber);\n color: var(--te-amber);\n }\n\n .template-editor__template-icon {\n font-size: 0.875rem;\n }\n\n .template-editor__template-title {\n white-space: nowrap;\n }\n\n .template-editor__template-check {\n width: 14px;\n height: 14px;\n margin-left: 2px;\n }\n\n /* FAQ Section */\n .template-editor__faq-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .template-editor__faq-item {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-item:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-item--editing {\n border-color: var(--te-sky);\n background: var(--te-sky-light);\n }\n\n .template-editor__faq-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n background: var(--te-sky-light);\n color: var(--te-sky);\n font-size: 0.8125rem;\n font-weight: 700;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n .template-editor__faq-content {\n flex: 1;\n min-width: 0;\n }\n\n .template-editor__faq-question {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink);\n margin-bottom: 6px;\n line-height: 1.4;\n }\n\n .template-editor__faq-answer {\n font-size: 0.875rem;\n color: var(--te-ink-light);\n line-height: 1.6;\n }\n\n .template-editor__faq-actions {\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__faq-item:hover .template-editor__faq-actions {\n opacity: 1;\n }\n\n .template-editor__faq-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-action-btn:hover {\n border-color: var(--te-sky);\n color: var(--te-sky);\n background: var(--te-sky-light);\n }\n\n .template-editor__faq-action-btn--delete:hover {\n border-color: var(--te-rose);\n color: var(--te-rose);\n background: var(--te-rose-light);\n }\n\n .template-editor__faq-action-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .template-editor__faq-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__faq-item:hover .template-editor__faq-reorder {\n opacity: 1;\n }\n\n .template-editor__faq-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-reorder-btn:hover:not(:disabled) {\n background: var(--te-sky-light);\n color: var(--te-sky);\n }\n\n .template-editor__faq-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__faq-reorder-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__faq-edit-form {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .template-editor__faq-edit-question {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n }\n\n .template-editor__faq-edit-question:focus {\n outline: none;\n border-color: var(--te-sky);\n }\n\n .template-editor__faq-edit-answer {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 60px;\n }\n\n .template-editor__faq-edit-answer:focus {\n outline: none;\n border-color: var(--te-sky);\n }\n\n .template-editor__faq-edit-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .template-editor__faq-save-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: white;\n background: var(--te-sky);\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__faq-save-btn:hover {\n background: #0284c7;\n }\n\n .template-editor__faq-cancel-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-cancel-btn:hover {\n background: var(--te-surface-raised);\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__faq-add-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px dashed var(--te-border);\n border-radius: 12px;\n }\n\n .template-editor__faq-new-question {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-new-question:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-new-question:focus {\n outline: none;\n border-color: var(--te-sky);\n box-shadow: 0 0 0 3px var(--te-sky-light);\n }\n\n .template-editor__faq-new-question::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__faq-new-answer {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 60px;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-new-answer:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-new-answer:focus {\n outline: none;\n border-color: var(--te-sky);\n box-shadow: 0 0 0 3px var(--te-sky-light);\n }\n\n .template-editor__faq-new-answer::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__faq-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 20px;\n font-family: var(--te-font);\n font-size: 0.875rem;\n font-weight: 600;\n color: white;\n background: var(--te-sky);\n border: none;\n border-radius: 8px;\n cursor: pointer;\n align-self: flex-start;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-add-btn:hover:not(:disabled) {\n background: #0284c7;\n }\n\n .template-editor__faq-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .template-editor__faq-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Content Sections */\n .template-editor__card-icon--indigo {\n background: #eef2ff;\n color: #6366f1;\n }\n\n .template-editor__sections-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .template-editor__section-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-item:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-item--editing {\n border-color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__section-item:hover .template-editor__section-reorder {\n opacity: 1;\n }\n\n .template-editor__section-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-reorder-btn:hover:not(:disabled) {\n background: #e0e7ff;\n color: #6366f1;\n }\n\n .template-editor__section-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__section-reorder-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__section-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n flex-shrink: 0;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-toggle:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-chevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n }\n\n .template-editor__section-chevron--expanded {\n transform: rotate(180deg);\n }\n\n .template-editor__section-main {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n }\n\n .template-editor__section-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .template-editor__section-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink);\n line-height: 1.4;\n }\n\n .template-editor__section-preview {\n font-size: 0.8125rem;\n color: var(--te-ink-muted);\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .template-editor__section-content {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--te-border-light);\n font-size: 0.875rem;\n color: var(--te-ink-light);\n line-height: 1.7;\n white-space: pre-wrap;\n animation: sectionExpand 0.2s ease-out;\n }\n\n @keyframes sectionExpand {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 1000px;\n }\n }\n\n .template-editor__section-actions {\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s ease;\n flex-shrink: 0;\n }\n\n .template-editor__section-item:hover .template-editor__section-actions {\n opacity: 1;\n }\n\n .template-editor__section-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-action-btn:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-action-btn--delete:hover {\n border-color: var(--te-rose);\n color: var(--te-rose);\n background: var(--te-rose-light);\n }\n\n .template-editor__section-action-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .template-editor__section-edit-form {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .template-editor__section-edit-title {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n }\n\n .template-editor__section-edit-title:focus {\n outline: none;\n border-color: #6366f1;\n }\n\n .template-editor__section-edit-content {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 120px;\n line-height: 1.6;\n }\n\n .template-editor__section-edit-content:focus {\n outline: none;\n border-color: #6366f1;\n }\n\n .template-editor__section-edit-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .template-editor__section-save-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: white;\n background: #6366f1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__section-save-btn:hover {\n background: #4f46e5;\n }\n\n .template-editor__section-cancel-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-cancel-btn:hover {\n background: var(--te-surface-raised);\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__section-add-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px dashed var(--te-border);\n border-radius: 12px;\n }\n\n .template-editor__section-new-title {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-new-title:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-new-title:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px #eef2ff;\n }\n\n .template-editor__section-new-title::placeholder {\n color: var(--te-ink-muted);\n font-weight: 400;\n }\n\n .template-editor__section-new-content {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 100px;\n line-height: 1.6;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-new-content:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-new-content:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px #eef2ff;\n }\n\n .template-editor__section-new-content::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__section-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 20px;\n font-family: var(--te-font);\n font-size: 0.875rem;\n font-weight: 600;\n color: white;\n background: #6366f1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n align-self: flex-start;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-add-btn:hover:not(:disabled) {\n background: #4f46e5;\n }\n\n .template-editor__section-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .template-editor__section-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Responsive */\n @media (max-width: 900px) {\n .template-editor__hero {\n grid-template-columns: 1fr;\n }\n\n .template-editor__thumbnail-area {\n flex-direction: row;\n align-items: flex-start;\n }\n\n .template-editor__thumbnail {\n width: 120px;\n height: 90px;\n }\n\n .template-editor__thumbnail-input {\n flex: 1;\n }\n\n .template-editor__grid {\n grid-template-columns: 1fr;\n }\n\n .template-editor__metadata {\n grid-template-columns: 1fr;\n }\n\n .template-editor__facets-grid {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import { useState, useCallback, useMemo } from \"react\";\nimport { generateId } from \"document-model/core\";\nimport type { DocumentDispatch } from \"@powerhousedao/reactor-browser\";\nimport type {\n ResourceTemplateDocument,\n ResourceTemplateAction,\n} from \"document-models/resource-template\";\nimport {\n setFacetTarget,\n removeFacetTarget,\n addFacetOption,\n removeFacetOption,\n} from \"../../../document-models/resource-template/v1/gen/creators.js\";\n\ninterface FacetTargetingProps {\n document: ResourceTemplateDocument;\n dispatch: DocumentDispatch<ResourceTemplateAction>;\n}\n\n// FacetPreset type (matches document model schema)\ninterface FacetPreset {\n id: string;\n categoryKey: string;\n categoryLabel: string;\n description: string | null;\n icon: string | null;\n isRecommended: boolean;\n suggestedOptions: string[];\n}\n\n// Default presets (used as fallback if document state doesn't have presets)\nconst DEFAULT_FACET_PRESETS: FacetPreset[] = [\n {\n id: \"sno-function\",\n categoryKey: \"sno-function\",\n categoryLabel: \"SNO Function\",\n icon: \"🎯\",\n description: \"Sky Node Operator function type\",\n suggestedOptions: [\n \"Operational Hub for Open Source Builders\",\n \"Operational Hub\",\n \"IP SPV\",\n \"Revenue Generating Hub\",\n \"SNO Embryonic Hub\",\n \"Self-Insurance Risk Management Hub\",\n ],\n isRecommended: true,\n },\n {\n id: \"legal-entity\",\n categoryKey: \"legal-entity\",\n categoryLabel: \"Legal Entity\",\n icon: \"🏛️\",\n description: \"Type of legal structure for the resource\",\n suggestedOptions: [\"Swiss Association\", \"BVI Entity\"],\n isRecommended: true,\n },\n {\n id: \"team\",\n categoryKey: \"team\",\n categoryLabel: \"Team\",\n icon: \"👥\",\n description: \"Team structure and work arrangement\",\n suggestedOptions: [\"Remote\", \"Local\", \"Hybrid\"],\n isRecommended: true,\n },\n {\n id: \"anonymity\",\n categoryKey: \"anonymity\",\n categoryLabel: \"Anonymity\",\n icon: \"🔒\",\n description: \"Privacy and identity disclosure level\",\n suggestedOptions: [\"High\", \"Highest\"],\n isRecommended: true,\n },\n];\n\n// Calculate completion status for Goal-Gradient Effect\nfunction calculateProgress(\n facetTargets: { categoryKey: string; selectedOptions: string[] }[],\n presets: FacetPreset[],\n): {\n configured: number;\n recommended: number;\n percentage: number;\n isComplete: boolean;\n} {\n const recommendedKeys = new Set(\n presets.filter((p) => p.isRecommended).map((p) => p.categoryKey),\n );\n\n const configuredRecommended = facetTargets.filter(\n (t) => recommendedKeys.has(t.categoryKey) && t.selectedOptions.length > 0,\n ).length;\n\n const percentage =\n recommendedKeys.size > 0\n ? Math.round((configuredRecommended / recommendedKeys.size) * 100)\n : 0;\n\n return {\n configured: configuredRecommended,\n recommended: recommendedKeys.size,\n percentage,\n isComplete:\n recommendedKeys.size > 0 && configuredRecommended >= recommendedKeys.size,\n };\n}\n\nexport function FacetTargeting({ document, dispatch }: FacetTargetingProps) {\n const facetTargets = document.state.global.facetTargets;\n\n // Use facetPresets from document state if available, otherwise use defaults\n // Type assertion needed because generated types don't include facetPresets yet\n const documentState = document.state.global as Record<string, unknown>;\n const facetPresets: FacetPreset[] = Array.isArray(documentState.facetPresets)\n ? (documentState.facetPresets as FacetPreset[])\n : DEFAULT_FACET_PRESETS;\n\n const [showAddCategory, setShowAddCategory] = useState(false);\n const [newCategoryLabel, setNewCategoryLabel] = useState(\"\");\n const [showPresets, setShowPresets] = useState(true);\n\n const [editingOptionFor, setEditingOptionFor] = useState<string | null>(null);\n const [newOptionId, setNewOptionId] = useState(\"\");\n\n // Use Set for O(1) lookups - React Best Practice\n const existingCategoryKeys = useMemo(\n () => new Set(facetTargets.map((t) => t.categoryKey)),\n [facetTargets],\n );\n\n // Calculate progress for Goal-Gradient Effect\n const progress = useMemo(\n () => calculateProgress(facetTargets, facetPresets),\n [facetTargets, facetPresets],\n );\n\n // Get available presets (not yet added)\n const availablePresets = useMemo(\n () => facetPresets.filter((p) => !existingCategoryKeys.has(p.categoryKey)),\n [facetPresets, existingCategoryKeys],\n );\n\n const recommendedPresets = availablePresets.filter((p) => p.isRecommended);\n const otherPresets = availablePresets.filter((p) => !p.isRecommended);\n\n const handleAddCategory = useCallback(() => {\n if (!newCategoryLabel.trim()) return;\n\n const label = newCategoryLabel.trim();\n const key = label.toLowerCase().replace(/\\s+/g, \"-\");\n\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: key,\n categoryLabel: label,\n selectedOptions: [],\n lastModified: new Date().toISOString(),\n }),\n );\n\n setNewCategoryLabel(\"\");\n setShowAddCategory(false);\n }, [newCategoryLabel, dispatch]);\n\n // Quick-add from preset - reduces activation energy\n const handleAddFromPreset = useCallback(\n (preset: FacetPreset, withOptions: boolean = false) => {\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: preset.categoryKey,\n categoryLabel: preset.categoryLabel,\n selectedOptions: withOptions ? preset.suggestedOptions : [],\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n // Add all recommended facets at once - Commitment & Consistency\n const handleAddAllRecommended = useCallback(() => {\n const now = new Date().toISOString();\n recommendedPresets.forEach((preset) => {\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: preset.categoryKey,\n categoryLabel: preset.categoryLabel,\n selectedOptions: [],\n lastModified: now,\n }),\n );\n });\n }, [recommendedPresets, dispatch]);\n\n const handleRemoveCategory = useCallback(\n (categoryKey: string) => {\n if (\n window.confirm(\n \"Are you sure you want to remove this facet category and all its options?\",\n )\n ) {\n dispatch(\n removeFacetTarget({\n categoryKey,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n },\n [dispatch],\n );\n\n const handleAddOption = useCallback(\n (categoryKey: string) => {\n if (!newOptionId.trim()) return;\n\n dispatch(\n addFacetOption({\n categoryKey,\n optionId: newOptionId.trim(),\n lastModified: new Date().toISOString(),\n }),\n );\n\n setNewOptionId(\"\");\n setEditingOptionFor(null);\n },\n [newOptionId, dispatch],\n );\n\n // Quick-add suggested option\n const handleAddSuggestedOption = useCallback(\n (categoryKey: string, optionId: string) => {\n dispatch(\n addFacetOption({\n categoryKey,\n optionId,\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n const handleRemoveOption = useCallback(\n (categoryKey: string, optionId: string) => {\n dispatch(\n removeFacetOption({\n categoryKey,\n optionId,\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n // Get preset for a category to show suggested options\n const getPresetForCategory = (categoryKey: string) =>\n facetPresets.find((p) => p.categoryKey === categoryKey);\n\n return (\n <>\n <style>{styles}</style>\n <section className=\"facet-targeting\">\n {/* Progress Header - Goal-Gradient Effect */}\n <div className=\"facet-targeting__progress\">\n <div className=\"facet-targeting__progress-header\">\n <div className=\"facet-targeting__progress-info\">\n <span className=\"facet-targeting__progress-percent\">\n {progress.percentage}%\n </span>\n <span className=\"facet-targeting__progress-label\">\n {progress.configured}/{progress.recommended} recommended facets\n configured\n </span>\n </div>\n {progress.isComplete && (\n <span className=\"facet-targeting__complete-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n All set!\n </span>\n )}\n </div>\n <div className=\"facet-targeting__progress-bar\">\n <div\n className=\"facet-targeting__progress-fill\"\n style={{ width: `${progress.percentage}%` }}\n />\n </div>\n </div>\n\n <div className=\"facet-targeting__header\">\n <div className=\"facet-targeting__header-content\">\n <div className=\"facet-targeting__icon\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\" />\n <path d=\"M6 6h.008v.008H6V6z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"facet-targeting__title\">Facet Targeting</h3>\n <p className=\"facet-targeting__subtitle\">\n Define configuration dimensions for this product\n </p>\n </div>\n </div>\n <div className=\"facet-targeting__header-actions\">\n <button\n type=\"button\"\n className={`facet-targeting__toggle-btn ${showPresets ? \"facet-targeting__toggle-btn--active\" : \"\"}`}\n onClick={() => setShowPresets(!showPresets)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Presets\n </button>\n <button\n type=\"button\"\n className=\"facet-targeting__add-btn\"\n onClick={() => setShowAddCategory(true)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n Custom\n </button>\n </div>\n </div>\n\n {/* Presets Panel - Default Effect */}\n {showPresets && availablePresets.length > 0 && (\n <div className=\"facet-targeting__presets\">\n <div className=\"facet-targeting__presets-header\">\n <h4 className=\"facet-targeting__presets-title\">\n Quick Add Facets\n </h4>\n {recommendedPresets.length > 1 && (\n <button\n type=\"button\"\n className=\"facet-targeting__add-all-btn\"\n onClick={handleAddAllRecommended}\n >\n Add all recommended ({recommendedPresets.length})\n </button>\n )}\n </div>\n\n {recommendedPresets.length > 0 && (\n <div className=\"facet-targeting__presets-section\">\n <span className=\"facet-targeting__presets-label\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n Recommended\n </span>\n <div className=\"facet-targeting__presets-grid\">\n {recommendedPresets.map((preset) => (\n <PresetCard\n key={preset.categoryKey}\n preset={preset}\n onAdd={() => handleAddFromPreset(preset, false)}\n onAddWithOptions={() => handleAddFromPreset(preset, true)}\n />\n ))}\n </div>\n </div>\n )}\n\n {otherPresets.length > 0 && (\n <div className=\"facet-targeting__presets-section\">\n <span className=\"facet-targeting__presets-label\">\n Other Facets\n </span>\n <div className=\"facet-targeting__presets-grid\">\n {otherPresets.map((preset) => (\n <PresetCard\n key={preset.categoryKey}\n preset={preset}\n onAdd={() => handleAddFromPreset(preset, false)}\n onAddWithOptions={() => handleAddFromPreset(preset, true)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {showAddCategory && (\n <div className=\"facet-targeting__new-category\">\n <div className=\"facet-targeting__new-category-form\">\n <div className=\"facet-targeting__form-group\">\n <label className=\"facet-targeting__label\">\n Custom Category Name\n </label>\n <input\n type=\"text\"\n value={newCategoryLabel}\n onChange={(e) => setNewCategoryLabel(e.target.value)}\n placeholder=\"e.g., Region, Environment, Storage Type\"\n className=\"facet-targeting__input\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddCategory();\n if (e.key === \"Escape\") setShowAddCategory(false);\n }}\n />\n </div>\n <div className=\"facet-targeting__form-actions\">\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--secondary\"\n onClick={() => {\n setShowAddCategory(false);\n setNewCategoryLabel(\"\");\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary\"\n onClick={handleAddCategory}\n disabled={!newCategoryLabel.trim()}\n >\n Add Category\n </button>\n </div>\n </div>\n </div>\n )}\n\n {facetTargets.length === 0 && !showAddCategory && !showPresets ? (\n <div className=\"facet-targeting__empty\">\n <div className=\"facet-targeting__empty-icon\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\" />\n <path d=\"M6 6h.008v.008H6V6z\" />\n </svg>\n </div>\n <p className=\"facet-targeting__empty-text\">\n No facet categories defined. Use the presets above or add custom\n categories.\n </p>\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary\"\n onClick={() => setShowPresets(true)}\n >\n Show Presets\n </button>\n </div>\n ) : (\n facetTargets.length > 0 && (\n <div className=\"facet-targeting__categories\">\n {facetTargets.map((target) => {\n const preset = getPresetForCategory(target.categoryKey);\n const existingOptionsSet = new Set(target.selectedOptions);\n const suggestedOptions = preset?.suggestedOptions.filter(\n (opt) => !existingOptionsSet.has(opt),\n );\n\n return (\n <div key={target.categoryKey} className=\"facet-category\">\n <div className=\"facet-category__header\">\n <div className=\"facet-category__info\">\n {preset && (\n <span className=\"facet-category__icon\">\n {preset.icon}\n </span>\n )}\n <span className=\"facet-category__label\">\n {target.categoryLabel}\n </span>\n <span className=\"facet-category__key\">\n {target.categoryKey}\n </span>\n {preset?.isRecommended && (\n <span className=\"facet-category__recommended\">\n Recommended\n </span>\n )}\n </div>\n <div className=\"facet-category__actions\">\n <button\n type=\"button\"\n className=\"facet-category__btn\"\n onClick={() =>\n setEditingOptionFor(\n editingOptionFor === target.categoryKey\n ? null\n : target.categoryKey,\n )\n }\n title=\"Add option\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"facet-category__btn facet-category__btn--danger\"\n onClick={() =>\n handleRemoveCategory(target.categoryKey)\n }\n title=\"Remove category\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </div>\n\n {editingOptionFor === target.categoryKey && (\n <div className=\"facet-category__add-option\">\n <input\n type=\"text\"\n value={newOptionId}\n onChange={(e) => setNewOptionId(e.target.value)}\n placeholder=\"Enter option value...\"\n className=\"facet-targeting__input facet-targeting__input--sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\")\n handleAddOption(target.categoryKey);\n if (e.key === \"Escape\") {\n setEditingOptionFor(null);\n setNewOptionId(\"\");\n }\n }}\n />\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary facet-targeting__btn--sm\"\n onClick={() => handleAddOption(target.categoryKey)}\n disabled={!newOptionId.trim()}\n >\n Add\n </button>\n </div>\n )}\n\n {/* Suggested Options - Paradox of Choice (show only available) */}\n {suggestedOptions && suggestedOptions.length > 0 && (\n <div className=\"facet-category__suggestions\">\n <span className=\"facet-category__suggestions-label\">\n Quick add:\n </span>\n {suggestedOptions.slice(0, 5).map((opt) => (\n <button\n key={opt}\n type=\"button\"\n className=\"facet-category__suggestion-btn\"\n onClick={() =>\n handleAddSuggestedOption(target.categoryKey, opt)\n }\n >\n {opt}\n </button>\n ))}\n {suggestedOptions.length > 5 && (\n <span className=\"facet-category__more\">\n +{suggestedOptions.length - 5} more\n </span>\n )}\n </div>\n )}\n\n <div className=\"facet-category__options\">\n {target.selectedOptions.length === 0 ? (\n <p className=\"facet-category__no-options\">\n No options added yet - use quick add above or add\n custom options\n </p>\n ) : (\n target.selectedOptions.map((optionId) => (\n <div key={optionId} className=\"facet-option\">\n <span className=\"facet-option__label\">\n {optionId}\n </span>\n <button\n type=\"button\"\n className=\"facet-option__remove\"\n onClick={() =>\n handleRemoveOption(target.categoryKey, optionId)\n }\n title=\"Remove option\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeWidth=\"2\"\n />\n </svg>\n </button>\n </div>\n ))\n )}\n </div>\n\n {/* Micro-commitment feedback */}\n {target.selectedOptions.length > 0 && (\n <div className=\"facet-category__status\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n {target.selectedOptions.length} option\n {target.selectedOptions.length !== 1 ? \"s\" : \"\"}{\" \"}\n configured\n </div>\n )}\n </div>\n );\n })}\n </div>\n )\n )}\n </section>\n </>\n );\n}\n\n// Memoized Preset Card - React Best Practice (rerender-memo)\ninterface PresetCardProps {\n preset: FacetPreset;\n onAdd: () => void;\n onAddWithOptions: () => void;\n}\n\nfunction PresetCard({ preset, onAdd, onAddWithOptions }: PresetCardProps) {\n return (\n <div\n className={`preset-card ${preset.isRecommended ? \"preset-card--recommended\" : \"\"}`}\n >\n <div className=\"preset-card__header\">\n <span className=\"preset-card__icon\">{preset.icon}</span>\n <div className=\"preset-card__info\">\n <span className=\"preset-card__name\">{preset.categoryLabel}</span>\n <span className=\"preset-card__desc\">{preset.description}</span>\n </div>\n </div>\n <div className=\"preset-card__options-preview\">\n {preset.suggestedOptions.slice(0, 3).map((opt) => (\n <span key={opt} className=\"preset-card__option-tag\">\n {opt}\n </span>\n ))}\n {preset.suggestedOptions.length > 3 && (\n <span className=\"preset-card__option-more\">\n +{preset.suggestedOptions.length - 3}\n </span>\n )}\n </div>\n <div className=\"preset-card__actions\">\n <button type=\"button\" className=\"preset-card__btn\" onClick={onAdd}>\n Add Empty\n </button>\n <button\n type=\"button\"\n className=\"preset-card__btn preset-card__btn--primary\"\n onClick={onAddWithOptions}\n >\n Add with Options\n </button>\n </div>\n </div>\n );\n}\n\nconst styles = `\n .facet-targeting {\n background: var(--te-surface, #ffffff);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n /* Progress Section - Goal-Gradient Effect */\n .facet-targeting__progress {\n background: linear-gradient(135deg, #f5f3ff 0%, #ecfdf5 100%);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 20px;\n }\n\n .facet-targeting__progress-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n }\n\n .facet-targeting__progress-info {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n .facet-targeting__progress-percent {\n font-size: 1.5rem;\n font-weight: 700;\n color: #7c5cff;\n font-family: 'DM Mono', monospace;\n }\n\n .facet-targeting__progress-label {\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .facet-targeting__complete-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: #10b981;\n color: white;\n font-size: 0.6875rem;\n font-weight: 600;\n border-radius: 100px;\n animation: badge-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n .facet-targeting__complete-badge svg {\n width: 12px;\n height: 12px;\n }\n\n @keyframes badge-pop {\n from { transform: scale(0.8); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n\n .facet-targeting__progress-bar {\n height: 8px;\n background: rgba(124, 92, 255, 0.15);\n border-radius: 100px;\n overflow: hidden;\n }\n\n .facet-targeting__progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #7c5cff, #10b981);\n border-radius: 100px;\n transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .facet-targeting__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n\n .facet-targeting__header-content {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n }\n\n .facet-targeting__header-actions {\n display: flex;\n gap: 8px;\n }\n\n .facet-targeting__icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #f5f3ff;\n color: #7c5cff;\n }\n\n .facet-targeting__icon svg {\n width: 20px;\n height: 20px;\n }\n\n .facet-targeting__title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--te-ink, #1a1f36);\n margin: 0 0 2px;\n }\n\n .facet-targeting__subtitle {\n font-size: 0.8125rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0;\n }\n\n .facet-targeting__toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n font-family: inherit;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #7c5cff;\n background: #f5f3ff;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-targeting__toggle-btn:hover {\n border-color: #7c5cff;\n }\n\n .facet-targeting__toggle-btn--active {\n background: #7c5cff;\n color: white;\n }\n\n .facet-targeting__toggle-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-targeting__add-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-family: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n color: white;\n background: #14b8a6;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .facet-targeting__add-btn:hover {\n background: #0d9488;\n }\n\n .facet-targeting__add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Presets Panel */\n .facet-targeting__presets {\n background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);\n border: 1px solid rgba(124, 92, 255, 0.2);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 20px;\n animation: presets-slide 0.2s ease-out;\n }\n\n @keyframes presets-slide {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .facet-targeting__presets-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .facet-targeting__presets-title {\n font-size: 1rem;\n font-weight: 600;\n color: #1a1f36;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .facet-targeting__presets-title::before {\n content: \"⚡\";\n }\n\n .facet-targeting__add-all-btn {\n padding: 6px 12px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n color: #7c5cff;\n background: white;\n border: 1px solid rgba(124, 92, 255, 0.3);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-targeting__add-all-btn:hover {\n background: #7c5cff;\n color: white;\n border-color: #7c5cff;\n }\n\n .facet-targeting__presets-section {\n margin-bottom: 16px;\n }\n\n .facet-targeting__presets-section:last-child {\n margin-bottom: 0;\n }\n\n .facet-targeting__presets-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #64748b;\n margin-bottom: 10px;\n }\n\n .facet-targeting__presets-label svg {\n width: 12px;\n height: 12px;\n color: #f59e0b;\n }\n\n .facet-targeting__presets-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n }\n\n /* Preset Card */\n .preset-card {\n background: white;\n border: 1.5px solid #e4e8f0;\n border-radius: 10px;\n padding: 14px;\n transition: all 0.15s ease;\n }\n\n .preset-card:hover {\n border-color: #7c5cff;\n box-shadow: 0 4px 12px rgba(124, 92, 255, 0.1);\n }\n\n .preset-card--recommended {\n border-color: rgba(245, 158, 11, 0.4);\n background: linear-gradient(135deg, white 0%, #fffbeb 100%);\n }\n\n .preset-card--recommended:hover {\n border-color: #f59e0b;\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.15);\n }\n\n .preset-card__header {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .preset-card__icon {\n font-size: 1.25rem;\n flex-shrink: 0;\n }\n\n .preset-card__info {\n flex: 1;\n min-width: 0;\n }\n\n .preset-card__name {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: #1a1f36;\n }\n\n .preset-card__desc {\n display: block;\n font-size: 0.75rem;\n color: #64748b;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preset-card__options-preview {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 12px;\n }\n\n .preset-card__option-tag {\n padding: 2px 8px;\n font-size: 0.6875rem;\n font-weight: 500;\n color: #64748b;\n background: #f1f5f9;\n border-radius: 4px;\n }\n\n .preset-card__option-more {\n padding: 2px 8px;\n font-size: 0.6875rem;\n font-weight: 500;\n color: #94a3b8;\n font-style: italic;\n }\n\n .preset-card__actions {\n display: flex;\n gap: 6px;\n }\n\n .preset-card__btn {\n flex: 1;\n padding: 6px 10px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 500;\n color: #64748b;\n background: #f1f5f9;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .preset-card__btn:hover {\n background: #e2e8f0;\n color: #475569;\n }\n\n .preset-card__btn--primary {\n background: #7c5cff;\n color: white;\n }\n\n .preset-card__btn--primary:hover {\n background: #6d4aeb;\n }\n\n .facet-targeting__new-category {\n background: var(--te-surface-raised, #fafbfc);\n border: 1.5px solid var(--te-border, #e4e8f0);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n }\n\n .facet-targeting__new-category-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .facet-targeting__form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .facet-targeting__label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--te-ink-muted, #8792a8);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .facet-targeting__input {\n width: 100%;\n padding: 10px 14px;\n font-family: inherit;\n font-size: 0.875rem;\n border: 1.5px solid var(--te-border, #e4e8f0);\n border-radius: 8px;\n background: var(--te-surface, #ffffff);\n color: var(--te-ink, #1a1f36);\n transition: all 0.15s ease;\n box-sizing: border-box;\n }\n\n .facet-targeting__input:focus {\n outline: none;\n border-color: #14b8a6;\n box-shadow: 0 0 0 3px rgba(20, 184, 166, 0.1);\n }\n\n .facet-targeting__input--sm {\n padding: 8px 12px;\n font-size: 0.8125rem;\n }\n\n .facet-targeting__form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n .facet-targeting__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 16px;\n font-family: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: none;\n }\n\n .facet-targeting__btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-targeting__btn--primary {\n background: #14b8a6;\n color: white;\n }\n\n .facet-targeting__btn--primary:hover:not(:disabled) {\n background: #0d9488;\n }\n\n .facet-targeting__btn--primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .facet-targeting__btn--secondary {\n background: var(--te-surface-raised, #fafbfc);\n color: var(--te-ink-light, #4a5578);\n border: 1px solid var(--te-border, #e4e8f0);\n }\n\n .facet-targeting__btn--secondary:hover {\n background: var(--te-border-light, #f0f2f7);\n }\n\n .facet-targeting__btn--sm {\n padding: 6px 12px;\n font-size: 0.8125rem;\n }\n\n .facet-targeting__empty {\n padding: 40px 24px;\n text-align: center;\n background: var(--te-surface-raised, #fafbfc);\n border: 2px dashed var(--te-border, #e4e8f0);\n border-radius: 12px;\n }\n\n .facet-targeting__empty-icon {\n width: 48px;\n height: 48px;\n margin: 0 auto 12px;\n color: var(--te-border, #e4e8f0);\n }\n\n .facet-targeting__empty-icon svg {\n width: 100%;\n height: 100%;\n }\n\n .facet-targeting__empty-text {\n font-size: 0.875rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0 0 16px;\n max-width: 400px;\n margin-left: auto;\n margin-right: auto;\n }\n\n .facet-targeting__categories {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .facet-category {\n background: var(--te-surface-raised, #fafbfc);\n border: 1px solid var(--te-border-light, #f0f2f7);\n border-radius: 12px;\n padding: 16px;\n transition: border-color 0.15s ease;\n }\n\n .facet-category:hover {\n border-color: var(--te-border, #e4e8f0);\n }\n\n .facet-category__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n }\n\n .facet-category__info {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .facet-category__icon {\n font-size: 1.125rem;\n }\n\n .facet-category__label {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink, #1a1f36);\n }\n\n .facet-category__key {\n font-size: 0.75rem;\n font-family: 'DM Mono', monospace;\n color: var(--te-ink-muted, #8792a8);\n background: var(--te-border-light, #f0f2f7);\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .facet-category__recommended {\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: #f59e0b;\n background: #fef3c7;\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .facet-category__actions {\n display: flex;\n gap: 4px;\n }\n\n .facet-category__btn {\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--te-ink-muted, #8792a8);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-category__btn:hover {\n background: var(--te-border-light, #f0f2f7);\n color: var(--te-ink-light, #4a5578);\n }\n\n .facet-category__btn--danger:hover {\n background: #fee2e2;\n color: #dc2626;\n }\n\n .facet-category__btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-category__add-option {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .facet-category__add-option .facet-targeting__input {\n flex: 1;\n }\n\n /* Suggestions - Paradox of Choice */\n .facet-category__suggestions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-bottom: 12px;\n padding: 10px 12px;\n background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);\n border-radius: 8px;\n }\n\n .facet-category__suggestions-label {\n font-size: 0.6875rem;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .facet-category__suggestion-btn {\n padding: 4px 10px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 500;\n color: #7c5cff;\n background: white;\n border: 1px solid rgba(124, 92, 255, 0.3);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-category__suggestion-btn:hover {\n background: #7c5cff;\n color: white;\n border-color: #7c5cff;\n transform: translateY(-1px);\n }\n\n .facet-category__more {\n font-size: 0.6875rem;\n color: #94a3b8;\n font-style: italic;\n }\n\n .facet-category__options {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .facet-category__no-options {\n font-size: 0.8125rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0;\n font-style: italic;\n }\n\n /* Micro-commitment feedback */\n .facet-category__status {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #e4e8f0;\n font-size: 0.75rem;\n font-weight: 500;\n color: #10b981;\n }\n\n .facet-category__status svg {\n width: 14px;\n height: 14px;\n }\n\n .facet-option {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px 6px 12px;\n background: var(--te-surface, #ffffff);\n border: 1px solid var(--te-border, #e4e8f0);\n border-radius: 6px;\n font-size: 0.8125rem;\n color: var(--te-ink, #1a1f36);\n transition: all 0.15s ease;\n }\n\n .facet-option:hover {\n border-color: var(--te-ink-muted, #8792a8);\n }\n\n .facet-option__label {\n font-weight: 500;\n }\n\n .facet-option__remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--te-ink-muted, #8792a8);\n cursor: pointer;\n opacity: 0.6;\n transition: all 0.15s ease;\n }\n\n .facet-option__remove:hover {\n opacity: 1;\n color: #dc2626;\n background: #fee2e2;\n }\n\n .facet-option__remove svg {\n width: 12px;\n height: 12px;\n }\n\n @media (max-width: 640px) {\n .facet-targeting__header {\n flex-direction: column;\n gap: 16px;\n }\n\n .facet-targeting__header-actions {\n width: 100%;\n }\n\n .facet-targeting__toggle-btn,\n .facet-targeting__add-btn {\n flex: 1;\n justify-content: center;\n }\n\n .facet-targeting__presets-grid {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSelectedResourceTemplateDocument } from \"../../document-models/resource-template/v1/hooks.js\";\nimport { TemplateInfo } from \"./components/TemplateInfo.js\";\nimport { FacetTargeting } from \"./components/FacetTargeting.js\";\n\nexport default function ResourceTemplateEditor() {\n const [document, dispatch] = useSelectedResourceTemplateDocument();\n\n return (\n <div className=\"rt-editor\">\n <style>{editorStyles}</style>\n <DocumentToolbar />\n <div className=\"rt-editor__container\">\n <div className=\"rt-editor__header\">\n <div className=\"rt-editor__header-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n Product Information\n </div>\n <p className=\"rt-editor__header-desc\">\n Define the base configuration for resources. These templates can be\n used to create Service Offerings.\n </p>\n </div>\n <div className=\"rt-editor__content\">\n <TemplateInfo document={document} dispatch={dispatch} />\n <FacetTargeting document={document} dispatch={dispatch} />\n </div>\n </div>\n </div>\n );\n}\n\nconst editorStyles = `\n @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap');\n\n .rt-editor {\n --rt-font-sans: 'DM Sans', system-ui, sans-serif;\n --rt-font-mono: 'DM Mono', 'SF Mono', monospace;\n\n --rt-slate-50: #f8fafc;\n --rt-slate-100: #f1f5f9;\n --rt-slate-200: #e2e8f0;\n --rt-slate-300: #cbd5e1;\n --rt-slate-400: #94a3b8;\n --rt-slate-500: #64748b;\n --rt-slate-600: #475569;\n --rt-slate-700: #334155;\n --rt-slate-800: #1e293b;\n --rt-slate-900: #0f172a;\n\n --rt-teal-50: #f0fdfa;\n --rt-teal-100: #ccfbf1;\n --rt-teal-200: #99f6e4;\n --rt-teal-500: #14b8a6;\n --rt-teal-600: #0d9488;\n --rt-teal-700: #0f766e;\n\n --rt-radius-sm: 6px;\n --rt-radius-md: 10px;\n --rt-radius-lg: 14px;\n --rt-radius-xl: 20px;\n\n --rt-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);\n --rt-shadow-md: 0 4px 12px rgba(15, 23, 42, 0.06), 0 1px 3px rgba(15, 23, 42, 0.04);\n --rt-shadow-lg: 0 10px 40px rgba(15, 23, 42, 0.08), 0 2px 8px rgba(15, 23, 42, 0.04);\n\n --rt-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --rt-transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n --rt-transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n\n font-family: var(--rt-font-sans);\n background: linear-gradient(135deg, var(--rt-teal-50) 0%, var(--rt-slate-50) 50%, #f0f4f8 100%);\n min-height: 100%;\n overflow-y: auto;\n }\n\n .rt-editor__container {\n max-width: 1400px;\n margin: 0 auto;\n padding: 24px 32px 48px;\n }\n\n .rt-editor__header {\n margin-bottom: 24px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--rt-slate-200);\n }\n\n .rt-editor__header-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--rt-teal-100);\n color: var(--rt-teal-700);\n border-radius: 100px;\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 12px;\n }\n\n .rt-editor__header-badge svg {\n width: 18px;\n height: 18px;\n }\n\n .rt-editor__header-desc {\n font-size: 0.9375rem;\n color: var(--rt-slate-600);\n margin: 0;\n max-width: 600px;\n line-height: 1.6;\n }\n\n .rt-editor__content {\n min-height: 500px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n animation: rt-fade-in var(--rt-transition-slow) ease-out;\n }\n\n @keyframes rt-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .rt-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n text-align: center;\n padding: 48px;\n }\n\n .rt-empty-state__icon {\n width: 80px;\n height: 80px;\n margin-bottom: 24px;\n color: var(--rt-teal-300);\n animation: rt-float 3s ease-in-out infinite;\n }\n\n .rt-empty-state__icon svg {\n width: 100%;\n height: 100%;\n }\n\n @keyframes rt-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n }\n\n .rt-empty-state__title {\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--rt-slate-700);\n margin: 0 0 8px;\n letter-spacing: -0.02em;\n }\n\n .rt-empty-state__subtitle {\n font-size: 1rem;\n color: var(--rt-slate-500);\n margin: 0;\n }\n`;\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"editor-CvzAGclJ.mjs","names":["styles"],"sources":["../../editors/resource-template-editor/components/markdown-editor.tsx","../../editors/resource-template-editor/components/TemplateInfo.tsx","../../editors/resource-template-editor/components/FacetTargeting.tsx","../../editors/resource-template-editor/editor.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeSlug from \"rehype-slug\";\nimport { useLocalStorage } from \"usehooks-ts\";\n\n// Custom preview renderer to make links open in new tabs and ensure proper list rendering\nconst previewOptions = {\n components: {\n a: ({ ...props }: { node: unknown; [key: string]: unknown }) => (\n <a {...props} target=\"_blank\" rel=\"noopener noreferrer\" />\n ),\n },\n rehypePlugins: [rehypeSlug],\n remarkPlugins: [remarkGfm],\n};\nexport type MarkdownEditorMode = \"preview\" | \"edit\" | \"live\";\n\ninterface MarkdownEditorProps {\n value: string | null;\n onChange: (value: string) => void;\n onBlur?: (value: string) => void;\n height?: number;\n label?: string;\n labelClassName?: string;\n}\n\nexport function MarkdownEditor({\n value,\n onChange,\n onBlur,\n height = 350,\n label = \"Content\",\n labelClassName = \"text-sm leading-4 mb-3 font-medium\",\n}: MarkdownEditorProps) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const [MDEditor, setMDEditor] = useState<any>(null);\n const [contentValue, setContentValue] = useState<string>(\"\");\n const [isLoaded, setIsLoaded] = useState(false);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n const [viewMarkdownMode, setViewMarkdownMode] =\n useLocalStorage<MarkdownEditorMode>(\"markdown-editor-view-mode\", \"live\");\n\n // Ensure we have a valid mode for the editor\n const editorMode = viewMarkdownMode;\n\n // Load the MDEditor component dynamically\n useEffect(() => {\n // Use a more robust dynamic import approach\n const loadEditor = async () => {\n try {\n const module = await import(\"@uiw/react-md-editor\");\n\n setMDEditor(() => module.default);\n setIsLoaded(true);\n setLoadError(null);\n } catch (error) {\n console.error(\"Failed to load MDEditor:\", error);\n setLoadError(\n error instanceof Error ? error.message : \"Failed to load editor\",\n );\n setIsLoaded(true);\n }\n };\n\n // Add a small delay to ensure DOM is ready\n const timer = setTimeout(() => void loadEditor(), 0);\n return () => clearTimeout(timer);\n }, []);\n\n // Update contentValue when value prop changes\n useEffect(() => {\n if (isLoaded) {\n // Handle null/undefined but preserve empty strings, whitespace, and newlines\n const stringValue = value ?? \"\";\n setContentValue(stringValue);\n }\n }, [value, isLoaded]);\n\n useEffect(() => {\n if (!MDEditor) return;\n\n const handleViewButtonClick = () => {\n const buttonLive = document.querySelector(\"button[data-name='live']\");\n const buttonEdit = document.querySelector(\"button[data-name='edit']\");\n const buttonPreview = document.querySelector(\n \"button[data-name='preview']\",\n );\n\n const liveLi = buttonLive?.closest(\"li\");\n const editLi = buttonEdit?.closest(\"li\");\n const previewLi = buttonPreview?.closest(\"li\");\n\n if (previewLi && previewLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"preview\");\n }\n if (editLi && editLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"edit\");\n }\n if (liveLi && liveLi.classList.contains(\"active\")) {\n setViewMarkdownMode(\"live\");\n }\n };\n\n document.addEventListener(\"click\", handleViewButtonClick, true);\n return () => {\n document.removeEventListener(\"click\", handleViewButtonClick, true);\n };\n }, [MDEditor, setViewMarkdownMode]);\n\n // Handle content changes\n const handleContentChange = (newValue: string | undefined) => {\n // Handle null/undefined but preserve all string content including empty strings\n const stringValue = newValue ?? \"\";\n setContentValue(stringValue);\n onChange(stringValue);\n };\n\n // Handle content blur\n const handleContentBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (onBlur) {\n onBlur(e.target.value);\n }\n };\n\n return (\n <div className=\"w-full\">\n <style>\n {`\n .w-md-editor-preview ul {\n list-style-type: disc !important;\n padding-left: 2em !important;\n }\n\n .w-md-editor-preview ol {\n list-style-type: decimal !important;\n padding-left: 2em !important;\n }\n\n /* Ensure proper table styling */\n .w-md-editor-preview table {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n }\n\n .w-md-editor-preview th,\n .w-md-editor-preview td {\n border: 1px solid #ddd;\n padding: 8px;\n text-align: left;\n }\n\n .w-md-editor-preview th {\n background-color: #f5f5f5;\n }\n \n .w-md-editor-text-pre code, .w-md-editor-text-pre div {\n font-size: 16px !important;\n line-height: 24px !important;\n }\n .w-md-editor-text-input {\n font-size: 16px !important;\n line-height: 24px !important;\n }\n \n `}\n </style>\n\n {label && <p className={labelClassName}>{label}</p>}\n {!isLoaded && (\n <div\n className=\"w-full border border-gray-300 rounded-md p-3 bg-white\"\n style={{ height: `${height}px` }}\n >\n <div className=\"w-full h-full flex items-center justify-center text-gray-500\">\n Loading editor...\n </div>\n </div>\n )}\n {isLoaded && loadError && (\n <div\n className=\"w-full border border-red-300 rounded-md p-3 bg-red-50\"\n style={{ height: `${height}px` }}\n >\n <div className=\"w-full h-full flex flex-col items-center justify-center text-red-600\">\n <p className=\"text-sm font-medium mb-2\">\n Failed to load markdown editor\n </p>\n <p className=\"text-xs text-red-500\">{loadError}</p>\n <textarea\n className=\"w-full h-full mt-2 p-2 border border-gray-300 rounded text-sm\"\n placeholder=\"Fallback text editor - write your content here...\"\n value={value ?? \"\"}\n onChange={(e) => onChange(e.target.value)}\n onBlur={(e) => onBlur?.(e.target.value)}\n />\n </div>\n </div>\n )}\n {isLoaded && MDEditor && (\n <div data-color-mode=\"light\" className=\"w-full\">\n <MDEditor\n height={height}\n value={contentValue || \" \"}\n onChange={handleContentChange}\n onBlur={handleContentBlur}\n previewOptions={previewOptions}\n enableScroll={true}\n preview={editorMode}\n textareaProps={{\n placeholder: \"Write your content here...\",\n }}\n />\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport { generateId } from \"document-model/core\";\nimport type { DocumentDispatch } from \"@powerhousedao/reactor-browser\";\nimport type {\n ResourceTemplateDocument,\n ResourceTemplateAction,\n TargetAudience,\n FaqField,\n ContentSection,\n} from \"document-models/resource-template\";\nimport {\n updateTemplateInfo,\n updateTemplateStatus,\n setOperator,\n setWeight,\n addTargetAudience,\n removeTargetAudience,\n setSetupServices,\n setRecurringServices,\n addFaq,\n updateFaq,\n deleteFaq,\n reorderFaqs,\n addContentSection,\n updateContentSection,\n deleteContentSection,\n reorderContentSections,\n} from \"../../../document-models/resource-template/v1/gen/creators.js\";\nimport { MarkdownEditor } from \"./markdown-editor.js\";\n\ninterface TemplateInfoProps {\n document: ResourceTemplateDocument;\n dispatch: DocumentDispatch<ResourceTemplateAction>;\n}\n\nconst STATUS_OPTIONS = [\n { value: \"DRAFT\", label: \"Draft\", color: \"slate\" },\n { value: \"COMING_SOON\", label: \"Coming Soon\", color: \"sky\" },\n { value: \"ACTIVE\", label: \"Active\", color: \"emerald\" },\n { value: \"DEPRECATED\", label: \"Deprecated\", color: \"rose\" },\n] as const;\n\nconst AUDIENCE_PRESETS = [\n { label: \"Builders\", color: \"#0ea5e9\" },\n { label: \"Networks\", color: \"#10b981\" },\n];\n\n// Service templates for quick-add functionality\ninterface ServiceTemplate {\n title: string;\n description: string;\n icon: string;\n}\n\nconst SETUP_SERVICE_TEMPLATES: Record<string, ServiceTemplate[]> = {\n \"Legal Services\": [\n {\n title: \"Swiss association entity\",\n description: \"Legal entity formation as a Swiss association\",\n icon: \"🏛️\",\n },\n {\n title: \"Registered address (Zug)\",\n description: \"Official registered address in Zug, Switzerland\",\n icon: \"📍\",\n },\n {\n title: \"Legal document templates\",\n description: \"Access to standardized legal document templates\",\n icon: \"📋\",\n },\n ],\n};\n\nconst RECURRING_SERVICE_TEMPLATES: Record<string, ServiceTemplate[]> = {\n \"Operations & Finance\": [\n {\n title: \"Invoice management\",\n description: \"Professional invoice processing and management\",\n icon: \"📄\",\n },\n {\n title: \"Annual tax filing\",\n description: \"Yearly tax preparation and filing services\",\n icon: \"💰\",\n },\n {\n title: \"Monthly accounting & close\",\n description: \"Monthly bookkeeping and financial close\",\n icon: \"📊\",\n },\n ],\n \"Contributor & Payments\": [\n {\n title: \"Contributor operations\",\n description: \"Management of contributor payments and operations\",\n icon: \"👥\",\n },\n {\n title: \"Multi-currency payouts\",\n description: \"Support for payments in multiple currencies\",\n icon: \"💱\",\n },\n {\n title: \"Multiple entities\",\n description: \"Support for managing multiple legal entities\",\n icon: \"🏢\",\n },\n ],\n \"Support & Advisory\": [\n {\n title: \"Dedicated ops support\",\n description: \"Dedicated operations support team\",\n icon: \"🎯\",\n },\n {\n title: \"Dedicated account manager\",\n description: \"Personal point of contact for all needs\",\n icon: \"👤\",\n },\n ],\n};\n\nexport function TemplateInfo({ document, dispatch }: TemplateInfoProps) {\n const { state } = document;\n const globalState = state.global;\n\n const [formData, setFormData] = useState({\n title: globalState.title || \"\",\n subtitle: globalState.subtitle || \"\",\n summary: globalState.summary || \"\",\n description: globalState.description || \"\",\n operatorId: globalState.operatorId || \"\",\n thumbnailUrl: globalState.thumbnailUrl || \"\",\n infoLink: globalState.infoLink || \"\",\n status: globalState.status,\n });\n\n const [newSetupService, setNewSetupService] = useState(\"\");\n const [newRecurringService, setNewRecurringService] = useState(\"\");\n const [newAudienceLabel, setNewAudienceLabel] = useState(\"\");\n const [showAudienceInput, setShowAudienceInput] = useState(false);\n const [showSetupTemplates, setShowSetupTemplates] = useState(false);\n const [showRecurringTemplates, setShowRecurringTemplates] = useState(false);\n const [newFaqQuestion, setNewFaqQuestion] = useState(\"\");\n const [newFaqAnswer, setNewFaqAnswer] = useState(\"\");\n const [editingFaqId, setEditingFaqId] = useState<string | null>(null);\n const [editingFaqQuestion, setEditingFaqQuestion] = useState(\"\");\n const [editingFaqAnswer, setEditingFaqAnswer] = useState(\"\");\n const [newSectionTitle, setNewSectionTitle] = useState(\"\");\n const [newSectionContent, setNewSectionContent] = useState(\"\");\n const [editingSectionId, setEditingSectionId] = useState<string | null>(null);\n const [editingSectionTitle, setEditingSectionTitle] = useState(\"\");\n const [editingSectionContent, setEditingSectionContent] = useState(\"\");\n const [expandedSections, setExpandedSections] = useState<Set<string>>(\n new Set(),\n );\n const setupServiceInputRef = useRef<HTMLInputElement>(null);\n const recurringServiceInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n setFormData({\n title: globalState.title || \"\",\n subtitle: globalState.subtitle || \"\",\n summary: globalState.summary || \"\",\n description: globalState.description || \"\",\n operatorId: globalState.operatorId || \"\",\n thumbnailUrl: globalState.thumbnailUrl || \"\",\n infoLink: globalState.infoLink || \"\",\n status: globalState.status,\n });\n }, [\n globalState.title,\n globalState.subtitle,\n globalState.summary,\n globalState.description,\n globalState.operatorId,\n globalState.thumbnailUrl,\n globalState.infoLink,\n globalState.status,\n ]);\n\n const handleFieldChange = (field: keyof typeof formData, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleInfoBlur = () => {\n const changes: Record<string, string | null> = {};\n let hasChanges = false;\n\n if (formData.title !== globalState.title) {\n changes.title = formData.title;\n hasChanges = true;\n }\n if (formData.summary !== globalState.summary) {\n changes.summary = formData.summary;\n hasChanges = true;\n }\n if (formData.description !== (globalState.description || \"\")) {\n changes.description = formData.description || null;\n hasChanges = true;\n }\n if (formData.thumbnailUrl !== (globalState.thumbnailUrl || \"\")) {\n changes.thumbnailUrl = formData.thumbnailUrl || null;\n hasChanges = true;\n }\n if (formData.infoLink !== (globalState.infoLink || \"\")) {\n changes.infoLink = formData.infoLink || null;\n hasChanges = true;\n }\n if (formData.subtitle !== (globalState.subtitle || \"\")) {\n changes.subtitle = formData.subtitle || null;\n hasChanges = true;\n }\n\n if (hasChanges) {\n dispatch(\n updateTemplateInfo({\n ...changes,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n };\n\n const handleOperatorBlur = () => {\n if (formData.operatorId !== globalState.operatorId) {\n dispatch(\n setOperator({\n operatorId: formData.operatorId,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n };\n\n const handleStatusChange = (value: string) => {\n const status = value as \"DRAFT\" | \"COMING_SOON\" | \"ACTIVE\" | \"DEPRECATED\";\n setFormData((prev) => ({ ...prev, status }));\n dispatch(\n updateTemplateStatus({\n status,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddAudience = (label: string, color?: string) => {\n if (!label.trim()) return;\n dispatch(\n addTargetAudience({\n id: generateId(),\n label: label.trim(),\n color: color || null,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewAudienceLabel(\"\");\n setShowAudienceInput(false);\n };\n\n const handleRemoveAudience = (id: string) => {\n dispatch(\n removeTargetAudience({\n id,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddSetupService = () => {\n if (!newSetupService.trim()) return;\n const updatedServices = [\n ...globalState.setupServices,\n newSetupService.trim(),\n ];\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewSetupService(\"\");\n setupServiceInputRef.current?.focus();\n };\n\n const handleRemoveSetupService = (index: number) => {\n const updatedServices = globalState.setupServices.filter(\n (_, i) => i !== index,\n );\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddRecurringService = () => {\n if (!newRecurringService.trim()) return;\n const updatedServices = [\n ...globalState.recurringServices,\n newRecurringService.trim(),\n ];\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewRecurringService(\"\");\n recurringServiceInputRef.current?.focus();\n };\n\n const handleRemoveRecurringService = (index: number) => {\n const updatedServices = globalState.recurringServices.filter(\n (_, i) => i !== index,\n );\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddSetupFromTemplate = (template: ServiceTemplate) => {\n if (globalState.setupServices.includes(template.title)) return;\n const updatedServices = [...globalState.setupServices, template.title];\n dispatch(\n setSetupServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleAddRecurringFromTemplate = (template: ServiceTemplate) => {\n if (globalState.recurringServices.includes(template.title)) return;\n const updatedServices = [...globalState.recurringServices, template.title];\n dispatch(\n setRecurringServices({\n services: updatedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveSetupService = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= globalState.setupServices.length) return;\n\n const reorderedServices = [...globalState.setupServices];\n [reorderedServices[index], reorderedServices[newIndex]] = [\n reorderedServices[newIndex],\n reorderedServices[index],\n ];\n\n dispatch(\n setSetupServices({\n services: reorderedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveRecurringService = (\n index: number,\n direction: \"up\" | \"down\",\n ) => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= globalState.recurringServices.length)\n return;\n\n const reorderedServices = [...globalState.recurringServices];\n [reorderedServices[index], reorderedServices[newIndex]] = [\n reorderedServices[newIndex],\n reorderedServices[index],\n ];\n\n dispatch(\n setRecurringServices({\n services: reorderedServices,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n // FAQ Handlers\n const faqFields = globalState.faqFields || [];\n const sortedFaqs = [...faqFields].sort(\n (a, b) => a.displayOrder - b.displayOrder,\n );\n\n const handleAddFaq = () => {\n if (!newFaqQuestion.trim() || !newFaqAnswer.trim()) return;\n dispatch(\n addFaq({\n id: generateId(),\n question: newFaqQuestion.trim(),\n answer: newFaqAnswer.trim(),\n displayOrder: faqFields.length,\n }),\n );\n setNewFaqQuestion(\"\");\n setNewFaqAnswer(\"\");\n };\n\n const handleMoveFaq = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= sortedFaqs.length) return;\n\n const reorderedIds = sortedFaqs.map((f) => f.id);\n [reorderedIds[index], reorderedIds[newIndex]] = [\n reorderedIds[newIndex],\n reorderedIds[index],\n ];\n\n dispatch(\n reorderFaqs({\n faqIds: reorderedIds,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleStartEditFaq = (faq: FaqField) => {\n setEditingFaqId(faq.id);\n setEditingFaqQuestion(faq.question || \"\");\n setEditingFaqAnswer(faq.answer || \"\");\n };\n\n const handleSaveFaqEdit = () => {\n if (!editingFaqId || !editingFaqQuestion.trim() || !editingFaqAnswer.trim())\n return;\n dispatch(\n updateFaq({\n id: editingFaqId,\n question: editingFaqQuestion.trim(),\n answer: editingFaqAnswer.trim(),\n }),\n );\n setEditingFaqId(null);\n setEditingFaqQuestion(\"\");\n setEditingFaqAnswer(\"\");\n };\n\n const handleCancelFaqEdit = () => {\n setEditingFaqId(null);\n setEditingFaqQuestion(\"\");\n setEditingFaqAnswer(\"\");\n };\n\n const handleDeleteFaq = (id: string) => {\n dispatch(\n deleteFaq({\n id,\n }),\n );\n };\n\n // Content Section Handlers\n const contentSections = globalState.contentSections;\n const sortedSections = [...contentSections].sort(\n (a, b) => a.displayOrder - b.displayOrder,\n );\n\n const handleAddContentSection = () => {\n if (!newSectionTitle.trim() || !newSectionContent.trim()) return;\n dispatch(\n addContentSection({\n id: generateId(),\n title: newSectionTitle.trim(),\n content: newSectionContent.trim(),\n displayOrder: contentSections.length,\n lastModified: new Date().toISOString(),\n }),\n );\n setNewSectionTitle(\"\");\n setNewSectionContent(\"\");\n };\n\n const handleStartEditSection = (section: ContentSection) => {\n setEditingSectionId(section.id);\n setEditingSectionTitle(section.title);\n setEditingSectionContent(section.content);\n };\n\n const handleSaveSectionEdit = () => {\n if (\n !editingSectionId ||\n !editingSectionTitle.trim() ||\n !editingSectionContent.trim()\n )\n return;\n dispatch(\n updateContentSection({\n id: editingSectionId,\n title: editingSectionTitle.trim(),\n content: editingSectionContent.trim(),\n lastModified: new Date().toISOString(),\n }),\n );\n setEditingSectionId(null);\n setEditingSectionTitle(\"\");\n setEditingSectionContent(\"\");\n };\n\n const handleCancelSectionEdit = () => {\n setEditingSectionId(null);\n setEditingSectionTitle(\"\");\n setEditingSectionContent(\"\");\n };\n\n const handleDeleteContentSection = (id: string) => {\n dispatch(\n deleteContentSection({\n id,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const handleMoveSection = (index: number, direction: \"up\" | \"down\") => {\n const newIndex = direction === \"up\" ? index - 1 : index + 1;\n if (newIndex < 0 || newIndex >= sortedSections.length) return;\n\n const reorderedIds = sortedSections.map((s) => s.id);\n [reorderedIds[index], reorderedIds[newIndex]] = [\n reorderedIds[newIndex],\n reorderedIds[index],\n ];\n\n dispatch(\n reorderContentSections({\n sectionIds: reorderedIds,\n lastModified: new Date().toISOString(),\n }),\n );\n };\n\n const toggleSectionExpanded = (id: string) => {\n setExpandedSections((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const currentStatus = STATUS_OPTIONS.find((s) => s.value === formData.status);\n\n const availablePresets = AUDIENCE_PRESETS.filter(\n (preset) =>\n !globalState.targetAudiences.some((a) => a.label === preset.label),\n );\n\n return (\n <>\n <style>{styles}</style>\n <div className=\"template-editor\">\n {/* Hero Section - Thumbnail & Core Identity */}\n <section className=\"template-editor__hero\">\n <div className=\"template-editor__thumbnail-area\">\n <div\n className=\"template-editor__thumbnail\"\n style={{\n backgroundImage: formData.thumbnailUrl\n ? `url(${formData.thumbnailUrl})`\n : undefined,\n }}\n >\n {!formData.thumbnailUrl && (\n <div className=\"template-editor__thumbnail-placeholder\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <path d=\"M21 15l-5-5L5 21\" />\n </svg>\n <span>Add Thumbnail</span>\n </div>\n )}\n {formData.thumbnailUrl && (\n <div\n className={`template-editor__status-badge template-editor__status-badge--${currentStatus?.color}`}\n >\n {currentStatus?.label}\n </div>\n )}\n </div>\n <div className=\"template-editor__thumbnail-input\">\n <input\n type=\"text\"\n value={formData.thumbnailUrl}\n onChange={(e) =>\n handleFieldChange(\"thumbnailUrl\", e.target.value)\n }\n onBlur={handleInfoBlur}\n placeholder=\"https://example.com/image.jpg\"\n className=\"template-editor__input template-editor__input--sm\"\n />\n </div>\n </div>\n\n <div className=\"template-editor__identity\">\n <div className=\"template-editor__title-row\">\n <input\n type=\"text\"\n value={formData.title}\n onChange={(e) => handleFieldChange(\"title\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__title-input\"\n placeholder=\"Product Title\"\n />\n <div className=\"template-editor__status-select\">\n <select\n value={formData.status}\n onChange={(e) => handleStatusChange(e.target.value)}\n className=\"template-editor__select\"\n data-status={currentStatus?.color}\n >\n {STATUS_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n <span\n className={`template-editor__status-indicator template-editor__status-indicator--${currentStatus?.color}`}\n />\n </div>\n </div>\n\n <input\n type=\"text\"\n value={formData.subtitle}\n onChange={(e) => handleFieldChange(\"subtitle\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__title-input\"\n placeholder=\"Subtitle / Tagline\"\n style={{\n fontSize: \"0.95rem\",\n fontWeight: 400,\n color: \"var(--rt-slate-600, #475569)\",\n marginTop: \"-4px\",\n }}\n />\n\n {/* Target Audiences */}\n <div className=\"template-editor__audiences\">\n {globalState.targetAudiences.map((audience: TargetAudience) => (\n <span\n key={audience.id}\n className=\"template-editor__audience-tag\"\n style={\n audience.color\n ? {\n backgroundColor: `${audience.color}15`,\n borderColor: `${audience.color}40`,\n color: audience.color,\n }\n : undefined\n }\n >\n {audience.label}\n <button\n type=\"button\"\n onClick={() => handleRemoveAudience(audience.id)}\n className=\"template-editor__audience-remove\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </span>\n ))}\n\n {showAudienceInput ? (\n <div className=\"template-editor__audience-input-wrap\">\n <input\n type=\"text\"\n value={newAudienceLabel}\n onChange={(e) => setNewAudienceLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\")\n handleAddAudience(newAudienceLabel);\n if (e.key === \"Escape\") setShowAudienceInput(false);\n }}\n placeholder=\"Audience name...\"\n className=\"template-editor__audience-input\"\n autoFocus\n />\n <button\n type=\"button\"\n onClick={() => handleAddAudience(newAudienceLabel)}\n className=\"template-editor__audience-add-btn\"\n >\n Add\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setShowAudienceInput(true)}\n className=\"template-editor__add-audience-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add Audience\n </button>\n )}\n </div>\n\n {availablePresets.length > 0 && (\n <div className=\"template-editor__audience-presets\">\n <span className=\"template-editor__presets-label\">\n Quick add:\n </span>\n {availablePresets.slice(0, 4).map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() =>\n handleAddAudience(preset.label, preset.color)\n }\n className=\"template-editor__preset-btn\"\n style={{ color: preset.color }}\n >\n {preset.label}\n </button>\n ))}\n </div>\n )}\n\n <textarea\n value={formData.summary}\n onChange={(e) => handleFieldChange(\"summary\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__summary\"\n placeholder=\"Brief summary of your product...\"\n rows={2}\n />\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n marginTop: \"8px\",\n }}\n >\n <label\n style={{\n fontSize: \"0.75rem\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: \"var(--rt-slate-500, #64748b)\",\n whiteSpace: \"nowrap\",\n }}\n >\n Sort Weight\n </label>\n <input\n type=\"number\"\n value={globalState.weight ?? \"\"}\n onChange={(e) => {\n const val =\n e.target.value === \"\" ? null : parseInt(e.target.value, 10);\n dispatch(\n setWeight({\n weight: Number.isNaN(val) ? null : val,\n lastModified: new Date().toISOString(),\n }),\n );\n }}\n placeholder=\"—\"\n style={{\n width: \"72px\",\n padding: \"4px 8px\",\n fontSize: \"0.8125rem\",\n border: \"1px solid var(--rt-slate-200, #e2e8f0)\",\n borderRadius: \"6px\",\n outline: \"none\",\n textAlign: \"center\",\n fontFamily: \"var(--rt-font-mono, monospace)\",\n }}\n />\n <span\n style={{\n fontSize: \"0.6875rem\",\n color: \"var(--rt-slate-400, #94a3b8)\",\n }}\n >\n Lower = higher priority\n </span>\n </div>\n </div>\n </section>\n\n {/* Description */}\n {/* <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--violet\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h10\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">Description</h3>\n <p className=\"template-editor__card-subtitle\">\n Detailed description of your product\n </p>\n </div>\n </div>\n <textarea\n value={formData.description}\n onChange={(e) => handleFieldChange(\"description\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__textarea\"\n placeholder=\"Provide a comprehensive description of your product, including what makes it unique and valuable...\"\n rows={4}\n />\n </section> */}\n\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--violet\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 12h16M4 18h10\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">Description</h3>\n <p className=\"template-editor__card-subtitle\">\n Detailed description of your product\n </p>\n </div>\n </div>\n <MarkdownEditor\n label=\"\"\n height={350}\n value={formData.description}\n onChange={(value: string) =>\n handleFieldChange(\"description\", value)\n }\n onBlur={handleInfoBlur}\n />\n </section>\n\n {/* Expandable Content Sections */}\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--indigo\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M4 6h16M4 10h16M4 14h10M4 18h6\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Expandable Content Sections\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Add long-form article content with expandable titles\n </p>\n </div>\n </div>\n\n <div className=\"template-editor__sections-list\">\n {sortedSections.map((section: ContentSection, index: number) => (\n <div\n key={section.id}\n className={`template-editor__section-item ${editingSectionId === section.id ? \"template-editor__section-item--editing\" : \"\"}`}\n >\n {editingSectionId === section.id ? (\n <div className=\"template-editor__section-edit-form\">\n <input\n type=\"text\"\n value={editingSectionTitle}\n onChange={(e) => setEditingSectionTitle(e.target.value)}\n className=\"template-editor__section-edit-title\"\n placeholder=\"Section title\"\n autoFocus\n />\n <textarea\n value={editingSectionContent}\n onChange={(e) => setEditingSectionContent(e.target.value)}\n className=\"template-editor__section-edit-content\"\n placeholder=\"Section content...\"\n rows={6}\n />\n <div className=\"template-editor__section-edit-actions\">\n <button\n type=\"button\"\n onClick={handleSaveSectionEdit}\n className=\"template-editor__section-save-btn\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelSectionEdit}\n className=\"template-editor__section-cancel-btn\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"template-editor__section-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveSection(index, \"up\")}\n className=\"template-editor__section-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveSection(index, \"down\")}\n className=\"template-editor__section-reorder-btn\"\n disabled={index === sortedSections.length - 1}\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => toggleSectionExpanded(section.id)}\n className=\"template-editor__section-toggle\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={`template-editor__section-chevron ${expandedSections.has(section.id) ? \"template-editor__section-chevron--expanded\" : \"\"}`}\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n <div className=\"template-editor__section-main\">\n <div\n className=\"template-editor__section-header\"\n onClick={() => toggleSectionExpanded(section.id)}\n >\n <span className=\"template-editor__section-title\">\n {section.title}\n </span>\n <span className=\"template-editor__section-preview\">\n {section.content.length > 80\n ? `${section.content.substring(0, 80)}...`\n : section.content}\n </span>\n </div>\n {expandedSections.has(section.id) && (\n <div className=\"template-editor__section-content\">\n {section.content}\n </div>\n )}\n </div>\n <div className=\"template-editor__section-actions\">\n <button\n type=\"button\"\n onClick={() => handleStartEditSection(section)}\n className=\"template-editor__section-action-btn\"\n title=\"Edit section\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleDeleteContentSection(section.id)}\n className=\"template-editor__section-action-btn template-editor__section-action-btn--delete\"\n title=\"Delete section\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\n </svg>\n </button>\n </div>\n </>\n )}\n </div>\n ))}\n </div>\n\n {/* Add new section form */}\n <div className=\"template-editor__section-add-form\">\n <input\n type=\"text\"\n value={newSectionTitle}\n onChange={(e) => setNewSectionTitle(e.target.value)}\n placeholder=\"New section title...\"\n className=\"template-editor__section-new-title\"\n />\n <textarea\n value={newSectionContent}\n onChange={(e) => setNewSectionContent(e.target.value)}\n placeholder=\"Section content (long-form article content)...\"\n className=\"template-editor__section-new-content\"\n rows={4}\n />\n {(newSectionTitle || newSectionContent) && (\n <button\n type=\"button\"\n onClick={handleAddContentSection}\n className=\"template-editor__section-add-btn\"\n disabled={!newSectionTitle.trim() || !newSectionContent.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add Section\n </button>\n )}\n </div>\n </section>\n\n {/* FAQ Section */}\n <section className=\"template-editor__card template-editor__card--full\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--sky\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Frequently Asked Questions\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Common questions and answers about this product\n </p>\n </div>\n </div>\n\n <div className=\"template-editor__faq-list\">\n {sortedFaqs.map((faq: FaqField, index: number) => (\n <div\n key={faq.id}\n className={`template-editor__faq-item ${editingFaqId === faq.id ? \"template-editor__faq-item--editing\" : \"\"}`}\n >\n {editingFaqId === faq.id ? (\n <div className=\"template-editor__faq-edit-form\">\n <input\n type=\"text\"\n value={editingFaqQuestion}\n onChange={(e) => setEditingFaqQuestion(e.target.value)}\n className=\"template-editor__faq-edit-question\"\n placeholder=\"Question\"\n autoFocus\n />\n <textarea\n value={editingFaqAnswer}\n onChange={(e) => setEditingFaqAnswer(e.target.value)}\n className=\"template-editor__faq-edit-answer\"\n placeholder=\"Answer\"\n rows={3}\n />\n <div className=\"template-editor__faq-edit-actions\">\n <button\n type=\"button\"\n onClick={handleSaveFaqEdit}\n className=\"template-editor__faq-save-btn\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelFaqEdit}\n className=\"template-editor__faq-cancel-btn\"\n >\n Cancel\n </button>\n </div>\n </div>\n ) : (\n <>\n <div className=\"template-editor__faq-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveFaq(index, \"up\")}\n className=\"template-editor__faq-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveFaq(index, \"down\")}\n className=\"template-editor__faq-reorder-btn\"\n disabled={index === sortedFaqs.length - 1}\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <div className=\"template-editor__faq-number\">\n {index + 1}\n </div>\n <div className=\"template-editor__faq-content\">\n <div className=\"template-editor__faq-question\">\n {faq.question}\n </div>\n <div className=\"template-editor__faq-answer\">\n {faq.answer}\n </div>\n </div>\n <div className=\"template-editor__faq-actions\">\n <button\n type=\"button\"\n onClick={() => handleStartEditFaq(faq)}\n className=\"template-editor__faq-action-btn\"\n title=\"Edit FAQ\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleDeleteFaq(faq.id)}\n className=\"template-editor__faq-action-btn template-editor__faq-action-btn--delete\"\n title=\"Delete FAQ\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2\" />\n </svg>\n </button>\n </div>\n </>\n )}\n </div>\n ))}\n </div>\n\n {/* Add new FAQ form */}\n <div className=\"template-editor__faq-add-form\">\n <input\n type=\"text\"\n value={newFaqQuestion}\n onChange={(e) => setNewFaqQuestion(e.target.value)}\n placeholder=\"New question...\"\n className=\"template-editor__faq-new-question\"\n />\n <textarea\n value={newFaqAnswer}\n onChange={(e) => setNewFaqAnswer(e.target.value)}\n placeholder=\"Answer to the question...\"\n className=\"template-editor__faq-new-answer\"\n rows={2}\n />\n {(newFaqQuestion || newFaqAnswer) && (\n <button\n type=\"button\"\n onClick={handleAddFaq}\n className=\"template-editor__faq-add-btn\"\n disabled={!newFaqQuestion.trim() || !newFaqAnswer.trim()}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n Add FAQ\n </button>\n )}\n </div>\n </section>\n\n {/* Services Information Section Divider */}\n <div className=\"template-editor__section-divider\">\n <div className=\"template-editor__section-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n Services Information\n </div>\n <div className=\"template-editor__section-divider-line\" />\n </div>\n\n {/* Services Grid */}\n <div className=\"template-editor__grid\">\n <section className=\"template-editor__card\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--emerald\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" />\n <path d=\"M2 17l10 5 10-5\" />\n <path d=\"M2 12l10 5 10-5\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Formation & Setup\n </h3>\n <p className=\"template-editor__card-subtitle\">\n One-time setup services\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowSetupTemplates(!showSetupTemplates)}\n className={`template-editor__templates-toggle ${showSetupTemplates ? \"template-editor__templates-toggle--active\" : \"\"}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Templates\n </button>\n </div>\n\n {showSetupTemplates && (\n <div className=\"template-editor__templates-panel\">\n {Object.entries(SETUP_SERVICE_TEMPLATES).map(\n ([category, templates]) => (\n <div\n key={category}\n className=\"template-editor__template-category\"\n >\n <span className=\"template-editor__template-category-label\">\n {category}\n </span>\n <div className=\"template-editor__template-items\">\n {templates.map((template) => {\n const isAdded = globalState.setupServices.includes(\n template.title,\n );\n return (\n <button\n key={template.title}\n type=\"button\"\n onClick={() =>\n handleAddSetupFromTemplate(template)\n }\n disabled={isAdded}\n className={`template-editor__template-item ${isAdded ? \"template-editor__template-item--added\" : \"\"}`}\n title={template.description}\n >\n <span className=\"template-editor__template-icon\">\n {template.icon}\n </span>\n <span className=\"template-editor__template-title\">\n {template.title}\n </span>\n {isAdded && (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className=\"template-editor__template-check\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n\n <div className=\"template-editor__services\">\n {globalState.setupServices.map(\n (service: string, index: number) => (\n <div key={index} className=\"template-editor__service\">\n <div className=\"template-editor__service-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveSetupService(index, \"up\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() => handleMoveSetupService(index, \"down\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={\n index === globalState.setupServices.length - 1\n }\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <span className=\"template-editor__service-bullet\" />\n <span className=\"template-editor__service-text\">\n {service}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveSetupService(index)}\n className=\"template-editor__service-remove\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </div>\n ),\n )}\n <div className=\"template-editor__add-service\">\n <span className=\"template-editor__service-bullet template-editor__service-bullet--ghost\" />\n <input\n ref={setupServiceInputRef}\n type=\"text\"\n value={newSetupService}\n onChange={(e) => setNewSetupService(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddSetupService();\n }}\n placeholder=\"Add a setup service...\"\n className=\"template-editor__service-new-input\"\n />\n {newSetupService && (\n <button\n type=\"button\"\n onClick={handleAddSetupService}\n className=\"template-editor__service-add-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </section>\n\n <section className=\"template-editor__card\">\n <div className=\"template-editor__card-header\">\n <div className=\"template-editor__card-icon template-editor__card-icon--amber\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M12 8v4l3 3\" />\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n </svg>\n </div>\n <div>\n <h3 className=\"template-editor__card-title\">\n Recurring Services\n </h3>\n <p className=\"template-editor__card-subtitle\">\n Ongoing services included\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() =>\n setShowRecurringTemplates(!showRecurringTemplates)\n }\n className={`template-editor__templates-toggle template-editor__templates-toggle--amber ${showRecurringTemplates ? \"template-editor__templates-toggle--active\" : \"\"}`}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Templates\n </button>\n </div>\n\n {showRecurringTemplates && (\n <div className=\"template-editor__templates-panel template-editor__templates-panel--amber\">\n {Object.entries(RECURRING_SERVICE_TEMPLATES).map(\n ([category, templates]) => (\n <div\n key={category}\n className=\"template-editor__template-category\"\n >\n <span className=\"template-editor__template-category-label\">\n {category}\n </span>\n <div className=\"template-editor__template-items\">\n {templates.map((template) => {\n const isAdded =\n globalState.recurringServices.includes(\n template.title,\n );\n return (\n <button\n key={template.title}\n type=\"button\"\n onClick={() =>\n handleAddRecurringFromTemplate(template)\n }\n disabled={isAdded}\n className={`template-editor__template-item template-editor__template-item--amber ${isAdded ? \"template-editor__template-item--added\" : \"\"}`}\n title={template.description}\n >\n <span className=\"template-editor__template-icon\">\n {template.icon}\n </span>\n <span className=\"template-editor__template-title\">\n {template.title}\n </span>\n {isAdded && (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n className=\"template-editor__template-check\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n ),\n )}\n </div>\n )}\n\n <div className=\"template-editor__services\">\n {globalState.recurringServices.map(\n (service: string, index: number) => (\n <div key={index} className=\"template-editor__service\">\n <div className=\"template-editor__service-reorder\">\n <button\n type=\"button\"\n onClick={() => handleMoveRecurringService(index, \"up\")}\n className=\"template-editor__service-reorder-btn\"\n disabled={index === 0}\n title=\"Move up\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M18 15l-6-6-6 6\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n handleMoveRecurringService(index, \"down\")\n }\n className=\"template-editor__service-reorder-btn\"\n disabled={\n index === globalState.recurringServices.length - 1\n }\n title=\"Move down\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n </div>\n <span className=\"template-editor__service-bullet template-editor__service-bullet--recurring\" />\n <span className=\"template-editor__service-text\">\n {service}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveRecurringService(index)}\n className=\"template-editor__service-remove\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path d=\"M18 6L6 18M6 6l12 12\" strokeWidth=\"2\" />\n </svg>\n </button>\n </div>\n ),\n )}\n <div className=\"template-editor__add-service\">\n <span className=\"template-editor__service-bullet template-editor__service-bullet--ghost\" />\n <input\n ref={recurringServiceInputRef}\n type=\"text\"\n value={newRecurringService}\n onChange={(e) => setNewRecurringService(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddRecurringService();\n }}\n placeholder=\"Add a recurring service...\"\n className=\"template-editor__service-new-input\"\n />\n {newRecurringService && (\n <button\n type=\"button\"\n onClick={handleAddRecurringService}\n className=\"template-editor__service-add-btn\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M12 5v14M5 12h14\" strokeWidth=\"2\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n </section>\n </div>\n\n {/* Metadata Row */}\n <section className=\"template-editor__metadata\">\n <div className=\"template-editor__meta-field\">\n <label className=\"template-editor__label\">Operator ID</label>\n <input\n type=\"text\"\n value={formData.operatorId}\n onChange={(e) => handleFieldChange(\"operatorId\", e.target.value)}\n onBlur={handleOperatorBlur}\n className=\"template-editor__input template-editor__input--mono\"\n placeholder=\"operator-123\"\n />\n </div>\n <div className=\"template-editor__meta-field\">\n <label className=\"template-editor__label\">More Info Link</label>\n <input\n type=\"text\"\n value={formData.infoLink}\n onChange={(e) => handleFieldChange(\"infoLink\", e.target.value)}\n onBlur={handleInfoBlur}\n className=\"template-editor__input\"\n placeholder=\"https://example.com/more-info\"\n />\n </div>\n </section>\n </div>\n </>\n );\n}\n\nconst styles = `\n @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:wght@400;500;600;700&display=swap');\n\n .template-editor {\n --te-font: 'Instrument Sans', system-ui, sans-serif;\n --te-mono: 'DM Mono', 'SF Mono', monospace;\n\n --te-ink: #1a1f36;\n --te-ink-light: #4a5578;\n --te-ink-muted: #8792a8;\n --te-surface: #ffffff;\n --te-surface-raised: #fafbfc;\n --te-border: #e4e8f0;\n --te-border-light: #f0f2f7;\n\n --te-violet: #7c5cff;\n --te-violet-light: #f4f1ff;\n --te-amber: #f59e0b;\n --te-amber-light: #fef7e6;\n --te-emerald: #10b981;\n --te-emerald-light: #e8faf3;\n --te-sky: #0ea5e9;\n --te-sky-light: #e8f7fc;\n --te-rose: #f43f5e;\n --te-rose-light: #fef1f3;\n --te-slate: #64748b;\n --te-slate-light: #f1f5f9;\n --te-teal: #14b8a6;\n --te-teal-light: #ccfbf1;\n\n font-family: var(--te-font);\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* Hero Section */\n .template-editor__hero {\n display: grid;\n grid-template-columns: 160px 1fr;\n gap: 28px;\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n border-left: 4px solid var(--te-teal);\n }\n\n .template-editor__thumbnail-area {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .template-editor__thumbnail {\n width: 160px;\n height: 120px;\n border-radius: 12px;\n background: linear-gradient(135deg, var(--te-border-light) 0%, var(--te-border) 100%);\n background-size: cover;\n background-position: center;\n position: relative;\n overflow: hidden;\n transition: transform 0.2s ease;\n }\n\n .template-editor__thumbnail:hover {\n transform: scale(1.02);\n }\n\n .template-editor__thumbnail-placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n color: var(--te-ink-muted);\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .template-editor__thumbnail-placeholder svg {\n width: 32px;\n height: 32px;\n opacity: 0.5;\n }\n\n .template-editor__status-badge {\n position: absolute;\n top: 8px;\n left: 8px;\n padding: 4px 10px;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n border-radius: 100px;\n backdrop-filter: blur(8px);\n }\n\n .template-editor__status-badge--emerald {\n background: rgba(16, 185, 129, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--sky {\n background: rgba(14, 165, 233, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--slate {\n background: rgba(100, 116, 139, 0.9);\n color: white;\n }\n\n .template-editor__status-badge--rose {\n background: rgba(244, 63, 94, 0.9);\n color: white;\n }\n\n .template-editor__thumbnail-input {\n width: 100%;\n }\n\n .template-editor__identity {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .template-editor__title-row {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .template-editor__title-input {\n flex: 1;\n font-family: var(--te-font);\n font-size: 1.75rem;\n font-weight: 700;\n color: var(--te-ink);\n background: transparent;\n border: none;\n outline: none;\n padding: 0;\n letter-spacing: -0.02em;\n }\n\n .template-editor__title-input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__status-select {\n position: relative;\n display: flex;\n align-items: center;\n }\n\n .template-editor__select {\n appearance: none;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n padding: 8px 32px 8px 28px;\n border-radius: 100px;\n border: 1.5px solid var(--te-border);\n background: var(--te-surface-raised);\n color: var(--te-ink-light);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__select:hover {\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__select:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__status-indicator {\n position: absolute;\n left: 10px;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n pointer-events: none;\n }\n\n .template-editor__status-indicator--emerald { background: var(--te-emerald); }\n .template-editor__status-indicator--sky { background: var(--te-sky); }\n .template-editor__status-indicator--slate { background: var(--te-slate); }\n .template-editor__status-indicator--rose { background: var(--te-rose); }\n\n /* Audiences */\n .template-editor__audiences {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n }\n\n .template-editor__audience-tag {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n font-size: 0.8125rem;\n font-weight: 600;\n border-radius: 100px;\n background: var(--te-teal-light);\n border: 1px solid rgba(20, 184, 166, 0.2);\n color: var(--te-teal);\n transition: all 0.15s ease;\n }\n\n .template-editor__audience-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n cursor: pointer;\n opacity: 0.6;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__audience-remove:hover {\n opacity: 1;\n }\n\n .template-editor__audience-remove svg {\n width: 12px;\n height: 12px;\n }\n\n .template-editor__add-audience-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--te-ink-muted);\n background: transparent;\n border: 1.5px dashed var(--te-border);\n border-radius: 100px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__add-audience-btn:hover {\n border-color: var(--te-ink-muted);\n color: var(--te-ink-light);\n }\n\n .template-editor__add-audience-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__audience-input-wrap {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .template-editor__audience-input {\n width: 140px;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n border: 1.5px solid var(--te-teal);\n border-radius: 100px;\n outline: none;\n background: var(--te-surface);\n }\n\n .template-editor__audience-add-btn {\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 600;\n color: white;\n background: var(--te-teal);\n border: none;\n border-radius: 100px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__audience-add-btn:hover {\n background: #0d9488;\n }\n\n .template-editor__audience-presets {\n display: flex;\n align-items: center;\n gap: 8px;\n padding-top: 4px;\n }\n\n .template-editor__presets-label {\n font-size: 0.75rem;\n color: var(--te-ink-muted);\n }\n\n .template-editor__preset-btn {\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 500;\n padding: 4px 8px;\n background: transparent;\n border: none;\n cursor: pointer;\n opacity: 0.7;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__preset-btn:hover {\n opacity: 1;\n }\n\n .template-editor__summary {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n line-height: 1.6;\n color: var(--te-ink-light);\n background: transparent;\n border: none;\n outline: none;\n resize: none;\n padding: 0;\n }\n\n .template-editor__summary::placeholder {\n color: var(--te-ink-muted);\n }\n\n /* Section Divider */\n .template-editor__section-divider {\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 8px 0;\n }\n\n .template-editor__section-divider-line {\n flex: 1;\n height: 1px;\n background: linear-gradient(90deg, transparent, var(--te-border), transparent);\n }\n\n .template-editor__section-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n background: linear-gradient(135deg, var(--te-emerald-light) 0%, var(--te-teal-light) 100%);\n color: var(--te-emerald);\n border-radius: 100px;\n font-size: 0.8125rem;\n font-weight: 600;\n letter-spacing: 0.02em;\n white-space: nowrap;\n }\n\n .template-editor__section-badge svg {\n width: 16px;\n height: 16px;\n }\n\n /* Grid Cards */\n .template-editor__grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n }\n\n .template-editor__card {\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__card-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n margin-bottom: 20px;\n }\n\n .template-editor__card-icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .template-editor__card-icon svg {\n width: 20px;\n height: 20px;\n }\n\n .template-editor__card-icon--violet {\n background: var(--te-violet-light);\n color: var(--te-violet);\n }\n\n .template-editor__card-icon--amber {\n background: var(--te-amber-light);\n color: var(--te-amber);\n }\n\n .template-editor__card-icon--emerald {\n background: var(--te-emerald-light);\n color: var(--te-emerald);\n }\n\n .template-editor__card--full {\n grid-column: 1 / -1;\n }\n\n .template-editor__card-title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--te-ink);\n margin: 0 0 2px;\n }\n\n .template-editor__card-subtitle {\n font-size: 0.8125rem;\n color: var(--te-ink-muted);\n margin: 0;\n }\n\n .template-editor__textarea {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n line-height: 1.7;\n color: var(--te-ink);\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n padding: 16px;\n resize: vertical;\n transition: all 0.15s ease;\n }\n\n .template-editor__textarea:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__textarea:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__textarea::placeholder {\n color: var(--te-ink-muted);\n }\n\n /* Services */\n .template-editor__services {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-editor__service {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--te-surface-raised);\n border-radius: 8px;\n transition: background 0.15s ease;\n }\n\n .template-editor__service:hover {\n background: var(--te-border-light);\n }\n\n .template-editor__service-bullet {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--te-emerald);\n flex-shrink: 0;\n }\n\n .template-editor__service-bullet--recurring {\n background: var(--te-amber);\n }\n\n .template-editor__service-bullet--ghost {\n background: var(--te-border);\n }\n\n .template-editor__service-text {\n flex: 1;\n font-size: 0.875rem;\n color: var(--te-ink);\n }\n\n .template-editor__service-remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--te-ink-muted);\n opacity: 0;\n transition: all 0.15s ease;\n }\n\n .template-editor__service:hover .template-editor__service-remove {\n opacity: 1;\n }\n\n .template-editor__service-remove:hover {\n background: var(--te-rose-light);\n color: var(--te-rose);\n }\n\n .template-editor__service-remove svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__service-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__service:hover .template-editor__service-reorder {\n opacity: 1;\n }\n\n .template-editor__service-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 14px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 3px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__service-reorder-btn:hover:not(:disabled) {\n background: var(--te-emerald-light);\n color: var(--te-emerald);\n }\n\n .template-editor__service-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__service-reorder-btn svg {\n width: 12px;\n height: 12px;\n }\n\n .template-editor__add-service {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: transparent;\n border: 1.5px dashed var(--te-border);\n border-radius: 8px;\n transition: all 0.15s ease;\n }\n\n .template-editor__add-service:focus-within {\n border-color: var(--te-teal);\n border-style: solid;\n }\n\n .template-editor__service-new-input {\n flex: 1;\n font-family: var(--te-font);\n font-size: 0.875rem;\n background: transparent;\n border: none;\n outline: none;\n color: var(--te-ink);\n }\n\n .template-editor__service-new-input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__service-add-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: var(--te-teal);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: white;\n transition: background 0.15s ease;\n }\n\n .template-editor__service-add-btn:hover {\n background: #0d9488;\n }\n\n .template-editor__service-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Metadata */\n .template-editor__metadata {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 20px;\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__meta-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .template-editor__label {\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--te-ink-muted);\n }\n\n .template-editor__input {\n width: 100%;\n font-family: var(--te-font);\n font-size: 0.9375rem;\n padding: 12px 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 10px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__input:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__input:focus {\n outline: none;\n border-color: var(--te-teal);\n box-shadow: 0 0 0 3px var(--te-teal-light);\n }\n\n .template-editor__input::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__input--sm {\n font-size: 0.8125rem;\n padding: 8px 12px;\n }\n\n .template-editor__input--mono {\n font-family: var(--te-mono);\n font-size: 0.875rem;\n }\n\n /* Facet Targeting */\n .template-editor__facets {\n background: var(--te-surface);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n .template-editor__facets-header {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n margin-bottom: 20px;\n }\n\n .template-editor__card-icon--sky {\n background: var(--te-sky-light);\n color: var(--te-sky);\n }\n\n .template-editor__facets-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 16px;\n }\n\n .template-editor__facet-card {\n background: var(--te-surface-raised);\n border: 1px solid var(--te-border-light);\n border-radius: 12px;\n padding: 16px;\n transition: border-color 0.15s ease;\n }\n\n .template-editor__facet-card:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__facet-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 6px;\n }\n\n .template-editor__facet-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--te-ink);\n }\n\n .template-editor__facet-clear {\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 500;\n padding: 4px 8px;\n background: transparent;\n border: none;\n color: var(--te-ink-muted);\n cursor: pointer;\n transition: color 0.15s ease;\n }\n\n .template-editor__facet-clear:hover {\n color: var(--te-rose);\n }\n\n .template-editor__facet-desc {\n font-size: 0.75rem;\n color: var(--te-ink-muted);\n margin: 0 0 12px;\n }\n\n .template-editor__facet-options {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .template-editor__facet-option {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 12px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__facet-option:hover {\n border-color: var(--te-border);\n background: var(--te-surface);\n }\n\n .template-editor__facet-option--selected {\n border-color: var(--te-teal);\n background: var(--te-teal-light);\n color: var(--te-ink);\n }\n\n .template-editor__facet-option--selected:hover {\n border-color: var(--te-teal);\n background: var(--te-teal-light);\n }\n\n .template-editor__facet-checkbox {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n transition: all 0.15s ease;\n }\n\n .template-editor__facet-option--selected .template-editor__facet-checkbox {\n background: var(--te-teal);\n border-color: var(--te-teal);\n }\n\n .template-editor__facet-checkbox svg {\n width: 12px;\n height: 12px;\n color: white;\n }\n\n /* Templates Panel */\n .template-editor__templates-toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n padding: 6px 12px;\n font-family: var(--te-font);\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--te-emerald);\n background: var(--te-emerald-light);\n border: 1.5px solid transparent;\n border-radius: 100px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__templates-toggle svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__templates-toggle:hover {\n border-color: var(--te-emerald);\n }\n\n .template-editor__templates-toggle--active {\n background: var(--te-emerald);\n color: white;\n }\n\n .template-editor__templates-toggle--amber {\n color: var(--te-amber);\n background: var(--te-amber-light);\n }\n\n .template-editor__templates-toggle--amber:hover {\n border-color: var(--te-amber);\n }\n\n .template-editor__templates-toggle--amber.template-editor__templates-toggle--active {\n background: var(--te-amber);\n color: white;\n }\n\n .template-editor__templates-panel {\n background: var(--te-emerald-light);\n border: 1px solid rgba(16, 185, 129, 0.2);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n animation: templatesPanelSlide 0.2s ease-out;\n }\n\n .template-editor__templates-panel--amber {\n background: var(--te-amber-light);\n border-color: rgba(245, 158, 11, 0.2);\n }\n\n @keyframes templatesPanelSlide {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .template-editor__template-category {\n margin-bottom: 12px;\n }\n\n .template-editor__template-category:last-child {\n margin-bottom: 0;\n }\n\n .template-editor__template-category-label {\n display: block;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--te-ink-muted);\n margin-bottom: 8px;\n }\n\n .template-editor__template-items {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .template-editor__template-item {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--te-ink);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__template-item:hover:not(:disabled) {\n border-color: var(--te-emerald);\n background: white;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(16, 185, 129, 0.15);\n }\n\n .template-editor__template-item--amber:hover:not(:disabled) {\n border-color: var(--te-amber);\n box-shadow: 0 2px 8px rgba(245, 158, 11, 0.15);\n }\n\n .template-editor__template-item--added {\n background: var(--te-emerald-light);\n border-color: var(--te-emerald);\n color: var(--te-emerald);\n cursor: default;\n }\n\n .template-editor__template-item--amber.template-editor__template-item--added {\n background: var(--te-amber-light);\n border-color: var(--te-amber);\n color: var(--te-amber);\n }\n\n .template-editor__template-icon {\n font-size: 0.875rem;\n }\n\n .template-editor__template-title {\n white-space: nowrap;\n }\n\n .template-editor__template-check {\n width: 14px;\n height: 14px;\n margin-left: 2px;\n }\n\n /* FAQ Section */\n .template-editor__faq-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .template-editor__faq-item {\n display: flex;\n align-items: flex-start;\n gap: 16px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-item:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-item--editing {\n border-color: var(--te-sky);\n background: var(--te-sky-light);\n }\n\n .template-editor__faq-number {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n background: var(--te-sky-light);\n color: var(--te-sky);\n font-size: 0.8125rem;\n font-weight: 700;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n .template-editor__faq-content {\n flex: 1;\n min-width: 0;\n }\n\n .template-editor__faq-question {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink);\n margin-bottom: 6px;\n line-height: 1.4;\n }\n\n .template-editor__faq-answer {\n font-size: 0.875rem;\n color: var(--te-ink-light);\n line-height: 1.6;\n }\n\n .template-editor__faq-actions {\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__faq-item:hover .template-editor__faq-actions {\n opacity: 1;\n }\n\n .template-editor__faq-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-action-btn:hover {\n border-color: var(--te-sky);\n color: var(--te-sky);\n background: var(--te-sky-light);\n }\n\n .template-editor__faq-action-btn--delete:hover {\n border-color: var(--te-rose);\n color: var(--te-rose);\n background: var(--te-rose-light);\n }\n\n .template-editor__faq-action-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .template-editor__faq-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__faq-item:hover .template-editor__faq-reorder {\n opacity: 1;\n }\n\n .template-editor__faq-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-reorder-btn:hover:not(:disabled) {\n background: var(--te-sky-light);\n color: var(--te-sky);\n }\n\n .template-editor__faq-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__faq-reorder-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__faq-edit-form {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .template-editor__faq-edit-question {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n }\n\n .template-editor__faq-edit-question:focus {\n outline: none;\n border-color: var(--te-sky);\n }\n\n .template-editor__faq-edit-answer {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 60px;\n }\n\n .template-editor__faq-edit-answer:focus {\n outline: none;\n border-color: var(--te-sky);\n }\n\n .template-editor__faq-edit-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .template-editor__faq-save-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: white;\n background: var(--te-sky);\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__faq-save-btn:hover {\n background: #0284c7;\n }\n\n .template-editor__faq-cancel-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-cancel-btn:hover {\n background: var(--te-surface-raised);\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__faq-add-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px dashed var(--te-border);\n border-radius: 12px;\n }\n\n .template-editor__faq-new-question {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-new-question:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-new-question:focus {\n outline: none;\n border-color: var(--te-sky);\n box-shadow: 0 0 0 3px var(--te-sky-light);\n }\n\n .template-editor__faq-new-question::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__faq-new-answer {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 60px;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-new-answer:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__faq-new-answer:focus {\n outline: none;\n border-color: var(--te-sky);\n box-shadow: 0 0 0 3px var(--te-sky-light);\n }\n\n .template-editor__faq-new-answer::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__faq-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 20px;\n font-family: var(--te-font);\n font-size: 0.875rem;\n font-weight: 600;\n color: white;\n background: var(--te-sky);\n border: none;\n border-radius: 8px;\n cursor: pointer;\n align-self: flex-start;\n transition: all 0.15s ease;\n }\n\n .template-editor__faq-add-btn:hover:not(:disabled) {\n background: #0284c7;\n }\n\n .template-editor__faq-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .template-editor__faq-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Content Sections */\n .template-editor__card-icon--indigo {\n background: #eef2ff;\n color: #6366f1;\n }\n\n .template-editor__sections-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 16px;\n }\n\n .template-editor__section-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px solid var(--te-border-light);\n border-radius: 12px;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-item:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-item--editing {\n border-color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-reorder {\n display: flex;\n flex-direction: column;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s ease;\n }\n\n .template-editor__section-item:hover .template-editor__section-reorder {\n opacity: 1;\n }\n\n .template-editor__section-reorder-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 16px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-reorder-btn:hover:not(:disabled) {\n background: #e0e7ff;\n color: #6366f1;\n }\n\n .template-editor__section-reorder-btn:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .template-editor__section-reorder-btn svg {\n width: 14px;\n height: 14px;\n }\n\n .template-editor__section-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n flex-shrink: 0;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-toggle:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-chevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n }\n\n .template-editor__section-chevron--expanded {\n transform: rotate(180deg);\n }\n\n .template-editor__section-main {\n flex: 1;\n min-width: 0;\n cursor: pointer;\n }\n\n .template-editor__section-header {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .template-editor__section-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink);\n line-height: 1.4;\n }\n\n .template-editor__section-preview {\n font-size: 0.8125rem;\n color: var(--te-ink-muted);\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .template-editor__section-content {\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px solid var(--te-border-light);\n font-size: 0.875rem;\n color: var(--te-ink-light);\n line-height: 1.7;\n white-space: pre-wrap;\n animation: sectionExpand 0.2s ease-out;\n }\n\n @keyframes sectionExpand {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 1000px;\n }\n }\n\n .template-editor__section-actions {\n display: flex;\n gap: 6px;\n opacity: 0;\n transition: opacity 0.15s ease;\n flex-shrink: 0;\n }\n\n .template-editor__section-item:hover .template-editor__section-actions {\n opacity: 1;\n }\n\n .template-editor__section-action-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n cursor: pointer;\n color: var(--te-ink-muted);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-action-btn:hover {\n border-color: #6366f1;\n color: #6366f1;\n background: #eef2ff;\n }\n\n .template-editor__section-action-btn--delete:hover {\n border-color: var(--te-rose);\n color: var(--te-rose);\n background: var(--te-rose-light);\n }\n\n .template-editor__section-action-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .template-editor__section-edit-form {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n\n .template-editor__section-edit-title {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n }\n\n .template-editor__section-edit-title:focus {\n outline: none;\n border-color: #6366f1;\n }\n\n .template-editor__section-edit-content {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 120px;\n line-height: 1.6;\n }\n\n .template-editor__section-edit-content:focus {\n outline: none;\n border-color: #6366f1;\n }\n\n .template-editor__section-edit-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n }\n\n .template-editor__section-save-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: white;\n background: #6366f1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .template-editor__section-save-btn:hover {\n background: #4f46e5;\n }\n\n .template-editor__section-cancel-btn {\n padding: 8px 16px;\n font-family: var(--te-font);\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--te-ink-light);\n background: var(--te-surface);\n border: 1.5px solid var(--te-border);\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-cancel-btn:hover {\n background: var(--te-surface-raised);\n border-color: var(--te-ink-muted);\n }\n\n .template-editor__section-add-form {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 16px;\n background: var(--te-surface-raised);\n border: 1.5px dashed var(--te-border);\n border-radius: 12px;\n }\n\n .template-editor__section-new-title {\n font-family: var(--te-font);\n font-size: 0.9375rem;\n font-weight: 600;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n transition: all 0.15s ease;\n }\n\n .template-editor__section-new-title:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-new-title:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px #eef2ff;\n }\n\n .template-editor__section-new-title::placeholder {\n color: var(--te-ink-muted);\n font-weight: 400;\n }\n\n .template-editor__section-new-content {\n font-family: var(--te-font);\n font-size: 0.875rem;\n padding: 10px 14px;\n background: var(--te-surface);\n border: 1.5px solid var(--te-border-light);\n border-radius: 8px;\n color: var(--te-ink);\n resize: vertical;\n min-height: 100px;\n line-height: 1.6;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-new-content:hover {\n border-color: var(--te-border);\n }\n\n .template-editor__section-new-content:focus {\n outline: none;\n border-color: #6366f1;\n box-shadow: 0 0 0 3px #eef2ff;\n }\n\n .template-editor__section-new-content::placeholder {\n color: var(--te-ink-muted);\n }\n\n .template-editor__section-add-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 20px;\n font-family: var(--te-font);\n font-size: 0.875rem;\n font-weight: 600;\n color: white;\n background: #6366f1;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n align-self: flex-start;\n transition: all 0.15s ease;\n }\n\n .template-editor__section-add-btn:hover:not(:disabled) {\n background: #4f46e5;\n }\n\n .template-editor__section-add-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .template-editor__section-add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Responsive */\n @media (max-width: 900px) {\n .template-editor__hero {\n grid-template-columns: 1fr;\n }\n\n .template-editor__thumbnail-area {\n flex-direction: row;\n align-items: flex-start;\n }\n\n .template-editor__thumbnail {\n width: 120px;\n height: 90px;\n }\n\n .template-editor__thumbnail-input {\n flex: 1;\n }\n\n .template-editor__grid {\n grid-template-columns: 1fr;\n }\n\n .template-editor__metadata {\n grid-template-columns: 1fr;\n }\n\n .template-editor__facets-grid {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import { useState, useCallback, useMemo } from \"react\";\nimport { generateId } from \"document-model/core\";\nimport type { DocumentDispatch } from \"@powerhousedao/reactor-browser\";\nimport type {\n ResourceTemplateDocument,\n ResourceTemplateAction,\n} from \"document-models/resource-template\";\nimport {\n setFacetTarget,\n removeFacetTarget,\n addFacetOption,\n removeFacetOption,\n} from \"../../../document-models/resource-template/v1/gen/creators.js\";\n\ninterface FacetTargetingProps {\n document: ResourceTemplateDocument;\n dispatch: DocumentDispatch<ResourceTemplateAction>;\n}\n\n// FacetPreset type (matches document model schema)\ninterface FacetPreset {\n id: string;\n categoryKey: string;\n categoryLabel: string;\n description: string | null;\n icon: string | null;\n isRecommended: boolean;\n suggestedOptions: string[];\n}\n\n// Default presets (used as fallback if document state doesn't have presets)\nconst DEFAULT_FACET_PRESETS: FacetPreset[] = [\n {\n id: \"sno-function\",\n categoryKey: \"sno-function\",\n categoryLabel: \"SNO Function\",\n icon: \"🎯\",\n description: \"Sky Node Operator function type\",\n suggestedOptions: [\n \"Operational Hub for Open Source Builders\",\n \"Operational Hub\",\n \"IP SPV\",\n \"Revenue Generating Hub\",\n \"SNO Embryonic Hub\",\n \"Self-Insurance Risk Management Hub\",\n ],\n isRecommended: true,\n },\n {\n id: \"legal-entity\",\n categoryKey: \"legal-entity\",\n categoryLabel: \"Legal Entity\",\n icon: \"🏛️\",\n description: \"Type of legal structure for the resource\",\n suggestedOptions: [\"Swiss Association\", \"BVI Entity\"],\n isRecommended: true,\n },\n {\n id: \"team\",\n categoryKey: \"team\",\n categoryLabel: \"Team\",\n icon: \"👥\",\n description: \"Team structure and work arrangement\",\n suggestedOptions: [\"Remote\", \"Local\", \"Hybrid\"],\n isRecommended: true,\n },\n {\n id: \"anonymity\",\n categoryKey: \"anonymity\",\n categoryLabel: \"Anonymity\",\n icon: \"🔒\",\n description: \"Privacy and identity disclosure level\",\n suggestedOptions: [\"High\", \"Highest\"],\n isRecommended: true,\n },\n];\n\n// Calculate completion status for Goal-Gradient Effect\nfunction calculateProgress(\n facetTargets: { categoryKey: string; selectedOptions: string[] }[],\n presets: FacetPreset[],\n): {\n configured: number;\n recommended: number;\n percentage: number;\n isComplete: boolean;\n} {\n const recommendedKeys = new Set(\n presets.filter((p) => p.isRecommended).map((p) => p.categoryKey),\n );\n\n const configuredRecommended = facetTargets.filter(\n (t) => recommendedKeys.has(t.categoryKey) && t.selectedOptions.length > 0,\n ).length;\n\n const percentage =\n recommendedKeys.size > 0\n ? Math.round((configuredRecommended / recommendedKeys.size) * 100)\n : 0;\n\n return {\n configured: configuredRecommended,\n recommended: recommendedKeys.size,\n percentage,\n isComplete:\n recommendedKeys.size > 0 && configuredRecommended >= recommendedKeys.size,\n };\n}\n\nexport function FacetTargeting({ document, dispatch }: FacetTargetingProps) {\n const facetTargets = document.state.global.facetTargets;\n\n // Use facetPresets from document state if available, otherwise use defaults\n // Type assertion needed because generated types don't include facetPresets yet\n const documentState = document.state.global as Record<string, unknown>;\n const facetPresets: FacetPreset[] = Array.isArray(documentState.facetPresets)\n ? (documentState.facetPresets as FacetPreset[])\n : DEFAULT_FACET_PRESETS;\n\n const [showAddCategory, setShowAddCategory] = useState(false);\n const [newCategoryLabel, setNewCategoryLabel] = useState(\"\");\n const [showPresets, setShowPresets] = useState(true);\n\n const [editingOptionFor, setEditingOptionFor] = useState<string | null>(null);\n const [newOptionId, setNewOptionId] = useState(\"\");\n\n // Use Set for O(1) lookups - React Best Practice\n const existingCategoryKeys = useMemo(\n () => new Set(facetTargets.map((t) => t.categoryKey)),\n [facetTargets],\n );\n\n // Calculate progress for Goal-Gradient Effect\n const progress = useMemo(\n () => calculateProgress(facetTargets, facetPresets),\n [facetTargets, facetPresets],\n );\n\n // Get available presets (not yet added)\n const availablePresets = useMemo(\n () => facetPresets.filter((p) => !existingCategoryKeys.has(p.categoryKey)),\n [facetPresets, existingCategoryKeys],\n );\n\n const recommendedPresets = availablePresets.filter((p) => p.isRecommended);\n const otherPresets = availablePresets.filter((p) => !p.isRecommended);\n\n const handleAddCategory = useCallback(() => {\n if (!newCategoryLabel.trim()) return;\n\n const label = newCategoryLabel.trim();\n const key = label.toLowerCase().replace(/\\s+/g, \"-\");\n\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: key,\n categoryLabel: label,\n selectedOptions: [],\n lastModified: new Date().toISOString(),\n }),\n );\n\n setNewCategoryLabel(\"\");\n setShowAddCategory(false);\n }, [newCategoryLabel, dispatch]);\n\n // Quick-add from preset - reduces activation energy\n const handleAddFromPreset = useCallback(\n (preset: FacetPreset, withOptions: boolean = false) => {\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: preset.categoryKey,\n categoryLabel: preset.categoryLabel,\n selectedOptions: withOptions ? preset.suggestedOptions : [],\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n // Add all recommended facets at once - Commitment & Consistency\n const handleAddAllRecommended = useCallback(() => {\n const now = new Date().toISOString();\n recommendedPresets.forEach((preset) => {\n dispatch(\n setFacetTarget({\n id: generateId(),\n categoryKey: preset.categoryKey,\n categoryLabel: preset.categoryLabel,\n selectedOptions: [],\n lastModified: now,\n }),\n );\n });\n }, [recommendedPresets, dispatch]);\n\n const handleRemoveCategory = useCallback(\n (categoryKey: string) => {\n if (\n window.confirm(\n \"Are you sure you want to remove this facet category and all its options?\",\n )\n ) {\n dispatch(\n removeFacetTarget({\n categoryKey,\n lastModified: new Date().toISOString(),\n }),\n );\n }\n },\n [dispatch],\n );\n\n const handleAddOption = useCallback(\n (categoryKey: string) => {\n if (!newOptionId.trim()) return;\n\n dispatch(\n addFacetOption({\n categoryKey,\n optionId: newOptionId.trim(),\n lastModified: new Date().toISOString(),\n }),\n );\n\n setNewOptionId(\"\");\n setEditingOptionFor(null);\n },\n [newOptionId, dispatch],\n );\n\n // Quick-add suggested option\n const handleAddSuggestedOption = useCallback(\n (categoryKey: string, optionId: string) => {\n dispatch(\n addFacetOption({\n categoryKey,\n optionId,\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n const handleRemoveOption = useCallback(\n (categoryKey: string, optionId: string) => {\n dispatch(\n removeFacetOption({\n categoryKey,\n optionId,\n lastModified: new Date().toISOString(),\n }),\n );\n },\n [dispatch],\n );\n\n // Get preset for a category to show suggested options\n const getPresetForCategory = (categoryKey: string) =>\n facetPresets.find((p) => p.categoryKey === categoryKey);\n\n return (\n <>\n <style>{styles}</style>\n <section className=\"facet-targeting\">\n {/* Progress Header - Goal-Gradient Effect */}\n <div className=\"facet-targeting__progress\">\n <div className=\"facet-targeting__progress-header\">\n <div className=\"facet-targeting__progress-info\">\n <span className=\"facet-targeting__progress-percent\">\n {progress.percentage}%\n </span>\n <span className=\"facet-targeting__progress-label\">\n {progress.configured}/{progress.recommended} recommended facets\n configured\n </span>\n </div>\n {progress.isComplete && (\n <span className=\"facet-targeting__complete-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n All set!\n </span>\n )}\n </div>\n <div className=\"facet-targeting__progress-bar\">\n <div\n className=\"facet-targeting__progress-fill\"\n style={{ width: `${progress.percentage}%` }}\n />\n </div>\n </div>\n\n <div className=\"facet-targeting__header\">\n <div className=\"facet-targeting__header-content\">\n <div className=\"facet-targeting__icon\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\" />\n <path d=\"M6 6h.008v.008H6V6z\" />\n </svg>\n </div>\n <div>\n <h3 className=\"facet-targeting__title\">Facet Targeting</h3>\n <p className=\"facet-targeting__subtitle\">\n Define configuration dimensions for this product\n </p>\n </div>\n </div>\n <div className=\"facet-targeting__header-actions\">\n <button\n type=\"button\"\n className={`facet-targeting__toggle-btn ${showPresets ? \"facet-targeting__toggle-btn--active\" : \"\"}`}\n onClick={() => setShowPresets(!showPresets)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z\" />\n </svg>\n Presets\n </button>\n <button\n type=\"button\"\n className=\"facet-targeting__add-btn\"\n onClick={() => setShowAddCategory(true)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n Custom\n </button>\n </div>\n </div>\n\n {/* Presets Panel - Default Effect */}\n {showPresets && availablePresets.length > 0 && (\n <div className=\"facet-targeting__presets\">\n <div className=\"facet-targeting__presets-header\">\n <h4 className=\"facet-targeting__presets-title\">\n Quick Add Facets\n </h4>\n {recommendedPresets.length > 1 && (\n <button\n type=\"button\"\n className=\"facet-targeting__add-all-btn\"\n onClick={handleAddAllRecommended}\n >\n Add all recommended ({recommendedPresets.length})\n </button>\n )}\n </div>\n\n {recommendedPresets.length > 0 && (\n <div className=\"facet-targeting__presets-section\">\n <span className=\"facet-targeting__presets-label\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" />\n </svg>\n Recommended\n </span>\n <div className=\"facet-targeting__presets-grid\">\n {recommendedPresets.map((preset) => (\n <PresetCard\n key={preset.categoryKey}\n preset={preset}\n onAdd={() => handleAddFromPreset(preset, false)}\n onAddWithOptions={() => handleAddFromPreset(preset, true)}\n />\n ))}\n </div>\n </div>\n )}\n\n {otherPresets.length > 0 && (\n <div className=\"facet-targeting__presets-section\">\n <span className=\"facet-targeting__presets-label\">\n Other Facets\n </span>\n <div className=\"facet-targeting__presets-grid\">\n {otherPresets.map((preset) => (\n <PresetCard\n key={preset.categoryKey}\n preset={preset}\n onAdd={() => handleAddFromPreset(preset, false)}\n onAddWithOptions={() => handleAddFromPreset(preset, true)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {showAddCategory && (\n <div className=\"facet-targeting__new-category\">\n <div className=\"facet-targeting__new-category-form\">\n <div className=\"facet-targeting__form-group\">\n <label className=\"facet-targeting__label\">\n Custom Category Name\n </label>\n <input\n type=\"text\"\n value={newCategoryLabel}\n onChange={(e) => setNewCategoryLabel(e.target.value)}\n placeholder=\"e.g., Region, Environment, Storage Type\"\n className=\"facet-targeting__input\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleAddCategory();\n if (e.key === \"Escape\") setShowAddCategory(false);\n }}\n />\n </div>\n <div className=\"facet-targeting__form-actions\">\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--secondary\"\n onClick={() => {\n setShowAddCategory(false);\n setNewCategoryLabel(\"\");\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary\"\n onClick={handleAddCategory}\n disabled={!newCategoryLabel.trim()}\n >\n Add Category\n </button>\n </div>\n </div>\n </div>\n )}\n\n {facetTargets.length === 0 && !showAddCategory && !showPresets ? (\n <div className=\"facet-targeting__empty\">\n <div className=\"facet-targeting__empty-icon\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M9.568 3H5.25A2.25 2.25 0 003 5.25v4.318c0 .597.237 1.17.659 1.591l9.581 9.581c.699.699 1.78.872 2.607.33a18.095 18.095 0 005.223-5.223c.542-.827.369-1.908-.33-2.607L11.16 3.66A2.25 2.25 0 009.568 3z\" />\n <path d=\"M6 6h.008v.008H6V6z\" />\n </svg>\n </div>\n <p className=\"facet-targeting__empty-text\">\n No facet categories defined. Use the presets above or add custom\n categories.\n </p>\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary\"\n onClick={() => setShowPresets(true)}\n >\n Show Presets\n </button>\n </div>\n ) : (\n facetTargets.length > 0 && (\n <div className=\"facet-targeting__categories\">\n {facetTargets.map((target) => {\n const preset = getPresetForCategory(target.categoryKey);\n const existingOptionsSet = new Set(target.selectedOptions);\n const suggestedOptions = preset?.suggestedOptions.filter(\n (opt) => !existingOptionsSet.has(opt),\n );\n\n return (\n <div key={target.categoryKey} className=\"facet-category\">\n <div className=\"facet-category__header\">\n <div className=\"facet-category__info\">\n {preset && (\n <span className=\"facet-category__icon\">\n {preset.icon}\n </span>\n )}\n <span className=\"facet-category__label\">\n {target.categoryLabel}\n </span>\n <span className=\"facet-category__key\">\n {target.categoryKey}\n </span>\n {preset?.isRecommended && (\n <span className=\"facet-category__recommended\">\n Recommended\n </span>\n )}\n </div>\n <div className=\"facet-category__actions\">\n <button\n type=\"button\"\n className=\"facet-category__btn\"\n onClick={() =>\n setEditingOptionFor(\n editingOptionFor === target.categoryKey\n ? null\n : target.categoryKey,\n )\n }\n title=\"Add option\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n </button>\n <button\n type=\"button\"\n className=\"facet-category__btn facet-category__btn--danger\"\n onClick={() =>\n handleRemoveCategory(target.categoryKey)\n }\n title=\"Remove category\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\n </svg>\n </button>\n </div>\n </div>\n\n {editingOptionFor === target.categoryKey && (\n <div className=\"facet-category__add-option\">\n <input\n type=\"text\"\n value={newOptionId}\n onChange={(e) => setNewOptionId(e.target.value)}\n placeholder=\"Enter option value...\"\n className=\"facet-targeting__input facet-targeting__input--sm\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\")\n handleAddOption(target.categoryKey);\n if (e.key === \"Escape\") {\n setEditingOptionFor(null);\n setNewOptionId(\"\");\n }\n }}\n />\n <button\n type=\"button\"\n className=\"facet-targeting__btn facet-targeting__btn--primary facet-targeting__btn--sm\"\n onClick={() => handleAddOption(target.categoryKey)}\n disabled={!newOptionId.trim()}\n >\n Add\n </button>\n </div>\n )}\n\n {/* Suggested Options - Paradox of Choice (show only available) */}\n {suggestedOptions && suggestedOptions.length > 0 && (\n <div className=\"facet-category__suggestions\">\n <span className=\"facet-category__suggestions-label\">\n Quick add:\n </span>\n {suggestedOptions.slice(0, 5).map((opt) => (\n <button\n key={opt}\n type=\"button\"\n className=\"facet-category__suggestion-btn\"\n onClick={() =>\n handleAddSuggestedOption(target.categoryKey, opt)\n }\n >\n {opt}\n </button>\n ))}\n {suggestedOptions.length > 5 && (\n <span className=\"facet-category__more\">\n +{suggestedOptions.length - 5} more\n </span>\n )}\n </div>\n )}\n\n <div className=\"facet-category__options\">\n {target.selectedOptions.length === 0 ? (\n <p className=\"facet-category__no-options\">\n No options added yet - use quick add above or add\n custom options\n </p>\n ) : (\n target.selectedOptions.map((optionId) => (\n <div key={optionId} className=\"facet-option\">\n <span className=\"facet-option__label\">\n {optionId}\n </span>\n <button\n type=\"button\"\n className=\"facet-option__remove\"\n onClick={() =>\n handleRemoveOption(target.categoryKey, optionId)\n }\n title=\"Remove option\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n >\n <path\n d=\"M18 6L6 18M6 6l12 12\"\n strokeWidth=\"2\"\n />\n </svg>\n </button>\n </div>\n ))\n )}\n </div>\n\n {/* Micro-commitment feedback */}\n {target.selectedOptions.length > 0 && (\n <div className=\"facet-category__status\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M5 12l5 5L20 7\" />\n </svg>\n {target.selectedOptions.length} option\n {target.selectedOptions.length !== 1 ? \"s\" : \"\"}{\" \"}\n configured\n </div>\n )}\n </div>\n );\n })}\n </div>\n )\n )}\n </section>\n </>\n );\n}\n\n// Memoized Preset Card - React Best Practice (rerender-memo)\ninterface PresetCardProps {\n preset: FacetPreset;\n onAdd: () => void;\n onAddWithOptions: () => void;\n}\n\nfunction PresetCard({ preset, onAdd, onAddWithOptions }: PresetCardProps) {\n return (\n <div\n className={`preset-card ${preset.isRecommended ? \"preset-card--recommended\" : \"\"}`}\n >\n <div className=\"preset-card__header\">\n <span className=\"preset-card__icon\">{preset.icon}</span>\n <div className=\"preset-card__info\">\n <span className=\"preset-card__name\">{preset.categoryLabel}</span>\n <span className=\"preset-card__desc\">{preset.description}</span>\n </div>\n </div>\n <div className=\"preset-card__options-preview\">\n {preset.suggestedOptions.slice(0, 3).map((opt) => (\n <span key={opt} className=\"preset-card__option-tag\">\n {opt}\n </span>\n ))}\n {preset.suggestedOptions.length > 3 && (\n <span className=\"preset-card__option-more\">\n +{preset.suggestedOptions.length - 3}\n </span>\n )}\n </div>\n <div className=\"preset-card__actions\">\n <button type=\"button\" className=\"preset-card__btn\" onClick={onAdd}>\n Add Empty\n </button>\n <button\n type=\"button\"\n className=\"preset-card__btn preset-card__btn--primary\"\n onClick={onAddWithOptions}\n >\n Add with Options\n </button>\n </div>\n </div>\n );\n}\n\nconst styles = `\n .facet-targeting {\n background: var(--te-surface, #ffffff);\n border-radius: 16px;\n padding: 24px;\n box-shadow: 0 1px 3px rgba(26, 31, 54, 0.04), 0 4px 16px rgba(26, 31, 54, 0.06);\n }\n\n /* Progress Section - Goal-Gradient Effect */\n .facet-targeting__progress {\n background: linear-gradient(135deg, #f5f3ff 0%, #ecfdf5 100%);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 20px;\n }\n\n .facet-targeting__progress-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 10px;\n }\n\n .facet-targeting__progress-info {\n display: flex;\n align-items: baseline;\n gap: 8px;\n }\n\n .facet-targeting__progress-percent {\n font-size: 1.5rem;\n font-weight: 700;\n color: #7c5cff;\n font-family: 'DM Mono', monospace;\n }\n\n .facet-targeting__progress-label {\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .facet-targeting__complete-badge {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 10px;\n background: #10b981;\n color: white;\n font-size: 0.6875rem;\n font-weight: 600;\n border-radius: 100px;\n animation: badge-pop 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n .facet-targeting__complete-badge svg {\n width: 12px;\n height: 12px;\n }\n\n @keyframes badge-pop {\n from { transform: scale(0.8); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n\n .facet-targeting__progress-bar {\n height: 8px;\n background: rgba(124, 92, 255, 0.15);\n border-radius: 100px;\n overflow: hidden;\n }\n\n .facet-targeting__progress-fill {\n height: 100%;\n background: linear-gradient(90deg, #7c5cff, #10b981);\n border-radius: 100px;\n transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .facet-targeting__header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n margin-bottom: 20px;\n }\n\n .facet-targeting__header-content {\n display: flex;\n align-items: flex-start;\n gap: 14px;\n }\n\n .facet-targeting__header-actions {\n display: flex;\n gap: 8px;\n }\n\n .facet-targeting__icon {\n width: 40px;\n height: 40px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #f5f3ff;\n color: #7c5cff;\n }\n\n .facet-targeting__icon svg {\n width: 20px;\n height: 20px;\n }\n\n .facet-targeting__title {\n font-size: 1rem;\n font-weight: 600;\n color: var(--te-ink, #1a1f36);\n margin: 0 0 2px;\n }\n\n .facet-targeting__subtitle {\n font-size: 0.8125rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0;\n }\n\n .facet-targeting__toggle-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n font-family: inherit;\n font-size: 0.8125rem;\n font-weight: 500;\n color: #7c5cff;\n background: #f5f3ff;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-targeting__toggle-btn:hover {\n border-color: #7c5cff;\n }\n\n .facet-targeting__toggle-btn--active {\n background: #7c5cff;\n color: white;\n }\n\n .facet-targeting__toggle-btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-targeting__add-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n font-family: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n color: white;\n background: #14b8a6;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n transition: background 0.15s ease;\n }\n\n .facet-targeting__add-btn:hover {\n background: #0d9488;\n }\n\n .facet-targeting__add-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Presets Panel */\n .facet-targeting__presets {\n background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);\n border: 1px solid rgba(124, 92, 255, 0.2);\n border-radius: 12px;\n padding: 20px;\n margin-bottom: 20px;\n animation: presets-slide 0.2s ease-out;\n }\n\n @keyframes presets-slide {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .facet-targeting__presets-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n }\n\n .facet-targeting__presets-title {\n font-size: 1rem;\n font-weight: 600;\n color: #1a1f36;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .facet-targeting__presets-title::before {\n content: \"⚡\";\n }\n\n .facet-targeting__add-all-btn {\n padding: 6px 12px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 600;\n color: #7c5cff;\n background: white;\n border: 1px solid rgba(124, 92, 255, 0.3);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-targeting__add-all-btn:hover {\n background: #7c5cff;\n color: white;\n border-color: #7c5cff;\n }\n\n .facet-targeting__presets-section {\n margin-bottom: 16px;\n }\n\n .facet-targeting__presets-section:last-child {\n margin-bottom: 0;\n }\n\n .facet-targeting__presets-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: #64748b;\n margin-bottom: 10px;\n }\n\n .facet-targeting__presets-label svg {\n width: 12px;\n height: 12px;\n color: #f59e0b;\n }\n\n .facet-targeting__presets-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 12px;\n }\n\n /* Preset Card */\n .preset-card {\n background: white;\n border: 1.5px solid #e4e8f0;\n border-radius: 10px;\n padding: 14px;\n transition: all 0.15s ease;\n }\n\n .preset-card:hover {\n border-color: #7c5cff;\n box-shadow: 0 4px 12px rgba(124, 92, 255, 0.1);\n }\n\n .preset-card--recommended {\n border-color: rgba(245, 158, 11, 0.4);\n background: linear-gradient(135deg, white 0%, #fffbeb 100%);\n }\n\n .preset-card--recommended:hover {\n border-color: #f59e0b;\n box-shadow: 0 4px 12px rgba(245, 158, 11, 0.15);\n }\n\n .preset-card__header {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n margin-bottom: 10px;\n }\n\n .preset-card__icon {\n font-size: 1.25rem;\n flex-shrink: 0;\n }\n\n .preset-card__info {\n flex: 1;\n min-width: 0;\n }\n\n .preset-card__name {\n display: block;\n font-size: 0.875rem;\n font-weight: 600;\n color: #1a1f36;\n }\n\n .preset-card__desc {\n display: block;\n font-size: 0.75rem;\n color: #64748b;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .preset-card__options-preview {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 12px;\n }\n\n .preset-card__option-tag {\n padding: 2px 8px;\n font-size: 0.6875rem;\n font-weight: 500;\n color: #64748b;\n background: #f1f5f9;\n border-radius: 4px;\n }\n\n .preset-card__option-more {\n padding: 2px 8px;\n font-size: 0.6875rem;\n font-weight: 500;\n color: #94a3b8;\n font-style: italic;\n }\n\n .preset-card__actions {\n display: flex;\n gap: 6px;\n }\n\n .preset-card__btn {\n flex: 1;\n padding: 6px 10px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 500;\n color: #64748b;\n background: #f1f5f9;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .preset-card__btn:hover {\n background: #e2e8f0;\n color: #475569;\n }\n\n .preset-card__btn--primary {\n background: #7c5cff;\n color: white;\n }\n\n .preset-card__btn--primary:hover {\n background: #6d4aeb;\n }\n\n .facet-targeting__new-category {\n background: var(--te-surface-raised, #fafbfc);\n border: 1.5px solid var(--te-border, #e4e8f0);\n border-radius: 12px;\n padding: 16px;\n margin-bottom: 16px;\n }\n\n .facet-targeting__new-category-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .facet-targeting__form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .facet-targeting__label {\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--te-ink-muted, #8792a8);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .facet-targeting__input {\n width: 100%;\n padding: 10px 14px;\n font-family: inherit;\n font-size: 0.875rem;\n border: 1.5px solid var(--te-border, #e4e8f0);\n border-radius: 8px;\n background: var(--te-surface, #ffffff);\n color: var(--te-ink, #1a1f36);\n transition: all 0.15s ease;\n box-sizing: border-box;\n }\n\n .facet-targeting__input:focus {\n outline: none;\n border-color: #14b8a6;\n box-shadow: 0 0 0 3px rgba(20, 184, 166, 0.1);\n }\n\n .facet-targeting__input--sm {\n padding: 8px 12px;\n font-size: 0.8125rem;\n }\n\n .facet-targeting__form-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n .facet-targeting__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 8px 16px;\n font-family: inherit;\n font-size: 0.875rem;\n font-weight: 500;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.15s ease;\n border: none;\n }\n\n .facet-targeting__btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-targeting__btn--primary {\n background: #14b8a6;\n color: white;\n }\n\n .facet-targeting__btn--primary:hover:not(:disabled) {\n background: #0d9488;\n }\n\n .facet-targeting__btn--primary:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .facet-targeting__btn--secondary {\n background: var(--te-surface-raised, #fafbfc);\n color: var(--te-ink-light, #4a5578);\n border: 1px solid var(--te-border, #e4e8f0);\n }\n\n .facet-targeting__btn--secondary:hover {\n background: var(--te-border-light, #f0f2f7);\n }\n\n .facet-targeting__btn--sm {\n padding: 6px 12px;\n font-size: 0.8125rem;\n }\n\n .facet-targeting__empty {\n padding: 40px 24px;\n text-align: center;\n background: var(--te-surface-raised, #fafbfc);\n border: 2px dashed var(--te-border, #e4e8f0);\n border-radius: 12px;\n }\n\n .facet-targeting__empty-icon {\n width: 48px;\n height: 48px;\n margin: 0 auto 12px;\n color: var(--te-border, #e4e8f0);\n }\n\n .facet-targeting__empty-icon svg {\n width: 100%;\n height: 100%;\n }\n\n .facet-targeting__empty-text {\n font-size: 0.875rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0 0 16px;\n max-width: 400px;\n margin-left: auto;\n margin-right: auto;\n }\n\n .facet-targeting__categories {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .facet-category {\n background: var(--te-surface-raised, #fafbfc);\n border: 1px solid var(--te-border-light, #f0f2f7);\n border-radius: 12px;\n padding: 16px;\n transition: border-color 0.15s ease;\n }\n\n .facet-category:hover {\n border-color: var(--te-border, #e4e8f0);\n }\n\n .facet-category__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n }\n\n .facet-category__info {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .facet-category__icon {\n font-size: 1.125rem;\n }\n\n .facet-category__label {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--te-ink, #1a1f36);\n }\n\n .facet-category__key {\n font-size: 0.75rem;\n font-family: 'DM Mono', monospace;\n color: var(--te-ink-muted, #8792a8);\n background: var(--te-border-light, #f0f2f7);\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .facet-category__recommended {\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: #f59e0b;\n background: #fef3c7;\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .facet-category__actions {\n display: flex;\n gap: 4px;\n }\n\n .facet-category__btn {\n width: 32px;\n height: 32px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: var(--te-ink-muted, #8792a8);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-category__btn:hover {\n background: var(--te-border-light, #f0f2f7);\n color: var(--te-ink-light, #4a5578);\n }\n\n .facet-category__btn--danger:hover {\n background: #fee2e2;\n color: #dc2626;\n }\n\n .facet-category__btn svg {\n width: 16px;\n height: 16px;\n }\n\n .facet-category__add-option {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n }\n\n .facet-category__add-option .facet-targeting__input {\n flex: 1;\n }\n\n /* Suggestions - Paradox of Choice */\n .facet-category__suggestions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin-bottom: 12px;\n padding: 10px 12px;\n background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 100%);\n border-radius: 8px;\n }\n\n .facet-category__suggestions-label {\n font-size: 0.6875rem;\n font-weight: 600;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n }\n\n .facet-category__suggestion-btn {\n padding: 4px 10px;\n font-family: inherit;\n font-size: 0.75rem;\n font-weight: 500;\n color: #7c5cff;\n background: white;\n border: 1px solid rgba(124, 92, 255, 0.3);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .facet-category__suggestion-btn:hover {\n background: #7c5cff;\n color: white;\n border-color: #7c5cff;\n transform: translateY(-1px);\n }\n\n .facet-category__more {\n font-size: 0.6875rem;\n color: #94a3b8;\n font-style: italic;\n }\n\n .facet-category__options {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .facet-category__no-options {\n font-size: 0.8125rem;\n color: var(--te-ink-muted, #8792a8);\n margin: 0;\n font-style: italic;\n }\n\n /* Micro-commitment feedback */\n .facet-category__status {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 12px;\n padding-top: 12px;\n border-top: 1px dashed #e4e8f0;\n font-size: 0.75rem;\n font-weight: 500;\n color: #10b981;\n }\n\n .facet-category__status svg {\n width: 14px;\n height: 14px;\n }\n\n .facet-option {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px 6px 12px;\n background: var(--te-surface, #ffffff);\n border: 1px solid var(--te-border, #e4e8f0);\n border-radius: 6px;\n font-size: 0.8125rem;\n color: var(--te-ink, #1a1f36);\n transition: all 0.15s ease;\n }\n\n .facet-option:hover {\n border-color: var(--te-ink-muted, #8792a8);\n }\n\n .facet-option__label {\n font-weight: 500;\n }\n\n .facet-option__remove {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: var(--te-ink-muted, #8792a8);\n cursor: pointer;\n opacity: 0.6;\n transition: all 0.15s ease;\n }\n\n .facet-option__remove:hover {\n opacity: 1;\n color: #dc2626;\n background: #fee2e2;\n }\n\n .facet-option__remove svg {\n width: 12px;\n height: 12px;\n }\n\n @media (max-width: 640px) {\n .facet-targeting__header {\n flex-direction: column;\n gap: 16px;\n }\n\n .facet-targeting__header-actions {\n width: 100%;\n }\n\n .facet-targeting__toggle-btn,\n .facet-targeting__add-btn {\n flex: 1;\n justify-content: center;\n }\n\n .facet-targeting__presets-grid {\n grid-template-columns: 1fr;\n }\n }\n`;\n","import { DocumentToolbar } from \"@powerhousedao/design-system/connect\";\nimport { useSelectedResourceTemplateDocument } from \"../../document-models/resource-template/v1/hooks.js\";\nimport { TemplateInfo } from \"./components/TemplateInfo.js\";\nimport { FacetTargeting } from \"./components/FacetTargeting.js\";\n\nexport default function ResourceTemplateEditor() {\n const [document, dispatch] = useSelectedResourceTemplateDocument();\n\n return (\n <div className=\"rt-editor\">\n <style>{editorStyles}</style>\n <DocumentToolbar />\n <div className=\"rt-editor__container\">\n <div className=\"rt-editor__header\">\n <div className=\"rt-editor__header-badge\">\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n Product Information\n </div>\n <p className=\"rt-editor__header-desc\">\n Define the base configuration for resources. These templates can be\n used to create Service Offerings.\n </p>\n </div>\n <div className=\"rt-editor__content\">\n <TemplateInfo document={document} dispatch={dispatch} />\n <FacetTargeting document={document} dispatch={dispatch} />\n </div>\n </div>\n </div>\n );\n}\n\nconst editorStyles = `\n @import url('https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&family=DM+Mono:wght@400;500&display=swap');\n\n .rt-editor {\n --rt-font-sans: 'DM Sans', system-ui, sans-serif;\n --rt-font-mono: 'DM Mono', 'SF Mono', monospace;\n\n --rt-slate-50: #f8fafc;\n --rt-slate-100: #f1f5f9;\n --rt-slate-200: #e2e8f0;\n --rt-slate-300: #cbd5e1;\n --rt-slate-400: #94a3b8;\n --rt-slate-500: #64748b;\n --rt-slate-600: #475569;\n --rt-slate-700: #334155;\n --rt-slate-800: #1e293b;\n --rt-slate-900: #0f172a;\n\n --rt-teal-50: #f0fdfa;\n --rt-teal-100: #ccfbf1;\n --rt-teal-200: #99f6e4;\n --rt-teal-500: #14b8a6;\n --rt-teal-600: #0d9488;\n --rt-teal-700: #0f766e;\n\n --rt-radius-sm: 6px;\n --rt-radius-md: 10px;\n --rt-radius-lg: 14px;\n --rt-radius-xl: 20px;\n\n --rt-shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04);\n --rt-shadow-md: 0 4px 12px rgba(15, 23, 42, 0.06), 0 1px 3px rgba(15, 23, 42, 0.04);\n --rt-shadow-lg: 0 10px 40px rgba(15, 23, 42, 0.08), 0 2px 8px rgba(15, 23, 42, 0.04);\n\n --rt-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --rt-transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n --rt-transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n\n font-family: var(--rt-font-sans);\n background: linear-gradient(135deg, var(--rt-teal-50) 0%, var(--rt-slate-50) 50%, #f0f4f8 100%);\n min-height: 100%;\n overflow-y: auto;\n }\n\n .rt-editor__container {\n max-width: 1400px;\n margin: 0 auto;\n padding: 24px 32px 48px;\n }\n\n .rt-editor__header {\n margin-bottom: 24px;\n padding-bottom: 20px;\n border-bottom: 1px solid var(--rt-slate-200);\n }\n\n .rt-editor__header-badge {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n background: var(--rt-teal-100);\n color: var(--rt-teal-700);\n border-radius: 100px;\n font-size: 0.875rem;\n font-weight: 600;\n margin-bottom: 12px;\n }\n\n .rt-editor__header-badge svg {\n width: 18px;\n height: 18px;\n }\n\n .rt-editor__header-desc {\n font-size: 0.9375rem;\n color: var(--rt-slate-600);\n margin: 0;\n max-width: 600px;\n line-height: 1.6;\n }\n\n .rt-editor__content {\n min-height: 500px;\n display: flex;\n flex-direction: column;\n gap: 24px;\n animation: rt-fade-in var(--rt-transition-slow) ease-out;\n }\n\n @keyframes rt-fade-in {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .rt-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n text-align: center;\n padding: 48px;\n }\n\n .rt-empty-state__icon {\n width: 80px;\n height: 80px;\n margin-bottom: 24px;\n color: var(--rt-teal-300);\n animation: rt-float 3s ease-in-out infinite;\n }\n\n .rt-empty-state__icon svg {\n width: 100%;\n height: 100%;\n }\n\n @keyframes rt-float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n }\n\n .rt-empty-state__title {\n font-size: 1.5rem;\n font-weight: 600;\n color: var(--rt-slate-700);\n margin: 0 0 8px;\n letter-spacing: -0.02em;\n }\n\n .rt-empty-state__subtitle {\n font-size: 1rem;\n color: var(--rt-slate-500);\n margin: 0;\n }\n`;\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}