form-page-builder 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/FormBuilder.tsx","../src/constants/fieldTypes.ts","../src/i18n/languages.ts","../src/i18n/strings.ts","../src/i18n/chrome.ts","../src/lib/bilingual.ts","../src/lib/color.ts","../src/lib/storage/compress.ts","../src/lib/storage/localStorageAdapter.ts","../src/lib/id.ts","../src/lib/fieldDefaults.ts","../src/lib/migrate.ts","../src/lib/template.ts","../src/lib/features.ts","../src/hooks/useTheme.ts","../src/theme/defaultTheme.ts","../src/hooks/useFormDocument.ts","../src/hooks/usePersistence.ts","../src/lib/storage/keys.ts","../src/hooks/useTemplateClipboard.ts","../src/hooks/useDragReorder.ts","../src/components/Toolbar.tsx","../src/styles/styles.ts","../src/components/LanguageToggle.tsx","../src/components/Palette.tsx","../src/components/Segmented.tsx","../src/components/DesignPanel.tsx","../src/constants/colors.ts","../src/constants/layout.ts","../src/components/Canvas.tsx","../src/components/SectionCard.tsx","../src/components/FieldTicket.tsx","../src/components/fields/FieldBlock.tsx","../src/constants/typography.ts","../src/constants/icons.ts","../src/components/fields/ImageBlock.tsx","../src/constants/submitStyle.ts","../src/components/fields/ButtonBlock.tsx","../src/components/Inspector.tsx","../src/components/fields/DefaultValueEditor.tsx","../src/components/PreviewPane.tsx","../src/lib/validate.ts","../src/lib/format.ts","../src/lib/collectSubmission.ts","../src/components/modals/JsonModal.tsx","../src/hooks/useModalA11y.ts","../src/components/modals/TemplatesModal.tsx","../src/components/modals/SaveAsModal.tsx","../src/components/modals/ConfirmModal.tsx","../src/styles/globalCss.ts","../src/theme/darkTheme.ts"],"sourcesContent":["export { default as FormBuilder, default } from \"./FormBuilder\";\nexport { localStorageAdapter } from \"./lib/storage/localStorageAdapter\";\nexport { DEFAULT_THEME } from \"./theme/defaultTheme\";\nexport { DARK_THEME } from \"./theme/darkTheme\";\nexport { serializeTemplate, parseTemplate } from \"./lib/template\";\nexport { DOCUMENT_VERSION } from \"./lib/migrate\";\nexport { DRAFT_KEY, INDEX_KEY, CLIPBOARD_KEY, formKey, savedFormId } from \"./lib/storage/keys\";\nexport type {\n FormBuilderProps, StorageAdapter, Theme, ThemeLayout, ThemeOverrides,\n FormField, FieldPatch, FieldType, Option, Section, FormDocument, DocumentFields,\n SavedFormMeta, LocalizedString, LanguageOption, ChromeShape, StringsShape,\n InputField, TextareaField, SelectField, RadioField, CheckboxGroupField,\n CheckboxField, ToggleField, ParagraphField, ImageField, SubmitStyle,\n SubmitPayload, FormBuilderHandle, FormBuilderFeatures, ContentBlockType, InputFieldType,\n FormTemplate, TemplateChange,\n} from \"./types\";\n","\"use client\";\n\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { Loader2, Menu, SlidersHorizontal } from \"lucide-react\";\nimport type { FormBuilderHandle, FormBuilderProps } from \"./types\";\nimport { getMeta } from \"./constants/fieldTypes\";\nimport { DEFAULT_LANGUAGES } from \"./i18n/languages\";\nimport { DEFAULT_STRINGS } from \"./i18n/strings\";\nimport { CHROME } from \"./i18n/chrome\";\nimport { t } from \"./lib/bilingual\";\nimport { mixHex } from \"./lib/color\";\nimport { localStorageAdapter } from \"./lib/storage/localStorageAdapter\";\nimport { DOCUMENT_VERSION, migrateDocument } from \"./lib/migrate\";\nimport { parseTemplate, TEMPLATE_FORMAT } from \"./lib/template\";\nimport { resolveFeatures } from \"./lib/features\";\nimport { useTheme } from \"./hooks/useTheme\";\nimport { useFormDocument } from \"./hooks/useFormDocument\";\nimport { usePersistence } from \"./hooks/usePersistence\";\nimport { useTemplateClipboard } from \"./hooks/useTemplateClipboard\";\nimport { useDragReorder } from \"./hooks/useDragReorder\";\nimport { Toolbar } from \"./components/Toolbar\";\nimport { Palette } from \"./components/Palette\";\nimport { Canvas } from \"./components/Canvas\";\nimport { Inspector } from \"./components/Inspector\";\nimport { PreviewPane } from \"./components/PreviewPane\";\nimport { JsonModal } from \"./components/modals/JsonModal\";\nimport { TemplatesModal } from \"./components/modals/TemplatesModal\";\nimport { SaveAsModal } from \"./components/modals/SaveAsModal\";\nimport { ConfirmModal } from \"./components/modals/ConfirmModal\";\nimport { css } from \"./styles/globalCss\";\nimport { styles } from \"./styles/styles\";\n\nconst FormBuilder = forwardRef<FormBuilderHandle, FormBuilderProps>(function FormBuilder({\n theme: themeOverrideProp,\n language: languageOverride,\n languages = DEFAULT_LANGUAGES,\n strings: stringsOverride,\n chrome: chromeOverride,\n features: featuresProp,\n storage: storageProp,\n onSubmit,\n initialDocument,\n initialMode,\n onModeChange,\n onTemplateChange,\n templateClipboardKey,\n}, ref) {\n const features = resolveFeatures(featuresProp);\n const storage = storageProp ?? localStorageAdapter;\n const { theme, updateThemeColor, updateThemeLayout, resetTheme, replaceThemeOverrides, themeOverrides } = useTheme(themeOverrideProp);\n\n const [language, setLanguage] = useState(languageOverride || languages[0]?.code || \"en\");\n const strings = { ...(DEFAULT_STRINGS[language as keyof typeof DEFAULT_STRINGS] || DEFAULT_STRINGS.en), ...((stringsOverride && stringsOverride[language]) || {}) };\n const chrome = { ...(CHROME[language as keyof typeof CHROME] || CHROME.en), ...((chromeOverride && chromeOverride[language]) || {}) };\n\n const doc = useFormDocument({ language, chrome });\n const drag = useDragReorder(doc.reorderWithinSection);\n\n const [mode, setModeState] = useState<\"build\" | \"preview\">(initialMode ?? \"build\");\n const setMode = (next: \"build\" | \"preview\") => { setModeState(next); onModeChange?.(next); };\n useEffect(() => { onModeChange?.(mode); }, []); // eslint-disable-line react-hooks/exhaustive-deps\n const [showJson, setShowJson] = useState(false);\n const [showLibrary, setShowLibrary] = useState(false);\n const [copied, setCopied] = useState(false);\n const [templateCopied, setTemplateCopied] = useState(false);\n const [pastePrompt, setPastePrompt] = useState(false);\n const clipboard = useTemplateClipboard(templateClipboardKey);\n // Which drawer is open below the 720px breakpoint (see globalCss); ignored above it.\n const [mobilePanel, setMobilePanel] = useState<\"none\" | \"palette\" | \"inspector\">(\"none\");\n\n const persistence = usePersistence({\n storage,\n autosave: features.autosave,\n templateMax: features.templates.max,\n templateManage: features.templates.manage,\n language,\n chrome,\n document: { title: doc.title, themeOverrides, sections: doc.sections },\n initialDocument,\n onLoadDocument: doc.loadDocument,\n onLoadThemeOverrides: replaceThemeOverrides,\n onTitleChange: doc.setTitle,\n onNewForm: () => { doc.resetToBlank(); resetTheme(); },\n onTemplateChange,\n ensureActiveSection: () => doc.setActiveSectionId((prev) => prev ?? doc.sections[0]?.id ?? null),\n });\n\n const jsonDoc = useMemo(() => ({\n version: DOCUMENT_VERSION,\n title: doc.title, theme, themeOverrides,\n sections: doc.sections.map((s) => ({ id: s.id, title: s.title, background: s.background, collapsed: s.collapsed, fields: s.fields })),\n }), [doc.title, doc.sections, theme, themeOverrides]);\n const jsonString = useMemo(() => JSON.stringify(jsonDoc, null, 2), [jsonDoc]);\n\n function copyJson() {\n navigator.clipboard.writeText(jsonString).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }).catch(() => {});\n }\n\n function applyDocument(migrated: ReturnType<typeof migrateDocument>) {\n if (!migrated) return false;\n doc.loadDocument(migrated);\n replaceThemeOverrides(migrated.themeOverrides);\n return true;\n }\n\n function copyTemplate() {\n clipboard.copyTemplate(jsonDoc);\n setTemplateCopied(true);\n setTimeout(() => setTemplateCopied(false), 1500);\n }\n\n function pasteTemplate() {\n if (clipboard.readTemplate()) setPastePrompt(true);\n }\n\n useImperativeHandle(ref, () => ({\n getDocument: () => jsonDoc,\n exportJson: () => jsonString,\n loadDocument: (raw) => { applyDocument(migrateDocument(raw)); },\n getTemplate: () => ({ __fpb: \"template\", v: TEMPLATE_FORMAT, document: jsonDoc }),\n loadTemplate: (input) => applyDocument(parseTemplate(typeof input === \"string\" ? input : JSON.stringify(input))),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [jsonDoc, jsonString]);\n\n // Content blocks don't count toward `features.maxFields`.\n const fieldCount = doc.sections.reduce((n, s) => n + s.fields.filter((f) => !getMeta(f.type).isContent).length, 0);\n\n const activeSectionIdx = doc.sections.findIndex((s) => s.id === doc.activeSection?.id);\n const activeSectionLabel = t(doc.activeSection?.title, language) || `#${activeSectionIdx + 1}`;\n\n const rootStyle: CSSProperties = {\n ...styles.app,\n \"--fb-primary\": theme.primary, \"--fb-primary-soft\": theme.primarySoft,\n \"--fb-danger\": theme.danger, \"--fb-danger-soft\": theme.dangerSoft,\n \"--fb-ink\": theme.ink, \"--fb-muted\": theme.muted, \"--fb-border\": theme.border,\n \"--fb-surface\": theme.surface, \"--fb-canvas\": theme.canvas, \"--fb-page-bg\": theme.pageBackground,\n \"--fb-surface-2\": mixHex(theme.surface, theme.ink, 0.06),\n \"--fb-space-page\": `${theme.layout.pagePadding}px`, \"--fb-space-canvas\": `${theme.layout.canvasPadding}px`,\n \"--fb-space-section\": `${theme.layout.sectionGap}px`, \"--fb-space-field\": `${theme.layout.fieldGap}px`,\n \"--fb-space-toolbar\": `${theme.layout.toolbarPadding}px`, \"--fb-space-panel\": `${theme.layout.panelPadding}px`,\n \"--fb-space-ticket\": `${theme.layout.ticketPadding}px`,\n } as CSSProperties;\n\n return (\n <div className=\"fb-root\" style={rootStyle}>\n <style>{css}</style>\n\n <Toolbar\n title={doc.title}\n language={language}\n languages={languages}\n mode={mode}\n saveState={persistence.saveState}\n templateState={persistence.templateState}\n activeTemplateTitle={persistence.activeTemplateTitle}\n templateDirty={persistence.isTemplateDirty}\n chrome={chrome}\n features={features}\n savedFormsCount={persistence.savedForms.length}\n clipboardReady={clipboard.hasClipboard}\n templateCopied={templateCopied}\n onTitleChange={doc.updateTitle}\n onLanguageChange={setLanguage}\n onModeChange={setMode}\n onNewForm={persistence.newForm}\n onOpenLibrary={() => setShowLibrary(true)}\n onSaveExisting={persistence.saveExisting}\n onOpenJson={() => setShowJson(true)}\n onCopyTemplate={copyTemplate}\n onPasteTemplate={pasteTemplate}\n />\n\n {persistence.loadingDraft ? (\n <div style={styles.loadingScreen}>\n <Loader2 size={20} className=\"spin\" />\n <span style={{ marginTop: 8, fontSize: 13, color: \"var(--fb-muted)\" }}>{chrome.loadingDraft}</span>\n </div>\n ) : mode === \"build\" ? (\n <div className=\"fb-work-area\" style={styles.workArea} data-mobile-panel={mobilePanel}>\n <div className=\"fb-mobile-bar\">\n <button\n type=\"button\"\n className=\"fb-mobile-btn\"\n aria-pressed={mobilePanel === \"palette\"}\n onClick={() => setMobilePanel((p) => (p === \"palette\" ? \"none\" : \"palette\"))}\n >\n <Menu size={14} /> {chrome.paletteTabBlocks}\n </button>\n <button\n type=\"button\"\n className=\"fb-mobile-btn\"\n aria-pressed={mobilePanel === \"inspector\"}\n onClick={() => setMobilePanel((p) => (p === \"inspector\" ? \"none\" : \"inspector\"))}\n >\n <SlidersHorizontal size={14} /> {chrome.properties}\n </button>\n </div>\n\n <div className=\"fb-canvas-area\" style={styles.workArea}>\n {mobilePanel !== \"none\" && (\n <div className=\"fb-mobile-backdrop\" onClick={() => setMobilePanel(\"none\")} />\n )}\n\n <Palette\n activeSectionLabel={activeSectionLabel}\n chrome={chrome}\n onAddField={(type) => { doc.addField(type); setMobilePanel(\"none\"); }}\n features={features}\n fieldCount={fieldCount}\n theme={theme}\n updateThemeColor={updateThemeColor}\n updateThemeLayout={updateThemeLayout}\n resetTheme={resetTheme}\n />\n\n <Canvas\n sections={doc.sections}\n activeSectionId={doc.activeSectionId}\n selectedId={doc.selectedId}\n dragOverKey={drag.dragOverKey}\n chrome={chrome}\n strings={strings}\n language={language}\n features={features}\n onActivateSection={doc.setActiveSectionId}\n onToggleSectionCollapse={doc.toggleSectionCollapse}\n onUpdateSectionTitle={doc.updateSectionTitle}\n onUpdateSectionBackground={doc.updateSectionBackground}\n onDuplicateSection={doc.duplicateSection}\n onMoveSection={doc.moveSection}\n onDeleteSection={doc.deleteSection}\n onAddSection={doc.addSection}\n onSelectField={(sectionId, fieldId) => { doc.setSelectedId(fieldId); doc.setActiveSectionId(sectionId); setMobilePanel(\"inspector\"); }}\n onFieldChange={doc.updateField}\n onMoveField={doc.moveField}\n onDuplicateField={doc.duplicateField}\n onDeleteField={doc.deleteField}\n getDropZoneHandlers={drag.getDropZoneHandlers}\n getDragHandleProps={drag.getDragHandleProps}\n />\n\n <Inspector\n selected={doc.selected}\n language={language}\n chrome={chrome}\n features={features}\n onUpdateField={(patch) => doc.selected && doc.updateField(doc.selected.id, patch)}\n onDeleteField={() => doc.selected && doc.deleteField(doc.selected.id)}\n onUpdateOption={(optIdx, patch) => doc.selected && doc.updateOption(doc.selected.id, optIdx, patch)}\n onAddOption={() => doc.selected && doc.addOption(doc.selected.id)}\n onRemoveOption={(optIdx) => doc.selected && doc.removeOption(doc.selected.id, optIdx)}\n />\n </div>\n </div>\n ) : (\n <PreviewPane\n title={doc.title} sections={doc.sections} onFieldChange={doc.updateField} language={language}\n strings={strings} chrome={chrome} baseMaxWidth={theme.layout.maxWidth} features={features}\n onSubmit={onSubmit}\n />\n )}\n\n {showJson && (\n <JsonModal chrome={chrome} jsonString={jsonString} copied={copied} onCopy={copyJson} onClose={() => setShowJson(false)} />\n )}\n\n {showLibrary && (\n <TemplatesModal\n chrome={chrome}\n savedForms={persistence.savedForms}\n currentFormId={persistence.currentFormId}\n manage={features.templates.manage}\n templateState={persistence.templateState}\n onOpen={async (id) => { if (await persistence.loadForm(id)) setShowLibrary(false); }}\n onDelete={persistence.deleteForm}\n onClose={() => setShowLibrary(false)}\n />\n )}\n\n {persistence.saveAsPrompt && (\n <SaveAsModal\n chrome={chrome}\n suggestedName={persistence.saveAsPrompt.suggestedName}\n templateState={persistence.templateState}\n onSave={persistence.saveAs}\n onClose={persistence.dismissSaveAsPrompt}\n />\n )}\n\n {pastePrompt && (\n <ConfirmModal\n chrome={chrome}\n title={chrome.pasteTemplate}\n message={chrome.pasteTemplateConfirm}\n confirmLabel={chrome.confirmReplace}\n tone=\"danger\"\n onConfirm={() => { applyDocument(clipboard.readTemplate()); setPastePrompt(false); }}\n onClose={() => setPastePrompt(false)}\n />\n )}\n\n {persistence.notice && (\n <ConfirmModal\n chrome={chrome}\n title={persistence.notice.title}\n message={persistence.notice.message}\n onClose={persistence.dismissNotice}\n />\n )}\n </div>\n );\n});\n\nexport default FormBuilder;\n","import {\n Type, AlignLeft, ChevronDown, Circle, ListChecks, CheckSquare, ToggleLeft,\n FileText, Image as ImageIcon, MousePointerClick,\n} from \"lucide-react\";\nimport type { IconKey, IconComponent } from \"./icons\";\n\nexport type FieldType =\n | \"paragraph\" | \"image\" | \"button\" | \"input\" | \"textarea\" | \"select\"\n | \"radio\" | \"checkboxGroup\" | \"checkbox\" | \"toggle\";\n\nexport interface FieldTypeMeta {\n type: FieldType;\n icon: IconComponent;\n isContent?: boolean;\n isImage?: boolean;\n placeholder?: boolean;\n hasSubtype?: boolean;\n options?: boolean;\n multiValue?: boolean;\n boolean?: boolean;\n defaultIcon: IconKey;\n}\n\nexport const FIELD_TYPES: FieldTypeMeta[] = [\n { type: \"paragraph\", icon: FileText, isContent: true, defaultIcon: \"FileText\" },\n { type: \"image\", icon: ImageIcon, isContent: true, isImage: true, defaultIcon: \"Type\" },\n { type: \"button\", icon: MousePointerClick, isContent: true, defaultIcon: \"Type\" },\n { type: \"input\", icon: Type, placeholder: true, hasSubtype: true, defaultIcon: \"Type\" },\n { type: \"textarea\", icon: AlignLeft, placeholder: true, defaultIcon: \"AlignLeft\" },\n { type: \"select\", icon: ChevronDown, options: true, defaultIcon: \"ChevronDown\" },\n { type: \"radio\", icon: Circle, options: true, defaultIcon: \"Circle\" },\n { type: \"checkboxGroup\", icon: ListChecks, options: true, multiValue: true, defaultIcon: \"ListChecks\" },\n { type: \"checkbox\", icon: CheckSquare, boolean: true, defaultIcon: \"CheckSquare\" },\n { type: \"toggle\", icon: ToggleLeft, boolean: true, defaultIcon: \"ToggleLeft\" },\n];\nexport const TYPE_MAP = Object.fromEntries(FIELD_TYPES.map((f) => [f.type, f])) as Record<FieldType, FieldTypeMeta>;\nexport const CONTENT_TYPES = FIELD_TYPES.filter((f) => f.isContent);\nexport const FORM_TYPES = FIELD_TYPES.filter((f) => !f.isContent);\nexport function getMeta(type: FieldType): FieldTypeMeta {\n return TYPE_MAP[type] || TYPE_MAP.input;\n}\n\nexport const LEGACY_INPUT_TYPES = [\"text\", \"email\", \"phone\", \"number\", \"password\", \"date\"] as const;\nexport const INPUT_SUBTYPES = [\"text\", \"email\", \"phone\", \"number\", \"password\", \"date\", \"time\"] as const;\nexport const IMAGE_SHAPES = [\"square\", \"circle\", \"banner\"] as const;\n\nexport const FIELD_TYPE_CHROME_KEY: Record<FieldType, string> = {\n paragraph: \"fieldTypeParagraph\", image: \"fieldTypeImage\", button: \"fieldTypeButton\", input: \"fieldTypeInput\",\n textarea: \"fieldTypeTextarea\", select: \"fieldTypeSelect\", radio: \"fieldTypeRadio\",\n checkboxGroup: \"fieldTypeCheckboxGroup\", checkbox: \"fieldTypeCheckbox\", toggle: \"fieldTypeToggle\",\n};\nexport const INPUT_SUBTYPE_CHROME_KEY: Record<string, string> = {\n text: \"subtypeText\", email: \"subtypeEmail\", phone: \"subtypePhone\", number: \"subtypeNumber\",\n password: \"subtypePassword\", date: \"subtypeDate\", time: \"subtypeTime\",\n};\nexport const IMAGE_SHAPE_CHROME_KEY: Record<string, string> = {\n square: \"shapeSquare\", circle: \"shapeCircle\", banner: \"shapeBanner\",\n};\n","export interface LanguageOption {\n code: string;\n label: string;\n}\n\nexport const DEFAULT_LANGUAGES: LanguageOption[] = [\n { code: \"en\", label: \"EN\" },\n { code: \"ja\", label: \"日本語\" },\n];\n","export const DEFAULT_STRINGS = {\n en: {\n submit: \"Submit\", selectPlaceholder: \"Select...\", requiredError: \"This field is required.\",\n invalidEmail: \"Enter a valid email address.\", invalidPhone: \"Enter a valid phone number.\",\n fixErrors: \"Please fix the highlighted fields before submitting.\", submittedTitle: \"Form submitted\",\n submittedBody: \"Here's what would be sent to your backend:\", addFieldsHint: \"Add fields in Build mode to see them here.\",\n close: \"Close\",\n tooLong: (n: number) => `Must be ${n} characters or fewer.`,\n tooSmall: (n: number) => `Must be at least ${n}.`,\n tooLarge: (n: number) => `Must be at most ${n}.`,\n },\n ja: {\n submit: \"送信\", selectPlaceholder: \"選択してください\", requiredError: \"この項目は必須です。\",\n invalidEmail: \"有効なメールアドレスを入力してください。\", invalidPhone: \"有効な電話番号を入力してください。\",\n fixErrors: \"入力内容をご確認のうえ、再度送信してください。\", submittedTitle: \"送信完了\",\n submittedBody: \"バックエンドに送信される内容は以下の通りです:\", addFieldsHint: \"ビルドモードでフィールドを追加すると、ここに表示されます。\",\n close: \"閉じる\",\n tooLong: (n: number) => `${n}文字以内で入力してください。`,\n tooSmall: (n: number) => `${n}以上の値を入力してください。`,\n tooLarge: (n: number) => `${n}以下の値を入力してください。`,\n },\n};\n\nexport type StringsShape = typeof DEFAULT_STRINGS.en;\n\n// Fails the build if `ja` drifts from `en` (missing or mistyped key).\nDEFAULT_STRINGS.ja satisfies StringsShape;\n","export const CHROME = {\n en: {\n contentBlocks: \"Content\", formFields: \"Form Fields\", addingTo: \"Adding to\",\n paletteTabBlocks: \"Blocks\", paletteTabDesign: \"Design\",\n properties: \"Properties\", selectFieldHint: \"Select a field to edit its properties.\",\n label: \"Label\", hideLabel: \"Hide label\", inputType: \"Input type\", content: \"Content\",\n headingStyle: \"Heading style\", typography: \"Typography\", style: \"Style\", align: \"Align\",\n color: \"Color\", imageUrl: \"Image URL\",\n imageUrlHelper: \"Upload the image on your own end (Drive, CDN, S3...) and paste the link here — this package doesn't host images.\",\n altText: \"Alt text\", linkOptional: \"Link (optional)\", shape: \"Shape\",\n placeholder: \"Placeholder\", maxLength: \"Max length\", noLimit: \"No limit\",\n minValue: \"Min value\", maxValue: \"Max value\", options: \"Options\", addOption: \"Add option\",\n defaultValue: \"Default value\", defaultChecked: \"Default checked\", checked: \"Checked\",\n unchecked: \"Unchecked\", none: \"None\", requiredField: \"Required field\", layout: \"Layout\",\n width: \"Width\", full: \"Full\", labelPosition: \"Label position\", above: \"Above\",\n inline: \"Inline\", verticalAlign: \"Vertical align\", top: \"Top\", middle: \"Middle\",\n bottom: \"Bottom\", icon: \"Icon\", showIcon: \"Show icon next to label\",\n deleteField: \"Delete field\", build: \"Build\", preview: \"Preview\", newForm: \"New\",\n templates: \"Templates\", save: \"Save\", viewJson: \"View JSON\", saving: \"Saving...\",\n saved: \"Saved\", saveFailed: \"Save failed\", startNewForm: \"Start a new form\",\n openTemplatesTitle: \"Open a saved template\", saveToLibraryTitle: \"Save this form as a template\",\n sectionTitlePlaceholder: (n: number) => `Section ${n} title (optional)`,\n noFieldsInSection: \"No fields in this section yet — pick a field type on the left.\",\n addSection: \"Add section\", moveUp: \"Move up\", moveDown: \"Move down\",\n duplicate: \"Duplicate\", delete: \"Delete\", deleteSection: \"Delete section\",\n required: \"required\", formJson: \"Form JSON\", copy: \"Copy\", copied: \"Copied\",\n copyTemplate: \"Copy template\", pasteTemplate: \"Paste template\",\n copyTemplateTitle: \"Copy this form as a template you can paste into another builder\",\n pasteTemplateTitle: \"Replace this form with the copied template\",\n pasteTemplateConfirm: \"Replace the current form with the copied template? This can't be undone.\",\n noTemplates: \"No templates saved yet. Click \\\"Save\\\" in the toolbar to store this form here.\",\n noTemplatesReadonly: \"No templates available yet.\",\n updated: \"Updated\", open: \"Open\", applyTemplate: \"Apply\", saveForm: \"Save as template\", formName: \"Template name\",\n saveToLibrary: \"Save template\", loadingDraft: \"Loading your draft...\",\n templatesLimitReached: (max: number) => `You can save up to ${max} template${max === 1 ? \"\" : \"s\"}. Delete one to save another.`,\n templatesLimitTitle: \"Template limit reached\",\n confirm: \"Confirm\", cancel: \"Cancel\", dismiss: \"OK\", confirmReplace: \"Replace\",\n current: \"current\", customColor: \"Custom color\",\n templateLabel: (name: string) => `Template: ${name}`,\n templateEdited: \"Edited\",\n templateLoading: \"Loading template...\",\n templateLoadFailed: \"Couldn't load that template.\",\n templateSaveFailed: \"Couldn't save the template.\",\n fieldsCount: (n: number) => `${n} field${n === 1 ? \"\" : \"s\"}`,\n fieldTypeInput: \"Input\", fieldTypeTextarea: \"Textarea\", fieldTypeSelect: \"Select\",\n fieldTypeRadio: \"Radio group\", fieldTypeCheckboxGroup: \"Checkbox group\",\n fieldTypeCheckbox: \"Checkbox\", fieldTypeToggle: \"Toggle\", fieldTypeParagraph: \"Paragraph\",\n fieldTypeImage: \"Image\", fieldTypeButton: \"Button\",\n subtypeText: \"Text\", subtypeEmail: \"Email\", subtypePhone: \"Phone\", subtypeNumber: \"Number\",\n subtypePassword: \"Password\", subtypeDate: \"Date\", subtypeTime: \"Time\",\n shapeSquare: \"Square\", shapeCircle: \"Circle\", shapeBanner: \"Banner\",\n tagBody: \"Body\", tagCaption: \"Caption\",\n buttonText: \"Button text\", buttonActionTitle: \"Action\", buttonAction: \"When clicked\",\n actionLink: \"Open link\", actionSubmit: \"Submit\", openIn: \"Open in\",\n sameTab: \"Same tab\", newTab: \"New tab\", submitScope: \"Submits\",\n thisSection: \"This section\", wholeForm: \"Whole form\", buttonSize: \"Size\",\n theme: \"Theme\", primaryColor: \"Primary color\", pageBackground: \"Page background\",\n maxWidthPx: \"Max width (px)\", reset: \"Reset\",\n deviceLaptop: \"Laptop\", deviceTablet: \"Tablet\", deviceMobile: \"Mobile\",\n untitledField: \"Untitled field\", optionSeed: (n: number) => `Option ${n}`,\n spacing: \"Spacing\", spacingPagePadding: \"Page padding\", spacingCanvasPadding: \"Canvas padding\",\n spacingSectionGap: \"Section gap\", spacingFieldGap: \"Field gap\", spacingToolbarPadding: \"Toolbar padding\",\n spacingPanelPadding: \"Panel padding\", spacingTicketPadding: \"Field padding\",\n },\n ja: {\n contentBlocks: \"コンテンツ\", formFields: \"フォーム項目\", addingTo: \"追加先\",\n paletteTabBlocks: \"ブロック\", paletteTabDesign: \"デザイン\",\n properties: \"プロパティ\", selectFieldHint: \"編集するフィールドを選択してください。\",\n label: \"ラベル\", hideLabel: \"ラベルを非表示\", inputType: \"入力タイプ\", content: \"内容\",\n headingStyle: \"見出しスタイル\", typography: \"文字スタイル\", style: \"スタイル\", align: \"配置\",\n color: \"色\", imageUrl: \"画像URL\",\n imageUrlHelper: \"画像は各自でアップロード(Drive、CDN、S3など)し、そのURLをここに貼り付けてください。本パッケージは画像を保存しません。\",\n altText: \"代替テキスト\", linkOptional: \"リンク(任意)\", shape: \"形状\",\n placeholder: \"プレースホルダー\", maxLength: \"最大文字数\", noLimit: \"制限なし\",\n minValue: \"最小値\", maxValue: \"最大値\", options: \"選択肢\", addOption: \"選択肢を追加\",\n defaultValue: \"初期値\", defaultChecked: \"初期選択\", checked: \"オン\",\n unchecked: \"オフ\", none: \"なし\", requiredField: \"必須項目\", layout: \"レイアウト\",\n width: \"幅\", full: \"全幅\", labelPosition: \"ラベル位置\", above: \"上\",\n inline: \"横並び\", verticalAlign: \"垂直位置\", top: \"上\", middle: \"中央\",\n bottom: \"下\", icon: \"アイコン\", showIcon: \"ラベル横にアイコンを表示\",\n deleteField: \"フィールドを削除\", build: \"作成\", preview: \"プレビュー\", newForm: \"新規\",\n templates: \"テンプレート\", save: \"保存\", viewJson: \"JSONを表示\", saving: \"保存中...\",\n saved: \"保存済み\", saveFailed: \"保存に失敗しました\", startNewForm: \"新しいフォームを作成\",\n openTemplatesTitle: \"保存済みテンプレートを開く\", saveToLibraryTitle: \"このフォームをテンプレートとして保存\",\n sectionTitlePlaceholder: (n: number) => `セクション${n}のタイトル(任意)`,\n noFieldsInSection: \"このセクションにはまだフィールドがありません。左のパネルからフィールドを選んでください。\",\n addSection: \"セクションを追加\", moveUp: \"上へ移動\", moveDown: \"下へ移動\",\n duplicate: \"複製\", delete: \"削除\", deleteSection: \"セクションを削除\",\n required: \"必須\", formJson: \"フォームJSON\", copy: \"コピー\", copied: \"コピーしました\",\n copyTemplate: \"テンプレートをコピー\", pasteTemplate: \"テンプレートを貼り付け\",\n copyTemplateTitle: \"このフォームをテンプレートとしてコピーし、他のビルダーに貼り付けます\",\n pasteTemplateTitle: \"コピーしたテンプレートでこのフォームを置き換えます\",\n pasteTemplateConfirm: \"現在のフォームをコピーしたテンプレートで置き換えますか?この操作は取り消せません。\",\n noTemplates: \"まだテンプレートがありません。ツールバーの「保存」をクリックしてください。\",\n noTemplatesReadonly: \"利用できるテンプレートがまだありません。\",\n updated: \"更新日時\", open: \"開く\", applyTemplate: \"適用\", saveForm: \"テンプレートとして保存\", formName: \"テンプレート名\",\n saveToLibrary: \"テンプレートを保存\", loadingDraft: \"下書きを読み込んでいます...\",\n templatesLimitReached: (max: number) => `テンプレートは${max}件まで保存できます。1件削除してから保存してください。`,\n templatesLimitTitle: \"テンプレートの上限に達しました\",\n confirm: \"確定\", cancel: \"キャンセル\", dismiss: \"OK\", confirmReplace: \"置き換える\",\n current: \"現在編集中\", customColor: \"カスタムカラー\",\n templateLabel: (name: string) => `テンプレート: ${name}`,\n templateEdited: \"編集済み\",\n templateLoading: \"テンプレートを読み込み中...\",\n templateLoadFailed: \"テンプレートを読み込めませんでした。\",\n templateSaveFailed: \"テンプレートを保存できませんでした。\",\n fieldsCount: (n: number) => `${n}件のフィールド`,\n fieldTypeInput: \"入力\", fieldTypeTextarea: \"テキストエリア\", fieldTypeSelect: \"セレクト\",\n fieldTypeRadio: \"ラジオボタン\", fieldTypeCheckboxGroup: \"チェックボックスグループ\",\n fieldTypeCheckbox: \"チェックボックス\", fieldTypeToggle: \"トグル\", fieldTypeParagraph: \"段落\",\n fieldTypeImage: \"画像\", fieldTypeButton: \"ボタン\",\n subtypeText: \"テキスト\", subtypeEmail: \"メール\", subtypePhone: \"電話番号\", subtypeNumber: \"数値\",\n subtypePassword: \"パスワード\", subtypeDate: \"日付\", subtypeTime: \"時刻\",\n shapeSquare: \"正方形\", shapeCircle: \"円形\", shapeBanner: \"バナー\",\n tagBody: \"本文\", tagCaption: \"キャプション\",\n buttonText: \"ボタンのテキスト\", buttonActionTitle: \"アクション\", buttonAction: \"クリック時の動作\",\n actionLink: \"リンクを開く\", actionSubmit: \"送信\", openIn: \"開き方\",\n sameTab: \"同じタブ\", newTab: \"新しいタブ\", submitScope: \"送信範囲\",\n thisSection: \"このセクション\", wholeForm: \"フォーム全体\", buttonSize: \"サイズ\",\n theme: \"テーマ\", primaryColor: \"メインカラー\", pageBackground: \"ページ背景色\",\n maxWidthPx: \"最大幅(px)\", reset: \"リセット\",\n deviceLaptop: \"パソコン\", deviceTablet: \"タブレット\", deviceMobile: \"モバイル\",\n untitledField: \"名称未設定のフィールド\", optionSeed: (n: number) => `選択肢${n}`,\n spacing: \"余白設定\", spacingPagePadding: \"ページ余白\", spacingCanvasPadding: \"キャンバス余白\",\n spacingSectionGap: \"セクション間隔\", spacingFieldGap: \"フィールド間隔\", spacingToolbarPadding: \"ツールバー余白\",\n spacingPanelPadding: \"パネル余白\", spacingTicketPadding: \"フィールド内余白\",\n },\n};\n\nexport type ChromeShape = typeof CHROME.en;\n\n// Fails the build if `ja` drifts from `en` (missing or mistyped key).\nCHROME.ja satisfies ChromeShape;\n","import type { LocalizedString } from \"../types\";\n\nexport function bi(en = \"\", ja = \"\"): LocalizedString {\n return { en, ja };\n}\n\nexport function t(val: LocalizedString | string | undefined, lang: string): string {\n if (val && typeof val === \"object\") return val[lang] || val.en || \"\";\n return val || \"\";\n}\n\nexport function withLang(val: LocalizedString | string | undefined, lang: string, value: string): LocalizedString {\n const base = val && typeof val === \"object\" ? val : bi(typeof val === \"string\" ? val : \"\");\n return { ...base, [lang]: value };\n}\n","/** Linearly blends two `#rrggbb` colors; `t=0` returns `a`, `t=1` returns `b`. */\nexport function mixHex(a: string, b: string, t: number): string {\n const pa = parseHex(a);\n const pb = parseHex(b);\n if (!pa || !pb) return a;\n const mix = (x: number, y: number) => Math.round(x + (y - x) * t);\n const toHex = (n: number) => n.toString(16).padStart(2, \"0\");\n return `#${toHex(mix(pa[0], pb[0]))}${toHex(mix(pa[1], pb[1]))}${toHex(mix(pa[2], pb[2]))}`;\n}\n\nfunction parseHex(hex: string): [number, number, number] | null {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return null;\n const n = parseInt(m[1], 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n","import { compressToUTF16, decompressFromUTF16 } from \"lz-string\";\n\n/** Compresses a JSON string for storage in `localStorage`, cutting the character count used against the quota. */\nexport function compress(raw: string): string {\n return compressToUTF16(raw);\n}\n\n/** Reverses `compress`; null if `value` isn't compressed output (e.g. a pre-format plain-JSON draft). */\nexport function decompress(value: string): string | null {\n try {\n return decompressFromUTF16(value);\n } catch {\n return null;\n }\n}\n","import type { StorageAdapter } from \"../../types\";\nimport { compress, decompress } from \"./compress\";\n\nfunction hasLocalStorage(): boolean {\n return typeof window !== \"undefined\" && !!window.localStorage;\n}\n\n/**\n * Default StorageAdapter over window.localStorage. Availability is checked per-call so it survives SSR.\n * Values are compressed on write; on read, a decompressed result is used only if it parses as JSON,\n * else the raw string is returned (so pre-compression drafts still load).\n */\nexport const localStorageAdapter: StorageAdapter = {\n async get(key) {\n if (!hasLocalStorage()) return null;\n const raw = window.localStorage.getItem(key);\n if (raw == null) return null;\n const decompressed = decompress(raw);\n if (decompressed != null) {\n try {\n JSON.parse(decompressed);\n return decompressed;\n } catch {\n // Not JSON once decompressed — fall through and return `raw` as legacy uncompressed data.\n }\n }\n return raw;\n },\n async set(key, value) {\n if (!hasLocalStorage()) return;\n window.localStorage.setItem(key, compress(value));\n },\n async delete(key) {\n if (!hasLocalStorage()) return;\n window.localStorage.removeItem(key);\n },\n};\n","import type { FormField } from \"../types\";\n\nexport const genFormId = () => `form_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\nexport const genSectionId = () => `section_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\nlet idCounter = 1;\nexport const nextId = () => `field_${idCounter++}`;\n\nexport function resyncIdCounter(fields: FormField[]) {\n let max = 0;\n fields.forEach((f) => {\n const m = /^field_(\\d+)$/.exec(f.id);\n if (m) max = Math.max(max, parseInt(m[1], 10));\n });\n idCounter = Math.max(idCounter, max + 1);\n}\n","import type { ChromeShape } from \"../i18n/chrome\";\nimport type { FieldType, FormField, Section } from \"../types\";\nimport { FIELD_TYPE_CHROME_KEY, getMeta } from \"../constants/fieldTypes\";\nimport { bi, withLang } from \"./bilingual\";\nimport { nextId, genSectionId } from \"./id\";\n\nexport function defaultFieldFor(type: FieldType, language: string, chrome: ChromeShape): FormField {\n const meta = getMeta(type);\n const seedLabel = (chrome as Record<string, unknown>)[FIELD_TYPE_CHROME_KEY[type]] as string | undefined || type;\n const base: Record<string, unknown> = {\n id: nextId(),\n type,\n label: withLang(bi(), language, seedLabel),\n hideLabel: false,\n width: \"1/1\",\n verticalAlign: \"top\",\n labelPosition: \"top\",\n showIcon: false,\n displayIcon: meta.defaultIcon,\n };\n if (!meta.isContent) base.required = false;\n if (meta.hasSubtype) base.inputType = \"text\";\n if (meta.placeholder) base.placeholder = bi();\n if (meta.options) {\n base.options = [\n { label: withLang(bi(), language, chrome.optionSeed(1)), value: \"option_1\" },\n { label: withLang(bi(), language, chrome.optionSeed(2)), value: \"option_2\" },\n ];\n }\n if (meta.isImage) {\n base.src = \"\";\n base.alt = bi();\n base.link = \"\";\n base.shape = \"square\";\n } else if (meta.boolean) {\n base.defaultValue = false;\n } else if (meta.multiValue) {\n base.defaultValue = [];\n } else if (type === \"paragraph\") {\n base.content = bi();\n base.tag = \"p\";\n base.fontSize = \"md\";\n base.fontWeight = \"normal\";\n base.fontStyle = \"normal\";\n base.textAlign = \"left\";\n base.color = \"\";\n } else if (type === \"button\") {\n base.action = \"submit\";\n base.submitScope = \"form\";\n base.buttonStyle = { color: \"\", size: \"md\" };\n base.href = \"\";\n base.target = \"_self\";\n } else {\n base.defaultValue = \"\";\n }\n // Assembled incrementally from the type's metadata flags — only sound as FormField once complete.\n return base as unknown as FormField;\n}\n\nexport function defaultSection(titleEn = \"\"): Section {\n return { id: genSectionId(), title: bi(titleEn, \"\"), background: \"\", collapsed: false, fields: [] };\n}\n","import type { DocumentFields, FormField, Section } from \"../types\";\nimport { LEGACY_INPUT_TYPES } from \"../constants/fieldTypes\";\nimport { bi } from \"./bilingual\";\nimport { defaultSection } from \"./fieldDefaults\";\nimport { genSectionId } from \"./id\";\n\n/** Current document schema version — stamped on everything persisted. */\nexport const DOCUMENT_VERSION = 5 as const;\n\n/** Raw JSON from storage or an older/hand-edited export — untyped on purpose, to absorb legacy shapes. */\ntype RawDocument = Record<string, any>;\n\nexport function migrateField(field: Record<string, any>): FormField {\n let f: Record<string, any> = { ...field };\n if (LEGACY_INPUT_TYPES.includes(f.type)) f = { ...f, type: \"input\", inputType: f.type };\n f.label = typeof f.label === \"string\" ? bi(f.label) : f.label || bi();\n f.hideLabel = !!f.hideLabel;\n if (\"placeholder\" in f) f.placeholder = typeof f.placeholder === \"string\" ? bi(f.placeholder) : f.placeholder || bi();\n if (\"content\" in f) f.content = typeof f.content === \"string\" ? bi(f.content) : f.content || bi();\n if (\"alt\" in f) f.alt = typeof f.alt === \"string\" ? bi(f.alt) : f.alt || bi();\n if (f.options) f.options = f.options.map((o: any) => ({ ...o, label: typeof o.label === \"string\" ? bi(o.label) : o.label || bi() }));\n if (f.type === \"paragraph\") {\n f.tag = f.tag || \"p\";\n f.fontSize = f.fontSize || \"md\";\n f.fontWeight = f.fontWeight || \"normal\";\n f.fontStyle = f.fontStyle || \"normal\";\n f.textAlign = f.textAlign || \"left\";\n f.color = f.color || \"\";\n }\n if (f.type === \"button\") {\n f.action = f.action === \"link\" ? \"link\" : \"submit\";\n f.buttonStyle = f.buttonStyle || { color: \"\", size: \"md\" };\n f.href = f.href || \"\";\n f.target = f.target === \"_blank\" ? \"_blank\" : \"_self\";\n f.submitScope = f.submitScope === \"section\" ? \"section\" : \"form\";\n }\n f.verticalAlign = f.verticalAlign || \"top\";\n return f as FormField;\n}\n\nexport function migrateFields(fields: Record<string, any>[] | undefined): FormField[] {\n return (fields || []).map(migrateField);\n}\n\nexport function migrateDocument(raw: RawDocument | null | undefined): DocumentFields | null {\n if (!raw) return null;\n const title = typeof raw.title === \"string\" ? bi(raw.title) : raw.title || bi();\n const themeOverrides = raw.themeOverrides || {};\n\n let sections: Section[];\n if (raw.sections) {\n sections = raw.sections.map((s: Record<string, any>): Section => ({\n id: s.id || genSectionId(),\n title: typeof s.title === \"string\" ? bi(s.title) : s.title || bi(),\n background: s.background || \"\",\n collapsed: !!s.collapsed,\n fields: migrateFields(s.fields || []),\n }));\n } else {\n sections = [{ ...defaultSection(), fields: migrateFields(raw.fields || []) }];\n }\n\n // A submit action is an explicit Button field — never synthesized. Older\n // documents that carried a document-level submitLabel/submitMode load without\n // one; add a Button field if you want a submit control.\n\n return { title, themeOverrides, sections };\n}\n","import type { DocumentFields, FormDocument, FormTemplate } from \"../types\";\nimport { migrateDocument } from \"./migrate\";\n\n/** Envelope version — bump only if the wrapper shape changes, not the document. */\nexport const TEMPLATE_FORMAT = 1;\n\nexport function serializeTemplate(document: FormDocument): string {\n const envelope: FormTemplate = { __fpb: \"template\", v: TEMPLATE_FORMAT, document };\n return JSON.stringify(envelope);\n}\n\n/** Accepts a `serializeTemplate` envelope or a bare document (e.g. \"View JSON\" output); `null` if not a document. */\nexport function parseTemplate(raw: string | null | undefined): DocumentFields | null {\n if (!raw) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n const obj = parsed as Record<string, unknown>;\n const candidate = obj.__fpb === \"template\" && obj.document ? obj.document : obj;\n return migrateDocument(candidate as Record<string, unknown>);\n}\n","import type { ContentBlockType, FormBuilderFeatures, InputFieldType } from \"../types\";\n\nexport const DEFAULT_MAX_TEMPLATES = 5;\n\nexport interface ResolvedTemplates {\n enabled: boolean;\n /** false = pick-and-apply only. */\n manage: boolean;\n max: number;\n}\n\nexport interface ResolvedFeatures {\n naming: boolean;\n formTitle: boolean;\n templates: ResolvedTemplates;\n templateClipboard: boolean;\n newForm: boolean;\n autosave: boolean;\n jsonView: boolean;\n previewMode: boolean;\n languageSwitcher: boolean;\n design: boolean;\n blockStyling: boolean;\n contentBlocks: boolean | Set<ContentBlockType>;\n fieldTypes: boolean | Set<InputFieldType>;\n sections: boolean;\n sectionBackground: boolean;\n dragReorder: boolean;\n deviceToggle: boolean;\n maxFields?: number;\n}\n\nexport const DEFAULT_FEATURES: ResolvedFeatures = {\n naming: true,\n formTitle: false,\n templates: { enabled: true, manage: true, max: DEFAULT_MAX_TEMPLATES },\n templateClipboard: true,\n newForm: true,\n autosave: true,\n jsonView: true,\n previewMode: true,\n languageSwitcher: true,\n design: false,\n blockStyling: true,\n contentBlocks: true,\n fieldTypes: true,\n sections: true,\n sectionBackground: true,\n dragReorder: true,\n deviceToggle: true,\n};\n\nfunction resolveTemplates(t: FormBuilderFeatures[\"templates\"]): ResolvedTemplates {\n if (t === false) return { enabled: false, manage: false, max: DEFAULT_MAX_TEMPLATES };\n if (t === undefined || t === true) return { enabled: true, manage: true, max: DEFAULT_MAX_TEMPLATES };\n return { enabled: true, manage: t.manage ?? true, max: t.max ?? DEFAULT_MAX_TEMPLATES };\n}\n\nexport function resolveFeatures(features?: FormBuilderFeatures): ResolvedFeatures {\n return {\n ...DEFAULT_FEATURES,\n ...features,\n templates: resolveTemplates(features?.templates),\n contentBlocks: Array.isArray(features?.contentBlocks) ? new Set(features.contentBlocks) : features?.contentBlocks ?? DEFAULT_FEATURES.contentBlocks,\n fieldTypes: Array.isArray(features?.fieldTypes) ? new Set(features.fieldTypes) : features?.fieldTypes ?? DEFAULT_FEATURES.fieldTypes,\n // Unset → follow `sections`, so an existing `sections: false` still hides the picker.\n sectionBackground: features?.sectionBackground ?? features?.sections ?? DEFAULT_FEATURES.sectionBackground,\n };\n}\n\nexport function isContentBlockEnabled(features: ResolvedFeatures, type: ContentBlockType): boolean {\n return features.contentBlocks === true || (features.contentBlocks instanceof Set && features.contentBlocks.has(type));\n}\n\nexport function isFieldTypeEnabled(features: ResolvedFeatures, type: InputFieldType): boolean {\n return features.fieldTypes === true || (features.fieldTypes instanceof Set && features.fieldTypes.has(type));\n}\n","import { useMemo, useState } from \"react\";\nimport type { Theme, ThemeOverrides } from \"../types\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\n\nexport interface UseThemeResult {\n theme: Theme;\n themeOverrides: ThemeOverrides;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n replaceThemeOverrides: (overrides: ThemeOverrides) => void;\n}\n\nexport function useTheme(themeOverrideProp?: Partial<Theme>): UseThemeResult {\n const [themeOverrides, setThemeOverrides] = useState<ThemeOverrides>({});\n\n const baseTheme = useMemo<Theme>(() => ({\n ...DEFAULT_THEME,\n ...(themeOverrideProp || {}),\n layout: { ...DEFAULT_THEME.layout, ...((themeOverrideProp && themeOverrideProp.layout) || {}) },\n }), [themeOverrideProp]);\n\n const theme = useMemo<Theme>(() => ({\n ...baseTheme,\n ...themeOverrides,\n layout: { ...baseTheme.layout, ...(themeOverrides.layout || {}) },\n }), [baseTheme, themeOverrides]);\n\n function updateThemeColor(key: keyof Omit<Theme, \"layout\">, value: string) {\n setThemeOverrides((prev) => ({ ...prev, [key]: value }));\n }\n function updateThemeLayout(key: keyof Theme[\"layout\"], value: number) {\n setThemeOverrides((prev) => ({ ...prev, layout: { ...prev.layout, [key]: value } }));\n }\n function resetTheme() {\n setThemeOverrides({});\n }\n function replaceThemeOverrides(overrides: ThemeOverrides) {\n setThemeOverrides(overrides);\n }\n\n return { theme, themeOverrides, updateThemeColor, updateThemeLayout, resetTheme, replaceThemeOverrides };\n}\n","import type { Theme } from \"../types\";\n\nexport const DEFAULT_THEME: Theme = {\n primary: \"#5B5FEF\", primarySoft: \"#EEF0FF\", danger: \"#C4432E\", dangerSoft: \"#FDECE4\",\n ink: \"#1B1E24\", muted: \"#9296A3\", border: \"#E2E4E9\", surface: \"#FFFFFF\",\n canvas: \"#F5F6F8\", pageBackground: \"#FFFFFF\",\n layout: { maxWidth: 1200, pagePadding: 28, canvasPadding: 20, sectionGap: 20, fieldGap: 16, toolbarPadding: 10, panelPadding: 14, ticketPadding: 14 },\n};\n","import { useState } from \"react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { DocumentFields, FieldPatch, FieldType, FormField, LocalizedString, Section } from \"../types\";\nimport { bi, withLang } from \"../lib/bilingual\";\nimport { defaultFieldFor, defaultSection } from \"../lib/fieldDefaults\";\nimport { genSectionId, nextId, resyncIdCounter } from \"../lib/id\";\n\nexport interface UseFormDocumentArgs {\n language: string;\n chrome: ChromeShape;\n}\n\nexport function useFormDocument({ language, chrome }: UseFormDocumentArgs) {\n const [title, setTitle] = useState<LocalizedString>(bi(\"Untitled form\", \"\"));\n const [sections, setSections] = useState<Section[]>([defaultSection()]);\n const [activeSectionId, setActiveSectionId] = useState<string | null>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n const allFields = sections.flatMap((s) => s.fields);\n const selected = allFields.find((f) => f.id === selectedId) || null;\n const activeSection = sections.find((s) => s.id === activeSectionId) || sections[0] || defaultSection();\n\n function updateTitle(value: string) {\n setTitle((prev) => withLang(prev, language, value));\n }\n\n function addSection() {\n const s = defaultSection();\n setSections((prev) => [...prev, s]);\n setActiveSectionId(s.id);\n }\n function duplicateSection(sectionId: string) {\n const newSectionId = genSectionId();\n setSections((prev) => {\n const idx = prev.findIndex((s) => s.id === sectionId);\n if (idx === -1) return prev;\n const copy: Section = { ...prev[idx], id: newSectionId, fields: prev[idx].fields.map((f) => ({ ...f, id: nextId() })) };\n const next = [...prev];\n next.splice(idx + 1, 0, copy);\n return next;\n });\n setActiveSectionId(newSectionId);\n }\n function deleteSection(sectionId: string) {\n setSections((prev) => {\n if (prev.length <= 1) return prev;\n const next = prev.filter((s) => s.id !== sectionId);\n setActiveSectionId((curr) => (curr === sectionId ? next[0].id : curr));\n return next;\n });\n }\n function moveSection(sectionId: string, dir: 1 | -1) {\n setSections((prev) => {\n const idx = prev.findIndex((s) => s.id === sectionId);\n const swap = idx + dir;\n if (swap < 0 || swap >= prev.length) return prev;\n const next = [...prev];\n [next[idx], next[swap]] = [next[swap], next[idx]];\n return next;\n });\n }\n function updateSectionTitle(sectionId: string, value: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, title: withLang(s.title, language, value) } : s)));\n }\n function updateSectionBackground(sectionId: string, color: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, background: color } : s)));\n }\n function toggleSectionCollapse(sectionId: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, collapsed: !s.collapsed } : s)));\n }\n\n function addField(type: FieldType) {\n const field = defaultFieldFor(type, language, chrome);\n const targetId = activeSectionId || sections[0]?.id;\n if (!targetId) return;\n setSections((prev) => prev.map((s) => (s.id === targetId ? { ...s, fields: [...s.fields, field] } : s)));\n setSelectedId(field.id);\n }\n function updateField(fieldId: string, patch: FieldPatch) {\n setSections((prev) => prev.map((s) => ({ ...s, fields: s.fields.map((f) => (f.id === fieldId ? ({ ...f, ...patch } as FormField) : f)) })));\n }\n function deleteField(fieldId: string) {\n setSections((prev) => prev.map((s) => ({ ...s, fields: s.fields.filter((f) => f.id !== fieldId) })));\n if (selectedId === fieldId) setSelectedId(null);\n }\n function duplicateField(fieldId: string) {\n const newId = nextId();\n setSections((prev) => prev.map((s) => {\n const idx = s.fields.findIndex((f) => f.id === fieldId);\n if (idx === -1) return s;\n const copy = { ...s.fields[idx], id: newId };\n const fields = [...s.fields];\n fields.splice(idx + 1, 0, copy);\n return { ...s, fields };\n }));\n setSelectedId(newId);\n }\n function moveField(fieldId: string, dir: 1 | -1) {\n setSections((prev) => prev.map((s) => {\n const idx = s.fields.findIndex((f) => f.id === fieldId);\n if (idx === -1) return s;\n const swap = idx + dir;\n if (swap < 0 || swap >= s.fields.length) return s;\n const fields = [...s.fields];\n [fields[idx], fields[swap]] = [fields[swap], fields[idx]];\n return { ...s, fields };\n }));\n }\n function reorderWithinSection(sectionId: string, fromIdx: number | null, toIdx: number | null) {\n if (fromIdx === toIdx || fromIdx == null || toIdx == null) return;\n setSections((prev) => prev.map((s) => {\n if (s.id !== sectionId) return s;\n const fields = [...s.fields];\n const [moved] = fields.splice(fromIdx, 1);\n fields.splice(toIdx, 0, moved);\n return { ...s, fields };\n }));\n }\n function updateOption(fieldId: string, optIdx: number, patch: { label?: LocalizedString; value?: string }) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => {\n if (f.id !== fieldId || !(\"options\" in f) || !f.options) return f;\n return { ...f, options: f.options.map((o, i) => (i === optIdx ? { ...o, ...patch } : o)) };\n }),\n })));\n }\n function addOption(fieldId: string) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => {\n if (f.id !== fieldId || !(\"options\" in f) || !f.options) return f;\n const n = f.options.length + 1;\n return { ...f, options: [...f.options, { label: withLang(bi(), language, chrome.optionSeed(n)), value: `option_${n}` }] };\n }),\n })));\n }\n function removeOption(fieldId: string, optIdx: number) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => (f.id !== fieldId || !(\"options\" in f) || !f.options ? f : { ...f, options: f.options.filter((_, i) => i !== optIdx) })),\n })));\n }\n\n function loadDocument(doc: DocumentFields) {\n resyncIdCounter(doc.sections.flatMap((s) => s.fields));\n setSections(doc.sections);\n setActiveSectionId(doc.sections[0]?.id || null);\n setTitle(doc.title);\n setSelectedId(null);\n }\n\n function resetToBlank() {\n const s = defaultSection();\n setSections([s]);\n setActiveSectionId(s.id);\n setTitle(bi(\"Untitled form\", \"\"));\n setSelectedId(null);\n }\n\n return {\n title, sections, activeSectionId, selectedId,\n allFields, selected, activeSection,\n setActiveSectionId, setSelectedId, setTitle,\n updateTitle,\n addSection, duplicateSection, deleteSection, moveSection,\n updateSectionTitle, updateSectionBackground, toggleSectionCollapse,\n addField, updateField, deleteField, duplicateField, moveField, reorderWithinSection,\n updateOption, addOption, removeOption,\n loadDocument, resetToBlank,\n };\n}\n\nexport type UseFormDocumentResult = ReturnType<typeof useFormDocument>;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { DocumentFields, FormDocument, LocalizedString, SavedFormMeta, StorageAdapter, TemplateChange, ThemeOverrides } from \"../types\";\nimport { DRAFT_KEY, INDEX_KEY, formKey } from \"../lib/storage/keys\";\nimport { DOCUMENT_VERSION, migrateDocument } from \"../lib/migrate\";\nimport { genFormId } from \"../lib/id\";\nimport { bi, t } from \"../lib/bilingual\";\n\nexport interface UsePersistenceArgs {\n storage: StorageAdapter;\n autosave: boolean;\n templateMax: number;\n /** false = pick-and-apply only (no create/overwrite/delete). */\n templateManage: boolean;\n language: string;\n chrome: ChromeShape;\n document: DocumentFields;\n initialDocument?: FormDocument;\n onLoadDocument: (doc: DocumentFields) => void;\n onLoadThemeOverrides: (overrides: ThemeOverrides) => void;\n onTitleChange: (title: LocalizedString) => void;\n onNewForm: () => void;\n onTemplateChange?: (change: TemplateChange) => void;\n ensureActiveSection: () => void;\n}\n\nexport type TemplateState = \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n\nfunction snapshotOf(d: DocumentFields): string {\n return JSON.stringify({ title: d.title, themeOverrides: d.themeOverrides, sections: d.sections });\n}\n\nexport interface SaveAsPrompt {\n open: boolean;\n suggestedName: string;\n}\n\n/**\n * Draft autoload + autosave + the templates library, over a pluggable StorageAdapter.\n * Both effects live here because the load effect's `hasLoadedOnce` ref gates the autosave one.\n */\nexport function usePersistence({\n storage, autosave, templateMax, templateManage, language, chrome, document, initialDocument, onLoadDocument, onLoadThemeOverrides, onTitleChange, onNewForm, onTemplateChange, ensureActiveSection,\n}: UsePersistenceArgs) {\n const [currentFormId, setCurrentFormId] = useState<string | null>(null);\n const [loadingDraft, setLoadingDraft] = useState(true);\n const [saveState, setSaveState] = useState<\"idle\" | \"saving\" | \"saved\" | \"error\">(\"idle\");\n const [templateState, setTemplateState] = useState<TemplateState>(\"idle\");\n const [savedForms, setSavedForms] = useState<SavedFormMeta[]>([]);\n const [saveAsPrompt, setSaveAsPrompt] = useState<SaveAsPrompt | null>(null);\n const [notice, setNotice] = useState<{ title: string; message: string } | null>(null);\n\n const autosaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasLoadedOnce = useRef(false);\n // Document JSON as last synced with a template; compared to the live doc for the \"Edited\" flag. null = no active template.\n const savedSnapshot = useRef<string | null>(null);\n\n function flashSaved() {\n setTemplateState(\"saved\");\n setTimeout(() => setTemplateState((s) => (s === \"saved\" ? \"idle\" : s)), 1500);\n }\n\n async function refreshLibrary() {\n try {\n const raw = await storage.get(INDEX_KEY);\n const list: SavedFormMeta[] = raw ? JSON.parse(raw) : [];\n setSavedForms(list.sort((a, b) => b.updatedAt - a.updatedAt));\n } catch {\n setSavedForms([]);\n }\n }\n\n useEffect(() => {\n (async () => {\n try {\n if (initialDocument) {\n const doc = migrateDocument(initialDocument);\n if (doc) {\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n } else {\n ensureActiveSection();\n }\n } else {\n const raw = await storage.get(DRAFT_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n const doc = migrateDocument(parsed);\n if (doc) {\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n }\n if (parsed.currentFormId && templateManage) {\n setCurrentFormId(parsed.currentFormId);\n // Snapshot the template record, not the draft, so \"Edited\" stays honest across reloads.\n try {\n const tplRaw = await storage.get(formKey(parsed.currentFormId));\n const tplDoc = tplRaw ? migrateDocument(JSON.parse(tplRaw)) : null;\n savedSnapshot.current = tplDoc ? snapshotOf(tplDoc) : null;\n } catch {\n savedSnapshot.current = null;\n }\n }\n } else {\n ensureActiveSection();\n }\n }\n } catch {\n ensureActiveSection();\n } finally {\n setLoadingDraft(false);\n hasLoadedOnce.current = true;\n }\n })();\n refreshLibrary();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!hasLoadedOnce.current || !autosave) return;\n setSaveState(\"saving\");\n if (autosaveTimer.current) clearTimeout(autosaveTimer.current);\n autosaveTimer.current = setTimeout(async () => {\n try {\n await storage.set(DRAFT_KEY, JSON.stringify({ version: DOCUMENT_VERSION, ...document, currentFormId }));\n setSaveState(\"saved\");\n } catch {\n setSaveState(\"error\");\n }\n }, 600);\n return () => {\n if (autosaveTimer.current) clearTimeout(autosaveTimer.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [document.title, document.themeOverrides, document.sections, currentFormId]);\n\n async function saveAs(name: string) {\n if (!templateManage) return;\n if (savedForms.length >= templateMax) {\n setSaveAsPrompt(null);\n setNotice({ title: chrome.templatesLimitTitle, message: chrome.templatesLimitReached(templateMax) });\n return;\n }\n const id = genFormId();\n const now = Date.now();\n setTemplateState(\"saving\");\n try {\n const newTitle = bi(name, \"\");\n const docToSave: DocumentFields = { ...document, title: newTitle };\n await storage.set(formKey(id), JSON.stringify({ version: DOCUMENT_VERSION, ...docToSave, id, updatedAt: now }));\n const next = [...savedForms, { id, title: name, updatedAt: now }];\n await storage.set(INDEX_KEY, JSON.stringify(next));\n setSavedForms(next);\n setCurrentFormId(id);\n onTitleChange(newTitle);\n setSaveAsPrompt(null);\n savedSnapshot.current = snapshotOf(docToSave);\n flashSaved();\n onTemplateChange?.({ id, title: name, source: \"new\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n async function saveExisting() {\n if (!templateManage) return;\n if (!currentFormId) {\n setSaveAsPrompt({ open: true, suggestedName: t(document.title, language) });\n return;\n }\n const now = Date.now();\n setTemplateState(\"saving\");\n try {\n await storage.set(formKey(currentFormId), JSON.stringify({ version: DOCUMENT_VERSION, ...document, id: currentFormId, updatedAt: now }));\n const next = savedForms.map((f) => (f.id === currentFormId ? { ...f, title: t(document.title, \"en\"), updatedAt: now } : f));\n setSavedForms(next);\n await storage.set(INDEX_KEY, JSON.stringify(next));\n savedSnapshot.current = snapshotOf(document);\n flashSaved();\n onTemplateChange?.({ id: currentFormId, title: t(document.title, language), source: \"saved\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n async function loadForm(id: string): Promise<boolean> {\n setTemplateState(\"loading\");\n try {\n const raw = await storage.get(formKey(id));\n if (!raw) { setTemplateState(\"error\"); return false; }\n const doc = migrateDocument(JSON.parse(raw));\n if (!doc) { setTemplateState(\"error\"); return false; }\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n // Pick-and-apply mode: template is just a seed, so don't bind currentFormId to it.\n const boundId = templateManage ? id : null;\n setCurrentFormId(boundId);\n savedSnapshot.current = boundId ? snapshotOf(doc) : null;\n setTemplateState(\"idle\");\n onTemplateChange?.({ id, title: t(doc.title, language), source: \"applied\" });\n return true;\n } catch {\n setTemplateState(\"error\");\n return false;\n }\n }\n\n async function deleteForm(id: string) {\n if (!templateManage) return;\n const removed = savedForms.find((f) => f.id === id);\n try {\n await storage.delete(formKey(id));\n const next = savedForms.filter((f) => f.id !== id);\n setSavedForms(next);\n await storage.set(INDEX_KEY, JSON.stringify(next));\n if (currentFormId === id) {\n setCurrentFormId(null);\n savedSnapshot.current = null;\n }\n onTemplateChange?.({ id: currentFormId === id ? null : id, title: removed?.title ?? \"\", source: \"deleted\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n function newForm() {\n onNewForm();\n setCurrentFormId(null);\n savedSnapshot.current = null;\n setTemplateState(\"idle\");\n }\n\n const activeTemplate = currentFormId ? savedForms.find((f) => f.id === currentFormId) ?? null : null;\n const isTemplateDirty = savedSnapshot.current !== null && snapshotOf(document) !== savedSnapshot.current;\n\n function dismissSaveAsPrompt() {\n setSaveAsPrompt(null);\n }\n\n return {\n loadingDraft, saveState, templateState, savedForms, currentFormId,\n activeTemplateTitle: activeTemplate?.title ?? null,\n isTemplateDirty,\n saveAs, saveExisting, loadForm, deleteForm, refreshLibrary, newForm,\n saveAsPrompt, dismissSaveAsPrompt,\n notice, dismissNotice: () => setNotice(null),\n };\n}\n\nexport type UsePersistenceResult = ReturnType<typeof usePersistence>;\n","export const DRAFT_KEY = \"form-page-builder:draft\";\nexport const INDEX_KEY = \"form-page-builder:index\";\nexport const formKey = (id: string) => `form-page-builder:saved:${id}`;\n/** Template id from a `formKey` result, else null — lets a StorageAdapter route per-template keys. */\nexport const savedFormId = (key: string): string | null =>\n key.startsWith(\"form-page-builder:saved:\") ? key.slice(\"form-page-builder:saved:\".length) : null;\n/** Copy/paste-template scratch slot — always localStorage, never the StorageAdapter. */\nexport const CLIPBOARD_KEY = \"form-page-builder:clipboard\";\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { DocumentFields, FormDocument } from \"../types\";\nimport { CLIPBOARD_KEY } from \"../lib/storage/keys\";\nimport { parseTemplate, serializeTemplate } from \"../lib/template\";\n\n/**\n * Cross-instance \"template clipboard\" over one localStorage key (not the StorageAdapter — this is\n * ephemeral per-browser scratch). Watched via `storage` events (other tabs) + this listener set (same tab).\n */\nconst sameTabListeners = new Set<() => void>();\nfunction notifySameTab() {\n sameTabListeners.forEach((fn) => fn());\n}\n\nfunction readKey(key: string): string | null {\n try {\n return typeof window !== \"undefined\" && window.localStorage ? window.localStorage.getItem(key) : null;\n } catch {\n return null;\n }\n}\n\nexport function useTemplateClipboard(clipboardKey: string = CLIPBOARD_KEY) {\n const keyRef = useRef(clipboardKey);\n keyRef.current = clipboardKey;\n\n const [hasClipboard, setHasClipboard] = useState(false);\n\n const refresh = useCallback(() => {\n setHasClipboard(parseTemplate(readKey(keyRef.current)) !== null);\n }, []);\n\n useEffect(() => {\n refresh();\n const onStorage = (e: StorageEvent) => {\n if (e.key === null || e.key === keyRef.current) refresh();\n };\n sameTabListeners.add(refresh);\n window.addEventListener(\"storage\", onStorage);\n return () => {\n sameTabListeners.delete(refresh);\n window.removeEventListener(\"storage\", onStorage);\n };\n }, [refresh]);\n\n const copyTemplate = useCallback((document: FormDocument) => {\n const str = serializeTemplate(document);\n try {\n window.localStorage?.setItem(keyRef.current, str);\n } catch {\n /* quota / unavailable */\n }\n notifySameTab();\n refresh();\n }, [refresh]);\n\n const readTemplate = useCallback((): DocumentFields | null => {\n return parseTemplate(readKey(keyRef.current));\n }, []);\n\n return { hasClipboard, copyTemplate, readTemplate };\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent } from \"react\";\n\ntype ReorderFn = (sectionId: string, fromIdx: number | null, toIdx: number | null) => void;\n\nexport function useDragReorder(reorderWithinSection: ReorderFn) {\n const dragRef = useRef<{ sectionId: string | null; index: number | null }>({ sectionId: null, index: null });\n const [dragOverKey, setDragOverKey] = useState<string | null>(null);\n\n function getDropZoneHandlers(sectionId: string, index: number) {\n const dragKey = `${sectionId}:${index}`;\n return {\n onDragOver: (e: DragEvent) => {\n e.preventDefault();\n setDragOverKey(dragKey);\n },\n onDragLeave: () => setDragOverKey(null),\n onDrop: () => {\n if (dragRef.current.sectionId === sectionId) reorderWithinSection(sectionId, dragRef.current.index, index);\n dragRef.current = { sectionId: null, index: null };\n setDragOverKey(null);\n },\n };\n }\n\n function getDragHandleProps(sectionId: string, index: number) {\n return {\n draggable: true,\n onDragStart: () => {\n dragRef.current = { sectionId, index };\n },\n };\n }\n\n return { dragOverKey, getDropZoneHandlers, getDragHandleProps };\n}\n","import { Loader2, AlertCircle, Pencil, Eye, FilePlus2, FolderOpen, Save, Code2, ClipboardCopy, ClipboardPaste, Check } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { LanguageOption, LocalizedString } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { t } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { LanguageToggle } from \"./LanguageToggle\";\n\nexport interface ToolbarProps {\n title: LocalizedString;\n language: string;\n languages: LanguageOption[];\n mode: \"build\" | \"preview\";\n saveState: \"idle\" | \"saving\" | \"saved\" | \"error\";\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n activeTemplateTitle: string | null;\n templateDirty: boolean;\n chrome: ChromeShape;\n features: ResolvedFeatures;\n savedFormsCount: number;\n onTitleChange: (value: string) => void;\n onLanguageChange: (code: string) => void;\n onModeChange: (mode: \"build\" | \"preview\") => void;\n clipboardReady: boolean;\n templateCopied: boolean;\n onNewForm: () => void;\n onOpenLibrary: () => void;\n onSaveExisting: () => void;\n onOpenJson: () => void;\n onCopyTemplate: () => void;\n onPasteTemplate: () => void;\n}\n\nexport function Toolbar({\n title, language, languages, mode, saveState, templateState, activeTemplateTitle, templateDirty, chrome, features, savedFormsCount,\n clipboardReady, templateCopied,\n onTitleChange, onLanguageChange, onModeChange, onNewForm, onOpenLibrary, onSaveExisting, onOpenJson, onCopyTemplate, onPasteTemplate,\n}: ToolbarProps) {\n return (\n <div style={styles.toolbar}>\n <div style={styles.toolbarLeft}>\n <div style={styles.logoMark}>FB</div>\n {features.naming ? (\n <input value={t(title, language)} onChange={(e) => onTitleChange(e.target.value)} style={styles.titleInput} aria-label=\"Form title\" />\n ) : (\n <span style={styles.titleInput}>{t(title, language)}</span>\n )}\n {templateState === \"loading\" ? (\n <span style={styles.saveStatus}><Loader2 size={12} className=\"spin\" /> {chrome.templateLoading}</span>\n ) : activeTemplateTitle && (\n <span className=\"fb-template-tag\" style={styles.templateTag} title={chrome.templateLabel(activeTemplateTitle)}>\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\" }}>{chrome.templateLabel(activeTemplateTitle)}</span>\n {templateDirty && <span style={styles.currentBadge}>{chrome.templateEdited}</span>}\n </span>\n )}\n </div>\n <div style={styles.toolbarRight}>\n <span style={styles.saveStatus}>\n {saveState === \"saving\" && (<><Loader2 size={12} className=\"spin\" /> {chrome.saving}</>)}\n {saveState === \"saved\" && chrome.saved}\n {saveState === \"error\" && (<span style={{ color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 4 }}><AlertCircle size={12} /> {chrome.saveFailed}</span>)}\n </span>\n {features.languageSwitcher && (\n <>\n <div style={styles.toolbarDivider} />\n <LanguageToggle languages={languages} value={language} onChange={onLanguageChange} />\n </>\n )}\n {features.previewMode && (\n <>\n <div style={styles.toolbarDivider} />\n <button style={mode === \"build\" ? styles.tabBtnActive : styles.tabBtn} onClick={() => onModeChange(\"build\")}><Pencil size={14} /> {chrome.build}</button>\n <button style={mode === \"preview\" ? styles.tabBtnActive : styles.tabBtn} onClick={() => onModeChange(\"preview\")}><Eye size={14} /> {chrome.preview}</button>\n </>\n )}\n {(features.newForm || features.templates.enabled) && <div style={styles.toolbarDivider} />}\n {features.newForm && (\n <button style={styles.ghostBtn} onClick={onNewForm} title={chrome.startNewForm}><FilePlus2 size={14} /> {chrome.newForm}</button>\n )}\n {features.templates.enabled && (\n <>\n <button style={styles.ghostBtn} onClick={onOpenLibrary} title={chrome.openTemplatesTitle}>\n <FolderOpen size={14} /> {chrome.templates}\n {savedFormsCount > 0 && <span style={styles.countBadge}>{savedFormsCount}</span>}\n </button>\n {features.templates.manage && (\n <button style={styles.primaryBtn} onClick={onSaveExisting} title={chrome.saveToLibraryTitle}><Save size={14} /> {chrome.save}</button>\n )}\n </>\n )}\n {features.jsonView && (\n <button style={styles.ghostBtn} onClick={onOpenJson}><Code2 size={14} /> {chrome.viewJson}</button>\n )}\n {features.templateClipboard && (\n <>\n <button style={styles.toolbarIconBtn} onClick={onCopyTemplate} title={chrome.copyTemplateTitle} aria-label={chrome.copyTemplate}>\n {templateCopied ? <Check size={14} /> : <ClipboardCopy size={14} />}\n </button>\n <button style={styles.toolbarIconBtn} onClick={onPasteTemplate} disabled={!clipboardReady} title={chrome.pasteTemplateTitle} aria-label={chrome.pasteTemplate}>\n <ClipboardPaste size={14} />\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport const styles: Record<string, CSSProperties> = {\n app: { fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, sans-serif\", background: \"var(--fb-canvas)\", borderRadius: 12, overflow: \"hidden\", border: \"1px solid var(--fb-border)\", color: \"var(--fb-ink)\", display: \"flex\", flexDirection: \"column\" },\n toolbar: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"var(--fb-space-toolbar) 16px\", borderBottom: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", flexWrap: \"wrap\", gap: 8, position: \"relative\" },\n toolbarLeft: { display: \"flex\", alignItems: \"center\", gap: 10, minWidth: 0, flexShrink: 1 },\n logoMark: { width: 26, height: 26, borderRadius: 7, background: \"var(--fb-primary)\", color: \"#fff\", fontSize: 11, fontWeight: 700, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", fontFamily: \"'JetBrains Mono', monospace\", letterSpacing: \"-0.5px\" },\n titleInput: { border: \"none\", outline: \"none\", fontSize: 14, fontWeight: 600, background: \"transparent\", color: \"var(--fb-ink)\", padding: \"4px 6px\", borderRadius: 6, minWidth: 160 },\n toolbarRight: { display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\" },\n toolbarDivider: { width: 1, height: 20, background: \"var(--fb-border)\", margin: \"0 4px\" },\n tabBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid transparent\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 13, fontWeight: 500 },\n tabBtnActive: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-primary-soft)\", color: \"var(--fb-primary)\", fontSize: 13, fontWeight: 600 },\n ghostBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\", fontSize: 13, fontWeight: 500 },\n primaryBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 13px\", borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary)\", color: \"#fff\", fontSize: 13, fontWeight: 600 },\n saveStatus: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12, color: \"var(--fb-muted)\", minWidth: 60 },\n templateTag: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12, color: \"var(--fb-muted)\", minWidth: 0, flexShrink: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n toolbarIconBtn: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"6px 9px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\" },\n countBadge: { fontSize: 10.5, fontWeight: 700, background: \"var(--fb-primary-soft)\", color: \"var(--fb-primary)\", borderRadius: 9, padding: \"1px 6px\", marginLeft: 2 },\n loadingScreen: { flex: 1, display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n libraryBody: { padding: \"var(--fb-space-panel)\", overflowY: \"auto\", display: \"flex\", flexDirection: \"column\", gap: 4 },\n libraryRow: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 10, padding: \"10px 8px\", borderRadius: 8, border: \"1px solid var(--fb-border)\" },\n libraryRowTitle: { fontSize: 13.5, fontWeight: 600, color: \"var(--fb-ink)\", display: \"flex\", alignItems: \"center\", gap: 8, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n libraryRowMeta: { fontSize: 11.5, color: \"var(--fb-muted)\", marginTop: 2 },\n currentBadge: { fontSize: 10, fontWeight: 700, color: \"var(--fb-primary)\", background: \"var(--fb-primary-soft)\", padding: \"2px 6px\", borderRadius: 5, flexShrink: 0 },\n workArea: { display: \"flex\", flex: 1, minHeight: 0 },\n palette: { width: 200, borderRight: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", padding: \"var(--fb-space-panel)\", overflowY: \"auto\" },\n panelHeading: { fontSize: 11, fontWeight: 700, letterSpacing: \"0.06em\", textTransform: \"uppercase\", color: \"var(--fb-muted)\", marginBottom: 10 },\n activeSectionHint: { fontSize: 11.5, color: \"var(--fb-muted)\", marginBottom: 14, lineHeight: 1.4 },\n paletteList: { display: \"flex\", flexDirection: \"column\", gap: 4 },\n paletteItem: { display: \"flex\", alignItems: \"center\", gap: 9, padding: \"8px 9px\", borderRadius: 8, border: \"1px solid transparent\", background: \"transparent\", fontSize: 13, color: \"var(--fb-ink)\", textAlign: \"left\" },\n canvas: { flex: 1, padding: \"var(--fb-space-canvas)\", overflowY: \"auto\", background: \"var(--fb-canvas)\" },\n sectionBlock: { borderRadius: 12, padding: \"var(--fb-space-panel)\", marginBottom: \"var(--fb-space-section)\", transition: \"border-color 0.12s\" },\n sectionHeader: { display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 12, flexWrap: \"wrap\" },\n chevronBtn: { width: 22, height: 22, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", flexShrink: 0 },\n colorDot: { width: 10, height: 10, borderRadius: \"50%\", border: \"1px solid var(--fb-border)\", flexShrink: 0 },\n sectionTitleInput: { border: \"none\", outline: \"none\", background: \"transparent\", fontSize: 14, fontWeight: 700, color: \"var(--fb-ink)\", padding: \"2px 0\", minWidth: 120, flex: 1 },\n sectionHeaderActions: { display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\", marginLeft: \"auto\" },\n sectionEmpty: { fontSize: 12.5, color: \"var(--fb-muted)\", padding: \"18px 4px\", textAlign: \"center\", border: \"1px dashed var(--fb-border)\", borderRadius: 8 },\n resetLinkBtn: { display: \"flex\", alignItems: \"center\", gap: 3, fontSize: 11, color: \"var(--fb-muted)\", background: \"transparent\", border: \"none\", padding: \"2px 4px\" },\n addSectionBtn: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 6, width: \"100%\", padding: \"10px\", borderRadius: 10, border: \"1px dashed var(--fb-border)\", background: \"transparent\", color: \"var(--fb-primary)\", fontSize: 13, fontWeight: 600 },\n swatchRow: { display: \"flex\", alignItems: \"center\", gap: 5, flexWrap: \"wrap\" },\n swatchBtn: { width: 20, height: 20, borderRadius: \"50%\", border: \"1px solid var(--fb-border)\", padding: 0 },\n swatchBtnActive: { border: \"2px solid var(--fb-primary)\" },\n colorPickerInput: { width: 22, height: 22, padding: 0, border: \"none\", borderRadius: \"50%\", overflow: \"hidden\", background: \"none\", cursor: \"pointer\" },\n fieldList: { display: \"flex\", flexWrap: \"wrap\", gap: \"var(--fb-space-field)\" },\n ticket: { display: \"flex\", alignItems: \"stretch\", background: \"var(--fb-surface)\", border: \"1px solid var(--fb-border)\", borderRadius: 10, position: \"relative\", transition: \"border-color 0.12s, box-shadow 0.12s\" },\n ticketSelected: { borderColor: \"var(--fb-primary)\", boxShadow: \"0 0 0 3px var(--fb-primary-soft)\" },\n ticketDragOver: { borderColor: \"var(--fb-muted)\" },\n ticketIndex: { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 13, fontWeight: 700, color: \"var(--fb-border)\", width: 34, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", flexShrink: 0 },\n ticketPerforation: { width: 0, borderLeft: \"1px dashed var(--fb-border)\" },\n ticketBody: { flex: 1, padding: \"10px var(--fb-space-ticket)\", minWidth: 0 },\n ticketTop: { display: \"flex\", alignItems: \"center\", gap: 7, marginBottom: 4 },\n typeBadge: { fontSize: 10.5, fontFamily: \"'JetBrains Mono', monospace\", color: \"var(--fb-muted)\" },\n requiredBadge: { fontSize: 10, fontWeight: 700, color: \"var(--fb-danger)\", background: \"var(--fb-danger-soft)\", padding: \"2px 6px\", borderRadius: 5, letterSpacing: \"0.02em\", marginLeft: \"auto\" },\n chipRow: { display: \"flex\", gap: 5, marginBottom: 7, flexWrap: \"wrap\" },\n miniBadge: { fontSize: 10, fontWeight: 600, color: \"var(--fb-primary)\", background: \"var(--fb-primary-soft)\", padding: \"2px 6px\", borderRadius: 5, letterSpacing: \"0.02em\" },\n langToggleTrack: { position: \"relative\", display: \"flex\", gap: 3, background: \"var(--fb-surface-2)\", padding: 3, borderRadius: 20 },\n langToggleThumb: { position: \"absolute\", top: 3, left: 3, bottom: 3, background: \"var(--fb-primary)\", borderRadius: 17, transition: \"transform 0.18s ease\" },\n langToggleBtn: { position: \"relative\", zIndex: 1, padding: \"5px 12px\", borderRadius: 17, border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 12.5, fontWeight: 600, whiteSpace: \"nowrap\" },\n langToggleBtnActive: { position: \"relative\", zIndex: 1, padding: \"5px 12px\", borderRadius: 17, border: \"none\", background: \"transparent\", color: \"#fff\", fontSize: 12.5, fontWeight: 600, whiteSpace: \"nowrap\" },\n segmented: { display: \"flex\", gap: 3, background: \"var(--fb-surface-2)\", padding: 3, borderRadius: 8, marginBottom: 4 },\n segmentedBtn: { flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 5, padding: \"6px 8px\", borderRadius: 6, border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 12.5, fontWeight: 500 },\n segmentedBtnActive: { flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 5, padding: \"6px 8px\", borderRadius: 6, border: \"none\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\", fontSize: 12.5, fontWeight: 600, boxShadow: \"0 1px 2px rgba(0,0,0,0.08)\" },\n iconGrid: { display: \"grid\", gridTemplateColumns: \"repeat(6, 1fr)\", gap: 5, marginTop: 6 },\n iconGridBtn: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n iconGridBtnActive: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary-soft)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-primary)\" },\n styleToggleRow: { display: \"flex\", gap: 5, marginBottom: 4 },\n styleToggle: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n styleToggleActive: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary-soft)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-primary)\" },\n previewInput: { border: \"1px solid var(--fb-border)\", borderRadius: 7, padding: \"7px 10px\", fontSize: 13, color: \"var(--fb-muted)\", background: \"var(--fb-surface-2)\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" },\n previewRadio: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, color: \"var(--fb-ink)\" },\n ticketActions: { display: \"flex\", flexDirection: \"column\", gap: 3, padding: 8, borderLeft: \"1px solid var(--fb-border)\" },\n iconBtn: { width: 24, height: 24, borderRadius: 6, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n iconBtnDanger: { color: \"var(--fb-danger)\" },\n inspector: { width: 270, borderLeft: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", padding: \"var(--fb-space-panel)\", overflowY: \"auto\" },\n inspectorEmpty: { fontSize: 13, color: \"var(--fb-muted)\", lineHeight: 1.5, marginTop: 6 },\n inspectorBody: { display: \"flex\", flexDirection: \"column\", gap: 4 },\n helperText: { fontSize: 11, color: \"var(--fb-muted)\", lineHeight: 1.4, margin: \"2px 0 4px\" },\n propLabel: { fontSize: 11.5, fontWeight: 600, color: \"var(--fb-muted)\", marginTop: 12, marginBottom: 5 },\n propInput: { border: \"1px solid var(--fb-border)\", borderRadius: 7, padding: \"7px 9px\", fontSize: 13, color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\", width: \"100%\", boxSizing: \"border-box\" },\n optionList: { display: \"flex\", flexDirection: \"column\", gap: 6 },\n optionRow: { display: \"flex\", gap: 6, alignItems: \"center\" },\n optionInput: { flex: 1, border: \"1px solid var(--fb-border)\", borderRadius: 6, padding: \"6px 8px\", fontSize: 12.5, color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\", minWidth: 0, boxSizing: \"border-box\" },\n addOptionBtn: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12.5, color: \"var(--fb-primary)\", background: \"transparent\", border: \"1px dashed var(--fb-border)\", borderRadius: 7, padding: \"6px 8px\", justifyContent: \"center\", marginTop: 2 },\n toggleRow: { display: \"flex\", alignItems: \"center\", gap: 8, background: \"transparent\", border: \"none\", padding: \"8px 0\" },\n toggleTrack: { width: 30, height: 17, borderRadius: 20, position: \"relative\", transition: \"background 0.15s\", display: \"inline-block\" },\n toggleThumb: { position: \"absolute\", top: 2, left: 2, width: 13, height: 13, borderRadius: \"50%\", background: \"#fff\", transition: \"transform 0.15s\", boxShadow: \"0 1px 2px rgba(0,0,0,0.2)\" },\n inspectorDivider: { height: 1, background: \"var(--fb-border)\", margin: \"14px 0 10px\" },\n deleteFieldBtn: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12.5, color: \"var(--fb-danger)\", background: \"var(--fb-danger-soft)\", border: \"none\", borderRadius: 7, padding: \"8px 10px\", justifyContent: \"center\" },\n modalOverlay: { position: \"fixed\", inset: 0, background: \"rgba(20,22,28,0.45)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 50, padding: 16, boxSizing: \"border-box\" },\n modal: { background: \"var(--fb-surface)\", borderRadius: 12, width: \"100%\", maxWidth: 520, maxHeight: \"70vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", boxShadow: \"0 20px 60px rgba(0,0,0,0.25)\", boxSizing: \"border-box\" },\n modalHeader: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"12px 16px\", borderBottom: \"1px solid var(--fb-border)\" },\n jsonPre: { margin: 0, padding: 16, fontSize: 12, lineHeight: 1.6, overflow: \"auto\", background: \"#14171C\", color: \"#D6D8E0\", fontFamily: \"'JetBrains Mono', monospace\" },\n previewWrap: { flex: 1, display: \"flex\", justifyContent: \"center\", padding: \"var(--fb-space-page) 20px\", overflowY: \"auto\", background: \"var(--fb-canvas)\" },\n previewToolbar: { width: \"100%\", display: \"flex\", gap: 10, marginBottom: 16, justifyContent: \"center\" },\n previewCard: { width: \"100%\", maxWidth: 480, background: \"var(--fb-page-bg)\", border: \"1px solid var(--fb-border)\", borderRadius: 12, padding: \"var(--fb-space-page)\" },\n previewTitle: { fontSize: 19, fontWeight: 700, margin: \"0 0 20px\" },\n previewLabel: { display: \"block\", fontSize: 13, fontWeight: 600, color: \"var(--fb-ink)\", marginBottom: 6 },\n previewGrid: { display: \"flex\", flexWrap: \"wrap\", gap: \"var(--fb-space-field)\" },\n sectionRuntimeTitle: { fontSize: 15, fontWeight: 700, margin: \"0 0 12px\", color: \"var(--fb-ink)\" },\n imagePlaceholder: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", border: \"1px dashed var(--fb-border)\" },\n fieldError: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12, color: \"var(--fb-danger)\", marginTop: 5 },\n formErrorNote: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12.5, color: \"var(--fb-danger)\", marginTop: 10, justifyContent: \"center\" },\n submittedList: { display: \"flex\", flexDirection: \"column\", gap: 8, marginTop: 4 },\n submittedRow: { display: \"flex\", justifyContent: \"space-between\", gap: 12, fontSize: 13, padding: \"6px 0\", borderBottom: \"1px solid var(--fb-border)\" },\n submittedLabel: { color: \"var(--fb-muted)\", flexShrink: 0 },\n submittedValue: { color: \"var(--fb-ink)\", fontWeight: 600, textAlign: \"right\" },\n realInput: { width: \"100%\", border: \"1px solid var(--fb-border)\", borderRadius: 8, padding: \"9px 11px\", fontSize: 13.5, outline: \"none\", color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", boxSizing: \"border-box\" },\n realInputError: { borderColor: \"var(--fb-danger)\" },\n submitBtn: { marginTop: 8, color: \"#fff\", border: \"none\", borderRadius: 8, fontWeight: 600, width: \"100%\" },\n layoutPanelHeader: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 4 },\n spacingRow: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, padding: \"4px 0\" },\n spacingLabel: { fontSize: 12, color: \"var(--fb-ink)\" },\n spacingInput: { width: 60, border: \"1px solid var(--fb-border)\", borderRadius: 6, padding: \"4px 6px\", fontSize: 12, textAlign: \"right\", color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\" },\n};\n","import type { LanguageOption } from \"../types\";\nimport { styles } from \"../styles/styles\";\n\nexport interface LanguageToggleProps {\n languages: LanguageOption[];\n value: string;\n onChange: (code: string) => void;\n}\n\nexport function LanguageToggle({ languages, value, onChange }: LanguageToggleProps) {\n const activeIdx = Math.max(0, languages.findIndex((l) => l.code === value));\n const n = languages.length || 1;\n\n return (\n <div style={styles.langToggleTrack}>\n <div\n style={{\n ...styles.langToggleThumb,\n width: `calc(${100 / n}% - 3px)`,\n transform: `translateX(calc(${activeIdx * 100}% + ${activeIdx * 3}px))`,\n }}\n />\n {languages.map((l) => (\n <button\n key={l.code}\n type=\"button\"\n style={l.code === value ? styles.langToggleBtnActive : styles.langToggleBtn}\n onClick={() => onChange(l.code)}\n >\n {l.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Plus } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { ContentBlockType, FieldType, InputFieldType, Theme } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { isContentBlockEnabled, isFieldTypeEnabled } from \"../lib/features\";\nimport { CONTENT_TYPES, FORM_TYPES, FIELD_TYPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { DesignPanel } from \"./DesignPanel\";\n\nexport interface PaletteProps {\n activeSectionLabel: string;\n chrome: ChromeShape;\n onAddField: (type: FieldType) => void;\n features: ResolvedFeatures;\n theme: Theme;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n /** Placed input-type field count, for gating against `features.maxFields`. */\n fieldCount: number;\n}\n\nexport function Palette({\n activeSectionLabel, chrome, onAddField, features, theme,\n updateThemeColor, updateThemeLayout, resetTheme, fieldCount,\n}: PaletteProps) {\n const [tab, setTab] = useState<\"blocks\" | \"design\">(\"blocks\");\n const contentTypes = CONTENT_TYPES.filter((f) => isContentBlockEnabled(features, f.type as ContentBlockType));\n const formTypes = FORM_TYPES.filter((f) => isFieldTypeEnabled(features, f.type as InputFieldType));\n // Content blocks aren't capped by maxFields.\n const atFieldCap = typeof features.maxFields === \"number\" && fieldCount >= features.maxFields;\n\n return (\n <div className=\"fb-palette\" style={styles.palette}>\n {features.design && (\n <div style={{ marginBottom: 14 }}>\n <Segmented\n options={[\n { value: \"blocks\", label: chrome.paletteTabBlocks },\n { value: \"design\", label: chrome.paletteTabDesign },\n ]}\n value={tab}\n onChange={setTab}\n />\n </div>\n )}\n\n {tab === \"design\" && features.design ? (\n <DesignPanel\n chrome={chrome}\n theme={theme}\n updateThemeColor={updateThemeColor}\n updateThemeLayout={updateThemeLayout}\n resetTheme={resetTheme}\n />\n ) : (\n <>\n <div style={styles.activeSectionHint}>\n {chrome.addingTo} <strong>{activeSectionLabel}</strong>\n </div>\n {contentTypes.length > 0 && (\n <>\n <div style={styles.panelHeading}>{chrome.contentBlocks}</div>\n <div style={styles.paletteList}>\n {contentTypes.map((f) => {\n const Icon = f.icon;\n return (<button key={f.type} style={styles.paletteItem} onClick={() => onAddField(f.type)}><Icon size={16} color=\"var(--fb-primary)\" /><span>{chrome[FIELD_TYPE_CHROME_KEY[f.type] as keyof ChromeShape] as string}</span><Plus size={13} color=\"var(--fb-muted)\" style={{ marginLeft: \"auto\" }} /></button>);\n })}\n </div>\n </>\n )}\n {formTypes.length > 0 && (\n <>\n <div style={{ ...styles.panelHeading, marginTop: 16 }}>{chrome.formFields}</div>\n <div style={styles.paletteList}>\n {formTypes.map((f) => {\n const Icon = f.icon;\n const itemStyle = atFieldCap ? { ...styles.paletteItem, opacity: 0.45, cursor: \"not-allowed\" } : styles.paletteItem;\n return (<button key={f.type} type=\"button\" disabled={atFieldCap} style={itemStyle} onClick={() => onAddField(f.type)}><Icon size={16} color=\"var(--fb-primary)\" /><span>{chrome[FIELD_TYPE_CHROME_KEY[f.type] as keyof ChromeShape] as string}</span><Plus size={13} color=\"var(--fb-muted)\" style={{ marginLeft: \"auto\" }} /></button>);\n })}\n </div>\n </>\n )}\n </>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { IconComponent } from \"../constants/icons\";\nimport { styles } from \"../styles/styles\";\n\nexport interface SegmentedOption<T extends string = string> {\n value: T;\n label: ReactNode;\n icon?: IconComponent;\n}\n\nexport interface SegmentedProps<T extends string = string> {\n options: SegmentedOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function Segmented<T extends string = string>({ options, value, onChange }: SegmentedProps<T>) {\n return (\n <div style={styles.segmented}>\n {options.map((opt) => {\n const Icon = opt.icon;\n const active = value === opt.value;\n return (\n <button key={opt.value} type=\"button\" style={active ? styles.segmentedBtnActive : styles.segmentedBtn} onClick={() => onChange(opt.value)}>\n {Icon && <Icon size={13} />}{opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { Theme } from \"../types\";\nimport { BUTTON_COLOR_SWATCHES, SECTION_BG_SWATCHES } from \"../constants/colors\";\nimport { SPACING_FIELDS } from \"../constants/layout\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\nimport { styles } from \"../styles/styles\";\n\nexport interface DesignPanelProps {\n chrome: ChromeShape;\n theme: Theme;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n}\n\nexport function DesignPanel({ chrome, theme, updateThemeColor, updateThemeLayout, resetTheme }: DesignPanelProps) {\n return (\n <div>\n <div style={styles.layoutPanelHeader}>\n <span style={{ fontWeight: 600, fontSize: 13 }}>{chrome.theme}</span>\n <button type=\"button\" style={styles.resetLinkBtn} onClick={resetTheme}><RotateCcw size={11} /> {chrome.reset}</button>\n </div>\n <label style={styles.propLabel}>{chrome.primaryColor}</label>\n <div style={styles.swatchRow}>\n {BUTTON_COLOR_SWATCHES.slice(1).map((c) => (<button key={c} type=\"button\" title={c} style={{ ...styles.swatchBtn, background: c, ...(theme.primary === c ? styles.swatchBtnActive : {}) }} onClick={() => updateThemeColor(\"primary\", c)} />))}\n <input type=\"color\" value={theme.primary} onChange={(e) => updateThemeColor(\"primary\", e.target.value)} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.pageBackground}</label>\n <div style={styles.swatchRow}>\n {SECTION_BG_SWATCHES.filter(Boolean).map((c) => (<button key={c} type=\"button\" title={c} style={{ ...styles.swatchBtn, background: c, ...(theme.pageBackground === c ? styles.swatchBtnActive : {}) }} onClick={() => updateThemeColor(\"pageBackground\", c)} />))}\n <input type=\"color\" value={theme.pageBackground} onChange={(e) => updateThemeColor(\"pageBackground\", e.target.value)} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.maxWidthPx}</label>\n <input type=\"number\" style={styles.propInput} value={theme.layout.maxWidth} onChange={(e) => updateThemeLayout(\"maxWidth\", Number(e.target.value) || DEFAULT_THEME.layout.maxWidth)} />\n\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.spacing}</div>\n {SPACING_FIELDS.map(({ key, labelKey }) => (\n <div key={key} style={styles.spacingRow}>\n <span style={styles.spacingLabel}>{chrome[labelKey as keyof ChromeShape] as string}</span>\n <input type=\"number\" style={styles.spacingInput} value={theme.layout[key as keyof Theme[\"layout\"]]} onChange={(e) => updateThemeLayout(key as keyof Theme[\"layout\"], Number(e.target.value) || 0)} />\n </div>\n ))}\n </div>\n );\n}\n","export const COLOR_SWATCHES = [\"\", \"#1B1E24\", \"#5B5FEF\", \"#C4432E\", \"#0EA5A4\", \"#D97706\"];\nexport const SECTION_BG_SWATCHES = [\"\", \"#FFFFFF\", \"#F5F6F8\", \"#EEF0FF\", \"#FDF4E7\", \"#E9F7EF\", \"#FDECEC\"];\nexport const BUTTON_COLOR_SWATCHES = [\"\", \"#5B5FEF\", \"#0EA5A4\", \"#D97706\", \"#C4432E\", \"#1B1E24\"];\n","import { Monitor, Tablet, Smartphone } from \"lucide-react\";\nimport type { WidthOption } from \"../types\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\n\nexport const WIDTH_OPTIONS: { value: WidthOption; label?: string; labelKey?: string }[] = [\n { value: \"1/3\", label: \"1/3\" }, { value: \"1/2\", label: \"1/2\" }, { value: \"1/1\", labelKey: \"full\" },\n];\nexport const WIDTH_PERCENT: Record<WidthOption, string> = { \"1/3\": \"33.3333%\", \"1/2\": \"50%\", \"1/1\": \"100%\" };\nexport const ALIGN_MAP = { top: \"flex-start\", middle: \"center\", bottom: \"flex-end\" } as const;\n\nexport function effectiveWidth(width: WidthOption | undefined, device: string): WidthOption {\n if (device === \"mobile\") return \"1/1\";\n if (device === \"tablet\" && width === \"1/3\") return \"1/2\";\n return width || \"1/1\";\n}\n\n// Only spacing that shows up in Preview is editable here; canvas/toolbar/panel/ticket padding is builder-only.\nexport const SPACING_FIELDS = [\n { key: \"pagePadding\", labelKey: \"spacingPagePadding\" },\n { key: \"sectionGap\", labelKey: \"spacingSectionGap\" },\n { key: \"fieldGap\", labelKey: \"spacingFieldGap\" },\n] as const;\n\nexport interface DeviceOption {\n value: \"laptop\" | \"tablet\" | \"mobile\";\n label: string;\n icon: typeof Monitor;\n maxWidth: number;\n}\n\nexport function buildDeviceOptions(baseMaxWidth: number, chrome: ChromeShape): DeviceOption[] {\n const mw = Number(baseMaxWidth) > 0 ? baseMaxWidth : DEFAULT_THEME.layout.maxWidth;\n return [\n { value: \"laptop\", label: chrome.deviceLaptop, icon: Monitor, maxWidth: mw },\n { value: \"tablet\", label: chrome.deviceTablet, icon: Tablet, maxWidth: Math.min(mw, 480) },\n { value: \"mobile\", label: chrome.deviceMobile, icon: Smartphone, maxWidth: Math.min(mw, 340) },\n ];\n}\n","import { Layers } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, Section } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { styles } from \"../styles/styles\";\nimport { SectionCard } from \"./SectionCard\";\n\nexport interface CanvasProps {\n sections: Section[];\n activeSectionId: string | null;\n selectedId: string | null;\n dragOverKey: string | null;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n features: ResolvedFeatures;\n onActivateSection: (sectionId: string) => void;\n onToggleSectionCollapse: (sectionId: string) => void;\n onUpdateSectionTitle: (sectionId: string, value: string) => void;\n onUpdateSectionBackground: (sectionId: string, color: string) => void;\n onDuplicateSection: (sectionId: string) => void;\n onMoveSection: (sectionId: string, dir: 1 | -1) => void;\n onDeleteSection: (sectionId: string) => void;\n onAddSection: () => void;\n onSelectField: (sectionId: string, fieldId: string) => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n getDropZoneHandlers: (sectionId: string, idx: number) => { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n getDragHandleProps: (sectionId: string, idx: number) => { draggable: boolean; onDragStart: () => void };\n}\n\nexport function Canvas({\n sections, activeSectionId, selectedId, dragOverKey, chrome, strings, language, features,\n onActivateSection, onToggleSectionCollapse, onUpdateSectionTitle, onUpdateSectionBackground,\n onDuplicateSection, onMoveSection, onDeleteSection,\n onAddSection, onSelectField, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n getDropZoneHandlers, getDragHandleProps,\n}: CanvasProps) {\n return (\n <div className=\"fb-canvas\" style={styles.canvas}>\n {sections.map((section, sIdx) => (\n <SectionCard\n key={section.id}\n section={section}\n sIdx={sIdx}\n sectionsLength={sections.length}\n isActive={activeSectionId === section.id}\n selectedId={selectedId}\n dragOverKey={dragOverKey}\n chrome={chrome}\n strings={strings}\n language={language}\n features={features}\n onActivate={() => onActivateSection(section.id)}\n onToggleCollapse={() => onToggleSectionCollapse(section.id)}\n onUpdateTitle={(value) => onUpdateSectionTitle(section.id, value)}\n onUpdateBackground={(color) => onUpdateSectionBackground(section.id, color)}\n onDuplicateSection={() => onDuplicateSection(section.id)}\n onMoveSection={(dir) => onMoveSection(section.id, dir)}\n onDeleteSection={() => onDeleteSection(section.id)}\n onSelectField={(fieldId) => onSelectField(section.id, fieldId)}\n onFieldChange={onFieldChange}\n onMoveField={onMoveField}\n onDuplicateField={onDuplicateField}\n onDeleteField={onDeleteField}\n getDropZoneHandlers={getDropZoneHandlers}\n getDragHandleProps={getDragHandleProps}\n />\n ))}\n {features.sections && (\n <button style={styles.addSectionBtn} onClick={onAddSection}><Layers size={14} /> {chrome.addSection}</button>\n )}\n </div>\n );\n}\n","import { ChevronDown, ChevronRight, Copy, ArrowUp, ArrowDown, Trash2 } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, Section } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { SECTION_BG_SWATCHES } from \"../constants/colors\";\nimport { styles } from \"../styles/styles\";\nimport { t } from \"../lib/bilingual\";\nimport { FieldTicket } from \"./FieldTicket\";\n\nexport interface SectionCardProps {\n section: Section;\n sIdx: number;\n sectionsLength: number;\n isActive: boolean;\n selectedId: string | null;\n dragOverKey: string | null;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n features: ResolvedFeatures;\n onActivate: () => void;\n onToggleCollapse: () => void;\n onUpdateTitle: (value: string) => void;\n onUpdateBackground: (color: string) => void;\n onDuplicateSection: () => void;\n onMoveSection: (dir: 1 | -1) => void;\n onDeleteSection: () => void;\n onSelectField: (fieldId: string) => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n getDropZoneHandlers: (sectionId: string, idx: number) => { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n getDragHandleProps: (sectionId: string, idx: number) => { draggable: boolean; onDragStart: () => void };\n}\n\nexport function SectionCard({\n section, sIdx, sectionsLength, isActive, selectedId, dragOverKey, chrome, strings, language, features,\n onActivate, onToggleCollapse, onUpdateTitle, onUpdateBackground, onDuplicateSection, onMoveSection, onDeleteSection,\n onSelectField, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n getDropZoneHandlers, getDragHandleProps,\n}: SectionCardProps) {\n return (\n <div\n style={{ ...styles.sectionBlock, background: section.background || \"transparent\", border: isActive ? \"1px solid var(--fb-primary)\" : \"1px dashed var(--fb-border)\" }}\n onClick={onActivate}\n >\n <div style={styles.sectionHeader}>\n <button style={styles.chevronBtn} onClick={(e) => { e.stopPropagation(); onToggleCollapse(); }}>\n {section.collapsed ? <ChevronRight size={15} /> : <ChevronDown size={15} />}\n </button>\n <span style={{ ...styles.colorDot, background: section.background || \"var(--fb-canvas)\" }} />\n <input\n style={styles.sectionTitleInput}\n placeholder={chrome.sectionTitlePlaceholder(sIdx + 1)}\n value={t(section.title, language)}\n onChange={(e) => onUpdateTitle(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n {section.collapsed && <span style={styles.miniBadge}>{chrome.fieldsCount(section.fields.length)}</span>}\n <div style={styles.sectionHeaderActions} onClick={(e) => e.stopPropagation()}>\n {features.sectionBackground && !section.collapsed && (\n <div style={styles.swatchRow}>\n {SECTION_BG_SWATCHES.map((c) => (\n <button key={c || \"none\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-canvas)\", ...(section.background === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateBackground(c)} />\n ))}\n <input type=\"color\" title={chrome.customColor} value={/^#/.test(section.background) ? section.background : \"#ffffff\"} onChange={(e) => onUpdateBackground(e.target.value)} style={styles.colorPickerInput} />\n </div>\n )}\n {features.sections && (\n <>\n <button style={styles.iconBtn} title={chrome.duplicate} onClick={onDuplicateSection}><Copy size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveUp} disabled={sIdx === 0} onClick={() => onMoveSection(-1)}><ArrowUp size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveDown} disabled={sIdx === sectionsLength - 1} onClick={() => onMoveSection(1)}><ArrowDown size={13} /></button>\n <button style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} title={chrome.deleteSection} disabled={sectionsLength <= 1} onClick={onDeleteSection}><Trash2 size={13} /></button>\n </>\n )}\n </div>\n </div>\n\n {!section.collapsed && (\n section.fields.length === 0 ? (\n <div style={styles.sectionEmpty}>{chrome.noFieldsInSection}</div>\n ) : (\n <div style={styles.fieldList}>\n {section.fields.map((field, idx) => (\n <FieldTicket\n key={field.id}\n field={field}\n idx={idx}\n sectionId={section.id}\n isSelected={field.id === selectedId}\n isDragOver={dragOverKey === `${section.id}:${idx}`}\n chrome={chrome}\n strings={strings}\n language={language}\n dragEnabled={features.dragReorder}\n onSelect={() => onSelectField(field.id)}\n onFieldChange={onFieldChange}\n onMoveField={onMoveField}\n onDuplicateField={onDuplicateField}\n onDeleteField={onDeleteField}\n dropZoneHandlers={getDropZoneHandlers(section.id, idx)}\n dragHandleProps={getDragHandleProps(section.id, idx)}\n />\n ))}\n </div>\n )\n )}\n </div>\n );\n}\n","import { ArrowUp, ArrowDown, Copy, Trash2, GripVertical } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, FormField } from \"../types\";\nimport { getMeta, FIELD_TYPE_CHROME_KEY, INPUT_SUBTYPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { WIDTH_PERCENT, ALIGN_MAP } from \"../constants/layout\";\nimport { styles } from \"../styles/styles\";\nimport { FieldBlock } from \"./fields/FieldBlock\";\n\nexport interface FieldTicketProps {\n field: FormField;\n idx: number;\n sectionId: string;\n isSelected: boolean;\n isDragOver: boolean;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n dragEnabled: boolean;\n onSelect: () => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n dropZoneHandlers: { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n dragHandleProps: { draggable: boolean; onDragStart: () => void };\n}\n\nexport function FieldTicket({\n field, idx, isSelected, isDragOver, chrome, strings, language, dragEnabled,\n onSelect, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n dropZoneHandlers, dragHandleProps,\n}: FieldTicketProps) {\n const meta = getMeta(field.type);\n const Icon = meta.icon;\n const widthPct = WIDTH_PERCENT[field.width || \"1/1\"];\n\n return (\n <div\n {...dropZoneHandlers}\n onClick={onSelect}\n className={`fb-field fb-field--${field.type} fb-field--${field.id}`}\n data-field-id={field.id}\n style={{\n ...styles.ticket,\n flex: `1 1 calc(${widthPct} - 10px)`,\n minWidth: 230,\n alignSelf: ALIGN_MAP[field.verticalAlign || \"top\"],\n ...(isSelected ? styles.ticketSelected : {}),\n ...(isDragOver ? styles.ticketDragOver : {}),\n }}\n >\n <div style={styles.ticketIndex}>{String(idx + 1).padStart(2, \"0\")}</div>\n <div style={styles.ticketPerforation} />\n <div style={styles.ticketBody}>\n <div style={styles.ticketTop}>\n {dragEnabled && <span {...dragHandleProps} style={{ cursor: \"grab\", display: \"flex\" }}><GripVertical size={14} color=\"var(--fb-muted)\" /></span>}\n <Icon size={13} color=\"var(--fb-primary)\" />\n <span style={styles.typeBadge}>\n {(chrome as Record<string, unknown>)[FIELD_TYPE_CHROME_KEY[field.type]] as string || field.type}\n {field.type === \"input\" && field.inputType && field.inputType !== \"text\" ? ` · ${(chrome as Record<string, unknown>)[INPUT_SUBTYPE_CHROME_KEY[field.inputType]]}` : \"\"}\n </span>\n {field.required && <span style={styles.requiredBadge}>{chrome.required}</span>}\n </div>\n {(field.width && field.width !== \"1/1\") || field.labelPosition === \"inline\" || field.verticalAlign !== \"top\" || field.hideLabel ? (\n <div style={styles.chipRow}>\n {field.width && field.width !== \"1/1\" && <span style={styles.miniBadge}>{chrome.width} {field.width}</span>}\n {field.labelPosition === \"inline\" && <span style={styles.miniBadge}>{chrome.inline}</span>}\n {field.verticalAlign !== \"top\" && <span style={styles.miniBadge}>{chrome[field.verticalAlign as \"middle\" | \"bottom\"]}</span>}\n {field.hideLabel && <span style={styles.miniBadge}>{chrome.hideLabel}</span>}\n </div>\n ) : null}\n <div style={{ marginTop: 8 }}>\n <FieldBlock field={field} lang={language} onFieldChange={onFieldChange} strings={strings} chrome={chrome} isBuild />\n </div>\n </div>\n <div style={styles.ticketActions} onClick={(e) => e.stopPropagation()}>\n <button style={styles.iconBtn} title={chrome.moveUp} onClick={() => onMoveField(field.id, -1)}><ArrowUp size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveDown} onClick={() => onMoveField(field.id, 1)}><ArrowDown size={13} /></button>\n <button style={styles.iconBtn} title={chrome.duplicate} onClick={() => onDuplicateField(field.id)}><Copy size={13} /></button>\n <button style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} title={chrome.delete} onClick={() => onDeleteField(field.id)}><Trash2 size={13} /></button>\n </div>\n </div>\n );\n}\n","import type { ChangeEvent, ElementType } from \"react\";\nimport { CircleAlert } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport type { StringsShape } from \"../../i18n/strings\";\nimport type { ButtonField, FieldPatch, FormField, ImageField, ParagraphField } from \"../../types\";\nimport { FONT_SIZE_OPTIONS, TAG_TO_ELEMENT } from \"../../constants/typography\";\nimport { getMeta } from \"../../constants/fieldTypes\";\nimport { ICON_LIBRARY, type IconComponent } from \"../../constants/icons\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\nimport { ImageBlock } from \"./ImageBlock\";\nimport { ButtonBlock } from \"./ButtonBlock\";\n\nexport interface FieldBlockProps {\n field: FormField;\n lang: string;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n strings: StringsShape;\n chrome?: ChromeShape;\n error?: string | null;\n isBuild?: boolean;\n onButtonAction?: (field: ButtonField) => void;\n}\n\nexport function FieldBlock({ field, lang, onFieldChange, strings, chrome, error, isBuild, onButtonAction }: FieldBlockProps) {\n if (field.type === \"image\") return <ImageBlock field={field} lang={lang} />;\n if (field.type === \"button\") return <ButtonBlock field={field} lang={lang} onAction={onButtonAction} />;\n\n if (field.type === \"paragraph\") {\n const fontPx = FONT_SIZE_OPTIONS.find((f) => f.value === field.fontSize)?.px || 14;\n const Tag = (TAG_TO_ELEMENT[field.tag] || \"p\") as ElementType;\n return (\n <Tag style={{ margin: 0, whiteSpace: \"pre-wrap\", fontSize: fontPx, fontWeight: field.fontWeight === \"bold\" ? 700 : 400, fontStyle: field.fontStyle === \"italic\" ? \"italic\" : \"normal\", textAlign: field.textAlign || \"left\", color: field.color || \"var(--fb-ink)\", lineHeight: 1.6 }}>\n {t(field.content, lang) || \"...\"}\n </Tag>\n );\n }\n\n const meta = getMeta(field.type);\n const IconComp = field.showIcon && field.displayIcon ? ICON_LIBRARY[field.displayIcon] : null;\n const isInline = field.labelPosition === \"inline\" && !meta.boolean;\n const labelText = t(field.label, lang);\n const showLabel = !meta.boolean && !field.hideLabel;\n\n return (\n <div>\n <div style={{ display: \"flex\", flexDirection: isInline ? \"row\" : \"column\", alignItems: isInline ? \"center\" : \"stretch\", gap: isInline ? 10 : 6 }}>\n {showLabel && (\n <label style={{ ...styles.previewLabel, marginBottom: isInline ? 0 : 6, flexShrink: 0, width: isInline ? 120 : \"auto\", display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}\n {labelText || (isBuild ? <span style={{ fontStyle: \"italic\", color: \"var(--fb-muted)\" }}>{chrome?.untitledField || \"Untitled field\"}</span> : \"\")}\n {field.required && <span style={{ color: \"var(--fb-danger)\" }}> *</span>}\n </label>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>{renderInteractive(field, lang, onFieldChange, IconComp, !!error, strings)}</div>\n </div>\n {error && (<div style={styles.fieldError}><CircleAlert size={12} /> {error}</div>)}\n </div>\n );\n}\n\ntype InteractiveField = Exclude<FormField, ImageField | ParagraphField | ButtonField>;\n\nfunction renderInteractive(\n field: InteractiveField,\n lang: string,\n onFieldChange: (fieldId: string, patch: FieldPatch) => void,\n IconComp: IconComponent | null,\n hasError: boolean,\n strings: StringsShape,\n) {\n const value = field.defaultValue;\n const set = (v: string | boolean | string[]) => onFieldChange(field.id, { defaultValue: v });\n const inputStyle = hasError ? { ...styles.realInput, ...styles.realInputError } : styles.realInput;\n const common = { style: inputStyle, placeholder: t(\"placeholder\" in field ? field.placeholder : undefined, lang), value: (value as string) || \"\", onChange: (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => set(e.target.value) };\n\n if (field.type === \"input\") {\n switch (field.inputType) {\n case \"number\": return <input type=\"number\" {...common} min={field.min ?? undefined} max={field.max ?? undefined} />;\n case \"email\": return <input type=\"email\" {...common} />;\n case \"password\": return <input type=\"password\" {...common} maxLength={field.maxLength || undefined} />;\n case \"phone\": return <input type=\"tel\" {...common} />;\n case \"date\": return <input type=\"date\" {...common} />;\n case \"time\": return <input type=\"time\" {...common} />;\n default: return <input type=\"text\" {...common} maxLength={field.maxLength || undefined} />;\n }\n }\n\n switch (field.type) {\n case \"textarea\":\n return <textarea {...common} rows={3} maxLength={field.maxLength || undefined} />;\n case \"select\":\n return (\n <select style={inputStyle} value={(value as string) || \"\"} onChange={(e) => set(e.target.value)}>\n <option value=\"\">{strings.selectPlaceholder}</option>\n {(field.options || []).map((o) => (<option key={o.value} value={o.value}>{t(o.label, lang)}</option>))}\n </select>\n );\n case \"radio\":\n return (<div style={{ display: \"flex\", gap: 16, flexWrap: \"wrap\", marginTop: 4 }}>{(field.options || []).map((o) => (<label key={o.value} style={styles.previewRadio}><input type=\"radio\" name={field.id} value={o.value} checked={value === o.value} onChange={(e) => set(e.target.value)} />{t(o.label, lang)}</label>))}</div>);\n case \"checkboxGroup\": {\n const vals = Array.isArray(value) ? value : [];\n return (\n <div style={{ display: \"flex\", gap: 16, flexWrap: \"wrap\", marginTop: 4 }}>\n {(field.options || []).map((o) => { const checked = vals.includes(o.value); return (<label key={o.value} style={styles.previewRadio}><input type=\"checkbox\" checked={checked} onChange={(e) => { const next = e.target.checked ? [...vals, o.value] : vals.filter((v) => v !== o.value); set(next); }} style={{ accentColor: \"var(--fb-primary)\" }} />{t(o.label, lang)}</label>); })}\n </div>\n );\n }\n case \"checkbox\":\n return (<label style={styles.previewRadio}><input type=\"checkbox\" checked={!!value} onChange={(e) => set(e.target.checked)} style={{ accentColor: \"var(--fb-primary)\" }} />{IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}{t(field.label, lang)}{field.required && <span style={{ color: \"var(--fb-danger)\" }}> *</span>}</label>);\n case \"toggle\":\n return (<label style={styles.previewRadio}><input type=\"checkbox\" checked={!!value} onChange={(e) => set(e.target.checked)} style={{ accentColor: \"var(--fb-primary)\" }} />{IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}{t(field.label, lang)}</label>);\n default:\n return <input type=\"text\" {...common} />;\n }\n}\n","import { AlignLeft, AlignCenter, AlignRight } from \"lucide-react\";\nimport type { ParagraphField } from \"../types\";\n\nexport const FONT_SIZE_OPTIONS: { value: ParagraphField[\"fontSize\"]; label: string; px: number }[] = [\n { value: \"sm\", label: \"S\", px: 12 }, { value: \"md\", label: \"M\", px: 14 },\n { value: \"lg\", label: \"L\", px: 18 }, { value: \"xl\", label: \"XL\", px: 24 },\n];\nexport const TEXT_ALIGN_OPTIONS: { value: ParagraphField[\"textAlign\"]; label: string; icon: typeof AlignLeft }[] = [\n { value: \"left\", label: \"\", icon: AlignLeft }, { value: \"center\", label: \"\", icon: AlignCenter }, { value: \"right\", label: \"\", icon: AlignRight },\n];\n\nexport const PARAGRAPH_TAG_OPTIONS: ParagraphField[\"tag\"][] = [\"h1\", \"h2\", \"h3\", \"p\", \"caption\"];\nexport const TAG_PRESETS: Record<ParagraphField[\"tag\"], { fontSize: ParagraphField[\"fontSize\"]; fontWeight: ParagraphField[\"fontWeight\"] }> = {\n h1: { fontSize: \"xl\", fontWeight: \"bold\" }, h2: { fontSize: \"lg\", fontWeight: \"bold\" },\n h3: { fontSize: \"md\", fontWeight: \"bold\" }, p: { fontSize: \"md\", fontWeight: \"normal\" },\n caption: { fontSize: \"sm\", fontWeight: \"normal\" },\n};\nexport const TAG_TO_ELEMENT: Record<ParagraphField[\"tag\"], string> = { h1: \"h1\", h2: \"h2\", h3: \"h3\", p: \"p\", caption: \"span\" };\nexport const TAG_CHROME_KEY: Partial<Record<ParagraphField[\"tag\"], string>> = { p: \"tagBody\", caption: \"tagCaption\" };\n","import {\n Type, Mail, Phone, Hash, Lock, AlignLeft, ChevronDown, Circle, CheckSquare,\n ListChecks, ToggleLeft, Calendar, Clock, User, MapPin, Building2, Globe,\n CreditCard, FileText, Star, Flag, Home, Briefcase,\n} from \"lucide-react\";\n\nexport const ICON_LIBRARY = {\n Type, Mail, Phone, Hash, Lock, AlignLeft, ChevronDown, Circle, CheckSquare,\n ListChecks, ToggleLeft, Calendar, Clock, User, MapPin, Building2, Globe,\n CreditCard, FileText, Star, Flag, Home, Briefcase,\n};\n\nexport type IconKey = keyof typeof ICON_LIBRARY;\nexport type IconComponent = (typeof ICON_LIBRARY)[IconKey];\n","import type { CSSProperties } from \"react\";\nimport { Image as ImageIcon } from \"lucide-react\";\nimport type { ImageField } from \"../../types\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\n// No fixed pixel dimensions — width follows the field's grid column, height from aspect-ratio.\nfunction buildImageStyle(field: ImageField): CSSProperties {\n const aspectRatio = field.shape === \"banner\" ? \"16 / 5\" : \"1 / 1\";\n return {\n width: \"100%\", aspectRatio, objectFit: \"cover\", display: \"block\",\n borderRadius: field.shape === \"circle\" ? \"50%\" : 8,\n background: \"var(--fb-canvas)\",\n };\n}\n\nexport function ImageBlock({ field, lang }: { field: ImageField; lang: string }) {\n const shapeStyle = buildImageStyle(field);\n const img = field.src ? (\n <img src={field.src} alt={t(field.alt, lang || \"en\")} style={shapeStyle} />\n ) : (\n <div style={{ ...shapeStyle, ...styles.imagePlaceholder }}><ImageIcon size={20} color=\"var(--fb-muted)\" /></div>\n );\n return field.link ? <a href={field.link} target=\"_blank\" rel=\"noreferrer\" style={{ display: \"block\" }}>{img}</a> : img;\n}\n","import type { SubmitStyle } from \"../types\";\n\nexport const SUBMIT_SIZE_OPTIONS: { value: SubmitStyle[\"size\"]; label: string }[] = [\n { value: \"sm\", label: \"S\" }, { value: \"md\", label: \"M\" }, { value: \"lg\", label: \"L\" },\n];\nexport const SUBMIT_SIZE_STYLES: Record<SubmitStyle[\"size\"], { padding: string; fontSize: number }> = {\n sm: { padding: \"7px 12px\", fontSize: 12.5 }, md: { padding: \"10px 16px\", fontSize: 13.5 }, lg: { padding: \"13px 22px\", fontSize: 15 },\n};\n\nexport function resolveSubmitStyle(style: Partial<SubmitStyle> | null | undefined) {\n const sizeStyle = SUBMIT_SIZE_STYLES[style?.size || \"md\"] || SUBMIT_SIZE_STYLES.md;\n return { ...sizeStyle, background: style?.color || \"var(--fb-primary)\" };\n}\n","import type { ButtonField } from \"../../types\";\nimport { resolveSubmitStyle } from \"../../constants/submitStyle\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\nexport function ButtonBlock({ field, lang, onAction }: { field: ButtonField; lang: string; onAction?: (field: ButtonField) => void }) {\n return (\n <button type=\"button\" style={{ ...styles.submitBtn, ...resolveSubmitStyle(field.buttonStyle) }} onClick={() => onAction?.(field)}>\n {t(field.label, lang) || \"...\"}\n </button>\n );\n}\n","import { Bold, Italic, X, Plus, Trash2 } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { FieldPatch, FormField, Option } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { getMeta, INPUT_SUBTYPES, INPUT_SUBTYPE_CHROME_KEY, IMAGE_SHAPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { IMAGE_SHAPES } from \"../constants/fieldTypes\";\nimport { PARAGRAPH_TAG_OPTIONS, TAG_CHROME_KEY, TAG_PRESETS, FONT_SIZE_OPTIONS, TEXT_ALIGN_OPTIONS } from \"../constants/typography\";\nimport { COLOR_SWATCHES, BUTTON_COLOR_SWATCHES } from \"../constants/colors\";\nimport { SUBMIT_SIZE_OPTIONS } from \"../constants/submitStyle\";\nimport { WIDTH_OPTIONS } from \"../constants/layout\";\nimport { ICON_LIBRARY } from \"../constants/icons\";\nimport { t, withLang } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { DefaultValueEditor } from \"./fields/DefaultValueEditor\";\n\nexport interface InspectorProps {\n selected: FormField | null;\n language: string;\n chrome: ChromeShape;\n features: ResolvedFeatures;\n onUpdateField: (patch: FieldPatch) => void;\n onDeleteField: () => void;\n onUpdateOption: (optIdx: number, patch: Partial<Option>) => void;\n onAddOption: () => void;\n onRemoveOption: (optIdx: number) => void;\n}\n\nexport function Inspector({ selected, language, chrome, features, onUpdateField, onDeleteField, onUpdateOption, onAddOption, onRemoveOption }: InspectorProps) {\n return (\n <div className=\"fb-inspector\" style={styles.inspector}>\n <div style={styles.panelHeading}>{chrome.properties}</div>\n {!selected ? (\n <div style={styles.inspectorEmpty}>{chrome.selectFieldHint}</div>\n ) : (\n <InspectorBody\n selected={selected}\n language={language}\n chrome={chrome}\n features={features}\n onUpdateField={onUpdateField}\n onDeleteField={onDeleteField}\n onUpdateOption={onUpdateOption}\n onAddOption={onAddOption}\n onRemoveOption={onRemoveOption}\n />\n )}\n </div>\n );\n}\n\nfunction InspectorBody({ selected, language, chrome, features, onUpdateField, onDeleteField, onUpdateOption, onAddOption, onRemoveOption }: Omit<InspectorProps, \"selected\"> & { selected: FormField }) {\n const meta = getMeta(selected.type);\n const f = selected as any;\n\n return (\n <div style={styles.inspectorBody}>\n {(!meta.isContent || selected.type === \"button\") && (\n <>\n <label style={styles.propLabel}>{selected.type === \"button\" ? chrome.buttonText : chrome.label}</label>\n <input style={styles.propInput} value={t(selected.label, language)} onChange={(e) => onUpdateField({ label: withLang(selected.label, language, e.target.value) })} />\n {!meta.isContent && (\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.hideLabel} onChange={(e) => onUpdateField({ hideLabel: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.hideLabel}</span>\n </label>\n )}\n </>\n )}\n\n {meta.hasSubtype && (\n <>\n <label style={styles.propLabel}>{chrome.inputType}</label>\n <select style={styles.propInput} value={f.inputType || \"text\"} onChange={(e) => onUpdateField({ inputType: e.target.value as FieldPatch[\"inputType\"] })}>\n {INPUT_SUBTYPES.map((s) => (<option key={s} value={s}>{chrome[INPUT_SUBTYPE_CHROME_KEY[s] as keyof ChromeShape] as string}</option>))}\n </select>\n </>\n )}\n\n {selected.type === \"paragraph\" && (\n <>\n <label style={styles.propLabel}>{chrome.content}</label>\n <textarea style={{ ...styles.propInput, minHeight: 70, resize: \"vertical\" }} value={t(selected.content, language)} onChange={(e) => onUpdateField({ content: withLang(selected.content, language, e.target.value) })} />\n\n {features.blockStyling && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.typography}</div>\n <label style={styles.propLabel}>{chrome.headingStyle}</label>\n <Segmented options={PARAGRAPH_TAG_OPTIONS.map((v) => ({ value: v, label: TAG_CHROME_KEY[v] ? (chrome[TAG_CHROME_KEY[v] as keyof ChromeShape] as string) : v.toUpperCase() }))} value={selected.tag || \"p\"} onChange={(v) => onUpdateField({ tag: v, ...TAG_PRESETS[v] })} />\n <label style={styles.propLabel}>{chrome.width}</label>\n <Segmented options={FONT_SIZE_OPTIONS} value={selected.fontSize || \"md\"} onChange={(v) => onUpdateField({ fontSize: v })} />\n <label style={styles.propLabel}>{chrome.style}</label>\n <div style={styles.styleToggleRow}>\n <button type=\"button\" style={selected.fontWeight === \"bold\" ? styles.styleToggleActive : styles.styleToggle} onClick={() => onUpdateField({ fontWeight: selected.fontWeight === \"bold\" ? \"normal\" : \"bold\" })}><Bold size={14} /></button>\n <button type=\"button\" style={selected.fontStyle === \"italic\" ? styles.styleToggleActive : styles.styleToggle} onClick={() => onUpdateField({ fontStyle: selected.fontStyle === \"italic\" ? \"normal\" : \"italic\" })}><Italic size={14} /></button>\n </div>\n <label style={styles.propLabel}>{chrome.align}</label>\n <Segmented options={TEXT_ALIGN_OPTIONS} value={selected.textAlign || \"left\"} onChange={(v) => onUpdateField({ textAlign: v })} />\n <label style={styles.propLabel}>{chrome.color}</label>\n <div style={styles.swatchRow}>\n {COLOR_SWATCHES.map((c) => (<button key={c || \"default\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-ink)\", ...(selected.color === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateField({ color: c })} />))}\n <input type=\"color\" value={selected.color || \"#1B1E24\"} onChange={(e) => onUpdateField({ color: e.target.value })} style={styles.colorPickerInput} />\n </div>\n </>\n )}\n </>\n )}\n\n {selected.type === \"image\" && (\n <>\n <label style={styles.propLabel}>{chrome.imageUrl}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.src || \"\"} onChange={(e) => onUpdateField({ src: e.target.value })} />\n <p style={styles.helperText}>{chrome.imageUrlHelper}</p>\n <label style={styles.propLabel}>{chrome.altText}</label>\n <input style={styles.propInput} value={t(selected.alt, language)} onChange={(e) => onUpdateField({ alt: withLang(selected.alt, language, e.target.value) })} />\n <label style={styles.propLabel}>{chrome.linkOptional}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.link || \"\"} onChange={(e) => onUpdateField({ link: e.target.value })} />\n <label style={styles.propLabel}>{chrome.shape}</label>\n <Segmented options={IMAGE_SHAPES.map((v) => ({ value: v, label: chrome[IMAGE_SHAPE_CHROME_KEY[v] as keyof ChromeShape] as string }))} value={selected.shape || \"square\"} onChange={(v) => onUpdateField({ shape: v })} />\n <p style={styles.helperText}>Fills the field's own width (set below under Layout) and scales height automatically — always responsive, never overflows.</p>\n </>\n )}\n\n {selected.type === \"button\" && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.buttonActionTitle}</div>\n <label style={styles.propLabel}>{chrome.buttonAction}</label>\n <Segmented options={[{ value: \"link\", label: chrome.actionLink }, { value: \"submit\", label: chrome.actionSubmit }]} value={selected.action || \"submit\"} onChange={(v) => onUpdateField({ action: v as FieldPatch[\"action\"] })} />\n\n {selected.action === \"link\" ? (\n <>\n <label style={styles.propLabel}>{chrome.linkOptional}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.href || \"\"} onChange={(e) => onUpdateField({ href: e.target.value })} />\n <label style={styles.propLabel}>{chrome.openIn}</label>\n <Segmented options={[{ value: \"_self\", label: chrome.sameTab }, { value: \"_blank\", label: chrome.newTab }]} value={selected.target || \"_self\"} onChange={(v) => onUpdateField({ target: v as FieldPatch[\"target\"] })} />\n </>\n ) : (\n <>\n <label style={styles.propLabel}>{chrome.submitScope}</label>\n <Segmented options={[{ value: \"section\", label: chrome.thisSection }, { value: \"form\", label: chrome.wholeForm }]} value={selected.submitScope || \"form\"} onChange={(v) => onUpdateField({ submitScope: v as FieldPatch[\"submitScope\"] })} />\n </>\n )}\n\n {features.blockStyling && (\n <>\n <label style={styles.propLabel}>{chrome.color}</label>\n <div style={styles.swatchRow}>\n {BUTTON_COLOR_SWATCHES.map((c) => (<button key={c || \"default\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-primary)\", ...((selected.buttonStyle?.color || \"\") === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateField({ buttonStyle: { ...selected.buttonStyle, color: c } })} />))}\n <input type=\"color\" value={selected.buttonStyle?.color || \"#5B5FEF\"} onChange={(e) => onUpdateField({ buttonStyle: { ...selected.buttonStyle, color: e.target.value } })} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.buttonSize}</label>\n <Segmented options={SUBMIT_SIZE_OPTIONS} value={selected.buttonStyle?.size || \"md\"} onChange={(v) => onUpdateField({ buttonStyle: { ...selected.buttonStyle, size: v } })} />\n </>\n )}\n </>\n )}\n\n {meta.placeholder && (\n <>\n <label style={styles.propLabel}>{chrome.placeholder}</label>\n <input style={styles.propInput} value={t(f.placeholder, language)} onChange={(e) => onUpdateField({ placeholder: withLang(f.placeholder, language, e.target.value) })} />\n </>\n )}\n\n {selected.type === \"input\" && (selected.inputType === \"text\" || selected.inputType === \"password\" || !selected.inputType) && (\n <><label style={styles.propLabel}>{chrome.maxLength}</label><input type=\"number\" style={styles.propInput} placeholder={chrome.noLimit} value={selected.maxLength || \"\"} onChange={(e) => onUpdateField({ maxLength: e.target.value ? Number(e.target.value) : null })} /></>\n )}\n {selected.type === \"input\" && selected.inputType === \"number\" && (\n <>\n <label style={styles.propLabel}>{chrome.minValue}</label><input type=\"number\" style={styles.propInput} value={selected.min ?? \"\"} onChange={(e) => onUpdateField({ min: e.target.value === \"\" ? null : Number(e.target.value) })} />\n <label style={styles.propLabel}>{chrome.maxValue}</label><input type=\"number\" style={styles.propInput} value={selected.max ?? \"\"} onChange={(e) => onUpdateField({ max: e.target.value === \"\" ? null : Number(e.target.value) })} />\n </>\n )}\n {selected.type === \"textarea\" && (\n <><label style={styles.propLabel}>{chrome.maxLength}</label><input type=\"number\" style={styles.propInput} placeholder={chrome.noLimit} value={selected.maxLength || \"\"} onChange={(e) => onUpdateField({ maxLength: e.target.value ? Number(e.target.value) : null })} /></>\n )}\n\n {meta.options && (\n <>\n <label style={styles.propLabel}>{chrome.options}</label>\n <div style={styles.optionList}>\n {((f.options || []) as Option[]).map((opt, i) => (\n <div key={i} style={styles.optionRow}>\n <input style={styles.optionInput} value={t(opt.label, language)} onChange={(e) => onUpdateOption(i, { label: withLang(opt.label, language, e.target.value) })} />\n <button style={styles.iconBtn} onClick={() => onRemoveOption(i)} disabled={(f.options || []).length <= 1}><X size={13} /></button>\n </div>\n ))}\n <button style={styles.addOptionBtn} onClick={onAddOption}><Plus size={13} /> {chrome.addOption}</button>\n </div>\n </>\n )}\n\n <DefaultValueEditor field={selected} meta={meta} lang={language} chrome={chrome} onChange={onUpdateField} />\n\n {!meta.isContent && (\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.required} onChange={(e) => onUpdateField({ required: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.requiredField}</span>\n </label>\n )}\n\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.layout}</div>\n <label style={styles.propLabel}>{chrome.width}</label>\n <Segmented options={WIDTH_OPTIONS.map((o) => ({ ...o, label: o.labelKey ? chrome[o.labelKey as keyof ChromeShape] as string : o.label || \"\" }))} value={selected.width || \"1/1\"} onChange={(v) => onUpdateField({ width: v })} />\n <label style={styles.propLabel}>{chrome.verticalAlign}</label>\n <Segmented options={[{ value: \"top\", label: chrome.top }, { value: \"middle\", label: chrome.middle }, { value: \"bottom\", label: chrome.bottom }]} value={selected.verticalAlign || \"top\"} onChange={(v) => onUpdateField({ verticalAlign: v as FieldPatch[\"verticalAlign\"] })} />\n {!meta.boolean && !meta.isContent && (\n <><label style={styles.propLabel}>{chrome.labelPosition}</label><Segmented options={[{ value: \"top\", label: chrome.above }, { value: \"inline\", label: chrome.inline }]} value={selected.labelPosition || \"top\"} onChange={(v) => onUpdateField({ labelPosition: v as FieldPatch[\"labelPosition\"] })} /></>\n )}\n\n {!meta.isContent && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.icon}</div>\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.showIcon} onChange={(e) => onUpdateField({ showIcon: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.showIcon}</span>\n </label>\n {selected.showIcon && (\n <div style={styles.iconGrid}>\n {Object.keys(ICON_LIBRARY).map((key) => {\n const IconComp = ICON_LIBRARY[key as keyof typeof ICON_LIBRARY];\n const active = selected.displayIcon === key;\n return (<button key={key} type=\"button\" title={key} style={active ? styles.iconGridBtnActive : styles.iconGridBtn} onClick={() => onUpdateField({ displayIcon: key as FieldPatch[\"displayIcon\"] })}><IconComp size={15} /></button>);\n })}\n </div>\n )}\n </>\n )}\n\n <div style={styles.inspectorDivider} />\n <button style={styles.deleteFieldBtn} onClick={onDeleteField}><Trash2 size={13} /> {chrome.deleteField}</button>\n </div>\n );\n}\n","import type { ChromeShape } from \"../../i18n/chrome\";\nimport type { FieldPatch, FormField } from \"../../types\";\nimport type { FieldTypeMeta } from \"../../constants/fieldTypes\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface DefaultValueEditorProps {\n field: FormField;\n meta: FieldTypeMeta;\n lang: string;\n chrome: ChromeShape;\n onChange: (patch: FieldPatch) => void;\n}\n\nexport function DefaultValueEditor({ field, meta, lang, chrome, onChange }: DefaultValueEditorProps) {\n if (meta.isContent) return null;\n const f = field as any;\n\n if (meta.boolean) {\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <button style={styles.toggleRow} onClick={() => onChange({ defaultValue: !f.defaultValue })}>\n <span style={{ ...styles.toggleTrack, background: f.defaultValue ? \"var(--fb-primary)\" : \"var(--fb-border)\" }}><span style={{ ...styles.toggleThumb, transform: f.defaultValue ? \"translateX(16px)\" : \"translateX(0)\" }} /></span>\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{f.defaultValue ? chrome.checked : chrome.unchecked}</span>\n </button>\n </>\n );\n }\n\n if (meta.multiValue) {\n const selectedVals: string[] = f.defaultValue || [];\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultChecked}</label>\n <div style={styles.optionList}>\n {(f.options || []).map((o: any) => {\n const checked = selectedVals.includes(o.value);\n return (\n <label key={o.value} style={{ ...styles.previewRadio, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={checked} onChange={(e) => { const next = e.target.checked ? [...selectedVals, o.value] : selectedVals.filter((v) => v !== o.value); onChange({ defaultValue: next }); }} style={{ accentColor: \"var(--fb-primary)\" }} />\n {t(o.label, lang)}\n </label>\n );\n })}\n </div>\n </>\n );\n }\n\n if (meta.options) {\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <select style={styles.propInput} value={f.defaultValue || \"\"} onChange={(e) => onChange({ defaultValue: e.target.value })}>\n <option value=\"\">{chrome.none}</option>\n {(f.options || []).map((o: any) => (<option key={o.value} value={o.value}>{t(o.label, lang)}</option>))}\n </select>\n </>\n );\n }\n\n const htmlType =\n field.type === \"input\" && field.inputType === \"number\" ? \"number\" :\n field.type === \"input\" && field.inputType === \"date\" ? \"date\" :\n field.type === \"input\" && field.inputType === \"time\" ? \"time\" : \"text\";\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <input type={htmlType} style={styles.propInput} value={f.defaultValue || \"\"} onChange={(e) => onChange({ defaultValue: e.target.value })} />\n </>\n );\n}\n","import { useState } from \"react\";\nimport { PartyPopper, X, CircleAlert } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { ButtonField, FieldPatch, LocalizedString, Section, SubmitPayload } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { buildDeviceOptions, effectiveWidth, WIDTH_PERCENT, ALIGN_MAP } from \"../constants/layout\";\nimport { getMeta } from \"../constants/fieldTypes\";\nimport { validateField } from \"../lib/validate\";\nimport { formatValue } from \"../lib/format\";\nimport { collectFieldValues } from \"../lib/collectSubmission\";\nimport { t } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { FieldBlock } from \"./fields/FieldBlock\";\n\nexport interface PreviewPaneProps {\n title: LocalizedString;\n sections: Section[];\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n language: string;\n strings: StringsShape;\n chrome: ChromeShape;\n baseMaxWidth: number;\n features: ResolvedFeatures;\n onSubmit?: (payload: SubmitPayload) => void;\n}\n\ninterface SubmittedRow {\n label: string;\n value: string;\n}\n\nexport function PreviewPane({ title, sections, onFieldChange, language, strings, chrome, baseMaxWidth, features, onSubmit }: PreviewPaneProps) {\n const [device, setDevice] = useState<\"laptop\" | \"tablet\" | \"mobile\">(\"laptop\");\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submitted, setSubmitted] = useState<SubmittedRow[] | null>(null);\n const [attemptedButtonId, setAttemptedButtonId] = useState<string | null>(null);\n const deviceOptions = buildDeviceOptions(baseMaxWidth, chrome);\n const maxWidth = (deviceOptions.find((d) => d.value === device) || deviceOptions[0]).maxWidth;\n const allFields = sections.flatMap((s) => s.fields);\n\n function runValidation(fields: typeof allFields) {\n const errs: Record<string, string> = {};\n fields.forEach((f) => {\n const e = validateField(f, (f as any).defaultValue, strings);\n if (e) errs[f.id] = e;\n });\n return errs;\n }\n\n function buildSectionsBreakdown() {\n return sections.map((s) => ({ sectionId: s.id, values: collectFieldValues(s.fields) }));\n }\n\n function handleSubmitAll(buttonId: string) {\n const errs = runValidation(allFields);\n setErrors(errs);\n setAttemptedButtonId(buttonId);\n if (Object.keys(errs).length > 0) { setSubmitted(null); return; }\n setSubmitted(allFields.filter((f) => !getMeta(f.type).isContent).map((f) => ({ label: t(f.label, language), value: formatValue(f, language) })));\n const sectionsBreakdown = buildSectionsBreakdown();\n const all = collectFieldValues(allFields);\n onSubmit?.({ buttonId, scope: \"form\", values: all, sections: sectionsBreakdown, all });\n }\n\n function handleSubmitSection(section: Section, buttonId: string) {\n const errs = runValidation(section.fields);\n setErrors((prev) => {\n const next = { ...prev };\n section.fields.forEach((f) => delete next[f.id]);\n return { ...next, ...errs };\n });\n setAttemptedButtonId(buttonId);\n if (Object.keys(errs).length > 0) { setSubmitted(null); return; }\n setSubmitted(section.fields.filter((f) => !getMeta(f.type).isContent).map((f) => ({ label: t(f.label, language), value: formatValue(f, language) })));\n const sectionsBreakdown = buildSectionsBreakdown();\n const all = collectFieldValues(allFields);\n onSubmit?.({ buttonId, scope: \"section\", sectionId: section.id, values: collectFieldValues(section.fields), sections: sectionsBreakdown, all });\n }\n\n function handleButtonAction(field: ButtonField) {\n if (field.action === \"link\") {\n if (field.href) window.open(field.href, field.target === \"_blank\" ? \"_blank\" : \"_self\", field.target === \"_blank\" ? \"noopener,noreferrer\" : undefined);\n return;\n }\n if (field.submitScope === \"section\") {\n const section = sections.find((s) => s.fields.some((f) => f.id === field.id));\n if (section) handleSubmitSection(section, field.id);\n } else {\n handleSubmitAll(field.id);\n }\n }\n\n return (\n <div style={styles.previewWrap}>\n <div style={{ width: \"100%\", maxWidth, display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\n {features.deviceToggle && (\n <div style={styles.previewToolbar}><Segmented options={deviceOptions} value={device} onChange={setDevice} /></div>\n )}\n <div className=\"fb-form\" style={{ ...styles.previewCard, maxWidth, width: \"100%\" }}>\n {features.formTitle && <h2 style={styles.previewTitle}>{t(title, language)}</h2>}\n {allFields.length === 0 && <p style={{ color: \"var(--fb-muted)\", fontSize: 14 }}>{strings.addFieldsHint}</p>}\n\n {sections.map((section) => {\n return (\n <div key={section.id} className=\"fb-section\" data-section-id={section.id} style={{ background: section.background || \"transparent\", padding: section.background ? 16 : 0, borderRadius: section.background ? 10 : 0, marginBottom: \"var(--fb-space-section)\" }}>\n {t(section.title, language) && <h3 style={styles.sectionRuntimeTitle}>{t(section.title, language)}</h3>}\n <div style={styles.previewGrid}>\n {section.fields.map((field) => {\n const width = effectiveWidth(field.width, device);\n const flexBasis = `1 1 calc(${WIDTH_PERCENT[width]} - 14px)`;\n return (\n <div key={field.id} className={`fb-field fb-field--${field.type} fb-field--${field.id}`} data-field-id={field.id} style={{ flex: flexBasis, minWidth: 0, alignSelf: ALIGN_MAP[field.verticalAlign || \"top\"] }}>\n <FieldBlock field={field} lang={language} onFieldChange={onFieldChange} strings={strings} chrome={chrome} error={errors[field.id]} onButtonAction={handleButtonAction} />\n {field.type === \"button\" && field.id === attemptedButtonId && Object.keys(errors).length > 0 && (\n <p style={styles.formErrorNote}><CircleAlert size={13} /> {strings.fixErrors}</p>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {submitted && (\n <div style={styles.modalOverlay} onClick={() => setSubmitted(null)}>\n <div style={{ ...styles.modal, maxWidth: 420 }} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14, display: \"flex\", alignItems: \"center\", gap: 7 }}><PartyPopper size={15} color=\"var(--fb-primary)\" /> {strings.submittedTitle}</span>\n <button style={styles.iconBtn} onClick={() => setSubmitted(null)}><X size={16} /></button>\n </div>\n <div style={{ padding: 16 }}>\n <p style={{ fontSize: 12.5, color: \"var(--fb-muted)\", marginTop: 0 }}>{strings.submittedBody}</p>\n <div style={styles.submittedList}>\n {submitted.map((row, i) => (<div key={i} style={styles.submittedRow}><span style={styles.submittedLabel}>{row.label}</span><span style={styles.submittedValue}>{row.value}</span></div>))}\n </div>\n <button style={{ ...styles.primaryBtn, width: \"100%\", justifyContent: \"center\", marginTop: 14 }} onClick={() => setSubmitted(null)}>{strings.close}</button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { FormField } from \"../types\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport { getMeta } from \"../constants/fieldTypes\";\n\nexport function validateField(field: FormField, value: unknown, strings: StringsShape): string | null {\n const meta = getMeta(field.type);\n if (meta.isContent) return null;\n const isEmpty =\n value === undefined || value === null || value === \"\" ||\n (Array.isArray(value) && value.length === 0) ||\n (!!meta.boolean && !!field.required && value !== true);\n if (field.required && isEmpty) return strings.requiredError;\n if (isEmpty) return null;\n if (field.type === \"input\" && field.inputType === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value))) return strings.invalidEmail;\n if (field.type === \"input\" && field.inputType === \"phone\" && !/^[0-9+\\-\\s()]{7,20}$/.test(String(value))) return strings.invalidPhone;\n if (field.type === \"input\" && field.inputType === \"number\") {\n const num = Number(value);\n if (field.min !== undefined && field.min !== null && (field.min as unknown as string) !== \"\" && num < Number(field.min)) return strings.tooSmall(field.min);\n if (field.max !== undefined && field.max !== null && (field.max as unknown as string) !== \"\" && num > Number(field.max)) return strings.tooLarge(field.max);\n }\n if (\n (field.type === \"textarea\" || (field.type === \"input\" && ![\"number\", \"date\", \"time\"].includes(field.inputType))) &&\n field.maxLength && String(value).length > field.maxLength\n ) {\n return strings.tooLong(field.maxLength);\n }\n return null;\n}\n","import type { FormField } from \"../types\";\nimport { t } from \"./bilingual\";\n\nexport function formatValue(field: FormField, lang: string): string {\n const v = (field as any).defaultValue;\n if (Array.isArray(v)) {\n if (v.length === 0) return \"—\";\n return v.map((val: string) => t((field as any).options?.find((o: any) => o.value === val)?.label, lang) || val).join(\", \");\n }\n if (typeof v === \"boolean\") return v ? \"Yes\" : \"No\";\n if ((field as any).options && v) return t((field as any).options.find((o: any) => o.value === v)?.label, lang) || v;\n if (v === undefined || v === null || v === \"\") return \"—\";\n return String(v);\n}\n","import type { FormField } from \"../types\";\nimport { getMeta } from \"../constants/fieldTypes\";\n\n/** Raw (not display-formatted) `defaultValue` per non-content field, keyed by field id. */\nexport function collectFieldValues(fields: FormField[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n fields.forEach((f) => {\n if (getMeta(f.type).isContent) return;\n values[f.id] = (f as any).defaultValue;\n });\n return values;\n}\n","import { Check, ClipboardCopy, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface JsonModalProps {\n chrome: ChromeShape;\n jsonString: string;\n copied: boolean;\n onCopy: () => void;\n onClose: () => void;\n}\n\nexport function JsonModal({ chrome, jsonString, copied, onCopy, onClose }: JsonModalProps) {\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={styles.modal} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.formJson} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.formJson}</span>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button type=\"button\" style={styles.ghostBtn} onClick={onCopy}>{copied ? <Check size={14} /> : <ClipboardCopy size={14} />}{copied ? chrome.copied : chrome.copy}</button>\n <button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button>\n </div>\n </div>\n <pre style={styles.jsonPre}>{jsonString}</pre>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Modal keyboard/focus behaviour shared by every dialog: Escape closes it, Tab is\n * trapped inside the panel, focus moves in on mount and back to the opener on close.\n * Attach the returned ref to the dialog panel element.\n */\nexport function useModalA11y<T extends HTMLElement>(onClose: () => void) {\n const panelRef = useRef<T>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n const panel = panelRef.current;\n\n const focusables = () => Array.from(panel?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n // Respect an explicit autoFocus inside the panel, else focus the first control.\n if (panel && !panel.contains(document.activeElement)) {\n (panel.querySelector<HTMLElement>(\"[autofocus]\") ?? focusables()[0] ?? panel).focus();\n }\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onCloseRef.current();\n return;\n }\n if (e.key !== \"Tab\") return;\n const items = focusables();\n if (items.length === 0) {\n e.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || !panel?.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n opener?.focus?.();\n };\n }, []);\n\n return panelRef;\n}\n","import { AlertCircle, Loader2, Trash2, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport type { SavedFormMeta } from \"../../types\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface TemplatesModalProps {\n chrome: ChromeShape;\n savedForms: SavedFormMeta[];\n currentFormId: string | null;\n /** false = apply-only: no delete, action button reads \"Apply\". */\n manage: boolean;\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n onOpen: (id: string) => void;\n onDelete: (id: string) => void;\n onClose: () => void;\n}\n\nexport function TemplatesModal({ chrome, savedForms, currentFormId, manage, templateState, onOpen, onDelete, onClose }: TemplatesModalProps) {\n const busy = templateState === \"loading\";\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={styles.modal} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.templates} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}><span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.templates}</span><button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button></div>\n <div style={styles.libraryBody}>\n {savedForms.length === 0 ? (\n <div style={styles.inspectorEmpty}>{manage ? chrome.noTemplates : chrome.noTemplatesReadonly}</div>\n ) : (\n savedForms.map((f) => (\n <div key={f.id} style={styles.libraryRow}>\n <div style={{ minWidth: 0 }}>\n <div style={styles.libraryRowTitle}>{f.title}{f.id === currentFormId && <span style={styles.currentBadge}>{chrome.current}</span>}</div>\n <div style={styles.libraryRowMeta}>{chrome.updated} {new Date(f.updatedAt).toLocaleString()}</div>\n </div>\n <div style={{ display: \"flex\", gap: 6, flexShrink: 0 }}>\n <button type=\"button\" style={styles.ghostBtn} disabled={busy} onClick={() => onOpen(f.id)}>\n {busy && <Loader2 size={12} className=\"spin\" />} {manage ? chrome.open : chrome.applyTemplate}\n </button>\n {manage && (\n <button type=\"button\" style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} disabled={busy} title={chrome.delete} onClick={() => onDelete(f.id)}><Trash2 size={13} /></button>\n )}\n </div>\n </div>\n ))\n )}\n {templateState === \"error\" && (\n <div style={{ ...styles.libraryRowMeta, color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 5, marginTop: 4 }}>\n <AlertCircle size={12} /> {chrome.templateLoadFailed}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { AlertCircle, Loader2, Save, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface SaveAsModalProps {\n chrome: ChromeShape;\n suggestedName: string;\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n onSave: (name: string) => void;\n onClose: () => void;\n}\n\nexport function SaveAsModal({ chrome, suggestedName, templateState, onSave, onClose }: SaveAsModalProps) {\n const [name, setName] = useState(suggestedName);\n const saving = templateState === \"saving\";\n const canSave = !!name.trim() && !saving;\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={{ ...styles.modal, maxWidth: 380 }} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.saveForm} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}><span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.saveForm}</span><button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button></div>\n <div style={{ padding: 16 }}>\n <label style={styles.propLabel}>{chrome.formName}</label>\n <input autoFocus aria-label={chrome.formName} style={styles.propInput} value={name} onChange={(e) => setName(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && canSave && onSave(name.trim())} />\n <button type=\"button\" style={{ ...styles.primaryBtn, width: \"100%\", justifyContent: \"center\", marginTop: 14 }} disabled={!canSave} onClick={() => onSave(name.trim())}>\n {saving ? <Loader2 size={14} className=\"spin\" /> : <Save size={14} />} {chrome.saveToLibrary}\n </button>\n {templateState === \"error\" && (\n <div style={{ fontSize: 12, color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 5, marginTop: 10 }}>\n <AlertCircle size={12} /> {chrome.templateSaveFailed}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface ConfirmModalProps {\n chrome: ChromeShape;\n title: string;\n message: string;\n /** Omit for a plain acknowledgement notice (single OK button). */\n onConfirm?: () => void;\n confirmLabel?: string;\n tone?: \"default\" | \"danger\";\n onClose: () => void;\n}\n\n/** In-widget replacement for window.alert / window.confirm. */\nexport function ConfirmModal({ chrome, title, message, onConfirm, confirmLabel, tone = \"default\", onClose }: ConfirmModalProps) {\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n const confirmStyle =\n tone === \"danger\"\n ? { ...styles.primaryBtn, background: \"var(--fb-danger)\", borderColor: \"var(--fb-danger)\" }\n : styles.primaryBtn;\n\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={{ ...styles.modal, maxWidth: 380 }} role=\"alertdialog\" aria-modal=\"true\" aria-label={title} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14 }}>{title}</span>\n <button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button>\n </div>\n <div style={{ padding: 16 }}>\n <p style={{ margin: 0, fontSize: 13, lineHeight: 1.5, color: \"var(--fb-ink)\" }}>{message}</p>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n {onConfirm ? (\n <>\n <button type=\"button\" autoFocus style={styles.ghostBtn} onClick={onClose}>{chrome.cancel}</button>\n <button type=\"button\" style={confirmStyle} onClick={onConfirm}>{confirmLabel ?? chrome.confirm}</button>\n </>\n ) : (\n <button type=\"button\" autoFocus style={styles.primaryBtn} onClick={onClose}>{chrome.dismiss}</button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","export const css = `\n * { box-sizing: border-box; }\n button { font-family: inherit; cursor: pointer; }\n input, textarea, select { font-family: inherit; }\n @keyframes fb-spin { to { transform: rotate(360deg); } }\n .spin { animation: fb-spin 0.8s linear infinite; }\n /* Cap at viewport height so the widget scrolls internally; dvh upgrade is ignored where unsupported. */\n .fb-root { max-height: 100vh; max-height: 100dvh; }\n\n /* Toolbar's active-template label is nice-to-have — drop it first when width is tight. */\n @media (max-width: 600px) { .fb-template-tag { display: none; } }\n\n /* Under 720px: Palette/Inspector become drawers over Canvas, toggled by .fb-mobile-bar,\n tracked by .fb-work-area[data-mobile-panel], dismissed via .fb-mobile-backdrop. */\n .fb-mobile-bar { display: none; align-items: center; gap: 6px; padding: 6px 10px; border-bottom: 1px solid var(--fb-border); background: var(--fb-surface); flex-shrink: 0; }\n .fb-mobile-btn { display: flex; align-items: center; gap: 6px; padding: 6px 10px; border-radius: 7px; border: 1px solid var(--fb-border); background: var(--fb-surface); color: var(--fb-muted); font-size: 12.5px; font-weight: 600; }\n .fb-mobile-btn[aria-pressed=\"true\"] { border-color: var(--fb-primary); background: var(--fb-primary-soft); color: var(--fb-primary); }\n .fb-mobile-backdrop { display: none; }\n @media (max-width: 720px) {\n .fb-mobile-bar { display: flex; }\n .fb-work-area { flex-direction: column !important; min-height: 0; }\n .fb-canvas-area { position: relative; overflow: hidden; }\n .fb-canvas { width: 100%; }\n .fb-mobile-backdrop { display: block; position: absolute; inset: 0; z-index: 6; background: rgba(15,16,20,0.35); }\n .fb-palette, .fb-inspector {\n position: absolute; top: 0; bottom: 0; z-index: 7;\n width: min(260px, 80vw) !important; max-height: none !important;\n border: none !important;\n box-shadow: 0 0 24px rgba(0,0,0,0.18);\n transition: transform 0.18s ease;\n }\n .fb-palette { left: 0; transform: translateX(-100%); }\n .fb-inspector { right: 0; transform: translateX(100%); }\n .fb-work-area[data-mobile-panel=\"palette\"] .fb-palette,\n .fb-work-area[data-mobile-panel=\"inspector\"] .fb-inspector { transform: translateX(0); }\n }\n`;\n","import type { Theme } from \"../types\";\nimport { DEFAULT_THEME } from \"./defaultTheme\";\n\n/** A ready-made dark palette — pass as the `theme` prop for a dark-mode `<FormBuilder />`. */\nexport const DARK_THEME: Theme = {\n primary: \"#8B8FF5\", primarySoft: \"#262A45\", danger: \"#F0715B\", dangerSoft: \"#3A2420\",\n ink: \"#EDEEF2\", muted: \"#9096A8\", border: \"#2E313D\", surface: \"#1A1B23\",\n canvas: \"#121319\", pageBackground: \"#1A1B23\",\n layout: DEFAULT_THEME.layout,\n};\n"],"mappings":"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","names":["import_react","import_lucide_react","ImageIcon","t","document","t","import_react","import_react","document","import_react","document","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_jsx_runtime","ImageIcon","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","FormBuilder"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/FormBuilder.tsx","../src/constants/fieldTypes.ts","../src/i18n/languages.ts","../src/i18n/strings.ts","../src/i18n/chrome.ts","../src/lib/bilingual.ts","../src/lib/color.ts","../src/lib/storage/compress.ts","../src/lib/storage/localStorageAdapter.ts","../src/lib/id.ts","../src/lib/fieldDefaults.ts","../src/lib/migrate.ts","../src/lib/template.ts","../src/lib/features.ts","../src/hooks/useTheme.ts","../src/theme/defaultTheme.ts","../src/hooks/useFormDocument.ts","../src/hooks/usePersistence.ts","../src/lib/storage/keys.ts","../src/lib/compact.ts","../src/hooks/useTemplateClipboard.ts","../src/hooks/useDragReorder.ts","../src/components/Toolbar.tsx","../src/styles/styles.ts","../src/components/LanguageToggle.tsx","../src/components/Palette.tsx","../src/components/Segmented.tsx","../src/components/DesignPanel.tsx","../src/constants/colors.ts","../src/constants/layout.ts","../src/components/Canvas.tsx","../src/components/SectionCard.tsx","../src/components/FieldTicket.tsx","../src/components/fields/FieldBlock.tsx","../src/constants/typography.ts","../src/constants/icons.ts","../src/components/fields/ImageBlock.tsx","../src/constants/submitStyle.ts","../src/components/fields/ButtonBlock.tsx","../src/components/Inspector.tsx","../src/components/fields/DefaultValueEditor.tsx","../src/components/PreviewPane.tsx","../src/lib/validate.ts","../src/lib/format.ts","../src/lib/collectSubmission.ts","../src/components/modals/JsonModal.tsx","../src/hooks/useModalA11y.ts","../src/components/modals/TemplatesModal.tsx","../src/components/modals/SaveAsModal.tsx","../src/components/modals/ConfirmModal.tsx","../src/styles/globalCss.ts","../src/theme/darkTheme.ts"],"sourcesContent":["export { default as FormBuilder, default } from \"./FormBuilder\";\nexport { localStorageAdapter } from \"./lib/storage/localStorageAdapter\";\nexport { DEFAULT_THEME } from \"./theme/defaultTheme\";\nexport { DARK_THEME } from \"./theme/darkTheme\";\nexport { serializeTemplate, parseTemplate } from \"./lib/template\";\nexport { DOCUMENT_VERSION } from \"./lib/migrate\";\nexport { compactDocument } from \"./lib/compact\";\nexport { DRAFT_KEY, INDEX_KEY, CLIPBOARD_KEY, formKey, savedFormId } from \"./lib/storage/keys\";\nexport type {\n FormBuilderProps, StorageAdapter, Theme, ThemeLayout, ThemeOverrides,\n FormField, FieldPatch, FieldType, Option, Section, FormDocument, DocumentFields,\n SavedFormMeta, LocalizedString, LanguageOption, ChromeShape, StringsShape,\n InputField, TextareaField, SelectField, RadioField, CheckboxGroupField,\n CheckboxField, ToggleField, ParagraphField, ImageField, SubmitStyle,\n SubmitPayload, FormBuilderHandle, FormBuilderFeatures, ContentBlockType, InputFieldType,\n FormTemplate, TemplateChange,\n} from \"./types\";\n","\"use client\";\n\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport { Loader2, Menu, SlidersHorizontal } from \"lucide-react\";\nimport type { FormBuilderHandle, FormBuilderProps } from \"./types\";\nimport { getMeta } from \"./constants/fieldTypes\";\nimport { DEFAULT_LANGUAGES } from \"./i18n/languages\";\nimport { DEFAULT_STRINGS } from \"./i18n/strings\";\nimport { CHROME } from \"./i18n/chrome\";\nimport { t } from \"./lib/bilingual\";\nimport { mixHex } from \"./lib/color\";\nimport { localStorageAdapter } from \"./lib/storage/localStorageAdapter\";\nimport { DOCUMENT_VERSION, migrateDocument } from \"./lib/migrate\";\nimport { parseTemplate, TEMPLATE_FORMAT } from \"./lib/template\";\nimport { resolveFeatures } from \"./lib/features\";\nimport { useTheme } from \"./hooks/useTheme\";\nimport { useFormDocument } from \"./hooks/useFormDocument\";\nimport { usePersistence } from \"./hooks/usePersistence\";\nimport { useTemplateClipboard } from \"./hooks/useTemplateClipboard\";\nimport { useDragReorder } from \"./hooks/useDragReorder\";\nimport { Toolbar } from \"./components/Toolbar\";\nimport { Palette } from \"./components/Palette\";\nimport { Canvas } from \"./components/Canvas\";\nimport { Inspector } from \"./components/Inspector\";\nimport { PreviewPane } from \"./components/PreviewPane\";\nimport { JsonModal } from \"./components/modals/JsonModal\";\nimport { TemplatesModal } from \"./components/modals/TemplatesModal\";\nimport { SaveAsModal } from \"./components/modals/SaveAsModal\";\nimport { ConfirmModal } from \"./components/modals/ConfirmModal\";\nimport { css } from \"./styles/globalCss\";\nimport { styles } from \"./styles/styles\";\n\nconst FormBuilder = forwardRef<FormBuilderHandle, FormBuilderProps>(function FormBuilder({\n theme: themeOverrideProp,\n language: languageOverride,\n languages = DEFAULT_LANGUAGES,\n strings: stringsOverride,\n chrome: chromeOverride,\n features: featuresProp,\n storage: storageProp,\n onSubmit,\n initialDocument,\n initialMode,\n onModeChange,\n onTemplateChange,\n templateClipboardKey,\n}, ref) {\n const features = resolveFeatures(featuresProp);\n const storage = storageProp ?? localStorageAdapter;\n const { theme, updateThemeColor, updateThemeLayout, resetTheme, replaceThemeOverrides, themeOverrides } = useTheme(themeOverrideProp);\n\n const [language, setLanguage] = useState(languageOverride || languages[0]?.code || \"en\");\n const strings = { ...(DEFAULT_STRINGS[language as keyof typeof DEFAULT_STRINGS] || DEFAULT_STRINGS.en), ...((stringsOverride && stringsOverride[language]) || {}) };\n const chrome = { ...(CHROME[language as keyof typeof CHROME] || CHROME.en), ...((chromeOverride && chromeOverride[language]) || {}) };\n\n const doc = useFormDocument({ language, chrome });\n const drag = useDragReorder(doc.reorderWithinSection);\n\n const [mode, setModeState] = useState<\"build\" | \"preview\">(initialMode ?? \"build\");\n const setMode = (next: \"build\" | \"preview\") => { setModeState(next); onModeChange?.(next); };\n useEffect(() => { onModeChange?.(mode); }, []); // eslint-disable-line react-hooks/exhaustive-deps\n const [showJson, setShowJson] = useState(false);\n const [showLibrary, setShowLibrary] = useState(false);\n const [copied, setCopied] = useState(false);\n const [templateCopied, setTemplateCopied] = useState(false);\n const [pastePrompt, setPastePrompt] = useState(false);\n const clipboard = useTemplateClipboard(templateClipboardKey);\n // Which drawer is open below the 720px breakpoint (see globalCss); ignored above it.\n const [mobilePanel, setMobilePanel] = useState<\"none\" | \"palette\" | \"inspector\">(\"none\");\n\n const persistence = usePersistence({\n storage,\n autosave: features.autosave,\n templateMax: features.templates.max,\n templateManage: features.templates.manage,\n language,\n chrome,\n document: { title: doc.title, themeOverrides, sections: doc.sections },\n initialDocument,\n onLoadDocument: doc.loadDocument,\n onLoadThemeOverrides: replaceThemeOverrides,\n onTitleChange: doc.setTitle,\n onNewForm: () => { doc.resetToBlank(); resetTheme(); },\n onTemplateChange,\n ensureActiveSection: () => doc.setActiveSectionId((prev) => prev ?? doc.sections[0]?.id ?? null),\n });\n\n const jsonDoc = useMemo(() => ({\n version: DOCUMENT_VERSION,\n title: doc.title, theme, themeOverrides,\n sections: doc.sections.map((s) => ({ id: s.id, title: s.title, background: s.background, collapsed: s.collapsed, fields: s.fields })),\n }), [doc.title, doc.sections, theme, themeOverrides]);\n const jsonString = useMemo(() => JSON.stringify(jsonDoc, null, 2), [jsonDoc]);\n\n function copyJson() {\n navigator.clipboard.writeText(jsonString).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n }).catch(() => {});\n }\n\n function applyDocument(migrated: ReturnType<typeof migrateDocument>) {\n if (!migrated) return false;\n doc.loadDocument(migrated);\n replaceThemeOverrides(migrated.themeOverrides);\n return true;\n }\n\n function copyTemplate() {\n clipboard.copyTemplate(jsonDoc);\n setTemplateCopied(true);\n setTimeout(() => setTemplateCopied(false), 1500);\n }\n\n function pasteTemplate() {\n if (clipboard.readTemplate()) setPastePrompt(true);\n }\n\n useImperativeHandle(ref, () => ({\n getDocument: () => jsonDoc,\n exportJson: () => jsonString,\n loadDocument: (raw) => { applyDocument(migrateDocument(raw)); },\n getTemplate: () => ({ __fpb: \"template\", v: TEMPLATE_FORMAT, document: jsonDoc }),\n loadTemplate: (input) => applyDocument(parseTemplate(typeof input === \"string\" ? input : JSON.stringify(input))),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), [jsonDoc, jsonString]);\n\n // Content blocks don't count toward `features.maxFields`.\n const fieldCount = doc.sections.reduce((n, s) => n + s.fields.filter((f) => !getMeta(f.type).isContent).length, 0);\n\n const activeSectionIdx = doc.sections.findIndex((s) => s.id === doc.activeSection?.id);\n const activeSectionLabel = t(doc.activeSection?.title, language) || `#${activeSectionIdx + 1}`;\n\n const rootStyle: CSSProperties = {\n ...styles.app,\n \"--fb-primary\": theme.primary, \"--fb-primary-soft\": theme.primarySoft,\n \"--fb-danger\": theme.danger, \"--fb-danger-soft\": theme.dangerSoft,\n \"--fb-ink\": theme.ink, \"--fb-muted\": theme.muted, \"--fb-border\": theme.border,\n \"--fb-surface\": theme.surface, \"--fb-canvas\": theme.canvas, \"--fb-page-bg\": theme.pageBackground,\n \"--fb-surface-2\": mixHex(theme.surface, theme.ink, 0.06),\n \"--fb-space-page\": `${theme.layout.pagePadding}px`, \"--fb-space-canvas\": `${theme.layout.canvasPadding}px`,\n \"--fb-space-section\": `${theme.layout.sectionGap}px`, \"--fb-space-field\": `${theme.layout.fieldGap}px`,\n \"--fb-space-toolbar\": `${theme.layout.toolbarPadding}px`, \"--fb-space-panel\": `${theme.layout.panelPadding}px`,\n \"--fb-space-ticket\": `${theme.layout.ticketPadding}px`,\n } as CSSProperties;\n\n return (\n <div className=\"fb-root\" style={rootStyle}>\n <style>{css}</style>\n\n <Toolbar\n title={doc.title}\n language={language}\n languages={languages}\n mode={mode}\n saveState={persistence.saveState}\n templateState={persistence.templateState}\n activeTemplateTitle={persistence.activeTemplateTitle}\n templateDirty={persistence.isTemplateDirty}\n chrome={chrome}\n features={features}\n savedFormsCount={persistence.savedForms.length}\n clipboardReady={clipboard.hasClipboard}\n templateCopied={templateCopied}\n onTitleChange={doc.updateTitle}\n onLanguageChange={setLanguage}\n onModeChange={setMode}\n onNewForm={persistence.newForm}\n onOpenLibrary={() => setShowLibrary(true)}\n onSaveExisting={persistence.saveExisting}\n onOpenJson={() => setShowJson(true)}\n onCopyTemplate={copyTemplate}\n onPasteTemplate={pasteTemplate}\n />\n\n {persistence.loadingDraft ? (\n <div style={styles.loadingScreen}>\n <Loader2 size={20} className=\"spin\" />\n <span style={{ marginTop: 8, fontSize: 13, color: \"var(--fb-muted)\" }}>{chrome.loadingDraft}</span>\n </div>\n ) : mode === \"build\" ? (\n <div className=\"fb-work-area\" style={styles.workArea} data-mobile-panel={mobilePanel}>\n <div className=\"fb-mobile-bar\">\n <button\n type=\"button\"\n className=\"fb-mobile-btn\"\n aria-pressed={mobilePanel === \"palette\"}\n onClick={() => setMobilePanel((p) => (p === \"palette\" ? \"none\" : \"palette\"))}\n >\n <Menu size={14} /> {chrome.paletteTabBlocks}\n </button>\n <button\n type=\"button\"\n className=\"fb-mobile-btn\"\n aria-pressed={mobilePanel === \"inspector\"}\n onClick={() => setMobilePanel((p) => (p === \"inspector\" ? \"none\" : \"inspector\"))}\n >\n <SlidersHorizontal size={14} /> {chrome.properties}\n </button>\n </div>\n\n <div className=\"fb-canvas-area\" style={styles.workArea}>\n {mobilePanel !== \"none\" && (\n <div className=\"fb-mobile-backdrop\" onClick={() => setMobilePanel(\"none\")} />\n )}\n\n <Palette\n activeSectionLabel={activeSectionLabel}\n chrome={chrome}\n onAddField={(type) => { doc.addField(type); setMobilePanel(\"none\"); }}\n features={features}\n fieldCount={fieldCount}\n theme={theme}\n updateThemeColor={updateThemeColor}\n updateThemeLayout={updateThemeLayout}\n resetTheme={resetTheme}\n />\n\n <Canvas\n sections={doc.sections}\n activeSectionId={doc.activeSectionId}\n selectedId={doc.selectedId}\n dragOverKey={drag.dragOverKey}\n chrome={chrome}\n strings={strings}\n language={language}\n features={features}\n onActivateSection={doc.setActiveSectionId}\n onToggleSectionCollapse={doc.toggleSectionCollapse}\n onUpdateSectionTitle={doc.updateSectionTitle}\n onUpdateSectionBackground={doc.updateSectionBackground}\n onDuplicateSection={doc.duplicateSection}\n onMoveSection={doc.moveSection}\n onDeleteSection={doc.deleteSection}\n onAddSection={doc.addSection}\n onSelectField={(sectionId, fieldId) => { doc.setSelectedId(fieldId); doc.setActiveSectionId(sectionId); setMobilePanel(\"inspector\"); }}\n onFieldChange={doc.updateField}\n onMoveField={doc.moveField}\n onDuplicateField={doc.duplicateField}\n onDeleteField={doc.deleteField}\n getDropZoneHandlers={drag.getDropZoneHandlers}\n getDragHandleProps={drag.getDragHandleProps}\n />\n\n <Inspector\n selected={doc.selected}\n language={language}\n chrome={chrome}\n features={features}\n onUpdateField={(patch) => doc.selected && doc.updateField(doc.selected.id, patch)}\n onDeleteField={() => doc.selected && doc.deleteField(doc.selected.id)}\n onUpdateOption={(optIdx, patch) => doc.selected && doc.updateOption(doc.selected.id, optIdx, patch)}\n onAddOption={() => doc.selected && doc.addOption(doc.selected.id)}\n onRemoveOption={(optIdx) => doc.selected && doc.removeOption(doc.selected.id, optIdx)}\n />\n </div>\n </div>\n ) : (\n <PreviewPane\n title={doc.title} sections={doc.sections} onFieldChange={doc.updateField} language={language}\n strings={strings} chrome={chrome} baseMaxWidth={theme.layout.maxWidth} features={features}\n onSubmit={onSubmit}\n />\n )}\n\n {showJson && (\n <JsonModal chrome={chrome} jsonString={jsonString} copied={copied} onCopy={copyJson} onClose={() => setShowJson(false)} />\n )}\n\n {showLibrary && (\n <TemplatesModal\n chrome={chrome}\n savedForms={persistence.savedForms}\n currentFormId={persistence.currentFormId}\n manage={features.templates.manage}\n templateState={persistence.templateState}\n onOpen={async (id) => { if (await persistence.loadForm(id)) setShowLibrary(false); }}\n onDelete={persistence.deleteForm}\n onClose={() => setShowLibrary(false)}\n />\n )}\n\n {persistence.saveAsPrompt && (\n <SaveAsModal\n chrome={chrome}\n suggestedName={persistence.saveAsPrompt.suggestedName}\n templateState={persistence.templateState}\n onSave={persistence.saveAs}\n onClose={persistence.dismissSaveAsPrompt}\n />\n )}\n\n {pastePrompt && (\n <ConfirmModal\n chrome={chrome}\n title={chrome.pasteTemplate}\n message={chrome.pasteTemplateConfirm}\n confirmLabel={chrome.confirmReplace}\n tone=\"danger\"\n onConfirm={() => { applyDocument(clipboard.readTemplate()); setPastePrompt(false); }}\n onClose={() => setPastePrompt(false)}\n />\n )}\n\n {persistence.notice && (\n <ConfirmModal\n chrome={chrome}\n title={persistence.notice.title}\n message={persistence.notice.message}\n onClose={persistence.dismissNotice}\n />\n )}\n </div>\n );\n});\n\nexport default FormBuilder;\n","import {\n Type, AlignLeft, ChevronDown, Circle, ListChecks, CheckSquare, ToggleLeft,\n FileText, Image as ImageIcon, MousePointerClick,\n} from \"lucide-react\";\nimport type { IconKey, IconComponent } from \"./icons\";\n\nexport type FieldType =\n | \"paragraph\" | \"image\" | \"button\" | \"input\" | \"textarea\" | \"select\"\n | \"radio\" | \"checkboxGroup\" | \"checkbox\" | \"toggle\";\n\nexport interface FieldTypeMeta {\n type: FieldType;\n icon: IconComponent;\n isContent?: boolean;\n isImage?: boolean;\n placeholder?: boolean;\n hasSubtype?: boolean;\n options?: boolean;\n multiValue?: boolean;\n boolean?: boolean;\n defaultIcon: IconKey;\n}\n\nexport const FIELD_TYPES: FieldTypeMeta[] = [\n { type: \"paragraph\", icon: FileText, isContent: true, defaultIcon: \"FileText\" },\n { type: \"image\", icon: ImageIcon, isContent: true, isImage: true, defaultIcon: \"Type\" },\n { type: \"button\", icon: MousePointerClick, isContent: true, defaultIcon: \"Type\" },\n { type: \"input\", icon: Type, placeholder: true, hasSubtype: true, defaultIcon: \"Type\" },\n { type: \"textarea\", icon: AlignLeft, placeholder: true, defaultIcon: \"AlignLeft\" },\n { type: \"select\", icon: ChevronDown, options: true, defaultIcon: \"ChevronDown\" },\n { type: \"radio\", icon: Circle, options: true, defaultIcon: \"Circle\" },\n { type: \"checkboxGroup\", icon: ListChecks, options: true, multiValue: true, defaultIcon: \"ListChecks\" },\n { type: \"checkbox\", icon: CheckSquare, boolean: true, defaultIcon: \"CheckSquare\" },\n { type: \"toggle\", icon: ToggleLeft, boolean: true, defaultIcon: \"ToggleLeft\" },\n];\nexport const TYPE_MAP = Object.fromEntries(FIELD_TYPES.map((f) => [f.type, f])) as Record<FieldType, FieldTypeMeta>;\nexport const CONTENT_TYPES = FIELD_TYPES.filter((f) => f.isContent);\nexport const FORM_TYPES = FIELD_TYPES.filter((f) => !f.isContent);\nexport function getMeta(type: FieldType): FieldTypeMeta {\n return TYPE_MAP[type] || TYPE_MAP.input;\n}\n\nexport const LEGACY_INPUT_TYPES = [\"text\", \"email\", \"phone\", \"number\", \"password\", \"date\"] as const;\nexport const INPUT_SUBTYPES = [\"text\", \"email\", \"phone\", \"number\", \"password\", \"date\", \"time\"] as const;\nexport const IMAGE_SHAPES = [\"square\", \"circle\", \"banner\"] as const;\n\nexport const FIELD_TYPE_CHROME_KEY: Record<FieldType, string> = {\n paragraph: \"fieldTypeParagraph\", image: \"fieldTypeImage\", button: \"fieldTypeButton\", input: \"fieldTypeInput\",\n textarea: \"fieldTypeTextarea\", select: \"fieldTypeSelect\", radio: \"fieldTypeRadio\",\n checkboxGroup: \"fieldTypeCheckboxGroup\", checkbox: \"fieldTypeCheckbox\", toggle: \"fieldTypeToggle\",\n};\nexport const INPUT_SUBTYPE_CHROME_KEY: Record<string, string> = {\n text: \"subtypeText\", email: \"subtypeEmail\", phone: \"subtypePhone\", number: \"subtypeNumber\",\n password: \"subtypePassword\", date: \"subtypeDate\", time: \"subtypeTime\",\n};\nexport const IMAGE_SHAPE_CHROME_KEY: Record<string, string> = {\n square: \"shapeSquare\", circle: \"shapeCircle\", banner: \"shapeBanner\",\n};\n","export interface LanguageOption {\n code: string;\n label: string;\n}\n\nexport const DEFAULT_LANGUAGES: LanguageOption[] = [\n { code: \"en\", label: \"EN\" },\n { code: \"ja\", label: \"日本語\" },\n];\n","export const DEFAULT_STRINGS = {\n en: {\n submit: \"Submit\", selectPlaceholder: \"Select...\", requiredError: \"This field is required.\",\n invalidEmail: \"Enter a valid email address.\", invalidPhone: \"Enter a valid phone number.\",\n fixErrors: \"Please fix the highlighted fields before submitting.\", submittedTitle: \"Form submitted\",\n submittedBody: \"Here's what would be sent to your backend:\", addFieldsHint: \"Add fields in Build mode to see them here.\",\n close: \"Close\",\n tooLong: (n: number) => `Must be ${n} characters or fewer.`,\n tooSmall: (n: number) => `Must be at least ${n}.`,\n tooLarge: (n: number) => `Must be at most ${n}.`,\n },\n ja: {\n submit: \"送信\", selectPlaceholder: \"選択してください\", requiredError: \"この項目は必須です。\",\n invalidEmail: \"有効なメールアドレスを入力してください。\", invalidPhone: \"有効な電話番号を入力してください。\",\n fixErrors: \"入力内容をご確認のうえ、再度送信してください。\", submittedTitle: \"送信完了\",\n submittedBody: \"バックエンドに送信される内容は以下の通りです:\", addFieldsHint: \"ビルドモードでフィールドを追加すると、ここに表示されます。\",\n close: \"閉じる\",\n tooLong: (n: number) => `${n}文字以内で入力してください。`,\n tooSmall: (n: number) => `${n}以上の値を入力してください。`,\n tooLarge: (n: number) => `${n}以下の値を入力してください。`,\n },\n};\n\nexport type StringsShape = typeof DEFAULT_STRINGS.en;\n\n// Fails the build if `ja` drifts from `en` (missing or mistyped key).\nDEFAULT_STRINGS.ja satisfies StringsShape;\n","export const CHROME = {\n en: {\n contentBlocks: \"Content\", formFields: \"Form Fields\", addingTo: \"Adding to\",\n paletteTabBlocks: \"Blocks\", paletteTabDesign: \"Design\",\n properties: \"Properties\", selectFieldHint: \"Select a field to edit its properties.\",\n label: \"Label\", hideLabel: \"Hide label\", inputType: \"Input type\", content: \"Content\",\n headingStyle: \"Heading style\", typography: \"Typography\", style: \"Style\", align: \"Align\",\n color: \"Color\", imageUrl: \"Image URL\",\n imageUrlHelper: \"Upload the image on your own end (Drive, CDN, S3...) and paste the link here — this package doesn't host images.\",\n altText: \"Alt text\", linkOptional: \"Link (optional)\", shape: \"Shape\",\n placeholder: \"Placeholder\", maxLength: \"Max length\", noLimit: \"No limit\",\n minValue: \"Min value\", maxValue: \"Max value\", options: \"Options\", addOption: \"Add option\",\n defaultValue: \"Default value\", defaultChecked: \"Default checked\", checked: \"Checked\",\n unchecked: \"Unchecked\", none: \"None\", requiredField: \"Required field\", layout: \"Layout\",\n width: \"Width\", full: \"Full\", labelPosition: \"Label position\", above: \"Above\",\n inline: \"Inline\", verticalAlign: \"Vertical align\", top: \"Top\", middle: \"Middle\",\n bottom: \"Bottom\", icon: \"Icon\", showIcon: \"Show icon next to label\",\n deleteField: \"Delete field\", build: \"Build\", preview: \"Preview\", newForm: \"New\",\n templates: \"Templates\", save: \"Save\", viewJson: \"View JSON\", saving: \"Saving...\",\n saved: \"Saved\", saveFailed: \"Save failed\", startNewForm: \"Start a new form\",\n openTemplatesTitle: \"Open a saved template\", saveToLibraryTitle: \"Save this form as a template\",\n sectionTitlePlaceholder: (n: number) => `Section ${n} title (optional)`,\n noFieldsInSection: \"No fields in this section yet — pick a field type on the left.\",\n addSection: \"Add section\", moveUp: \"Move up\", moveDown: \"Move down\",\n duplicate: \"Duplicate\", delete: \"Delete\", deleteSection: \"Delete section\",\n required: \"required\", formJson: \"Form JSON\", copy: \"Copy\", copied: \"Copied\",\n copyTemplate: \"Copy template\", pasteTemplate: \"Paste template\",\n copyTemplateTitle: \"Copy this form as a template you can paste into another builder\",\n pasteTemplateTitle: \"Replace this form with the copied template\",\n pasteTemplateConfirm: \"Replace the current form with the copied template? This can't be undone.\",\n noTemplates: \"No templates saved yet. Click \\\"Save\\\" in the toolbar to store this form here.\",\n noTemplatesReadonly: \"No templates available yet.\",\n updated: \"Updated\", open: \"Open\", applyTemplate: \"Apply\", saveForm: \"Save as template\", formName: \"Template name\",\n saveToLibrary: \"Save template\", loadingDraft: \"Loading your draft...\",\n templatesLimitReached: (max: number) => `You can save up to ${max} template${max === 1 ? \"\" : \"s\"}. Delete one to save another.`,\n templatesLimitTitle: \"Template limit reached\",\n fieldCount: (n: number, max: number) => `Fields: ${n} / ${max}`,\n fieldLimitReached: (max: number) => `Field limit reached (${max}). Delete a field to add another.`,\n confirm: \"Confirm\", cancel: \"Cancel\", dismiss: \"OK\", confirmReplace: \"Replace\",\n current: \"current\", customColor: \"Custom color\",\n templateLabel: (name: string) => `Template: ${name}`,\n templateEdited: \"Edited\",\n templateLoading: \"Loading template...\",\n templateLoadFailed: \"Couldn't load that template.\",\n templateSaveFailed: \"Couldn't save the template.\",\n fieldsCount: (n: number) => `${n} field${n === 1 ? \"\" : \"s\"}`,\n fieldTypeInput: \"Input\", fieldTypeTextarea: \"Textarea\", fieldTypeSelect: \"Select\",\n fieldTypeRadio: \"Radio group\", fieldTypeCheckboxGroup: \"Checkbox group\",\n fieldTypeCheckbox: \"Checkbox\", fieldTypeToggle: \"Toggle\", fieldTypeParagraph: \"Paragraph\",\n fieldTypeImage: \"Image\", fieldTypeButton: \"Button\",\n subtypeText: \"Text\", subtypeEmail: \"Email\", subtypePhone: \"Phone\", subtypeNumber: \"Number\",\n subtypePassword: \"Password\", subtypeDate: \"Date\", subtypeTime: \"Time\",\n shapeSquare: \"Square\", shapeCircle: \"Circle\", shapeBanner: \"Banner\",\n tagBody: \"Body\", tagCaption: \"Caption\",\n buttonText: \"Button text\", buttonActionTitle: \"Action\", buttonAction: \"When clicked\",\n actionLink: \"Open link\", actionSubmit: \"Submit\", openIn: \"Open in\",\n sameTab: \"Same tab\", newTab: \"New tab\", submitScope: \"Submits\",\n thisSection: \"This section\", wholeForm: \"Whole form\", buttonSize: \"Size\",\n theme: \"Theme\", primaryColor: \"Primary color\", pageBackground: \"Page background\",\n maxWidthPx: \"Max width (px)\", reset: \"Reset\",\n deviceLaptop: \"Laptop\", deviceTablet: \"Tablet\", deviceMobile: \"Mobile\",\n untitledField: \"Untitled field\", optionSeed: (n: number) => `Option ${n}`,\n spacing: \"Spacing\", spacingPagePadding: \"Page padding\", spacingCanvasPadding: \"Canvas padding\",\n spacingSectionGap: \"Section gap\", spacingFieldGap: \"Field gap\", spacingToolbarPadding: \"Toolbar padding\",\n spacingPanelPadding: \"Panel padding\", spacingTicketPadding: \"Field padding\",\n },\n ja: {\n contentBlocks: \"コンテンツ\", formFields: \"フォーム項目\", addingTo: \"追加先\",\n paletteTabBlocks: \"ブロック\", paletteTabDesign: \"デザイン\",\n properties: \"プロパティ\", selectFieldHint: \"編集するフィールドを選択してください。\",\n label: \"ラベル\", hideLabel: \"ラベルを非表示\", inputType: \"入力タイプ\", content: \"内容\",\n headingStyle: \"見出しスタイル\", typography: \"文字スタイル\", style: \"スタイル\", align: \"配置\",\n color: \"色\", imageUrl: \"画像URL\",\n imageUrlHelper: \"画像は各自でアップロード(Drive、CDN、S3など)し、そのURLをここに貼り付けてください。本パッケージは画像を保存しません。\",\n altText: \"代替テキスト\", linkOptional: \"リンク(任意)\", shape: \"形状\",\n placeholder: \"プレースホルダー\", maxLength: \"最大文字数\", noLimit: \"制限なし\",\n minValue: \"最小値\", maxValue: \"最大値\", options: \"選択肢\", addOption: \"選択肢を追加\",\n defaultValue: \"初期値\", defaultChecked: \"初期選択\", checked: \"オン\",\n unchecked: \"オフ\", none: \"なし\", requiredField: \"必須項目\", layout: \"レイアウト\",\n width: \"幅\", full: \"全幅\", labelPosition: \"ラベル位置\", above: \"上\",\n inline: \"横並び\", verticalAlign: \"垂直位置\", top: \"上\", middle: \"中央\",\n bottom: \"下\", icon: \"アイコン\", showIcon: \"ラベル横にアイコンを表示\",\n deleteField: \"フィールドを削除\", build: \"作成\", preview: \"プレビュー\", newForm: \"新規\",\n templates: \"テンプレート\", save: \"保存\", viewJson: \"JSONを表示\", saving: \"保存中...\",\n saved: \"保存済み\", saveFailed: \"保存に失敗しました\", startNewForm: \"新しいフォームを作成\",\n openTemplatesTitle: \"保存済みテンプレートを開く\", saveToLibraryTitle: \"このフォームをテンプレートとして保存\",\n sectionTitlePlaceholder: (n: number) => `セクション${n}のタイトル(任意)`,\n noFieldsInSection: \"このセクションにはまだフィールドがありません。左のパネルからフィールドを選んでください。\",\n addSection: \"セクションを追加\", moveUp: \"上へ移動\", moveDown: \"下へ移動\",\n duplicate: \"複製\", delete: \"削除\", deleteSection: \"セクションを削除\",\n required: \"必須\", formJson: \"フォームJSON\", copy: \"コピー\", copied: \"コピーしました\",\n copyTemplate: \"テンプレートをコピー\", pasteTemplate: \"テンプレートを貼り付け\",\n copyTemplateTitle: \"このフォームをテンプレートとしてコピーし、他のビルダーに貼り付けます\",\n pasteTemplateTitle: \"コピーしたテンプレートでこのフォームを置き換えます\",\n pasteTemplateConfirm: \"現在のフォームをコピーしたテンプレートで置き換えますか?この操作は取り消せません。\",\n noTemplates: \"まだテンプレートがありません。ツールバーの「保存」をクリックしてください。\",\n noTemplatesReadonly: \"利用できるテンプレートがまだありません。\",\n updated: \"更新日時\", open: \"開く\", applyTemplate: \"適用\", saveForm: \"テンプレートとして保存\", formName: \"テンプレート名\",\n saveToLibrary: \"テンプレートを保存\", loadingDraft: \"下書きを読み込んでいます...\",\n templatesLimitReached: (max: number) => `テンプレートは${max}件まで保存できます。1件削除してから保存してください。`,\n templatesLimitTitle: \"テンプレートの上限に達しました\",\n fieldCount: (n: number, max: number) => `項目数: ${n} / ${max}`,\n fieldLimitReached: (max: number) => `項目数の上限(${max}件)に達しました。追加するには項目を削除してください。`,\n confirm: \"確定\", cancel: \"キャンセル\", dismiss: \"OK\", confirmReplace: \"置き換える\",\n current: \"現在編集中\", customColor: \"カスタムカラー\",\n templateLabel: (name: string) => `テンプレート: ${name}`,\n templateEdited: \"編集済み\",\n templateLoading: \"テンプレートを読み込み中...\",\n templateLoadFailed: \"テンプレートを読み込めませんでした。\",\n templateSaveFailed: \"テンプレートを保存できませんでした。\",\n fieldsCount: (n: number) => `${n}件のフィールド`,\n fieldTypeInput: \"入力\", fieldTypeTextarea: \"テキストエリア\", fieldTypeSelect: \"セレクト\",\n fieldTypeRadio: \"ラジオボタン\", fieldTypeCheckboxGroup: \"チェックボックスグループ\",\n fieldTypeCheckbox: \"チェックボックス\", fieldTypeToggle: \"トグル\", fieldTypeParagraph: \"段落\",\n fieldTypeImage: \"画像\", fieldTypeButton: \"ボタン\",\n subtypeText: \"テキスト\", subtypeEmail: \"メール\", subtypePhone: \"電話番号\", subtypeNumber: \"数値\",\n subtypePassword: \"パスワード\", subtypeDate: \"日付\", subtypeTime: \"時刻\",\n shapeSquare: \"正方形\", shapeCircle: \"円形\", shapeBanner: \"バナー\",\n tagBody: \"本文\", tagCaption: \"キャプション\",\n buttonText: \"ボタンのテキスト\", buttonActionTitle: \"アクション\", buttonAction: \"クリック時の動作\",\n actionLink: \"リンクを開く\", actionSubmit: \"送信\", openIn: \"開き方\",\n sameTab: \"同じタブ\", newTab: \"新しいタブ\", submitScope: \"送信範囲\",\n thisSection: \"このセクション\", wholeForm: \"フォーム全体\", buttonSize: \"サイズ\",\n theme: \"テーマ\", primaryColor: \"メインカラー\", pageBackground: \"ページ背景色\",\n maxWidthPx: \"最大幅(px)\", reset: \"リセット\",\n deviceLaptop: \"パソコン\", deviceTablet: \"タブレット\", deviceMobile: \"モバイル\",\n untitledField: \"名称未設定のフィールド\", optionSeed: (n: number) => `選択肢${n}`,\n spacing: \"余白設定\", spacingPagePadding: \"ページ余白\", spacingCanvasPadding: \"キャンバス余白\",\n spacingSectionGap: \"セクション間隔\", spacingFieldGap: \"フィールド間隔\", spacingToolbarPadding: \"ツールバー余白\",\n spacingPanelPadding: \"パネル余白\", spacingTicketPadding: \"フィールド内余白\",\n },\n};\n\nexport type ChromeShape = typeof CHROME.en;\n\n// Fails the build if `ja` drifts from `en` (missing or mistyped key).\nCHROME.ja satisfies ChromeShape;\n","import type { LocalizedString } from \"../types\";\n\nexport function bi(en = \"\", ja = \"\"): LocalizedString {\n return { en, ja };\n}\n\nexport function t(val: LocalizedString | string | undefined, lang: string): string {\n if (val && typeof val === \"object\") return val[lang] || val.en || \"\";\n return val || \"\";\n}\n\nexport function withLang(val: LocalizedString | string | undefined, lang: string, value: string): LocalizedString {\n const base = val && typeof val === \"object\" ? val : bi(typeof val === \"string\" ? val : \"\");\n return { ...base, [lang]: value };\n}\n","/** Linearly blends two `#rrggbb` colors; `t=0` returns `a`, `t=1` returns `b`. */\nexport function mixHex(a: string, b: string, t: number): string {\n const pa = parseHex(a);\n const pb = parseHex(b);\n if (!pa || !pb) return a;\n const mix = (x: number, y: number) => Math.round(x + (y - x) * t);\n const toHex = (n: number) => n.toString(16).padStart(2, \"0\");\n return `#${toHex(mix(pa[0], pb[0]))}${toHex(mix(pa[1], pb[1]))}${toHex(mix(pa[2], pb[2]))}`;\n}\n\nfunction parseHex(hex: string): [number, number, number] | null {\n const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) return null;\n const n = parseInt(m[1], 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n","import { compressToUTF16, decompressFromUTF16 } from \"lz-string\";\n\n/** Compresses a JSON string for storage in `localStorage`, cutting the character count used against the quota. */\nexport function compress(raw: string): string {\n return compressToUTF16(raw);\n}\n\n/** Reverses `compress`; null if `value` isn't compressed output (e.g. a pre-format plain-JSON draft). */\nexport function decompress(value: string): string | null {\n try {\n return decompressFromUTF16(value);\n } catch {\n return null;\n }\n}\n","import type { StorageAdapter } from \"../../types\";\nimport { compress, decompress } from \"./compress\";\n\nfunction hasLocalStorage(): boolean {\n return typeof window !== \"undefined\" && !!window.localStorage;\n}\n\n/**\n * Default StorageAdapter over window.localStorage. Availability is checked per-call so it survives SSR.\n * Values are compressed on write; on read, a decompressed result is used only if it parses as JSON,\n * else the raw string is returned (so pre-compression drafts still load).\n */\nexport const localStorageAdapter: StorageAdapter = {\n async get(key) {\n if (!hasLocalStorage()) return null;\n const raw = window.localStorage.getItem(key);\n if (raw == null) return null;\n const decompressed = decompress(raw);\n if (decompressed != null) {\n try {\n JSON.parse(decompressed);\n return decompressed;\n } catch {\n // Not JSON once decompressed — fall through and return `raw` as legacy uncompressed data.\n }\n }\n return raw;\n },\n async set(key, value) {\n if (!hasLocalStorage()) return;\n window.localStorage.setItem(key, compress(value));\n },\n async delete(key) {\n if (!hasLocalStorage()) return;\n window.localStorage.removeItem(key);\n },\n};\n","import type { FormField } from \"../types\";\n\nexport const genFormId = () => `form_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\nexport const genSectionId = () => `section_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`;\n\nlet idCounter = 1;\nexport const nextId = () => `field_${idCounter++}`;\n\nexport function resyncIdCounter(fields: FormField[]) {\n let max = 0;\n fields.forEach((f) => {\n const m = /^field_(\\d+)$/.exec(f.id);\n if (m) max = Math.max(max, parseInt(m[1], 10));\n });\n idCounter = Math.max(idCounter, max + 1);\n}\n","import type { ChromeShape } from \"../i18n/chrome\";\nimport type { FieldType, FormField, Section } from \"../types\";\nimport { FIELD_TYPE_CHROME_KEY, getMeta } from \"../constants/fieldTypes\";\nimport { bi, withLang } from \"./bilingual\";\nimport { nextId, genSectionId } from \"./id\";\n\nexport function defaultFieldFor(type: FieldType, language: string, chrome: ChromeShape): FormField {\n const meta = getMeta(type);\n const seedLabel = (chrome as Record<string, unknown>)[FIELD_TYPE_CHROME_KEY[type]] as string | undefined || type;\n const base: Record<string, unknown> = {\n id: nextId(),\n type,\n label: withLang(bi(), language, seedLabel),\n hideLabel: false,\n width: \"1/1\",\n verticalAlign: \"top\",\n labelPosition: \"top\",\n showIcon: false,\n displayIcon: meta.defaultIcon,\n };\n if (!meta.isContent) base.required = false;\n if (meta.hasSubtype) base.inputType = \"text\";\n if (meta.placeholder) base.placeholder = bi();\n if (meta.options) {\n base.options = [\n { label: withLang(bi(), language, chrome.optionSeed(1)), value: \"option_1\" },\n { label: withLang(bi(), language, chrome.optionSeed(2)), value: \"option_2\" },\n ];\n }\n if (meta.isImage) {\n base.src = \"\";\n base.alt = bi();\n base.link = \"\";\n base.shape = \"square\";\n } else if (meta.boolean) {\n base.defaultValue = false;\n } else if (meta.multiValue) {\n base.defaultValue = [];\n } else if (type === \"paragraph\") {\n base.content = bi();\n base.tag = \"p\";\n base.fontSize = \"md\";\n base.fontWeight = \"normal\";\n base.fontStyle = \"normal\";\n base.textAlign = \"left\";\n base.color = \"\";\n } else if (type === \"button\") {\n base.action = \"submit\";\n base.submitScope = \"form\";\n base.buttonStyle = { color: \"\", size: \"md\" };\n base.href = \"\";\n base.target = \"_self\";\n } else {\n base.defaultValue = \"\";\n }\n // Assembled incrementally from the type's metadata flags — only sound as FormField once complete.\n return base as unknown as FormField;\n}\n\nexport function defaultSection(titleEn = \"\"): Section {\n return { id: genSectionId(), title: bi(titleEn, \"\"), background: \"\", collapsed: false, fields: [] };\n}\n","import type { DocumentFields, FormField, Section } from \"../types\";\nimport { LEGACY_INPUT_TYPES, getMeta } from \"../constants/fieldTypes\";\nimport { bi } from \"./bilingual\";\nimport { defaultSection } from \"./fieldDefaults\";\nimport { genSectionId } from \"./id\";\n\n/** Current document schema version — stamped on everything persisted. */\nexport const DOCUMENT_VERSION = 5 as const;\n\n/** Raw JSON from storage or an older/hand-edited export — untyped on purpose, to absorb legacy shapes. */\ntype RawDocument = Record<string, any>;\n\nexport function migrateField(field: Record<string, any>): FormField {\n let f: Record<string, any> = { ...field };\n if (LEGACY_INPUT_TYPES.includes(f.type)) f = { ...f, type: \"input\", inputType: f.type };\n f.label = typeof f.label === \"string\" ? bi(f.label) : f.label || bi();\n f.hideLabel = !!f.hideLabel;\n if (\"placeholder\" in f) f.placeholder = typeof f.placeholder === \"string\" ? bi(f.placeholder) : f.placeholder || bi();\n if (\"content\" in f) f.content = typeof f.content === \"string\" ? bi(f.content) : f.content || bi();\n if (\"alt\" in f) f.alt = typeof f.alt === \"string\" ? bi(f.alt) : f.alt || bi();\n if (f.options) f.options = f.options.map((o: any) => ({ ...o, label: typeof o.label === \"string\" ? bi(o.label) : o.label || bi() }));\n if (f.type === \"paragraph\") {\n f.tag = f.tag || \"p\";\n f.fontSize = f.fontSize || \"md\";\n f.fontWeight = f.fontWeight || \"normal\";\n f.fontStyle = f.fontStyle || \"normal\";\n f.textAlign = f.textAlign || \"left\";\n f.color = f.color || \"\";\n }\n if (f.type === \"button\") {\n f.action = f.action === \"link\" ? \"link\" : \"submit\";\n f.buttonStyle = f.buttonStyle || { color: \"\", size: \"md\" };\n f.href = f.href || \"\";\n f.target = f.target === \"_blank\" ? \"_blank\" : \"_self\";\n f.submitScope = f.submitScope === \"section\" ? \"section\" : \"form\";\n }\n f.verticalAlign = f.verticalAlign || \"top\";\n // Defaults that compactDocument() may have omitted from a persisted document.\n const meta = getMeta(f.type);\n f.width = f.width || \"1/1\";\n f.labelPosition = f.labelPosition || \"top\";\n f.showIcon = !!f.showIcon;\n f.displayIcon = f.displayIcon || meta.defaultIcon;\n if (!meta.isContent) {\n f.required = !!f.required;\n if (meta.placeholder && !f.placeholder) f.placeholder = bi();\n if (f.defaultValue === undefined) f.defaultValue = meta.boolean ? false : meta.multiValue ? [] : \"\";\n }\n return f as FormField;\n}\n\nexport function migrateFields(fields: Record<string, any>[] | undefined): FormField[] {\n return (fields || []).map(migrateField);\n}\n\nexport function migrateDocument(raw: RawDocument | null | undefined): DocumentFields | null {\n if (!raw) return null;\n const title = typeof raw.title === \"string\" ? bi(raw.title) : raw.title || bi();\n const themeOverrides = raw.themeOverrides || {};\n\n let sections: Section[];\n if (raw.sections) {\n sections = raw.sections.map((s: Record<string, any>): Section => ({\n id: s.id || genSectionId(),\n title: typeof s.title === \"string\" ? bi(s.title) : s.title || bi(),\n background: s.background || \"\",\n collapsed: !!s.collapsed,\n fields: migrateFields(s.fields || []),\n }));\n } else {\n sections = [{ ...defaultSection(), fields: migrateFields(raw.fields || []) }];\n }\n\n // A submit action is an explicit Button field — never synthesized. Older\n // documents that carried a document-level submitLabel/submitMode load without\n // one; add a Button field if you want a submit control.\n\n return { title, themeOverrides, sections };\n}\n","import type { DocumentFields, FormDocument, FormTemplate } from \"../types\";\nimport { migrateDocument } from \"./migrate\";\n\n/** Envelope version — bump only if the wrapper shape changes, not the document. */\nexport const TEMPLATE_FORMAT = 1;\n\nexport function serializeTemplate(document: FormDocument): string {\n const envelope: FormTemplate = { __fpb: \"template\", v: TEMPLATE_FORMAT, document };\n return JSON.stringify(envelope);\n}\n\n/** Accepts a `serializeTemplate` envelope or a bare document (e.g. \"View JSON\" output); `null` if not a document. */\nexport function parseTemplate(raw: string | null | undefined): DocumentFields | null {\n if (!raw) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== \"object\") return null;\n const obj = parsed as Record<string, unknown>;\n const candidate = obj.__fpb === \"template\" && obj.document ? obj.document : obj;\n return migrateDocument(candidate as Record<string, unknown>);\n}\n","import type { ContentBlockType, FormBuilderFeatures, InputFieldType } from \"../types\";\n\nexport const DEFAULT_MAX_TEMPLATES = 5;\n\nexport interface ResolvedTemplates {\n enabled: boolean;\n /** false = pick-and-apply only. */\n manage: boolean;\n max: number;\n}\n\nexport interface ResolvedFeatures {\n naming: boolean;\n formTitle: boolean;\n templates: ResolvedTemplates;\n templateClipboard: boolean;\n newForm: boolean;\n autosave: boolean;\n jsonView: boolean;\n previewMode: boolean;\n languageSwitcher: boolean;\n design: boolean;\n blockStyling: boolean;\n contentBlocks: boolean | Set<ContentBlockType>;\n fieldTypes: boolean | Set<InputFieldType>;\n sections: boolean;\n sectionBackground: boolean;\n dragReorder: boolean;\n deviceToggle: boolean;\n maxFields?: number;\n}\n\nexport const DEFAULT_FEATURES: ResolvedFeatures = {\n naming: true,\n formTitle: false,\n templates: { enabled: true, manage: true, max: DEFAULT_MAX_TEMPLATES },\n templateClipboard: true,\n newForm: true,\n autosave: true,\n jsonView: true,\n previewMode: true,\n languageSwitcher: true,\n design: false,\n blockStyling: true,\n contentBlocks: true,\n fieldTypes: true,\n sections: true,\n sectionBackground: true,\n dragReorder: true,\n deviceToggle: true,\n};\n\nfunction resolveTemplates(t: FormBuilderFeatures[\"templates\"]): ResolvedTemplates {\n if (t === false) return { enabled: false, manage: false, max: DEFAULT_MAX_TEMPLATES };\n if (t === undefined || t === true) return { enabled: true, manage: true, max: DEFAULT_MAX_TEMPLATES };\n return { enabled: true, manage: t.manage ?? true, max: t.max ?? DEFAULT_MAX_TEMPLATES };\n}\n\nexport function resolveFeatures(features?: FormBuilderFeatures): ResolvedFeatures {\n return {\n ...DEFAULT_FEATURES,\n ...features,\n templates: resolveTemplates(features?.templates),\n contentBlocks: Array.isArray(features?.contentBlocks) ? new Set(features.contentBlocks) : features?.contentBlocks ?? DEFAULT_FEATURES.contentBlocks,\n fieldTypes: Array.isArray(features?.fieldTypes) ? new Set(features.fieldTypes) : features?.fieldTypes ?? DEFAULT_FEATURES.fieldTypes,\n // Unset → follow `sections`, so an existing `sections: false` still hides the picker.\n sectionBackground: features?.sectionBackground ?? features?.sections ?? DEFAULT_FEATURES.sectionBackground,\n };\n}\n\nexport function isContentBlockEnabled(features: ResolvedFeatures, type: ContentBlockType): boolean {\n return features.contentBlocks === true || (features.contentBlocks instanceof Set && features.contentBlocks.has(type));\n}\n\nexport function isFieldTypeEnabled(features: ResolvedFeatures, type: InputFieldType): boolean {\n return features.fieldTypes === true || (features.fieldTypes instanceof Set && features.fieldTypes.has(type));\n}\n","import { useMemo, useState } from \"react\";\nimport type { Theme, ThemeOverrides } from \"../types\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\n\nexport interface UseThemeResult {\n theme: Theme;\n themeOverrides: ThemeOverrides;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n replaceThemeOverrides: (overrides: ThemeOverrides) => void;\n}\n\nexport function useTheme(themeOverrideProp?: Partial<Theme>): UseThemeResult {\n const [themeOverrides, setThemeOverrides] = useState<ThemeOverrides>({});\n\n const baseTheme = useMemo<Theme>(() => ({\n ...DEFAULT_THEME,\n ...(themeOverrideProp || {}),\n layout: { ...DEFAULT_THEME.layout, ...((themeOverrideProp && themeOverrideProp.layout) || {}) },\n }), [themeOverrideProp]);\n\n const theme = useMemo<Theme>(() => ({\n ...baseTheme,\n ...themeOverrides,\n layout: { ...baseTheme.layout, ...(themeOverrides.layout || {}) },\n }), [baseTheme, themeOverrides]);\n\n function updateThemeColor(key: keyof Omit<Theme, \"layout\">, value: string) {\n setThemeOverrides((prev) => ({ ...prev, [key]: value }));\n }\n function updateThemeLayout(key: keyof Theme[\"layout\"], value: number) {\n setThemeOverrides((prev) => ({ ...prev, layout: { ...prev.layout, [key]: value } }));\n }\n function resetTheme() {\n setThemeOverrides({});\n }\n function replaceThemeOverrides(overrides: ThemeOverrides) {\n setThemeOverrides(overrides);\n }\n\n return { theme, themeOverrides, updateThemeColor, updateThemeLayout, resetTheme, replaceThemeOverrides };\n}\n","import type { Theme } from \"../types\";\n\nexport const DEFAULT_THEME: Theme = {\n primary: \"#5B5FEF\", primarySoft: \"#EEF0FF\", danger: \"#C4432E\", dangerSoft: \"#FDECE4\",\n ink: \"#1B1E24\", muted: \"#9296A3\", border: \"#E2E4E9\", surface: \"#FFFFFF\",\n canvas: \"#F5F6F8\", pageBackground: \"#FFFFFF\",\n layout: { maxWidth: 1200, pagePadding: 28, canvasPadding: 20, sectionGap: 20, fieldGap: 16, toolbarPadding: 10, panelPadding: 14, ticketPadding: 14 },\n};\n","import { useState } from \"react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { DocumentFields, FieldPatch, FieldType, FormField, LocalizedString, Section } from \"../types\";\nimport { bi, withLang } from \"../lib/bilingual\";\nimport { defaultFieldFor, defaultSection } from \"../lib/fieldDefaults\";\nimport { genSectionId, nextId, resyncIdCounter } from \"../lib/id\";\n\nexport interface UseFormDocumentArgs {\n language: string;\n chrome: ChromeShape;\n}\n\nexport function useFormDocument({ language, chrome }: UseFormDocumentArgs) {\n const [title, setTitle] = useState<LocalizedString>(bi(\"Untitled form\", \"\"));\n const [sections, setSections] = useState<Section[]>([defaultSection()]);\n const [activeSectionId, setActiveSectionId] = useState<string | null>(null);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n const allFields = sections.flatMap((s) => s.fields);\n const selected = allFields.find((f) => f.id === selectedId) || null;\n const activeSection = sections.find((s) => s.id === activeSectionId) || sections[0] || defaultSection();\n\n function updateTitle(value: string) {\n setTitle((prev) => withLang(prev, language, value));\n }\n\n function addSection() {\n const s = defaultSection();\n setSections((prev) => [...prev, s]);\n setActiveSectionId(s.id);\n }\n function duplicateSection(sectionId: string) {\n const newSectionId = genSectionId();\n setSections((prev) => {\n const idx = prev.findIndex((s) => s.id === sectionId);\n if (idx === -1) return prev;\n const copy: Section = { ...prev[idx], id: newSectionId, fields: prev[idx].fields.map((f) => ({ ...f, id: nextId() })) };\n const next = [...prev];\n next.splice(idx + 1, 0, copy);\n return next;\n });\n setActiveSectionId(newSectionId);\n }\n function deleteSection(sectionId: string) {\n setSections((prev) => {\n if (prev.length <= 1) return prev;\n const next = prev.filter((s) => s.id !== sectionId);\n setActiveSectionId((curr) => (curr === sectionId ? next[0].id : curr));\n return next;\n });\n }\n function moveSection(sectionId: string, dir: 1 | -1) {\n setSections((prev) => {\n const idx = prev.findIndex((s) => s.id === sectionId);\n const swap = idx + dir;\n if (swap < 0 || swap >= prev.length) return prev;\n const next = [...prev];\n [next[idx], next[swap]] = [next[swap], next[idx]];\n return next;\n });\n }\n function updateSectionTitle(sectionId: string, value: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, title: withLang(s.title, language, value) } : s)));\n }\n function updateSectionBackground(sectionId: string, color: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, background: color } : s)));\n }\n function toggleSectionCollapse(sectionId: string) {\n setSections((prev) => prev.map((s) => (s.id === sectionId ? { ...s, collapsed: !s.collapsed } : s)));\n }\n\n function addField(type: FieldType) {\n const field = defaultFieldFor(type, language, chrome);\n const targetId = activeSectionId || sections[0]?.id;\n if (!targetId) return;\n setSections((prev) => prev.map((s) => (s.id === targetId ? { ...s, fields: [...s.fields, field] } : s)));\n setSelectedId(field.id);\n }\n function updateField(fieldId: string, patch: FieldPatch) {\n setSections((prev) => prev.map((s) => ({ ...s, fields: s.fields.map((f) => (f.id === fieldId ? ({ ...f, ...patch } as FormField) : f)) })));\n }\n function deleteField(fieldId: string) {\n setSections((prev) => prev.map((s) => ({ ...s, fields: s.fields.filter((f) => f.id !== fieldId) })));\n if (selectedId === fieldId) setSelectedId(null);\n }\n function duplicateField(fieldId: string) {\n const newId = nextId();\n setSections((prev) => prev.map((s) => {\n const idx = s.fields.findIndex((f) => f.id === fieldId);\n if (idx === -1) return s;\n const copy = { ...s.fields[idx], id: newId };\n const fields = [...s.fields];\n fields.splice(idx + 1, 0, copy);\n return { ...s, fields };\n }));\n setSelectedId(newId);\n }\n function moveField(fieldId: string, dir: 1 | -1) {\n setSections((prev) => prev.map((s) => {\n const idx = s.fields.findIndex((f) => f.id === fieldId);\n if (idx === -1) return s;\n const swap = idx + dir;\n if (swap < 0 || swap >= s.fields.length) return s;\n const fields = [...s.fields];\n [fields[idx], fields[swap]] = [fields[swap], fields[idx]];\n return { ...s, fields };\n }));\n }\n function reorderWithinSection(sectionId: string, fromIdx: number | null, toIdx: number | null) {\n if (fromIdx === toIdx || fromIdx == null || toIdx == null) return;\n setSections((prev) => prev.map((s) => {\n if (s.id !== sectionId) return s;\n const fields = [...s.fields];\n const [moved] = fields.splice(fromIdx, 1);\n fields.splice(toIdx, 0, moved);\n return { ...s, fields };\n }));\n }\n function updateOption(fieldId: string, optIdx: number, patch: { label?: LocalizedString; value?: string }) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => {\n if (f.id !== fieldId || !(\"options\" in f) || !f.options) return f;\n return { ...f, options: f.options.map((o, i) => (i === optIdx ? { ...o, ...patch } : o)) };\n }),\n })));\n }\n function addOption(fieldId: string) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => {\n if (f.id !== fieldId || !(\"options\" in f) || !f.options) return f;\n // Next free number, not length+1: after a removal that could repeat an existing value.\n const used = new Set(f.options.map((o) => o.value));\n let n = f.options.length + 1;\n while (used.has(`option_${n}`)) n++;\n return { ...f, options: [...f.options, { label: withLang(bi(), language, chrome.optionSeed(n)), value: `option_${n}` }] };\n }),\n })));\n }\n function removeOption(fieldId: string, optIdx: number) {\n setSections((prev) => prev.map((s) => ({\n ...s,\n fields: s.fields.map((f) => {\n if (f.id !== fieldId || !(\"options\" in f) || !f.options) return f;\n const removed = f.options[optIdx]?.value;\n const options = f.options.filter((_, i) => i !== optIdx);\n // Keep defaultValue pointing only at options that still exist.\n if (f.type === \"checkboxGroup\") return { ...f, options, defaultValue: f.defaultValue.filter((v) => v !== removed) };\n if ((f.type === \"select\" || f.type === \"radio\") && f.defaultValue === removed) return { ...f, options, defaultValue: \"\" };\n return { ...f, options };\n }),\n })));\n }\n\n function loadDocument(doc: DocumentFields) {\n resyncIdCounter(doc.sections.flatMap((s) => s.fields));\n setSections(doc.sections);\n setActiveSectionId(doc.sections[0]?.id || null);\n setTitle(doc.title);\n setSelectedId(null);\n }\n\n function resetToBlank() {\n const s = defaultSection();\n setSections([s]);\n setActiveSectionId(s.id);\n setTitle(bi(\"Untitled form\", \"\"));\n setSelectedId(null);\n }\n\n return {\n title, sections, activeSectionId, selectedId,\n allFields, selected, activeSection,\n setActiveSectionId, setSelectedId, setTitle,\n updateTitle,\n addSection, duplicateSection, deleteSection, moveSection,\n updateSectionTitle, updateSectionBackground, toggleSectionCollapse,\n addField, updateField, deleteField, duplicateField, moveField, reorderWithinSection,\n updateOption, addOption, removeOption,\n loadDocument, resetToBlank,\n };\n}\n\nexport type UseFormDocumentResult = ReturnType<typeof useFormDocument>;\n","import { useEffect, useRef, useState } from \"react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { DocumentFields, FormDocument, LocalizedString, SavedFormMeta, StorageAdapter, TemplateChange, ThemeOverrides } from \"../types\";\nimport { DRAFT_KEY, INDEX_KEY, formKey } from \"../lib/storage/keys\";\nimport { DOCUMENT_VERSION, migrateDocument } from \"../lib/migrate\";\nimport { genFormId } from \"../lib/id\";\nimport { compactDocument } from \"../lib/compact\";\nimport { bi, t } from \"../lib/bilingual\";\n\nexport interface UsePersistenceArgs {\n storage: StorageAdapter;\n autosave: boolean;\n templateMax: number;\n /** false = pick-and-apply only (no create/overwrite/delete). */\n templateManage: boolean;\n language: string;\n chrome: ChromeShape;\n document: DocumentFields;\n initialDocument?: FormDocument;\n onLoadDocument: (doc: DocumentFields) => void;\n onLoadThemeOverrides: (overrides: ThemeOverrides) => void;\n onTitleChange: (title: LocalizedString) => void;\n onNewForm: () => void;\n onTemplateChange?: (change: TemplateChange) => void;\n ensureActiveSection: () => void;\n}\n\nexport type TemplateState = \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n\nfunction snapshotOf(d: DocumentFields): string {\n return JSON.stringify({ title: d.title, themeOverrides: d.themeOverrides, sections: d.sections });\n}\n\nexport interface SaveAsPrompt {\n open: boolean;\n suggestedName: string;\n}\n\n/**\n * Draft autoload + autosave + the templates library, over a pluggable StorageAdapter.\n * Both effects live here because the load effect's `hasLoadedOnce` ref gates the autosave one.\n */\nexport function usePersistence({\n storage, autosave, templateMax, templateManage, language, chrome, document, initialDocument, onLoadDocument, onLoadThemeOverrides, onTitleChange, onNewForm, onTemplateChange, ensureActiveSection,\n}: UsePersistenceArgs) {\n const [currentFormId, setCurrentFormId] = useState<string | null>(null);\n const [loadingDraft, setLoadingDraft] = useState(true);\n const [saveState, setSaveState] = useState<\"idle\" | \"saving\" | \"saved\" | \"error\">(\"idle\");\n const [templateState, setTemplateState] = useState<TemplateState>(\"idle\");\n const [savedForms, setSavedForms] = useState<SavedFormMeta[]>([]);\n const [saveAsPrompt, setSaveAsPrompt] = useState<SaveAsPrompt | null>(null);\n const [notice, setNotice] = useState<{ title: string; message: string } | null>(null);\n\n const autosaveTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const hasLoadedOnce = useRef(false);\n // Document JSON as last synced with a template; compared to the live doc for the \"Edited\" flag. null = no active template.\n const savedSnapshot = useRef<string | null>(null);\n\n function flashSaved() {\n setTemplateState(\"saved\");\n setTimeout(() => setTemplateState((s) => (s === \"saved\" ? \"idle\" : s)), 1500);\n }\n\n async function refreshLibrary() {\n try {\n const raw = await storage.get(INDEX_KEY);\n const list: SavedFormMeta[] = raw ? JSON.parse(raw) : [];\n setSavedForms(list.sort((a, b) => b.updatedAt - a.updatedAt));\n } catch {\n setSavedForms([]);\n }\n }\n\n useEffect(() => {\n (async () => {\n try {\n if (initialDocument) {\n const doc = migrateDocument(initialDocument);\n if (doc) {\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n } else {\n ensureActiveSection();\n }\n } else {\n const raw = await storage.get(DRAFT_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n const doc = migrateDocument(parsed);\n if (doc) {\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n }\n if (parsed.currentFormId && templateManage) {\n setCurrentFormId(parsed.currentFormId);\n // Snapshot the template record, not the draft, so \"Edited\" stays honest across reloads.\n try {\n const tplRaw = await storage.get(formKey(parsed.currentFormId));\n const tplDoc = tplRaw ? migrateDocument(JSON.parse(tplRaw)) : null;\n savedSnapshot.current = tplDoc ? snapshotOf(tplDoc) : null;\n } catch {\n savedSnapshot.current = null;\n }\n }\n } else {\n ensureActiveSection();\n }\n }\n } catch {\n ensureActiveSection();\n } finally {\n setLoadingDraft(false);\n hasLoadedOnce.current = true;\n }\n })();\n refreshLibrary();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!hasLoadedOnce.current || !autosave) return;\n setSaveState(\"saving\");\n if (autosaveTimer.current) clearTimeout(autosaveTimer.current);\n autosaveTimer.current = setTimeout(async () => {\n try {\n await storage.set(DRAFT_KEY, JSON.stringify({ version: DOCUMENT_VERSION, ...compactDocument(document), currentFormId }));\n setSaveState(\"saved\");\n } catch {\n setSaveState(\"error\");\n }\n }, 600);\n return () => {\n if (autosaveTimer.current) clearTimeout(autosaveTimer.current);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [document.title, document.themeOverrides, document.sections, currentFormId]);\n\n async function saveAs(name: string) {\n if (!templateManage) return;\n if (savedForms.length >= templateMax) {\n setSaveAsPrompt(null);\n setNotice({ title: chrome.templatesLimitTitle, message: chrome.templatesLimitReached(templateMax) });\n return;\n }\n const id = genFormId();\n const now = Date.now();\n setTemplateState(\"saving\");\n try {\n const newTitle = bi(name, \"\");\n const docToSave: DocumentFields = { ...document, title: newTitle };\n await storage.set(formKey(id), JSON.stringify({ version: DOCUMENT_VERSION, ...compactDocument(docToSave), id, updatedAt: now }));\n const next = [...savedForms, { id, title: name, updatedAt: now }];\n await storage.set(INDEX_KEY, JSON.stringify(next));\n setSavedForms(next);\n setCurrentFormId(id);\n onTitleChange(newTitle);\n setSaveAsPrompt(null);\n savedSnapshot.current = snapshotOf(docToSave);\n flashSaved();\n onTemplateChange?.({ id, title: name, source: \"new\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n async function saveExisting() {\n if (!templateManage) return;\n if (!currentFormId) {\n setSaveAsPrompt({ open: true, suggestedName: t(document.title, language) });\n return;\n }\n const now = Date.now();\n setTemplateState(\"saving\");\n try {\n await storage.set(formKey(currentFormId), JSON.stringify({ version: DOCUMENT_VERSION, ...compactDocument(document), id: currentFormId, updatedAt: now }));\n const next = savedForms.map((f) => (f.id === currentFormId ? { ...f, title: t(document.title, \"en\"), updatedAt: now } : f));\n setSavedForms(next);\n await storage.set(INDEX_KEY, JSON.stringify(next));\n savedSnapshot.current = snapshotOf(document);\n flashSaved();\n onTemplateChange?.({ id: currentFormId, title: t(document.title, language), source: \"saved\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n async function loadForm(id: string): Promise<boolean> {\n setTemplateState(\"loading\");\n try {\n const raw = await storage.get(formKey(id));\n if (!raw) {\n console.error(`[form-page-builder] loadForm(${id}): storage returned no data for this id`);\n setTemplateState(\"error\");\n return false;\n }\n const doc = migrateDocument(JSON.parse(raw));\n if (!doc) {\n console.error(`[form-page-builder] loadForm(${id}): stored data failed migrateDocument()`, raw);\n setTemplateState(\"error\");\n return false;\n }\n onLoadDocument(doc);\n onLoadThemeOverrides(doc.themeOverrides);\n // Pick-and-apply mode: template is just a seed, so don't bind currentFormId to it.\n const boundId = templateManage ? id : null;\n setCurrentFormId(boundId);\n savedSnapshot.current = boundId ? snapshotOf(doc) : null;\n setTemplateState(\"idle\");\n onTemplateChange?.({ id, title: t(doc.title, language), source: \"applied\" });\n return true;\n } catch (err) {\n console.error(`[form-page-builder] loadForm(${id}) threw`, err);\n setTemplateState(\"error\");\n return false;\n }\n }\n\n async function deleteForm(id: string) {\n if (!templateManage) return;\n const removed = savedForms.find((f) => f.id === id);\n setTemplateState(\"loading\");\n try {\n await storage.delete(formKey(id));\n const next = savedForms.filter((f) => f.id !== id);\n setSavedForms(next);\n await storage.set(INDEX_KEY, JSON.stringify(next));\n if (currentFormId === id) {\n setCurrentFormId(null);\n savedSnapshot.current = null;\n }\n setTemplateState(\"idle\");\n onTemplateChange?.({ id: currentFormId === id ? null : id, title: removed?.title ?? \"\", source: \"deleted\" });\n } catch {\n setTemplateState(\"error\");\n }\n }\n\n function newForm() {\n onNewForm();\n setCurrentFormId(null);\n savedSnapshot.current = null;\n setTemplateState(\"idle\");\n }\n\n const activeTemplate = currentFormId ? savedForms.find((f) => f.id === currentFormId) ?? null : null;\n const isTemplateDirty = savedSnapshot.current !== null && snapshotOf(document) !== savedSnapshot.current;\n\n function dismissSaveAsPrompt() {\n setSaveAsPrompt(null);\n }\n\n return {\n loadingDraft, saveState, templateState, savedForms, currentFormId,\n activeTemplateTitle: activeTemplate?.title ?? null,\n isTemplateDirty,\n saveAs, saveExisting, loadForm, deleteForm, refreshLibrary, newForm,\n saveAsPrompt, dismissSaveAsPrompt,\n notice, dismissNotice: () => setNotice(null),\n };\n}\n\nexport type UsePersistenceResult = ReturnType<typeof usePersistence>;\n","export const DRAFT_KEY = \"form-page-builder:draft\";\nexport const INDEX_KEY = \"form-page-builder:index\";\nexport const formKey = (id: string) => `form-page-builder:saved:${id}`;\n/** Template id from a `formKey` result, else null — lets a StorageAdapter route per-template keys. */\nexport const savedFormId = (key: string): string | null =>\n key.startsWith(\"form-page-builder:saved:\") ? key.slice(\"form-page-builder:saved:\".length) : null;\n/** Copy/paste-template scratch slot — always localStorage, never the StorageAdapter. */\nexport const CLIPBOARD_KEY = \"form-page-builder:clipboard\";\n","import type { FormField } from \"../types\";\nimport { getMeta } from \"../constants/fieldTypes\";\n\ntype Json = Record<string, any>;\n\n// Base props that `migrateField` restores when absent, so omitting them is lossless.\nconst BASE_DEFAULTS: Json = {\n hideLabel: false, width: \"1/1\", verticalAlign: \"top\", labelPosition: \"top\", showIcon: false, required: false,\n};\n\n/** Stamped on compacted documents so a future change to a default can still read old ones with the defaults they were written under. */\nexport const COMPACT_VERSION = 1;\n\n// A missing language key reads the same as an empty one (`t()` falls back to `en`), so empty non-`en` entries are dropped.\nconst slimLocalized = (v: unknown) =>\n v && typeof v === \"object\"\n ? Object.fromEntries(Object.entries(v as Json).filter(([lang, s]) => lang === \"en\" || s !== \"\"))\n : v;\n\nconst isEmptyLocalized = (v: unknown) =>\n !!v && typeof v === \"object\" && Object.values(v as Json).every((s) => !s);\n\nconst isEmptyDefault = (v: unknown) =>\n v === \"\" || v === false || (Array.isArray(v) && v.length === 0);\n\nfunction compactField(field: FormField): Json {\n const out: Json = {};\n const meta = getMeta(field.type);\n for (const [key, value] of Object.entries(field)) {\n if (key in BASE_DEFAULTS && value === BASE_DEFAULTS[key]) continue;\n if (key === \"displayIcon\" && value === meta.defaultIcon) continue;\n if (key === \"placeholder\" && isEmptyLocalized(value)) continue;\n if (key === \"defaultValue\" && !meta.isContent && isEmptyDefault(value)) continue;\n if (key === \"label\" || key === \"placeholder\" || key === \"content\" || key === \"alt\") out[key] = slimLocalized(value);\n else if (key === \"options\" && Array.isArray(value)) out[key] = value.map((o) => ({ ...o, label: slimLocalized(o.label) }));\n else out[key] = value;\n }\n return out;\n}\n\n/**\n * Drops every field/section prop that equals its default, so persisted documents are smaller.\n * Lossless: `migrateDocument` restores the defaults, so `migrateDocument(compactDocument(d))` equals `migrateDocument(d)`.\n * Empty non-`en` translations are dropped too, and the result carries `compact: COMPACT_VERSION`.\n * Extra top-level keys (`version`, `theme`, `themeOverrides`, …) pass through untouched.\n */\nexport function compactDocument<T extends { title?: unknown; sections: { title?: unknown; fields: FormField[]; background?: string; collapsed?: boolean }[] }>(doc: T): T {\n return {\n ...doc,\n compact: COMPACT_VERSION,\n ...(doc.title !== undefined ? { title: slimLocalized(doc.title) } : {}),\n sections: doc.sections.map((s) => {\n const { background, collapsed, fields, ...rest } = s;\n return {\n ...rest,\n ...(s.title !== undefined ? { title: slimLocalized(s.title) } : {}),\n ...(background ? { background } : {}),\n ...(collapsed ? { collapsed } : {}),\n fields: fields.map(compactField),\n };\n }),\n } as unknown as T;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { DocumentFields, FormDocument } from \"../types\";\nimport { CLIPBOARD_KEY } from \"../lib/storage/keys\";\nimport { parseTemplate, serializeTemplate } from \"../lib/template\";\n\n/**\n * Cross-instance \"template clipboard\" over one localStorage key (not the StorageAdapter — this is\n * ephemeral per-browser scratch). Watched via `storage` events (other tabs) + this listener set (same tab).\n */\nconst sameTabListeners = new Set<() => void>();\nfunction notifySameTab() {\n sameTabListeners.forEach((fn) => fn());\n}\n\nfunction readKey(key: string): string | null {\n try {\n return typeof window !== \"undefined\" && window.localStorage ? window.localStorage.getItem(key) : null;\n } catch {\n return null;\n }\n}\n\nexport function useTemplateClipboard(clipboardKey: string = CLIPBOARD_KEY) {\n const keyRef = useRef(clipboardKey);\n keyRef.current = clipboardKey;\n\n const [hasClipboard, setHasClipboard] = useState(false);\n\n const refresh = useCallback(() => {\n setHasClipboard(parseTemplate(readKey(keyRef.current)) !== null);\n }, []);\n\n useEffect(() => {\n refresh();\n const onStorage = (e: StorageEvent) => {\n if (e.key === null || e.key === keyRef.current) refresh();\n };\n sameTabListeners.add(refresh);\n window.addEventListener(\"storage\", onStorage);\n return () => {\n sameTabListeners.delete(refresh);\n window.removeEventListener(\"storage\", onStorage);\n };\n }, [refresh]);\n\n const copyTemplate = useCallback((document: FormDocument) => {\n const str = serializeTemplate(document);\n try {\n window.localStorage?.setItem(keyRef.current, str);\n } catch {\n /* quota / unavailable */\n }\n notifySameTab();\n refresh();\n }, [refresh]);\n\n const readTemplate = useCallback((): DocumentFields | null => {\n return parseTemplate(readKey(keyRef.current));\n }, []);\n\n return { hasClipboard, copyTemplate, readTemplate };\n}\n","import { useRef, useState } from \"react\";\nimport type { DragEvent } from \"react\";\n\ntype ReorderFn = (sectionId: string, fromIdx: number | null, toIdx: number | null) => void;\n\nexport function useDragReorder(reorderWithinSection: ReorderFn) {\n const dragRef = useRef<{ sectionId: string | null; index: number | null }>({ sectionId: null, index: null });\n const [dragOverKey, setDragOverKey] = useState<string | null>(null);\n\n function getDropZoneHandlers(sectionId: string, index: number) {\n const dragKey = `${sectionId}:${index}`;\n return {\n onDragOver: (e: DragEvent) => {\n e.preventDefault();\n setDragOverKey(dragKey);\n },\n onDragLeave: () => setDragOverKey(null),\n onDrop: () => {\n if (dragRef.current.sectionId === sectionId) reorderWithinSection(sectionId, dragRef.current.index, index);\n dragRef.current = { sectionId: null, index: null };\n setDragOverKey(null);\n },\n };\n }\n\n function getDragHandleProps(sectionId: string, index: number) {\n return {\n draggable: true,\n onDragStart: () => {\n dragRef.current = { sectionId, index };\n },\n };\n }\n\n return { dragOverKey, getDropZoneHandlers, getDragHandleProps };\n}\n","import { Loader2, AlertCircle, Pencil, Eye, FilePlus2, FolderOpen, Save, Code2, ClipboardCopy, ClipboardPaste, Check } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { LanguageOption, LocalizedString } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { t } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { LanguageToggle } from \"./LanguageToggle\";\n\nexport interface ToolbarProps {\n title: LocalizedString;\n language: string;\n languages: LanguageOption[];\n mode: \"build\" | \"preview\";\n saveState: \"idle\" | \"saving\" | \"saved\" | \"error\";\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n activeTemplateTitle: string | null;\n templateDirty: boolean;\n chrome: ChromeShape;\n features: ResolvedFeatures;\n savedFormsCount: number;\n onTitleChange: (value: string) => void;\n onLanguageChange: (code: string) => void;\n onModeChange: (mode: \"build\" | \"preview\") => void;\n clipboardReady: boolean;\n templateCopied: boolean;\n onNewForm: () => void;\n onOpenLibrary: () => void;\n onSaveExisting: () => void;\n onOpenJson: () => void;\n onCopyTemplate: () => void;\n onPasteTemplate: () => void;\n}\n\nexport function Toolbar({\n title, language, languages, mode, saveState, templateState, activeTemplateTitle, templateDirty, chrome, features, savedFormsCount,\n clipboardReady, templateCopied,\n onTitleChange, onLanguageChange, onModeChange, onNewForm, onOpenLibrary, onSaveExisting, onOpenJson, onCopyTemplate, onPasteTemplate,\n}: ToolbarProps) {\n return (\n <div style={styles.toolbar}>\n <div style={styles.toolbarLeft}>\n <div style={styles.logoMark}>FB</div>\n {features.naming ? (\n <input value={t(title, language)} onChange={(e) => onTitleChange(e.target.value)} style={styles.titleInput} aria-label=\"Form title\" />\n ) : (\n <span style={styles.titleInput}>{t(title, language)}</span>\n )}\n {templateState === \"loading\" ? (\n <span style={styles.saveStatus}><Loader2 size={12} className=\"spin\" /> {chrome.templateLoading}</span>\n ) : activeTemplateTitle && (\n <span className=\"fb-template-tag\" style={styles.templateTag} title={chrome.templateLabel(activeTemplateTitle)}>\n <span style={{ overflow: \"hidden\", textOverflow: \"ellipsis\" }}>{chrome.templateLabel(activeTemplateTitle)}</span>\n {templateDirty && <span style={styles.currentBadge}>{chrome.templateEdited}</span>}\n </span>\n )}\n </div>\n <div style={styles.toolbarRight}>\n <span style={styles.saveStatus}>\n {saveState === \"saving\" && (<><Loader2 size={12} className=\"spin\" /> {chrome.saving}</>)}\n {saveState === \"saved\" && chrome.saved}\n {saveState === \"error\" && (<span style={{ color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 4 }}><AlertCircle size={12} /> {chrome.saveFailed}</span>)}\n </span>\n {features.languageSwitcher && (\n <>\n <div style={styles.toolbarDivider} />\n <LanguageToggle languages={languages} value={language} onChange={onLanguageChange} />\n </>\n )}\n {features.previewMode && (\n <>\n <div style={styles.toolbarDivider} />\n <button style={mode === \"build\" ? styles.tabBtnActive : styles.tabBtn} onClick={() => onModeChange(\"build\")}><Pencil size={14} /> {chrome.build}</button>\n <button style={mode === \"preview\" ? styles.tabBtnActive : styles.tabBtn} onClick={() => onModeChange(\"preview\")}><Eye size={14} /> {chrome.preview}</button>\n </>\n )}\n {(features.newForm || features.templates.enabled) && <div style={styles.toolbarDivider} />}\n {features.newForm && (\n <button style={styles.ghostBtn} onClick={onNewForm} title={chrome.startNewForm}><FilePlus2 size={14} /> {chrome.newForm}</button>\n )}\n {features.templates.enabled && (\n <>\n <button style={styles.ghostBtn} onClick={onOpenLibrary} title={chrome.openTemplatesTitle}>\n <FolderOpen size={14} /> {chrome.templates}\n {savedFormsCount > 0 && <span style={styles.countBadge}>{savedFormsCount}</span>}\n </button>\n {features.templates.manage && (\n <button style={styles.primaryBtn} onClick={onSaveExisting} title={chrome.saveToLibraryTitle}><Save size={14} /> {chrome.save}</button>\n )}\n </>\n )}\n {features.jsonView && (\n <button style={styles.ghostBtn} onClick={onOpenJson}><Code2 size={14} /> {chrome.viewJson}</button>\n )}\n {features.templateClipboard && (\n <>\n <button style={styles.toolbarIconBtn} onClick={onCopyTemplate} title={chrome.copyTemplateTitle} aria-label={chrome.copyTemplate}>\n {templateCopied ? <Check size={14} /> : <ClipboardCopy size={14} />}\n </button>\n <button style={styles.toolbarIconBtn} onClick={onPasteTemplate} disabled={!clipboardReady} title={chrome.pasteTemplateTitle} aria-label={chrome.pasteTemplate}>\n <ClipboardPaste size={14} />\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport const styles: Record<string, CSSProperties> = {\n app: { fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, sans-serif\", background: \"var(--fb-canvas)\", borderRadius: 12, overflow: \"hidden\", border: \"1px solid var(--fb-border)\", color: \"var(--fb-ink)\", display: \"flex\", flexDirection: \"column\" },\n toolbar: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"var(--fb-space-toolbar) 16px\", borderBottom: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", flexWrap: \"wrap\", gap: 8, position: \"relative\" },\n toolbarLeft: { display: \"flex\", alignItems: \"center\", gap: 10, minWidth: 0, flexShrink: 1 },\n logoMark: { width: 26, height: 26, borderRadius: 7, background: \"var(--fb-primary)\", color: \"#fff\", fontSize: 11, fontWeight: 700, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", fontFamily: \"'JetBrains Mono', monospace\", letterSpacing: \"-0.5px\" },\n titleInput: { border: \"none\", outline: \"none\", fontSize: 14, fontWeight: 600, background: \"transparent\", color: \"var(--fb-ink)\", padding: \"4px 6px\", borderRadius: 6, minWidth: 160 },\n toolbarRight: { display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\" },\n toolbarDivider: { width: 1, height: 20, background: \"var(--fb-border)\", margin: \"0 4px\" },\n tabBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid transparent\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 13, fontWeight: 500 },\n tabBtnActive: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-primary-soft)\", color: \"var(--fb-primary)\", fontSize: 13, fontWeight: 600 },\n ghostBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 12px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\", fontSize: 13, fontWeight: 500 },\n primaryBtn: { display: \"flex\", alignItems: \"center\", gap: 6, padding: \"6px 13px\", borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary)\", color: \"#fff\", fontSize: 13, fontWeight: 600 },\n saveStatus: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12, color: \"var(--fb-muted)\", minWidth: 60 },\n templateTag: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12, color: \"var(--fb-muted)\", minWidth: 0, flexShrink: 1, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n toolbarIconBtn: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"6px 9px\", borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\" },\n countBadge: { fontSize: 10.5, fontWeight: 700, background: \"var(--fb-primary-soft)\", color: \"var(--fb-primary)\", borderRadius: 9, padding: \"1px 6px\", marginLeft: 2 },\n loadingScreen: { flex: 1, display: \"flex\", flexDirection: \"column\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n libraryBody: { padding: \"var(--fb-space-panel)\", overflowY: \"auto\", display: \"flex\", flexDirection: \"column\", gap: 4 },\n libraryRow: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 10, padding: \"10px 8px\", borderRadius: 8, border: \"1px solid var(--fb-border)\" },\n libraryRowTitle: { fontSize: 13.5, fontWeight: 600, color: \"var(--fb-ink)\", display: \"flex\", alignItems: \"center\", gap: 8, overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" },\n libraryRowMeta: { fontSize: 11.5, color: \"var(--fb-muted)\", marginTop: 2 },\n currentBadge: { fontSize: 10, fontWeight: 700, color: \"var(--fb-primary)\", background: \"var(--fb-primary-soft)\", padding: \"2px 6px\", borderRadius: 5, flexShrink: 0 },\n workArea: { display: \"flex\", flex: 1, minHeight: 0 },\n palette: { width: 200, borderRight: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", padding: \"var(--fb-space-panel)\", overflowY: \"auto\" },\n panelHeading: { fontSize: 11, fontWeight: 700, letterSpacing: \"0.06em\", textTransform: \"uppercase\", color: \"var(--fb-muted)\", marginBottom: 10 },\n activeSectionHint: { fontSize: 11.5, color: \"var(--fb-muted)\", marginBottom: 14, lineHeight: 1.4 },\n paletteList: { display: \"flex\", flexDirection: \"column\", gap: 4 },\n paletteItem: { display: \"flex\", alignItems: \"center\", gap: 9, padding: \"8px 9px\", borderRadius: 8, border: \"1px solid transparent\", background: \"transparent\", fontSize: 13, color: \"var(--fb-ink)\", textAlign: \"left\" },\n canvas: { flex: 1, padding: \"var(--fb-space-canvas)\", overflowY: \"auto\", background: \"var(--fb-canvas)\" },\n sectionBlock: { borderRadius: 12, padding: \"var(--fb-space-panel)\", marginBottom: \"var(--fb-space-section)\", transition: \"border-color 0.12s\" },\n sectionHeader: { display: \"flex\", alignItems: \"center\", gap: 8, marginBottom: 12, flexWrap: \"wrap\" },\n chevronBtn: { width: 22, height: 22, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", flexShrink: 0 },\n colorDot: { width: 10, height: 10, borderRadius: \"50%\", border: \"1px solid var(--fb-border)\", flexShrink: 0 },\n sectionTitleInput: { border: \"none\", outline: \"none\", background: \"transparent\", fontSize: 14, fontWeight: 700, color: \"var(--fb-ink)\", padding: \"2px 0\", minWidth: 120, flex: 1 },\n sectionHeaderActions: { display: \"flex\", alignItems: \"center\", gap: 6, flexWrap: \"wrap\", marginLeft: \"auto\" },\n sectionEmpty: { fontSize: 12.5, color: \"var(--fb-muted)\", padding: \"18px 4px\", textAlign: \"center\", border: \"1px dashed var(--fb-border)\", borderRadius: 8 },\n resetLinkBtn: { display: \"flex\", alignItems: \"center\", gap: 3, fontSize: 11, color: \"var(--fb-muted)\", background: \"transparent\", border: \"none\", padding: \"2px 4px\" },\n addSectionBtn: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 6, width: \"100%\", padding: \"10px\", borderRadius: 10, border: \"1px dashed var(--fb-border)\", background: \"transparent\", color: \"var(--fb-primary)\", fontSize: 13, fontWeight: 600 },\n swatchRow: { display: \"flex\", alignItems: \"center\", gap: 5, flexWrap: \"wrap\" },\n swatchBtn: { width: 20, height: 20, borderRadius: \"50%\", border: \"1px solid var(--fb-border)\", padding: 0 },\n swatchBtnActive: { border: \"2px solid var(--fb-primary)\" },\n colorPickerInput: { width: 22, height: 22, padding: 0, border: \"none\", borderRadius: \"50%\", overflow: \"hidden\", background: \"none\", cursor: \"pointer\" },\n fieldList: { display: \"flex\", flexWrap: \"wrap\", gap: \"var(--fb-space-field)\" },\n ticket: { display: \"flex\", alignItems: \"stretch\", background: \"var(--fb-surface)\", border: \"1px solid var(--fb-border)\", borderRadius: 10, position: \"relative\", transition: \"border-color 0.12s, box-shadow 0.12s\" },\n ticketSelected: { borderColor: \"var(--fb-primary)\", boxShadow: \"0 0 0 3px var(--fb-primary-soft)\" },\n ticketDragOver: { borderColor: \"var(--fb-muted)\" },\n ticketIndex: { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 13, fontWeight: 700, color: \"var(--fb-border)\", width: 34, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", flexShrink: 0 },\n ticketPerforation: { width: 0, borderLeft: \"1px dashed var(--fb-border)\" },\n ticketBody: { flex: 1, padding: \"10px var(--fb-space-ticket)\", minWidth: 0 },\n ticketTop: { display: \"flex\", alignItems: \"center\", gap: 7, marginBottom: 4 },\n typeBadge: { fontSize: 10.5, fontFamily: \"'JetBrains Mono', monospace\", color: \"var(--fb-muted)\" },\n requiredBadge: { fontSize: 10, fontWeight: 700, color: \"var(--fb-danger)\", background: \"var(--fb-danger-soft)\", padding: \"2px 6px\", borderRadius: 5, letterSpacing: \"0.02em\", marginLeft: \"auto\" },\n chipRow: { display: \"flex\", gap: 5, marginBottom: 7, flexWrap: \"wrap\" },\n miniBadge: { fontSize: 10, fontWeight: 600, color: \"var(--fb-primary)\", background: \"var(--fb-primary-soft)\", padding: \"2px 6px\", borderRadius: 5, letterSpacing: \"0.02em\" },\n langToggleTrack: { position: \"relative\", display: \"flex\", gap: 3, background: \"var(--fb-surface-2)\", padding: 3, borderRadius: 20 },\n langToggleThumb: { position: \"absolute\", top: 3, left: 3, bottom: 3, background: \"var(--fb-primary)\", borderRadius: 17, transition: \"transform 0.18s ease\" },\n langToggleBtn: { position: \"relative\", zIndex: 1, padding: \"5px 12px\", borderRadius: 17, border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 12.5, fontWeight: 600, whiteSpace: \"nowrap\" },\n langToggleBtnActive: { position: \"relative\", zIndex: 1, padding: \"5px 12px\", borderRadius: 17, border: \"none\", background: \"transparent\", color: \"#fff\", fontSize: 12.5, fontWeight: 600, whiteSpace: \"nowrap\" },\n segmented: { display: \"flex\", gap: 3, background: \"var(--fb-surface-2)\", padding: 3, borderRadius: 8, marginBottom: 4 },\n segmentedBtn: { flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 5, padding: \"6px 8px\", borderRadius: 6, border: \"none\", background: \"transparent\", color: \"var(--fb-muted)\", fontSize: 12.5, fontWeight: 500 },\n segmentedBtnActive: { flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", gap: 5, padding: \"6px 8px\", borderRadius: 6, border: \"none\", background: \"var(--fb-surface)\", color: \"var(--fb-ink)\", fontSize: 12.5, fontWeight: 600, boxShadow: \"0 1px 2px rgba(0,0,0,0.08)\" },\n iconGrid: { display: \"grid\", gridTemplateColumns: \"repeat(6, 1fr)\", gap: 5, marginTop: 6 },\n iconGridBtn: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n iconGridBtnActive: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary-soft)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-primary)\" },\n styleToggleRow: { display: \"flex\", gap: 5, marginBottom: 4 },\n styleToggle: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n styleToggleActive: { width: 30, height: 30, borderRadius: 7, border: \"1px solid var(--fb-primary)\", background: \"var(--fb-primary-soft)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-primary)\" },\n previewInput: { border: \"1px solid var(--fb-border)\", borderRadius: 7, padding: \"7px 10px\", fontSize: 13, color: \"var(--fb-muted)\", background: \"var(--fb-surface-2)\", display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" },\n previewRadio: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 13, color: \"var(--fb-ink)\" },\n ticketActions: { display: \"flex\", flexDirection: \"column\", gap: 3, padding: 8, borderLeft: \"1px solid var(--fb-border)\" },\n iconBtn: { width: 24, height: 24, borderRadius: 6, border: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", color: \"var(--fb-muted)\" },\n iconBtnDanger: { color: \"var(--fb-danger)\" },\n inspector: { width: 270, borderLeft: \"1px solid var(--fb-border)\", background: \"var(--fb-surface)\", padding: \"var(--fb-space-panel)\", overflowY: \"auto\" },\n inspectorEmpty: { fontSize: 13, color: \"var(--fb-muted)\", lineHeight: 1.5, marginTop: 6 },\n inspectorBody: { display: \"flex\", flexDirection: \"column\", gap: 4 },\n helperText: { fontSize: 11, color: \"var(--fb-muted)\", lineHeight: 1.4, margin: \"2px 0 4px\" },\n propLabel: { fontSize: 11.5, fontWeight: 600, color: \"var(--fb-muted)\", marginTop: 12, marginBottom: 5 },\n propInput: { border: \"1px solid var(--fb-border)\", borderRadius: 7, padding: \"7px 9px\", fontSize: 13, color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\", width: \"100%\", boxSizing: \"border-box\" },\n optionList: { display: \"flex\", flexDirection: \"column\", gap: 6 },\n optionRow: { display: \"flex\", gap: 6, alignItems: \"center\" },\n optionInput: { flex: 1, border: \"1px solid var(--fb-border)\", borderRadius: 6, padding: \"6px 8px\", fontSize: 12.5, color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\", minWidth: 0, boxSizing: \"border-box\" },\n addOptionBtn: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12.5, color: \"var(--fb-primary)\", background: \"transparent\", border: \"1px dashed var(--fb-border)\", borderRadius: 7, padding: \"6px 8px\", justifyContent: \"center\", marginTop: 2 },\n toggleRow: { display: \"flex\", alignItems: \"center\", gap: 8, background: \"transparent\", border: \"none\", padding: \"8px 0\" },\n toggleTrack: { width: 30, height: 17, borderRadius: 20, position: \"relative\", transition: \"background 0.15s\", display: \"inline-block\" },\n toggleThumb: { position: \"absolute\", top: 2, left: 2, width: 13, height: 13, borderRadius: \"50%\", background: \"#fff\", transition: \"transform 0.15s\", boxShadow: \"0 1px 2px rgba(0,0,0,0.2)\" },\n inspectorDivider: { height: 1, background: \"var(--fb-border)\", margin: \"14px 0 10px\" },\n deleteFieldBtn: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12.5, color: \"var(--fb-danger)\", background: \"var(--fb-danger-soft)\", border: \"none\", borderRadius: 7, padding: \"8px 10px\", justifyContent: \"center\" },\n modalOverlay: { position: \"fixed\", inset: 0, background: \"rgba(20,22,28,0.45)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 50, padding: 16, boxSizing: \"border-box\" },\n modal: { background: \"var(--fb-surface)\", borderRadius: 12, width: \"100%\", maxWidth: 520, maxHeight: \"70vh\", display: \"flex\", flexDirection: \"column\", overflow: \"hidden\", boxShadow: \"0 20px 60px rgba(0,0,0,0.25)\", boxSizing: \"border-box\" },\n modalHeader: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", padding: \"12px 16px\", borderBottom: \"1px solid var(--fb-border)\" },\n jsonPre: { margin: 0, padding: 16, fontSize: 12, lineHeight: 1.6, overflow: \"auto\", background: \"#14171C\", color: \"#D6D8E0\", fontFamily: \"'JetBrains Mono', monospace\" },\n previewWrap: { flex: 1, display: \"flex\", justifyContent: \"center\", padding: \"var(--fb-space-page) 20px\", overflowY: \"auto\", background: \"var(--fb-canvas)\" },\n previewToolbar: { width: \"100%\", display: \"flex\", gap: 10, marginBottom: 16, justifyContent: \"center\" },\n previewCard: { width: \"100%\", maxWidth: 480, background: \"var(--fb-page-bg)\", border: \"1px solid var(--fb-border)\", borderRadius: 12, padding: \"var(--fb-space-page)\" },\n previewTitle: { fontSize: 19, fontWeight: 700, margin: \"0 0 20px\" },\n previewLabel: { display: \"block\", fontSize: 13, fontWeight: 600, color: \"var(--fb-ink)\", marginBottom: 6 },\n previewGrid: { display: \"flex\", flexWrap: \"wrap\", gap: \"var(--fb-space-field)\" },\n sectionRuntimeTitle: { fontSize: 15, fontWeight: 700, margin: \"0 0 12px\", color: \"var(--fb-ink)\" },\n imagePlaceholder: { display: \"flex\", alignItems: \"center\", justifyContent: \"center\", border: \"1px dashed var(--fb-border)\" },\n fieldError: { display: \"flex\", alignItems: \"center\", gap: 5, fontSize: 12, color: \"var(--fb-danger)\", marginTop: 5 },\n formErrorNote: { display: \"flex\", alignItems: \"center\", gap: 6, fontSize: 12.5, color: \"var(--fb-danger)\", marginTop: 10, justifyContent: \"center\" },\n submittedList: { display: \"flex\", flexDirection: \"column\", gap: 8, marginTop: 4 },\n submittedRow: { display: \"flex\", justifyContent: \"space-between\", gap: 12, fontSize: 13, padding: \"6px 0\", borderBottom: \"1px solid var(--fb-border)\" },\n submittedLabel: { color: \"var(--fb-muted)\", flexShrink: 0 },\n submittedValue: { color: \"var(--fb-ink)\", fontWeight: 600, textAlign: \"right\" },\n realInput: { width: \"100%\", border: \"1px solid var(--fb-border)\", borderRadius: 8, padding: \"9px 11px\", fontSize: 13.5, outline: \"none\", color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", boxSizing: \"border-box\" },\n realInputError: { borderColor: \"var(--fb-danger)\" },\n submitBtn: { marginTop: 8, color: \"#fff\", border: \"none\", borderRadius: 8, fontWeight: 600, width: \"100%\" },\n layoutPanelHeader: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 4 },\n spacingRow: { display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", gap: 8, padding: \"4px 0\" },\n spacingLabel: { fontSize: 12, color: \"var(--fb-ink)\" },\n spacingInput: { width: 60, border: \"1px solid var(--fb-border)\", borderRadius: 6, padding: \"4px 6px\", fontSize: 12, textAlign: \"right\", color: \"var(--fb-ink)\", background: \"var(--fb-surface)\", outline: \"none\" },\n};\n","import type { LanguageOption } from \"../types\";\nimport { styles } from \"../styles/styles\";\n\nexport interface LanguageToggleProps {\n languages: LanguageOption[];\n value: string;\n onChange: (code: string) => void;\n}\n\nexport function LanguageToggle({ languages, value, onChange }: LanguageToggleProps) {\n const activeIdx = Math.max(0, languages.findIndex((l) => l.code === value));\n const n = languages.length || 1;\n\n return (\n <div style={styles.langToggleTrack}>\n <div\n style={{\n ...styles.langToggleThumb,\n width: `calc(${100 / n}% - 3px)`,\n transform: `translateX(calc(${activeIdx * 100}% + ${activeIdx * 3}px))`,\n }}\n />\n {languages.map((l) => (\n <button\n key={l.code}\n type=\"button\"\n style={l.code === value ? styles.langToggleBtnActive : styles.langToggleBtn}\n onClick={() => onChange(l.code)}\n >\n {l.label}\n </button>\n ))}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Plus } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { ContentBlockType, FieldType, InputFieldType, Theme } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { isContentBlockEnabled, isFieldTypeEnabled } from \"../lib/features\";\nimport { CONTENT_TYPES, FORM_TYPES, FIELD_TYPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { DesignPanel } from \"./DesignPanel\";\n\nexport interface PaletteProps {\n activeSectionLabel: string;\n chrome: ChromeShape;\n onAddField: (type: FieldType) => void;\n features: ResolvedFeatures;\n theme: Theme;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n /** Placed input-type field count, for gating against `features.maxFields`. */\n fieldCount: number;\n}\n\nexport function Palette({\n activeSectionLabel, chrome, onAddField, features, theme,\n updateThemeColor, updateThemeLayout, resetTheme, fieldCount,\n}: PaletteProps) {\n const [tab, setTab] = useState<\"blocks\" | \"design\">(\"blocks\");\n const contentTypes = CONTENT_TYPES.filter((f) => isContentBlockEnabled(features, f.type as ContentBlockType));\n const formTypes = FORM_TYPES.filter((f) => isFieldTypeEnabled(features, f.type as InputFieldType));\n // Content blocks aren't capped by maxFields.\n const atFieldCap = typeof features.maxFields === \"number\" && fieldCount >= features.maxFields;\n\n return (\n <div className=\"fb-palette\" style={styles.palette}>\n {features.design && (\n <div style={{ marginBottom: 14 }}>\n <Segmented\n options={[\n { value: \"blocks\", label: chrome.paletteTabBlocks },\n { value: \"design\", label: chrome.paletteTabDesign },\n ]}\n value={tab}\n onChange={setTab}\n />\n </div>\n )}\n\n {tab === \"design\" && features.design ? (\n <DesignPanel\n chrome={chrome}\n theme={theme}\n updateThemeColor={updateThemeColor}\n updateThemeLayout={updateThemeLayout}\n resetTheme={resetTheme}\n />\n ) : (\n <>\n <div style={styles.activeSectionHint}>\n {chrome.addingTo} <strong>{activeSectionLabel}</strong>\n </div>\n {contentTypes.length > 0 && (\n <>\n <div style={styles.panelHeading}>{chrome.contentBlocks}</div>\n <div style={styles.paletteList}>\n {contentTypes.map((f) => {\n const Icon = f.icon;\n return (<button key={f.type} style={styles.paletteItem} onClick={() => onAddField(f.type)}><Icon size={16} color=\"var(--fb-primary)\" /><span>{chrome[FIELD_TYPE_CHROME_KEY[f.type] as keyof ChromeShape] as string}</span><Plus size={13} color=\"var(--fb-muted)\" style={{ marginLeft: \"auto\" }} /></button>);\n })}\n </div>\n </>\n )}\n {formTypes.length > 0 && (\n <>\n <div style={{ ...styles.panelHeading, marginTop: 16 }}>{chrome.formFields}</div>\n {typeof features.maxFields === \"number\" && (\n <div role=\"status\" style={{ ...styles.activeSectionHint, marginBottom: 8, ...(atFieldCap ? { color: \"var(--fb-danger)\" } : {}) }}>\n {atFieldCap ? chrome.fieldLimitReached(features.maxFields) : chrome.fieldCount(fieldCount, features.maxFields)}\n </div>\n )}\n <div style={styles.paletteList}>\n {formTypes.map((f) => {\n const Icon = f.icon;\n const itemStyle = atFieldCap ? { ...styles.paletteItem, opacity: 0.45, cursor: \"not-allowed\" } : styles.paletteItem;\n return (<button key={f.type} type=\"button\" disabled={atFieldCap} style={itemStyle} onClick={() => onAddField(f.type)}><Icon size={16} color=\"var(--fb-primary)\" /><span>{chrome[FIELD_TYPE_CHROME_KEY[f.type] as keyof ChromeShape] as string}</span><Plus size={13} color=\"var(--fb-muted)\" style={{ marginLeft: \"auto\" }} /></button>);\n })}\n </div>\n </>\n )}\n </>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { IconComponent } from \"../constants/icons\";\nimport { styles } from \"../styles/styles\";\n\nexport interface SegmentedOption<T extends string = string> {\n value: T;\n label: ReactNode;\n icon?: IconComponent;\n}\n\nexport interface SegmentedProps<T extends string = string> {\n options: SegmentedOption<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function Segmented<T extends string = string>({ options, value, onChange }: SegmentedProps<T>) {\n return (\n <div style={styles.segmented}>\n {options.map((opt) => {\n const Icon = opt.icon;\n const active = value === opt.value;\n return (\n <button key={opt.value} type=\"button\" style={active ? styles.segmentedBtnActive : styles.segmentedBtn} onClick={() => onChange(opt.value)}>\n {Icon && <Icon size={13} />}{opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { RotateCcw } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { Theme } from \"../types\";\nimport { BUTTON_COLOR_SWATCHES, SECTION_BG_SWATCHES } from \"../constants/colors\";\nimport { SPACING_FIELDS } from \"../constants/layout\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\nimport { styles } from \"../styles/styles\";\n\nexport interface DesignPanelProps {\n chrome: ChromeShape;\n theme: Theme;\n updateThemeColor: (key: keyof Omit<Theme, \"layout\">, value: string) => void;\n updateThemeLayout: (key: keyof Theme[\"layout\"], value: number) => void;\n resetTheme: () => void;\n}\n\nexport function DesignPanel({ chrome, theme, updateThemeColor, updateThemeLayout, resetTheme }: DesignPanelProps) {\n return (\n <div>\n <div style={styles.layoutPanelHeader}>\n <span style={{ fontWeight: 600, fontSize: 13 }}>{chrome.theme}</span>\n <button type=\"button\" style={styles.resetLinkBtn} onClick={resetTheme}><RotateCcw size={11} /> {chrome.reset}</button>\n </div>\n <label style={styles.propLabel}>{chrome.primaryColor}</label>\n <div style={styles.swatchRow}>\n {BUTTON_COLOR_SWATCHES.slice(1).map((c) => (<button key={c} type=\"button\" title={c} style={{ ...styles.swatchBtn, background: c, ...(theme.primary === c ? styles.swatchBtnActive : {}) }} onClick={() => updateThemeColor(\"primary\", c)} />))}\n <input type=\"color\" value={theme.primary} onChange={(e) => updateThemeColor(\"primary\", e.target.value)} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.pageBackground}</label>\n <div style={styles.swatchRow}>\n {SECTION_BG_SWATCHES.filter(Boolean).map((c) => (<button key={c} type=\"button\" title={c} style={{ ...styles.swatchBtn, background: c, ...(theme.pageBackground === c ? styles.swatchBtnActive : {}) }} onClick={() => updateThemeColor(\"pageBackground\", c)} />))}\n <input type=\"color\" value={theme.pageBackground} onChange={(e) => updateThemeColor(\"pageBackground\", e.target.value)} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.maxWidthPx}</label>\n <input type=\"number\" style={styles.propInput} value={theme.layout.maxWidth} onChange={(e) => updateThemeLayout(\"maxWidth\", Number(e.target.value) || DEFAULT_THEME.layout.maxWidth)} />\n\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.spacing}</div>\n {SPACING_FIELDS.map(({ key, labelKey }) => (\n <div key={key} style={styles.spacingRow}>\n <span style={styles.spacingLabel}>{chrome[labelKey as keyof ChromeShape] as string}</span>\n <input type=\"number\" style={styles.spacingInput} value={theme.layout[key as keyof Theme[\"layout\"]]} onChange={(e) => updateThemeLayout(key as keyof Theme[\"layout\"], Number(e.target.value) || 0)} />\n </div>\n ))}\n </div>\n );\n}\n","export const COLOR_SWATCHES = [\"\", \"#1B1E24\", \"#5B5FEF\", \"#C4432E\", \"#0EA5A4\", \"#D97706\"];\nexport const SECTION_BG_SWATCHES = [\"\", \"#FFFFFF\", \"#F5F6F8\", \"#EEF0FF\", \"#FDF4E7\", \"#E9F7EF\", \"#FDECEC\"];\nexport const BUTTON_COLOR_SWATCHES = [\"\", \"#5B5FEF\", \"#0EA5A4\", \"#D97706\", \"#C4432E\", \"#1B1E24\"];\n","import { Monitor, Tablet, Smartphone } from \"lucide-react\";\nimport type { WidthOption } from \"../types\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport { DEFAULT_THEME } from \"../theme/defaultTheme\";\n\nexport const WIDTH_OPTIONS: { value: WidthOption; label?: string; labelKey?: string }[] = [\n { value: \"1/3\", label: \"1/3\" }, { value: \"1/2\", label: \"1/2\" }, { value: \"1/1\", labelKey: \"full\" },\n];\nexport const WIDTH_PERCENT: Record<WidthOption, string> = { \"1/3\": \"33.3333%\", \"1/2\": \"50%\", \"1/1\": \"100%\" };\nexport const ALIGN_MAP = { top: \"flex-start\", middle: \"center\", bottom: \"flex-end\" } as const;\n\nexport function effectiveWidth(width: WidthOption | undefined, device: string): WidthOption {\n if (device === \"mobile\") return \"1/1\";\n if (device === \"tablet\" && width === \"1/3\") return \"1/2\";\n return width || \"1/1\";\n}\n\n// Only spacing that shows up in Preview is editable here; canvas/toolbar/panel/ticket padding is builder-only.\nexport const SPACING_FIELDS = [\n { key: \"pagePadding\", labelKey: \"spacingPagePadding\" },\n { key: \"sectionGap\", labelKey: \"spacingSectionGap\" },\n { key: \"fieldGap\", labelKey: \"spacingFieldGap\" },\n] as const;\n\nexport interface DeviceOption {\n value: \"laptop\" | \"tablet\" | \"mobile\";\n label: string;\n icon: typeof Monitor;\n maxWidth: number;\n}\n\nexport function buildDeviceOptions(baseMaxWidth: number, chrome: ChromeShape): DeviceOption[] {\n const mw = Number(baseMaxWidth) > 0 ? baseMaxWidth : DEFAULT_THEME.layout.maxWidth;\n return [\n { value: \"laptop\", label: chrome.deviceLaptop, icon: Monitor, maxWidth: mw },\n { value: \"tablet\", label: chrome.deviceTablet, icon: Tablet, maxWidth: Math.min(mw, 480) },\n { value: \"mobile\", label: chrome.deviceMobile, icon: Smartphone, maxWidth: Math.min(mw, 340) },\n ];\n}\n","import { Layers } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, Section } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { styles } from \"../styles/styles\";\nimport { SectionCard } from \"./SectionCard\";\n\nexport interface CanvasProps {\n sections: Section[];\n activeSectionId: string | null;\n selectedId: string | null;\n dragOverKey: string | null;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n features: ResolvedFeatures;\n onActivateSection: (sectionId: string) => void;\n onToggleSectionCollapse: (sectionId: string) => void;\n onUpdateSectionTitle: (sectionId: string, value: string) => void;\n onUpdateSectionBackground: (sectionId: string, color: string) => void;\n onDuplicateSection: (sectionId: string) => void;\n onMoveSection: (sectionId: string, dir: 1 | -1) => void;\n onDeleteSection: (sectionId: string) => void;\n onAddSection: () => void;\n onSelectField: (sectionId: string, fieldId: string) => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n getDropZoneHandlers: (sectionId: string, idx: number) => { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n getDragHandleProps: (sectionId: string, idx: number) => { draggable: boolean; onDragStart: () => void };\n}\n\nexport function Canvas({\n sections, activeSectionId, selectedId, dragOverKey, chrome, strings, language, features,\n onActivateSection, onToggleSectionCollapse, onUpdateSectionTitle, onUpdateSectionBackground,\n onDuplicateSection, onMoveSection, onDeleteSection,\n onAddSection, onSelectField, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n getDropZoneHandlers, getDragHandleProps,\n}: CanvasProps) {\n return (\n <div className=\"fb-canvas\" style={styles.canvas}>\n {sections.map((section, sIdx) => (\n <SectionCard\n key={section.id}\n section={section}\n sIdx={sIdx}\n sectionsLength={sections.length}\n isActive={activeSectionId === section.id}\n selectedId={selectedId}\n dragOverKey={dragOverKey}\n chrome={chrome}\n strings={strings}\n language={language}\n features={features}\n onActivate={() => onActivateSection(section.id)}\n onToggleCollapse={() => onToggleSectionCollapse(section.id)}\n onUpdateTitle={(value) => onUpdateSectionTitle(section.id, value)}\n onUpdateBackground={(color) => onUpdateSectionBackground(section.id, color)}\n onDuplicateSection={() => onDuplicateSection(section.id)}\n onMoveSection={(dir) => onMoveSection(section.id, dir)}\n onDeleteSection={() => onDeleteSection(section.id)}\n onSelectField={(fieldId) => onSelectField(section.id, fieldId)}\n onFieldChange={onFieldChange}\n onMoveField={onMoveField}\n onDuplicateField={onDuplicateField}\n onDeleteField={onDeleteField}\n getDropZoneHandlers={getDropZoneHandlers}\n getDragHandleProps={getDragHandleProps}\n />\n ))}\n {features.sections && (\n <button style={styles.addSectionBtn} onClick={onAddSection}><Layers size={14} /> {chrome.addSection}</button>\n )}\n </div>\n );\n}\n","import { ChevronDown, ChevronRight, Copy, ArrowUp, ArrowDown, Trash2 } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, Section } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { SECTION_BG_SWATCHES } from \"../constants/colors\";\nimport { styles } from \"../styles/styles\";\nimport { t } from \"../lib/bilingual\";\nimport { FieldTicket } from \"./FieldTicket\";\n\nexport interface SectionCardProps {\n section: Section;\n sIdx: number;\n sectionsLength: number;\n isActive: boolean;\n selectedId: string | null;\n dragOverKey: string | null;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n features: ResolvedFeatures;\n onActivate: () => void;\n onToggleCollapse: () => void;\n onUpdateTitle: (value: string) => void;\n onUpdateBackground: (color: string) => void;\n onDuplicateSection: () => void;\n onMoveSection: (dir: 1 | -1) => void;\n onDeleteSection: () => void;\n onSelectField: (fieldId: string) => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n getDropZoneHandlers: (sectionId: string, idx: number) => { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n getDragHandleProps: (sectionId: string, idx: number) => { draggable: boolean; onDragStart: () => void };\n}\n\nexport function SectionCard({\n section, sIdx, sectionsLength, isActive, selectedId, dragOverKey, chrome, strings, language, features,\n onActivate, onToggleCollapse, onUpdateTitle, onUpdateBackground, onDuplicateSection, onMoveSection, onDeleteSection,\n onSelectField, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n getDropZoneHandlers, getDragHandleProps,\n}: SectionCardProps) {\n return (\n <div\n style={{ ...styles.sectionBlock, background: section.background || \"transparent\", border: isActive ? \"1px solid var(--fb-primary)\" : \"1px dashed var(--fb-border)\" }}\n onClick={onActivate}\n >\n <div style={styles.sectionHeader}>\n <button style={styles.chevronBtn} onClick={(e) => { e.stopPropagation(); onToggleCollapse(); }}>\n {section.collapsed ? <ChevronRight size={15} /> : <ChevronDown size={15} />}\n </button>\n <span style={{ ...styles.colorDot, background: section.background || \"var(--fb-canvas)\" }} />\n <input\n style={styles.sectionTitleInput}\n placeholder={chrome.sectionTitlePlaceholder(sIdx + 1)}\n value={t(section.title, language)}\n onChange={(e) => onUpdateTitle(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n {section.collapsed && <span style={styles.miniBadge}>{chrome.fieldsCount(section.fields.length)}</span>}\n <div style={styles.sectionHeaderActions} onClick={(e) => e.stopPropagation()}>\n {features.sectionBackground && !section.collapsed && (\n <div style={styles.swatchRow}>\n {SECTION_BG_SWATCHES.map((c) => (\n <button key={c || \"none\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-canvas)\", ...(section.background === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateBackground(c)} />\n ))}\n <input type=\"color\" title={chrome.customColor} value={/^#/.test(section.background) ? section.background : \"#ffffff\"} onChange={(e) => onUpdateBackground(e.target.value)} style={styles.colorPickerInput} />\n </div>\n )}\n {features.sections && (\n <>\n <button style={styles.iconBtn} title={chrome.duplicate} onClick={onDuplicateSection}><Copy size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveUp} disabled={sIdx === 0} onClick={() => onMoveSection(-1)}><ArrowUp size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveDown} disabled={sIdx === sectionsLength - 1} onClick={() => onMoveSection(1)}><ArrowDown size={13} /></button>\n <button style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} title={chrome.deleteSection} disabled={sectionsLength <= 1} onClick={onDeleteSection}><Trash2 size={13} /></button>\n </>\n )}\n </div>\n </div>\n\n {!section.collapsed && (\n section.fields.length === 0 ? (\n <div style={styles.sectionEmpty}>{chrome.noFieldsInSection}</div>\n ) : (\n <div style={styles.fieldList}>\n {section.fields.map((field, idx) => (\n <FieldTicket\n key={field.id}\n field={field}\n idx={idx}\n sectionId={section.id}\n isSelected={field.id === selectedId}\n isDragOver={dragOverKey === `${section.id}:${idx}`}\n chrome={chrome}\n strings={strings}\n language={language}\n dragEnabled={features.dragReorder}\n onSelect={() => onSelectField(field.id)}\n onFieldChange={onFieldChange}\n onMoveField={onMoveField}\n onDuplicateField={onDuplicateField}\n onDeleteField={onDeleteField}\n dropZoneHandlers={getDropZoneHandlers(section.id, idx)}\n dragHandleProps={getDragHandleProps(section.id, idx)}\n />\n ))}\n </div>\n )\n )}\n </div>\n );\n}\n","import { ArrowUp, ArrowDown, Copy, Trash2, GripVertical } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { FieldPatch, FormField } from \"../types\";\nimport { getMeta, FIELD_TYPE_CHROME_KEY, INPUT_SUBTYPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { WIDTH_PERCENT, ALIGN_MAP } from \"../constants/layout\";\nimport { styles } from \"../styles/styles\";\nimport { FieldBlock } from \"./fields/FieldBlock\";\n\nexport interface FieldTicketProps {\n field: FormField;\n idx: number;\n sectionId: string;\n isSelected: boolean;\n isDragOver: boolean;\n chrome: ChromeShape;\n strings: StringsShape;\n language: string;\n dragEnabled: boolean;\n onSelect: () => void;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n onMoveField: (fieldId: string, dir: 1 | -1) => void;\n onDuplicateField: (fieldId: string) => void;\n onDeleteField: (fieldId: string) => void;\n dropZoneHandlers: { onDragOver: (e: any) => void; onDragLeave: () => void; onDrop: () => void };\n dragHandleProps: { draggable: boolean; onDragStart: () => void };\n}\n\nexport function FieldTicket({\n field, idx, isSelected, isDragOver, chrome, strings, language, dragEnabled,\n onSelect, onFieldChange, onMoveField, onDuplicateField, onDeleteField,\n dropZoneHandlers, dragHandleProps,\n}: FieldTicketProps) {\n const meta = getMeta(field.type);\n const Icon = meta.icon;\n const widthPct = WIDTH_PERCENT[field.width || \"1/1\"];\n\n return (\n <div\n {...dropZoneHandlers}\n onClick={onSelect}\n className={`fb-field fb-field--${field.type} fb-field--${field.id}`}\n data-field-id={field.id}\n style={{\n ...styles.ticket,\n flex: `1 1 calc(${widthPct} - 10px)`,\n minWidth: 230,\n alignSelf: ALIGN_MAP[field.verticalAlign || \"top\"],\n ...(isSelected ? styles.ticketSelected : {}),\n ...(isDragOver ? styles.ticketDragOver : {}),\n }}\n >\n <div style={styles.ticketIndex}>{String(idx + 1).padStart(2, \"0\")}</div>\n <div style={styles.ticketPerforation} />\n <div style={styles.ticketBody}>\n <div style={styles.ticketTop}>\n {dragEnabled && <span {...dragHandleProps} style={{ cursor: \"grab\", display: \"flex\" }}><GripVertical size={14} color=\"var(--fb-muted)\" /></span>}\n <Icon size={13} color=\"var(--fb-primary)\" />\n <span style={styles.typeBadge}>\n {(chrome as Record<string, unknown>)[FIELD_TYPE_CHROME_KEY[field.type]] as string || field.type}\n {field.type === \"input\" && field.inputType && field.inputType !== \"text\" ? ` · ${(chrome as Record<string, unknown>)[INPUT_SUBTYPE_CHROME_KEY[field.inputType]]}` : \"\"}\n </span>\n {field.required && <span style={styles.requiredBadge}>{chrome.required}</span>}\n </div>\n {(field.width && field.width !== \"1/1\") || field.labelPosition === \"inline\" || field.verticalAlign !== \"top\" || field.hideLabel ? (\n <div style={styles.chipRow}>\n {field.width && field.width !== \"1/1\" && <span style={styles.miniBadge}>{chrome.width} {field.width}</span>}\n {field.labelPosition === \"inline\" && <span style={styles.miniBadge}>{chrome.inline}</span>}\n {field.verticalAlign !== \"top\" && <span style={styles.miniBadge}>{chrome[field.verticalAlign as \"middle\" | \"bottom\"]}</span>}\n {field.hideLabel && <span style={styles.miniBadge}>{chrome.hideLabel}</span>}\n </div>\n ) : null}\n <div style={{ marginTop: 8 }}>\n <FieldBlock field={field} lang={language} onFieldChange={onFieldChange} strings={strings} chrome={chrome} isBuild />\n </div>\n </div>\n <div style={styles.ticketActions} onClick={(e) => e.stopPropagation()}>\n <button style={styles.iconBtn} title={chrome.moveUp} onClick={() => onMoveField(field.id, -1)}><ArrowUp size={13} /></button>\n <button style={styles.iconBtn} title={chrome.moveDown} onClick={() => onMoveField(field.id, 1)}><ArrowDown size={13} /></button>\n <button style={styles.iconBtn} title={chrome.duplicate} onClick={() => onDuplicateField(field.id)}><Copy size={13} /></button>\n <button style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} title={chrome.delete} onClick={() => onDeleteField(field.id)}><Trash2 size={13} /></button>\n </div>\n </div>\n );\n}\n","import type { ChangeEvent, ElementType } from \"react\";\nimport { CircleAlert } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport type { StringsShape } from \"../../i18n/strings\";\nimport type { ButtonField, FieldPatch, FormField, ImageField, ParagraphField } from \"../../types\";\nimport { FONT_SIZE_OPTIONS, TAG_TO_ELEMENT } from \"../../constants/typography\";\nimport { getMeta } from \"../../constants/fieldTypes\";\nimport { ICON_LIBRARY, type IconComponent } from \"../../constants/icons\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\nimport { ImageBlock } from \"./ImageBlock\";\nimport { ButtonBlock } from \"./ButtonBlock\";\n\nexport interface FieldBlockProps {\n field: FormField;\n lang: string;\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n strings: StringsShape;\n chrome?: ChromeShape;\n error?: string | null;\n isBuild?: boolean;\n onButtonAction?: (field: ButtonField) => void;\n}\n\nexport function FieldBlock({ field, lang, onFieldChange, strings, chrome, error, isBuild, onButtonAction }: FieldBlockProps) {\n if (field.type === \"image\") return <ImageBlock field={field} lang={lang} />;\n if (field.type === \"button\") return <ButtonBlock field={field} lang={lang} onAction={onButtonAction} />;\n\n if (field.type === \"paragraph\") {\n const fontPx = FONT_SIZE_OPTIONS.find((f) => f.value === field.fontSize)?.px || 14;\n const Tag = (TAG_TO_ELEMENT[field.tag] || \"p\") as ElementType;\n return (\n <Tag style={{ margin: 0, whiteSpace: \"pre-wrap\", fontSize: fontPx, fontWeight: field.fontWeight === \"bold\" ? 700 : 400, fontStyle: field.fontStyle === \"italic\" ? \"italic\" : \"normal\", textAlign: field.textAlign || \"left\", color: field.color || \"var(--fb-ink)\", lineHeight: 1.6 }}>\n {t(field.content, lang) || \"...\"}\n </Tag>\n );\n }\n\n const meta = getMeta(field.type);\n const IconComp = field.showIcon && field.displayIcon ? ICON_LIBRARY[field.displayIcon] : null;\n const isInline = field.labelPosition === \"inline\" && !meta.boolean;\n const labelText = t(field.label, lang);\n const showLabel = !meta.boolean && !field.hideLabel;\n\n return (\n <div>\n <div style={{ display: \"flex\", flexDirection: isInline ? \"row\" : \"column\", alignItems: isInline ? \"center\" : \"stretch\", gap: isInline ? 10 : 6 }}>\n {showLabel && (\n <label style={{ ...styles.previewLabel, marginBottom: isInline ? 0 : 6, flexShrink: 0, width: isInline ? 120 : \"auto\", display: \"flex\", alignItems: \"center\", gap: 6 }}>\n {IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}\n {labelText || (isBuild ? <span style={{ fontStyle: \"italic\", color: \"var(--fb-muted)\" }}>{chrome?.untitledField || \"Untitled field\"}</span> : \"\")}\n {field.required && <span style={{ color: \"var(--fb-danger)\" }}> *</span>}\n </label>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>{renderInteractive(field, lang, onFieldChange, IconComp, !!error, strings)}</div>\n </div>\n {error && (<div style={styles.fieldError}><CircleAlert size={12} /> {error}</div>)}\n </div>\n );\n}\n\ntype InteractiveField = Exclude<FormField, ImageField | ParagraphField | ButtonField>;\n\nfunction renderInteractive(\n field: InteractiveField,\n lang: string,\n onFieldChange: (fieldId: string, patch: FieldPatch) => void,\n IconComp: IconComponent | null,\n hasError: boolean,\n strings: StringsShape,\n) {\n const value = field.defaultValue;\n const set = (v: string | boolean | string[]) => onFieldChange(field.id, { defaultValue: v });\n const inputStyle = hasError ? { ...styles.realInput, ...styles.realInputError } : styles.realInput;\n const common = { style: inputStyle, placeholder: t(\"placeholder\" in field ? field.placeholder : undefined, lang), value: (value as string) || \"\", onChange: (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => set(e.target.value) };\n\n if (field.type === \"input\") {\n switch (field.inputType) {\n case \"number\": return <input type=\"number\" {...common} min={field.min ?? undefined} max={field.max ?? undefined} />;\n case \"email\": return <input type=\"email\" {...common} />;\n case \"password\": return <input type=\"password\" {...common} maxLength={field.maxLength || undefined} />;\n case \"phone\": return <input type=\"tel\" {...common} />;\n case \"date\": return <input type=\"date\" {...common} />;\n case \"time\": return <input type=\"time\" {...common} />;\n default: return <input type=\"text\" {...common} maxLength={field.maxLength || undefined} />;\n }\n }\n\n switch (field.type) {\n case \"textarea\":\n return <textarea {...common} rows={3} maxLength={field.maxLength || undefined} />;\n case \"select\":\n return (\n <select style={inputStyle} value={(value as string) || \"\"} onChange={(e) => set(e.target.value)}>\n <option value=\"\">{strings.selectPlaceholder}</option>\n {(field.options || []).map((o) => (<option key={o.value} value={o.value}>{t(o.label, lang)}</option>))}\n </select>\n );\n case \"radio\":\n return (<div style={{ display: \"flex\", gap: 16, flexWrap: \"wrap\", marginTop: 4 }}>{(field.options || []).map((o) => (<label key={o.value} style={styles.previewRadio}><input type=\"radio\" name={field.id} value={o.value} checked={value === o.value} onChange={(e) => set(e.target.value)} />{t(o.label, lang)}</label>))}</div>);\n case \"checkboxGroup\": {\n const vals = Array.isArray(value) ? value : [];\n return (\n <div style={{ display: \"flex\", gap: 16, flexWrap: \"wrap\", marginTop: 4 }}>\n {(field.options || []).map((o) => { const checked = vals.includes(o.value); return (<label key={o.value} style={styles.previewRadio}><input type=\"checkbox\" checked={checked} onChange={(e) => { const next = e.target.checked ? [...vals, o.value] : vals.filter((v) => v !== o.value); set(next); }} style={{ accentColor: \"var(--fb-primary)\" }} />{t(o.label, lang)}</label>); })}\n </div>\n );\n }\n case \"checkbox\":\n return (<label style={styles.previewRadio}><input type=\"checkbox\" checked={!!value} onChange={(e) => set(e.target.checked)} style={{ accentColor: \"var(--fb-primary)\" }} />{IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}{t(field.label, lang)}{field.required && <span style={{ color: \"var(--fb-danger)\" }}> *</span>}</label>);\n case \"toggle\":\n return (<label style={styles.previewRadio}><input type=\"checkbox\" checked={!!value} onChange={(e) => set(e.target.checked)} style={{ accentColor: \"var(--fb-primary)\" }} />{IconComp && <IconComp size={14} color=\"var(--fb-muted)\" />}{t(field.label, lang)}</label>);\n default:\n return <input type=\"text\" {...common} />;\n }\n}\n","import { AlignLeft, AlignCenter, AlignRight } from \"lucide-react\";\nimport type { ParagraphField } from \"../types\";\n\nexport const FONT_SIZE_OPTIONS: { value: ParagraphField[\"fontSize\"]; label: string; px: number }[] = [\n { value: \"sm\", label: \"S\", px: 12 }, { value: \"md\", label: \"M\", px: 14 },\n { value: \"lg\", label: \"L\", px: 18 }, { value: \"xl\", label: \"XL\", px: 24 },\n];\nexport const TEXT_ALIGN_OPTIONS: { value: ParagraphField[\"textAlign\"]; label: string; icon: typeof AlignLeft }[] = [\n { value: \"left\", label: \"\", icon: AlignLeft }, { value: \"center\", label: \"\", icon: AlignCenter }, { value: \"right\", label: \"\", icon: AlignRight },\n];\n\nexport const PARAGRAPH_TAG_OPTIONS: ParagraphField[\"tag\"][] = [\"h1\", \"h2\", \"h3\", \"p\", \"caption\"];\nexport const TAG_PRESETS: Record<ParagraphField[\"tag\"], { fontSize: ParagraphField[\"fontSize\"]; fontWeight: ParagraphField[\"fontWeight\"] }> = {\n h1: { fontSize: \"xl\", fontWeight: \"bold\" }, h2: { fontSize: \"lg\", fontWeight: \"bold\" },\n h3: { fontSize: \"md\", fontWeight: \"bold\" }, p: { fontSize: \"md\", fontWeight: \"normal\" },\n caption: { fontSize: \"sm\", fontWeight: \"normal\" },\n};\nexport const TAG_TO_ELEMENT: Record<ParagraphField[\"tag\"], string> = { h1: \"h1\", h2: \"h2\", h3: \"h3\", p: \"p\", caption: \"span\" };\nexport const TAG_CHROME_KEY: Partial<Record<ParagraphField[\"tag\"], string>> = { p: \"tagBody\", caption: \"tagCaption\" };\n","import {\n Type, Mail, Phone, Hash, Lock, AlignLeft, ChevronDown, Circle, CheckSquare,\n ListChecks, ToggleLeft, Calendar, Clock, User, MapPin, Building2, Globe,\n CreditCard, FileText, Star, Flag, Home, Briefcase,\n} from \"lucide-react\";\n\nexport const ICON_LIBRARY = {\n Type, Mail, Phone, Hash, Lock, AlignLeft, ChevronDown, Circle, CheckSquare,\n ListChecks, ToggleLeft, Calendar, Clock, User, MapPin, Building2, Globe,\n CreditCard, FileText, Star, Flag, Home, Briefcase,\n};\n\nexport type IconKey = keyof typeof ICON_LIBRARY;\nexport type IconComponent = (typeof ICON_LIBRARY)[IconKey];\n","import type { CSSProperties } from \"react\";\nimport { Image as ImageIcon } from \"lucide-react\";\nimport type { ImageField } from \"../../types\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\n// No fixed pixel dimensions — width follows the field's grid column, height from aspect-ratio.\nfunction buildImageStyle(field: ImageField): CSSProperties {\n const aspectRatio = field.shape === \"banner\" ? \"16 / 5\" : \"1 / 1\";\n return {\n width: \"100%\", aspectRatio, objectFit: \"cover\", display: \"block\",\n borderRadius: field.shape === \"circle\" ? \"50%\" : 8,\n background: \"var(--fb-canvas)\",\n };\n}\n\nexport function ImageBlock({ field, lang }: { field: ImageField; lang: string }) {\n const shapeStyle = buildImageStyle(field);\n const img = field.src ? (\n <img src={field.src} alt={t(field.alt, lang || \"en\")} style={shapeStyle} />\n ) : (\n <div style={{ ...shapeStyle, ...styles.imagePlaceholder }}><ImageIcon size={20} color=\"var(--fb-muted)\" /></div>\n );\n return field.link ? <a href={field.link} target=\"_blank\" rel=\"noreferrer\" style={{ display: \"block\" }}>{img}</a> : img;\n}\n","import type { SubmitStyle } from \"../types\";\n\nexport const SUBMIT_SIZE_OPTIONS: { value: SubmitStyle[\"size\"]; label: string }[] = [\n { value: \"sm\", label: \"S\" }, { value: \"md\", label: \"M\" }, { value: \"lg\", label: \"L\" },\n];\nexport const SUBMIT_SIZE_STYLES: Record<SubmitStyle[\"size\"], { padding: string; fontSize: number }> = {\n sm: { padding: \"7px 12px\", fontSize: 12.5 }, md: { padding: \"10px 16px\", fontSize: 13.5 }, lg: { padding: \"13px 22px\", fontSize: 15 },\n};\n\nexport function resolveSubmitStyle(style: Partial<SubmitStyle> | null | undefined) {\n const sizeStyle = SUBMIT_SIZE_STYLES[style?.size || \"md\"] || SUBMIT_SIZE_STYLES.md;\n return { ...sizeStyle, background: style?.color || \"var(--fb-primary)\" };\n}\n","import type { ButtonField } from \"../../types\";\nimport { resolveSubmitStyle } from \"../../constants/submitStyle\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\nexport function ButtonBlock({ field, lang, onAction }: { field: ButtonField; lang: string; onAction?: (field: ButtonField) => void }) {\n return (\n <button type=\"button\" style={{ ...styles.submitBtn, ...resolveSubmitStyle(field.buttonStyle) }} onClick={() => onAction?.(field)}>\n {t(field.label, lang) || \"...\"}\n </button>\n );\n}\n","import { Bold, Italic, X, Plus, Trash2 } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { FieldPatch, FormField, Option } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { getMeta, INPUT_SUBTYPES, INPUT_SUBTYPE_CHROME_KEY, IMAGE_SHAPE_CHROME_KEY } from \"../constants/fieldTypes\";\nimport { IMAGE_SHAPES } from \"../constants/fieldTypes\";\nimport { PARAGRAPH_TAG_OPTIONS, TAG_CHROME_KEY, TAG_PRESETS, FONT_SIZE_OPTIONS, TEXT_ALIGN_OPTIONS } from \"../constants/typography\";\nimport { COLOR_SWATCHES, BUTTON_COLOR_SWATCHES } from \"../constants/colors\";\nimport { SUBMIT_SIZE_OPTIONS } from \"../constants/submitStyle\";\nimport { WIDTH_OPTIONS } from \"../constants/layout\";\nimport { ICON_LIBRARY } from \"../constants/icons\";\nimport { t, withLang } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { DefaultValueEditor } from \"./fields/DefaultValueEditor\";\n\nexport interface InspectorProps {\n selected: FormField | null;\n language: string;\n chrome: ChromeShape;\n features: ResolvedFeatures;\n onUpdateField: (patch: FieldPatch) => void;\n onDeleteField: () => void;\n onUpdateOption: (optIdx: number, patch: Partial<Option>) => void;\n onAddOption: () => void;\n onRemoveOption: (optIdx: number) => void;\n}\n\nexport function Inspector({ selected, language, chrome, features, onUpdateField, onDeleteField, onUpdateOption, onAddOption, onRemoveOption }: InspectorProps) {\n return (\n <div className=\"fb-inspector\" style={styles.inspector}>\n <div style={styles.panelHeading}>{chrome.properties}</div>\n {!selected ? (\n <div style={styles.inspectorEmpty}>{chrome.selectFieldHint}</div>\n ) : (\n <InspectorBody\n selected={selected}\n language={language}\n chrome={chrome}\n features={features}\n onUpdateField={onUpdateField}\n onDeleteField={onDeleteField}\n onUpdateOption={onUpdateOption}\n onAddOption={onAddOption}\n onRemoveOption={onRemoveOption}\n />\n )}\n </div>\n );\n}\n\nfunction InspectorBody({ selected, language, chrome, features, onUpdateField, onDeleteField, onUpdateOption, onAddOption, onRemoveOption }: Omit<InspectorProps, \"selected\"> & { selected: FormField }) {\n const meta = getMeta(selected.type);\n const f = selected as any;\n\n return (\n <div style={styles.inspectorBody}>\n {(!meta.isContent || selected.type === \"button\") && (\n <>\n <label style={styles.propLabel}>{selected.type === \"button\" ? chrome.buttonText : chrome.label}</label>\n <input style={styles.propInput} value={t(selected.label, language)} onChange={(e) => onUpdateField({ label: withLang(selected.label, language, e.target.value) })} />\n {!meta.isContent && (\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.hideLabel} onChange={(e) => onUpdateField({ hideLabel: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.hideLabel}</span>\n </label>\n )}\n </>\n )}\n\n {meta.hasSubtype && (\n <>\n <label style={styles.propLabel}>{chrome.inputType}</label>\n <select style={styles.propInput} value={f.inputType || \"text\"} onChange={(e) => onUpdateField({ inputType: e.target.value as FieldPatch[\"inputType\"] })}>\n {INPUT_SUBTYPES.map((s) => (<option key={s} value={s}>{chrome[INPUT_SUBTYPE_CHROME_KEY[s] as keyof ChromeShape] as string}</option>))}\n </select>\n </>\n )}\n\n {selected.type === \"paragraph\" && (\n <>\n <label style={styles.propLabel}>{chrome.content}</label>\n <textarea style={{ ...styles.propInput, minHeight: 70, resize: \"vertical\" }} value={t(selected.content, language)} onChange={(e) => onUpdateField({ content: withLang(selected.content, language, e.target.value) })} />\n\n {features.blockStyling && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.typography}</div>\n <label style={styles.propLabel}>{chrome.headingStyle}</label>\n <Segmented options={PARAGRAPH_TAG_OPTIONS.map((v) => ({ value: v, label: TAG_CHROME_KEY[v] ? (chrome[TAG_CHROME_KEY[v] as keyof ChromeShape] as string) : v.toUpperCase() }))} value={selected.tag || \"p\"} onChange={(v) => onUpdateField({ tag: v, ...TAG_PRESETS[v] })} />\n <label style={styles.propLabel}>{chrome.width}</label>\n <Segmented options={FONT_SIZE_OPTIONS} value={selected.fontSize || \"md\"} onChange={(v) => onUpdateField({ fontSize: v })} />\n <label style={styles.propLabel}>{chrome.style}</label>\n <div style={styles.styleToggleRow}>\n <button type=\"button\" style={selected.fontWeight === \"bold\" ? styles.styleToggleActive : styles.styleToggle} onClick={() => onUpdateField({ fontWeight: selected.fontWeight === \"bold\" ? \"normal\" : \"bold\" })}><Bold size={14} /></button>\n <button type=\"button\" style={selected.fontStyle === \"italic\" ? styles.styleToggleActive : styles.styleToggle} onClick={() => onUpdateField({ fontStyle: selected.fontStyle === \"italic\" ? \"normal\" : \"italic\" })}><Italic size={14} /></button>\n </div>\n <label style={styles.propLabel}>{chrome.align}</label>\n <Segmented options={TEXT_ALIGN_OPTIONS} value={selected.textAlign || \"left\"} onChange={(v) => onUpdateField({ textAlign: v })} />\n <label style={styles.propLabel}>{chrome.color}</label>\n <div style={styles.swatchRow}>\n {COLOR_SWATCHES.map((c) => (<button key={c || \"default\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-ink)\", ...(selected.color === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateField({ color: c })} />))}\n <input type=\"color\" value={selected.color || \"#1B1E24\"} onChange={(e) => onUpdateField({ color: e.target.value })} style={styles.colorPickerInput} />\n </div>\n </>\n )}\n </>\n )}\n\n {selected.type === \"image\" && (\n <>\n <label style={styles.propLabel}>{chrome.imageUrl}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.src || \"\"} onChange={(e) => onUpdateField({ src: e.target.value })} />\n <p style={styles.helperText}>{chrome.imageUrlHelper}</p>\n <label style={styles.propLabel}>{chrome.altText}</label>\n <input style={styles.propInput} value={t(selected.alt, language)} onChange={(e) => onUpdateField({ alt: withLang(selected.alt, language, e.target.value) })} />\n <label style={styles.propLabel}>{chrome.linkOptional}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.link || \"\"} onChange={(e) => onUpdateField({ link: e.target.value })} />\n <label style={styles.propLabel}>{chrome.shape}</label>\n <Segmented options={IMAGE_SHAPES.map((v) => ({ value: v, label: chrome[IMAGE_SHAPE_CHROME_KEY[v] as keyof ChromeShape] as string }))} value={selected.shape || \"square\"} onChange={(v) => onUpdateField({ shape: v })} />\n <p style={styles.helperText}>Fills the field's own width (set below under Layout) and scales height automatically — always responsive, never overflows.</p>\n </>\n )}\n\n {selected.type === \"button\" && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.buttonActionTitle}</div>\n <label style={styles.propLabel}>{chrome.buttonAction}</label>\n <Segmented options={[{ value: \"link\", label: chrome.actionLink }, { value: \"submit\", label: chrome.actionSubmit }]} value={selected.action || \"submit\"} onChange={(v) => onUpdateField({ action: v as FieldPatch[\"action\"] })} />\n\n {selected.action === \"link\" ? (\n <>\n <label style={styles.propLabel}>{chrome.linkOptional}</label>\n <input style={styles.propInput} placeholder=\"https://...\" value={selected.href || \"\"} onChange={(e) => onUpdateField({ href: e.target.value })} />\n <label style={styles.propLabel}>{chrome.openIn}</label>\n <Segmented options={[{ value: \"_self\", label: chrome.sameTab }, { value: \"_blank\", label: chrome.newTab }]} value={selected.target || \"_self\"} onChange={(v) => onUpdateField({ target: v as FieldPatch[\"target\"] })} />\n </>\n ) : (\n <>\n <label style={styles.propLabel}>{chrome.submitScope}</label>\n <Segmented options={[{ value: \"section\", label: chrome.thisSection }, { value: \"form\", label: chrome.wholeForm }]} value={selected.submitScope || \"form\"} onChange={(v) => onUpdateField({ submitScope: v as FieldPatch[\"submitScope\"] })} />\n </>\n )}\n\n {features.blockStyling && (\n <>\n <label style={styles.propLabel}>{chrome.color}</label>\n <div style={styles.swatchRow}>\n {BUTTON_COLOR_SWATCHES.map((c) => (<button key={c || \"default\"} type=\"button\" title={c || chrome.none} style={{ ...styles.swatchBtn, background: c || \"var(--fb-primary)\", ...((selected.buttonStyle?.color || \"\") === c ? styles.swatchBtnActive : {}) }} onClick={() => onUpdateField({ buttonStyle: { ...selected.buttonStyle, color: c } })} />))}\n <input type=\"color\" value={selected.buttonStyle?.color || \"#5B5FEF\"} onChange={(e) => onUpdateField({ buttonStyle: { ...selected.buttonStyle, color: e.target.value } })} style={styles.colorPickerInput} />\n </div>\n <label style={styles.propLabel}>{chrome.buttonSize}</label>\n <Segmented options={SUBMIT_SIZE_OPTIONS} value={selected.buttonStyle?.size || \"md\"} onChange={(v) => onUpdateField({ buttonStyle: { ...selected.buttonStyle, size: v } })} />\n </>\n )}\n </>\n )}\n\n {meta.placeholder && (\n <>\n <label style={styles.propLabel}>{chrome.placeholder}</label>\n <input style={styles.propInput} value={t(f.placeholder, language)} onChange={(e) => onUpdateField({ placeholder: withLang(f.placeholder, language, e.target.value) })} />\n </>\n )}\n\n {selected.type === \"input\" && (selected.inputType === \"text\" || selected.inputType === \"password\" || !selected.inputType) && (\n <><label style={styles.propLabel}>{chrome.maxLength}</label><input type=\"number\" style={styles.propInput} placeholder={chrome.noLimit} value={selected.maxLength || \"\"} onChange={(e) => onUpdateField({ maxLength: e.target.value ? Number(e.target.value) : null })} /></>\n )}\n {selected.type === \"input\" && selected.inputType === \"number\" && (\n <>\n <label style={styles.propLabel}>{chrome.minValue}</label><input type=\"number\" style={styles.propInput} value={selected.min ?? \"\"} onChange={(e) => onUpdateField({ min: e.target.value === \"\" ? null : Number(e.target.value) })} />\n <label style={styles.propLabel}>{chrome.maxValue}</label><input type=\"number\" style={styles.propInput} value={selected.max ?? \"\"} onChange={(e) => onUpdateField({ max: e.target.value === \"\" ? null : Number(e.target.value) })} />\n </>\n )}\n {selected.type === \"textarea\" && (\n <><label style={styles.propLabel}>{chrome.maxLength}</label><input type=\"number\" style={styles.propInput} placeholder={chrome.noLimit} value={selected.maxLength || \"\"} onChange={(e) => onUpdateField({ maxLength: e.target.value ? Number(e.target.value) : null })} /></>\n )}\n\n {meta.options && (\n <>\n <label style={styles.propLabel}>{chrome.options}</label>\n <div style={styles.optionList}>\n {((f.options || []) as Option[]).map((opt, i) => (\n <div key={i} style={styles.optionRow}>\n <input style={styles.optionInput} value={t(opt.label, language)} onChange={(e) => onUpdateOption(i, { label: withLang(opt.label, language, e.target.value) })} />\n <button style={styles.iconBtn} onClick={() => onRemoveOption(i)} disabled={(f.options || []).length <= 1}><X size={13} /></button>\n </div>\n ))}\n <button style={styles.addOptionBtn} onClick={onAddOption}><Plus size={13} /> {chrome.addOption}</button>\n </div>\n </>\n )}\n\n <DefaultValueEditor field={selected} meta={meta} lang={language} chrome={chrome} onChange={onUpdateField} />\n\n {!meta.isContent && (\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.required} onChange={(e) => onUpdateField({ required: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.requiredField}</span>\n </label>\n )}\n\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.layout}</div>\n <label style={styles.propLabel}>{chrome.width}</label>\n <Segmented options={WIDTH_OPTIONS.map((o) => ({ ...o, label: o.labelKey ? chrome[o.labelKey as keyof ChromeShape] as string : o.label || \"\" }))} value={selected.width || \"1/1\"} onChange={(v) => onUpdateField({ width: v })} />\n <label style={styles.propLabel}>{chrome.verticalAlign}</label>\n <Segmented options={[{ value: \"top\", label: chrome.top }, { value: \"middle\", label: chrome.middle }, { value: \"bottom\", label: chrome.bottom }]} value={selected.verticalAlign || \"top\"} onChange={(v) => onUpdateField({ verticalAlign: v as FieldPatch[\"verticalAlign\"] })} />\n {!meta.boolean && !meta.isContent && (\n <><label style={styles.propLabel}>{chrome.labelPosition}</label><Segmented options={[{ value: \"top\", label: chrome.above }, { value: \"inline\", label: chrome.inline }]} value={selected.labelPosition || \"top\"} onChange={(v) => onUpdateField({ labelPosition: v as FieldPatch[\"labelPosition\"] })} /></>\n )}\n\n {!meta.isContent && (\n <>\n <div style={styles.inspectorDivider} />\n <div style={styles.panelHeading}>{chrome.icon}</div>\n <label style={styles.toggleRow}>\n <input type=\"checkbox\" checked={!!selected.showIcon} onChange={(e) => onUpdateField({ showIcon: e.target.checked })} style={{ width: 15, height: 15, accentColor: \"var(--fb-primary)\" }} />\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{chrome.showIcon}</span>\n </label>\n {selected.showIcon && (\n <div style={styles.iconGrid}>\n {Object.keys(ICON_LIBRARY).map((key) => {\n const IconComp = ICON_LIBRARY[key as keyof typeof ICON_LIBRARY];\n const active = selected.displayIcon === key;\n return (<button key={key} type=\"button\" title={key} style={active ? styles.iconGridBtnActive : styles.iconGridBtn} onClick={() => onUpdateField({ displayIcon: key as FieldPatch[\"displayIcon\"] })}><IconComp size={15} /></button>);\n })}\n </div>\n )}\n </>\n )}\n\n <div style={styles.inspectorDivider} />\n <button style={styles.deleteFieldBtn} onClick={onDeleteField}><Trash2 size={13} /> {chrome.deleteField}</button>\n </div>\n );\n}\n","import type { ChromeShape } from \"../../i18n/chrome\";\nimport type { FieldPatch, FormField } from \"../../types\";\nimport type { FieldTypeMeta } from \"../../constants/fieldTypes\";\nimport { t } from \"../../lib/bilingual\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface DefaultValueEditorProps {\n field: FormField;\n meta: FieldTypeMeta;\n lang: string;\n chrome: ChromeShape;\n onChange: (patch: FieldPatch) => void;\n}\n\nexport function DefaultValueEditor({ field, meta, lang, chrome, onChange }: DefaultValueEditorProps) {\n if (meta.isContent) return null;\n const f = field as any;\n\n if (meta.boolean) {\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <button style={styles.toggleRow} onClick={() => onChange({ defaultValue: !f.defaultValue })}>\n <span style={{ ...styles.toggleTrack, background: f.defaultValue ? \"var(--fb-primary)\" : \"var(--fb-border)\" }}><span style={{ ...styles.toggleThumb, transform: f.defaultValue ? \"translateX(16px)\" : \"translateX(0)\" }} /></span>\n <span style={{ fontSize: 13, color: \"var(--fb-ink)\" }}>{f.defaultValue ? chrome.checked : chrome.unchecked}</span>\n </button>\n </>\n );\n }\n\n if (meta.multiValue) {\n const selectedVals: string[] = f.defaultValue || [];\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultChecked}</label>\n <div style={styles.optionList}>\n {(f.options || []).map((o: any) => {\n const checked = selectedVals.includes(o.value);\n return (\n <label key={o.value} style={{ ...styles.previewRadio, cursor: \"pointer\" }}>\n <input type=\"checkbox\" checked={checked} onChange={(e) => { const next = e.target.checked ? [...selectedVals, o.value] : selectedVals.filter((v) => v !== o.value); onChange({ defaultValue: next }); }} style={{ accentColor: \"var(--fb-primary)\" }} />\n {t(o.label, lang)}\n </label>\n );\n })}\n </div>\n </>\n );\n }\n\n if (meta.options) {\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <select style={styles.propInput} value={f.defaultValue || \"\"} onChange={(e) => onChange({ defaultValue: e.target.value })}>\n <option value=\"\">{chrome.none}</option>\n {(f.options || []).map((o: any) => (<option key={o.value} value={o.value}>{t(o.label, lang)}</option>))}\n </select>\n </>\n );\n }\n\n const htmlType =\n field.type === \"input\" && field.inputType === \"number\" ? \"number\" :\n field.type === \"input\" && field.inputType === \"date\" ? \"date\" :\n field.type === \"input\" && field.inputType === \"time\" ? \"time\" : \"text\";\n return (\n <>\n <label style={styles.propLabel}>{chrome.defaultValue}</label>\n <input type={htmlType} style={styles.propInput} value={f.defaultValue || \"\"} onChange={(e) => onChange({ defaultValue: e.target.value })} />\n </>\n );\n}\n","import { useState } from \"react\";\nimport { PartyPopper, X, CircleAlert } from \"lucide-react\";\nimport type { ChromeShape } from \"../i18n/chrome\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport type { ButtonField, FieldPatch, LocalizedString, Section, SubmitPayload } from \"../types\";\nimport type { ResolvedFeatures } from \"../lib/features\";\nimport { buildDeviceOptions, effectiveWidth, WIDTH_PERCENT, ALIGN_MAP } from \"../constants/layout\";\nimport { getMeta } from \"../constants/fieldTypes\";\nimport { validateField } from \"../lib/validate\";\nimport { formatValue } from \"../lib/format\";\nimport { collectFieldValues } from \"../lib/collectSubmission\";\nimport { t } from \"../lib/bilingual\";\nimport { styles } from \"../styles/styles\";\nimport { Segmented } from \"./Segmented\";\nimport { FieldBlock } from \"./fields/FieldBlock\";\n\nexport interface PreviewPaneProps {\n title: LocalizedString;\n sections: Section[];\n onFieldChange: (fieldId: string, patch: FieldPatch) => void;\n language: string;\n strings: StringsShape;\n chrome: ChromeShape;\n baseMaxWidth: number;\n features: ResolvedFeatures;\n onSubmit?: (payload: SubmitPayload) => void;\n}\n\ninterface SubmittedRow {\n label: string;\n value: string;\n}\n\nexport function PreviewPane({ title, sections, onFieldChange, language, strings, chrome, baseMaxWidth, features, onSubmit }: PreviewPaneProps) {\n const [device, setDevice] = useState<\"laptop\" | \"tablet\" | \"mobile\">(\"laptop\");\n const [errors, setErrors] = useState<Record<string, string>>({});\n const [submitted, setSubmitted] = useState<SubmittedRow[] | null>(null);\n const [attemptedButtonId, setAttemptedButtonId] = useState<string | null>(null);\n const deviceOptions = buildDeviceOptions(baseMaxWidth, chrome);\n const maxWidth = (deviceOptions.find((d) => d.value === device) || deviceOptions[0]).maxWidth;\n const allFields = sections.flatMap((s) => s.fields);\n\n function runValidation(fields: typeof allFields) {\n const errs: Record<string, string> = {};\n fields.forEach((f) => {\n const e = validateField(f, (f as any).defaultValue, strings);\n if (e) errs[f.id] = e;\n });\n return errs;\n }\n\n function buildSectionsBreakdown() {\n return sections.map((s) => ({ sectionId: s.id, values: collectFieldValues(s.fields) }));\n }\n\n function handleSubmitAll(buttonId: string) {\n const errs = runValidation(allFields);\n setErrors(errs);\n setAttemptedButtonId(buttonId);\n if (Object.keys(errs).length > 0) { setSubmitted(null); return; }\n setSubmitted(allFields.filter((f) => !getMeta(f.type).isContent).map((f) => ({ label: t(f.label, language), value: formatValue(f, language) })));\n const sectionsBreakdown = buildSectionsBreakdown();\n const all = collectFieldValues(allFields);\n onSubmit?.({ buttonId, scope: \"form\", values: all, sections: sectionsBreakdown, all });\n }\n\n function handleSubmitSection(section: Section, buttonId: string) {\n const errs = runValidation(section.fields);\n setErrors((prev) => {\n const next = { ...prev };\n section.fields.forEach((f) => delete next[f.id]);\n return { ...next, ...errs };\n });\n setAttemptedButtonId(buttonId);\n if (Object.keys(errs).length > 0) { setSubmitted(null); return; }\n setSubmitted(section.fields.filter((f) => !getMeta(f.type).isContent).map((f) => ({ label: t(f.label, language), value: formatValue(f, language) })));\n const sectionsBreakdown = buildSectionsBreakdown();\n const all = collectFieldValues(allFields);\n onSubmit?.({ buttonId, scope: \"section\", sectionId: section.id, values: collectFieldValues(section.fields), sections: sectionsBreakdown, all });\n }\n\n function handleButtonAction(field: ButtonField) {\n if (field.action === \"link\") {\n if (field.href) window.open(field.href, field.target === \"_blank\" ? \"_blank\" : \"_self\", field.target === \"_blank\" ? \"noopener,noreferrer\" : undefined);\n return;\n }\n if (field.submitScope === \"section\") {\n const section = sections.find((s) => s.fields.some((f) => f.id === field.id));\n if (section) handleSubmitSection(section, field.id);\n } else {\n handleSubmitAll(field.id);\n }\n }\n\n return (\n <div style={styles.previewWrap}>\n <div style={{ width: \"100%\", maxWidth, display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\n {features.deviceToggle && (\n <div style={styles.previewToolbar}><Segmented options={deviceOptions} value={device} onChange={setDevice} /></div>\n )}\n <div className=\"fb-form\" style={{ ...styles.previewCard, maxWidth, width: \"100%\" }}>\n {features.formTitle && <h2 style={styles.previewTitle}>{t(title, language)}</h2>}\n {allFields.length === 0 && <p style={{ color: \"var(--fb-muted)\", fontSize: 14 }}>{strings.addFieldsHint}</p>}\n\n {sections.map((section) => {\n return (\n <div key={section.id} className=\"fb-section\" data-section-id={section.id} style={{ background: section.background || \"transparent\", padding: section.background ? 16 : 0, borderRadius: section.background ? 10 : 0, marginBottom: \"var(--fb-space-section)\" }}>\n {t(section.title, language) && <h3 style={styles.sectionRuntimeTitle}>{t(section.title, language)}</h3>}\n <div style={styles.previewGrid}>\n {section.fields.map((field) => {\n const width = effectiveWidth(field.width, device);\n const flexBasis = `1 1 calc(${WIDTH_PERCENT[width]} - 14px)`;\n return (\n <div key={field.id} className={`fb-field fb-field--${field.type} fb-field--${field.id}`} data-field-id={field.id} style={{ flex: flexBasis, minWidth: 0, alignSelf: ALIGN_MAP[field.verticalAlign || \"top\"] }}>\n <FieldBlock field={field} lang={language} onFieldChange={onFieldChange} strings={strings} chrome={chrome} error={errors[field.id]} onButtonAction={handleButtonAction} />\n {field.type === \"button\" && field.id === attemptedButtonId && Object.keys(errors).length > 0 && (\n <p style={styles.formErrorNote}><CircleAlert size={13} /> {strings.fixErrors}</p>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {submitted && (\n <div style={styles.modalOverlay} onClick={() => setSubmitted(null)}>\n <div style={{ ...styles.modal, maxWidth: 420 }} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14, display: \"flex\", alignItems: \"center\", gap: 7 }}><PartyPopper size={15} color=\"var(--fb-primary)\" /> {strings.submittedTitle}</span>\n <button style={styles.iconBtn} onClick={() => setSubmitted(null)}><X size={16} /></button>\n </div>\n <div style={{ padding: 16 }}>\n <p style={{ fontSize: 12.5, color: \"var(--fb-muted)\", marginTop: 0 }}>{strings.submittedBody}</p>\n <div style={styles.submittedList}>\n {submitted.map((row, i) => (<div key={i} style={styles.submittedRow}><span style={styles.submittedLabel}>{row.label}</span><span style={styles.submittedValue}>{row.value}</span></div>))}\n </div>\n <button style={{ ...styles.primaryBtn, width: \"100%\", justifyContent: \"center\", marginTop: 14 }} onClick={() => setSubmitted(null)}>{strings.close}</button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { FormField } from \"../types\";\nimport type { StringsShape } from \"../i18n/strings\";\nimport { getMeta } from \"../constants/fieldTypes\";\n\nexport function validateField(field: FormField, value: unknown, strings: StringsShape): string | null {\n const meta = getMeta(field.type);\n if (meta.isContent) return null;\n const isEmpty =\n value === undefined || value === null || value === \"\" ||\n (Array.isArray(value) && value.length === 0) ||\n (!!meta.boolean && !!field.required && value !== true);\n if (field.required && isEmpty) return strings.requiredError;\n if (isEmpty) return null;\n if (field.type === \"input\" && field.inputType === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value))) return strings.invalidEmail;\n if (field.type === \"input\" && field.inputType === \"phone\" && !/^[0-9+\\-\\s()]{7,20}$/.test(String(value))) return strings.invalidPhone;\n if (field.type === \"input\" && field.inputType === \"number\") {\n const num = Number(value);\n if (field.min !== undefined && field.min !== null && (field.min as unknown as string) !== \"\" && num < Number(field.min)) return strings.tooSmall(field.min);\n if (field.max !== undefined && field.max !== null && (field.max as unknown as string) !== \"\" && num > Number(field.max)) return strings.tooLarge(field.max);\n }\n if (\n (field.type === \"textarea\" || (field.type === \"input\" && ![\"number\", \"date\", \"time\"].includes(field.inputType))) &&\n field.maxLength && String(value).length > field.maxLength\n ) {\n return strings.tooLong(field.maxLength);\n }\n return null;\n}\n","import type { FormField } from \"../types\";\nimport { t } from \"./bilingual\";\n\nexport function formatValue(field: FormField, lang: string): string {\n const v = (field as any).defaultValue;\n if (Array.isArray(v)) {\n if (v.length === 0) return \"—\";\n return v.map((val: string) => t((field as any).options?.find((o: any) => o.value === val)?.label, lang) || val).join(\", \");\n }\n if (typeof v === \"boolean\") return v ? \"Yes\" : \"No\";\n if ((field as any).options && v) return t((field as any).options.find((o: any) => o.value === v)?.label, lang) || v;\n if (v === undefined || v === null || v === \"\") return \"—\";\n return String(v);\n}\n","import type { FormField } from \"../types\";\nimport { getMeta } from \"../constants/fieldTypes\";\n\n/** Raw (not display-formatted) `defaultValue` per non-content field, keyed by field id. */\nexport function collectFieldValues(fields: FormField[]): Record<string, unknown> {\n const values: Record<string, unknown> = {};\n fields.forEach((f) => {\n if (getMeta(f.type).isContent) return;\n values[f.id] = (f as any).defaultValue;\n });\n return values;\n}\n","import { Check, ClipboardCopy, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface JsonModalProps {\n chrome: ChromeShape;\n jsonString: string;\n copied: boolean;\n onCopy: () => void;\n onClose: () => void;\n}\n\nexport function JsonModal({ chrome, jsonString, copied, onCopy, onClose }: JsonModalProps) {\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={styles.modal} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.formJson} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.formJson}</span>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button type=\"button\" style={styles.ghostBtn} onClick={onCopy}>{copied ? <Check size={14} /> : <ClipboardCopy size={14} />}{copied ? chrome.copied : chrome.copy}</button>\n <button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button>\n </div>\n </div>\n <pre style={styles.jsonPre}>{jsonString}</pre>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Modal keyboard/focus behaviour shared by every dialog: Escape closes it, Tab is\n * trapped inside the panel, focus moves in on mount and back to the opener on close.\n * Attach the returned ref to the dialog panel element.\n */\nexport function useModalA11y<T extends HTMLElement>(onClose: () => void) {\n const panelRef = useRef<T>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n const panel = panelRef.current;\n\n const focusables = () => Array.from(panel?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n // Respect an explicit autoFocus inside the panel, else focus the first control.\n if (panel && !panel.contains(document.activeElement)) {\n (panel.querySelector<HTMLElement>(\"[autofocus]\") ?? focusables()[0] ?? panel).focus();\n }\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n onCloseRef.current();\n return;\n }\n if (e.key !== \"Tab\") return;\n const items = focusables();\n if (items.length === 0) {\n e.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || !panel?.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"keydown\", onKeyDown, true);\n opener?.focus?.();\n };\n }, []);\n\n return panelRef;\n}\n","import { AlertCircle, Loader2, Trash2, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport type { SavedFormMeta } from \"../../types\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface TemplatesModalProps {\n chrome: ChromeShape;\n savedForms: SavedFormMeta[];\n currentFormId: string | null;\n /** false = apply-only: no delete, action button reads \"Apply\". */\n manage: boolean;\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n onOpen: (id: string) => void;\n onDelete: (id: string) => void;\n onClose: () => void;\n}\n\nexport function TemplatesModal({ chrome, savedForms, currentFormId, manage, templateState, onOpen, onDelete, onClose }: TemplatesModalProps) {\n const busy = templateState === \"loading\";\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={styles.modal} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.templates} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}><span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.templates}</span><button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button></div>\n <div style={styles.libraryBody}>\n {savedForms.length === 0 ? (\n <div style={styles.inspectorEmpty}>{manage ? chrome.noTemplates : chrome.noTemplatesReadonly}</div>\n ) : (\n savedForms.map((f) => (\n <div key={f.id} style={styles.libraryRow}>\n <div style={{ minWidth: 0 }}>\n <div style={styles.libraryRowTitle}>{f.title}{f.id === currentFormId && <span style={styles.currentBadge}>{chrome.current}</span>}</div>\n <div style={styles.libraryRowMeta}>{chrome.updated} {new Date(f.updatedAt).toLocaleString()}</div>\n </div>\n <div style={{ display: \"flex\", gap: 6, flexShrink: 0 }}>\n <button type=\"button\" style={styles.ghostBtn} disabled={busy} onClick={() => onOpen(f.id)}>\n {busy && <Loader2 size={12} className=\"spin\" />} {manage ? chrome.open : chrome.applyTemplate}\n </button>\n {manage && (\n <button type=\"button\" style={{ ...styles.iconBtn, ...styles.iconBtnDanger }} disabled={busy} title={chrome.delete} onClick={() => onDelete(f.id)}><Trash2 size={13} /></button>\n )}\n </div>\n </div>\n ))\n )}\n {templateState === \"error\" && (\n <div style={{ ...styles.libraryRowMeta, color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 5, marginTop: 4 }}>\n <AlertCircle size={12} /> {chrome.templateLoadFailed}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { AlertCircle, Loader2, Save, X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface SaveAsModalProps {\n chrome: ChromeShape;\n suggestedName: string;\n templateState: \"idle\" | \"loading\" | \"saving\" | \"saved\" | \"error\";\n onSave: (name: string) => void;\n onClose: () => void;\n}\n\nexport function SaveAsModal({ chrome, suggestedName, templateState, onSave, onClose }: SaveAsModalProps) {\n const [name, setName] = useState(suggestedName);\n const saving = templateState === \"saving\";\n const canSave = !!name.trim() && !saving;\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={{ ...styles.modal, maxWidth: 380 }} role=\"dialog\" aria-modal=\"true\" aria-label={chrome.saveForm} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}><span style={{ fontWeight: 600, fontSize: 14 }}>{chrome.saveForm}</span><button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button></div>\n <div style={{ padding: 16 }}>\n <label style={styles.propLabel}>{chrome.formName}</label>\n <input autoFocus aria-label={chrome.formName} style={styles.propInput} value={name} onChange={(e) => setName(e.target.value)} onKeyDown={(e) => e.key === \"Enter\" && canSave && onSave(name.trim())} />\n <button type=\"button\" style={{ ...styles.primaryBtn, width: \"100%\", justifyContent: \"center\", marginTop: 14 }} disabled={!canSave} onClick={() => onSave(name.trim())}>\n {saving ? <Loader2 size={14} className=\"spin\" /> : <Save size={14} />} {chrome.saveToLibrary}\n </button>\n {templateState === \"error\" && (\n <div style={{ fontSize: 12, color: \"var(--fb-danger)\", display: \"flex\", alignItems: \"center\", gap: 5, marginTop: 10 }}>\n <AlertCircle size={12} /> {chrome.templateSaveFailed}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { X } from \"lucide-react\";\nimport type { ChromeShape } from \"../../i18n/chrome\";\nimport { useModalA11y } from \"../../hooks/useModalA11y\";\nimport { styles } from \"../../styles/styles\";\n\nexport interface ConfirmModalProps {\n chrome: ChromeShape;\n title: string;\n message: string;\n /** Omit for a plain acknowledgement notice (single OK button). */\n onConfirm?: () => void;\n confirmLabel?: string;\n tone?: \"default\" | \"danger\";\n onClose: () => void;\n}\n\n/** In-widget replacement for window.alert / window.confirm. */\nexport function ConfirmModal({ chrome, title, message, onConfirm, confirmLabel, tone = \"default\", onClose }: ConfirmModalProps) {\n const panelRef = useModalA11y<HTMLDivElement>(onClose);\n const confirmStyle =\n tone === \"danger\"\n ? { ...styles.primaryBtn, background: \"var(--fb-danger)\", borderColor: \"var(--fb-danger)\" }\n : styles.primaryBtn;\n\n return (\n <div style={styles.modalOverlay} onClick={onClose}>\n <div ref={panelRef} style={{ ...styles.modal, maxWidth: 380 }} role=\"alertdialog\" aria-modal=\"true\" aria-label={title} onClick={(e) => e.stopPropagation()}>\n <div style={styles.modalHeader}>\n <span style={{ fontWeight: 600, fontSize: 14 }}>{title}</span>\n <button type=\"button\" style={styles.iconBtn} onClick={onClose}><X size={16} /></button>\n </div>\n <div style={{ padding: 16 }}>\n <p style={{ margin: 0, fontSize: 13, lineHeight: 1.5, color: \"var(--fb-ink)\" }}>{message}</p>\n <div style={{ display: \"flex\", justifyContent: \"flex-end\", gap: 8, marginTop: 16 }}>\n {onConfirm ? (\n <>\n <button type=\"button\" autoFocus style={styles.ghostBtn} onClick={onClose}>{chrome.cancel}</button>\n <button type=\"button\" style={confirmStyle} onClick={onConfirm}>{confirmLabel ?? chrome.confirm}</button>\n </>\n ) : (\n <button type=\"button\" autoFocus style={styles.primaryBtn} onClick={onClose}>{chrome.dismiss}</button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","export const css = `\n * { box-sizing: border-box; }\n button { font-family: inherit; cursor: pointer; }\n input, textarea, select { font-family: inherit; }\n @keyframes fb-spin { to { transform: rotate(360deg); } }\n .spin { animation: fb-spin 0.8s linear infinite; }\n /* Cap at viewport height so the widget scrolls internally; dvh upgrade is ignored where unsupported. */\n .fb-root { max-height: 100vh; max-height: 100dvh; }\n\n /* Toolbar's active-template label is nice-to-have — drop it first when width is tight. */\n @media (max-width: 600px) { .fb-template-tag { display: none; } }\n\n /* Under 720px: Palette/Inspector become drawers over Canvas, toggled by .fb-mobile-bar,\n tracked by .fb-work-area[data-mobile-panel], dismissed via .fb-mobile-backdrop. */\n .fb-mobile-bar { display: none; align-items: center; gap: 6px; padding: 6px 10px; border-bottom: 1px solid var(--fb-border); background: var(--fb-surface); flex-shrink: 0; }\n .fb-mobile-btn { display: flex; align-items: center; gap: 6px; padding: 6px 10px; border-radius: 7px; border: 1px solid var(--fb-border); background: var(--fb-surface); color: var(--fb-muted); font-size: 12.5px; font-weight: 600; }\n .fb-mobile-btn[aria-pressed=\"true\"] { border-color: var(--fb-primary); background: var(--fb-primary-soft); color: var(--fb-primary); }\n .fb-mobile-backdrop { display: none; }\n @media (max-width: 720px) {\n .fb-mobile-bar { display: flex; }\n .fb-work-area { flex-direction: column !important; min-height: 0; }\n .fb-canvas-area { position: relative; overflow: hidden; }\n .fb-canvas { width: 100%; }\n .fb-mobile-backdrop { display: block; position: absolute; inset: 0; z-index: 6; background: rgba(15,16,20,0.35); }\n .fb-palette, .fb-inspector {\n position: absolute; top: 0; bottom: 0; z-index: 7;\n width: min(260px, 80vw) !important; max-height: none !important;\n border: none !important;\n box-shadow: 0 0 24px rgba(0,0,0,0.18);\n transition: transform 0.18s ease;\n }\n .fb-palette { left: 0; transform: translateX(-100%); }\n .fb-inspector { right: 0; transform: translateX(100%); }\n .fb-work-area[data-mobile-panel=\"palette\"] .fb-palette,\n .fb-work-area[data-mobile-panel=\"inspector\"] .fb-inspector { transform: translateX(0); }\n }\n`;\n","import type { Theme } from \"../types\";\nimport { DEFAULT_THEME } from \"./defaultTheme\";\n\n/** A ready-made dark palette — pass as the `theme` prop for a dark-mode `<FormBuilder />`. */\nexport const DARK_THEME: Theme = {\n primary: \"#8B8FF5\", primarySoft: \"#262A45\", danger: \"#F0715B\", dangerSoft: \"#3A2420\",\n ink: \"#EDEEF2\", muted: \"#9096A8\", border: \"#2E313D\", surface: \"#1A1B23\",\n canvas: \"#121319\", pageBackground: \"#1A1B23\",\n layout: DEFAULT_THEME.layout,\n};\n"],"mappings":"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","names":["import_react","import_lucide_react","ImageIcon","t","document","t","import_react","import_react","document","import_react","document","import_react","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_lucide_react","import_jsx_runtime","ImageIcon","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","FormBuilder"]}