@pinhadev/pinha-quiz-builder-pkg 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/v1/Quiz.tsx","../src/v1/utils/colorPalette.ts","../src/v1/utils/quizConfigKeys.ts","../src/components/Image/LazyImage.tsx","../src/v1/quiz/QuizHeader.tsx","../src/v1/quiz/QuizProgress.tsx","../src/v1/quiz/inputs/QuizInputNumeric.tsx","../src/v1/quiz/inputs/QuizInputText.tsx","../src/v1/quiz/inputs/QuizInputOptions.tsx","../src/v1/quiz/inputs/QuizInputSlider.tsx","../src/v1/quiz/inputs/NumericQuestionInput.tsx","../src/v1/quiz/inputs/TextQuestionInput.tsx","../src/v1/utils/id.ts","../src/v1/utils/quizFactory.ts","../src/v1/quiz/inputs/OptionsQuestionInput.tsx","../src/v1/quiz/inputs/SliderQuestionInput.tsx","../src/v1/quiz/inputs/BasicInfoQuestionInput.tsx","../src/v1/quiz/QuestionInput.tsx","../src/v1/quiz/blocks/QuizBlockProps.ts","../src/v1/quiz/blocks/DefaultQuizBlock.tsx","../src/v1/quiz/blocks/CardQuizBlock.tsx","../src/v1/quiz/blocks/CompactQuizBlock.tsx","../src/v1/quiz/blocks/index.ts","../src/v1/quiz/QuizItemBlock.tsx","../src/v1/utils/getButtonClasses.ts","../src/v1/quiz/QuizButton.tsx","../src/v1/QuizBuilder.tsx","../src/v1/quiz-builder/QuizBuilderLivePreview.tsx","../src/v1/utils/builderContainerColors.ts","../src/v1/components/builder/QuizBuilderConfigLayoutSection.tsx","../src/v1/components/ColorPickerField/ColorPickerField.tsx","../src/v1/components/builder/QuizBuilderConfigHeaderSection.tsx","../src/v1/components/builder/QuizBuilderConfigQuizSection.tsx","../src/v1/components/builder/QuizBuilderConfigProgressBarSection.tsx","../src/v1/quiz-builder/QuizBuilderConfig.tsx","../src/v1/components/builder/QuizBuilderTitleConfig.tsx","../src/v1/components/builder/QuizBuilderDescriptionConfig.tsx","../src/v1/components/builder/QuizBuilderSubmitButtonConfig.tsx","../src/v1/components/builder/TitleAndSubtitleSettings.tsx","../src/v1/components/builder/QuizBuilderTextPositionConfig.tsx","../src/v1/components/builder/QuizBuilderInputConfig.tsx","../src/v1/components/builder/InputUISettings.tsx","../src/v1/quiz-builder/QuizBuilderQuestionNav.tsx","../src/v1/quiz-builder/SliderParamsEditor.tsx","../src/v1/quiz-builder/OptionsParamsEditor.tsx","../src/v1/quiz-builder/BasicInfoParamsEditor.tsx","../src/v1/quiz-builder/QuizBuilderQuestionForm.tsx","../src/v1/quiz-builder/QuizBuilderJsonPreview.tsx","../src/v1/components/PresetOrCustomColorField/PresetOrCustomColorField.tsx","../src/v2/QuizV2.tsx","../src/v2/utils/sectionTree.ts","../src/v2/utils/id.ts","../src/v2/defaults.ts","../src/v2/quiz/SpacingStyles.ts","../src/v2/quiz/BackgroundStyles.ts","../src/v2/quiz/ContainerSection.styles.ts","../src/v2/quiz/ContainerSection.tsx","../src/v2/quiz/InputSection.tsx","../src/v2/quiz/InputSection.styles.ts","../src/v2/quiz/CardSelector.tsx","../src/v2/quiz/ButtonSection.styles.ts","../src/v2/quiz/ButtonSection.tsx","../src/v2/quiz/TextSection.styles.ts","../src/v2/quiz/TextSection.tsx","../src/v2/quiz/ImageSection.styles.ts","../src/v2/quiz/ImageSection.tsx","../src/v2/quiz/DividerSection.styles.ts","../src/v2/quiz/DividerSection.tsx","../src/v2/quiz/BasicComponentSection.styles.ts","../src/v2/quiz/BasicComponentSection.tsx","../src/v2/quiz/SectionRenderer.tsx","../src/v2/quiz/SectionTreeRenderer.tsx","../src/v2/quiz/RedirectionPage.tsx","../src/v2/quiz/ThankYouPage.tsx","../src/v2/utils/quizDataLoader.ts","../src/v2/styles/theme.ts","../src/v2/analytics/useDefaultFormTracking.ts","../src/v2/QuizV2.styles.ts","../src/v2/QuizBuilderV2.tsx","../src/v2/utils/sectionLabel.ts","../src/v2/templatedQuiz/multipleChoiceTemplate.ts","../src/v2/QuizBuilderPageNav.styles.ts","../src/v2/QuizBuilderPageNav.tsx","../src/v2/LayoutBuilder.styles.ts","../src/v2/LayoutBuilder.tsx","../src/v2/SectionListView.tsx","../src/v2/SectionListView.styles.ts","../src/v2/utils/diff.ts","../src/v2/quiz/BuilderSectionTree.tsx","../src/v2/config/ConfigStyles.ts","../src/v2/config/SpacingConfig.tsx","../src/v2/config/FlexConfig.tsx","../src/v2/config/BackgroundConfig.tsx","../src/v2/config/GlobalConfig.tsx","../src/v2/config/PageConfig.tsx","../src/v2/config/ContainerConfig.tsx","../src/v2/config/InputConfig.tsx","../src/v2/config/CardUIConfig.tsx","../src/v2/config/ButtonConfig.tsx","../src/v2/config/TextConfig.tsx","../src/v2/config/ImageConfig.tsx","../src/v2/config/DividerConfig.tsx","../src/v2/config/BasicComponentConfig.tsx","../src/v2/LivePreviewBar.styles.ts","../src/v2/LivePreviewBar.tsx","../src/v2/QuizBuilderSelector.tsx","../src/v2/QuizBuilderSelector.styles.ts","../src/v2/QuizBuilderV2.styles.ts"],"sourcesContent":["// V1 (legacy) – all v1 code lives under src/v1/\r\nexport { Quiz } from \"./v1/Quiz\";\r\nexport { QuizBuilder } from \"./v1/QuizBuilder\";\r\nexport { LazyImage } from \"./components/Image\";\r\nexport { ColorPickerField } from \"./v1/components/ColorPickerField\";\r\nexport { PresetOrCustomColorField } from \"./v1/components/PresetOrCustomColorField\";\r\nexport type { QuizProps } from \"./v1/Quiz\";\r\nexport type { QuizBuilderProps } from \"./v1/QuizBuilder\";\r\nexport type { LazyImageProps } from \"./components/Image\";\r\nexport type {\r\n ColorPickerFieldProps,\r\n GradientDirection,\r\n} from \"./v1/components/ColorPickerField\";\r\nexport type {\r\n PresetOrCustomColorFieldProps,\r\n PresetSetKind,\r\n} from \"./v1/components/PresetOrCustomColorField\";\r\nexport type {\r\n QuizData,\r\n QuizItem,\r\n QuestionType,\r\n DesignType,\r\n ProgressBarColorPreset,\r\n ButtonStyle,\r\n SliderParams,\r\n OptionItem,\r\n OptionsParams,\r\n BasicInfoParams,\r\n} from \"./v1/types\";\r\nexport type { BasicInfoValue } from \"./v1/quiz/inputs\";\r\n\r\n// V2 – no v1 dependency\r\nexport { QuizV2 } from \"./v2/QuizV2\";\r\nexport { QuizBuilderV2 } from \"./v2/QuizBuilderV2\";\r\nexport { getDefaultQuizV2Data, DEFAULT_SPACING } from \"./v2/defaults\";\r\nexport type { QuizV2Props } from \"./v2/QuizV2\";\r\nexport type { QuizBuilderV2Props } from \"./v2/QuizBuilderV2\";\r\nexport type {\r\n QuizV2Data,\r\n QuizV2Layout,\r\n QuizV2Page,\r\n Section,\r\n SectionType,\r\n Spacing,\r\n ContainerLayout,\r\n TextFontSize,\r\n TextAlignment,\r\n ImageSize,\r\n ImagePosition,\r\n ImageObjectFit,\r\n} from \"./v2/types\";\r\nexport { resolveLayoutForPage, getDefaultQuizV2Layout } from \"./v2/defaults\";\r\nexport { getSectionLabel } from \"./v2/utils/sectionLabel\";\r\n","import { useEffect, useMemo, useState } from \"react\";\r\nimport type { CSSProperties } from \"react\";\r\nimport { Formik, Form } from \"formik\";\r\nimport { isValidPhoneNumber } from \"react-phone-number-input\";\r\nimport type { QuizData } from \"@/v1/types\";\r\nimport { COLOR_PALETTE_DEFAULTS, PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { QuizHeader } from \"./quiz/QuizHeader\";\r\nimport { QuizProgress } from \"./quiz/QuizProgress\";\r\nimport { QuizItemBlock } from \"./quiz/QuizItemBlock\";\r\nimport { QuizButton } from \"./quiz/QuizButton\";\r\n\r\nexport interface QuizProps {\r\n data: QuizData;\r\n /** When set, quiz shows only this step (builder preview). No prev/next. */\r\n previewStep?: number;\r\n onSubmit?: (answers: Record<string, string | number>) => void;\r\n /** Called on \"Continue\" (non-final step) with current answers + next step index. */\r\n onCheckpoint?: (answers: Record<string, string | number>, nextStepIndex: number) => void;\r\n /** Called when the user navigates to a different question (Continue/Back). Passes the new step index. */\r\n onPageChanged?: (stepIndex: number) => void;\r\n}\r\n\r\nfunction getInitialValue(item: QuizData[\"quizes\"][number]): string | number {\r\n if (item.type === \"slider\") {\r\n return item.sliderParams.min;\r\n }\r\n if (item.type === \"numeric\") {\r\n const dv = item.numericParams?.defaultValue;\r\n return typeof dv === \"number\" ? dv : \"\";\r\n }\r\n if (item.type === \"text\") {\r\n const dv = item.textParams?.defaultValue;\r\n return typeof dv === \"string\" ? dv : \"\";\r\n }\r\n if (item.type === \"basicInfo\") {\r\n return JSON.stringify({\r\n firstName: \"\",\r\n lastName: \"\",\r\n phone: \"\",\r\n otpCode: \"\",\r\n privacyAccepted: false,\r\n });\r\n }\r\n return \"\";\r\n}\r\n\r\nexport function Quiz({ data, previewStep, onSubmit, onCheckpoint, onPageChanged }: QuizProps) {\r\n const [currentStep, setCurrentStep] = useState(previewStep ?? 0);\r\n const [validationError, setValidationError] = useState<string | null>(null);\r\n\r\n // Keep currentStep in sync with previewStep so the correct question renders when the builder selection changes\r\n useEffect(() => {\r\n if (previewStep !== undefined) {\r\n setCurrentStep(previewStep);\r\n }\r\n }, [previewStep]);\r\n\r\n // Use currentStep for display so Continue/Back work in both normal and preview mode; effect above syncs currentStep from previewStep when builder selection changes\r\n const step = currentStep;\r\n\r\n const initialValues = useMemo(() => {\r\n const values: Record<string, string | number> = {};\r\n for (const item of data.quizes) {\r\n values[String(item.id)] = getInitialValue(item);\r\n }\r\n return values;\r\n }, [data.quizes]);\r\n\r\n const isItemValid = (item: QuizData[\"quizes\"][number], value: string | number): boolean => {\r\n if (!item.required) return true;\r\n\r\n if (item.type === \"text\") {\r\n return String(value ?? \"\").trim() !== \"\";\r\n }\r\n if (item.type === \"numeric\") {\r\n if (value === \"\" || value === null || value === undefined) return false;\r\n const n = Number(value);\r\n return Number.isFinite(n);\r\n }\r\n if (item.type === \"options\") {\r\n if (value === \"\" || value === null || value === undefined) return false;\r\n return true;\r\n }\r\n if (item.type === \"slider\") {\r\n // Slider always has a numeric value; treat as valid when required.\r\n return true;\r\n }\r\n if (item.type === \"basicInfo\") {\r\n try {\r\n const raw = typeof value === \"string\" ? value : \"\";\r\n const data = raw ? JSON.parse(raw) : {};\r\n const firstName = String(data.firstName ?? \"\").trim();\r\n const lastName = String(data.lastName ?? \"\").trim();\r\n const phone = String(data.phone ?? \"\").trim();\r\n const otpCode = String(data.otpCode ?? \"\").trim();\r\n const privacyAccepted = Boolean(data.privacyAccepted);\r\n const params = item.basicInfoParams ?? {};\r\n const withOtp = params.withOtp ?? false;\r\n const hasPrivacyAgreement = Boolean(params.privacyPolicyLabel?.trim());\r\n if (!firstName || !lastName || !phone) return false;\r\n if (!isValidPhoneNumber(phone)) return false;\r\n if (withOtp && !otpCode) return false;\r\n if (hasPrivacyAgreement && !privacyAccepted) return false;\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const allRequiredValid = (values: Record<string, string | number>): boolean => {\r\n for (const item of data.quizes) {\r\n const v = values[String(item.id)];\r\n if (!isItemValid(item, v)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n const handleSubmit = (values: Record<string, string | number>) => {\r\n if (!allRequiredValid(values)) {\r\n setValidationError(\"Please fill in all required fields before submitting.\");\r\n return;\r\n }\r\n setValidationError(null);\r\n onSubmit?.(values);\r\n };\r\n\r\n const config = data.config ?? {};\r\n const layoutMaxWidth = (config[QUIZ_CONFIG_KEYS.layoutMaxWidth] as \"full\" | \"medium\" | \"small\" | \"custom\") ?? \"medium\";\r\n const layoutMaxWidthPx = (config[QUIZ_CONFIG_KEYS.layoutMaxWidthPx] as number) ?? 672;\r\n const rawProgressBarColor = (config[QUIZ_CONFIG_KEYS.progressBarColor] as string) ?? \"\";\r\n const progressBarCustomColor = config[QUIZ_CONFIG_KEYS.progressBarCustomColor] as string | undefined;\r\n const progressBarColorHex =\r\n rawProgressBarColor in PRESET_HEX\r\n ? PRESET_HEX[rawProgressBarColor as keyof typeof PRESET_HEX]\r\n : (progressBarCustomColor || rawProgressBarColor || COLOR_PALETTE_DEFAULTS.progressBar);\r\n const totalSteps = data.quizes.length;\r\n const hasQuestions = totalSteps > 0;\r\n const clampedStep = hasQuestions ? Math.min(Math.max(0, step), totalSteps - 1) : 0;\r\n const currentItem = hasQuestions ? data.quizes[clampedStep] : null;\r\n const rawBlockOverrides = currentItem?.submitButtonConfig ?? {};\r\n const useBlockOverrides = rawBlockOverrides[QUIZ_CONFIG_KEYS.submitButtonOverride] === true;\r\n const blockOverrides = useBlockOverrides\r\n ? Object.fromEntries(\r\n Object.entries(rawBlockOverrides).filter(\r\n ([k]) => k !== QUIZ_CONFIG_KEYS.submitButtonOverride\r\n )\r\n )\r\n : {};\r\n const submitConfig = { ...config, ...blockOverrides };\r\n\r\n const submitButtonStyle =\r\n (submitConfig[QUIZ_CONFIG_KEYS.submitButtonStyle] as \"primary\" | \"secondary\" | \"outline\" | undefined)\r\n ?? currentItem?.buttonStyle\r\n ?? (config[QUIZ_CONFIG_KEYS.submitButtonStyle] as \"primary\" | \"secondary\" | \"outline\" | undefined)\r\n ?? \"primary\";\r\n const submitButtonPosition = (submitConfig[QUIZ_CONFIG_KEYS.submitButtonPosition] as \"left\" | \"right\" | \"center\") ?? \"right\";\r\n const submitButtonSize = (submitConfig[QUIZ_CONFIG_KEYS.submitButtonSize] as \"default\" | \"full\" | \"3/4\" | \"1/2\") ?? \"default\";\r\n const submitButtonInnerText = (submitConfig[QUIZ_CONFIG_KEYS.submitButtonInnerText] as string) ?? \"Continue →\";\r\n const bgType = (submitConfig[QUIZ_CONFIG_KEYS.submitButtonBgType] as \"solid\" | \"gradient\") ?? \"solid\";\r\n const submitButtonBgColor =\r\n (submitConfig[QUIZ_CONFIG_KEYS.submitButtonBgColor] as string) || COLOR_PALETTE_DEFAULTS.submitButtonBg;\r\n const submitButtonBgColor2 = (submitConfig[QUIZ_CONFIG_KEYS.submitButtonBgColor2] as string) ?? \"\";\r\n const gradientDirection =\r\n (submitConfig[QUIZ_CONFIG_KEYS.submitButtonBgGradientDirection] as string) ?? \"to right\";\r\n const submitButtonTextColor =\r\n (submitConfig[QUIZ_CONFIG_KEYS.submitButtonTextColor] as string) || COLOR_PALETTE_DEFAULTS.submitButtonText;\r\n\r\n const quizWidthClass =\r\n layoutMaxWidth === \"full\"\r\n ? \"max-w-full\"\r\n : layoutMaxWidth === \"medium\"\r\n ? \"max-w-2xl\"\r\n : layoutMaxWidth === \"small\"\r\n ? \"max-w-sm\"\r\n : \"\";\r\n const quizWidthStyle: CSSProperties =\r\n layoutMaxWidth === \"custom\" ? { maxWidth: layoutMaxWidthPx } : {};\r\n const positionClass =\r\n submitButtonPosition === \"left\"\r\n ? \"justify-start\"\r\n : submitButtonPosition === \"center\"\r\n ? \"justify-center\"\r\n : \"justify-end\";\r\n const sizeClass =\r\n submitButtonSize === \"full\"\r\n ? \"w-full\"\r\n : submitButtonSize === \"3/4\"\r\n ? \"w-3/4\"\r\n : submitButtonSize === \"1/2\"\r\n ? \"w-1/2\"\r\n : \"\";\r\n const customButtonStyle: CSSProperties = {};\r\n if (bgType === \"gradient\" && submitButtonBgColor2) {\r\n customButtonStyle.background = `linear-gradient(${gradientDirection}, ${submitButtonBgColor}, ${submitButtonBgColor2})`;\r\n } else {\r\n customButtonStyle.backgroundColor = submitButtonBgColor;\r\n }\r\n customButtonStyle.color = submitButtonTextColor;\r\n const hasCustomColors = true;\r\n\r\n const isFirstStep = clampedStep <= 0;\r\n const isLastStep = hasQuestions && clampedStep >= totalSteps - 1;\r\n const progress = hasQuestions ? (clampedStep + 1) / totalSteps : 0;\r\n\r\n return (\r\n <Formik\r\n initialValues={initialValues}\r\n onSubmit={handleSubmit}\r\n enableReinitialize\r\n >\r\n {({\r\n values,\r\n setFieldValue,\r\n }: {\r\n values: Record<string, string | number>;\r\n setFieldValue: (field: string, value: string | number) => void;\r\n }) => {\r\n const createCheckpoint = (nextStepIndex: number) => {\r\n onCheckpoint?.(values, nextStepIndex);\r\n };\r\n\r\n return (\r\n <Form\r\n className={`mx-auto p-6 ${quizWidthClass}`.trim()}\r\n style={Object.keys(quizWidthStyle).length > 0 ? quizWidthStyle : undefined}\r\n >\r\n <QuizHeader\r\n data={data}\r\n leftContent={\r\n hasQuestions && !isFirstStep ? (\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const newStep = Math.max(0, step - 1);\r\n setCurrentStep(newStep);\r\n onPageChanged?.(newStep);\r\n }}\r\n className=\"inline-flex items-center gap-1.5 rounded-md py-2 pr-2 text-sm font-medium text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2\"\r\n aria-label=\"Previous question\"\r\n >\r\n <svg\r\n className=\"h-4 w-4\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\r\n />\r\n </svg>\r\n Back\r\n </button>\r\n ) : undefined\r\n }\r\n />\r\n <QuizProgress progress={progress} color={progressBarColorHex} />\r\n\r\n {!hasQuestions ? (\r\n <p className=\"text-center text-sm text-gray-500\">No questions in this quiz.</p>\r\n ) : currentItem ? (\r\n <QuizItemBlock\r\n key={currentItem.id}\r\n item={currentItem}\r\n value={values[String(currentItem.id)]}\r\n onChange={(v) => setFieldValue(String(currentItem.id), v)}\r\n config={config}\r\n />\r\n ) : null}\r\n\r\n {hasQuestions && (\r\n <div className=\"mt-6 space-y-2\">\r\n <div className={`flex ${positionClass}`}>\r\n {isLastStep ? (\r\n <QuizButton\r\n type=\"submit\"\r\n blockStyle={submitButtonStyle}\r\n fallbackStyle={submitButtonStyle}\r\n className={sizeClass}\r\n customStyle={hasCustomColors ? customButtonStyle : undefined}\r\n >\r\n {submitButtonInnerText}\r\n </QuizButton>\r\n ) : (\r\n <QuizButton\r\n type=\"button\"\r\n blockStyle={submitButtonStyle}\r\n fallbackStyle={submitButtonStyle}\r\n className={sizeClass}\r\n customStyle={hasCustomColors ? customButtonStyle : undefined}\r\n onClick={(e) => {\r\n // Defensive: ensure this never submits the surrounding <form>.\r\n e.preventDefault();\r\n if (isLastStep || !currentItem) return;\r\n const currentValue = values[String(currentItem.id)];\r\n if (!isItemValid(currentItem, currentValue)) {\r\n setValidationError(\"Please fill in all required fields before continuing.\");\r\n return;\r\n }\r\n setValidationError(null);\r\n const newStep = Math.min(totalSteps - 1, step + 1);\r\n createCheckpoint(newStep);\r\n setCurrentStep(newStep);\r\n onPageChanged?.(newStep);\r\n }}\r\n >\r\n {submitButtonInnerText}\r\n </QuizButton>\r\n )}\r\n </div>\r\n {validationError && (\r\n <p className=\"text-sm text-red-600\">{validationError}</p>\r\n )}\r\n </div>\r\n )}\r\n </Form>\r\n );\r\n }}\r\n </Formik>\r\n );\r\n}\r\n","import type { ProgressBarColorPreset } from \"@/v1/types\";\r\n\r\n/** Hex for each preset color. Used by PresetOrCustomColorField and for resolving preset → hex. */\r\nexport const PRESET_HEX: Record<\r\n Exclude<ProgressBarColorPreset, \"custom\">,\r\n string\r\n> = {\r\n green: \"#22c55e\",\r\n blue: \"#3b82f6\",\r\n orange: \"#f97316\",\r\n white: \"#ffffff\",\r\n black: \"#000000\",\r\n} as const;\r\n\r\n/** Default hex when \"Custom\" is selected, per usage. */\r\nexport const COLOR_PALETTE_DEFAULTS = {\r\n /** Progress bar fill when preset is Custom. */\r\n progressBar: PRESET_HEX.green,\r\n /** Submit button background when Custom is selected. */\r\n submitButtonBg: PRESET_HEX.blue,\r\n /** Submit button text when Custom is selected. */\r\n submitButtonText: PRESET_HEX.white,\r\n /** Promo banner background when Custom is selected. */\r\n promoBannerBg: PRESET_HEX.green,\r\n} as const;\r\n","/**\r\n * Config keys used by the quiz (stored in QuizData.config).\r\n * Values are typed at usage sites.\r\n */\r\nexport const QUIZ_CONFIG_KEYS = {\r\n layoutMaxWidth: \"layoutMaxWidth\",\r\n layoutMaxWidthPx: \"layoutMaxWidthPx\",\r\n companyName: \"companyName\",\r\n companyLogo: \"companyLogo\",\r\n tagline: \"tagline\",\r\n /** Header style: \"default\" | \"logo-bar\" */\r\n headerStyle: \"headerStyle\",\r\n /** Promo banner (sticky top bar) enabled */\r\n headerPromoBannerEnabled: \"headerPromoBannerEnabled\",\r\n /** Promo banner text */\r\n headerPromoBannerText: \"headerPromoBannerText\",\r\n /** Promo banner background: \"solid\" | \"gradient\" */\r\n headerPromoBannerBgType: \"headerPromoBannerBgType\",\r\n headerPromoBannerBgColor: \"headerPromoBannerBgColor\",\r\n headerPromoBannerBgColor2: \"headerPromoBannerBgColor2\",\r\n headerPromoBannerBgGradientDirection: \"headerPromoBannerBgGradientDirection\",\r\n quizTitle: \"quizTitle\",\r\n quizDescription: \"quizDescription\",\r\n /** Question block: title alignment — \"left\" | \"center\" | \"right\" */\r\n titlePosition: \"titlePosition\",\r\n /** Question block: subtitle/description alignment — \"left\" | \"center\" | \"right\" */\r\n subtitlePosition: \"subtitlePosition\",\r\n /** Question block: title font size preset — \"small\" | \"medium\" | \"large\" | \"custom\" */\r\n titleFontSizePreset: \"titleFontSizePreset\",\r\n /** Question block: title font size in px (only used when preset is \"custom\") */\r\n titleFontSizePx: \"titleFontSizePx\",\r\n /** Question block: title margins in px (overrides default spacing when set) */\r\n titleMarginTopPx: \"titleMarginTopPx\",\r\n titleMarginBottomPx: \"titleMarginBottomPx\",\r\n /** Question block: subtitle font size preset — \"small\" | \"medium\" | \"large\" | \"custom\" */\r\n subtitleFontSizePreset: \"subtitleFontSizePreset\",\r\n /** Question block: subtitle font size in px (only used when preset is \"custom\") */\r\n subtitleFontSizePx: \"subtitleFontSizePx\",\r\n /** Question block: subtitle margins in px (overrides default spacing when set) */\r\n subtitleMarginTopPx: \"subtitleMarginTopPx\",\r\n subtitleMarginBottomPx: \"subtitleMarginBottomPx\",\r\n progressBarColor: \"progressBarColor\",\r\n progressBarCustomColor: \"progressBarCustomColor\",\r\n submitButtonStyle: \"submitButtonStyle\",\r\n submitButtonPosition: \"submitButtonPosition\",\r\n submitButtonSize: \"submitButtonSize\",\r\n submitButtonInnerText: \"submitButtonInnerText\",\r\n submitButtonBgType: \"submitButtonBgType\",\r\n submitButtonBgColor: \"submitButtonBgColor\",\r\n submitButtonBgColor2: \"submitButtonBgColor2\",\r\n submitButtonBgGradientDirection: \"submitButtonBgGradientDirection\",\r\n submitButtonTextColor: \"submitButtonTextColor\",\r\n /** Inside submitButtonConfig: when true, per-block settings apply for this question. */\r\n submitButtonOverride: \"override\",\r\n /** Global: input size — \"small\" | \"medium\" | \"full\". */\r\n inputSize: \"inputSize\",\r\n} as const;\r\n","import React, { useState } from \"react\";\r\n\r\nexport interface LazyImageProps\r\n extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"loading\"> {\r\n /** Image URL */\r\n src: string;\r\n /** Alt text (required for accessibility) */\r\n alt: string;\r\n /** Optional class for placeholder shown while loading */\r\n placeholderClassName?: string;\r\n}\r\n\r\n/**\r\n * Lazy-loading image component (native loading=\"lazy\").\r\n * Shows an optional placeholder until the image has loaded.\r\n * Shared by v1 and v2.\r\n */\r\nexport function LazyImage({\r\n src,\r\n alt,\r\n className,\r\n placeholderClassName = \"animate-pulse rounded bg-gray-200\",\r\n onLoad,\r\n onError,\r\n ...rest\r\n}: LazyImageProps) {\r\n const [loaded, setLoaded] = useState(false);\r\n const [error, setError] = useState(false);\r\n\r\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {\r\n setLoaded(true);\r\n onLoad?.(e);\r\n };\r\n\r\n const handleError = (e: React.SyntheticEvent<HTMLImageElement>) => {\r\n setError(true);\r\n onError?.(e);\r\n };\r\n\r\n if (error) return null;\r\n\r\n return (\r\n <span className=\"relative inline-block\">\r\n {!loaded && placeholderClassName && (\r\n <span\r\n className={placeholderClassName}\r\n aria-hidden\r\n style={{ display: \"inline-block\", minHeight: 40, minWidth: 80 }}\r\n />\r\n )}\r\n <img\r\n src={src}\r\n alt={alt}\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n className={\r\n loaded\r\n ? className\r\n : \"absolute inset-0 h-full w-full object-contain opacity-0\"\r\n }\r\n onLoad={handleLoad}\r\n onError={handleError}\r\n {...rest}\r\n />\r\n </span>\r\n );\r\n}\r\n","import type { ReactNode, CSSProperties } from \"react\";\nimport type { QuizData } from \"@/v1/types\";\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\nimport { COLOR_PALETTE_DEFAULTS } from \"@/v1/utils/colorPalette\";\nimport { LazyImage } from \"@/v1/components/Image\";\n\nexport type HeaderStyle = \"default\" | \"logo-bar\";\n\nexport interface QuizHeaderProps {\n data: QuizData;\n /** Rendered on the left (e.g. Back / previous question button). */\n leftContent?: ReactNode;\n}\n\nfunction promoBannerStyle(\n bgType: \"solid\" | \"gradient\",\n color: string,\n color2: string,\n direction: string\n): CSSProperties {\n const c1 = color || COLOR_PALETTE_DEFAULTS.promoBannerBg;\n if (bgType === \"gradient\" && color2) {\n return { background: `linear-gradient(${direction}, ${c1}, ${color2})` };\n }\n return { backgroundColor: c1 };\n}\n\nexport function QuizHeader({ data, leftContent }: QuizHeaderProps) {\n const config = data.config ?? {};\n const headerStyle = (config[QUIZ_CONFIG_KEYS.headerStyle] as HeaderStyle) ?? \"default\";\n const companyName = (config[QUIZ_CONFIG_KEYS.companyName] as string) ?? \"\";\n const companyLogo = (config[QUIZ_CONFIG_KEYS.companyLogo] as string) ?? \"\";\n const tagline = (config[QUIZ_CONFIG_KEYS.tagline] as string) ?? \"\";\n const headerPromoBannerEnabled = (config[QUIZ_CONFIG_KEYS.headerPromoBannerEnabled] as boolean) ?? false;\n const headerPromoBannerText = (config[QUIZ_CONFIG_KEYS.headerPromoBannerText] as string) ?? \"\";\n const headerPromoBannerBgType = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgType] as \"solid\" | \"gradient\") ?? \"solid\";\n const headerPromoBannerBgColor = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgColor] as string) ?? COLOR_PALETTE_DEFAULTS.promoBannerBg;\n const headerPromoBannerBgColor2 = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgColor2] as string) ?? \"\";\n const headerPromoBannerBgGradientDirection = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgGradientDirection] as string) ?? \"to right\";\n\n const hasBranding = companyName || companyLogo || tagline;\n const hasPromoBanner = headerPromoBannerEnabled && headerPromoBannerText.trim() !== \"\";\n const hasLogoBar = headerStyle === \"logo-bar\" && (companyLogo || leftContent);\n const hasDefault = headerStyle === \"default\" && (hasBranding || leftContent);\n\n if (!hasDefault && !hasLogoBar && !hasPromoBanner) return null;\n\n return (\n <header className=\"mb-6 flex flex-col gap-4\">\n {/* Promo banner: full-bleed to quiz container (dotted border). Breaks out of Form p-6 so it fills edge-to-edge. */}\n {hasPromoBanner && (\n <div\n className=\"sticky top-0 z-10 -mx-6 -mt-6 flex w-[calc(100%+3rem)] items-center justify-center px-4 py-2.5 text-center text-sm font-medium text-white shadow-sm\"\n style={promoBannerStyle(\n headerPromoBannerBgType,\n headerPromoBannerBgColor,\n headerPromoBannerBgColor2,\n headerPromoBannerBgGradientDirection\n )}\n >\n {headerPromoBannerText}\n </div>\n )}\n\n {/* Logo bar: horizontal bar, logo on left */}\n {headerStyle === \"logo-bar\" && (\n <div className=\"flex items-center justify-between gap-4 border-b border-gray-200 bg-white py-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {leftContent}\n {companyLogo ? (\n <LazyImage\n src={companyLogo}\n alt={companyName || \"Company logo\"}\n className=\"h-8 w-auto object-contain\"\n />\n ) : null}\n </div>\n <div aria-hidden />\n </div>\n )}\n\n {/* Default: centered branding (logo, name, tagline) */}\n {headerStyle === \"default\" && (hasBranding || leftContent) && (\n <div className=\"grid grid-cols-[1fr_auto_1fr] items-center gap-4\">\n <div className=\"min-w-0\">{leftContent ?? null}</div>\n <div className=\"flex flex-col items-center gap-2 text-center\">\n {companyLogo ? (\n <LazyImage\n src={companyLogo}\n alt={companyName || \"Company logo\"}\n className=\"h-10 w-auto object-contain\"\n />\n ) : null}\n {companyName ? (\n <h1 className=\"text-xl font-semibold tracking-tight text-gray-900\">\n {companyName}\n </h1>\n ) : null}\n {tagline ? (\n <p className=\"text-sm text-gray-500\">{tagline}</p>\n ) : null}\n </div>\n <div aria-hidden />\n </div>\n )}\n </header>\n );\n}\n","import React from \"react\";\r\n\r\nexport interface QuizProgressProps {\r\n progress: number; // 0 to 1\r\n /** Fill color (hex). Consumer decides how to use it. */\r\n color?: string;\r\n}\r\n\r\nexport function QuizProgress({ progress, color }: QuizProgressProps) {\r\n const clamped = Math.max(0, Math.min(1, progress));\r\n const percent = Math.round(clamped * 100);\r\n const fillColor = color || \"#22c55e\";\r\n\r\n return (\r\n <div className=\"mb-6\">\r\n <div\r\n className=\"h-2 w-full overflow-hidden rounded-full bg-gray-200\"\r\n role=\"progressbar\"\r\n aria-valuenow={percent}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n >\r\n <div\r\n className=\"h-full rounded-full transition-all duration-300 ease-out\"\r\n style={{ width: `${percent}%`, backgroundColor: fillColor }}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","export interface QuizInputNumericProps {\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n id: string;\r\n placeholder?: string;\r\n /** Width class from global input size (e.g. max-w-xs, w-full). */\r\n sizeClass?: string;\r\n}\r\n\r\nexport function QuizInputNumeric({\r\n value,\r\n onChange,\r\n id,\r\n placeholder,\r\n sizeClass,\r\n}: QuizInputNumericProps) {\r\n const baseClass =\r\n \"rounded border border-gray-200 px-3 py-2 text-base focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20\";\r\n const widthClass = sizeClass ?? \"w-full\";\r\n return (\r\n <input\r\n type=\"number\"\r\n value={value}\r\n onChange={(e) =>\r\n onChange(e.target.value === \"\" ? \"\" : Number(e.target.value))\r\n }\r\n className={`${widthClass} ${baseClass}`.trim()}\r\n data-quiz-id={id}\r\n placeholder={placeholder}\r\n />\r\n );\r\n}\r\n","export interface QuizInputTextProps {\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n id: string;\r\n placeholder?: string;\r\n /** HTML input type (text, email, password, tel, url, search). */\r\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"url\" | \"search\";\r\n /** Width class from global input size (e.g. max-w-xs, w-full). */\r\n sizeClass?: string;\r\n}\r\n\r\nexport function QuizInputText({ value, onChange, id, placeholder, type = \"text\", sizeClass }: QuizInputTextProps) {\r\n const baseClass =\r\n \"rounded border border-gray-200 px-3 py-2 text-base focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20\";\r\n const widthClass = sizeClass ?? \"w-full\";\r\n return (\r\n <input\r\n type={type}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className={`${widthClass} ${baseClass}`.trim()}\r\n data-quiz-id={id}\r\n placeholder={placeholder}\r\n />\r\n );\r\n}\r\n","import type { OptionItem } from \"@/v1/types\";\r\nimport { LazyImage } from \"@/v1/components/Image\";\r\n\r\nexport interface QuizInputOptionsProps {\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n id: string;\r\n options: OptionItem[];\r\n layout?: \"list\" | \"grid\" | \"masonry\";\r\n imageFit?: \"contain\" | \"cover\";\r\n}\r\n\r\nexport function QuizInputOptions({\r\n value,\r\n onChange,\r\n id,\r\n options,\r\n layout = \"grid\",\r\n imageFit = \"contain\",\r\n}: QuizInputOptionsProps) {\r\n const imageClass =\r\n imageFit === \"cover\"\r\n ? \"h-full w-full object-cover object-center\"\r\n : \"h-full w-full object-contain object-center p-3\";\r\n\r\n const containerClass =\r\n layout === \"list\"\r\n ? \"flex flex-col gap-2\"\r\n : layout === \"masonry\"\r\n ? \"mx-auto columns-2 gap-3 sm:columns-2 lg:columns-3\"\r\n : \"mx-auto flex max-w-full flex-wrap justify-center gap-3\";\r\n\r\n return (\r\n <div\r\n className={containerClass}\r\n data-quiz-id={id}\r\n >\r\n {options.map((opt, index) => {\r\n const isSelected = value === opt.label;\r\n return (\r\n <label\r\n key={opt.id}\r\n className={`${layout === \"list\" ? \"flex-row\" : \"flex-col\"\r\n } ${layout === \"masonry\" ? \"mb-3 break-inside-avoid\" : \"\"} flex cursor-pointer overflow-hidden rounded-xl border-2 bg-white shadow-sm transition-colors hover:border-indigo-300 ${isSelected ? \"border-indigo-500 ring-2 ring-indigo-500/20\" : \"border-gray-200\"\r\n } ${layout === \"list\" ? \"w-full\" : \"w-[18rem] max-w-full\"}`}\r\n >\r\n <input\r\n type=\"radio\"\r\n name={`quiz-${id}`}\r\n value={opt.label}\r\n checked={isSelected}\r\n onChange={() => onChange(opt.label)}\r\n className=\"sr-only\"\r\n aria-label={opt.label}\r\n />\r\n {opt.imageUrl ? (\r\n <div\r\n className={`relative flex items-center justify-center overflow-hidden bg-gray-50 ${layout === \"list\" ? \"h-16 w-24 shrink-0\" : \"aspect-[4/3] w-full\"\r\n }`}\r\n >\r\n <LazyImage\r\n src={opt.imageUrl}\r\n alt={opt.label}\r\n className={imageClass}\r\n />\r\n </div>\r\n ) : null}\r\n <div className={`flex flex-1 items-center justify-center px-4 py-3 ${layout === \"list\" ? \"text-left\" : \"text-center\"}`}>\r\n <span className=\"text-[15px] font-medium text-gray-900\">\r\n {opt.label}\r\n </span>\r\n </div>\r\n </label>\r\n );\r\n })}\r\n </div>\r\n );\r\n}\r\n","import type { SliderParams } from \"@/v1/types\";\r\n\r\nexport interface QuizInputSliderProps {\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n id: string;\r\n sliderParams: SliderParams;\r\n}\r\n\r\nexport function QuizInputSlider({\r\n value,\r\n onChange,\r\n id,\r\n sliderParams,\r\n}: QuizInputSliderProps) {\r\n const { min, max, inputType, prefix = \"\", suffix = \"\" } = sliderParams;\r\n const numValue =\r\n typeof value === \"number\" && !Number.isNaN(value) ? value : min;\r\n\r\n return (\r\n <div\r\n className=\"flex flex-wrap items-center gap-2\"\r\n data-quiz-id={id}\r\n >\r\n {prefix && <span className=\"text-sm text-gray-600\">{prefix}</span>}\r\n <input\r\n type=\"range\"\r\n min={min}\r\n max={max}\r\n step={inputType === \"float\" ? 0.01 : 1}\r\n value={numValue}\r\n onChange={(e) => onChange(Number(e.target.value))}\r\n className=\"min-w-0 flex-1\"\r\n />\r\n <input\r\n type=\"number\"\r\n min={min}\r\n max={max}\r\n step={inputType === \"float\" ? 0.01 : 1}\r\n value={numValue}\r\n onChange={(e) => onChange(Number(e.target.value) || min)}\r\n className=\"w-20 rounded border border-gray-200 px-3 py-2 text-base focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20\"\r\n />\r\n {suffix && <span className=\"text-sm text-gray-600\">{suffix}</span>}\r\n </div>\r\n );\r\n}\r\n","import type { QuizItemNumeric } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { QuizInputNumeric } from \"./QuizInputNumeric\";\r\n\r\nconst INPUT_SIZE_CLASS: Record<\"small\" | \"medium\" | \"full\", string> = {\r\n small: \"max-w-xs w-full\",\r\n medium: \"max-w-md w-full\",\r\n full: \"w-full\",\r\n};\r\n\r\nexport interface NumericQuestionInputProps {\r\n item: QuizItemNumeric;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nexport function NumericQuestionInput({\r\n item,\r\n value,\r\n onChange,\r\n config,\r\n}: NumericQuestionInputProps) {\r\n const size = (config?.[QUIZ_CONFIG_KEYS.inputSize] as \"small\" | \"medium\" | \"full\") ?? \"medium\";\r\n const sizeClass = INPUT_SIZE_CLASS[size];\r\n return (\r\n <div className=\"flex justify-center\">\r\n <QuizInputNumeric\r\n value={value}\r\n onChange={onChange}\r\n id={item.id}\r\n placeholder={item.numericParams?.placeholder}\r\n sizeClass={sizeClass}\r\n />\r\n </div>\r\n );\r\n}\r\n","import type { QuizItemText, TextInputFormat } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { QuizInputText } from \"./QuizInputText\";\r\n\r\nconst INPUT_SIZE_CLASS: Record<\"small\" | \"medium\" | \"full\", string> = {\r\n small: \"max-w-xs w-full\",\r\n medium: \"max-w-md w-full\",\r\n full: \"w-full\",\r\n};\r\n\r\nexport interface TextQuestionInputProps {\r\n item: QuizItemText;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nexport function TextQuestionInput({\r\n item,\r\n value,\r\n onChange,\r\n config,\r\n}: TextQuestionInputProps) {\r\n const placeholder = item.textParams?.placeholder;\r\n const inputFormat = (item.textParams?.inputFormat ?? \"text\") as TextInputFormat;\r\n const size = (config?.[QUIZ_CONFIG_KEYS.inputSize] as \"small\" | \"medium\" | \"full\") ?? \"medium\";\r\n const sizeClass = INPUT_SIZE_CLASS[size];\r\n return (\r\n <div className=\"flex justify-center\">\r\n <QuizInputText\r\n value={value}\r\n onChange={onChange}\r\n id={item.id}\r\n placeholder={placeholder}\r\n type={inputFormat}\r\n sizeClass={sizeClass}\r\n />\r\n </div>\r\n );\r\n}\r\n","export function generateId(): string {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\n","import type {\r\n QuizItem,\r\n QuestionType,\r\n SliderParams,\r\n OptionsParams,\r\n OptionItem,\r\n} from \"@/v1/types\";\r\nimport { generateId } from \"@/v1/utils/id\";\r\n\r\nconst QUESTION_TYPES: QuestionType[] = [\r\n \"text\",\r\n \"numeric\",\r\n \"options\",\r\n \"slider\",\r\n \"basicInfo\",\r\n];\r\n\r\nexport const defaultSliderParams: SliderParams = {\r\n min: 0,\r\n max: 100,\r\n inputType: \"int\",\r\n prefix: \"\",\r\n suffix: \"\",\r\n};\r\n\r\nexport const defaultOptionsParams: OptionsParams = {\r\n options: [\r\n { id: generateId(), label: \"Option 1\" },\r\n { id: generateId(), label: \"Option 2\" },\r\n ],\r\n imageFit: \"contain\",\r\n};\r\n\r\n/** Normalize options from legacy string[] or OptionItem[] to OptionItem[]. */\r\nexport function normalizeOptions(\r\n options: (string | OptionItem)[] | undefined\r\n): OptionItem[] {\r\n if (!options?.length) return [];\r\n return options.map((opt) =>\r\n typeof opt === \"string\"\r\n ? { id: generateId(), label: opt }\r\n : { id: opt.id || generateId(), label: opt.label, imageUrl: opt.imageUrl }\r\n );\r\n}\r\n\r\nconst QUESTION_TYPE_LABEL: Record<QuestionType, string> = {\r\n text: \"Text\",\r\n numeric: \"Numeric\",\r\n options: \"Options\",\r\n slider: \"Slider\",\r\n basicInfo: \"Basic Information Form\",\r\n};\r\n\r\nfunction getDefaultBase(id: string, type: QuestionType) {\r\n const label = QUESTION_TYPE_LABEL[type];\r\n return {\r\n id,\r\n title: `Default ${label} Question`,\r\n subtitle: `Default ${label} Subtitle`,\r\n designType: \"default\" as const,\r\n };\r\n}\r\n\r\nexport function createEmptyItem(id: string, type: QuestionType): QuizItem {\r\n const base = getDefaultBase(id, type);\r\n switch (type) {\r\n case \"slider\":\r\n return {\r\n ...base,\r\n type: \"slider\",\r\n sliderParams: { ...defaultSliderParams },\r\n };\r\n case \"options\":\r\n return {\r\n ...base,\r\n type: \"options\",\r\n optionsParams: { ...defaultOptionsParams },\r\n };\r\n case \"numeric\":\r\n return { ...base, type: \"numeric\" };\r\n case \"basicInfo\":\r\n return {\r\n ...base,\r\n type: \"basicInfo\",\r\n basicInfoParams: {\r\n withOtp: false,\r\n privacyPolicyLabel: \"I agree to the Privacy Policy\",\r\n },\r\n };\r\n case \"text\":\r\n default:\r\n return { ...base, type: \"text\" };\r\n }\r\n}\r\n\r\n/** Creates one empty item per input style (text, numeric, options, slider). Each item gets a unique UUID id. */\r\nexport function createDefaultItems(): QuizItem[] {\r\n return QUESTION_TYPES.map((type) => createEmptyItem(generateId(), type));\r\n}\r\n\r\n/** Returns true if quizes is exactly the default placeholder set (same length, types, and titles). */\r\nexport function isDefaultItems(quizes: QuizItem[]): boolean {\r\n const defaultItems = createDefaultItems();\r\n if (quizes.length !== defaultItems.length) return false;\r\n return defaultItems.every(\r\n (d, i) => quizes[i].type === d.type && quizes[i].title === d.title\r\n );\r\n}\r\n","import type { QuizItemOptions, OptionItem } from \"@/v1/types\";\r\nimport { normalizeOptions } from \"@/v1/utils/quizFactory\";\r\nimport { QuizInputOptions } from \"./QuizInputOptions\";\r\n\r\nexport interface OptionsQuestionInputProps {\r\n item: QuizItemOptions;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n}\r\n\r\nexport function OptionsQuestionInput({\r\n item,\r\n value,\r\n onChange,\r\n}: OptionsQuestionInputProps) {\r\n const options = normalizeOptions(\r\n item.optionsParams?.options as (string | OptionItem)[] | undefined\r\n );\r\n const layout = item.optionsParams?.layout ?? \"grid\";\r\n const imageFit = item.optionsParams?.imageFit ?? \"contain\";\r\n return (\r\n <QuizInputOptions\r\n value={value}\r\n onChange={onChange}\r\n id={item.id}\r\n options={options}\r\n layout={layout}\r\n imageFit={imageFit}\r\n />\r\n );\r\n}\r\n","import type { QuizItemSlider } from \"@/v1/types\";\r\nimport { QuizInputSlider } from \"./QuizInputSlider\";\r\n\r\nexport interface SliderQuestionInputProps {\r\n item: QuizItemSlider;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n}\r\n\r\nexport function SliderQuestionInput({\r\n item,\r\n value,\r\n onChange,\r\n}: SliderQuestionInputProps) {\r\n return (\r\n <QuizInputSlider\r\n value={value}\r\n onChange={onChange}\r\n id={item.id}\r\n sliderParams={item.sliderParams}\r\n />\r\n );\r\n}\r\n","import React, { useState, useCallback } from \"react\";\r\nimport PhoneInput, { isValidPhoneNumber } from \"react-phone-number-input\";\r\nimport type { QuizItemBasicInfo } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport \"react-phone-number-input/style.css\";\r\n\r\nexport interface BasicInfoValue {\r\n firstName: string;\r\n lastName: string;\r\n phone: string;\r\n otpCode: string;\r\n privacyAccepted: boolean;\r\n}\r\n\r\nconst DEFAULT_BASIC_INFO: BasicInfoValue = {\r\n firstName: \"\",\r\n lastName: \"\",\r\n phone: \"\",\r\n otpCode: \"\",\r\n privacyAccepted: false,\r\n};\r\n\r\nfunction parseBasicInfoValue(raw: string | number): BasicInfoValue {\r\n if (raw === \"\" || raw === undefined || raw === null) return { ...DEFAULT_BASIC_INFO };\r\n if (typeof raw !== \"string\") return { ...DEFAULT_BASIC_INFO };\r\n try {\r\n const parsed = JSON.parse(raw) as Partial<BasicInfoValue>;\r\n return {\r\n firstName: typeof parsed.firstName === \"string\" ? parsed.firstName : \"\",\r\n lastName: typeof parsed.lastName === \"string\" ? parsed.lastName : \"\",\r\n phone: typeof parsed.phone === \"string\" ? parsed.phone : \"\",\r\n otpCode: typeof parsed.otpCode === \"string\" ? parsed.otpCode : \"\",\r\n privacyAccepted: Boolean(parsed.privacyAccepted),\r\n };\r\n } catch {\r\n return { ...DEFAULT_BASIC_INFO };\r\n }\r\n}\r\n\r\nconst INPUT_SIZE_CLASS: Record<\"small\" | \"medium\" | \"full\", string> = {\r\n small: \"max-w-xs w-full\",\r\n medium: \"max-w-md w-full\",\r\n full: \"w-full\",\r\n};\r\n\r\nconst inputBaseClass =\r\n \"rounded border border-gray-200 px-3 py-2 text-base focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20\";\r\n\r\nexport interface BasicInfoQuestionInputProps {\r\n item: QuizItemBasicInfo;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nexport function BasicInfoQuestionInput({\r\n item,\r\n value,\r\n onChange,\r\n config,\r\n}: BasicInfoQuestionInputProps) {\r\n const params = item.basicInfoParams ?? {};\r\n const withOtp = params.withOtp ?? false;\r\n const privacyPolicyUrl = params.privacyPolicyUrl ?? \"\";\r\n const privacyPolicyLabel = params.privacyPolicyLabel ?? \"I agree to the Privacy Policy\";\r\n\r\n const data = parseBasicInfoValue(value);\r\n const [otpSent, setOtpSent] = useState(false);\r\n const [phoneError, setPhoneError] = useState<string | null>(null);\r\n\r\n const size = (config?.[QUIZ_CONFIG_KEYS.inputSize] as \"small\" | \"medium\" | \"full\") ?? \"medium\";\r\n const sizeClass = INPUT_SIZE_CLASS[size];\r\n\r\n const update = useCallback(\r\n (next: Partial<BasicInfoValue>) => {\r\n const merged = { ...data, ...next };\r\n onChange(JSON.stringify(merged));\r\n },\r\n [data, onChange]\r\n );\r\n\r\n const hasPrivacyAgreement = Boolean(privacyPolicyLabel?.trim());\r\n\r\n const isPhoneValid = data.phone ? isValidPhoneNumber(data.phone) : false;\r\n const handleSendOtp = () => {\r\n if (!data.phone) {\r\n setPhoneError(\"Please enter a valid phone number.\");\r\n return;\r\n }\r\n if (!isValidPhoneNumber(data.phone)) {\r\n setPhoneError(\"Please enter a valid phone number.\");\r\n return;\r\n }\r\n setPhoneError(null);\r\n setOtpSent(true);\r\n // In a real app you would call an API here to send the OTP.\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col items-center gap-4\">\r\n <div className={`flex flex-col gap-3 ${sizeClass}`}>\r\n <div className=\"flex flex-col gap-1\">\r\n <label htmlFor={`${item.id}-firstname`} className=\"text-sm font-medium text-gray-700\">\r\n First name\r\n </label>\r\n <input\r\n id={`${item.id}-firstname`}\r\n type=\"text\"\r\n value={data.firstName}\r\n onChange={(e) => update({ firstName: e.target.value })}\r\n className={`${inputBaseClass} ${sizeClass}`}\r\n placeholder=\"First name\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label htmlFor={`${item.id}-lastname`} className=\"text-sm font-medium text-gray-700\">\r\n Last name\r\n </label>\r\n <input\r\n id={`${item.id}-lastname`}\r\n type=\"text\"\r\n value={data.lastName}\r\n onChange={(e) => update({ lastName: e.target.value })}\r\n className={`${inputBaseClass} ${sizeClass}`}\r\n placeholder=\"Last name\"\r\n />\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label htmlFor={`${item.id}-phone`} className=\"text-sm font-medium text-gray-700\">\r\n Phone number\r\n </label>\r\n <PhoneInput\r\n international\r\n defaultCountry=\"US\"\r\n placeholder=\"Enter phone number\"\r\n value={data.phone || undefined}\r\n onChange={(v) => {\r\n update({ phone: v ?? \"\" });\r\n setPhoneError(null);\r\n }}\r\n className=\"PhoneInput\"\r\n id={`${item.id}-phone`}\r\n />\r\n {withOtp && (\r\n <>\r\n {phoneError && (\r\n <div\r\n role=\"alert\"\r\n className=\"mt-1 flex items-center gap-2 rounded border border-gray-200 bg-gray-50 px-3 py-2 text-sm text-red-600\"\r\n >\r\n <span aria-hidden className=\"text-red-500\">\r\n <svg className=\"h-4 w-4\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n </span>\r\n {phoneError}\r\n </div>\r\n )}\r\n {!otpSent ? (\r\n <button\r\n type=\"button\"\r\n onClick={handleSendOtp}\r\n disabled={!data.phone || !isPhoneValid}\r\n className=\"mt-2 rounded border border-gray-200 bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 transition-colors hover:bg-gray-200 disabled:cursor-not-allowed disabled:opacity-50\"\r\n >\r\n Send Verification Code\r\n </button>\r\n ) : (\r\n <div className=\"mt-2 flex flex-col gap-1\">\r\n <label htmlFor={`${item.id}-otp`} className=\"text-sm font-medium text-gray-700\">\r\n Verification code\r\n </label>\r\n <input\r\n id={`${item.id}-otp`}\r\n type=\"text\"\r\n inputMode=\"numeric\"\r\n autoComplete=\"one-time-code\"\r\n value={data.otpCode}\r\n onChange={(e) => update({ otpCode: e.target.value.replace(/\\D/g, \"\").slice(0, 6) })}\r\n className={`${inputBaseClass} ${sizeClass}`}\r\n placeholder=\"Enter code\"\r\n />\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {hasPrivacyAgreement && (\r\n <label className=\"flex cursor-pointer items-start gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={data.privacyAccepted}\r\n onChange={(e) => update({ privacyAccepted: e.target.checked })}\r\n className=\"mt-1 h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\r\n />\r\n <span className=\"text-sm text-gray-700\">\r\n {privacyPolicyUrl ? (\r\n <>\r\n I agree to the{\" \"}\r\n <a\r\n href={privacyPolicyUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-indigo-600 underline hover:text-indigo-800\"\r\n >\r\n Privacy Policy\r\n </a>\r\n </>\r\n ) : (\r\n privacyPolicyLabel\r\n )}\r\n </span>\r\n </label>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { QuizItem } from \"@/v1/types\";\r\nimport {\r\n NumericQuestionInput,\r\n TextQuestionInput,\r\n OptionsQuestionInput,\r\n SliderQuestionInput,\r\n BasicInfoQuestionInput,\r\n} from \"./inputs\";\r\n\r\nexport interface QuestionInputProps {\r\n item: QuizItem;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n /** Global config (e.g. inputSize). */\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nexport function QuestionInput({ item, value, onChange, config }: QuestionInputProps) {\r\n switch (item.type) {\r\n case \"numeric\":\r\n return (\r\n <NumericQuestionInput item={item} value={value} onChange={onChange} config={config} />\r\n );\r\n case \"text\":\r\n return (\r\n <TextQuestionInput item={item} value={value} onChange={onChange} config={config} />\r\n );\r\n case \"options\":\r\n return (\r\n <OptionsQuestionInput item={item} value={value} onChange={onChange} />\r\n );\r\n case \"slider\":\r\n return (\r\n <SliderQuestionInput item={item} value={value} onChange={onChange} />\r\n );\r\n case \"basicInfo\":\r\n return (\r\n <BasicInfoQuestionInput\r\n item={item}\r\n value={value}\r\n onChange={onChange}\r\n config={config}\r\n />\r\n );\r\n default:\r\n return null;\r\n }\r\n}\r\n","import type { CSSProperties, ReactNode } from \"react\";\r\nimport type { QuizItem } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\n\r\nexport type TextPosition = \"left\" | \"center\" | \"right\";\r\nexport type FontSizePreset = \"small\" | \"medium\" | \"large\" | \"custom\";\r\n\r\nexport const TEXT_ALIGN_CLASS: Record<TextPosition, string> = {\r\n left: \"text-left\",\r\n center: \"text-center\",\r\n right: \"text-right\",\r\n};\r\n\r\nexport interface QuizBlockProps {\r\n item: QuizItem;\r\n value: string | number;\r\n onChange: (v: string | number) => void;\r\n children: ReactNode;\r\n /** Global config (e.g. for titlePosition, subtitlePosition). */\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nexport function getTitleSubtitleAlign(\r\n config: Record<string, unknown> | undefined\r\n): { title: string; subtitle: string } {\r\n const titlePosition =\r\n (config?.[QUIZ_CONFIG_KEYS.titlePosition] as TextPosition) ?? \"center\";\r\n const subtitlePosition =\r\n (config?.[QUIZ_CONFIG_KEYS.subtitlePosition] as TextPosition) ?? \"center\";\r\n return {\r\n title: TEXT_ALIGN_CLASS[titlePosition],\r\n subtitle: TEXT_ALIGN_CLASS[subtitlePosition],\r\n };\r\n}\r\n\r\nfunction toNumberOrUndefined(v: unknown): number | undefined {\r\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\r\n if (typeof v === \"string\" && v.trim() !== \"\") {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction presetToPx(\r\n kind: \"title\" | \"subtitle\",\r\n preset: FontSizePreset\r\n): number | undefined {\r\n if (preset === \"custom\") return undefined;\r\n if (kind === \"title\") {\r\n if (preset === \"small\") return 16;\r\n if (preset === \"medium\") return 18;\r\n return 22;\r\n }\r\n if (preset === \"small\") return 13;\r\n if (preset === \"medium\") return 14;\r\n return 16;\r\n}\r\n\r\nexport function getTitleSubtitleStyle(\r\n config: Record<string, unknown> | undefined\r\n): {\r\n titleStyle: CSSProperties;\r\n subtitleStyle: CSSProperties;\r\n} {\r\n const titlePreset =\r\n (config?.[QUIZ_CONFIG_KEYS.titleFontSizePreset] as FontSizePreset) ??\r\n \"medium\";\r\n const subtitlePreset =\r\n (config?.[QUIZ_CONFIG_KEYS.subtitleFontSizePreset] as FontSizePreset) ??\r\n \"medium\";\r\n\r\n const titleCustomPx = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.titleFontSizePx]\r\n );\r\n const subtitleCustomPx = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.subtitleFontSizePx]\r\n );\r\n\r\n const titleMt = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.titleMarginTopPx]\r\n );\r\n const titleMb = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.titleMarginBottomPx]\r\n );\r\n const subtitleMt = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.subtitleMarginTopPx]\r\n );\r\n const subtitleMb = toNumberOrUndefined(\r\n config?.[QUIZ_CONFIG_KEYS.subtitleMarginBottomPx]\r\n );\r\n\r\n return {\r\n titleStyle: {\r\n fontSize:\r\n titlePreset === \"custom\"\r\n ? titleCustomPx\r\n : presetToPx(\"title\", titlePreset),\r\n marginTop: titleMt,\r\n marginBottom: titleMb,\r\n },\r\n subtitleStyle: {\r\n fontSize:\r\n subtitlePreset === \"custom\"\r\n ? subtitleCustomPx\r\n : presetToPx(\"subtitle\", subtitlePreset),\r\n marginTop: subtitleMt,\r\n marginBottom: subtitleMb,\r\n },\r\n };\r\n}\r\n","import type { QuizBlockProps } from \"./QuizBlockProps\";\r\nimport { getTitleSubtitleAlign, getTitleSubtitleStyle } from \"./QuizBlockProps\";\r\n\r\nexport function DefaultQuizBlock({\r\n item,\r\n children,\r\n config,\r\n}: QuizBlockProps) {\r\n const align = getTitleSubtitleAlign(config);\r\n const styles = getTitleSubtitleStyle(config);\r\n return (\r\n <div className=\"mb-6\">\r\n <h3 style={styles.titleStyle} className={`mb-1 text-lg font-medium ${align.title}`}>{item.title}</h3>\r\n {item.subtitle && (\r\n <p style={styles.subtitleStyle} className={`mb-2 text-sm text-gray-500 ${align.subtitle}`}>{item.subtitle}</p>\r\n )}\r\n <div>{children}</div>\r\n </div>\r\n );\r\n}\r\n","import type { QuizBlockProps } from \"./QuizBlockProps\";\r\nimport { getTitleSubtitleAlign, getTitleSubtitleStyle } from \"./QuizBlockProps\";\r\n\r\nexport function CardQuizBlock({\r\n item,\r\n children,\r\n config,\r\n}: QuizBlockProps) {\r\n const align = getTitleSubtitleAlign(config);\r\n const styles = getTitleSubtitleStyle(config);\r\n return (\r\n <div className=\"mb-6 rounded-lg border border-gray-200 bg-white p-4\">\r\n <h3 style={styles.titleStyle} className={`mb-1 text-lg font-medium ${align.title}`}>{item.title}</h3>\r\n {item.subtitle && (\r\n <p style={styles.subtitleStyle} className={`mb-2 text-sm text-gray-500 ${align.subtitle}`}>{item.subtitle}</p>\r\n )}\r\n <div>{children}</div>\r\n </div>\r\n );\r\n}\r\n","import type { QuizBlockProps } from \"./QuizBlockProps\";\r\nimport { getTitleSubtitleAlign, getTitleSubtitleStyle } from \"./QuizBlockProps\";\r\n\r\nexport function CompactQuizBlock({\r\n item,\r\n children,\r\n config,\r\n}: QuizBlockProps) {\r\n const align = getTitleSubtitleAlign(config);\r\n const styles = getTitleSubtitleStyle(config);\r\n return (\r\n <div className=\"mb-6\">\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <h3 style={styles.titleStyle} className={`text-lg font-medium ${align.title}`}>{item.title}</h3>\r\n <div className=\"min-w-0 flex-1\">{children}</div>\r\n </div>\r\n {item.subtitle && (\r\n <p style={styles.subtitleStyle} className={`mt-1 text-sm text-gray-500 ${align.subtitle}`}>{item.subtitle}</p>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { ComponentType } from \"react\";\r\nimport type { DesignType } from \"@/v1/types\";\r\nimport { DefaultQuizBlock } from \"./DefaultQuizBlock\";\r\nimport { CardQuizBlock } from \"./CardQuizBlock\";\r\nimport { CompactQuizBlock } from \"./CompactQuizBlock\";\r\nimport type { QuizBlockProps } from \"./QuizBlockProps\";\r\n\r\nexport type { QuizBlockProps } from \"./QuizBlockProps\";\r\nexport { DefaultQuizBlock } from \"./DefaultQuizBlock\";\r\nexport { CardQuizBlock } from \"./CardQuizBlock\";\r\nexport { CompactQuizBlock } from \"./CompactQuizBlock\";\r\n\r\nconst BLOCK_MAP: Record<DesignType, ComponentType<QuizBlockProps>> = {\r\n default: DefaultQuizBlock,\r\n card: CardQuizBlock,\r\n compact: CompactQuizBlock,\r\n};\r\n\r\nexport function getQuizBlockComponent(\r\n designType: DesignType | undefined\r\n): ComponentType<QuizBlockProps> {\r\n return BLOCK_MAP[designType ?? \"default\"];\r\n}\r\n","import type { QuizItem } from \"@/v1/types\";\r\nimport { QuestionInput } from \"./QuestionInput\";\r\nimport { getQuizBlockComponent } from \"./blocks\";\r\n\r\nexport interface QuizItemBlockProps {\r\n item: QuizItem;\r\n value?: string | number;\r\n onChange: (v: string | number) => void;\r\n /** Global config (e.g. for title/subtitle position in blocks). */\r\n config?: Record<string, unknown>;\r\n}\r\n\r\nfunction getDefaultValue(item: QuizItem): string | number {\r\n if (item.type === \"slider\") {\r\n return item.sliderParams.min;\r\n }\r\n return \"\";\r\n}\r\n\r\nexport function QuizItemBlock({ item, value, onChange, config }: QuizItemBlockProps) {\r\n const displayValue = value ?? getDefaultValue(item);\r\n const BlockComponent = getQuizBlockComponent(item.designType);\r\n\r\n return (\r\n <BlockComponent item={item} value={displayValue} onChange={onChange} config={config}>\r\n <QuestionInput\r\n item={item}\r\n value={displayValue}\r\n onChange={onChange}\r\n config={config}\r\n />\r\n </BlockComponent>\r\n );\r\n}\r\n","import type { ButtonStyle } from \"@/v1/types\";\r\n\r\nconst BASE =\r\n \"inline-flex items-center justify-center gap-2 rounded-lg px-5 py-3 text-sm font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50\";\r\n\r\nexport const SUBMIT_BUTTON_CLASSES: Record<ButtonStyle, string> = {\r\n primary:\r\n BASE +\r\n \" bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500 shadow-sm\",\r\n secondary:\r\n BASE + \" bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-400\",\r\n outline:\r\n BASE +\r\n \" border-2 border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-gray-400\",\r\n};\r\n\r\nconst VALID_STYLES: ButtonStyle[] = [\"primary\", \"secondary\", \"outline\"];\r\n\r\nexport function getSubmitButtonClass(style?: string | ButtonStyle): string {\r\n const s = VALID_STYLES.includes(style as ButtonStyle) ? style : \"primary\";\r\n return SUBMIT_BUTTON_CLASSES[s as ButtonStyle];\r\n}\r\n","import React from \"react\";\r\nimport type { ButtonStyle } from \"@/v1/types\";\r\nimport { getSubmitButtonClass } from \"@/v1/utils/getButtonClasses\";\r\n\r\nexport interface QuizButtonProps\r\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"className\" | \"style\"> {\r\n /** Style from the question block (takes priority) */\r\n blockStyle?: ButtonStyle;\r\n /** Style from global config (fallback when blockStyle is empty) */\r\n fallbackStyle?: ButtonStyle;\r\n children: React.ReactNode;\r\n /** Optional extra class names */\r\n className?: string;\r\n /** Optional inline styles (e.g. custom backgroundColor, color from config) */\r\n customStyle?: React.CSSProperties;\r\n}\r\n\r\n/**\r\n * Quiz action button. Per-question style (blockStyle) takes priority; if empty,\r\n * uses global config (fallbackStyle). Final fallback: \"primary\".\r\n * customStyle overrides background/color when set (e.g. from submit button config).\r\n */\r\nexport function QuizButton({\r\n blockStyle,\r\n fallbackStyle,\r\n children,\r\n className = \"\",\r\n customStyle,\r\n type = \"button\",\r\n ...rest\r\n}: QuizButtonProps) {\r\n const resolvedStyle = blockStyle ?? fallbackStyle ?? \"primary\";\r\n const buttonClass = getSubmitButtonClass(resolvedStyle);\r\n\r\n return (\r\n <button\r\n type={type}\r\n data-testid=\"quiz-button\"\r\n className={`${buttonClass} ${className}`.trim()}\r\n style={customStyle}\r\n {...rest}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n","import { useState, useCallback, useEffect } from \"react\";\r\nimport type { QuizData, QuizItem, QuestionType } from \"@/v1/types\";\r\nimport { generateId } from \"./utils/id\";\r\nimport { createDefaultItems, createEmptyItem, isDefaultItems } from \"./utils/quizFactory\";\r\nimport { QUIZ_CONFIG_KEYS } from \"./utils/quizConfigKeys\";\r\nimport { QuizBuilderLivePreview } from \"./quiz-builder/QuizBuilderLivePreview\";\r\nimport { QuizBuilderConfig } from \"./quiz-builder/QuizBuilderConfig\";\r\nimport { QuizBuilderConfigModal } from \"./quiz-builder/QuizBuilderConfigModal\";\r\nimport { QuizBuilderSubmitButtonConfig, TitleAndSubtitleSettings, InputUISettings, QuizBuilderTitleConfig } from \"@/v1/components/builder\";\r\nimport { QuizBuilderQuestionNav } from \"./quiz-builder/QuizBuilderQuestionNav\";\r\nimport { QuizBuilderQuestionForm } from \"./quiz-builder/QuizBuilderQuestionForm\";\r\nimport { QuizBuilderJsonPreview } from \"./quiz-builder/QuizBuilderJsonPreview\";\r\n\r\nconst DEFAULT_QUIZ_UUID = \"00000000-0000-0000-0000-000000000000\";\r\n\r\ntype BuilderStep = \"config\" | \"questions\";\r\n\r\nexport interface QuizBuilderProps {\r\n initialData?: QuizData | null;\r\n onChange?: (data: QuizData) => void;\r\n onSubmit?: (answers: Record<string, string | number>) => void;\r\n}\r\n\r\nconst defaultQuizData = (): QuizData => ({\r\n id: DEFAULT_QUIZ_UUID,\r\n config: {},\r\n quizes: [...createDefaultItems()],\r\n});\r\n\r\nexport function QuizBuilder({ initialData, onChange, onSubmit }: QuizBuilderProps) {\r\n // Global config step: config is editable, quizes are always default (for preview only)\r\n const [globalConfigData, setGlobalConfigData] = useState<QuizData>(() =>\r\n initialData\r\n ? { ...initialData, quizes: [...createDefaultItems()] }\r\n : defaultQuizData()\r\n );\r\n\r\n // Questions step: same config as global (kept in sync), real quizes from user\r\n const [realQuizData, setRealQuizData] = useState<QuizData>(() =>\r\n initialData ?? defaultQuizData()\r\n );\r\n\r\n const [step, setStep] = useState<BuilderStep>(\"config\");\r\n const [selectedIndex, setSelectedIndex] = useState<number | null>(null);\r\n const [jsonOutputOpen, setJsonOutputOpen] = useState(false);\r\n\r\n // Data for current step: config step = global (default quizes), questions step = real\r\n const data = step === \"config\" ? globalConfigData : realQuizData;\r\n const hasQuestions = realQuizData.quizes.length > 0;\r\n const selectedItem =\r\n selectedIndex !== null && hasQuestions\r\n ? realQuizData.quizes[selectedIndex]\r\n : null;\r\n\r\n useEffect(() => {\r\n if (realQuizData.quizes.length === 0) {\r\n setSelectedIndex(null);\r\n } else if (\r\n selectedIndex === null ||\r\n selectedIndex >= realQuizData.quizes.length\r\n ) {\r\n setSelectedIndex(0);\r\n }\r\n }, [realQuizData.quizes.length, selectedIndex]);\r\n\r\n // When global config changes, sync config (and id if generated) to both global and real quiz data\r\n const updateConfig = useCallback(\r\n (config: Record<string, unknown>) => {\r\n setRealQuizData((prev) => {\r\n const id = prev.id === DEFAULT_QUIZ_UUID ? generateId() : prev.id;\r\n const next = { ...prev, config, id };\r\n setGlobalConfigData((g) => ({ ...g, config, id }));\r\n onChange?.(next);\r\n return next;\r\n });\r\n },\r\n [onChange]\r\n );\r\n\r\n const updateRealQuizData = useCallback(\r\n (next: QuizData) => {\r\n const dataWithId = {\r\n ...next,\r\n id: next.id === DEFAULT_QUIZ_UUID ? generateId() : next.id,\r\n };\r\n setRealQuizData(dataWithId);\r\n onChange?.(dataWithId);\r\n },\r\n [onChange]\r\n );\r\n\r\n const addQuestion = useCallback(\r\n (type: QuestionType) => {\r\n const quizes = realQuizData.quizes;\r\n const item = createEmptyItem(generateId(), type);\r\n const globalStyle = realQuizData.config[QUIZ_CONFIG_KEYS.submitButtonStyle] as \"primary\" | \"secondary\" | \"outline\" | undefined;\r\n if (globalStyle === \"primary\" || globalStyle === \"secondary\" || globalStyle === \"outline\") {\r\n item.buttonStyle = globalStyle;\r\n }\r\n const newQuizes = [...quizes, item];\r\n updateRealQuizData({ ...realQuizData, quizes: newQuizes });\r\n setSelectedIndex(newQuizes.length - 1);\r\n },\r\n [realQuizData, updateRealQuizData]\r\n );\r\n\r\n const updateQuestion = useCallback(\r\n (id: string, item: QuizItem) => {\r\n const index = realQuizData.quizes.findIndex((q) => q.id === id);\r\n if (index < 0) return;\r\n const quizes = [...realQuizData.quizes];\r\n quizes[index] = item;\r\n updateRealQuizData({ ...realQuizData, quizes });\r\n },\r\n [realQuizData, updateRealQuizData]\r\n );\r\n\r\n const removeQuestion = useCallback(\r\n (index: number) => {\r\n const quizes = realQuizData.quizes.filter((_, i) => i !== index);\r\n updateRealQuizData({ ...realQuizData, quizes });\r\n setSelectedIndex((prev) => {\r\n if (prev === null) return null;\r\n if (prev === index) return quizes.length > 0 ? Math.min(prev, quizes.length - 1) : null;\r\n if (prev > index) return prev - 1;\r\n return prev;\r\n });\r\n },\r\n [realQuizData, updateRealQuizData]\r\n );\r\n\r\n const handleSubmit = useCallback(\r\n (answers: Record<string, string | number>) => {\r\n onSubmit?.(answers);\r\n },\r\n [onSubmit]\r\n );\r\n\r\n /* Left panel: quiz settings (config step) — wider for form fields */\r\n const configPanel =\r\n step === \"config\" ? (\r\n <aside\r\n className=\"flex w-72 shrink-0 flex-col border-r border-gray-200 bg-white lg:w-80\"\r\n aria-label=\"Quiz settings\"\r\n >\r\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto rounded-r-lg border-l-0 border-gray-200 bg-gray-50/50 p-3 shadow-sm\">\r\n <QuizBuilderConfig data={data} onUpdate={updateConfig} />\r\n </div>\r\n </aside>\r\n ) : null;\r\n\r\n /* Right sidebar: config step = Submit button only; questions step = Edit question + JSON */\r\n const sidebar =\r\n step === \"config\" ? (\r\n <aside className=\"flex min-h-0 w-full flex-col border-l border-gray-200 bg-white lg:w-[20rem] lg:min-w-[20rem] lg:shrink-0\">\r\n <div className=\"flex min-h-0 flex-1 flex-col overflow-y-auto overflow-x-hidden p-4 pb-24\">\r\n <div className=\"flex flex-col gap-4 \">\r\n <TitleAndSubtitleSettings data={data} onUpdate={updateConfig} />\r\n <InputUISettings data={data} onUpdate={updateConfig} />\r\n <QuizBuilderSubmitButtonConfig data={data} onUpdate={updateConfig} />\r\n </div>\r\n <div className=\"mx-auto mt-6 flex justify-end\">\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const isDefaultQuizes = isDefaultItems(realQuizData.quizes);\r\n if (isDefaultQuizes) {\r\n const item = createEmptyItem(generateId(), \"text\");\r\n const globalStyle = globalConfigData.config[QUIZ_CONFIG_KEYS.submitButtonStyle] as \"primary\" | \"secondary\" | \"outline\" | undefined;\r\n if (globalStyle === \"primary\" || globalStyle === \"secondary\" || globalStyle === \"outline\") {\r\n item.buttonStyle = globalStyle;\r\n }\r\n updateRealQuizData({ ...realQuizData, config: globalConfigData.config, quizes: [item] });\r\n setSelectedIndex(0);\r\n }\r\n setStep(\"questions\");\r\n }}\r\n className=\"rounded-lg bg-indigo-600 p-3 px-4 text-sm font-semibold text-white hover:bg-indigo-700\"\r\n >\r\n Continue — Start adding questions\r\n </button>\r\n </div>\r\n </div>\r\n </aside>\r\n ) : step === \"questions\" ? (\r\n <aside className=\"flex min-h-0 w-full flex-col border-l border-gray-200 bg-white lg:w-[20rem] lg:min-w-[20rem] lg:shrink-0\">\r\n <div className=\"min-h-0 flex-1 overflow-y-auto overflow-x-hidden p-4 pb-24\">\r\n {!hasQuestions ? (\r\n <div className=\"rounded-xl border-2 border-dashed border-gray-200 bg-gray-50/50 py-12 text-center\">\r\n <p className=\"text-[15px] font-medium text-gray-500\">No questions yet</p>\r\n <p className=\"mt-1 text-sm text-gray-400\">Use the + button in the left panel to add a question</p>\r\n </div>\r\n ) : selectedItem !== null && selectedIndex !== null ? (\r\n <div className=\"flex flex-col gap-2\">\r\n <h4 className=\"text-xs font-semibold uppercase tracking-wider text-gray-500\">Edit question</h4>\r\n <QuizBuilderQuestionForm\r\n item={selectedItem}\r\n index={selectedIndex}\r\n config={data.config}\r\n onUpdate={updateQuestion}\r\n onDelete={removeQuestion}\r\n />\r\n </div>\r\n ) : null}\r\n </div>\r\n </aside>\r\n ) : null;\r\n\r\n const questionNav =\r\n step === \"questions\" ? (\r\n <div className=\"flex w-52 shrink-0 flex-col lg:w-56\">\r\n <section className=\"flex w-52 h-screen items-center py-4 flex-col border-r border-gray-200 bg-white lg:w-56\">\r\n <QuizBuilderQuestionNav\r\n count={data.quizes.length}\r\n selectedIndex={selectedIndex}\r\n onSelect={setSelectedIndex}\r\n onAddQuestion={addQuestion}\r\n />\r\n </section>\r\n {jsonOutputOpen && (\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\r\n aria-modal\r\n aria-labelledby=\"json-output-title\"\r\n onClick={() => setJsonOutputOpen(false)}\r\n >\r\n <div\r\n className=\"flex max-h-[90vh] max-w-2xl flex-col rounded-xl border border-gray-200 bg-white shadow-lg\"\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex items-center justify-between border-b border-gray-200 px-4 py-3\">\r\n <h2 id=\"json-output-title\" className=\"text-sm font-semibold text-gray-900\">\r\n JSON output\r\n </h2>\r\n <button\r\n type=\"button\"\r\n onClick={() => setJsonOutputOpen(false)}\r\n className=\"rounded-md p-1 text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\r\n aria-label=\"Close\"\r\n >\r\n <svg className=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\r\n <QuizBuilderJsonPreview data={data} />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n ) : null;\r\n\r\n return (\r\n <div className=\"flex h-full min-h-0 w-full flex-1 flex-col overflow-hidden lg:flex-row\">\r\n {configPanel}\r\n {questionNav}\r\n <main className=\"min-h-0 flex-1 overflow-y-auto p-4\">\r\n <QuizBuilderLivePreview\r\n data={data}\r\n step={step}\r\n onBackToSettings={step !== \"config\" ? () => setStep(\"config\") : undefined}\r\n selectedQuestionIndex={selectedIndex}\r\n onPreviewPageChanged={step === \"questions\" ? setSelectedIndex : undefined}\r\n onSubmit={handleSubmit}\r\n />\r\n </main>\r\n {sidebar}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport type { QuizData } from \"@/v1/types\";\r\nimport { Quiz } from \"@/v1/Quiz\";\r\n\r\nexport type PreviewViewport = \"mobile\" | \"desktop\" | \"custom\";\r\n\r\nconst VIEWPORT_OPTIONS: { value: PreviewViewport; label: string }[] = [\r\n { value: \"mobile\", label: \"Mobile\" },\r\n { value: \"desktop\", label: \"Desktop\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst CUSTOM_WIDTH_MIN = 320;\r\nconst CUSTOM_WIDTH_MAX = 1200;\r\nconst CUSTOM_WIDTH_DEFAULT = 672;\r\n\r\nconst VIEWPORT_WIDTH_CLASS: Record<Exclude<PreviewViewport, \"custom\">, string> = {\r\n mobile: \"max-w-sm\",\r\n desktop: \"max-w-2xl\",\r\n};\r\n\r\nexport interface QuizBuilderLivePreviewProps {\r\n data: QuizData;\r\n /** Builder step (config | questions) so preview re-renders when step changes. */\r\n step?: \"config\" | \"questions\";\r\n /** Optional action to return to quiz settings (builder). */\r\n onBackToSettings?: () => void;\r\n /** When set, preview shows only this question (builder selection). */\r\n selectedQuestionIndex?: number | null;\r\n /** Called when user navigates to another question in the preview (Continue/Back). Syncs builder question nav and editor. */\r\n onPreviewPageChanged?: (stepIndex: number) => void;\r\n onSubmit?: (answers: Record<string, string | number>) => void;\r\n onCheckpoint?: (answers: Record<string, string | number>, nextStepIndex: number) => void;\r\n}\r\n\r\nexport function QuizBuilderLivePreview({ data, step, onBackToSettings, selectedQuestionIndex, onPreviewPageChanged, onSubmit, onCheckpoint }: QuizBuilderLivePreviewProps) {\r\n const [viewport, setViewport] = useState<PreviewViewport>(\"desktop\");\r\n const [customWidthPx, setCustomWidthPx] = useState(CUSTOM_WIDTH_DEFAULT);\r\n const hasQuestions = data.quizes.length > 0;\r\n const config = data.config ?? {};\r\n const quizTitle = (config.quizTitle as string) || \"\";\r\n const quizDescription = (config.quizDescription as string) || \"\";\r\n\r\n const widthClass = viewport === \"custom\" ? \"\" : VIEWPORT_WIDTH_CLASS[viewport];\r\n const customStyle = viewport === \"custom\" ? { maxWidth: customWidthPx } : undefined;\r\n\r\n const handleSubmit = (answers: Record<string, string | number>) => {\r\n onSubmit?.(answers);\r\n };\r\n\r\n const handleCheckpoint = (answers: Record<string, string | number>, nextStepIndex: number) => {\r\n onCheckpoint?.(answers, nextStepIndex);\r\n };\r\n\r\n return (\r\n <div className=\"flex h-fit flex-col rounded-xl border border-gray-200/80 bg-white shadow-sm\">\r\n <div className=\"border-b border-gray-100 bg-gradient-to-b from-gray-50 to-white px-5 py-4\">\r\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n {onBackToSettings && (\r\n <button\r\n type=\"button\"\r\n onClick={onBackToSettings}\r\n className=\"inline-flex items-center gap-2 rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50\"\r\n aria-label=\"Back to quiz settings\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden>\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 19l-7-7 7-7\" />\r\n </svg>\r\n Back to quiz settings\r\n </button>\r\n )}\r\n <span className=\"inline-flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-indigo-600\">\r\n <span className=\"h-2 w-2 rounded-full bg-indigo-500\" aria-hidden />\r\n Live preview\r\n {(quizTitle || quizDescription) && (\r\n <span\r\n className=\"inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-indigo-100 text-indigo-600\"\r\n title=\"Quiz title and description are for the builder only — they won't be shown in the actual quiz.\"\r\n aria-label=\"Info: quiz title and description are for the builder only\"\r\n role=\"img\"\r\n >\r\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden>\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n </span>\r\n )}\r\n </span>\r\n </div>\r\n <div\r\n className=\"flex rounded-lg border border-gray-200 bg-white p-0.5 shadow-sm\"\r\n role=\"tablist\"\r\n aria-label=\"Preview screen size\"\r\n >\r\n {VIEWPORT_OPTIONS.map(({ value, label }) => (\r\n <button\r\n key={value}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={viewport === value}\r\n onClick={() => setViewport(value)}\r\n className={`rounded-md px-2.5 py-1.5 text-xs font-medium transition-colors ${viewport === value\r\n ? \"bg-indigo-100 text-indigo-700\"\r\n : \"text-gray-600 hover:bg-gray-100 hover:text-gray-900\"\r\n }`}\r\n >\r\n {label}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n {viewport === \"custom\" && (\r\n <div className=\"mt-3 flex flex-col gap-1.5\">\r\n <label className=\"text-[12px] font-medium text-gray-600\">\r\n Mock width: {customWidthPx}px\r\n </label>\r\n <input\r\n type=\"range\"\r\n min={CUSTOM_WIDTH_MIN}\r\n max={CUSTOM_WIDTH_MAX}\r\n step={8}\r\n value={customWidthPx}\r\n onChange={(e) => setCustomWidthPx(Number(e.target.value))}\r\n className=\"h-2 w-full cursor-pointer appearance-none rounded-lg bg-gray-200 accent-indigo-600\"\r\n aria-label=\"Custom preview width in pixels\"\r\n />\r\n </div>\r\n )}\r\n {quizTitle && (\r\n <h2 className=\"mt-2 text-lg font-semibold text-gray-900\">\r\n {quizTitle}\r\n </h2>\r\n )}\r\n {quizDescription && (\r\n <p className=\"mt-1 text-sm text-gray-500\">\r\n {quizDescription}\r\n </p>\r\n )}\r\n </div>\r\n <div className=\"p-5\">\r\n <div\r\n className={`mx-auto rounded-lg border-2 border-dashed border-gray-300 relative ${widthClass}`.trim()}\r\n style={customStyle}\r\n >\r\n {hasQuestions ? (\r\n <Quiz\r\n key={`preview-${step ?? \"config\"}`}\r\n data={data}\r\n previewStep={selectedQuestionIndex ?? undefined}\r\n onPageChanged={onPreviewPageChanged}\r\n onSubmit={handleSubmit}\r\n onCheckpoint={handleCheckpoint}\r\n />\r\n ) : (\r\n <div className=\"flex flex-col items-center justify-center rounded-lg border-2 border-dashed border-gray-200 bg-gray-50/50 py-16 text-center\">\r\n <div className=\"mb-3 flex h-12 w-12 items-center justify-center rounded-full bg-gray-200 text-gray-400\">\r\n <svg\r\n className=\"h-6 w-6\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"\r\n />\r\n </svg>\r\n </div>\r\n <p className=\"text-sm font-medium text-gray-500\">\r\n Add questions to see preview\r\n </p>\r\n <p className=\"mt-1 text-xs text-gray-400\">\r\n Use the settings panel on the right to add and edit questions\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Color-coded container classes for quiz builder config blocks.\r\n * Use on the root container of QuizBuilderTitleConfig, QuizBuilderDescriptionConfig,\r\n * QuizBuilderSubmitButtonConfig, and QuizBuilderInputConfig so it's easy to see which block is which.\r\n */\r\nexport const BUILDER_CONTAINER_COLORS = {\r\n /** Title block container */\r\n title: \"rounded-lg border-l-4 border-l-amber-400 bg-amber-50/30 p-2.5\",\r\n /** Description/subtitle block container */\r\n description: \"rounded-lg border-l-4 border-l-sky-400 bg-sky-50/30 p-2.5\",\r\n /** Submit button block container (append to existing section class) */\r\n submitButton: \"border-l-4 border-l-indigo-400 bg-indigo-50/30\",\r\n /** Text position (title/subtitle alignment) block container (append to section class) */\r\n textPosition: \"border-l-4 border-l-teal-400 bg-teal-50/30\",\r\n /** Quiz settings: Layout section container */\r\n configLayout:\r\n \"rounded-lg border border-gray-200 border-l-4 border-l-violet-400 bg-violet-50/30 p-3 shadow-sm\",\r\n /** Quiz settings: Header section container */\r\n configHeader:\r\n \"rounded-lg border border-gray-200 border-l-4 border-l-orange-400 bg-orange-50/30 p-3 shadow-sm\",\r\n /** Quiz settings: Quiz section container */\r\n configQuiz:\r\n \"rounded-lg border border-gray-200 border-l-4 border-l-emerald-400 bg-emerald-50/30 p-3 shadow-sm\",\r\n /** Quiz settings: Progress bar section container */\r\n configProgressBar:\r\n \"rounded-lg border border-gray-200 border-l-4 border-l-rose-400 bg-rose-50/30 p-3 shadow-sm\",\r\n /** Options editor container (question options) */\r\n optionsEditor:\r\n \"rounded-lg border-l-4 border-l-fuchsia-400 bg-fuchsia-50/30 p-2.5\",\r\n /** Text/numeric input settings block (append to section class like TitleAndSubtitleSettings) */\r\n inputField: \"border-l-4 border-l-lime-400 bg-lime-50/30\",\r\n /** Basic Information Form settings block */\r\n basicInfo: \"border-l-4 border-l-cyan-400 bg-cyan-50/30\",\r\n} as const;\r\n","import { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\n\r\nexport type LayoutMaxWidth = \"full\" | \"medium\" | \"small\" | \"custom\";\r\n\r\nconst LAYOUT_MAX_WIDTH_OPTIONS: { value: LayoutMaxWidth; label: string }[] = [\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"custom\", label: \"Custom (px)\" },\r\n];\r\n\r\nconst LAYOUT_PX_MIN = 320;\r\nconst LAYOUT_PX_MAX = 1200;\r\n\r\nconst inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst labelClass = \"text-[12px] font-medium text-gray-600\";\r\nconst fieldClass = \"flex flex-col gap-1\";\r\n\r\nexport interface QuizBuilderConfigLayoutSectionProps {\r\n layoutMaxWidth: LayoutMaxWidth;\r\n layoutMaxWidthPx: number;\r\n setConfigField: (key: string, value: unknown) => void;\r\n}\r\n\r\nexport function QuizBuilderConfigLayoutSection({\r\n layoutMaxWidth,\r\n layoutMaxWidthPx,\r\n setConfigField,\r\n}: QuizBuilderConfigLayoutSectionProps) {\r\n return (\r\n <section\r\n className={BUILDER_CONTAINER_COLORS.configLayout}\r\n aria-labelledby=\"layout-section-heading\"\r\n >\r\n <h3\r\n id=\"layout-section-heading\"\r\n className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Layout section\r\n </h3>\r\n <div className=\"flex flex-col gap-2\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Max width</label>\r\n <select\r\n value={layoutMaxWidth}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.layoutMaxWidth, e.target.value as LayoutMaxWidth)\r\n }\r\n className={inputClass}\r\n >\r\n {LAYOUT_MAX_WIDTH_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n {layoutMaxWidth === \"custom\" && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Custom width (px): {layoutMaxWidthPx}</label>\r\n <input\r\n type=\"range\"\r\n min={LAYOUT_PX_MIN}\r\n max={LAYOUT_PX_MAX}\r\n step={8}\r\n value={layoutMaxWidthPx}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.layoutMaxWidthPx, Number(e.target.value))\r\n }\r\n className=\"h-2 w-full cursor-pointer appearance-none rounded-lg bg-gray-200 accent-indigo-600\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n );\r\n}\r\n","import React, { useState, useRef, useEffect } from \"react\";\r\nimport { HexColorPicker, HexColorInput } from \"react-colorful\";\r\nimport { PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\n\r\n/** Normalize to #rrggbb for comparison and display. */\r\nfunction toHex(value: string, fallback: string): string {\r\n const hex = value.trim();\r\n if (/^#[0-9A-Fa-f]{6}$/.test(hex)) return hex;\r\n if (/^[0-9A-Fa-f]{6}$/.test(hex)) return `#${hex}`;\r\n return fallback;\r\n}\r\n\r\nfunction hexEquals(a: string, b: string): boolean {\r\n return toHex(a, a) === toHex(b, b);\r\n}\r\n\r\n/** Default preset options when customColorSelectionOptions is not provided. */\r\nconst DEFAULT_SELECTION_OPTIONS: (string | \"custom\")[] = [\r\n PRESET_HEX.green,\r\n PRESET_HEX.blue,\r\n PRESET_HEX.orange,\r\n \"custom\",\r\n];\r\n\r\nexport type GradientDirection =\r\n | \"to right\"\r\n | \"to bottom\"\r\n | \"to bottom right\"\r\n | \"to bottom left\"\r\n | \"135deg\"\r\n | \"180deg\";\r\n\r\nconst GRADIENT_DIRECTION_OPTIONS: { value: GradientDirection; label: string }[] = [\r\n { value: \"to right\", label: \"→ Right\" },\r\n { value: \"to bottom\", label: \"↓ Bottom\" },\r\n { value: \"to bottom right\", label: \"↘ Bottom right\" },\r\n { value: \"to bottom left\", label: \"↙ Bottom left\" },\r\n { value: \"135deg\", label: \"135°\" },\r\n { value: \"180deg\", label: \"180°\" },\r\n];\r\n\r\nexport type ColorPickerFieldProps = {\r\n /** Current value (hex string). Result of selection is always a string. */\r\n value: string;\r\n onChange: (hex: string) => void;\r\n /** Default hex when value is empty or when opening the custom picker. */\r\n defaultColor: string;\r\n /** Optional label above the field (e.g. \"Background color\", \"Color\"). */\r\n label?: string;\r\n /**\r\n * Preset options: array of hex strings and \"custom\".\r\n * Defaults to [PRESET_HEX.green, PRESET_HEX.blue, PRESET_HEX.orange, \"custom\"].\r\n */\r\n customColorSelectionOptions?: (string | \"custom\")[];\r\n labelClass?: string;\r\n inputClass?: string;\r\n containerClass?: string;\r\n /**\r\n * When true, show Solid | Gradient toggle inside the Color section.\r\n * When gradient is selected, show second color + direction.\r\n */\r\n allowGradient?: boolean;\r\n gradientType?: \"solid\" | \"gradient\";\r\n onGradientTypeChange?: (type: \"solid\" | \"gradient\") => void;\r\n value2?: string;\r\n defaultColor2?: string;\r\n onValue2Change?: (hex: string) => void;\r\n gradientDirection?: GradientDirection;\r\n onGradientDirectionChange?: (direction: GradientDirection) => void;\r\n};\r\n\r\n/**\r\n * Color picker with optional preset chips and optional gradient (Solid | Gradient).\r\n */\r\nexport function ColorPickerField({\r\n value,\r\n onChange,\r\n defaultColor,\r\n label,\r\n customColorSelectionOptions = DEFAULT_SELECTION_OPTIONS,\r\n labelClass = \"text-[12px] font-medium text-gray-600\",\r\n inputClass = \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] font-mono focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\",\r\n containerClass,\r\n allowGradient = false,\r\n gradientType = \"solid\",\r\n onGradientTypeChange,\r\n value2 = \"\",\r\n defaultColor2,\r\n onValue2Change,\r\n gradientDirection = \"to right\",\r\n onGradientDirectionChange,\r\n}: ColorPickerFieldProps) {\r\n const [open, setOpen] = useState(false);\r\n const [open2, setOpen2] = useState(false);\r\n const [customChosen, setCustomChosen] = useState(false);\r\n const [customChosen2, setCustomChosen2] = useState(false);\r\n const displayHex = value ? toHex(value, defaultColor) : defaultColor;\r\n const [internalHex, setInternalHex] = useState(displayHex);\r\n const color2Default = defaultColor2 ?? defaultColor;\r\n const displayHex2 = value2 ? toHex(value2, color2Default) : color2Default;\r\n const [internalHex2, setInternalHex2] = useState(displayHex2);\r\n const popoverRef = useRef<HTMLDivElement>(null);\r\n const popoverRef2 = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n setInternalHex(value ? toHex(value, defaultColor) : defaultColor);\r\n }, [value, defaultColor]);\r\n useEffect(() => {\r\n setInternalHex2(value2 ? toHex(value2, color2Default) : color2Default);\r\n }, [value2, color2Default]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [open]);\r\n useEffect(() => {\r\n if (!open2) return;\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (popoverRef2.current && !popoverRef2.current.contains(e.target as Node)) {\r\n setOpen2(false);\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\r\n }, [open2]);\r\n\r\n const hasPresets = customColorSelectionOptions.length > 0;\r\n const currentHex = value ? toHex(value, defaultColor) : defaultColor;\r\n const selectedPresetIndex = hasPresets\r\n ? customColorSelectionOptions.findIndex(\r\n (opt) => opt !== \"custom\" && hexEquals(opt, currentHex)\r\n )\r\n : -1;\r\n const isCustomSelected =\r\n !hasPresets || customChosen || selectedPresetIndex === -1;\r\n\r\n const currentHex2 = value2 ? toHex(value2, color2Default) : color2Default;\r\n const selectedPresetIndex2 = hasPresets\r\n ? customColorSelectionOptions.findIndex(\r\n (opt) => opt !== \"custom\" && hexEquals(opt, currentHex2)\r\n )\r\n : -1;\r\n const isCustomSelected2 =\r\n !hasPresets || customChosen2 || selectedPresetIndex2 === -1;\r\n\r\n const containerCn =\r\n containerClass ??\r\n \"rounded-lg border border-gray-200 bg-white p-2.5 focus-within:border-indigo-300\";\r\n\r\n const renderColorRow = (\r\n rowValue: string,\r\n rowOnChange: (hex: string) => void,\r\n rowDefault: string,\r\n rowLabel: string,\r\n rowOpen: boolean,\r\n setRowOpen: React.Dispatch<React.SetStateAction<boolean>>,\r\n rowCustomChosen: boolean,\r\n setRowCustomChosen: (v: boolean) => void,\r\n rowInternalHex: string,\r\n setRowInternalHex: (v: string) => void,\r\n rowSelectedPresetIndex: number,\r\n rowIsCustomSelected: boolean,\r\n rowPopoverRef: React.RefObject<HTMLDivElement>\r\n ) => {\r\n const customChipLabel =\r\n rowIsCustomSelected && rowValue\r\n ? toHex(rowValue, rowDefault)\r\n : \"Custom\";\r\n const customSwatchStyle =\r\n rowIsCustomSelected && rowValue\r\n ? { backgroundColor: toHex(rowValue, rowDefault) }\r\n : undefined;\r\n return (\r\n <>\r\n {rowLabel ? (\r\n <span className={`${labelClass} mt-1 block`}>{rowLabel}</span>\r\n ) : null}\r\n {hasPresets && (\r\n <div className=\"relative\" ref={rowPopoverRef}>\r\n <ul className=\"mt-0.5 flex gap-0.5\">\r\n {customColorSelectionOptions.map((opt, i) => {\r\n const isCustom = opt === \"custom\";\r\n const isSelected = isCustom\r\n ? rowIsCustomSelected\r\n : rowSelectedPresetIndex === i;\r\n return (\r\n <li key={isCustom ? \"custom\" : opt}>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n if (isCustom) {\r\n setRowCustomChosen(true);\r\n const hex = rowValue ? toHex(rowValue, rowDefault) : rowDefault;\r\n rowOnChange(hex);\r\n setRowOpen(true);\r\n } else {\r\n setRowCustomChosen(false);\r\n rowOnChange(toHex(opt as string, rowDefault));\r\n }\r\n }}\r\n className={`flex items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors ${isSelected\r\n ? \"bg-indigo-50 text-indigo-800\"\r\n : \"text-gray-600 hover:bg-gray-50\"\r\n }`}\r\n title={isCustom ? customChipLabel : (opt as string)}\r\n >\r\n <span\r\n className={`h-5 w-5 shrink-0 rounded border border-gray-200 ${isCustom && !customSwatchStyle ? \"bg-gray-300\" : \"\"}`}\r\n style={\r\n isCustom ? customSwatchStyle : { backgroundColor: opt as string }\r\n }\r\n />\r\n {isCustom && (\r\n <span className=\"min-w-0 truncate font-mono text-[11px]\">\r\n {customChipLabel}\r\n </span>\r\n )}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n {rowIsCustomSelected && rowOpen && (\r\n <div className=\"absolute left-0 top-full z-50 mt-2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg\">\r\n <HexColorPicker\r\n color={rowInternalHex}\r\n onChange={(hex) => {\r\n setRowInternalHex(hex);\r\n rowOnChange(hex);\r\n }}\r\n style={{ width: 200, height: 150 }}\r\n />\r\n <HexColorInput\r\n color={rowInternalHex}\r\n onChange={(hex) => {\r\n setRowInternalHex(hex);\r\n rowOnChange(hex);\r\n }}\r\n prefixed\r\n className={`mt-2 ${inputClass}`}\r\n aria-label=\"Hex\"\r\n />\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n };\r\n\r\n return (\r\n <div className={containerCn}>\r\n <div className=\"flex flex-col gap-0.5\">\r\n {label && <label className={`${labelClass} mb-0.5 block`}>{label}</label>}\r\n\r\n {/* Solid | Gradient (inside Color section when allowGradient) */}\r\n {allowGradient && onGradientTypeChange && (\r\n <div className=\"mb-1 flex gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => onGradientTypeChange(\"solid\")}\r\n className={`flex-1 rounded-md border-2 px-3 py-1.5 text-xs font-medium transition-colors ${gradientType === \"solid\"\r\n ? \"border-indigo-500 bg-indigo-50 text-indigo-700\"\r\n : \"border-gray-200 bg-white text-gray-600 hover:border-gray-300\"\r\n }`}\r\n >\r\n Solid\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => onGradientTypeChange(\"gradient\")}\r\n className={`flex-1 rounded-md border-2 px-3 py-1.5 text-xs font-medium transition-colors ${gradientType === \"gradient\"\r\n ? \"border-indigo-500 bg-indigo-50 text-indigo-700\"\r\n : \"border-gray-200 bg-white text-gray-600 hover:border-gray-300\"\r\n }`}\r\n >\r\n Gradient\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Color (or Color 1 when gradient) */}\r\n {renderColorRow(\r\n value,\r\n onChange,\r\n defaultColor,\r\n gradientType === \"gradient\" && allowGradient ? \"Color 1\" : \"\",\r\n open,\r\n setOpen,\r\n customChosen,\r\n setCustomChosen,\r\n internalHex,\r\n setInternalHex,\r\n selectedPresetIndex,\r\n isCustomSelected,\r\n popoverRef\r\n )}\r\n\r\n {/* Color 2 + Direction when gradient */}\r\n {allowGradient && gradientType === \"gradient\" && onValue2Change && (\r\n <>\r\n {renderColorRow(\r\n value2,\r\n onValue2Change,\r\n color2Default,\r\n \"Color 2\",\r\n open2,\r\n setOpen2,\r\n customChosen2,\r\n setCustomChosen2,\r\n internalHex2,\r\n setInternalHex2,\r\n selectedPresetIndex2,\r\n isCustomSelected2,\r\n popoverRef2\r\n )}\r\n {onGradientDirectionChange && (\r\n <div className=\"mt-2\">\r\n <span className={`${labelClass} block`}>Direction</span>\r\n <select\r\n value={gradientDirection}\r\n onChange={(e) =>\r\n onGradientDirectionChange(e.target.value as GradientDirection)\r\n }\r\n className={`mt-0.5 w-full ${inputClass}`}\r\n >\r\n {GRADIENT_DIRECTION_OPTIONS.map(({ value: v, label: l }) => (\r\n <option key={v} value={v}>\r\n {l}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { ColorPickerField } from \"@/v1/components/ColorPickerField\";\r\nimport { COLOR_PALETTE_DEFAULTS, PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\n\r\nexport type HeaderStyle = \"default\" | \"logo-bar\";\r\n\r\nconst HEADER_STYLE_OPTIONS: { value: HeaderStyle; label: string }[] = [\r\n { value: \"default\", label: \"Default (centered branding)\" },\r\n { value: \"logo-bar\", label: \"Logo bar (logo left, top banner)\" },\r\n];\r\n\r\nconst inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst labelClass = \"text-[12px] font-medium text-gray-600\";\r\nconst fieldClass = \"flex flex-col gap-1\";\r\n\r\nexport interface QuizBuilderConfigHeaderSectionProps {\r\n headerStyle: HeaderStyle;\r\n companyName: string;\r\n companyLogo: string;\r\n tagline: string;\r\n headerPromoBannerEnabled: boolean;\r\n headerPromoBannerText: string;\r\n headerPromoBannerBgType: \"solid\" | \"gradient\";\r\n headerPromoBannerBgColor: string;\r\n headerPromoBannerBgColor2: string;\r\n headerPromoBannerBgGradientDirection: string;\r\n setConfigField: (key: string, value: unknown) => void;\r\n}\r\n\r\nexport function QuizBuilderConfigHeaderSection({\r\n headerStyle,\r\n companyName,\r\n companyLogo,\r\n tagline,\r\n headerPromoBannerEnabled,\r\n headerPromoBannerText,\r\n headerPromoBannerBgType,\r\n headerPromoBannerBgColor,\r\n headerPromoBannerBgColor2,\r\n headerPromoBannerBgGradientDirection,\r\n setConfigField,\r\n}: QuizBuilderConfigHeaderSectionProps) {\r\n return (\r\n <section\r\n className={BUILDER_CONTAINER_COLORS.configHeader}\r\n aria-labelledby=\"header-section-heading\"\r\n >\r\n <h3\r\n id=\"header-section-heading\"\r\n className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Header section\r\n </h3>\r\n <div className=\"flex flex-col gap-2\">\r\n {/* Header style — same level */}\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Header style</label>\r\n <select\r\n value={headerStyle}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerStyle, e.target.value as HeaderStyle)\r\n }\r\n className={inputClass}\r\n >\r\n {HEADER_STYLE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Promo banner — same level: toggle, when on show text + background color/gradient */}\r\n <div className={fieldClass}>\r\n <div className=\"flex items-center justify-between gap-2\">\r\n <label className={labelClass} htmlFor=\"promo-banner-toggle\">\r\n Promo banner\r\n </label>\r\n <button\r\n id=\"promo-banner-toggle\"\r\n type=\"button\"\r\n role=\"switch\"\r\n aria-checked={headerPromoBannerEnabled}\r\n onClick={() =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerEnabled, !headerPromoBannerEnabled)\r\n }\r\n className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 ${headerPromoBannerEnabled ? \"bg-indigo-600\" : \"bg-gray-200\"\r\n }`}\r\n >\r\n <span\r\n className={`pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition ${headerPromoBannerEnabled ? \"translate-x-5\" : \"translate-x-1\"\r\n }`}\r\n />\r\n </button>\r\n </div>\r\n {headerPromoBannerEnabled && (\r\n <div className=\"mt-2 flex flex-col gap-2 rounded-md border border-gray-100 bg-gray-50/50 p-2\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Banner text</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. 20% off — Limited time\"\r\n value={headerPromoBannerText}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerText, e.target.value)\r\n }\r\n className={inputClass}\r\n />\r\n </div>\r\n <ColorPickerField\r\n label=\"Background\"\r\n value={headerPromoBannerBgColor}\r\n defaultColor={COLOR_PALETTE_DEFAULTS.promoBannerBg}\r\n onChange={(hex) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerBgColor, hex)\r\n }\r\n customColorSelectionOptions={[\r\n PRESET_HEX.green,\r\n PRESET_HEX.blue,\r\n PRESET_HEX.orange,\r\n \"custom\",\r\n ]}\r\n allowGradient\r\n gradientType={headerPromoBannerBgType}\r\n onGradientTypeChange={(type) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerBgType, type)\r\n }\r\n value2={headerPromoBannerBgColor2}\r\n defaultColor2={PRESET_HEX.blue}\r\n onValue2Change={(hex) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerBgColor2, hex)\r\n }\r\n gradientDirection={headerPromoBannerBgGradientDirection as \"to right\" | \"to bottom\" | \"to bottom right\" | \"to bottom left\" | \"135deg\" | \"180deg\"}\r\n onGradientDirectionChange={(dir) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.headerPromoBannerBgGradientDirection, dir)\r\n }\r\n labelClass={labelClass}\r\n inputClass={inputClass}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n\r\n {headerStyle === \"default\" && (\r\n <>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Name (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. Solar Energy Nerds\"\r\n value={companyName}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.companyName, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Logo URL (optional)</label>\r\n <input\r\n type=\"url\"\r\n placeholder=\"https://...\"\r\n value={companyLogo}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.companyLogo, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Tagline (optional)</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. 30 Seconds To Uncover Savings\"\r\n value={tagline}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.tagline, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n </>\r\n )}\r\n\r\n {headerStyle === \"logo-bar\" && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Logo URL (optional)</label>\r\n <input\r\n type=\"url\"\r\n placeholder=\"https://...\"\r\n value={companyLogo}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.companyLogo, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </section>\r\n );\r\n}\r\n","import { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\n\r\nconst inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst labelClass = \"text-[12px] font-medium text-gray-600\";\r\nconst fieldClass = \"flex flex-col gap-1\";\r\n\r\nexport interface QuizBuilderConfigQuizSectionProps {\r\n quizTitle: string;\r\n quizDescription: string;\r\n setConfigField: (key: string, value: unknown) => void;\r\n}\r\n\r\nexport function QuizBuilderConfigQuizSection({\r\n quizTitle,\r\n quizDescription,\r\n setConfigField,\r\n}: QuizBuilderConfigQuizSectionProps) {\r\n return (\r\n <section\r\n className={BUILDER_CONTAINER_COLORS.configQuiz}\r\n aria-labelledby=\"quiz-section-heading\"\r\n >\r\n <h3\r\n id=\"quiz-section-heading\"\r\n className=\"mb-2 flex items-center gap-1.5 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Quiz section\r\n <span\r\n className=\"inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-gray-100 text-gray-500\"\r\n title=\"Quiz title and description are for the builder only — they won't be shown in the actual quiz.\"\r\n aria-label=\"Info: quiz title and description are for the builder only\"\r\n role=\"img\"\r\n >\r\n <svg className=\"h-3 w-3\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden>\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </svg>\r\n </span>\r\n </h3>\r\n <div className=\"flex flex-col gap-2\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Quiz title</label>\r\n <input\r\n type=\"text\"\r\n placeholder=\"e.g. Product configurator\"\r\n value={quizTitle}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.quizTitle, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Description</label>\r\n <textarea\r\n placeholder=\"Optional intro or instructions\"\r\n value={quizDescription}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.quizDescription, e.target.value)}\r\n className={`${inputClass} min-h-[2.25rem] resize-y`}\r\n rows={2}\r\n />\r\n </div>\r\n </div>\r\n </section>\r\n );\r\n}\r\n","import { ColorPickerField } from \"@/v1/components/ColorPickerField\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\nimport { COLOR_PALETTE_DEFAULTS, PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\n\r\nconst labelClass = \"text-[12px] font-medium text-gray-600\";\r\nconst inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst fieldClass = \"flex flex-col gap-1\";\r\n\r\nexport interface QuizBuilderConfigProgressBarSectionProps {\r\n progressBarColorHex: string;\r\n setConfigField: (key: string, value: unknown) => void;\r\n}\r\n\r\nexport function QuizBuilderConfigProgressBarSection({\r\n progressBarColorHex,\r\n setConfigField,\r\n}: QuizBuilderConfigProgressBarSectionProps) {\r\n return (\r\n <section\r\n className={BUILDER_CONTAINER_COLORS.configProgressBar}\r\n aria-labelledby=\"progress-section-heading\"\r\n >\r\n <h3\r\n id=\"progress-section-heading\"\r\n className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Progress bar\r\n </h3>\r\n <div className={fieldClass}>\r\n <ColorPickerField\r\n label=\"Color\"\r\n defaultColor={COLOR_PALETTE_DEFAULTS.progressBar}\r\n customColorSelectionOptions={[\r\n PRESET_HEX.green,\r\n PRESET_HEX.blue,\r\n PRESET_HEX.orange,\r\n \"custom\",\r\n ]}\r\n value={progressBarColorHex}\r\n onChange={(hex) => setConfigField(QUIZ_CONFIG_KEYS.progressBarColor, hex)}\r\n labelClass={labelClass}\r\n inputClass={inputClass}\r\n />\r\n </div>\r\n </section>\r\n );\r\n}\r\n","import type { QuizData } from \"@/v1/types\";\r\nimport { COLOR_PALETTE_DEFAULTS, PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport {\r\n QuizBuilderConfigLayoutSection,\r\n type LayoutMaxWidth,\r\n} from \"@/v1/components/builder/QuizBuilderConfigLayoutSection\";\r\nimport {\r\n QuizBuilderConfigHeaderSection,\r\n type HeaderStyle,\r\n} from \"@/v1/components/builder/QuizBuilderConfigHeaderSection\";\r\nimport { QuizBuilderConfigQuizSection } from \"@/v1/components/builder/QuizBuilderConfigQuizSection\";\r\nimport { QuizBuilderConfigProgressBarSection } from \"@/v1/components/builder/QuizBuilderConfigProgressBarSection\";\r\n\r\nexport type { LayoutMaxWidth, HeaderStyle };\r\n\r\nexport interface QuizBuilderConfigProps {\r\n data: QuizData;\r\n onUpdate: (config: Record<string, unknown>) => void;\r\n}\r\n\r\nconst LAYOUT_PX_DEFAULT = 672;\r\n\r\nexport function QuizBuilderConfig({ data, onUpdate }: QuizBuilderConfigProps) {\r\n const config = data.config ?? {};\r\n const layoutMaxWidth = (config[QUIZ_CONFIG_KEYS.layoutMaxWidth] as LayoutMaxWidth) ?? \"medium\";\r\n const layoutMaxWidthPx = (config[QUIZ_CONFIG_KEYS.layoutMaxWidthPx] as number) ?? LAYOUT_PX_DEFAULT;\r\n const quizTitle = (config[QUIZ_CONFIG_KEYS.quizTitle] as string) ?? \"\";\r\n const quizDescription = (config[QUIZ_CONFIG_KEYS.quizDescription] as string) ?? \"\";\r\n const headerStyle = (config[QUIZ_CONFIG_KEYS.headerStyle] as HeaderStyle) ?? \"default\";\r\n const companyName = (config[QUIZ_CONFIG_KEYS.companyName] as string) ?? \"\";\r\n const companyLogo = (config[QUIZ_CONFIG_KEYS.companyLogo] as string) ?? \"\";\r\n const tagline = (config[QUIZ_CONFIG_KEYS.tagline] as string) ?? \"\";\r\n const headerPromoBannerEnabled = (config[QUIZ_CONFIG_KEYS.headerPromoBannerEnabled] as boolean) ?? false;\r\n const headerPromoBannerText = (config[QUIZ_CONFIG_KEYS.headerPromoBannerText] as string) ?? \"\";\r\n const headerPromoBannerBgType = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgType] as \"solid\" | \"gradient\") ?? \"solid\";\r\n const headerPromoBannerBgColor = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgColor] as string) ?? COLOR_PALETTE_DEFAULTS.promoBannerBg;\r\n const headerPromoBannerBgColor2 = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgColor2] as string) ?? \"\";\r\n const headerPromoBannerBgGradientDirection = (config[QUIZ_CONFIG_KEYS.headerPromoBannerBgGradientDirection] as string) ?? \"to right\";\r\n const rawProgressBarColor = (config[QUIZ_CONFIG_KEYS.progressBarColor] as string) ?? \"\";\r\n const progressBarCustomColor = (config[QUIZ_CONFIG_KEYS.progressBarCustomColor] as string) ?? \"\";\r\n const progressBarColorHex =\r\n rawProgressBarColor in PRESET_HEX\r\n ? PRESET_HEX[rawProgressBarColor as keyof typeof PRESET_HEX]\r\n : (progressBarCustomColor || rawProgressBarColor || COLOR_PALETTE_DEFAULTS.progressBar);\r\n\r\n const setConfigField = (key: string, value: unknown) => {\r\n onUpdate({ ...config, [key]: value });\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-4\">\r\n <header className=\"shrink-0\">\r\n <h2 className=\"text-sm font-semibold text-gray-900\">Quiz settings</h2>\r\n <p className=\"mt-0.5 text-xs text-gray-500\">\r\n Branding, progress bar, and button style.\r\n </p>\r\n </header>\r\n\r\n <QuizBuilderConfigLayoutSection\r\n layoutMaxWidth={layoutMaxWidth}\r\n layoutMaxWidthPx={layoutMaxWidthPx}\r\n setConfigField={setConfigField}\r\n />\r\n <QuizBuilderConfigHeaderSection\r\n headerStyle={headerStyle}\r\n companyName={companyName}\r\n companyLogo={companyLogo}\r\n tagline={tagline}\r\n headerPromoBannerEnabled={headerPromoBannerEnabled}\r\n headerPromoBannerText={headerPromoBannerText}\r\n headerPromoBannerBgType={headerPromoBannerBgType}\r\n headerPromoBannerBgColor={headerPromoBannerBgColor}\r\n headerPromoBannerBgColor2={headerPromoBannerBgColor2}\r\n headerPromoBannerBgGradientDirection={headerPromoBannerBgGradientDirection}\r\n setConfigField={setConfigField}\r\n />\r\n <QuizBuilderConfigQuizSection\r\n quizTitle={quizTitle}\r\n quizDescription={quizDescription}\r\n setConfigField={setConfigField}\r\n />\r\n <QuizBuilderConfigProgressBarSection\r\n progressBarColorHex={progressBarColorHex}\r\n setConfigField={setConfigField}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport interface QuizBuilderTitleConfigProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n label?: string;\r\n placeholder?: string;\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n}\r\n\r\nconst defaultInputClass =\r\n \"w-full rounded-lg border border-gray-200 px-3 py-2 text-[15px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst defaultLabelClass = \"text-[13px] font-medium text-gray-500\";\r\n\r\nexport function QuizBuilderTitleConfig({\r\n value,\r\n onChange,\r\n label = \"Title\",\r\n placeholder = \"Question title\",\r\n className = \"flex flex-col gap-1.5\",\r\n labelClassName = defaultLabelClass,\r\n inputClassName = defaultInputClass,\r\n}: QuizBuilderTitleConfigProps) {\r\n return (\r\n <div className={`${BUILDER_CONTAINER_COLORS.title} ${className}`}>\r\n <label className={labelClassName}>{label}</label>\r\n <input\r\n type=\"text\"\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className={inputClassName}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport interface QuizBuilderDescriptionConfigProps {\r\n value: string;\r\n onChange: (value: string) => void;\r\n label?: string;\r\n placeholder?: string;\r\n className?: string;\r\n labelClassName?: string;\r\n inputClassName?: string;\r\n}\r\n\r\nconst defaultInputClass =\r\n \"w-full rounded-lg border border-gray-200 px-3 py-2 text-[15px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst defaultLabelClass = \"text-[13px] font-medium text-gray-500\";\r\n\r\nexport function QuizBuilderDescriptionConfig({\r\n value,\r\n onChange,\r\n label = \"Subtitle (optional)\",\r\n placeholder = \"Extra hint or description\",\r\n className = \"flex flex-col gap-1.5\",\r\n labelClassName = defaultLabelClass,\r\n inputClassName = defaultInputClass,\r\n}: QuizBuilderDescriptionConfigProps) {\r\n return (\r\n <div className={`${BUILDER_CONTAINER_COLORS.description} ${className}`}>\r\n <label className={labelClassName}>{label}</label>\r\n <input\r\n type=\"text\"\r\n placeholder={placeholder}\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n className={inputClassName}\r\n />\r\n </div>\r\n );\r\n}\r\n","import { useState } from \"react\";\r\nimport type { QuizData, ButtonStyle } from \"@/v1/types\";\r\nimport { COLOR_PALETTE_DEFAULTS, PRESET_HEX } from \"@/v1/utils/colorPalette\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\nimport {\r\n ColorPickerField,\r\n type GradientDirection,\r\n} from \"@/v1/components/ColorPickerField\";\r\n\r\nexport type SubmitButtonPosition = \"left\" | \"right\" | \"center\";\r\nexport type SubmitButtonSize = \"default\" | \"full\" | \"3/4\" | \"1/2\";\r\nexport type SubmitButtonBgType = \"solid\" | \"gradient\";\r\n\r\nconst POSITION_OPTIONS: { value: SubmitButtonPosition; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst SIZE_OPTIONS: { value: SubmitButtonSize; label: string }[] = [\r\n { value: \"default\", label: \"Default\" },\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"3/4\", label: \"3/4 width\" },\r\n { value: \"1/2\", label: \"1/2 width\" },\r\n];\r\n\r\nconst BUTTON_STYLE_OPTIONS: { value: ButtonStyle; label: string }[] = [\r\n { value: \"primary\", label: \"Primary\" },\r\n { value: \"secondary\", label: \"Secondary\" },\r\n { value: \"outline\", label: \"Outline\" },\r\n];\r\n\r\nconst DEFAULT_INNER_TEXT = \"Continue →\";\r\n\r\nexport interface QuizBuilderSubmitButtonConfigProps {\r\n /** Global quiz data (used when scope is global). */\r\n data?: QuizData;\r\n /** Called when global config is updated. */\r\n onUpdate?: (config: Record<string, unknown>) => void;\r\n /** When set, edit per-block overrides; config = baseConfig + overrides, fallback to global. */\r\n baseConfig?: Record<string, unknown>;\r\n /** Per-block overrides (e.g. item.submitButtonConfig). */\r\n overrides?: Record<string, unknown>;\r\n /** Called when block overrides change. */\r\n onOverridesChange?: (overrides: Record<string, unknown>) => void;\r\n}\r\n\r\nexport function QuizBuilderSubmitButtonConfig({\r\n data,\r\n onUpdate,\r\n baseConfig,\r\n overrides = {},\r\n onOverridesChange,\r\n}: QuizBuilderSubmitButtonConfigProps) {\r\n const isBlockMode = baseConfig != null && onOverridesChange != null;\r\n const override = isBlockMode && overrides[QUIZ_CONFIG_KEYS.submitButtonOverride] === true;\r\n const config = isBlockMode\r\n ? { ...baseConfig, ...overrides }\r\n : (data?.config ?? {});\r\n const setConfigField = (key: string, value: unknown) => {\r\n if (isBlockMode) {\r\n const next = { ...overrides, [key]: value };\r\n onOverridesChange(next);\r\n } else {\r\n onUpdate?.({ ...config, [key]: value });\r\n }\r\n };\r\n\r\n const position = (config[QUIZ_CONFIG_KEYS.submitButtonPosition] as SubmitButtonPosition) ?? \"right\";\r\n const size = (config[QUIZ_CONFIG_KEYS.submitButtonSize] as SubmitButtonSize) ?? \"default\";\r\n const innerText = (config[QUIZ_CONFIG_KEYS.submitButtonInnerText] as string) ?? DEFAULT_INNER_TEXT;\r\n const style = (config[QUIZ_CONFIG_KEYS.submitButtonStyle] as ButtonStyle) ?? \"primary\";\r\n const bgType = (config[QUIZ_CONFIG_KEYS.submitButtonBgType] as SubmitButtonBgType) ?? \"solid\";\r\n const bgColor = (config[QUIZ_CONFIG_KEYS.submitButtonBgColor] as string) ?? COLOR_PALETTE_DEFAULTS.submitButtonBg;\r\n const bgColor2 = (config[QUIZ_CONFIG_KEYS.submitButtonBgColor2] as string) ?? \"\";\r\n const gradientDirection =\r\n (config[QUIZ_CONFIG_KEYS.submitButtonBgGradientDirection] as GradientDirection) ?? \"to right\";\r\n const textColor = (config[QUIZ_CONFIG_KEYS.submitButtonTextColor] as string) ?? COLOR_PALETTE_DEFAULTS.submitButtonText;\r\n\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const labelClass = \"text-[12px] font-medium text-gray-600\";\r\n const fieldClass = \"flex flex-col gap-1\";\r\n const sectionClass = `rounded-lg border border-gray-200 bg-white p-3 shadow-sm ${BUILDER_CONTAINER_COLORS.submitButton}`;\r\n\r\n const heading = isBlockMode ? \"Submit button (this question)\" : \"Submit button (global)\";\r\n\r\n const setOverride = (value: boolean) => {\r\n onOverridesChange?.({ ...overrides, [QUIZ_CONFIG_KEYS.submitButtonOverride]: value });\r\n };\r\n\r\n const [isExpanded, setIsExpanded] = useState(true);\r\n\r\n if (isBlockMode) {\r\n return (\r\n <div className={sectionClass}>\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={isExpanded}\r\n aria-controls=\"submit-button-block-content\"\r\n id=\"submit-button-block-heading\"\r\n className=\"flex cursor-pointer list-none items-center justify-between gap-2 py-0.5 text-xs font-medium text-gray-700 [&::-webkit-details-marker]:hidden\"\r\n onClick={() => setIsExpanded((prev) => !prev)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n setIsExpanded((prev) => !prev);\r\n }\r\n }}\r\n >\r\n <div\r\n className=\"flex items-center gap-2\"\r\n onClick={(e) => e.stopPropagation()}\r\n onKeyDown={(e) => e.stopPropagation()}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n checked={override}\r\n onChange={(e) => setOverride(e.target.checked)}\r\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\r\n aria-label=\"Override global submit button settings for this question only\"\r\n />\r\n <span className=\"flex items-center gap-1.5\">\r\n Override Global Submit Button Settings\r\n <span\r\n title=\"for this question only\"\r\n className=\"inline-flex shrink-0 text-gray-400 transition-colors hover:text-gray-600\"\r\n aria-label=\"for this question only\"\r\n >\r\n <svg className=\"h-3.5 w-3.5\" fill=\"currentColor\" viewBox=\"0 0 20 20\" aria-hidden>\r\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </span>\r\n </span>\r\n </div>\r\n <svg\r\n className={`h-4 w-4 shrink-0 transition-transform ${isExpanded ? \"rotate-180\" : \"\"}`}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </div>\r\n {isExpanded && override && (\r\n <div id=\"submit-button-block-content\" className=\"mt-3 flex flex-col gap-3\" aria-labelledby=\"submit-button-block-heading\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Position</label>\r\n <select\r\n value={position}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonPosition, e.target.value as SubmitButtonPosition)\r\n }\r\n className={inputClass}\r\n >\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Size</label>\r\n <select\r\n value={size}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonSize, e.target.value as SubmitButtonSize)\r\n }\r\n className={inputClass}\r\n >\r\n {SIZE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Button text</label>\r\n <input\r\n type=\"text\"\r\n placeholder={DEFAULT_INNER_TEXT}\r\n value={innerText}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonInnerText, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Style</label>\r\n <select\r\n value={style}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonStyle, e.target.value as ButtonStyle)\r\n }\r\n className={inputClass}\r\n >\r\n {BUTTON_STYLE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <ColorPickerField\r\n label=\"Background color\"\r\n value={bgColor}\r\n defaultColor={COLOR_PALETTE_DEFAULTS.submitButtonBg}\r\n onChange={(hex) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgColor, hex)}\r\n inputClass={inputClass}\r\n labelClass={labelClass}\r\n allowGradient\r\n gradientType={bgType}\r\n onGradientTypeChange={(type) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgType, type);\r\n }}\r\n value2={bgColor2}\r\n defaultColor2={COLOR_PALETTE_DEFAULTS.submitButtonText}\r\n onValue2Change={(hex) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgColor2, hex);\r\n }}\r\n gradientDirection={gradientDirection}\r\n onGradientDirectionChange={(dir) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgGradientDirection, dir);\r\n }}\r\n />\r\n\r\n <ColorPickerField\r\n label=\"Text color\"\r\n value={textColor}\r\n customColorSelectionOptions={[PRESET_HEX.white, PRESET_HEX.black, \"custom\"]}\r\n defaultColor={COLOR_PALETTE_DEFAULTS.submitButtonText}\r\n onChange={(hex) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonTextColor, hex)}\r\n inputClass={inputClass}\r\n labelClass={labelClass}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <details\r\n className={`group ${sectionClass}`}\r\n aria-labelledby=\"submit-section-heading\"\r\n open\r\n >\r\n <summary\r\n id=\"submit-section-heading\"\r\n className=\"flex cursor-pointer list-none items-center justify-between gap-2 py-0.5 text-xs font-semibold uppercase tracking-wider text-gray-600 [&::-webkit-details-marker]:hidden\"\r\n >\r\n <span>{heading}</span>\r\n <svg\r\n className=\"h-4 w-4 shrink-0 transition-transform group-open:rotate-180\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </summary>\r\n <div className=\"mt-3 flex flex-col gap-3\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Position</label>\r\n <select\r\n value={position}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonPosition, e.target.value as SubmitButtonPosition)\r\n }\r\n className={inputClass}\r\n >\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Size</label>\r\n <select\r\n value={size}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonSize, e.target.value as SubmitButtonSize)\r\n }\r\n className={inputClass}\r\n >\r\n {SIZE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Button text</label>\r\n <input\r\n type=\"text\"\r\n placeholder={DEFAULT_INNER_TEXT}\r\n value={innerText}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonInnerText, e.target.value)}\r\n className={inputClass}\r\n />\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Style</label>\r\n <select\r\n value={style}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonStyle, e.target.value as ButtonStyle)\r\n }\r\n className={inputClass}\r\n >\r\n {BUTTON_STYLE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <ColorPickerField\r\n label=\"Background color\"\r\n value={bgColor}\r\n defaultColor={COLOR_PALETTE_DEFAULTS.submitButtonBg}\r\n onChange={(hex) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgColor, hex)}\r\n inputClass={inputClass}\r\n labelClass={labelClass}\r\n allowGradient\r\n gradientType={bgType}\r\n onGradientTypeChange={(type) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgType, type);\r\n }}\r\n value2={bgColor2}\r\n defaultColor2={COLOR_PALETTE_DEFAULTS.submitButtonText}\r\n onValue2Change={(hex) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgColor2, hex);\r\n }}\r\n gradientDirection={gradientDirection}\r\n onGradientDirectionChange={(dir) => {\r\n setConfigField(QUIZ_CONFIG_KEYS.submitButtonBgGradientDirection, dir);\r\n }}\r\n />\r\n\r\n <ColorPickerField\r\n label=\"Text color\"\r\n value={textColor}\r\n customColorSelectionOptions={[PRESET_HEX.white, PRESET_HEX.black, \"custom\"]}\r\n defaultColor={COLOR_PALETTE_DEFAULTS.submitButtonText}\r\n onChange={(hex) => setConfigField(QUIZ_CONFIG_KEYS.submitButtonTextColor, hex)}\r\n inputClass={inputClass}\r\n labelClass={labelClass}\r\n />\r\n </div>\r\n </details>\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport type { QuizData } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport type TextPosition = \"left\" | \"center\" | \"right\";\r\nexport type FontSizePreset = \"small\" | \"medium\" | \"large\" | \"custom\";\r\n\r\nconst POSITION_OPTIONS: { value: TextPosition; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst FONT_SIZE_PRESET_OPTIONS: { value: FontSizePreset; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nfunction toNumberOrUndefined(v: unknown): number | undefined {\r\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\r\n if (typeof v === \"string\" && v.trim() !== \"\") {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? n : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction presetToPx(kind: \"title\" | \"subtitle\", preset: FontSizePreset): number | undefined {\r\n if (preset === \"custom\") return undefined;\r\n if (kind === \"title\") {\r\n if (preset === \"small\") return 16;\r\n if (preset === \"medium\") return 18;\r\n return 22; // large\r\n }\r\n // subtitle\r\n if (preset === \"small\") return 13;\r\n if (preset === \"medium\") return 14;\r\n return 16; // large\r\n}\r\n\r\nexport interface TitleAndSubtitleSettingsProps {\r\n data?: QuizData;\r\n onUpdate?: (config: Record<string, unknown>) => void;\r\n}\r\n\r\nexport function TitleAndSubtitleSettings({ data, onUpdate }: TitleAndSubtitleSettingsProps) {\r\n const config = data?.config ?? {};\r\n\r\n const titlePosition = (config[QUIZ_CONFIG_KEYS.titlePosition] as TextPosition) ?? \"center\";\r\n const subtitlePosition = (config[QUIZ_CONFIG_KEYS.subtitlePosition] as TextPosition) ?? \"center\";\r\n\r\n const titleFontSizePreset = (config[QUIZ_CONFIG_KEYS.titleFontSizePreset] as FontSizePreset) ?? \"medium\";\r\n const subtitleFontSizePreset = (config[QUIZ_CONFIG_KEYS.subtitleFontSizePreset] as FontSizePreset) ?? \"medium\";\r\n\r\n const titleFontSizePx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.titleFontSizePx]);\r\n const subtitleFontSizePx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.subtitleFontSizePx]);\r\n\r\n const titleMarginTopPx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.titleMarginTopPx]);\r\n const titleMarginBottomPx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.titleMarginBottomPx]);\r\n const subtitleMarginTopPx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.subtitleMarginTopPx]);\r\n const subtitleMarginBottomPx = toNumberOrUndefined(config[QUIZ_CONFIG_KEYS.subtitleMarginBottomPx]);\r\n\r\n const setConfigField = (key: string, value: unknown) => {\r\n onUpdate?.({ ...config, [key]: value });\r\n };\r\n\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const labelClass = \"text-[12px] font-medium text-gray-600\";\r\n const fieldClass = \"flex flex-col gap-1\";\r\n const sectionClass = `rounded-lg border border-gray-200 bg-white p-3 shadow-sm ${BUILDER_CONTAINER_COLORS.textPosition}`;\r\n\r\n const titlePresetEffectivePx = presetToPx(\"title\", titleFontSizePreset);\r\n const subtitlePresetEffectivePx = presetToPx(\"subtitle\", subtitleFontSizePreset);\r\n\r\n const titlePreviewStyle: CSSProperties = {\r\n fontSize: titleFontSizePreset === \"custom\" ? (titleFontSizePx ?? 18) : titlePresetEffectivePx,\r\n marginTop: titleMarginTopPx ?? 0,\r\n marginBottom: titleMarginBottomPx ?? 4,\r\n };\r\n const subtitlePreviewStyle: CSSProperties = {\r\n fontSize: subtitleFontSizePreset === \"custom\" ? (subtitleFontSizePx ?? 14) : subtitlePresetEffectivePx,\r\n marginTop: subtitleMarginTopPx ?? 0,\r\n marginBottom: subtitleMarginBottomPx ?? 8,\r\n };\r\n\r\n return (\r\n <div className={sectionClass} aria-labelledby=\"title-subtitle-settings-heading\">\r\n <h3\r\n id=\"title-subtitle-settings-heading\"\r\n className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Title & description settings\r\n </h3>\r\n <p className=\"mb-3 text-[11px] text-gray-500\">\r\n Alignment, font size, and spacing for each question block title and description.\r\n </p>\r\n\r\n <div className=\"flex flex-col gap-4\">\r\n <div className=\"rounded-md border border-gray-100 bg-gray-50/40 p-3\">\r\n <div className=\"mb-2 text-[12px] font-semibold text-gray-700\">Title</div>\r\n <div className=\"grid gap-3 sm:grid-cols-2\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Alignment</label>\r\n <select\r\n value={titlePosition}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.titlePosition, e.target.value as TextPosition)}\r\n className={inputClass}\r\n >\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Font size</label>\r\n <select\r\n value={titleFontSizePreset}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.titleFontSizePreset, e.target.value as FontSizePreset)}\r\n className={inputClass}\r\n >\r\n {FONT_SIZE_PRESET_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {titleFontSizePreset === \"custom\" && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Custom size (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={10}\r\n max={80}\r\n value={titleFontSizePx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.titleFontSizePx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"18\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Margin top (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={0}\r\n max={80}\r\n value={titleMarginTopPx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.titleMarginTopPx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"0\"\r\n />\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Margin bottom (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={0}\r\n max={80}\r\n value={titleMarginBottomPx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.titleMarginBottomPx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"4\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rounded-md border border-gray-100 bg-gray-50/40 p-3\">\r\n <div className=\"mb-2 text-[12px] font-semibold text-gray-700\">Description</div>\r\n <div className=\"grid gap-3 sm:grid-cols-2\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Alignment</label>\r\n <select\r\n value={subtitlePosition}\r\n onChange={(e) => setConfigField(QUIZ_CONFIG_KEYS.subtitlePosition, e.target.value as TextPosition)}\r\n className={inputClass}\r\n >\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Font size</label>\r\n <select\r\n value={subtitleFontSizePreset}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.subtitleFontSizePreset, e.target.value as FontSizePreset)\r\n }\r\n className={inputClass}\r\n >\r\n {FONT_SIZE_PRESET_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {subtitleFontSizePreset === \"custom\" && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Custom size (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={10}\r\n max={60}\r\n value={subtitleFontSizePx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.subtitleFontSizePx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"14\"\r\n />\r\n </div>\r\n )}\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Margin top (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={0}\r\n max={80}\r\n value={subtitleMarginTopPx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.subtitleMarginTopPx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"0\"\r\n />\r\n </div>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Margin bottom (px)</label>\r\n <input\r\n type=\"number\"\r\n inputMode=\"numeric\"\r\n min={0}\r\n max={80}\r\n value={subtitleMarginBottomPx ?? \"\"}\r\n onChange={(e) =>\r\n setConfigField(\r\n QUIZ_CONFIG_KEYS.subtitleMarginBottomPx,\r\n e.target.value === \"\" ? undefined : Number(e.target.value)\r\n )\r\n }\r\n className={inputClass}\r\n placeholder=\"8\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","import type { QuizData } from \"@/v1/types\";\r\nimport { TitleAndSubtitleSettings } from \"./TitleAndSubtitleSettings\";\r\n\r\nexport type TextPosition = \"left\" | \"center\" | \"right\";\r\n\r\nexport interface QuizBuilderTextPositionConfigProps {\r\n data?: QuizData;\r\n onUpdate?: (config: Record<string, unknown>) => void;\r\n}\r\n\r\nexport function QuizBuilderTextPositionConfig({\r\n data,\r\n onUpdate,\r\n}: QuizBuilderTextPositionConfigProps) {\r\n return <TitleAndSubtitleSettings data={data} onUpdate={onUpdate} />;\r\n}\r\n","import React, { useState } from \"react\";\r\nimport type { QuizItemText, QuizItemNumeric, TextInputFormat } from \"@/v1/types\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nconst INPUT_FORMAT_OPTIONS: { value: TextInputFormat; label: string }[] = [\r\n { value: \"text\", label: \"Text\" },\r\n { value: \"email\", label: \"Email\" },\r\n { value: \"password\", label: \"Password\" },\r\n { value: \"tel\", label: \"Phone\" },\r\n { value: \"url\", label: \"URL\" },\r\n { value: \"search\", label: \"Search\" },\r\n];\r\n\r\nexport interface QuizBuilderInputConfigProps {\r\n item: QuizItemText | QuizItemNumeric;\r\n onUpdate: (item: QuizItemText | QuizItemNumeric) => void;\r\n}\r\n\r\nexport function QuizBuilderInputConfig({ item, onUpdate }: QuizBuilderInputConfigProps) {\r\n const isNumeric = item.type === \"numeric\";\r\n const params = isNumeric ? item.numericParams ?? {} : item.textParams ?? {};\r\n const inputFormat = !isNumeric ? (item.textParams?.inputFormat ?? \"text\") : undefined;\r\n\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const labelClass = \"text-[12px] font-medium text-gray-600\";\r\n const fieldClass = \"flex flex-col gap-1\";\r\n const sectionClass = `rounded-lg border border-gray-200 bg-white p-3 shadow-sm ${BUILDER_CONTAINER_COLORS.inputField}`;\r\n\r\n const [isExpanded, setIsExpanded] = useState(true);\r\n\r\n const updateParams = (patch: {\r\n placeholder?: string;\r\n defaultValue?: string | number;\r\n inputFormat?: TextInputFormat;\r\n }) => {\r\n if (isNumeric) {\r\n const { inputFormat: _omit, ...rest } = patch;\r\n onUpdate({\r\n ...item,\r\n numericParams: {\r\n ...(item.numericParams ?? {}),\r\n ...rest,\r\n },\r\n } as QuizItemNumeric);\r\n } else {\r\n const next = {\r\n ...item,\r\n textParams: {\r\n ...(item.textParams ?? {}),\r\n placeholder: patch.placeholder !== undefined ? patch.placeholder : item.textParams?.placeholder,\r\n defaultValue: patch.defaultValue !== undefined ? patch.defaultValue : item.textParams?.defaultValue,\r\n inputFormat: patch.inputFormat !== undefined ? patch.inputFormat : item.textParams?.inputFormat,\r\n },\r\n } as QuizItemText;\r\n onUpdate(next);\r\n }\r\n };\r\n\r\n return (\r\n <div className={sectionClass}>\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={isExpanded}\r\n aria-controls=\"input-settings-block-content\"\r\n id=\"input-settings-block-heading\"\r\n className=\"flex cursor-pointer list-none items-center justify-between gap-2 py-0.5 text-xs font-semibold uppercase tracking-wider text-gray-600 [&::-webkit-details-marker]:hidden\"\r\n onClick={() => setIsExpanded((prev) => !prev)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n setIsExpanded((prev) => !prev);\r\n }\r\n }}\r\n >\r\n <span>Input settings</span>\r\n <svg\r\n className={`h-4 w-4 shrink-0 transition-transform ${isExpanded ? \"rotate-180\" : \"\"}`}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </div>\r\n {isExpanded && (\r\n <div\r\n id=\"input-settings-block-content\"\r\n className=\"mt-3 flex flex-col gap-3\"\r\n aria-labelledby=\"input-settings-block-heading\"\r\n >\r\n {!isNumeric && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Format type</label>\r\n <select\r\n value={inputFormat ?? \"text\"}\r\n onChange={(e) =>\r\n updateParams({ inputFormat: e.target.value as TextInputFormat })\r\n }\r\n className={inputClass}\r\n >\r\n {INPUT_FORMAT_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )}\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Placeholder</label>\r\n <input\r\n type=\"text\"\r\n placeholder={isNumeric ? \"e.g. 0\" : \"e.g. Your answer\"}\r\n value={params.placeholder ?? \"\"}\r\n onChange={(e) => updateParams({ placeholder: e.target.value })}\r\n className={inputClass}\r\n />\r\n </div>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Default value</label>\r\n <input\r\n type={isNumeric ? \"number\" : \"text\"}\r\n placeholder={isNumeric ? \"Default number\" : \"Default text\"}\r\n value={params.defaultValue ?? \"\"}\r\n onChange={(e) =>\r\n updateParams({\r\n defaultValue: isNumeric\r\n ? e.target.value === \"\"\r\n ? undefined\r\n : Number(e.target.value)\r\n : e.target.value,\r\n })\r\n }\r\n className={inputClass}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import type { QuizData } from \"@/v1/types\";\r\nimport { QUIZ_CONFIG_KEYS } from \"@/v1/utils/quizConfigKeys\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport type InputSize = \"small\" | \"medium\" | \"full\";\r\n\r\nconst INPUT_SIZE_OPTIONS: { value: InputSize; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"full\", label: \"Full\" },\r\n];\r\n\r\nexport interface InputUISettingsProps {\r\n data?: QuizData;\r\n onUpdate?: (config: Record<string, unknown>) => void;\r\n}\r\n\r\nexport function InputUISettings({ data, onUpdate }: InputUISettingsProps) {\r\n const config = data?.config ?? {};\r\n\r\n const size = (config[QUIZ_CONFIG_KEYS.inputSize] as InputSize) ?? \"medium\";\r\n\r\n const setConfigField = (key: string, value: unknown) => {\r\n onUpdate?.({ ...config, [key]: value });\r\n };\r\n\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const labelClass = \"text-[12px] font-medium text-gray-600\";\r\n const fieldClass = \"flex flex-col gap-1\";\r\n const sectionClass = `rounded-lg border border-gray-200 bg-white p-3 shadow-sm ${BUILDER_CONTAINER_COLORS.inputField}`;\r\n\r\n return (\r\n <div className={sectionClass} aria-labelledby=\"input-ui-settings-heading\">\r\n <h3\r\n id=\"input-ui-settings-heading\"\r\n className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n >\r\n Input UI settings\r\n </h3>\r\n <p className=\"mb-3 text-[11px] text-gray-500\">\r\n Global options for text and number input fields (size). Inputs are always centered.\r\n </p>\r\n\r\n <div className=\"flex flex-col gap-4\">\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Size</label>\r\n <select\r\n value={size}\r\n onChange={(e) =>\r\n setConfigField(QUIZ_CONFIG_KEYS.inputSize, e.target.value as InputSize)\r\n }\r\n className={inputClass}\r\n >\r\n {INPUT_SIZE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n <p className=\"text-[11px] text-gray-500\">\r\n Width of text and number inputs: small, medium, or full.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuestionType } from \"@/v1/types\";\r\n\r\nexport interface QuizBuilderQuestionNavProps {\r\n count: number;\r\n selectedIndex: number | null;\r\n onSelect: (index: number) => void;\r\n onAddQuestion: (type: QuestionType) => void;\r\n}\r\n\r\nconst DEFAULT_ADD_TYPE: QuestionType = \"text\";\r\n\r\nexport function QuizBuilderQuestionNav({\r\n count,\r\n selectedIndex,\r\n onSelect,\r\n onAddQuestion,\r\n}: QuizBuilderQuestionNavProps) {\r\n return (\r\n <nav\r\n className=\"flex w-52 shrink-0 flex-col\"\r\n aria-label=\"Quiz navigation\"\r\n >\r\n <div className=\"flex min-h-0 flex-col rounded-r-lg \">\r\n <div className=\"mb-2 flex items-center justify-between gap-2\">\r\n <span className=\"text-xs font-semibold uppercase tracking-wider text-gray-500\">\r\n Questions\r\n </span>\r\n </div>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {Array.from({ length: count }, (_, i) => (\r\n <button\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n className={`flex h-9 w-9 shrink-0 items-center justify-center rounded-md border-2 text-sm font-medium transition-colors ${selectedIndex === i\r\n ? \"border-indigo-500 bg-indigo-500 text-white\"\r\n : \"border-gray-200 bg-white text-gray-700 hover:border-gray-300 hover:bg-gray-100\"\r\n }`}\r\n title={`Question ${i + 1}`}\r\n aria-label={`Question ${i + 1}`}\r\n aria-current={selectedIndex === i ? \"true\" : undefined}\r\n >\r\n {i + 1}\r\n </button>\r\n ))}\r\n <button\r\n type=\"button\"\r\n onClick={() => onAddQuestion(DEFAULT_ADD_TYPE)}\r\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md border-2 border-dashed border-gray-300 bg-white text-gray-500 transition-colors hover:border-indigo-400 hover:bg-indigo-50 hover:text-indigo-600\"\r\n title=\"Add question\"\r\n aria-label=\"Add question\"\r\n >\r\n <span className=\"text-lg leading-none\">+</span>\r\n </button>\r\n </div>\r\n </div>\r\n </nav>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuizItemSlider } from \"@/v1/types\";\r\n\r\nexport interface SliderParamsEditorProps {\r\n item: QuizItemSlider;\r\n onUpdate: (item: QuizItemSlider) => void;\r\n}\r\n\r\nexport function SliderParamsEditor({ item, onUpdate }: SliderParamsEditorProps) {\r\n const { sliderParams } = item;\r\n\r\n const inputClass =\r\n \"max-w-32 rounded border border-gray-200 px-3 py-2 text-[15px] focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20\";\r\n\r\n return (\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <input\r\n type=\"number\"\r\n placeholder=\"Min\"\r\n value={sliderParams.min}\r\n onChange={(e) =>\r\n onUpdate({\r\n ...item,\r\n sliderParams: {\r\n ...sliderParams,\r\n min: Number(e.target.value),\r\n },\r\n })\r\n }\r\n className={inputClass}\r\n />\r\n <input\r\n type=\"number\"\r\n placeholder=\"Max\"\r\n value={sliderParams.max}\r\n onChange={(e) =>\r\n onUpdate({\r\n ...item,\r\n sliderParams: {\r\n ...sliderParams,\r\n max: Number(e.target.value),\r\n },\r\n })\r\n }\r\n className={inputClass}\r\n />\r\n <select\r\n value={sliderParams.inputType}\r\n onChange={(e) =>\r\n onUpdate({\r\n ...item,\r\n sliderParams: {\r\n ...sliderParams,\r\n inputType: e.target.value as \"int\" | \"float\",\r\n },\r\n })\r\n }\r\n className={inputClass}\r\n >\r\n <option value=\"int\">Integer</option>\r\n <option value=\"float\">Float</option>\r\n </select>\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-2\">\r\n <input\r\n placeholder=\"Prefix (e.g. Rp.)\"\r\n value={sliderParams.prefix ?? \"\"}\r\n onChange={(e) =>\r\n onUpdate({\r\n ...item,\r\n sliderParams: {\r\n ...sliderParams,\r\n prefix: e.target.value,\r\n },\r\n })\r\n }\r\n className={inputClass}\r\n />\r\n <input\r\n placeholder=\"Suffix (e.g. /unit)\"\r\n value={sliderParams.suffix ?? \"\"}\r\n onChange={(e) =>\r\n onUpdate({\r\n ...item,\r\n sliderParams: {\r\n ...sliderParams,\r\n suffix: e.target.value,\r\n },\r\n })\r\n }\r\n className={inputClass}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useRef, useState } from \"react\";\r\nimport type { QuizItemOptions, OptionItem, OptionsImageFit, OptionsLayout } from \"@/v1/types\";\r\nimport { normalizeOptions } from \"@/v1/utils/quizFactory\";\r\nimport { LazyImage } from \"@/v1/components/Image\";\r\nimport { generateId } from \"@/v1/utils/id\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport interface OptionsParamsEditorProps {\r\n item: QuizItemOptions;\r\n onUpdate: (item: QuizItemOptions) => void;\r\n}\r\n\r\nconst inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\nconst labelClass = \"text-[12px] font-medium text-gray-600\";\r\n\r\nconst LAYOUT_OPTIONS: { value: OptionsLayout; label: string }[] = [\r\n { value: \"list\", label: \"List\" },\r\n { value: \"grid\", label: \"Grid\" },\r\n { value: \"masonry\", label: \"Masonry\" },\r\n];\r\n\r\nconst IMAGE_FIT_OPTIONS: { value: OptionsImageFit; label: string }[] = [\r\n { value: \"contain\", label: \"Contain\" },\r\n { value: \"cover\", label: \"Cover\" },\r\n];\r\n\r\nexport function OptionsParamsEditor({\r\n item,\r\n onUpdate,\r\n}: OptionsParamsEditorProps) {\r\n const options: OptionItem[] = normalizeOptions(\r\n item.optionsParams?.options as (string | OptionItem)[] | undefined\r\n );\r\n const layout = (item.optionsParams?.layout as OptionsLayout | undefined) ?? \"grid\";\r\n const imageFit = (item.optionsParams?.imageFit as OptionsImageFit | undefined) ?? \"contain\";\r\n const [imageMenuOpenId, setImageMenuOpenId] = useState<string | null>(null);\r\n const [urlPopupForId, setUrlPopupForId] = useState<string | null>(null);\r\n const [urlDraft, setUrlDraft] = useState(\"\");\r\n const [svgPopupForId, setSvgPopupForId] = useState<string | null>(null);\r\n const [svgDraft, setSvgDraft] = useState(\"\");\r\n const [svgError, setSvgError] = useState<string | null>(null);\r\n const fileInputsRef = useRef<Record<string, HTMLInputElement | null>>({});\r\n\r\n const updateParams = (\r\n nextOptions: OptionItem[],\r\n nextLayout: OptionsLayout = layout,\r\n nextImageFit: OptionsImageFit = imageFit\r\n ) => {\r\n onUpdate({\r\n ...item,\r\n optionsParams: { options: nextOptions, layout: nextLayout, imageFit: nextImageFit },\r\n });\r\n };\r\n\r\n const updateOption = (index: number, patch: Partial<OptionItem>) => {\r\n const next = [...options];\r\n next[index] = { ...next[index], ...patch };\r\n updateParams(next);\r\n };\r\n\r\n const removeOption = (index: number) => {\r\n updateParams(options.filter((_, i) => i !== index));\r\n };\r\n\r\n const moveOption = (index: number, direction: \"up\" | \"down\") => {\r\n const next = [...options];\r\n const target = direction === \"up\" ? index - 1 : index + 1;\r\n if (target < 0 || target >= next.length) return;\r\n [next[index], next[target]] = [next[target], next[index]];\r\n updateParams(next);\r\n };\r\n\r\n const addOption = () => {\r\n updateParams([...options, { id: generateId(), label: `Option ${options.length + 1}` }]);\r\n };\r\n\r\n const findIndexById = (id: string) => options.findIndex((o) => o.id === id);\r\n\r\n const isSafeSvg = (value: string): boolean => {\r\n const v = value.toLowerCase();\r\n if (!v.includes(\"<svg\")) return false;\r\n // Very simple safety guard: block obvious dangerous constructs.\r\n const blockedPatterns = [\r\n \"<script\",\r\n \"javascript:\",\r\n \"onload=\",\r\n \"onerror=\",\r\n \"onclick=\",\r\n \"onmouseover=\",\r\n \"onfocus=\",\r\n \"onmouseenter=\",\r\n \"<foreignobject\",\r\n ];\r\n return !blockedPatterns.some((p) => v.includes(p));\r\n };\r\n\r\n const svgToDataUri = (svg: string): string => {\r\n const trimmed = svg.trim();\r\n const encoded = encodeURIComponent(trimmed)\r\n // Keep it readable for common chars\r\n .replace(/%20/g, \" \")\r\n .replace(/%0A/g, \"\")\r\n .replace(/%09/g, \" \");\r\n return `data:image/svg+xml,${encoded}`;\r\n };\r\n\r\n const onFilePicked = (optionId: string, file: File | null) => {\r\n if (!file) return;\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\r\n if (!result) return;\r\n const index = findIndexById(optionId);\r\n if (index < 0) return;\r\n updateOption(index, { imageUrl: result });\r\n };\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n return (\r\n <div className={`${BUILDER_CONTAINER_COLORS.optionsEditor} flex flex-col gap-3`}>\r\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\r\n <div className=\"flex flex-col gap-1\">\r\n <span className={labelClass}>Options</span>\r\n <p className=\"text-[12px] text-gray-500\">Add label + optional image per option.</p>\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"flex flex-col gap-1\">\r\n <label className={labelClass}>Render as</label>\r\n <select\r\n value={layout}\r\n onChange={(e) => updateParams(options, e.target.value as OptionsLayout, imageFit)}\r\n className={`${inputClass} h-9`}\r\n >\r\n {LAYOUT_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <div className=\"flex flex-col gap-1\">\r\n <label className={labelClass}>Image fit</label>\r\n <select\r\n value={imageFit}\r\n onChange={(e) => updateParams(options, layout, e.target.value as OptionsImageFit)}\r\n className={`${inputClass} h-9`}\r\n >\r\n {IMAGE_FIT_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={addOption}\r\n className=\"inline-flex h-9 items-center gap-1.5 rounded-md bg-indigo-600 px-3 text-[13px] font-medium text-white transition-colors hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden>\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\r\n </svg>\r\n Add\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"rounded-lg border border-gray-200 bg-white\">\r\n <div className=\"grid grid-cols-[3rem_1fr_auto] gap-2 border-b border-gray-100 bg-gray-50 px-3 py-2 text-[12px] font-semibold uppercase tracking-wider text-gray-500\">\r\n <div>Image</div>\r\n <div>Label</div>\r\n <div className=\"text-right\">Actions</div>\r\n </div>\r\n <div className=\"flex flex-col\">\r\n {options.map((opt, index) => (\r\n <div key={opt.id} className=\"border-b border-gray-100 px-3 py-3 last:border-b-0\">\r\n <div className=\"grid grid-cols-[3rem_1fr_auto] items-start gap-2\">\r\n {/* Image picker */}\r\n <div className=\"flex flex-col gap-2\">\r\n <div className=\"flex items-center gap-1.5\">\r\n <input\r\n ref={(el) => {\r\n fileInputsRef.current[opt.id] = el;\r\n }}\r\n type=\"file\"\r\n accept=\"image/*\"\r\n className=\"hidden\"\r\n onChange={(e) => onFilePicked(opt.id, e.target.files?.[0] ?? null)}\r\n />\r\n <div className=\"relative\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setImageMenuOpenId((prev) => (prev === opt.id ? null : opt.id))}\r\n className=\"relative h-8 w-8 overflow-hidden rounded-md border border-gray-200 bg-gray-100 text-left hover:border-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500/30\"\r\n aria-label={opt.imageUrl ? \"Change option image\" : \"Add option image\"}\r\n title={opt.imageUrl ? \"Click to change image\" : \"Click to add image\"}\r\n >\r\n {opt.imageUrl ? (\r\n <LazyImage\r\n src={opt.imageUrl}\r\n alt={opt.label || \"Option image\"}\r\n className={`h-full w-full object-center ${imageFit === \"cover\" ? \"object-cover\" : \"object-contain p-1\"}`}\r\n />\r\n ) : (\r\n <div className=\"flex h-full w-full items-center justify-center text-gray-400\">\r\n <span className=\"text-[10px]\">Add</span>\r\n </div>\r\n )}\r\n <div className=\"absolute inset-0 bg-black/0 transition hover:bg-black/5\" />\r\n </button>\r\n\r\n {imageMenuOpenId === opt.id && (\r\n <div\r\n className=\"absolute left-0 top-full z-20 mt-1 w-44 overflow-hidden rounded-md border border-gray-200 bg-white shadow-lg\"\r\n onClick={(e) => e.stopPropagation()}\r\n role=\"menu\"\r\n >\r\n <button\r\n type=\"button\"\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[13px] text-gray-700 hover:bg-gray-50\"\r\n onClick={() => {\r\n setImageMenuOpenId(null);\r\n fileInputsRef.current[opt.id]?.click();\r\n }}\r\n role=\"menuitem\"\r\n >\r\n Upload image…\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[13px] text-gray-700 hover:bg-gray-50\"\r\n onClick={() => {\r\n setImageMenuOpenId(null);\r\n setUrlDraft(opt.imageUrl ?? \"\");\r\n setUrlPopupForId(opt.id);\r\n }}\r\n role=\"menuitem\"\r\n >\r\n Paste URL…\r\n </button>\r\n <button\r\n type=\"button\"\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[13px] text-gray-700 hover:bg-gray-50\"\r\n onClick={() => {\r\n setImageMenuOpenId(null);\r\n // If existing image is an SVG data URI, we can't easily recover the raw SVG;\r\n // start with empty or previous draft instead.\r\n setSvgError(null);\r\n setSvgDraft(\"\");\r\n setSvgPopupForId(opt.id);\r\n }}\r\n role=\"menuitem\"\r\n >\r\n SVG / XML…\r\n </button>\r\n {opt.imageUrl ? (\r\n <button\r\n type=\"button\"\r\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[13px] text-red-600 hover:bg-red-50\"\r\n onClick={() => {\r\n setImageMenuOpenId(null);\r\n updateOption(index, { imageUrl: undefined });\r\n }}\r\n role=\"menuitem\"\r\n >\r\n Remove image\r\n </button>\r\n ) : null}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Label */}\r\n <div className=\"flex flex-col gap-2\">\r\n <input\r\n type=\"text\"\r\n placeholder=\"Option label\"\r\n value={opt.label}\r\n onChange={(e) => updateOption(index, { label: e.target.value })}\r\n className={inputClass}\r\n />\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex items-center justify-end gap-1\">\r\n <button\r\n type=\"button\"\r\n onClick={() => moveOption(index, \"up\")}\r\n disabled={index === 0}\r\n className=\"rounded p-1.5 text-gray-500 hover:bg-gray-100 hover:text-gray-700 disabled:opacity-40 disabled:hover:bg-transparent\"\r\n aria-label=\"Move up\"\r\n title=\"Move up\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => moveOption(index, \"down\")}\r\n disabled={index === options.length - 1}\r\n className=\"rounded p-1.5 text-gray-500 hover:bg-gray-100 hover:text-gray-700 disabled:opacity-40 disabled:hover:bg-transparent\"\r\n aria-label=\"Move down\"\r\n title=\"Move down\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => removeOption(index)}\r\n className=\"rounded p-1.5 text-gray-500 hover:bg-red-50 hover:text-red-600\"\r\n aria-label=\"Remove option\"\r\n title=\"Remove\"\r\n >\r\n <svg className=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {options.length === 0 && (\r\n <p className=\"rounded-lg border border-dashed border-gray-200 bg-gray-50/50 py-4 text-center text-sm text-gray-500\">\r\n No options yet. Click &quot;Add&quot; to add one.\r\n </p>\r\n )}\r\n\r\n {/* URL input popup (modal) */}\r\n {urlPopupForId ? (\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/30 p-4\"\r\n onMouseDown={() => setUrlPopupForId(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n <div\r\n className=\"w-full max-w-md rounded-xl border border-gray-200 bg-white p-4 shadow-xl\"\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-gray-900\">Paste image URL</h4>\r\n <p className=\"mt-0.5 text-xs text-gray-500\">Used as the option thumbnail.</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => setUrlPopupForId(null)}\r\n className=\"rounded-md p-1.5 text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div className=\"mt-3 flex flex-col gap-2\">\r\n <input\r\n type=\"url\"\r\n placeholder=\"https://example.com/image.jpg\"\r\n value={urlDraft}\r\n onChange={(e) => setUrlDraft(e.target.value)}\r\n className={inputClass}\r\n autoFocus\r\n />\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => setUrlPopupForId(null)}\r\n className=\"rounded-md border border-gray-200 bg-white px-3 py-2 text-[13px] font-medium text-gray-700 hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const idx = findIndexById(urlPopupForId);\r\n if (idx >= 0) {\r\n updateOption(idx, { imageUrl: urlDraft.trim() || undefined });\r\n }\r\n setUrlPopupForId(null);\r\n }}\r\n className=\"rounded-md bg-indigo-600 px-3 py-2 text-[13px] font-medium text-white hover:bg-indigo-700\"\r\n >\r\n Save\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n\r\n {/* SVG/XML input popup (modal) */}\r\n {svgPopupForId ? (\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/30 p-4\"\r\n onMouseDown={() => {\r\n setSvgPopupForId(null);\r\n setSvgError(null);\r\n }}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n >\r\n <div\r\n className=\"w-full max-w-lg rounded-xl border border-gray-200 bg-white p-4 shadow-xl\"\r\n onMouseDown={(e) => e.stopPropagation()}\r\n >\r\n <div className=\"flex items-start justify-between gap-3\">\r\n <div>\r\n <h4 className=\"text-sm font-semibold text-gray-900\">Paste SVG / XML</h4>\r\n <p className=\"mt-0.5 text-xs text-gray-500\">\r\n Only plain SVG markup is allowed. Scripts and event handlers are blocked.\r\n </p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setSvgPopupForId(null);\r\n setSvgError(null);\r\n }}\r\n className=\"rounded-md p-1.5 text-gray-500 hover:bg-gray-100 hover:text-gray-700\"\r\n aria-label=\"Close\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n\r\n <div className=\"mt-3 flex flex-col gap-2\">\r\n <textarea\r\n rows={6}\r\n placeholder=\"<svg …>…</svg>\"\r\n value={svgDraft}\r\n onChange={(e) => {\r\n setSvgDraft(e.target.value);\r\n if (svgError) setSvgError(null);\r\n }}\r\n className={`${inputClass} font-mono text-[12px]`}\r\n />\r\n {svgError && (\r\n <p className=\"text-xs text-red-600\">\r\n {svgError}\r\n </p>\r\n )}\r\n <div className=\"flex justify-end gap-2\">\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setSvgPopupForId(null);\r\n setSvgError(null);\r\n }}\r\n className=\"rounded-md border border-gray-200 bg-white px-3 py-2 text-[13px] font-medium text-gray-700 hover:bg-gray-50\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n const raw = svgDraft.trim();\r\n if (!raw) {\r\n setSvgError(\"SVG cannot be empty.\");\r\n return;\r\n }\r\n if (!isSafeSvg(raw)) {\r\n setSvgError(\"This SVG contains disallowed content. Remove scripts/event handlers and try again.\");\r\n return;\r\n }\r\n const idx = findIndexById(svgPopupForId);\r\n if (idx >= 0) {\r\n const dataUri = svgToDataUri(raw);\r\n updateOption(idx, { imageUrl: dataUri });\r\n }\r\n setSvgPopupForId(null);\r\n setSvgError(null);\r\n setSvgDraft(\"\");\r\n }}\r\n className=\"rounded-md bg-indigo-600 px-3 py-2 text-[13px] font-medium text-white hover:bg-indigo-700\"\r\n >\r\n Save SVG\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport type { QuizItemBasicInfo } from \"@/v1/types\";\r\nimport { BUILDER_CONTAINER_COLORS } from \"@/v1/utils/builderContainerColors\";\r\n\r\nexport interface BasicInfoParamsEditorProps {\r\n item: QuizItemBasicInfo;\r\n onUpdate: (item: QuizItemBasicInfo) => void;\r\n}\r\n\r\nexport function BasicInfoParamsEditor({ item, onUpdate }: BasicInfoParamsEditorProps) {\r\n const params = item.basicInfoParams ?? {};\r\n const withOtp = params.withOtp ?? false;\r\n const privacyPolicyUrl = params.privacyPolicyUrl ?? \"\";\r\n const privacyPolicyLabel = params.privacyPolicyLabel ?? \"I agree to the Privacy Policy\";\r\n\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const labelClass = \"text-[12px] font-medium text-gray-600\";\r\n const fieldClass = \"flex flex-col gap-1\";\r\n const sectionClass = `rounded-lg border border-gray-200 bg-white p-3 shadow-sm ${BUILDER_CONTAINER_COLORS.basicInfo}`;\r\n\r\n const [isExpanded, setIsExpanded] = useState(true);\r\n\r\n const setParam = <K extends keyof typeof params>(key: K, value: (typeof params)[K]) => {\r\n onUpdate({\r\n ...item,\r\n basicInfoParams: {\r\n ...params,\r\n [key]: value,\r\n },\r\n });\r\n };\r\n\r\n return (\r\n <div className={sectionClass}>\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n aria-expanded={isExpanded}\r\n aria-controls=\"basic-info-settings-content\"\r\n className=\"flex cursor-pointer list-none items-center justify-between gap-2 py-0.5 text-xs font-semibold uppercase tracking-wider text-gray-600\"\r\n onClick={() => setIsExpanded((prev) => !prev)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n setIsExpanded((prev) => !prev);\r\n }\r\n }}\r\n >\r\n <span>Basic Information Form settings</span>\r\n <svg\r\n className={`h-4 w-4 shrink-0 transition-transform ${isExpanded ? \"rotate-180\" : \"\"}`}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </div>\r\n {isExpanded && (\r\n <div id=\"basic-info-settings-content\" className=\"mt-3 flex flex-col gap-3\">\r\n <label className=\"inline-flex cursor-pointer items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={withOtp}\r\n onChange={(e) => setParam(\"withOtp\", e.target.checked)}\r\n className=\"h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\r\n />\r\n <span className={labelClass}>With OTP (phone verification)</span>\r\n </label>\r\n <p className=\"text-[11px] text-gray-500\">\r\n When enabled, show &quot;Send Verification Code&quot; and OTP flow for the phone number field.\r\n </p>\r\n\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Privacy policy agreement label</label>\r\n <input\r\n type=\"text\"\r\n value={privacyPolicyLabel}\r\n onChange={(e) => setParam(\"privacyPolicyLabel\", e.target.value)}\r\n className={inputClass}\r\n placeholder=\"I agree to the Privacy Policy\"\r\n />\r\n </div>\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Privacy policy URL (optional)</label>\r\n <input\r\n type=\"url\"\r\n value={privacyPolicyUrl}\r\n onChange={(e) => setParam(\"privacyPolicyUrl\", e.target.value)}\r\n className={inputClass}\r\n placeholder=\"https://...\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuizItem, DesignType, QuestionType } from \"@/v1/types\";\r\nimport {\r\n QuizBuilderTitleConfig,\r\n QuizBuilderDescriptionConfig,\r\n QuizBuilderSubmitButtonConfig,\r\n QuizBuilderInputConfig,\r\n} from \"@/v1/components/builder\";\r\nimport { createEmptyItem } from \"@/v1/utils/quizFactory\";\r\nimport { SliderParamsEditor } from \"./SliderParamsEditor\";\r\nimport { OptionsParamsEditor } from \"./OptionsParamsEditor\";\r\nimport { BasicInfoParamsEditor } from \"./BasicInfoParamsEditor\";\r\n\r\nconst DESIGN_TYPES: { value: DesignType; label: string }[] = [\r\n { value: \"default\", label: \"Default\" },\r\n { value: \"card\", label: \"Card\" },\r\n { value: \"compact\", label: \"Compact\" },\r\n];\r\n\r\nconst QUESTION_TYPE_OPTIONS: { value: QuestionType; label: string }[] = [\r\n { value: \"text\", label: \"Text\" },\r\n { value: \"numeric\", label: \"Number\" },\r\n { value: \"options\", label: \"Options\" },\r\n { value: \"slider\", label: \"Slider\" },\r\n { value: \"basicInfo\", label: \"Basic Information Form\" },\r\n];\r\n\r\nexport interface QuizBuilderQuestionFormProps {\r\n item: QuizItem;\r\n index: number;\r\n /** Global quiz config (from QuizBuilderSubmitButtonConfig) so button style and preview adapt. */\r\n config?: Record<string, unknown>;\r\n onUpdate: (id: string, item: QuizItem) => void;\r\n onDelete?: (index: number) => void;\r\n}\r\n\r\nexport function QuizBuilderQuestionForm({\r\n item,\r\n index,\r\n config: rawConfig,\r\n onUpdate,\r\n onDelete,\r\n}: QuizBuilderQuestionFormProps) {\r\n const baseConfig = rawConfig ?? {};\r\n const fieldClass = \"flex flex-col gap-1.5\";\r\n const labelClass = \"text-[13px] font-medium text-gray-500\";\r\n const inputClass =\r\n \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\";\r\n const required = item.required ?? false;\r\n\r\n const handleTypeChange = (newType: QuestionType) => {\r\n if (newType === item.type) return;\r\n const newItem = createEmptyItem(item.id, newType);\r\n newItem.title = item.title;\r\n newItem.subtitle = item.subtitle;\r\n if (item.submitButtonConfig) newItem.submitButtonConfig = item.submitButtonConfig;\r\n onUpdate(item.id, newItem);\r\n };\r\n\r\n return (\r\n <div className=\"flex flex-col gap-4\">\r\n <div className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-gray-100 bg-gray-50/60 px-3 py-2\">\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"inline-flex h-6 min-w-[1.75rem] items-center justify-center rounded-full bg-indigo-600 px-2 text-[11px] font-semibold uppercase tracking-wider text-white\">\r\n Q{index + 1}\r\n </span>\r\n <div className=\"flex flex-col\">\r\n <span className=\"text-sm font-semibold text-gray-900\">\r\n Question {index + 1}\r\n </span>\r\n <span className=\"text-[11px] font-medium uppercase tracking-wide text-gray-500\">\r\n {QUESTION_TYPE_OPTIONS.find((q) => q.value === item.type)?.label ?? \"Unknown type\"}\r\n </span>\r\n </div>\r\n </div>\r\n <div className=\"flex flex-wrap items-center gap-3\">\r\n <div className=\"flex items-center gap-2 rounded-full border border-gray-200 bg-white px-2 py-1 shadow-sm\">\r\n <span className=\"text-[11px] font-medium text-gray-500\">Type</span>\r\n <select\r\n value={item.type}\r\n onChange={(e) => handleTypeChange(e.target.value as QuestionType)}\r\n className=\"rounded-full border-none bg-transparent px-1.5 py-0.5 text-[12px] font-medium text-gray-800 focus:outline-none focus:ring-0\"\r\n aria-label=\"Question type\"\r\n >\r\n {QUESTION_TYPE_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n <label className=\"inline-flex items-center gap-2 rounded-full border border-gray-200 bg-white px-2 py-1 text-[11px] font-medium text-gray-600 shadow-sm\">\r\n <input\r\n type=\"checkbox\"\r\n className=\"h-3.5 w-3.5 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500\"\r\n checked={required}\r\n onChange={(e) =>\r\n onUpdate(item.id, {\r\n ...item,\r\n required: e.target.checked,\r\n })\r\n }\r\n />\r\n <span>Required</span>\r\n </label>\r\n <button\r\n type=\"button\"\r\n onClick={() => onDelete?.(index)}\r\n disabled={!onDelete}\r\n className=\"inline-flex h-8 items-center gap-1.5 rounded-full border border-transparent px-2.5 text-[11px] font-medium text-red-600 transition-colors hover:border-red-200 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-50\"\r\n aria-label=\"Delete question\"\r\n title=\"Delete question\"\r\n >\r\n <svg className=\"h-3.5 w-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden>\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\" />\r\n </svg>\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n <div className=\"flex flex-col gap-4\">\r\n <QuizBuilderTitleConfig\r\n value={item.title}\r\n onChange={(title) => onUpdate(item.id, { ...item, title })}\r\n className={fieldClass}\r\n />\r\n <QuizBuilderDescriptionConfig\r\n value={item.subtitle ?? \"\"}\r\n onChange={(subtitle) => onUpdate(item.id, { ...item, subtitle })}\r\n className={fieldClass}\r\n />\r\n <QuizBuilderSubmitButtonConfig\r\n baseConfig={baseConfig}\r\n overrides={item.submitButtonConfig}\r\n onOverridesChange={(overrides: Record<string, unknown>) =>\r\n onUpdate(item.id, {\r\n ...item,\r\n submitButtonConfig: Object.keys(overrides).length ? overrides : undefined,\r\n })\r\n }\r\n />\r\n {item.type === \"slider\" && (\r\n <div className={fieldClass}>\r\n <label className={labelClass}>Slider settings</label>\r\n <SliderParamsEditor\r\n item={item}\r\n onUpdate={(updated) => onUpdate(item.id, updated)}\r\n />\r\n </div>\r\n )}\r\n {(item.type === \"text\" || item.type === \"numeric\") && (\r\n <QuizBuilderInputConfig\r\n item={item}\r\n onUpdate={(updated) => onUpdate(item.id, updated as QuizItem)}\r\n />\r\n )}\r\n {item.type === \"options\" && (\r\n <div className={fieldClass}>\r\n <OptionsParamsEditor\r\n item={item}\r\n onUpdate={(updated) => onUpdate(item.id, updated)}\r\n />\r\n </div>\r\n )}\r\n {item.type === \"basicInfo\" && (\r\n <BasicInfoParamsEditor\r\n item={item}\r\n onUpdate={(updated) => onUpdate(item.id, updated as QuizItem)}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuizData } from \"@/v1/types\";\r\n\r\nexport interface QuizBuilderJsonPreviewProps {\r\n data: QuizData;\r\n}\r\n\r\nexport function QuizBuilderJsonPreview({ data }: QuizBuilderJsonPreviewProps) {\r\n return (\r\n <pre className=\"max-h-80 overflow-auto bg-gray-900 p-4 text-xs leading-relaxed text-gray-200\">\r\n {JSON.stringify(data, null, 2)}\r\n </pre>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { ProgressBarColorPreset } from \"@/v1/types\";\r\nimport { ColorPickerField } from \"@/v1/components/ColorPickerField\";\r\n\r\n/** \"colors\" = Green/Blue/Orange/Custom; \"text\" = White/Black/Custom */\r\nexport type PresetSetKind = \"colors\" | \"text\";\r\n\r\nconst PRESETS: Record<\r\n PresetSetKind,\r\n { value: ProgressBarColorPreset; label: string; swatch: string }[]\r\n> = {\r\n colors: [\r\n { value: \"green\", label: \"Green\", swatch: \"bg-green-500\" },\r\n { value: \"blue\", label: \"Blue\", swatch: \"bg-blue-500\" },\r\n { value: \"orange\", label: \"Orange\", swatch: \"bg-orange-500\" },\r\n { value: \"custom\", label: \"Custom\", swatch: \"bg-gray-400\" },\r\n ],\r\n text: [\r\n { value: \"white\", label: \"White\", swatch: \"bg-white border border-gray-300\" },\r\n { value: \"black\", label: \"Black\", swatch: \"bg-black\" },\r\n { value: \"custom\", label: \"Custom\", swatch: \"bg-gray-400\" },\r\n ],\r\n};\r\n\r\nexport interface PresetOrCustomColorFieldProps {\r\n label: string;\r\n defaultCustomColor: string;\r\n presetSet?: PresetSetKind;\r\n preset: ProgressBarColorPreset;\r\n customHex: string;\r\n onPresetChange: (preset: ProgressBarColorPreset) => void;\r\n onCustomChange: (hex: string) => void;\r\n fieldClass?: string;\r\n labelClass?: string;\r\n inputClass?: string;\r\n}\r\n\r\n/** Preset chips + custom color picker when Custom is selected. */\r\nexport function PresetOrCustomColorField({\r\n label,\r\n defaultCustomColor,\r\n presetSet = \"colors\",\r\n preset,\r\n customHex,\r\n onPresetChange,\r\n onCustomChange,\r\n fieldClass = \"flex flex-col gap-1\",\r\n labelClass = \"text-[12px] font-medium text-gray-600\",\r\n inputClass = \"w-full rounded-md border border-gray-200 px-2.5 py-1.5 text-[14px] transition-colors focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20\",\r\n}: PresetOrCustomColorFieldProps) {\r\n const options = PRESETS[presetSet];\r\n\r\n return (\r\n <div className={fieldClass}>\r\n <label className={`${labelClass} mb-0.5 block`}>{label}</label>\r\n <ul className=\"flex flex-col gap-0.5\">\r\n {options.map(({ value, label: optLabel, swatch }) => (\r\n <li key={value}>\r\n <button\r\n type=\"button\"\r\n onClick={() => (value === \"custom\" ? onPresetChange(\"custom\") : onPresetChange(value))}\r\n className={`flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors ${preset === value\r\n ? \"bg-indigo-50 text-indigo-800\"\r\n : \"text-gray-600 hover:bg-gray-50\"\r\n }`}\r\n title={optLabel}\r\n >\r\n <span className={`h-5 w-5 shrink-0 rounded border border-gray-200 ${swatch}`} />\r\n {value === \"custom\" && <span className=\"min-w-0 truncate\">Custom</span>}\r\n </button>\r\n </li>\r\n ))}\r\n </ul>\r\n {preset === \"custom\" && (\r\n <ColorPickerField\r\n label=\"Custom color\"\r\n value={customHex}\r\n defaultColor={defaultCustomColor}\r\n customColorSelectionOptions={[]}\r\n onChange={onCustomChange}\r\n inputClass={inputClass}\r\n labelClass={labelClass}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useCallback, useMemo, useEffect } from \"react\";\r\nimport { Formik, Form, useFormikContext } from \"formik\";\r\nimport { ThemeProvider, useTheme } from \"styled-components\";\r\nimport type { QuizV2Data, ButtonSection, InputSection, Section } from \"./types\";\r\nimport { getSectionsById } from \"./utils/sectionTree\";\r\nimport { SectionTreeRenderer } from \"./quiz/SectionTreeRenderer\";\r\nimport { resolveLayoutForPage } from \"./defaults\";\r\nimport { RedirectionPage } from \"./quiz/RedirectionPage\";\r\nimport { ThankYouPage } from \"./quiz/ThankYouPage\";\r\nimport { loadQuizData } from \"./utils/quizDataLoader\";\r\nimport { theme as defaultTheme } from \"./styles/theme\";\r\nimport { useDefaultFormTracking } from \"./analytics/useDefaultFormTracking\";\r\nimport * as S from \"./QuizV2.styles\";\r\n\r\nexport interface QuizV2Props {\r\n /** Quiz ID to load from storage (takes priority over data) */\r\n id?: string;\r\n /** Quiz data (used if id is not provided) */\r\n data?: QuizV2Data;\r\n onSubmit?: (answers: unknown) => void;\r\n /** Optional controlled current page index */\r\n currentPageIndex?: number;\r\n /** Optional callback when page changes */\r\n onPageChange?: (index: number) => void;\r\n /** Whether to enable default tracking (defaults to true) */\r\n withDefaultTracking?: boolean;\r\n}\r\n\r\n/**\r\n * Internal component that renders the quiz content.\r\n * Separated to ensure all hooks are called in the correct order.\r\n */\r\nfunction QuizV2Content({\r\n data,\r\n onSubmit,\r\n currentPageIndex: controlledPageIndex,\r\n onPageChange,\r\n withDefaultTracking = true\r\n}: Omit<QuizV2Props, 'id'> & { data: QuizV2Data }) {\r\n const [internalPageIndex, setInternalPageIndex] = useState(0);\r\n\r\n // Use controlled page index if provided, otherwise use internal state\r\n const currentPageIndex = controlledPageIndex !== undefined ? controlledPageIndex : internalPageIndex;\r\n const setCurrentPageIndex = (index: number) => {\r\n if (controlledPageIndex !== undefined && onPageChange) {\r\n onPageChange(index);\r\n } else {\r\n setInternalPageIndex(index);\r\n }\r\n };\r\n\r\n const pages = data.pages ?? [];\r\n const sections = data.sections ?? [];\r\n const layouts = data.layouts ?? [];\r\n const config = data.config ?? {};\r\n const layoutMaxWidth = (config.layoutMaxWidth as string) ?? \"medium\";\r\n const quizTitle = (config.quizTitle as string) ?? \"\";\r\n const quizDescription = (config.quizDescription as string) ?? \"\";\r\n\r\n const safePageIndex =\r\n pages.length === 0 ? 0 : Math.min(currentPageIndex, pages.length - 1);\r\n const currentPage = pages[safePageIndex] ?? null;\r\n const resolvedLayout = resolveLayoutForPage(layouts, currentPage);\r\n const headerSectionIds = resolvedLayout?.headerSectionIds ?? [];\r\n const footerSectionIds = resolvedLayout?.footerSectionIds ?? [];\r\n const rootSectionIds = currentPage?.sectionIds ?? [];\r\n const sectionsById = getSectionsById(sections);\r\n\r\n // Generate initial values for all input fields to avoid uncontrolled->controlled warning\r\n const initialValues = useMemo(() => {\r\n const values: Record<string, any> = {};\r\n sections.forEach((section) => {\r\n if (section.type === \"input\") {\r\n const inputSection = section as InputSection;\r\n const fieldName = inputSection.fieldName ?? inputSection.id;\r\n const fieldType = inputSection.fieldType ?? \"text\";\r\n\r\n // Set appropriate default value based on field type\r\n switch (fieldType) {\r\n case \"checkbox\":\r\n values[fieldName] = false;\r\n break;\r\n case \"number\":\r\n case \"slider\":\r\n values[fieldName] = inputSection.sliderMin ?? 0;\r\n break;\r\n case \"select\":\r\n values[fieldName] = \"\";\r\n break;\r\n case \"phone\":\r\n values[fieldName] = \"\";\r\n break;\r\n case \"text\":\r\n default:\r\n values[fieldName] = \"\";\r\n break;\r\n }\r\n }\r\n });\r\n return values;\r\n }, [sections]);\r\n\r\n // Recursively collect all input field names from a list of section IDs\r\n const collectInputFieldNames = useCallback(\r\n (sectionIds: string[]): string[] => {\r\n const fieldNames: string[] = [];\r\n\r\n const traverse = (id: string) => {\r\n const section = sectionsById.get(id);\r\n if (!section) return;\r\n\r\n if (section.type === \"input\") {\r\n const inputSection = section as InputSection;\r\n const fieldName = inputSection.fieldName ?? inputSection.id;\r\n fieldNames.push(fieldName);\r\n } else if (section.type === \"container\") {\r\n const container = section as any;\r\n if (container.children) {\r\n container.children.forEach(traverse);\r\n }\r\n }\r\n };\r\n\r\n sectionIds.forEach(traverse);\r\n return fieldNames;\r\n },\r\n [sectionsById]\r\n );\r\n\r\n interface QuizContentProps {\r\n data: QuizV2Data;\r\n pages: any[];\r\n currentPageIndex: number;\r\n setCurrentPageIndex: (index: number) => void;\r\n safePageIndex: number;\r\n headerSectionIds: string[];\r\n footerSectionIds: string[];\r\n rootSectionIds: string[];\r\n sectionsById: Map<string, Section>;\r\n collectInputFieldNames: (sectionIds: string[]) => string[];\r\n withDefaultTracking: boolean;\r\n onSubmit?: (answers: unknown) => void;\r\n layoutMaxWidth: string;\r\n quizTitle: string;\r\n quizDescription: string;\r\n }\r\n\r\n /**\r\n * Component that has access to Formik context and renders the quiz layout.\r\n * Defined outside to avoid remounting on every parent render.\r\n */\r\n function QuizContent({\r\n data,\r\n pages,\r\n currentPageIndex,\r\n setCurrentPageIndex,\r\n safePageIndex,\r\n headerSectionIds,\r\n footerSectionIds,\r\n rootSectionIds,\r\n sectionsById,\r\n collectInputFieldNames,\r\n withDefaultTracking,\r\n onSubmit,\r\n layoutMaxWidth,\r\n quizTitle,\r\n quizDescription\r\n }: QuizContentProps) {\r\n const { validateForm, setTouched, submitForm, values } = useFormikContext<Record<string, any>>();\r\n\r\n // Enable default form tracking\r\n const { trackEvent, trackFormSubmission } = useDefaultFormTracking();\r\n\r\n // Handle button or select actions\r\n const handleAction = useCallback(\r\n async (action: { type: string; targetPageIndex?: number }) => {\r\n // Track the action\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"action_trigger\",\r\n step: currentPageIndex,\r\n metadata: {\r\n ...values,\r\n action_type: action.type,\r\n target_page_index: action.targetPageIndex,\r\n },\r\n });\r\n }\r\n\r\n switch (action.type) {\r\n case \"goToPage\":\r\n if (action.targetPageIndex != null) {\r\n // Collect all input field names on current page\r\n const allSectionIds = [\r\n ...headerSectionIds,\r\n ...rootSectionIds,\r\n ...footerSectionIds,\r\n ];\r\n const currentPageFieldNames = collectInputFieldNames(allSectionIds);\r\n\r\n // Trigger validation on all fields\r\n const validationErrors = await validateForm();\r\n\r\n // Mark all fields on current page as touched to show errors\r\n const touchedFields: Record<string, boolean> = {};\r\n currentPageFieldNames.forEach(fieldName => {\r\n touchedFields[fieldName] = true;\r\n });\r\n setTouched(touchedFields);\r\n\r\n // Check if any fields on current page have errors\r\n const hasErrors = currentPageFieldNames.some(\r\n fieldName => validationErrors[fieldName]\r\n );\r\n\r\n if (hasErrors) {\r\n // Track validation failure\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"validation_error\",\r\n step: currentPageIndex,\r\n metadata: {\r\n ...values,\r\n errors: validationErrors,\r\n },\r\n });\r\n }\r\n\r\n // Scroll to first error field\r\n setTimeout(() => {\r\n const firstErrorField = document.querySelector('[data-error=\"true\"]');\r\n if (firstErrorField) {\r\n firstErrorField.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n }\r\n }, 100);\r\n return;\r\n }\r\n\r\n // Navigation allowed - proceed to next page\r\n const targetIndex = Math.max(0, Math.min(action.targetPageIndex, pages.length - 1));\r\n\r\n // Track successful navigation\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"step_complete\",\r\n step: currentPageIndex,\r\n metadata: values,\r\n });\r\n }\r\n\r\n setCurrentPageIndex(targetIndex);\r\n\r\n // Track new page view\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"step_view\",\r\n step: targetIndex,\r\n metadata: values,\r\n });\r\n }\r\n }\r\n break;\r\n case \"toThankYouPage\":\r\n // Find thank you page and navigate to it\r\n const thankYouPageIndex = pages.findIndex(p => p.type === \"thankYou\");\r\n\r\n // Track conversion/submission\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"form_submission\",\r\n step: currentPageIndex,\r\n metadata: values,\r\n });\r\n trackFormSubmission(values, data.id);\r\n }\r\n\r\n if (thankYouPageIndex !== -1) {\r\n setCurrentPageIndex(thankYouPageIndex);\r\n await submitForm();\r\n } else {\r\n // Fallback: submit the form if no thank you page exists\r\n await submitForm();\r\n }\r\n break;\r\n case \"toRedirectionPage\":\r\n // Find redirection page and navigate to it\r\n const redirectionPageIndex = pages.findIndex(p => p.type === \"redirection\");\r\n\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"redirection_trigger\",\r\n step: currentPageIndex,\r\n metadata: values,\r\n });\r\n }\r\n\r\n if (redirectionPageIndex !== -1) {\r\n setCurrentPageIndex(redirectionPageIndex);\r\n\r\n if (withDefaultTracking) {\r\n trackEvent({\r\n event_type: \"step_view\",\r\n step: redirectionPageIndex,\r\n metadata: values,\r\n });\r\n }\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n },\r\n [validateForm, setTouched, submitForm, headerSectionIds, rootSectionIds, footerSectionIds, collectInputFieldNames, pages, setCurrentPageIndex, trackEvent, currentPageIndex, values, withDefaultTracking, data.id, trackFormSubmission]\r\n );\r\n\r\n const handleButtonClick = useCallback(\r\n (button: ButtonSection) => {\r\n if (!button.onClick) return;\r\n handleAction(button.onClick);\r\n },\r\n [handleAction]\r\n );\r\n\r\n const handleSelectAction = useCallback(\r\n (action: { type: string; targetPageIndex?: number }) => {\r\n handleAction(action);\r\n },\r\n [handleAction]\r\n );\r\n\r\n // Auto-submit when on thank you page\r\n useEffect(() => {\r\n const currentPage = pages[safePageIndex];\r\n if (currentPage?.type === \"thankYou\" && onSubmit) {\r\n // Submit the form when thank you page loads\r\n submitForm();\r\n }\r\n }, [safePageIndex, pages, onSubmit, submitForm]);\r\n\r\n // Use default text color from theme\r\n const theme = useTheme();\r\n\r\n const currentPage = pages[safePageIndex] ?? null;\r\n\r\n return (\r\n <Form>\r\n <S.QuizContainer $maxWidth={layoutMaxWidth === \"medium\" || !layoutMaxWidth ? \"medium\" : layoutMaxWidth}>\r\n {(quizTitle || quizDescription) && (\r\n <S.Header>\r\n {quizTitle && (\r\n <S.Title>{quizTitle}</S.Title>\r\n )}\r\n {quizDescription && (\r\n <S.Description>{quizDescription}</S.Description>\r\n )}\r\n </S.Header>\r\n )}\r\n\r\n <S.SectionGroup id=\"header-generator\">\r\n {headerSectionIds.map((id) => (\r\n <SectionTreeRenderer\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n onButtonClick={handleButtonClick}\r\n onSelectAction={handleSelectAction}\r\n isBuilderMode={false}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))}\r\n </S.SectionGroup>\r\n\r\n <S.SectionGroup id=\"main-content-generator\">\r\n {/* Redirection Page */}\r\n {currentPage?.type === \"redirection\" && (\r\n <RedirectionPage\r\n redirectUrl={currentPage.redirectUrl || \"https://example.com\"}\r\n countdownSeconds={currentPage.redirectCountdownSeconds}\r\n />\r\n )}\r\n\r\n {/* Thank You Page - show default only if no custom sections */}\r\n {currentPage?.type === \"thankYou\" && rootSectionIds.length === 0 && <ThankYouPage />}\r\n\r\n {/* Regular sections (also shown on special pages if they have sections) */}\r\n {rootSectionIds.length === 0 && currentPage?.type !== \"redirection\" && currentPage?.type !== \"thankYou\" ? (\r\n <S.EmptyState>\r\n This page has no content.\r\n </S.EmptyState>\r\n ) : (\r\n rootSectionIds.map((id) => (\r\n <SectionTreeRenderer\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n onButtonClick={handleButtonClick}\r\n onSelectAction={handleSelectAction}\r\n isBuilderMode={false}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))\r\n )}\r\n </S.SectionGroup>\r\n\r\n <S.SectionGroup id=\"footer-generator\">\r\n {footerSectionIds.map((id) => (\r\n <SectionTreeRenderer\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n onButtonClick={handleButtonClick}\r\n onSelectAction={handleSelectAction}\r\n isBuilderMode={false}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))}\r\n </S.SectionGroup>\r\n </S.QuizContainer>\r\n </Form>\r\n );\r\n }\r\n\r\n if (pages.length === 0) {\r\n return (\r\n <S.EmptyState>No pages yet.</S.EmptyState>\r\n );\r\n }\r\n\r\n return (\r\n <Formik\r\n initialValues={initialValues}\r\n enableReinitialize\r\n onSubmit={(values) => {\r\n if (onSubmit) {\r\n onSubmit(values);\r\n }\r\n }}\r\n >\r\n <QuizContent\r\n data={data}\r\n pages={pages}\r\n currentPageIndex={currentPageIndex}\r\n setCurrentPageIndex={setCurrentPageIndex}\r\n safePageIndex={safePageIndex}\r\n headerSectionIds={headerSectionIds}\r\n footerSectionIds={footerSectionIds}\r\n rootSectionIds={rootSectionIds}\r\n sectionsById={sectionsById}\r\n collectInputFieldNames={collectInputFieldNames}\r\n withDefaultTracking={withDefaultTracking}\r\n onSubmit={onSubmit}\r\n layoutMaxWidth={layoutMaxWidth}\r\n quizTitle={quizTitle}\r\n quizDescription={quizDescription}\r\n />\r\n </Formik>\r\n );\r\n}\r\n\r\n/**\r\n * Quiz V2 – renders by page inside layout-container (header-generator, main-content-generator, footer-generator).\r\n * Layout-level config and page layout (header/footer sections) applied. Main content = current page sections.\r\n * \r\n * Accepts either an `id` to load from storage or `data` directly. If both are provided, `id` takes priority.\r\n */\r\nexport function QuizV2({ id, data: propData, onSubmit, currentPageIndex, onPageChange, withDefaultTracking }: QuizV2Props) {\r\n const [loadedData, setLoadedData] = useState<QuizV2Data | null>(null);\r\n const [loading, setLoading] = useState(!!id);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n\r\n console.log({ id })\r\n\r\n // Load quiz data by ID if provided\r\n useEffect(() => {\r\n if (id) {\r\n setLoading(true);\r\n setError(null);\r\n\r\n loadQuizData(id).then((result) => {\r\n if (result.success && result.data) {\r\n setLoadedData(result.data);\r\n setError(null);\r\n } else {\r\n setError(result.error || \"Failed to load quiz\");\r\n setLoadedData(null);\r\n }\r\n setLoading(false);\r\n });\r\n } else {\r\n // If no ID is provided, use the data prop directly\r\n setLoadedData(null);\r\n setLoading(false);\r\n setError(null);\r\n }\r\n }, [id]);\r\n\r\n // Use loaded data if available (from ID), otherwise use prop data\r\n const data = loadedData || propData;\r\n\r\n // Show loading state\r\n if (loading) {\r\n return (\r\n <ThemeProvider theme={defaultTheme}>\r\n <S.LoadingContainer>\r\n <S.LoadingCard>\r\n <S.SpinnerWrapper>\r\n <S.SpinnerGlow />\r\n <S.Spinner />\r\n </S.SpinnerWrapper>\r\n <S.LoadingText>\r\n <S.LoadingTitle>Loading Quiz<S.LoadingDots /></S.LoadingTitle>\r\n <S.LoadingSubtitle>Please wait while we prepare your quiz</S.LoadingSubtitle>\r\n </S.LoadingText>\r\n </S.LoadingCard>\r\n </S.LoadingContainer>\r\n </ThemeProvider>\r\n );\r\n }\r\n\r\n // Show error state\r\n if (error || !data) {\r\n return (\r\n <ThemeProvider theme={defaultTheme}>\r\n <S.ErrorContainer>\r\n <S.ErrorCard>\r\n <h2 className=\"text-xl font-semibold mb-2\" style={{ marginBottom: 8, fontSize: 18, fontWeight: 700 }}>Error Loading Quiz</h2>\r\n <p>\r\n {error || \"No quiz data provided. Please provide either an 'id' or 'data' prop.\"}\r\n </p>\r\n </S.ErrorCard>\r\n </S.ErrorContainer>\r\n </ThemeProvider>\r\n );\r\n }\r\n\r\n // Render the actual quiz content\r\n return (\r\n <ThemeProvider theme={defaultTheme}>\r\n <QuizV2Content\r\n data={data}\r\n onSubmit={onSubmit}\r\n currentPageIndex={currentPageIndex}\r\n onPageChange={onPageChange}\r\n withDefaultTracking={withDefaultTracking}\r\n />\r\n </ThemeProvider>\r\n );\r\n}\r\n","import type { Section, ContainerSection } from \"../types\";\r\n\r\n/** Map section id -> section for quick lookup. */\r\nexport function getSectionsById(sections: Section[]): Map<string, Section> {\r\n const map = new Map<string, Section>();\r\n for (const s of sections) map.set(s.id, s);\r\n return map;\r\n}\r\n\r\n/** Ids of sections that are not inside any container (top-level roots). Order preserved by first appearance in sections array. */\r\nexport function getRootSectionIds(sections: Section[]): string[] {\r\n const childIds = new Set<string>();\r\n for (const s of sections) {\r\n if (s.type === \"container\" && (s as ContainerSection).children?.length) {\r\n for (const id of (s as ContainerSection).children!) childIds.add(id);\r\n }\r\n }\r\n const roots: string[] = [];\r\n const seen = new Set<string>();\r\n for (const s of sections) {\r\n if (!childIds.has(s.id) && !seen.has(s.id)) {\r\n roots.push(s.id);\r\n seen.add(s.id);\r\n }\r\n }\r\n return roots;\r\n}\r\n\r\n/** Only container sections can have children. */\r\nexport function sectionCanHaveChildren(\r\n section: Section\r\n): section is ContainerSection {\r\n return section.type === \"container\";\r\n}\r\n","import { v4 as uuidv4 } from \"uuid\";\r\n\r\nexport function generateId(): string {\r\n return uuidv4();\r\n}\r\n","import type {\r\n QuizV2Data,\r\n QuizV2Page,\r\n QuizV2Layout,\r\n Spacing,\r\n SectionType,\r\n ContainerLayout,\r\n ContainerSection,\r\n InputSection,\r\n ButtonSection,\r\n TextSection,\r\n ImageSection,\r\n DividerSection,\r\n BasicComponentSection,\r\n} from \"./types\";\r\nimport { generateId } from \"./utils/id\";\r\n\r\n/** Default global config keys and values for V2 quiz. */\r\nexport const DEFAULT_CONFIG = {\r\n layoutMaxWidth: \"medium\" as const,\r\n quizTitle: \"\",\r\n quizDescription: \"\",\r\n} as const;\r\n\r\nexport type DefaultConfigKey = keyof typeof DEFAULT_CONFIG;\r\n\r\n/**\r\n * Default spacing per section type (Tailwind-like in px). Used when creating sections and when\r\n * resolving missing keys. Fallback when type is unknown.\r\n */\r\nexport const DEFAULT_SPACING: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 16,\r\n marginLeft: 0,\r\n paddingTop: 16,\r\n paddingRight: 16,\r\n paddingBottom: 16,\r\n paddingLeft: 16,\r\n};\r\n\r\n/** Container: grouping block – padding for content, margin below. */\r\nexport const DEFAULT_SPACING_CONTAINER: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 16,\r\n paddingRight: 16,\r\n paddingBottom: 16,\r\n paddingLeft: 16,\r\n};\r\n\r\n/** Input: form field – compact padding, margin below. */\r\nexport const DEFAULT_SPACING_INPUT: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n};\r\n\r\n/** Button: CTA – vertical/horizontal padding, margin below. */\r\nexport const DEFAULT_SPACING_BUTTON: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n};\r\n\r\n/** Text: block text – minimal padding, margin below for separation. */\r\nexport const DEFAULT_SPACING_TEXT: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n};\r\n\r\n/** Image: block media – no padding, margin below. */\r\nexport const DEFAULT_SPACING_IMAGE: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n};\r\n\r\n/** Divider: block spacing – minimal padding, margin below for separation. */\r\nexport const DEFAULT_SPACING_DIVIDER: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 16,\r\n marginLeft: 0,\r\n paddingTop: 8,\r\n paddingRight: 16,\r\n paddingBottom: 8,\r\n paddingLeft: 16,\r\n};\r\n\r\n/** Basic component: utility/display block – minimal padding, some margin below. */\r\nexport const DEFAULT_SPACING_BASIC: Spacing = {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 16,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n};\r\n\r\nconst DEFAULT_SPACING_BY_TYPE: Record<SectionType, Spacing> = {\r\n container: DEFAULT_SPACING_CONTAINER,\r\n input: DEFAULT_SPACING_INPUT,\r\n button: DEFAULT_SPACING_BUTTON,\r\n text: DEFAULT_SPACING_TEXT,\r\n image: DEFAULT_SPACING_IMAGE,\r\n divider: DEFAULT_SPACING_DIVIDER,\r\n basic: DEFAULT_SPACING_BASIC,\r\n};\r\n\r\n/** Default spacing for a section type. Use when creating sections or resolving missing keys. */\r\nexport function getDefaultSpacingForType(type: SectionType): Spacing {\r\n return DEFAULT_SPACING_BY_TYPE[type];\r\n}\r\n\r\n/** Default container layout: flex, column, gap-4 (16px). */\r\nexport const DEFAULT_CONTAINER_LAYOUT: ContainerLayout = {\r\n flexDirection: \"column\",\r\n gap: 16,\r\n alignItems: \"stretch\",\r\n justifyContent: \"flex-start\",\r\n flexWrap: \"nowrap\",\r\n};\r\n\r\n/** Resolve container layout: missing keys use DEFAULT_CONTAINER_LAYOUT. */\r\nexport function getContainerLayout(\r\n layout: ContainerLayout | undefined\r\n): Required<ContainerLayout> {\r\n return {\r\n flexDirection:\r\n layout?.flexDirection ?? DEFAULT_CONTAINER_LAYOUT.flexDirection!,\r\n gap: layout?.gap ?? DEFAULT_CONTAINER_LAYOUT.gap!,\r\n alignItems: layout?.alignItems ?? DEFAULT_CONTAINER_LAYOUT.alignItems!,\r\n justifyContent:\r\n layout?.justifyContent ?? DEFAULT_CONTAINER_LAYOUT.justifyContent!,\r\n flexWrap: layout?.flexWrap ?? ((layout as any)?.wrap ? \"wrap\" : DEFAULT_CONTAINER_LAYOUT.flexWrap!),\r\n };\r\n}\r\n\r\n/** Default page layout: empty header and footer. */\r\nexport function getDefaultQuizV2Layout(): QuizV2Layout {\r\n return {\r\n id: generateId(),\r\n headerSectionIds: [],\r\n footerSectionIds: [],\r\n };\r\n}\r\n\r\n/**\r\n * Resolve layout for a page: page.layoutId ?? first layout. Returns layout or null.\r\n */\r\nexport function resolveLayoutForPage(\r\n layouts: QuizV2Layout[] | undefined,\r\n page: QuizV2Page | null\r\n): QuizV2Layout | null {\r\n const list = layouts ?? [];\r\n if (list.length === 0) return null;\r\n if (page?.layoutId) {\r\n const found = list.find((l) => l.id === page.layoutId);\r\n if (found) return found;\r\n }\r\n return list[0] ?? null;\r\n}\r\n\r\n/**\r\n * Creates default quiz data with one page and one of each basic section type.\r\n * Used when user first loads the builder (nothing in storage).\r\n */\r\nexport function getDefaultQuizV2Data(): QuizV2Data {\r\n const sections: QuizV2Data[\"sections\"] = [\r\n {\r\n id: generateId(),\r\n type: \"container\",\r\n children: [],\r\n spacing: { ...DEFAULT_SPACING_CONTAINER },\r\n layout: { ...DEFAULT_CONTAINER_LAYOUT },\r\n } as ContainerSection,\r\n {\r\n id: generateId(),\r\n type: \"input\",\r\n label: \"Your name\",\r\n placeholder: \"Enter your name\",\r\n fieldName: \"name\",\r\n fieldType: \"text\",\r\n width: \"threeQuarter\",\r\n position: \"left\",\r\n selectUIType: \"dropdown\",\r\n cardSize: \"medium\",\r\n spacing: { ...DEFAULT_SPACING_INPUT },\r\n } as InputSection,\r\n {\r\n id: generateId(),\r\n type: \"button\",\r\n label: \"Continue\",\r\n size: \"large\",\r\n width: \"threeQuarter\",\r\n borderRadius: \"medium\",\r\n position: \"center\",\r\n textPosition: \"center\",\r\n buttonColor: \"#4f46e5\",\r\n textColor: \"#ffffff\",\r\n spacing: { ...DEFAULT_SPACING_BUTTON },\r\n } as ButtonSection,\r\n {\r\n id: generateId(),\r\n type: \"text\",\r\n content: \"Welcome! Edit this text in the section config.\",\r\n spacing: { ...DEFAULT_SPACING_TEXT },\r\n } as TextSection,\r\n {\r\n id: generateId(),\r\n type: \"image\",\r\n src: \"https://placehold.co/400x200?text=Image\",\r\n alt: \"Placeholder image\",\r\n spacing: { ...DEFAULT_SPACING_IMAGE },\r\n } as ImageSection,\r\n {\r\n id: generateId(),\r\n type: \"divider\",\r\n color: \"#e5e7eb\",\r\n thickness: 1,\r\n lineStyle: \"solid\",\r\n width: \"full\",\r\n position: \"center\",\r\n spacing: { ...DEFAULT_SPACING_DIVIDER },\r\n } as DividerSection,\r\n ];\r\n\r\n const sectionIds = sections.map((s) => s.id);\r\n const defaultLayout = getDefaultQuizV2Layout();\r\n const layouts: QuizV2Layout[] = [defaultLayout];\r\n\r\n const page1: QuizV2Page = {\r\n id: generateId(),\r\n type: \"regular\",\r\n sectionIds,\r\n layoutId: defaultLayout.id,\r\n };\r\n\r\n const redirectionPage: QuizV2Page = {\r\n id: generateId(),\r\n type: \"redirection\",\r\n sectionIds: [],\r\n layoutId: defaultLayout.id,\r\n redirectUrl: \"https://example.com\",\r\n redirectCountdownSeconds: 5,\r\n };\r\n\r\n const thankYouPage: QuizV2Page = {\r\n id: generateId(),\r\n type: \"thankYou\",\r\n sectionIds: [],\r\n layoutId: defaultLayout.id,\r\n };\r\n\r\n const pages: QuizV2Page[] = [page1, redirectionPage, thankYouPage];\r\n\r\n return {\r\n id: generateId(),\r\n config: { ...DEFAULT_CONFIG },\r\n sections,\r\n layouts,\r\n pages,\r\n };\r\n}\r\n\r\n/** Order for page types: regular first (0), then redirection (1), then thankYou (2). */\r\nfunction getPageTypeOrder(type: QuizV2Page[\"type\"]): number {\r\n switch (type) {\r\n case \"redirection\":\r\n return 1;\r\n case \"thankYou\":\r\n return 2;\r\n case \"regular\":\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a new array with special pages (redirection, thankYou) always last.\r\n * Relative order within each group is preserved.\r\n */\r\nexport function orderPagesWithSpecialLast(pages: QuizV2Page[]): QuizV2Page[] {\r\n return [...pages].sort(\r\n (a, b) => getPageTypeOrder(a.type) - getPageTypeOrder(b.type)\r\n );\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport type { Spacing, SectionType } from \"../types\";\r\nimport { DEFAULT_SPACING, getDefaultSpacingForType } from \"../defaults\";\r\n\r\n/** Resolve spacing to CSS. Missing keys use type-specific default, or generic default if type omitted. */\r\nexport function spacingToStyle(\r\n spacing: Spacing | undefined,\r\n sectionType?: SectionType\r\n): CSSProperties {\r\n const fallback = sectionType\r\n ? getDefaultSpacingForType(sectionType)\r\n : DEFAULT_SPACING;\r\n const s = { ...fallback, ...spacing };\r\n return {\r\n marginTop: s.marginTop,\r\n marginRight: s.marginRight,\r\n marginBottom: s.marginBottom,\r\n marginLeft: s.marginLeft,\r\n paddingTop: s.paddingTop,\r\n paddingRight: s.paddingRight,\r\n paddingBottom: s.paddingBottom,\r\n paddingLeft: s.paddingLeft,\r\n };\r\n}\r\n","import type { CSSProperties } from \"react\";\r\nimport type {\r\n BackgroundStyle,\r\n BorderPreset,\r\n BoxShadowPreset,\r\n BorderRadiusPreset,\r\n} from \"../types\";\r\n\r\n/** Map border presets to CSS border values */\r\nfunction getBorderStyle(preset: BorderPreset, color?: string): string {\r\n const borderColor = color || \"#e5e7eb\"; // gray-200\r\n\r\n switch (preset) {\r\n case \"none\":\r\n return \"none\";\r\n case \"thin\":\r\n return `1px solid ${borderColor}`;\r\n case \"medium\":\r\n return `2px solid ${borderColor}`;\r\n case \"thick\":\r\n return `4px solid ${borderColor}`;\r\n case \"dashed\":\r\n return `2px dashed ${borderColor}`;\r\n case \"dotted\":\r\n return `2px dotted ${borderColor}`;\r\n default:\r\n return \"none\";\r\n }\r\n}\r\n\r\n/** Map border radius presets to CSS border-radius values */\r\nfunction getBorderRadius(\r\n preset: BorderRadiusPreset,\r\n customPx?: number\r\n): string {\r\n switch (preset) {\r\n case \"none\":\r\n return \"0\";\r\n case \"sm\":\r\n return \"0.125rem\"; // 2px\r\n case \"md\":\r\n return \"0.375rem\"; // 6px\r\n case \"lg\":\r\n return \"0.5rem\"; // 8px\r\n case \"xl\":\r\n return \"0.75rem\"; // 12px\r\n case \"full\":\r\n return \"9999px\";\r\n case \"custom\":\r\n return `${customPx ?? 8}px`;\r\n default:\r\n return \"0\";\r\n }\r\n}\r\n\r\n/** Map box shadow presets to CSS box-shadow values */\r\nfunction getBoxShadow(preset: BoxShadowPreset): string {\r\n switch (preset) {\r\n case \"none\":\r\n return \"none\";\r\n case \"sm\":\r\n return \"0 1px 2px 0 rgb(0 0 0 / 0.05)\";\r\n case \"md\":\r\n return \"0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)\";\r\n case \"lg\":\r\n return \"0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)\";\r\n case \"xl\":\r\n return \"0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)\";\r\n case \"inner\":\r\n return \"inset 0 2px 4px 0 rgb(0 0 0 / 0.05)\";\r\n default:\r\n return \"none\";\r\n }\r\n}\r\n\r\n/** Convert BackgroundStyle to CSS properties */\r\nexport function backgroundToStyle(\r\n backgroundStyle: BackgroundStyle | undefined\r\n): CSSProperties {\r\n if (!backgroundStyle) return {};\r\n\r\n const style: CSSProperties = {};\r\n\r\n if (backgroundStyle.backgroundColor) {\r\n style.backgroundColor = backgroundStyle.backgroundColor;\r\n }\r\n\r\n if (backgroundStyle.borderPreset) {\r\n style.border = getBorderStyle(\r\n backgroundStyle.borderPreset,\r\n backgroundStyle.borderColor\r\n );\r\n }\r\n\r\n if (backgroundStyle.borderRadiusPreset) {\r\n style.borderRadius = getBorderRadius(\r\n backgroundStyle.borderRadiusPreset,\r\n backgroundStyle.customBorderRadiusPx\r\n );\r\n }\r\n\r\n if (backgroundStyle.boxShadowPreset) {\r\n style.boxShadow = getBoxShadow(backgroundStyle.boxShadowPreset);\r\n }\r\n\r\n return style;\r\n}\r\n","import styled from 'styled-components';\r\nimport { motion } from 'framer-motion';\r\n\r\nexport const StyledContainer = styled(motion.div) <{\r\n $flexDirection?: string;\r\n $gap?: string | number;\r\n $alignItems?: string;\r\n $justifyContent?: string;\r\n $flexWrap?: string;\r\n $width?: string;\r\n $centerHorizontal?: boolean;\r\n $bgStyle?: any;\r\n}>`\r\n display: flex;\r\n box-sizing: border-box;\r\n flex-direction: ${props => props.$flexDirection || 'column'};\r\n gap: ${props => typeof props.$gap === 'number' ? `${props.$gap}px` : props.$gap || '16px'};\r\n align-items: ${props => props.$alignItems || 'stretch'};\r\n justify-content: ${props => props.$justifyContent || 'flex-start'};\r\n flex-wrap: ${props => props.$flexWrap || 'nowrap'};\r\n width: ${props => props.$width || '100%'};\r\n margin-left: ${props => props.$centerHorizontal ? 'auto' : 'unset'};\r\n margin-right: ${props => props.$centerHorizontal ? 'auto' : 'unset'};\r\n position: relative;\r\n flex-shrink: 0; /* Prevent squashing in flex parents */\r\n min-width: min-content; /* Ensure it stays as wide as its content at minimum */\r\n \r\n /* Background fallback only - style prop handles most of this */\r\n ${props => props.$bgStyle?.backgroundColor && !props.style?.backgroundColor && `background-color: ${props.$bgStyle.backgroundColor};`}\r\n`;\r\n","import React from \"react\";\r\nimport type { ContainerSection as ContainerSectionType } from \"../types\";\r\nimport { getContainerLayout } from \"../defaults\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./ContainerSection.styles\";\r\n\r\nexport interface ContainerSectionProps {\r\n section: ContainerSectionType;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function ContainerSection({ section, children }: ContainerSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const layout = getContainerLayout(section.layout);\r\n\r\n const widthPx = (() => {\r\n switch (section.width) {\r\n case \"quarter\": return \"25%\";\r\n case \"half\": return \"50%\";\r\n case \"threeQuarter\": return \"75%\";\r\n case \"full\": return \"100%\";\r\n case \"auto\": return \"auto\";\r\n case \"custom\": return section.customWidthPx != null ? `${section.customWidthPx}px` : \"100%\";\r\n default: return \"100%\";\r\n }\r\n })();\r\n\r\n const mergedStyle = { ...spacingStyle, ...backgroundStyle };\r\n if (section.centerHorizontal) {\r\n // These are handled by StyledContainer via $centerHorizontal\r\n delete mergedStyle.marginLeft;\r\n delete mergedStyle.marginRight;\r\n }\r\n\r\n return (\r\n <S.StyledContainer\r\n data-section-id={section.id}\r\n data-section-type=\"container\"\r\n style={mergedStyle}\r\n $flexDirection={layout.flexDirection}\r\n $gap={layout.gap}\r\n $alignItems={layout.alignItems}\r\n $justifyContent={layout.justifyContent}\r\n $flexWrap={layout.flexWrap}\r\n $width={widthPx}\r\n $centerHorizontal={section.centerHorizontal}\r\n $bgStyle={section.backgroundStyle}\r\n initial={{ opacity: 0, scale: 0.98 }}\r\n animate={{ opacity: 1, scale: 1 }}\r\n transition={{ duration: 0.3, ease: \"easeOut\" }}\r\n >\r\n {children}\r\n </S.StyledContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { Field, ErrorMessage } from \"formik\";\r\nimport type { InputSection as InputSectionType, ButtonAction } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport PhoneInput from \"react-phone-number-input\";\r\nimport \"react-phone-number-input/style.css\";\r\nimport * as S from \"./InputSection.styles\";\r\nimport { CardSelector } from \"./CardSelector\";\r\n\r\nexport interface InputSectionProps {\r\n section: InputSectionType;\r\n /** Whether this is being rendered in builder mode (no Formik integration). */\r\n isBuilderMode?: boolean;\r\n /** Optional callback when a select option with an action is chosen. */\r\n onSelectAction?: (action: ButtonAction) => void;\r\n}\r\n\r\nexport function InputSection({ section, isBuilderMode = false, onSelectAction }: InputSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n const fieldType = section.fieldType ?? \"text\";\r\n const fieldName = section.fieldName ?? section.id;\r\n\r\n const widthPx = (() => {\r\n switch (section.width) {\r\n case \"quarter\": return \"25%\";\r\n case \"half\": return \"50%\";\r\n case \"threeQuarter\": return \"75%\";\r\n case \"full\": return \"100%\";\r\n case \"custom\": return section.customWidthPx != null ? `${section.customWidthPx}px` : \"75%\";\r\n default: return \"75%\";\r\n }\r\n })();\r\n\r\n const justifyContent = (() => {\r\n switch (section.position ?? \"left\") {\r\n case \"center\": return \"center\";\r\n case \"right\": return \"flex-end\";\r\n case \"left\": return \"flex-start\";\r\n default: return \"flex-start\";\r\n }\r\n })();\r\n\r\n // Validation function based on validationType\r\n const validateField = (value: any) => {\r\n // Required check - for checkboxes, must be true\r\n if (section.required) {\r\n if (fieldType === \"checkbox\" && value !== true) {\r\n return section.validationMessage || \"This field is required\";\r\n }\r\n if (fieldType !== \"checkbox\" && (!value || value === \"\")) {\r\n return section.validationMessage || \"This field is required\";\r\n }\r\n }\r\n\r\n const validationType = section.validationType ?? \"none\";\r\n if (!value || validationType === \"none\") return undefined;\r\n\r\n const errorMessage = section.validationMessage || \"Please enter a valid value\";\r\n\r\n switch (validationType) {\r\n case \"email\":\r\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\r\n return errorMessage || \"Please enter a valid email address\";\r\n }\r\n break;\r\n case \"url\":\r\n try {\r\n new URL(value);\r\n } catch {\r\n return errorMessage || \"Please enter a valid URL\";\r\n }\r\n break;\r\n case \"number\":\r\n if (isNaN(Number(value))) {\r\n return errorMessage || \"Please enter a valid number\";\r\n }\r\n break;\r\n case \"phone\":\r\n if (!/^\\+?[\\d\\s\\-()]+$/.test(value)) {\r\n return errorMessage || \"Please enter a valid phone number\";\r\n }\r\n break;\r\n case \"password\":\r\n if (value.length < 8) {\r\n return errorMessage || \"Password must be at least 8 characters\";\r\n }\r\n break;\r\n case \"zipcode\":\r\n // US zipcode: 5 digits or 5+4 format (12345 or 12345-6789)\r\n if (!/^\\d{5}(-\\d{4})?$/.test(value)) {\r\n return errorMessage || \"Please enter a valid zipcode (12345 or 12345-6789)\";\r\n }\r\n break;\r\n }\r\n return undefined;\r\n };\r\n\r\n if (isBuilderMode) {\r\n return <InputSectionPreview section={section} style={style} width={widthPx} justifyContent={justifyContent} />;\r\n }\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"input\" style={{ ...style, width: '100%', display: \"flex\", justifyContent }}>\r\n <S.FieldWrapper $width={widthPx}>\r\n {section.label && (\r\n <S.Label\r\n $alignment={section.labelAlignment}\r\n $fontSize={section.labelFontSize}\r\n $letterSpacing={section.labelLetterSpacing}\r\n >\r\n {section.label}\r\n {section.required && <S.Required>*</S.Required>}\r\n </S.Label>\r\n )}\r\n\r\n {(fieldType === \"text\" || fieldType === \"number\") && (\r\n <Field\r\n name={fieldName}\r\n validate={validateField}\r\n >\r\n {({ field, meta }: any) => (\r\n <>\r\n <S.Input\r\n {...field}\r\n $alignment={section.inputAlignment}\r\n type={\r\n section.validationType === \"password\"\r\n ? \"password\"\r\n : section.validationType === \"zipcode\"\r\n ? \"text\"\r\n : fieldType\r\n }\r\n placeholder={section.placeholder}\r\n style={meta.touched && meta.error ? { borderColor: '#ef4444' } : {}}\r\n />\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </>\r\n )}\r\n </Field>\r\n )}\r\n\r\n {fieldType === \"phone\" && (\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field, form, meta }: any) => (\r\n <S.PhoneWrapper>\r\n <PhoneInput\r\n value={field.value || \"\"}\r\n onChange={(value) => form.setFieldValue(fieldName, value)}\r\n defaultCountry=\"US\"\r\n international\r\n countryCallingCodeEditable={false}\r\n role={undefined} // Fix TS error if any\r\n style={meta.touched && meta.error ? { borderColor: '#ef4444' } : {}}\r\n />\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </S.PhoneWrapper>\r\n )}\r\n </Field>\r\n )}\r\n\r\n {fieldType === \"select\" && (\r\n <>\r\n {section.selectUIType === \"card\" ? (\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field, form, meta }: any) => (\r\n <>\r\n <CardSelector\r\n section={section}\r\n field={field}\r\n form={form}\r\n onSelectAction={onSelectAction}\r\n />\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </>\r\n )}\r\n </Field>\r\n ) : section.selectUIType === \"multipleChoice\" ? (\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field, form, meta }: any) => (\r\n <S.MultipleChoiceGrid>\r\n {(section.options ?? []).map((option, index) => (\r\n <S.MultipleChoiceLabel\r\n key={index}\r\n $selected={field.value === option.value}\r\n whileHover={{ scale: 1.01, x: 4 }}\r\n whileTap={{ scale: 0.99 }}\r\n onClick={() => {\r\n form.setFieldValue(fieldName, option.value);\r\n if (option.onClick && onSelectAction) {\r\n setTimeout(() => onSelectAction(option.onClick!), 50);\r\n }\r\n }}\r\n >\r\n {option.imageUrl && (\r\n <S.OptionImage\r\n src={option.imageUrl}\r\n alt={option.label}\r\n $objectFit={section.imageObjectFit}\r\n />\r\n )}\r\n <S.OptionText>{option.label}</S.OptionText>\r\n </S.MultipleChoiceLabel>\r\n ))}\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </S.MultipleChoiceGrid>\r\n )}\r\n </Field>\r\n ) : (\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field, form, meta }: any) => (\r\n <>\r\n <S.Select\r\n {...field}\r\n $alignment={section.inputAlignment}\r\n onChange={(e) => {\r\n const selectedValue = e.target.value;\r\n form.setFieldValue(fieldName, selectedValue);\r\n\r\n const selectedOption = (section.options ?? []).find(\r\n opt => opt.value === selectedValue\r\n );\r\n if (selectedOption?.onClick && onSelectAction) {\r\n setTimeout(() => onSelectAction(selectedOption.onClick!), 50);\r\n }\r\n }}\r\n style={meta.touched && meta.error ? { borderColor: '#ef4444' } : {}}\r\n >\r\n <option value=\"\">Select an option</option>\r\n {(section.options ?? []).map((option, index) => (\r\n <option key={index} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </S.Select>\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </>\r\n )}\r\n </Field>\r\n )}\r\n </>\r\n )}\r\n\r\n {fieldType === \"slider\" && (\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field, form, meta }: any) => (\r\n <S.SliderContainer>\r\n <S.SliderInput\r\n type=\"range\"\r\n min={section.sliderMin ?? 0}\r\n max={section.sliderMax ?? 100}\r\n step={section.sliderStep ?? 1}\r\n value={field.value || section.sliderMin || 0}\r\n onChange={(e) => form.setFieldValue(fieldName, e.target.valueAsNumber)}\r\n />\r\n <S.SliderValue>\r\n {field.value || section.sliderMin || 0}\r\n </S.SliderValue>\r\n {meta.touched && meta.error && (\r\n <S.ErrorText data-error=\"true\">{meta.error}</S.ErrorText>\r\n )}\r\n </S.SliderContainer>\r\n )}\r\n </Field>\r\n )}\r\n\r\n {fieldType === \"checkbox\" && (\r\n <div style={{ display: 'flex', flexDirection: 'column' }}>\r\n <S.CheckboxWrapper>\r\n <Field name={fieldName} validate={validateField}>\r\n {({ field }: any) => (\r\n <S.CheckboxInput\r\n type=\"checkbox\"\r\n checked={field.value}\r\n {...field}\r\n id={fieldName}\r\n />\r\n )}\r\n </Field>\r\n <S.CheckboxLabel htmlFor={fieldName}>\r\n {section.checkboxLabel || \"Check this box\"}\r\n </S.CheckboxLabel>\r\n </S.CheckboxWrapper>\r\n <ErrorMessage name={fieldName}>\r\n {msg => <S.ErrorText data-error=\"true\">{msg}</S.ErrorText>}\r\n </ErrorMessage>\r\n </div>\r\n )}\r\n </S.FieldWrapper>\r\n </div >\r\n );\r\n}\r\n\r\n/** Preview version for builder mode (no Formik). */\r\nfunction InputSectionPreview({\r\n section,\r\n style,\r\n width,\r\n justifyContent\r\n}: {\r\n section: InputSectionType;\r\n style: React.CSSProperties;\r\n width: string;\r\n justifyContent: string;\r\n}) {\r\n const fieldType = section.fieldType ?? \"text\";\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"input\" style={{ ...style, width: '100%', display: \"flex\", justifyContent }}>\r\n <S.FieldWrapper $width={width}>\r\n {section.label && (\r\n <S.Label\r\n style={{ pointerEvents: 'none' }}\r\n $alignment={section.labelAlignment}\r\n $fontSize={section.labelFontSize}\r\n $letterSpacing={section.labelLetterSpacing}\r\n >\r\n {section.label}\r\n {section.required && <S.Required>*</S.Required>}\r\n </S.Label>\r\n )}\r\n\r\n {(fieldType === \"text\" || fieldType === \"number\") && (\r\n <S.Input\r\n $alignment={section.inputAlignment}\r\n type={\r\n section.validationType === \"password\"\r\n ? \"password\"\r\n : section.validationType === \"zipcode\"\r\n ? \"text\"\r\n : fieldType\r\n }\r\n placeholder={section.placeholder}\r\n disabled\r\n />\r\n )}\r\n\r\n {fieldType === \"phone\" && (\r\n <S.PhoneWrapper style={{ opacity: 0.6, pointerEvents: 'none' }}>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <div style={{ width: 40, height: 38, border: '1px solid #e5e7eb', borderRadius: 8, background: '#f3f4f6' }}></div>\r\n <S.Input placeholder=\"+1 (555) 000-0000\" disabled />\r\n </div>\r\n </S.PhoneWrapper>\r\n )}\r\n\r\n {fieldType === \"select\" && (\r\n <>\r\n {section.selectUIType === \"card\" ? (\r\n // Card layout preview\r\n <CardSelector\r\n section={section}\r\n field={{ value: null }}\r\n form={{ setFieldValue: () => { } }}\r\n disabled\r\n />\r\n ) : section.selectUIType === \"multipleChoice\" ? (\r\n // Multiple choice preview\r\n <S.MultipleChoiceGrid style={{ pointerEvents: 'none', opacity: 0.7 }}>\r\n {(section.options ?? []).map((option, index) => (\r\n <S.MultipleChoiceLabel key={index}>\r\n {option.imageUrl && (\r\n <S.OptionImage\r\n src={option.imageUrl}\r\n alt={option.label}\r\n $objectFit={section.imageObjectFit}\r\n />\r\n )}\r\n <S.OptionText>{option.label}</S.OptionText>\r\n </S.MultipleChoiceLabel>\r\n ))}\r\n </S.MultipleChoiceGrid>\r\n ) : (\r\n // Standard select preview\r\n <S.Select $alignment={section.inputAlignment} disabled>\r\n <option value=\"\">Select an option</option>\r\n {(section.options ?? []).map((option, index) => (\r\n <option key={index} value={option.value}>\r\n {option.label}\r\n </option>\r\n ))}\r\n </S.Select>\r\n )}\r\n </>\r\n )}\r\n\r\n {fieldType === \"slider\" && (\r\n <S.SliderContainer style={{ pointerEvents: 'none', opacity: 0.7 }}>\r\n <S.SliderInput\r\n type=\"range\"\r\n min={section.sliderMin ?? 0}\r\n max={section.sliderMax ?? 100}\r\n value={section.sliderMin ?? 0}\r\n readOnly\r\n />\r\n <S.SliderValue>\r\n {section.sliderMin ?? 0}\r\n </S.SliderValue>\r\n </S.SliderContainer>\r\n )}\r\n\r\n {fieldType === \"checkbox\" && (\r\n <S.CheckboxWrapper style={{ pointerEvents: 'none', opacity: 0.7 }}>\r\n <S.CheckboxInput\r\n type=\"checkbox\"\r\n disabled\r\n />\r\n <S.CheckboxLabel>\r\n {section.checkboxLabel || \"Check this box\"}\r\n </S.CheckboxLabel>\r\n </S.CheckboxWrapper>\r\n )}\r\n </S.FieldWrapper>\r\n </div>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\nimport { motion } from 'framer-motion';\r\n\r\nexport const SectionContainer = styled.div<{ $justify?: string }>`\r\n display: flex;\r\n justify-content: ${props => props.$justify || 'flex-start'};\r\n width: 100%;\r\n`;\r\n\r\nexport const FieldWrapper = styled.div<{ $width?: string }>`\r\n width: ${props => props.$width || '75%'};\r\n`;\r\n\r\nexport const Label = styled.label<{ $alignment?: string; $fontSize?: number; $letterSpacing?: number }>`\r\n display: block;\r\n margin-bottom: 12px;\r\n font-size: ${props => props.$fontSize ? `${props.$fontSize}px` : '1.25rem'};\r\n letter-spacing: ${props => props.$letterSpacing != null ? `${props.$letterSpacing}em` : '0.1em'};\r\n text-align: ${props => props.$alignment || 'center'};\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n`;\r\n\r\nexport const Required = styled.span`\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n margin-left: 4px;\r\n`;\r\n\r\nexport const Input = styled.input<{ $alignment?: string }>`\r\n width: 100%;\r\n border-radius: 1rem;\r\n border: 2px solid #e2e8f0;\r\n padding: 1rem 1.25rem;\r\n font-size: 1rem;\r\n text-align: ${props => props.$alignment || 'left'};\r\n background-color: #fafbfc;\r\n color: #0f172a;\r\n font-family: inherit;\r\n transition: all 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n transform: translateY(-1px);\r\n background-color: #ffffff;\r\n }\r\n\r\n &::placeholder {\r\n color: #94a3b8;\r\n }\r\n \r\n &:disabled {\r\n opacity: 0.7;\r\n cursor: not-allowed;\r\n background-color: #f1f5f9;\r\n }\r\n`;\r\n\r\nexport const Select = styled.select<{ $alignment?: string }>`\r\n width: 100%;\r\n border-radius: 1rem;\r\n border: 2px solid #e2e8f0;\r\n padding: 1rem 1.25rem;\r\n font-size: 1rem;\r\n text-align: ${props => props.$alignment || 'left'};\r\n background-color: #fafbfc;\r\n color: #0f172a;\r\n transition: all 0.2s;\r\n cursor: pointer;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: #ffffff;\r\n }\r\n \r\n &:disabled {\r\n opacity: 0.7;\r\n cursor: not-allowed;\r\n }\r\n`;\r\n\r\nexport const CardGrid = styled.div`\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\r\n gap: 16px;\r\n \r\n @media (max-width: 640px) {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n`;\r\n\r\nexport const MobileCardScroll = styled.div`\r\n display: flex;\r\n gap: 12px;\r\n overflow-x: auto;\r\n padding-bottom: 8px;\r\n margin: 0 -8px;\r\n padding: 8px;\r\n \r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n -ms-overflow-style: none;\r\n scrollbar-width: none;\r\n`;\r\n\r\nexport const CardOption = styled(motion.label) <{ $selected?: boolean; $width?: string }>`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 0.75rem;\r\n padding: 1.25rem 1rem;\r\n border-radius: 1rem;\r\n border: 2px solid ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') : 'transparent'};\r\n background-color: ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') + '08' : '#fafbfc'};\r\n color: #334155;\r\n font-family: inherit;\r\n font-size: 0.9375rem;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n height: 100%;\r\n ${props => props.$width && `min-width: ${props.$width}; width: ${props.$width};`}\r\n \r\n &:hover {\r\n border-color: ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.border || '#e2e8f0')};\r\n background-color: ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') + '0c' : '#f1f5f9'};\r\n transform: translateY(-2px);\r\n }\r\n \r\n & input {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n opacity: 0;\r\n }\r\n`;\r\n\r\nexport const CardImageWrapper = styled.div`\r\n width: 100%;\r\n max-width: 120px;\r\n aspect-ratio: 1/1;\r\n background-color: transparent;\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 0.75rem;\r\n overflow: hidden;\r\n`;\r\n\r\nexport const CardImage = styled.img<{ $objectFit?: 'cover' | 'contain' }>`\r\n width: 100%;\r\n height: 100%;\r\n object-fit: ${props => props.$objectFit || 'cover'};\r\n display: block;\r\n`;\r\n\r\nexport const CardLabel = styled.div`\r\n text-align: center;\r\n font-size: inherit;\r\n font-weight: inherit;\r\n color: inherit;\r\n`;\r\n\r\nexport const IconCardWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 0.75rem;\r\n`;\r\n\r\nexport const IconBox = styled.div<{ $bgColor?: string }>`\r\n width: 56px;\r\n height: 56px;\r\n background-color: ${props => props.$bgColor || '#eff6ff'};\r\n border-radius: 1rem;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: ${props => props.theme.colors?.primary || '#3b82f6'};\r\n \r\n & svg, & img {\r\n width: 28px;\r\n height: 28px;\r\n object-fit: contain;\r\n }\r\n`;\r\n\r\nexport const IconCardLabel = styled.div`\r\n text-align: center;\r\n font-size: inherit;\r\n font-weight: inherit;\r\n color: inherit;\r\n`;\r\nexport const MultipleChoiceGrid = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n`;\r\n\r\nexport const MultipleChoiceLabel = styled(motion.label) <{ $selected?: boolean }>`\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 2px solid ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.border || '#e5e7eb')};\r\n background-color: ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') + '08' : (props.theme.colors?.surface || '#ffffff')};\r\n padding: 12px 16px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n \r\n &:hover {\r\n border-color: ${props => props.$selected ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.primaryLight || '#818cf8')};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '05'};\r\n transform: scale(1.01);\r\n }\r\n\r\n & input {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n opacity: 0;\r\n }\r\n`;\r\n\r\nexport const OptionImage = styled.img<{ $objectFit?: 'cover' | 'contain' }>`\r\nwidth: 56px;\r\nheight: 56px;\r\nborder - radius: ${props => props.theme.radii?.small || '12px'};\r\nobject - fit: ${props => props.$objectFit || 'cover'};\r\nflex - shrink: 0;\r\nbackground - color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n`;\r\n\r\nexport const OptionText = styled.span`\r\nfont - size: 15px;\r\nfont - weight: 500;\r\ncolor: ${props => props.theme.colors?.text || '#1f2937'};\r\n`;\r\n\r\nexport const ErrorText = styled.div`\r\nmargin - top: 6px;\r\nfont - size: 13px;\r\ncolor: ${props => props.theme.colors?.error || '#ef4444'};\r\nfont - weight: 500;\r\npadding - left: 4px;\r\n`;\r\n\r\nexport const CheckboxWrapper = styled.div`\r\ndisplay: flex;\r\nalign - items: center;\r\ngap: 8px;\r\n`;\r\n\r\nexport const CheckboxInput = styled.input`\r\nwidth: 20px;\r\nheight: 20px;\r\nborder - radius: 6px;\r\nborder: 2px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\ncursor: pointer;\r\naccent - color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n \r\n &:focus {\r\n outline: none;\r\n box - shadow: 0 0 0 3px ${props => (props.theme.colors?.primary || '#6366f1') + '30'};\r\n}\r\n`;\r\n\r\nexport const CheckboxLabel = styled.label`\r\nfont - size: 14px;\r\ncolor: ${props => props.theme.colors?.text || '#1f2937'};\r\ncursor: pointer;\r\n`;\r\n\r\nexport const SliderContainer = styled.div`\r\ndisplay: flex;\r\nflex - direction: column;\r\ngap: 8px;\r\n`;\r\n\r\nexport const SliderInput = styled.input`\r\nwidth: 100 %;\r\nheight: 6px;\r\nbackground: ${props => props.theme.colors?.border || '#e5e7eb'};\r\nborder - radius: 99px;\r\noutline: none;\r\n-webkit - appearance: none;\r\n \r\n &:: -webkit - slider - thumb {\r\n -webkit - appearance: none;\r\n width: 20px;\r\n height: 20px;\r\n border - radius: 50 %;\r\n background: ${props => props.theme.colors?.primary || '#6366f1'};\r\n cursor: pointer;\r\n box - shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\r\n transition: transform 0.1s;\r\n}\r\n \r\n &:: -webkit - slider - thumb:hover {\r\n transform: scale(1.1);\r\n}\r\n`;\r\n\r\nexport const SliderValue = styled.div`\r\ntext - align: center;\r\nfont - size: 14px;\r\nfont - weight: 600;\r\ncolor: ${props => props.theme.colors?.primary || '#6366f1'};\r\n`;\r\n\r\nexport const PhoneWrapper = styled.div`\r\n .PhoneInput {\r\n display: flex;\r\n align - items: center;\r\n gap: 8px;\r\n}\r\n \r\n .PhoneInputCountry {\r\n margin - right: 0;\r\n}\r\n \r\n .PhoneInputCountryIcon {\r\n width: 24px;\r\n height: 18px;\r\n border - radius: 2px;\r\n box - shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);\r\n}\r\n \r\n .PhoneInputCountrySelect {\r\n background - color: transparent;\r\n border: none;\r\n cursor: pointer;\r\n}\r\n \r\n .PhoneInputInput {\r\n width: 100 %;\r\n border - radius: 1rem;\r\n border: 2px solid #e2e8f0;\r\n padding: 1rem 1.25rem;\r\n font - size: 1rem;\r\n background - color: #fafbfc;\r\n color: #0f172a;\r\n transition: all 0.2s;\r\n\r\n &:focus {\r\n outline: none;\r\n border - color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background - color: #ffffff;\r\n }\r\n}\r\n`;\r\n","import React from \"react\";\r\nimport type { InputSection, SelectOption, ButtonAction } from \"../types\";\r\nimport * as S from \"./InputSection.styles\";\r\n\r\ninterface CardSelectorProps {\r\n section: InputSection;\r\n field: any;\r\n form: any;\r\n onSelectAction?: (action: ButtonAction) => void;\r\n disabled?: boolean;\r\n}\r\n\r\nexport function CardSelector({ section, field, form, onSelectAction, disabled }: CardSelectorProps) {\r\n const cardStyling = section.cardStyling ?? \"default\";\r\n\r\n return (\r\n <S.CardGrid style={disabled ? { pointerEvents: 'none', opacity: 0.7 } : {}}>\r\n {(section.options ?? []).map((option, index) => {\r\n const isSelected = field.value === option.value;\r\n\r\n return (\r\n <S.CardOption\r\n key={index}\r\n $selected={isSelected}\r\n whileHover={disabled ? {} : { scale: 1.02 }}\r\n whileTap={disabled ? {} : { scale: 0.98 }}\r\n onClick={() => {\r\n if (disabled) return;\r\n form.setFieldValue(section.fieldName ?? section.id, option.value);\r\n if (option.onClick && onSelectAction) {\r\n setTimeout(() => onSelectAction(option.onClick!), 50);\r\n }\r\n }}\r\n >\r\n {cardStyling === \"icon\" ? (\r\n <S.IconCardWrapper>\r\n <S.IconBox $bgColor={section.iconBackgroundColor}>\r\n {option.iconType === \"svg\" && option.iconValue ? (\r\n <div dangerouslySetInnerHTML={{ __html: option.iconValue }} />\r\n ) : option.iconValue ? (\r\n <img src={option.iconValue} alt={option.label} />\r\n ) : (\r\n // Fallback icon (house)\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\r\n <path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\r\n <path d=\"M9 22V12h6v10\" />\r\n </svg>\r\n )}\r\n </S.IconBox>\r\n <S.IconCardLabel>{option.label}</S.IconCardLabel>\r\n </S.IconCardWrapper>\r\n ) : (\r\n <>\r\n {option.imageUrl && (\r\n <S.CardImageWrapper>\r\n <S.CardImage\r\n src={option.imageUrl}\r\n alt={option.label}\r\n $objectFit={section.imageObjectFit}\r\n />\r\n </S.CardImageWrapper>\r\n )}\r\n <S.CardLabel>\r\n {option.label}\r\n </S.CardLabel>\r\n </>\r\n )}\r\n </S.CardOption>\r\n );\r\n })}\r\n </S.CardGrid>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\nimport { motion } from 'framer-motion';\r\n\r\nexport const ButtonWrapper = styled.div<{ $justify?: string }>`\r\n display: flex;\r\n justify-content: ${props => props.$justify || 'center'};\r\n width: 100%;\r\n`;\r\n\r\nexport const StyledButton = styled(motion.button) <{\r\n $bgColor?: string;\r\n $textColor?: string;\r\n $radius?: number;\r\n $padding?: string;\r\n $fontSize?: string;\r\n $width?: string;\r\n $align?: string;\r\n}>`\r\n background-color: ${props => props.$bgColor || '#4f46e5'};\r\n color: ${props => props.$textColor || '#ffffff'};\r\n border-radius: ${props => props.$radius ? `${props.$radius}px` : '12px'};\r\n padding: ${props => props.$padding || '12px 24px'};\r\n font-size: ${props => props.$fontSize || '16px'};\r\n font-weight: 600;\r\n width: ${props => props.$width || 'auto'};\r\n text-align: ${props => props.$align || 'center'};\r\n border: none;\r\n cursor: pointer;\r\n box-shadow: ${props => props.theme.shadows?.medium || '0 4px 6px -1px rgba(0,0,0,0.1)'};\r\n transition: opacity 0.2s;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover {\r\n opacity: 0.95;\r\n box-shadow: ${props => props.theme.shadows?.large || '0 10px 15px -3px rgba(0,0,0,0.1)'};\r\n }\r\n \r\n &:disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n transform: none !important;\r\n }\r\n`;\r\n","import React from \"react\";\r\nimport type { ButtonSection as ButtonSectionType } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./ButtonSection.styles\";\r\n\r\nexport interface ButtonSectionProps {\r\n section: ButtonSectionType;\r\n /** Optional callback to handle button clicks (e.g., page navigation in quiz mode). */\r\n onButtonClick?: (section: ButtonSectionType) => void;\r\n}\r\n\r\nconst SIZE_STYLE: Record<\r\n NonNullable<ButtonSectionType[\"size\"]>,\r\n { padding: string; fontSize: string }\r\n> = {\r\n small: { padding: \"8px 16px\", fontSize: \"14px\" },\r\n medium: { padding: \"12px 24px\", fontSize: \"16px\" },\r\n large: { padding: \"16px 32px\", fontSize: \"18px\" },\r\n};\r\n\r\nexport function ButtonSection({ section, onButtonClick }: ButtonSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n const size = section.size ?? \"large\";\r\n\r\n const widthStyle = (() => {\r\n switch (section.width) {\r\n case \"quarter\": return \"25%\";\r\n case \"half\": return \"50%\";\r\n case \"threeQuarter\": return \"75%\";\r\n case \"custom\": return section.customWidthPx != null ? `${section.customWidthPx}px` : \"auto\";\r\n default: return \"auto\";\r\n }\r\n })();\r\n\r\n const radiusPx = (() => {\r\n switch (section.borderRadius) {\r\n case \"small\": return 8;\r\n case \"custom\": return section.customBorderRadiusPx ?? 12;\r\n case \"medium\": default: return 12;\r\n }\r\n })();\r\n\r\n const justifyContent = (() => {\r\n switch (section.position ?? \"center\") {\r\n case \"center\": return \"center\";\r\n case \"right\": return \"flex-end\";\r\n case \"left\": return \"flex-start\";\r\n default: return \"center\"; // Default to center for buttons usually\r\n }\r\n })();\r\n\r\n const textAlign = section.textPosition ?? \"center\";\r\n const sizeConfig = SIZE_STYLE[size];\r\n\r\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\r\n // For submit buttons, let the form handle submission logic via type=\"submit\"\r\n // For other actions, call the callback\r\n if (onButtonClick && (!section.onClick?.type || section.onClick.type !== \"submit\")) {\r\n onButtonClick(section);\r\n }\r\n };\r\n\r\n const buttonType = section.onClick?.type === \"submit\" ? \"submit\" : \"button\";\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"button\" style={style}>\r\n <S.ButtonWrapper $justify={justifyContent}>\r\n <S.StyledButton\r\n type={buttonType}\r\n onClick={handleClick}\r\n $bgColor={section.buttonColor}\r\n $textColor={section.textColor}\r\n $radius={radiusPx}\r\n $padding={sizeConfig.padding}\r\n $fontSize={sizeConfig.fontSize}\r\n $width={widthStyle}\r\n $align={textAlign}\r\n whileHover={{ scale: 1.05 }}\r\n whileTap={{ scale: 0.95 }}\r\n initial={{ opacity: 0, y: 10 }}\r\n animate={{ opacity: 1, y: 0 }}\r\n transition={{ type: \"spring\", stiffness: 400, damping: 17 }}\r\n >\r\n {section.label}\r\n </S.StyledButton>\r\n </S.ButtonWrapper>\r\n </div>\r\n );\r\n}\r\n","import styled, { css } from 'styled-components';\r\n\r\nexport const TextWrapper = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nexport const StyledElement = styled.div<{\r\n $customFontSize?: string;\r\n $color?: string;\r\n $align?: string;\r\n $bold?: boolean;\r\n $italic?: boolean;\r\n $underline?: boolean;\r\n $variant?: string; // h1, h2, small, medium, large, etc.\r\n}>`\r\n color: ${props => props.$color || 'inherit'};\r\n text-align: ${props => props.$align || 'left'};\r\n font-weight: ${props => props.$bold ? 700 : 400};\r\n font-style: ${props => props.$italic ? 'italic' : 'normal'};\r\n text-decoration: ${props => props.$underline ? 'underline' : 'none'};\r\n line-height: 1.5;\r\n transition: color 0.2s;\r\n\r\n ${props => props.$customFontSize && css`\r\n font-size: ${props.$customFontSize};\r\n `}\r\n\r\n ${props => !props.$customFontSize && props.$variant === 'h1' && css`\r\n font-size: 32px;\r\n font-weight: 700;\r\n @media (max-width: 768px) { font-size: 28px; }\r\n `}\r\n \r\n ${props => !props.$customFontSize && props.$variant === 'h2' && css`\r\n font-size: 24px;\r\n font-weight: 700;\r\n @media (max-width: 768px) { font-size: 22px; }\r\n `}\r\n\r\n ${props => !props.$customFontSize && props.$variant === 'h3' && css`\r\n font-size: 20px;\r\n font-weight: 600;\r\n @media (max-width: 768px) { font-size: 18px; }\r\n `}\r\n\r\n ${props => !props.$customFontSize && props.$variant === 'medium' && css`\r\n font-size: 16px;\r\n @media (max-width: 768px) { font-size: 15px; }\r\n `}\r\n\r\n ${props => !props.$customFontSize && props.$variant === 'large' && css`\r\n font-size: 18px;\r\n @media (max-width: 768px) { font-size: 16px; }\r\n `}\r\n\r\n ${props => !props.$customFontSize && props.$variant === 'small' && css`\r\n font-size: 14px;\r\n @media (max-width: 768px) { font-size: 13px; }\r\n `}\r\n`;\r\n","import React from \"react\";\r\nimport type { TextSection as TextSectionType, TextTag } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./TextSection.styles\";\r\n\r\nexport interface TextSectionProps {\r\n section: TextSectionType;\r\n}\r\n\r\nconst DEFAULT_TAG: TextTag = \"p\";\r\n\r\nexport function TextSection({ section }: TextSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n const tag = section.tag ?? DEFAULT_TAG;\r\n const isHeading = tag !== \"p\";\r\n\r\n // Determine variant for styling based on tag or font size preset\r\n const variant = (() => {\r\n if (section.font && section.font !== \"custom\") {\r\n return section.font;\r\n }\r\n if (isHeading) {\r\n return tag;\r\n }\r\n return \"medium\";\r\n })();\r\n\r\n const customFontSize = section.font === \"custom\" && section.customFontSizePx != null\r\n ? `${section.customFontSizePx}px`\r\n : undefined;\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"text\" style={style}>\r\n <S.StyledElement\r\n as={tag as any}\r\n $variant={variant}\r\n $customFontSize={customFontSize}\r\n $color={section.color}\r\n $align={section.alignment}\r\n $bold={section.bold}\r\n $italic={section.italic}\r\n $underline={section.underline}\r\n >\r\n {section.content || \"Text content\"}\r\n </S.StyledElement>\r\n </div>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const Wrapper = styled.div<{ $justify?: string, width?: string }>`\r\n display: flex;\r\n justify-content: ${props => props.$justify || 'flex-start'};\r\n width: ${props => props.width || '100%'};\r\n`;\r\n\r\nexport const ImageContainer = styled.div<{ $maxWidth?: number; $radius?: string }>`\r\n width: 100%;\r\n max-width: ${props => props.$maxWidth ? `${props.$maxWidth}px` : '100%'};\r\n border-radius: ${props => props.$radius || props.theme.radii?.medium || '16px'};\r\n overflow: hidden;\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n`;\r\n\r\nexport const StyledImg = styled.img<{ $objectFit?: string }>`\r\n width: 100%;\r\n height: auto;\r\n display: block;\r\n object-fit: ${props => props.$objectFit || 'cover'};\r\n`;\r\n\r\nexport const SvgWrapper = styled.div<{ $justify?: string; $maxWidth?: number }>`\r\n width: 100%;\r\n display: flex;\r\n justify-content: ${props => props.$justify || 'flex-start'};\r\n position: relative;\r\n\r\n & svg {\r\n max-width: ${props => props.$maxWidth ? `${props.$maxWidth}px` : '100%'};\r\n height: auto;\r\n display: block;\r\n }\r\n`;\r\n","import React from \"react\";\r\nimport type { ImageSection as ImageSectionType, ImageSize, ImagePosition } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./ImageSection.styles\";\r\n\r\nconst SIZE_MAX_WIDTH: Record<Exclude<ImageSize, \"custom\">, number> = {\r\n small: 120,\r\n medium: 280,\r\n large: 640,\r\n};\r\n\r\nconst POSITION_JUSTIFY: Record<ImagePosition, string> = {\r\n left: \"flex-start\",\r\n center: \"center\",\r\n right: \"flex-end\",\r\n};\r\n\r\nexport interface ImageSectionProps {\r\n section: ImageSectionType;\r\n}\r\n\r\nexport function ImageSection({ section }: ImageSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n const size = section.size ?? \"medium\";\r\n const position = section.position ?? \"left\";\r\n const maxWidth =\r\n size === \"custom\"\r\n ? section.customSizePx ?? 280\r\n : SIZE_MAX_WIDTH[size];\r\n\r\n const justifyContent = POSITION_JUSTIFY[position];\r\n\r\n if (!section.src && !section.svgContent) return null;\r\n\r\n if (section.svgContent) {\r\n // Basic safety: ensure it actually looks like an SVG or at least a tag\r\n const isProbablySafe = section.svgContent.trim().startsWith('<') && !section.svgContent.includes('<script');\r\n\r\n if (isProbablySafe) {\r\n return (\r\n <S.Wrapper\r\n data-section-id={section.id}\r\n data-section-type=\"image\" $justify={justifyContent} width={`unset`}>\r\n <S.ImageContainer $maxWidth={maxWidth}>\r\n <S.SvgWrapper\r\n style={style}\r\n $justify={justifyContent}\r\n $maxWidth={maxWidth}\r\n dangerouslySetInnerHTML={{ __html: section.svgContent }}\r\n />\r\n </S.ImageContainer>\r\n </S.Wrapper>\r\n );\r\n }\r\n }\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"image\" style={style}>\r\n <S.Wrapper $justify={justifyContent}>\r\n <S.ImageContainer $maxWidth={maxWidth}>\r\n <S.StyledImg\r\n src={section.src || \"\"}\r\n alt={section.alt || \"\"}\r\n loading=\"lazy\"\r\n $objectFit={section.objectFit}\r\n />\r\n </S.ImageContainer>\r\n </S.Wrapper>\r\n </div>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const Wrapper = styled.div<{ $justify?: string; $width?: string }>`\r\n display: flex;\r\n justify-content: ${props => props.$justify || 'center'};\r\n width: 100%;\r\n`;\r\n\r\nexport const Line = styled.hr<{\r\n $color?: string;\r\n $thickness?: number;\r\n $lineStyle?: string;\r\n $maxWidth?: string;\r\n}>`\r\n border: none;\r\n border-top: ${props => props.$thickness || 1}px ${props => props.$lineStyle || 'solid'} ${props => props.$color || '#e5e7eb'};\r\n width: 100%;\r\n max-width: ${props => props.$maxWidth || '100%'};\r\n margin: 0;\r\n`;\r\n","import React from \"react\";\r\nimport type { DividerSection as DividerSectionType, ImagePosition } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./DividerSection.styles\";\r\n\r\nconst POSITION_JUSTIFY: Record<ImagePosition, string> = {\r\n left: \"flex-start\",\r\n center: \"center\",\r\n right: \"flex-end\",\r\n};\r\n\r\nexport interface DividerSectionProps {\r\n section: DividerSectionType;\r\n}\r\n\r\nexport function DividerSection({ section }: DividerSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, section.type);\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n\r\n const position = section.position ?? \"center\";\r\n const justifyContent = POSITION_JUSTIFY[position];\r\n\r\n const widthPx = (() => {\r\n switch (section.width) {\r\n case \"quarter\": return \"25%\";\r\n case \"half\": return \"50%\";\r\n case \"threeQuarter\": return \"75%\";\r\n case \"full\": return \"100%\";\r\n case \"custom\": return section.customWidthPx != null ? `${section.customWidthPx}px` : \"100%\";\r\n default: return \"100%\";\r\n }\r\n })();\r\n\r\n return (\r\n <S.Wrapper\r\n data-section-id={section.id}\r\n data-section-type=\"divider\"\r\n style={style}\r\n $justify={justifyContent}\r\n >\r\n <S.Line\r\n $color={section.color}\r\n $thickness={section.thickness}\r\n $lineStyle={section.lineStyle}\r\n $maxWidth={widthPx}\r\n />\r\n </S.Wrapper>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\nimport { motion } from 'framer-motion';\r\n\r\nexport const Wrapper = styled.div`\r\n width: 100%;\r\n`;\r\n\r\nexport const ProgressBarContainer = styled.div<{ $height: number; $bgColor: string; $radius: number }>`\r\n position: relative;\r\n width: 100%;\r\n height: ${props => props.$height}px;\r\n background-color: ${props => props.$bgColor};\r\n border-radius: ${props => props.$radius}px;\r\n overflow: hidden;\r\n`;\r\n\r\nexport const ProgressBarFill = styled(motion.div) <{ $fillColor: string; $radius: number }>`\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background-color: ${props => props.$fillColor};\r\n border-radius: ${props => props.$radius}px;\r\n`;\r\n\r\nexport const PercentageText = styled.div`\r\n margin-top: 8px;\r\n text-align: center;\r\n font-size: 14px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n font-weight: 500;\r\n`;\r\n","import React from \"react\";\r\nimport type { BasicComponentSection as BasicComponentSectionType } from \"../types\";\r\nimport { spacingToStyle } from \"./SpacingStyles\";\r\nimport { backgroundToStyle } from \"./BackgroundStyles\";\r\nimport * as S from \"./BasicComponentSection.styles\";\r\n\r\ninterface BasicComponentSectionProps {\r\n section: BasicComponentSectionType;\r\n /** Total number of pages in the quiz (for progress calculation). */\r\n totalPages: number;\r\n /** Current page index (0-based, for progress calculation). */\r\n currentPageIndex: number;\r\n}\r\n\r\nexport function BasicComponentSection({\r\n section,\r\n totalPages,\r\n currentPageIndex,\r\n}: BasicComponentSectionProps) {\r\n const spacingStyle = spacingToStyle(section.spacing, \"basic\");\r\n const backgroundStyle = backgroundToStyle(section.backgroundStyle);\r\n const style = { ...spacingStyle, ...backgroundStyle };\r\n\r\n if (section.componentType === \"progressBar\") {\r\n const height = section.progressBarHeight ?? 12;\r\n const bgColor = section.progressBarBgColor ?? \"#e5e7eb\";\r\n const fillColor = section.progressBarFillColor ?? \"#4f46e5\";\r\n const radius = section.progressBarRadius ?? 8;\r\n const showPercentage = section.showPercentage ?? true;\r\n\r\n // Calculate progress: (currentPageIndex + 1) / totalPages * 100\r\n // Prevent division by zero\r\n const progress = totalPages > 0 ? Math.min(100, ((currentPageIndex + 1) / totalPages) * 100) : 0;\r\n\r\n return (\r\n <div data-section-id={section.id} data-section-type=\"basic\" style={style}>\r\n <S.Wrapper>\r\n <S.ProgressBarContainer $height={height} $bgColor={bgColor} $radius={radius}>\r\n <S.ProgressBarFill\r\n $fillColor={fillColor}\r\n $radius={radius}\r\n initial={false}\r\n animate={{ width: `${progress}%` }}\r\n transition={{ type: \"spring\", stiffness: 60, damping: 20 }}\r\n />\r\n </S.ProgressBarContainer>\r\n {showPercentage && (\r\n <S.PercentageText>\r\n {Math.round(progress)}%\r\n </S.PercentageText>\r\n )}\r\n </S.Wrapper>\r\n </div>\r\n );\r\n }\r\n\r\n // Fallback for unknown component types\r\n return (\r\n <div style={style} className=\"text-gray-500 text-sm\">\r\n Unknown component type: {section.componentType}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { Section, ButtonSection as ButtonSectionType, BasicComponentSection as BasicComponentSectionType, ButtonAction } from \"../types\";\r\nimport { ContainerSection } from \"./ContainerSection\";\r\nimport { InputSection } from \"./InputSection\";\r\nimport { ButtonSection } from \"./ButtonSection\";\r\nimport { TextSection } from \"./TextSection\";\r\nimport { ImageSection } from \"./ImageSection\";\r\nimport { DividerSection } from \"./DividerSection\";\r\nimport { BasicComponentSection } from \"./BasicComponentSection\";\r\n\r\nexport interface SectionRendererProps {\r\n section: Section;\r\n /** For containers: rendered child nodes (builder resolves children). */\r\n children?: React.ReactNode;\r\n /** Optional callback for button clicks. */\r\n onButtonClick?: (section: ButtonSectionType) => void;\r\n /** Optional callback for select option actions. */\r\n onSelectAction?: (action: ButtonAction) => void;\r\n /** Whether this is being rendered in builder mode (affects input rendering). */\r\n isBuilderMode?: boolean;\r\n /** Total number of pages (for progress bar calculation). */\r\n totalPages?: number;\r\n /** Current page index (for progress bar calculation). */\r\n currentPageIndex?: number;\r\n}\r\n\r\nexport function SectionRenderer({\r\n section,\r\n children,\r\n onButtonClick,\r\n onSelectAction,\r\n isBuilderMode = false,\r\n totalPages = 1,\r\n currentPageIndex = 0,\r\n}: SectionRendererProps) {\r\n let content: React.ReactNode;\r\n\r\n switch (section.type) {\r\n case \"container\":\r\n content = <ContainerSection section={section}>{children}</ContainerSection>;\r\n break;\r\n case \"input\":\r\n content = <InputSection section={section} isBuilderMode={isBuilderMode} onSelectAction={onSelectAction} />;\r\n break;\r\n case \"button\":\r\n content = <ButtonSection section={section} onButtonClick={onButtonClick} />;\r\n break;\r\n case \"text\":\r\n content = <TextSection section={section} />;\r\n break;\r\n case \"image\":\r\n content = <ImageSection section={section} />;\r\n break;\r\n case \"divider\":\r\n content = <DividerSection section={section} />;\r\n break;\r\n case \"basic\":\r\n content = <BasicComponentSection section={section as BasicComponentSectionType} totalPages={totalPages} currentPageIndex={currentPageIndex} />;\r\n break;\r\n default:\r\n return null;\r\n }\r\n\r\n // Wrap with flex container if flex is specified\r\n if (section.flex !== undefined) {\r\n return (\r\n <div style={{ flex: section.flex }}>\r\n {content}\r\n </div>\r\n );\r\n }\r\n\r\n return content;\r\n}\r\n","import React from \"react\";\r\nimport type { Section, ContainerSection, ButtonSection as ButtonSectionType, ButtonAction } from \"../types\";\r\nimport { SectionRenderer } from \"./SectionRenderer\";\r\n\r\nexport interface SectionTreeRendererProps {\r\n sectionId: string;\r\n sectionsById: Map<string, Section>;\r\n /** Optional callback for button clicks. */\r\n onButtonClick?: (section: ButtonSectionType) => void;\r\n /** Optional callback for select option actions. */\r\n onSelectAction?: (action: ButtonAction) => void;\r\n /** Whether this is being rendered in builder mode (affects input rendering). */\r\n isBuilderMode?: boolean;\r\n /** Total number of pages (for progress bar calculation). */\r\n totalPages?: number;\r\n /** Current page index (for progress bar calculation). */\r\n currentPageIndex?: number;\r\n}\r\n\r\n/**\r\n * Renders a section and, if it's a container, its children recursively.\r\n * Only container sections have children; input, button, text, image do not.\r\n */\r\nexport function SectionTreeRenderer({\r\n sectionId,\r\n sectionsById,\r\n onButtonClick,\r\n onSelectAction,\r\n isBuilderMode = false,\r\n totalPages = 1,\r\n currentPageIndex = 0,\r\n}: SectionTreeRendererProps) {\r\n const section = sectionsById.get(sectionId);\r\n if (!section) return null;\r\n\r\n if (section.type === \"container\") {\r\n const container = section as ContainerSection;\r\n const childIds = (container.children ?? []).filter((id) =>\r\n sectionsById.has(id)\r\n );\r\n const children = childIds.map((id) => (\r\n <SectionTreeRenderer\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n onButtonClick={onButtonClick}\r\n onSelectAction={onSelectAction}\r\n isBuilderMode={isBuilderMode}\r\n totalPages={totalPages}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ));\r\n return (\r\n <SectionRenderer\r\n section={section}\r\n onButtonClick={onButtonClick}\r\n onSelectAction={onSelectAction}\r\n isBuilderMode={isBuilderMode}\r\n totalPages={totalPages}\r\n currentPageIndex={currentPageIndex}\r\n >\r\n {children.length > 0 ? children : null}\r\n </SectionRenderer>\r\n );\r\n }\r\n\r\n return <SectionRenderer\r\n section={section}\r\n onButtonClick={onButtonClick}\r\n onSelectAction={onSelectAction}\r\n isBuilderMode={isBuilderMode}\r\n totalPages={totalPages}\r\n currentPageIndex={currentPageIndex}\r\n />;\r\n}\r\n","import React, { useState, useEffect } from \"react\";\r\n\r\nexport interface RedirectionPageProps {\r\n redirectUrl: string;\r\n countdownSeconds?: number;\r\n}\r\n\r\nexport function RedirectionPage({ redirectUrl, countdownSeconds = 5 }: RedirectionPageProps) {\r\n const [secondsLeft, setSecondsLeft] = useState(countdownSeconds);\r\n\r\n useEffect(() => {\r\n // Countdown timer\r\n if (secondsLeft > 0) {\r\n const timer = setTimeout(() => {\r\n setSecondsLeft(secondsLeft - 1);\r\n }, 1000);\r\n return () => clearTimeout(timer);\r\n } else {\r\n // Redirect when countdown reaches 0\r\n window.location.href = redirectUrl;\r\n }\r\n }, [secondsLeft, redirectUrl]);\r\n\r\n return (\r\n <div className=\"flex flex-col items-center justify-center min-h-[400px] space-y-6 p-8\">\r\n <div className=\"text-center space-y-4\">\r\n <h2 className=\"text-2xl font-bold text-gray-900\">Redirecting…</h2>\r\n <p className=\"text-gray-600\">\r\n You will be redirected in{\" \"}\r\n <span className=\"font-semibold\">\r\n {secondsLeft} {secondsLeft === 1 ? \"second\" : \"seconds\"}\r\n </span>\r\n .\r\n </p>\r\n <div className=\"flex items-center justify-center\">\r\n <div className=\"relative w-32 h-32\">\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n <span className=\"text-5xl font-bold text-indigo-600\">{secondsLeft}</span>\r\n </div>\r\n <svg className=\"w-full h-full -rotate-90\">\r\n <circle\r\n cx=\"64\"\r\n cy=\"64\"\r\n r=\"60\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"8\"\r\n fill=\"none\"\r\n className=\"text-gray-200\"\r\n />\r\n <circle\r\n cx=\"64\"\r\n cy=\"64\"\r\n r=\"60\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"8\"\r\n fill=\"none\"\r\n strokeDasharray={`${(secondsLeft / countdownSeconds) * 377} 377`}\r\n className=\"text-indigo-600 transition-all duration-1000\"\r\n strokeLinecap=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n </div>\r\n <p className=\"text-sm text-gray-500\">\r\n Redirecting to:{\" \"}\r\n <span className=\"font-medium break-all\">{redirectUrl}</span>\r\n </p>\r\n <p className=\"text-xs text-gray-400\">\r\n If you are not redirected automatically,{\" \"}\r\n <a\r\n href={redirectUrl}\r\n className=\"font-medium text-indigo-600 hover:text-indigo-700 underline\"\r\n >\r\n click here\r\n </a>\r\n .\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","export function ThankYouPage() {\r\n return (\r\n <div className=\"flex flex-col items-center justify-center min-h-[400px] space-y-6 p-8\">\r\n <div className=\"text-center space-y-4\">\r\n <div className=\"inline-flex items-center justify-center w-16 h-16 rounded-full bg-green-100 mb-4\">\r\n <svg\r\n className=\"w-8 h-8 text-green-600\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M5 13l4 4L19 7\"\r\n />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-3xl font-bold text-gray-900\">Thank You!</h2>\r\n <p className=\"text-lg text-gray-600\">Your response has been submitted successfully.</p>\r\n <p className=\"text-sm text-gray-500 max-w-md mx-auto\">\r\n You can safely close this window or continue browsing. A confirmation may be sent to your\r\n email if requested in the form.\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { QuizV2Data } from \"../types\";\r\n\r\n/**\r\n * ============================================================================\r\n * QUIZ DATA LOADER UTILITIES\r\n * ============================================================================\r\n *\r\n * This file contains all functions for loading, saving, and managing quiz data.\r\n *\r\n * Current implementation: Forms API (https://lead-api-seven.vercel.app)\r\n * ============================================================================\r\n */\r\n\r\nconst API_BASE_URL = \"https://lead-api-seven.vercel.app\";\r\n\r\n/**\r\n * Result of loading quiz data\r\n */\r\nexport interface QuizDataLoadResult {\r\n success: boolean;\r\n data?: QuizV2Data;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Load quiz data by ID from the Forms API.\r\n *\r\n * @param id - The quiz ID to load\r\n * @returns Result object with success status, data, or error message\r\n */\r\nexport async function loadQuizData(id: string): Promise<QuizDataLoadResult> {\r\n try {\r\n const response = await fetch(`${API_BASE_URL}/api/forms?id=${id}`);\r\n\r\n if (!response.ok) {\r\n if (response.status === 404) {\r\n return {\r\n success: false,\r\n error: `Quiz with ID \"${id}\" not found.`,\r\n };\r\n }\r\n return {\r\n success: false,\r\n error: `Failed to load quiz data. Server returned ${response.status}.`,\r\n };\r\n }\r\n\r\n const data = await response.json() as QuizV2Data;\r\n\r\n return {\r\n success: true,\r\n data,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: \"Failed to load quiz data. Network error or server is unavailable.\",\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Save quiz data to the Forms API.\r\n * If the ID already exists, it will update the existing record.\r\n *\r\n * @param data - The quiz data to save\r\n * @returns Result object with success status or error message\r\n */\r\nexport async function saveQuizData(\r\n data: QuizV2Data\r\n): Promise<{ success: boolean; error?: string }> {\r\n try {\r\n const response = await fetch(`${API_BASE_URL}/api/forms`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(data),\r\n });\r\n\r\n if (!response.ok) {\r\n return {\r\n success: false,\r\n error: `Failed to save quiz data. Server returned ${response.status}.`,\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: \"Failed to save quiz data. Network error or server is unavailable.\",\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Check if a quiz exists by ID.\r\n *\r\n * @param id - The quiz ID to check\r\n * @returns True if the quiz exists, false otherwise\r\n */\r\nexport async function quizExists(id: string): Promise<boolean> {\r\n try {\r\n const response = await fetch(`${API_BASE_URL}/api/forms?id=${id}`);\r\n return response.ok;\r\n } catch (error) {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Get all saved quiz IDs and their data.\r\n *\r\n * @returns Array of quiz data objects\r\n */\r\nexport async function getAllQuizzes(): Promise<QuizV2Data[]> {\r\n try {\r\n const response = await fetch(`${API_BASE_URL}/api/forms`);\r\n\r\n if (!response.ok) {\r\n console.error(`Failed to fetch quizzes. Server returned ${response.status}.`);\r\n return [];\r\n }\r\n\r\n const data = await response.json();\r\n return Array.isArray(data) ? data : [];\r\n } catch (error) {\r\n console.error(\"Failed to fetch quizzes. Network error or server is unavailable.\");\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Get all saved quiz IDs.\r\n *\r\n * @returns Array of quiz IDs\r\n */\r\nexport async function getAllQuizIds(): Promise<string[]> {\r\n const quizzes = await getAllQuizzes();\r\n return quizzes.map((quiz) => quiz.id);\r\n}\r\n\r\n/**\r\n * Delete a quiz by ID.\r\n *\r\n * @param id - The quiz ID to delete\r\n * @returns Result object with success status\r\n */\r\nexport async function deleteQuizData(id: string): Promise<{\r\n success: boolean;\r\n error?: string;\r\n}> {\r\n try {\r\n const response = await fetch(`${API_BASE_URL}/api/forms?id=${id}`, {\r\n method: \"DELETE\",\r\n });\r\n\r\n if (!response.ok) {\r\n return {\r\n success: false,\r\n error: `Failed to delete quiz data. Server returned ${response.status}.`,\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: \"Failed to delete quiz data. Network error or server is unavailable.\",\r\n };\r\n }\r\n}\r\n","export const theme = {\r\n colors: {\r\n primary: '#6366f1', // Indigo 500\r\n primaryLight: '#818cf8', // Indigo 400\r\n primaryDark: '#4f46e5', // Indigo 600\r\n secondary: '#ec4899', // Pink 500\r\n background: '#f3f4f6', // Gray 100\r\n surface: '#ffffff',\r\n text: '#1f2937', // Gray 800\r\n textSecondary: '#6b7280', // Gray 500\r\n border: '#e5e7eb', // Gray 200\r\n success: '#10b981', // Emerald 500\r\n error: '#ef4444', // Red 500\r\n warning: '#f59e0b', // Amber 500\r\n warningDark: '#b45309', // Amber 700\r\n danger: '#ef4444',\r\n info: '#3b82f6',\r\n },\r\n radii: {\r\n small: '12px',\r\n medium: '20px',\r\n large: '32px',\r\n full: '9999px',\r\n },\r\n shadows: {\r\n small: '0 2px 8px -2px rgba(0,0,0,0.05)',\r\n medium: '0 8px 24px -6px rgba(0,0,0,0.1)',\r\n large: '0 20px 48px -12px rgba(0,0,0,0.15)',\r\n card: '0 4px 20px rgba(0,0,0,0.08)',\r\n },\r\n animations: {\r\n bounciness: {\r\n type: \"spring\",\r\n stiffness: 400,\r\n damping: 25,\r\n },\r\n hover: {\r\n scale: 1.02,\r\n rotate: 0.5,\r\n transition: { type: \"spring\", stiffness: 400, damping: 17 }\r\n },\r\n tap: {\r\n scale: 0.96,\r\n rotate: -0.5,\r\n }\r\n },\r\n transitions: {\r\n default: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\r\n fast: 'all 0.1s cubic-bezier(0.4, 0, 0.2, 1)',\r\n slow: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\r\n }\r\n};\r\n","import { useCallback, useRef } from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport interface TrackingData {\r\n event_type: string;\r\n step: number;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\nconst VISITOR_ID_KEY = 'pinha_visitor_id';\r\nconst SESSION_ID_KEY = 'pinha_session_id';\r\n\r\nconst getVisitorId = () => {\r\n if (typeof window === 'undefined') return '';\r\n let id = localStorage.getItem(VISITOR_ID_KEY);\r\n if (!id) {\r\n id = uuidv4();\r\n localStorage.setItem(VISITOR_ID_KEY, id);\r\n }\r\n return id;\r\n};\r\n\r\nconst getSessionId = () => {\r\n if (typeof window === 'undefined') return '';\r\n let id = sessionStorage.getItem(SESSION_ID_KEY);\r\n if (!id) {\r\n id = uuidv4();\r\n sessionStorage.setItem(SESSION_ID_KEY, id);\r\n }\r\n return id;\r\n};\r\n\r\nexport function useDefaultFormTracking() {\r\n const visitorId = useRef(getVisitorId());\r\n const sessionId = useRef(getSessionId());\r\n\r\n const trackEvent = useCallback(async (data: TrackingData) => {\r\n const payload = {\r\n created_at: new Date().toISOString().replace('T', ' ').split('.')[0], // Format: YYYY-MM-DD HH:MM:SS\r\n domain: typeof window !== 'undefined' ? window.location.hostname : '',\r\n metadata: data.metadata || {},\r\n session_id: sessionId.current,\r\n visitor_id: visitorId.current,\r\n event_type: data.event_type,\r\n step: data.step,\r\n };\r\n\r\n try {\r\n await fetch('https://lead-api-seven.vercel.app/api/collect/a', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n } catch (error) {\r\n console.error('Failed to send tracking data:', error);\r\n }\r\n }, []);\r\n\r\n const trackFormSubmission = useCallback(async (data: Record<string, any>, form_id: string) => {\r\n const payload = {\r\n form_id,\r\n form_data: data,\r\n };\r\n\r\n try {\r\n await fetch(`https://lead-api-seven.vercel.app/api/collect/${form_id}`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n } catch (error) {\r\n console.error('Failed to send tracking data:', error);\r\n }\r\n }, []);\r\n\r\n return { trackEvent, trackFormSubmission };\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const QuizContainer = styled.div<{ $maxWidth?: string }>`\r\n margin: 0 auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n width: 100%;\r\n max-width: ${props => props.$maxWidth === 'small' ? '448px' : props.$maxWidth === 'full' ? '100%' : '672px'};\r\n`;\r\n\r\nexport const Header = styled.header`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n text-align: center;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nexport const Title = styled.h1`\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n margin: 0;\r\n`;\r\n\r\nexport const Description = styled.p`\r\n font-size: 16px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n margin: 0;\r\n line-height: 1.5;\r\n`;\r\n\r\nexport const SectionGroup = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 24px;\r\n`;\r\n\r\nexport const LoadingContainer = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 400px;\r\n padding: 40px 20px;\r\n`;\r\n\r\nexport const LoadingCard = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 20px;\r\n padding: 48px 40px;\r\n background: ${props => props.theme.colors?.surface || '#ffffff'};\r\n border-radius: ${props => props.theme.radii?.large || '20px'};\r\n box-shadow: ${props => props.theme.shadows?.large || '0 10px 15px -3px rgb(0 0 0 / 0.1)'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n max-width: 400px;\r\n width: 100%;\r\n`;\r\n\r\nexport const SpinnerWrapper = styled.div`\r\n position: relative;\r\n width: 64px;\r\n height: 64px;\r\n`;\r\n\r\nexport const Spinner = styled.div`\r\n width: 64px;\r\n height: 64px;\r\n border: 4px solid ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n border-top-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n border-radius: 50%;\r\n animation: spin 0.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;\r\n\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n`;\r\n\r\nexport const SpinnerGlow = styled.div`\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n width: 48px;\r\n height: 48px;\r\n background: ${props => (props.theme.colors?.primary || '#6366f1') + '15'};\r\n border-radius: 50%;\r\n animation: pulse 2s ease-in-out infinite;\r\n\r\n @keyframes pulse {\r\n 0%, 100% { opacity: 0.3; transform: translate(-50%, -50%) scale(0.8); }\r\n 50% { opacity: 0.6; transform: translate(-50%, -50%) scale(1.2); }\r\n }\r\n`;\r\n\r\nexport const LoadingText = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 8px;\r\n text-align: center;\r\n`;\r\n\r\nexport const LoadingTitle = styled.h3`\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n margin: 0;\r\n`;\r\n\r\nexport const LoadingSubtitle = styled.p`\r\n font-size: 14px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n margin: 0;\r\n line-height: 1.5;\r\n`;\r\n\r\nexport const LoadingDots = styled.span`\r\n display: inline-flex;\r\n gap: 4px;\r\n \r\n &::after {\r\n content: '';\r\n animation: dots 1.5s steps(4, end) infinite;\r\n }\r\n\r\n @keyframes dots {\r\n 0%, 20% { content: ''; }\r\n 40% { content: '.'; }\r\n 60% { content: '..'; }\r\n 80%, 100% { content: '...'; }\r\n }\r\n`;\r\n\r\nexport const ErrorContainer = styled(LoadingContainer)`\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n`;\r\n\r\nexport const ErrorCard = styled.div`\r\n max-width: 400px;\r\n padding: 32px;\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n border-radius: ${props => props.theme.radii?.medium || '16px'};\r\n box-shadow: ${props => props.theme.shadows?.medium || '0 4px 6px -1px rgb(0 0 0 / 0.1)'};\r\n text-align: center;\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n`;\r\n\r\nexport const EmptyState = styled.div`\r\n border-radius: ${props => props.theme.radii?.medium || '16px'};\r\n border: 2px dashed ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => (props.theme.colors?.background || '#f3f4f6') + '80'};\r\n padding: 40px;\r\n text-align: center;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n font-weight: 500;\r\n font-size: 14px;\r\n`;\r\n","import React, { useState, useCallback, useEffect } from \"react\";\r\nimport { ThemeProvider } from \"styled-components\";\r\nimport { AnimatePresence } from \"framer-motion\";\r\nimport type {\r\n QuizV2Data,\r\n QuizV2Page,\r\n QuizV2Layout,\r\n Section,\r\n SectionType,\r\n ContainerSection,\r\n InputSection,\r\n ButtonSection,\r\n TextSection,\r\n ImageSection,\r\n DividerSection,\r\n BasicComponentSection,\r\n} from \"./types\";\r\nimport { generateId } from \"./utils/id\";\r\nimport { getSectionLabel } from \"./utils/sectionLabel\";\r\nimport { multipleChoiceTemplate } from \"./templatedQuiz\";\r\nimport { QuizBuilderPageNav } from \"./QuizBuilderPageNav\";\r\nimport { LayoutBuilder } from \"./LayoutBuilder\";\r\nimport { SectionListView } from \"./SectionListView\";\r\nimport { SectionTreeRenderer } from \"./quiz/SectionTreeRenderer\";\r\nimport {\r\n getDefaultQuizV2Data,\r\n getDefaultSpacingForType,\r\n DEFAULT_CONTAINER_LAYOUT,\r\n getDefaultQuizV2Layout,\r\n resolveLayoutForPage,\r\n orderPagesWithSpecialLast,\r\n} from \"./defaults\";\r\nimport { isDirty, getChangedSectionIds, isConfigChanged } from \"./utils/diff\";\r\nimport { getSectionsById } from \"./utils/sectionTree\";\r\nimport { saveQuizData } from \"./utils/quizDataLoader\";\r\nimport { BuilderSectionTree } from \"./quiz/BuilderSectionTree\";\r\nimport {\r\n ContainerConfig,\r\n InputConfig,\r\n ButtonConfig,\r\n TextConfig,\r\n ImageConfig,\r\n DividerConfig,\r\n BasicComponentConfig,\r\n GlobalConfig,\r\n PageConfig,\r\n} from \"./config\";\r\nimport {\r\n LivePreviewBar,\r\n type PreviewViewport,\r\n type PreviewViewMode,\r\n CUSTOM_WIDTH_DEFAULT,\r\n} from \"./LivePreviewBar\";\r\nimport { QuizV2 } from \"./QuizV2\";\r\nimport { QuizBuilderSelector } from \"./QuizBuilderSelector\";\r\nimport { theme } from \"./styles/theme\";\r\nimport * as S from \"./QuizBuilderV2.styles\";\r\n\r\n/** Normalize quiz data: ensure layouts, special pages, and page order (special pages last). */\r\nfunction normalizeQuizData(base: QuizV2Data): QuizV2Data {\r\n let result = base;\r\n if (base.layouts == null || base.layouts.length === 0) {\r\n result = { ...base, layouts: [getDefaultQuizV2Layout()] };\r\n }\r\n const pages = result.pages ?? [];\r\n const hasRedirectionPage = pages.some((p) => p.type === \"redirection\");\r\n const hasThankYouPage = pages.some((p) => p.type === \"thankYou\");\r\n const defaultLayout = result.layouts[0];\r\n\r\n if (!hasRedirectionPage || !hasThankYouPage) {\r\n const newPages = [...pages];\r\n if (!hasRedirectionPage) {\r\n newPages.push({\r\n id: generateId(),\r\n type: \"redirection\",\r\n sectionIds: [],\r\n layoutId: defaultLayout?.id,\r\n redirectUrl: \"https://example.com\",\r\n redirectCountdownSeconds: 5,\r\n });\r\n }\r\n if (!hasThankYouPage) {\r\n newPages.push({\r\n id: generateId(),\r\n type: \"thankYou\",\r\n sectionIds: [],\r\n layoutId: defaultLayout?.id,\r\n });\r\n }\r\n result = { ...result, pages: orderPagesWithSpecialLast(newPages) };\r\n } else {\r\n result = { ...result, pages: orderPagesWithSpecialLast(result.pages ?? []) };\r\n }\r\n return result;\r\n}\r\n\r\nconst SECTION_OPTIONS: { type: SectionType; label: string }[] = [\r\n { type: \"container\", label: \"Container\" },\r\n { type: \"input\", label: \"Input\" },\r\n { type: \"button\", label: \"Button\" },\r\n { type: \"text\", label: \"Text\" },\r\n { type: \"image\", label: \"Image\" },\r\n { type: \"divider\", label: \"Horizontal Line\" },\r\n { type: \"basic\", label: \"Progress Bar\" },\r\n];\r\n\r\nfunction createSection(type: SectionType): Section {\r\n const id = generateId();\r\n const base = { id, type, spacing: { ...getDefaultSpacingForType(type) } };\r\n switch (type) {\r\n case \"container\":\r\n return { ...base, children: [], layout: { ...DEFAULT_CONTAINER_LAYOUT }, width: \"full\" } as ContainerSection;\r\n case \"input\":\r\n return {\r\n ...base,\r\n placeholder: \"\",\r\n label: \"\",\r\n fieldType: \"text\",\r\n width: \"threeQuarter\",\r\n position: \"left\",\r\n selectUIType: \"dropdown\",\r\n cardSize: \"medium\"\r\n } as InputSection;\r\n case \"button\":\r\n return {\r\n ...base,\r\n label: \"Continue\",\r\n size: \"large\",\r\n width: \"threeQuarter\",\r\n borderRadius: \"medium\",\r\n position: \"center\",\r\n textPosition: \"center\",\r\n buttonColor: \"#4f46e5\",\r\n textColor: \"#ffffff\",\r\n } as ButtonSection;\r\n case \"text\":\r\n return { ...base, content: \"\" } as TextSection;\r\n case \"image\":\r\n return { ...base, src: \"\", alt: \"\" } as ImageSection;\r\n case \"divider\":\r\n return {\r\n ...base,\r\n color: \"#e5e7eb\",\r\n thickness: 1,\r\n lineStyle: \"solid\",\r\n width: \"full\",\r\n position: \"center\",\r\n } as DividerSection;\r\n case \"basic\":\r\n return {\r\n ...base,\r\n componentType: \"progressBar\",\r\n progressBarHeight: 12,\r\n progressBarBgColor: \"#e5e7eb\",\r\n progressBarFillColor: \"#4f46e5\",\r\n progressBarRadius: 8,\r\n showPercentage: true,\r\n } as BasicComponentSection;\r\n default:\r\n return base as Section;\r\n }\r\n}\r\n\r\nexport interface QuizBuilderV2Props {\r\n /** Initial data (e.g. from localStorage or getDefaultQuizV2Data()). */\r\n initialData?: QuizV2Data | null;\r\n /** Last saved data – used to compute dirty state and which sections changed. */\r\n lastSavedData?: QuizV2Data | null;\r\n onChange?: (data: QuizV2Data) => void;\r\n /** Called when user clicks Save. Consumer should persist and pass new lastSavedData. */\r\n onSave?: (data: QuizV2Data) => void;\r\n onSubmit?: (answers: unknown) => void;\r\n}\r\n\r\n/**\r\n * QuizBuilder V2 – global config, default sections on first load, save button, unsaved warning, visual for changed sections.\r\n */\r\nexport function QuizBuilderV2({\r\n initialData,\r\n lastSavedData = null,\r\n onChange,\r\n onSave,\r\n onSubmit,\r\n}: QuizBuilderV2Props) {\r\n const [editingData, setEditingData] = useState<QuizV2Data | null>(() =>\r\n initialData != null ? normalizeQuizData(initialData) : null\r\n );\r\n\r\n const handleSelectQuiz = useCallback((raw: QuizV2Data) => {\r\n setEditingData(normalizeQuizData(raw));\r\n }, []);\r\n\r\n if (editingData === null) {\r\n return (\r\n <ThemeProvider theme={theme}>\r\n <S.EditorContainer id=\"config-editor\">\r\n <QuizBuilderSelector onSelectQuiz={handleSelectQuiz} />\r\n </S.EditorContainer>\r\n </ThemeProvider>\r\n );\r\n }\r\n\r\n const data = editingData;\r\n\r\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\r\n const [selectedLayoutId, setSelectedLayoutId] = useState<string | null>(null);\r\n const [selectedSectionId, setSelectedSectionId] = useState<string | null>(null);\r\n const [selectedFromSectionList, setSelectedFromSectionList] = useState(false);\r\n const [addSectionOpen, setAddSectionOpen] = useState(false);\r\n const [addTemplateOpen, setAddTemplateOpen] = useState(false);\r\n /** When set, \"Add section\" adds as child of this container id. */\r\n const [addSectionParentId, setAddSectionParentId] = useState<string | null>(null);\r\n const [builderMode, setBuilderMode] = useState<\"pages\" | \"layouts\">(\"pages\");\r\n const [viewMode, setViewMode] = useState<PreviewViewMode>(\"edit\");\r\n const [viewport, setViewport] = useState<PreviewViewport>(\"desktop\");\r\n const [customWidthPx, setCustomWidthPx] = useState(CUSTOM_WIDTH_DEFAULT);\r\n const [previewPageIndex, setPreviewPageIndex] = useState(0);\r\n\r\n const pages = data.pages ?? [];\r\n const config = data.config ?? {};\r\n const layoutMaxWidth = (config.layoutMaxWidth as string) ?? \"medium\";\r\n // Max width is handled by style prop now\r\n\r\n useEffect(() => {\r\n if (pages.length > 0 && currentPageIndex >= pages.length) {\r\n setCurrentPageIndex(pages.length - 1);\r\n }\r\n if (pages.length > 0 && previewPageIndex >= pages.length) {\r\n setPreviewPageIndex(pages.length - 1);\r\n }\r\n }, [pages.length, currentPageIndex, previewPageIndex]);\r\n\r\n // Sync preview page index when switching to live mode\r\n useEffect(() => {\r\n if (viewMode === \"live\") {\r\n setPreviewPageIndex(currentPageIndex);\r\n }\r\n }, [viewMode, currentPageIndex]);\r\n const safePageIndex =\r\n pages.length === 0 ? 0 : Math.min(currentPageIndex, pages.length - 1);\r\n const currentPage = pages[safePageIndex] ?? null;\r\n\r\n const isLayoutMode = builderMode === \"layouts\";\r\n const activeLayoutId = selectedLayoutId ?? data.layouts[0]?.id;\r\n\r\n const layoutToPreview = isLayoutMode\r\n ? (data.layouts.find(l => l.id === activeLayoutId) ?? data.layouts[0] ?? null)\r\n : resolveLayoutForPage(data.layouts ?? [], currentPage);\r\n\r\n const rootSectionIds = isLayoutMode\r\n ? (pages[0]?.sectionIds ?? [])\r\n : (currentPage?.sectionIds ?? []);\r\n\r\n const headerSectionIds = layoutToPreview?.headerSectionIds ?? [];\r\n const footerSectionIds = layoutToPreview?.footerSectionIds ?? [];\r\n\r\n const dirty = isDirty(data, lastSavedData);\r\n const changedSectionIds = getChangedSectionIds(data, lastSavedData);\r\n const configChanged = isConfigChanged(data, lastSavedData);\r\n\r\n const updateData = useCallback(\r\n (next: QuizV2Data) => {\r\n setEditingData(next);\r\n onChange?.(next);\r\n },\r\n [onChange]\r\n );\r\n\r\n /** Add a templated section (pre-configured multiple sections). */\r\n const addTemplatedSection = useCallback(\r\n (templateType: \"multipleChoice\") => {\r\n const pageList = data.pages ?? [];\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const nextPageIndex = Math.min(pageIndex + 1, pageList.length - 1);\r\n\r\n // Get next field name number\r\n const existingInputs = (data.sections ?? []).filter(s => s.type === \"input\") as InputSection[];\r\n const nextFieldNumber = existingInputs.length + 1;\r\n\r\n if (templateType === \"multipleChoice\") {\r\n // Create three sections from template: text (question), input (card select), button (continue)\r\n const template = multipleChoiceTemplate;\r\n\r\n const textSection: TextSection = {\r\n ...template.text,\r\n id: generateId(),\r\n };\r\n\r\n const inputSection: InputSection = {\r\n ...template.input,\r\n id: generateId(),\r\n fieldName: `input_${nextFieldNumber}`,\r\n };\r\n\r\n const buttonSection: ButtonSection = {\r\n ...template.button,\r\n id: generateId(),\r\n onClick: {\r\n type: \"goToPage\" as const,\r\n targetPageIndex: nextPageIndex\r\n }\r\n };\r\n\r\n // Add all three sections\r\n const newSections = [textSection, inputSection, buttonSection];\r\n const sections = [...(data.sections ?? []), ...newSections];\r\n\r\n // Add section IDs to current page\r\n if (pageList.length === 0) {\r\n const nextPages = [{ id: generateId(), sectionIds: newSections.map(s => s.id) }];\r\n updateData({ ...data, sections, pages: nextPages });\r\n } else {\r\n const page = pageList[pageIndex];\r\n const nextSectionIds = [...(page.sectionIds ?? []), ...newSections.map(s => s.id)];\r\n const nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n updateData({ ...data, sections, pages: nextPages });\r\n }\r\n\r\n setSelectedSectionId(textSection.id);\r\n setAddTemplateOpen(false);\r\n }\r\n },\r\n [data, updateData, currentPageIndex]\r\n );\r\n\r\n /** Add a section at root (current page) or as child of a container. */\r\n const addSection = useCallback(\r\n (type: SectionType, parentId?: string | null) => {\r\n let section = createSection(type);\r\n\r\n // Auto-generate field name for input sections\r\n if (type === \"input\") {\r\n const existingInputs = (data.sections ?? []).filter(s => s.type === \"input\") as InputSection[];\r\n const nextNumber = existingInputs.length + 1;\r\n section = { ...section, fieldName: `input_${nextNumber}` } as InputSection;\r\n }\r\n\r\n let sections = [...(data.sections ?? []), section];\r\n const pid = parentId ?? addSectionParentId;\r\n if (pid) {\r\n const parent = sections.find((s) => s.id === pid);\r\n if (parent?.type === \"container\") {\r\n const childIds = [...((parent as import(\"./types\").ContainerSection).children ?? []), section.id];\r\n sections = sections.map((s) =>\r\n s.id === pid ? { ...s, children: childIds } as import(\"./types\").Section : s\r\n );\r\n }\r\n } else {\r\n // Add to current page root (or create first page if none)\r\n const pageList = data.pages ?? [];\r\n let nextPages: QuizV2Page[];\r\n if (pageList.length === 0) {\r\n nextPages = [{ id: generateId(), sectionIds: [section.id] }];\r\n } else {\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const page = pageList[pageIndex];\r\n const nextSectionIds = [...(page.sectionIds ?? []), section.id];\r\n nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n }\r\n updateData({ ...data, sections, pages: nextPages });\r\n setSelectedSectionId(section.id);\r\n setAddSectionOpen(false);\r\n setAddSectionParentId(null);\r\n return;\r\n }\r\n updateData({ ...data, sections });\r\n setSelectedSectionId(section.id);\r\n setAddSectionOpen(false);\r\n setAddSectionParentId(null);\r\n },\r\n [data, updateData, addSectionParentId, currentPageIndex]\r\n );\r\n\r\n /** Deep clone a section and its descendants. */\r\n const cloneSection = useCallback((sectionId: string, sections: Section[]): { clonedRootId: string, newSections: Section[] } => {\r\n const existing = sections.find(s => s.id === sectionId);\r\n if (!existing) return { clonedRootId: \"\", newSections: [] };\r\n\r\n const newId = generateId();\r\n const resultSections: Section[] = [];\r\n\r\n if (existing.type === \"container\") {\r\n const container = existing as import(\"./types\").ContainerSection;\r\n const clonedChildren: string[] = [];\r\n\r\n (container.children ?? []).forEach(childId => {\r\n const { clonedRootId, newSections } = cloneSection(childId, sections);\r\n if (clonedRootId) {\r\n clonedChildren.push(clonedRootId);\r\n resultSections.push(...newSections);\r\n }\r\n });\r\n\r\n resultSections.push({\r\n ...container,\r\n id: newId,\r\n children: clonedChildren\r\n } as Section);\r\n } else {\r\n resultSections.push({\r\n ...existing,\r\n id: newId\r\n } as Section);\r\n }\r\n\r\n return { clonedRootId: newId, newSections: resultSections };\r\n }, []);\r\n\r\n const copyExistingSection = useCallback(\r\n (sectionId: string, parentId?: string | null) => {\r\n const { clonedRootId, newSections } = cloneSection(sectionId, data.sections ?? []);\r\n if (!clonedRootId) return;\r\n\r\n const sections = [...(data.sections ?? []), ...newSections];\r\n const pid = parentId ?? addSectionParentId;\r\n\r\n if (pid) {\r\n const parent = sections.find((s) => s.id === pid);\r\n if (parent?.type === \"container\") {\r\n const childIds = [...((parent as import(\"./types\").ContainerSection).children ?? []), clonedRootId];\r\n const nextSections = sections.map((s) =>\r\n s.id === pid ? ({ ...s, children: childIds } as Section) : s\r\n );\r\n updateData({ ...data, sections: nextSections });\r\n }\r\n } else {\r\n // Add to current page root\r\n const pageList = data.pages ?? [];\r\n if (pageList.length > 0) {\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const page = pageList[pageIndex];\r\n const nextSectionIds = [...(page.sectionIds ?? []), clonedRootId];\r\n const nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n updateData({ ...data, sections, pages: nextPages });\r\n }\r\n }\r\n\r\n setSelectedSectionId(clonedRootId);\r\n setAddSectionOpen(false);\r\n setAddSectionParentId(null);\r\n },\r\n [data, updateData, addSectionParentId, currentPageIndex, cloneSection]\r\n );\r\n\r\n const linkExistingSection = useCallback(\r\n (sectionId: string, parentId?: string | null) => {\r\n const pid = parentId ?? addSectionParentId;\r\n\r\n if (pid) {\r\n const parent = data.sections.find((s) => s.id === pid);\r\n if (parent?.type === \"container\") {\r\n const childIds = [...((parent as import(\"./types\").ContainerSection).children ?? []), sectionId];\r\n const nextSections = data.sections.map((s) =>\r\n s.id === pid ? ({ ...s, children: childIds } as Section) : s\r\n );\r\n updateData({ ...data, sections: nextSections });\r\n }\r\n } else {\r\n // Add to current page root\r\n const pageList = data.pages ?? [];\r\n if (pageList.length > 0) {\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const page = pageList[pageIndex];\r\n const nextSectionIds = [...(page.sectionIds ?? []), sectionId];\r\n const nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n updateData({ ...data, pages: nextPages });\r\n }\r\n }\r\n\r\n setSelectedSectionId(sectionId);\r\n setAddSectionOpen(false);\r\n setAddSectionParentId(null);\r\n },\r\n [data, updateData, addSectionParentId, currentPageIndex]\r\n );\r\n\r\n const updateSection = useCallback(\r\n (updated: Section) => {\r\n const sections = (data.sections ?? []).map((s) =>\r\n s.id === updated.id ? updated : s\r\n );\r\n updateData({ ...data, sections });\r\n },\r\n [data, updateData]\r\n );\r\n\r\n\r\n /** Collect all descendant section ids under a container (recursive). */\r\n const getDescendantIds = useCallback((sections: Section[], containerId: string): Set<string> => {\r\n const ids = new Set<string>();\r\n const section = sections.find((s) => s.id === containerId);\r\n if (!section || section.type !== \"container\") return ids;\r\n const children = (section as import(\"./types\").ContainerSection).children ?? [];\r\n for (const childId of children) {\r\n ids.add(childId);\r\n for (const id of getDescendantIds(sections, childId)) ids.add(id);\r\n }\r\n return ids;\r\n }, []);\r\n\r\n /** Remove a section from the page (and from containers/layouts). Keeps the section in data.sections so it stays in storage. */\r\n const removeSection = useCallback(\r\n (sectionId: string) => {\r\n const sections = data.sections ?? [];\r\n\r\n // If this section was selected from the section list, delete it completely from storage\r\n if (selectedFromSectionList) {\r\n // Completely remove from storage and all references\r\n const nextSections = sections.filter((s) => s.id !== sectionId);\r\n const toUnlink = new Set<string>([sectionId]);\r\n\r\n // Clean up all references in containers\r\n const sectionsWithCleanedRefs = nextSections.map((s) => {\r\n if (s.type === \"container\") {\r\n const children = (s as import(\"./types\").ContainerSection).children ?? [];\r\n const nextChildren = children.filter((id) => !toUnlink.has(id));\r\n return nextChildren.length !== children.length ? { ...s, children: nextChildren } : s;\r\n }\r\n return s;\r\n }) as Section[];\r\n\r\n const pages = (data.pages ?? []).map((p) => ({\r\n ...p,\r\n sectionIds: (p.sectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n }));\r\n const layouts = (data.layouts ?? []).map((l) => ({\r\n ...l,\r\n headerSectionIds: (l.headerSectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n footerSectionIds: (l.footerSectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n }));\r\n\r\n updateData({ ...data, sections: sectionsWithCleanedRefs, pages, layouts });\r\n setSelectedSectionId(null);\r\n setSelectedFromSectionList(false);\r\n setViewMode(\"edit\");\r\n return;\r\n }\r\n\r\n // Normal behavior: \"Remove from page\" should only unlink this section id from page/layout references.\r\n // It should NOT mutate the removed container's own children tree.\r\n const toUnlink = new Set<string>([sectionId]);\r\n const sectionsWithCleanedRefs = sections.map((s) => {\r\n if (s.type === \"container\") {\r\n // Don't modify the removed container's own children; only remove references from other containers.\r\n if (s.id === sectionId) return s;\r\n const children = (s as import(\"./types\").ContainerSection).children ?? [];\r\n const nextChildren = children.filter((id) => !toUnlink.has(id));\r\n return nextChildren.length !== children.length ? { ...s, children: nextChildren } : s;\r\n }\r\n return s;\r\n }) as Section[];\r\n const pages = (data.pages ?? []).map((p) => ({\r\n ...p,\r\n sectionIds: (p.sectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n }));\r\n const layouts = (data.layouts ?? []).map((l) => ({\r\n ...l,\r\n headerSectionIds: (l.headerSectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n footerSectionIds: (l.footerSectionIds ?? []).filter((id) => !toUnlink.has(id)),\r\n }));\r\n updateData({ ...data, sections: sectionsWithCleanedRefs, pages, layouts });\r\n if (toUnlink.has(selectedSectionId ?? \"\")) setSelectedSectionId(null);\r\n },\r\n [data, updateData, selectedSectionId, selectedFromSectionList]\r\n );\r\n\r\n const moveSectionUp = useCallback(\r\n (sectionId: string) => {\r\n const pageList = data.pages ?? [];\r\n if (pageList.length === 0) return;\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const page = pageList[pageIndex];\r\n const sectionIds = page.sectionIds ?? [];\r\n const index = sectionIds.indexOf(sectionId);\r\n if (index <= 0) return;\r\n const nextSectionIds = [...sectionIds];\r\n [nextSectionIds[index - 1], nextSectionIds[index]] = [nextSectionIds[index], nextSectionIds[index - 1]];\r\n const nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n updateData({ ...data, pages: nextPages });\r\n },\r\n [data, updateData, currentPageIndex]\r\n );\r\n\r\n const moveSectionDown = useCallback(\r\n (sectionId: string) => {\r\n const pageList = data.pages ?? [];\r\n if (pageList.length === 0) return;\r\n const pageIndex = Math.min(currentPageIndex, pageList.length - 1);\r\n const page = pageList[pageIndex];\r\n const sectionIds = page.sectionIds ?? [];\r\n const index = sectionIds.indexOf(sectionId);\r\n if (index < 0 || index >= sectionIds.length - 1) return;\r\n const nextSectionIds = [...sectionIds];\r\n [nextSectionIds[index], nextSectionIds[index + 1]] = [nextSectionIds[index + 1], nextSectionIds[index]];\r\n const nextPages = pageList.map((p, i) =>\r\n i === pageIndex ? { ...p, sectionIds: nextSectionIds } : p\r\n );\r\n updateData({ ...data, pages: nextPages });\r\n },\r\n [data, updateData, currentPageIndex]\r\n );\r\n\r\n const updateConfig = useCallback(\r\n (config: Record<string, unknown>) => {\r\n updateData({ ...data, config });\r\n },\r\n [data, updateData]\r\n );\r\n\r\n /** Add a new page (empty sectionIds), use first layout. Insert before special pages so they stay last. */\r\n const addPage = useCallback(() => {\r\n const pageList = data.pages ?? [];\r\n const layouts = data.layouts ?? [];\r\n const layoutId = layouts.length > 0 ? layouts[0].id : undefined;\r\n const newPage: QuizV2Page = { id: generateId(), type: \"regular\", sectionIds: [], layoutId };\r\n const insertIndex = pageList.findIndex(\r\n (p) => p.type === \"redirection\" || p.type === \"thankYou\"\r\n );\r\n const nextPages =\r\n insertIndex === -1\r\n ? [...pageList, newPage]\r\n : [...pageList.slice(0, insertIndex), newPage, ...pageList.slice(insertIndex)];\r\n updateData({ ...data, pages: nextPages });\r\n setCurrentPageIndex(insertIndex === -1 ? nextPages.length - 1 : insertIndex);\r\n }, [data, updateData]);\r\n\r\n /** Update a page. */\r\n const updatePage = useCallback(\r\n (index: number, updatedPage: QuizV2Page) => {\r\n const pageList = data.pages ?? [];\r\n const nextPages = pageList.map((p, i) => (i === index ? updatedPage : p));\r\n updateData({ ...data, pages: nextPages });\r\n },\r\n [data, updateData]\r\n );\r\n\r\n /** Permanently remove all sections that are not used on any page or layout. */\r\n const clearUnusedSections = useCallback(() => {\r\n const sections = data.sections ?? [];\r\n const pages = data.pages ?? [];\r\n const layouts = data.layouts ?? [];\r\n\r\n // 1. Collect all root IDs from pages and layouts\r\n const used = new Set<string>();\r\n pages.forEach(p => (p.sectionIds ?? []).forEach(id => used.add(id)));\r\n layouts.forEach(l => {\r\n (l.headerSectionIds ?? []).forEach(id => used.add(id));\r\n (l.footerSectionIds ?? []).forEach(id => used.add(id));\r\n });\r\n\r\n // 2. Recursively find all children of used roots\r\n const allUsed = new Set<string>();\r\n const collectUsed = (id: string) => {\r\n if (allUsed.has(id)) return;\r\n allUsed.add(id);\r\n const section = sections.find(s => s.id === id);\r\n if (section?.type === \"container\") {\r\n (section as import(\"./types\").ContainerSection).children?.forEach(collectUsed);\r\n }\r\n };\r\n Array.from(used).forEach(collectUsed);\r\n\r\n // 3. Filter sections to keep only used ones\r\n const nextSections = sections.filter(s => allUsed.has(s.id));\r\n\r\n if (nextSections.length === sections.length) {\r\n window.alert(\"No unused sections found to clear.\");\r\n return;\r\n }\r\n\r\n updateData({ ...data, sections: nextSections });\r\n }, [data, updateData]);\r\n\r\n /** Delete a page (minimum 1 page required). */\r\n const deletePage = useCallback(\r\n (index: number) => {\r\n const pageList = data.pages ?? [];\r\n if (pageList.length <= 1) return; // Minimum 1 page required\r\n\r\n const pageToDelete = pageList[index];\r\n\r\n // Prevent deletion of special pages (redirection and thankYou)\r\n if (pageToDelete?.type === \"redirection\" || pageToDelete?.type === \"thankYou\") {\r\n window.alert(\r\n `Cannot delete ${pageToDelete.type === \"redirection\" ? \"Redirection\" : \"Thank You\"} page.\\n\\nThis is a special page that cannot be removed.`\r\n );\r\n return;\r\n }\r\n\r\n // Show confirmation dialog\r\n const confirmed = window.confirm(\r\n `Are you sure you want to delete Page ${index + 1}?\\n\\nThis action cannot be undone.`\r\n );\r\n\r\n if (!confirmed) return; // User cancelled\r\n\r\n const nextPages = pageList.filter((_, i) => i !== index);\r\n updateData({ ...data, pages: nextPages });\r\n // Adjust currentPageIndex if needed\r\n if (currentPageIndex >= nextPages.length) {\r\n setCurrentPageIndex(nextPages.length - 1);\r\n } else if (currentPageIndex === index && index > 0) {\r\n setCurrentPageIndex(index - 1);\r\n }\r\n },\r\n [data, updateData, currentPageIndex]\r\n );\r\n\r\n const duplicatePage = useCallback(\r\n (index: number) => {\r\n const pageList = data.pages ?? [];\r\n const pageToDuplicate = pageList[index];\r\n if (!pageToDuplicate) return;\r\n\r\n // Duplicate sections recursively\r\n let allNewSections: Section[] = [...data.sections];\r\n const newRootSectionIds: string[] = [];\r\n\r\n (pageToDuplicate.sectionIds ?? []).forEach((sectionId) => {\r\n const { clonedRootId, newSections } = cloneSection(sectionId, data.sections);\r\n if (clonedRootId) {\r\n newRootSectionIds.push(clonedRootId);\r\n allNewSections.push(...newSections);\r\n }\r\n });\r\n\r\n const newPage: QuizV2Page = {\r\n ...pageToDuplicate,\r\n id: generateId(),\r\n sectionIds: newRootSectionIds,\r\n };\r\n\r\n // Insert after the current page\r\n const nextPages = [\r\n ...pageList.slice(0, index + 1),\r\n newPage,\r\n ...pageList.slice(index + 1),\r\n ];\r\n\r\n updateData({ ...data, sections: allNewSections, pages: orderPagesWithSpecialLast(nextPages) });\r\n setCurrentPageIndex(index + 1);\r\n },\r\n [data, updateData, cloneSection]\r\n );\r\n\r\n const movePageUp = useCallback(\r\n (index: number) => {\r\n if (index <= 0) return;\r\n const pageList = [...(data.pages ?? [])];\r\n // Only allowed if current and previous are regular pages, or we just rely on orderPagesWithSpecialLast\r\n const p1 = pageList[index - 1];\r\n const p2 = pageList[index];\r\n if (p1.type !== \"regular\" || p2.type !== \"regular\") return;\r\n\r\n [pageList[index - 1], pageList[index]] = [pageList[index], pageList[index - 1]];\r\n updateData({ ...data, pages: pageList });\r\n setCurrentPageIndex(index - 1);\r\n },\r\n [data, updateData]\r\n );\r\n\r\n const movePageDown = useCallback(\r\n (index: number) => {\r\n const pageList = data.pages ?? [];\r\n if (index >= pageList.length - 1) return;\r\n const p1 = pageList[index];\r\n const p2 = pageList[index + 1];\r\n if (p1.type !== \"regular\" || p2.type !== \"regular\") return;\r\n\r\n const nextPageList = [...pageList];\r\n [nextPageList[index], nextPageList[index + 1]] = [nextPageList[index + 1], nextPageList[index]];\r\n updateData({ ...data, pages: nextPageList });\r\n setCurrentPageIndex(index + 1);\r\n },\r\n [data, updateData]\r\n );\r\n\r\n const updateLayout = useCallback(\r\n (layout: QuizV2Layout) => {\r\n const layouts = (data.layouts ?? []).map((l) =>\r\n l.id === layout.id ? layout : l\r\n );\r\n updateData({ ...data, layouts });\r\n },\r\n [data, updateData]\r\n );\r\n\r\n const addLayout = useCallback(() => {\r\n const newLayout = getDefaultQuizV2Layout();\r\n const layouts = [...(data.layouts ?? []), newLayout];\r\n updateData({ ...data, layouts });\r\n setSelectedLayoutId(newLayout.id);\r\n }, [data, updateData]);\r\n\r\n const handleSave = useCallback(async () => {\r\n // Save to storage with quiz ID (uses utility function for future flexibility)\r\n const result = await saveQuizData(data);\r\n if (result.success) {\r\n console.log(`Quiz saved successfully with ID: ${data.id}`);\r\n // Also call the provided onSave callback if it exists\r\n onSave?.(data);\r\n } else {\r\n console.error(`Failed to save quiz: ${result.error}`);\r\n alert(`Failed to save quiz: ${result.error}`);\r\n }\r\n }, [data, onSave]);\r\n\r\n const handleCancel = useCallback(() => {\r\n setEditingData(normalizeQuizData(lastSavedData ?? getDefaultQuizV2Data()));\r\n setSelectedSectionId(null);\r\n }, [lastSavedData]);\r\n\r\n const selectedSection = selectedSectionId\r\n ? (data.sections ?? []).find((s) => s.id === selectedSectionId)\r\n : null;\r\n\r\n const handleClickOutside = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n // Check if click is within the section config panel (right sidebar)\r\n const configPanel = document.getElementById(\"section-config-panel\");\r\n if (configPanel && configPanel.contains(e.target as Node)) {\r\n return; // Don't deselect if clicking within config panel\r\n }\r\n\r\n // Check if click is within the left sidebar (global config, layouts, pages, section list)\r\n const leftSidebar = document.getElementById(\"left-sidebar-panel\");\r\n if (leftSidebar && leftSidebar.contains(e.target as Node)) {\r\n return; // Don't deselect if clicking within left sidebar\r\n }\r\n\r\n // If we reach here, click was outside sections (they stopPropagation) and outside sidebars\r\n setSelectedSectionId(null);\r\n setSelectedFromSectionList(false);\r\n // Switch back to normal edit mode when clicking outside\r\n if (viewMode === \"edit\" && selectedFromSectionList) {\r\n setViewMode(\"edit\");\r\n }\r\n },\r\n [selectedFromSectionList, viewMode]\r\n );\r\n\r\n // Handler for selecting a section from the section list\r\n const handleSelectFromSectionList = useCallback(\r\n (sectionId: string) => {\r\n setSelectedSectionId(sectionId);\r\n setSelectedFromSectionList(true);\r\n // Automatically switch to edit mode\r\n setViewMode(\"edit\");\r\n },\r\n []\r\n );\r\n\r\n const isStandalone = initialData === undefined;\r\n\r\n const handleCreateNewQuiz = useCallback(() => {\r\n if (dirty && !window.confirm(\"You have unsaved changes. Start a new quiz anyway?\")) {\r\n return;\r\n }\r\n setEditingData(normalizeQuizData(getDefaultQuizV2Data()));\r\n setCurrentPageIndex(0);\r\n setSelectedSectionId(null);\r\n }, [dirty]);\r\n\r\n return (\r\n <ThemeProvider theme={theme}>\r\n <S.EditorContainer id='config-editor'>\r\n {/* Top: back to list, create new (standalone) + unsaved warning */}\r\n <S.TopBar>\r\n <S.ButtonGroup>\r\n {isStandalone && (\r\n <>\r\n <S.BackButton onClick={() => setEditingData(null)}>\r\n ← Back to quiz list\r\n </S.BackButton>\r\n <S.CreateButton onClick={handleCreateNewQuiz}>\r\n + Create New Quiz\r\n </S.CreateButton>\r\n </>\r\n )}\r\n {dirty && (\r\n <S.AlertText role=\"status\">\r\n You have unsaved changes.\r\n </S.AlertText>\r\n )}\r\n </S.ButtonGroup>\r\n </S.TopBar>\r\n\r\n <S.MainLayout onClick={handleClickOutside}>\r\n {/* Left: layout-level config + page nav */}\r\n <S.LeftSidebar id=\"left-sidebar-panel\" aria-label=\"Sidebar\">\r\n <S.ModeSwitcher>\r\n <S.ModeTab\r\n $active={builderMode === \"pages\"}\r\n onClick={() => {\r\n setBuilderMode(\"pages\");\r\n setSelectedLayoutId(null);\r\n }}\r\n >\r\n Page Editor\r\n </S.ModeTab>\r\n <S.ModeTab\r\n $active={builderMode === \"layouts\"}\r\n onClick={() => {\r\n setBuilderMode(\"layouts\");\r\n if (!selectedLayoutId && data.layouts.length > 0) {\r\n setSelectedLayoutId(data.layouts[0].id);\r\n }\r\n }}\r\n >\r\n Layout Builder\r\n </S.ModeTab>\r\n </S.ModeSwitcher>\r\n <S.LeftSidebarContent>\r\n {builderMode === \"pages\" ? (\r\n <>\r\n <GlobalConfig\r\n data={data}\r\n onChange={updateConfig}\r\n hasUnsavedChanges={configChanged}\r\n />\r\n <QuizBuilderPageNav\r\n count={pages.length}\r\n pages={pages}\r\n selectedIndex={pages.length > 0 ? currentPageIndex : null}\r\n onSelect={(i) => setCurrentPageIndex(i)}\r\n onAddPage={addPage}\r\n onDeletePage={deletePage}\r\n onDuplicatePage={duplicatePage}\r\n onMovePageUp={movePageUp}\r\n onMovePageDown={movePageDown}\r\n />\r\n <SectionListView\r\n data={data}\r\n selectedSectionId={selectedSectionId}\r\n onSelectSection={handleSelectFromSectionList}\r\n currentPageIndex={currentPageIndex}\r\n onClearUnused={clearUnusedSections}\r\n />\r\n </>\r\n ) : (\r\n <LayoutBuilder\r\n data={data}\r\n selectedLayoutId={selectedLayoutId}\r\n onSelectLayout={setSelectedLayoutId}\r\n onLayoutChange={updateLayout}\r\n onAddLayout={addLayout}\r\n />\r\n )}\r\n </S.LeftSidebarContent>\r\n </S.LeftSidebar>\r\n\r\n {/* Main: Live preview bar + preview with viewport width */}\r\n <S.MainPreviewArea>\r\n <S.PreviewBarWrapper>\r\n <LivePreviewBar\r\n viewMode={viewMode}\r\n onViewModeChange={setViewMode}\r\n viewport={viewport}\r\n onViewportChange={setViewport}\r\n customWidthPx={customWidthPx}\r\n onCustomWidthChange={setCustomWidthPx}\r\n dirty={dirty}\r\n onSave={handleSave}\r\n onCancel={handleCancel}\r\n pages={pages}\r\n currentPageIndex={previewPageIndex}\r\n onPageChange={setPreviewPageIndex}\r\n />\r\n </S.PreviewBarWrapper>\r\n\r\n <S.PreviewContent\r\n width={viewport === \"custom\" ? customWidthPx : undefined}\r\n className={viewport !== \"custom\" ? `viewport-${viewport}` : \"\"}\r\n style={viewport !== \"custom\" ? { maxWidth: viewport === \"mobile\" ? \"375px\" : viewport === \"tablet\" ? \"768px\" : \"100%\" } : {}}\r\n >\r\n {viewMode === \"live\" ? (\r\n /* Live preview: use QuizV2 component for real quiz experience */\r\n <QuizV2\r\n data={data}\r\n currentPageIndex={previewPageIndex}\r\n onPageChange={setPreviewPageIndex}\r\n withDefaultTracking={false}\r\n onSubmit={(answers) => {\r\n console.log(\"Quiz submitted in live preview:\", answers);\r\n }}\r\n />\r\n ) : (\r\n /* Edit mode: layout-container > header / main-content / footer, clickable */\r\n <S.LayoutContainer\r\n $isLayoutMode={isLayoutMode}\r\n style={{ maxWidth: layoutMaxWidth === \"full\" ? \"100%\" : layoutMaxWidth === \"small\" ? \"448px\" : \"672px\" }}\r\n >\r\n {isLayoutMode && <S.LayoutModeBadge>Layout Editor: {activeLayoutId ? (data.layouts.findIndex(l => l.id === activeLayoutId) + 1) : \"\"}</S.LayoutModeBadge>}\r\n {(() => {\r\n const sections = data.sections ?? [];\r\n const sectionsById = getSectionsById(sections);\r\n return (\r\n <>\r\n <div id=\"header-generator\" style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\r\n {headerSectionIds.map((id) => (\r\n <BuilderSectionTree\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n selectedSectionId={selectedSectionId}\r\n changedSectionIds={changedSectionIds}\r\n onSelectSection={(id) => {\r\n setSelectedSectionId(id);\r\n setSelectedFromSectionList(false);\r\n }}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))}\r\n </div>\r\n <div\r\n id=\"main-content-generator\"\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 16,\r\n opacity: isLayoutMode ? 0.3 : 1,\r\n pointerEvents: isLayoutMode ? 'none' : 'auto',\r\n }}\r\n >\r\n {isLayoutMode && (\r\n <div style={{\r\n position: 'absolute',\r\n inset: 0,\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: 5\r\n }}>\r\n <span style={{\r\n background: 'white',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '11px',\r\n fontWeight: 600,\r\n color: '#999',\r\n border: '1px solid #eee'\r\n }}>\r\n Page Content Placeholder\r\n </span>\r\n </div>\r\n )}\r\n {rootSectionIds.length === 0 ? (\r\n <S.EmptyState>\r\n {currentPage?.type === \"redirection\" ? (\r\n <>\r\n <S.EmptyStateTitle>🔄 Redirection Page</S.EmptyStateTitle>\r\n <S.EmptyStateText>\r\n Default countdown will appear here. Add custom sections above it by clicking the + button.\r\n </S.EmptyStateText>\r\n </>\r\n ) : currentPage?.type === \"thankYou\" ? (\r\n <>\r\n <S.EmptyStateTitle>✓ Thank You Page</S.EmptyStateTitle>\r\n <S.EmptyStateText>\r\n Default success message will appear here. Add custom sections to personalize it.\r\n </S.EmptyStateText>\r\n </>\r\n ) : (\r\n <S.EmptyStateText>\r\n Page {currentPageIndex + 1} has no sections.\r\n </S.EmptyStateText>\r\n )}\r\n </S.EmptyState>\r\n ) : (\r\n rootSectionIds.map((id, index) => (\r\n <BuilderSectionTree\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n selectedSectionId={selectedSectionId}\r\n changedSectionIds={changedSectionIds}\r\n onSelectSection={(id) => {\r\n setSelectedSectionId(id);\r\n setSelectedFromSectionList(false);\r\n }}\r\n onMoveUp={moveSectionUp}\r\n onMoveDown={moveSectionDown}\r\n canMoveUp={index > 0}\r\n canMoveDown={index < rootSectionIds.length - 1}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))\r\n )}\r\n <div style={{ display: 'flex', justifyContent: 'center', padding: '16px 0' }}>\r\n <S.AddSectionButton\r\n onClick={() => { setAddSectionParentId(null); setAddSectionOpen(true); }}\r\n >\r\n <span aria-hidden>+</span>\r\n Add a section\r\n </S.AddSectionButton>\r\n </div>\r\n </div>\r\n <div id=\"footer-generator\" style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\r\n {footerSectionIds.map((id) => (\r\n <BuilderSectionTree\r\n key={id}\r\n sectionId={id}\r\n sectionsById={sectionsById}\r\n selectedSectionId={selectedSectionId}\r\n changedSectionIds={changedSectionIds}\r\n onSelectSection={(id) => {\r\n setSelectedSectionId(id);\r\n setSelectedFromSectionList(false);\r\n }}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))}\r\n </div>\r\n </>\r\n );\r\n })()}\r\n </S.LayoutContainer>\r\n )}\r\n </S.PreviewContent>\r\n\r\n <AnimatePresence>\r\n {/* Add section popup */}\r\n {addSectionOpen && (\r\n <S.ModalOverlay\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n onClick={() => setAddSectionOpen(false)}\r\n >\r\n <S.ModalContent\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <S.ModalHeader>\r\n <S.ModalTitle id=\"add-section-title\">Add section</S.ModalTitle>\r\n <S.CloseButton onClick={() => setAddSectionOpen(false)} aria-label=\"Close\">\r\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </S.CloseButton>\r\n </S.ModalHeader>\r\n <S.ModalBody>\r\n <div style={{ marginBottom: 16 }}>\r\n <S.SidebarTitle style={{ marginBottom: 8 }}>Create New</S.SidebarTitle>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\r\n <S.ActionButton\r\n variant=\"primary\"\r\n onClick={() => {\r\n setAddSectionOpen(false);\r\n setAddTemplateOpen(true);\r\n }}\r\n style={{ gridColumn: 'span 2', marginBottom: 4 }}\r\n >\r\n ✨ Add Templated Section\r\n </S.ActionButton>\r\n {SECTION_OPTIONS.map(({ type, label }) => (\r\n <S.ActionButton\r\n key={type}\r\n onClick={() => addSection(type, addSectionParentId)}\r\n style={{ padding: '8px 12px' }}\r\n >\r\n {label}\r\n </S.ActionButton>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {(() => {\r\n const pid = addSectionParentId;\r\n let currentIds = new Set<string>();\r\n\r\n if (pid) {\r\n const parent = data.sections.find(s => s.id === pid);\r\n if (parent?.type === \"container\") {\r\n currentIds = new Set((parent as ContainerSection).children ?? []);\r\n }\r\n } else {\r\n const page = data.pages[currentPageIndex];\r\n if (page) currentIds = new Set(page.sectionIds ?? []);\r\n }\r\n\r\n const available = data.sections;\r\n\r\n if (available.length === 0) return null;\r\n\r\n return (\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>\r\n <div>\r\n <S.SidebarTitle style={{ marginBottom: 8 }}>Copy Existing</S.SidebarTitle>\r\n <S.Select\r\n value=\"\"\r\n onChange={(e) => {\r\n const id = e.target.value;\r\n if (id) copyExistingSection(id, addSectionParentId);\r\n }}\r\n >\r\n <option value=\"\">Select section to copy...</option>\r\n {available.map(s => (\r\n <option key={s.id} value={s.id}>\r\n {getSectionLabel(s)} ({s.type})\r\n </option>\r\n ))}\r\n </S.Select>\r\n </div>\r\n <div>\r\n <S.SidebarTitle style={{ marginBottom: 8 }}>Link Existing</S.SidebarTitle>\r\n <S.Select\r\n value=\"\"\r\n onChange={(e) => {\r\n const id = e.target.value;\r\n if (id) linkExistingSection(id, addSectionParentId);\r\n }}\r\n >\r\n <option value=\"\">Select section to link...</option>\r\n {available.map(s => (\r\n <option key={s.id} value={s.id} disabled={currentIds.has(s.id)}>\r\n {getSectionLabel(s)} ({s.type}) {currentIds.has(s.id) ? \"(Already linked)\" : \"\"}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </S.ModalBody>\r\n </S.ModalContent>\r\n </S.ModalOverlay>\r\n )}\r\n\r\n {/* Add template popup */}\r\n {addTemplateOpen && (\r\n <S.ModalOverlay\r\n initial={{ opacity: 0 }}\r\n animate={{ opacity: 1 }}\r\n exit={{ opacity: 0 }}\r\n onClick={() => setAddTemplateOpen(false)}\r\n >\r\n <S.ModalContent\r\n initial={{ scale: 0.9, opacity: 0 }}\r\n animate={{ scale: 1, opacity: 1 }}\r\n exit={{ scale: 0.9, opacity: 0 }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <S.ModalHeader>\r\n <S.ModalTitle id=\"add-template-title\">Add Templated Section</S.ModalTitle>\r\n <S.CloseButton onClick={() => setAddTemplateOpen(false)} aria-label=\"Close\">\r\n <svg width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </S.CloseButton>\r\n </S.ModalHeader>\r\n <S.ModalBody>\r\n <S.ActionButton\r\n onClick={() => addTemplatedSection(\"multipleChoice\")}\r\n style={{ padding: '16px' }}\r\n >\r\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 12 }}>\r\n <div style={{ fontSize: '24px' }}>📝</div>\r\n <div>\r\n <div style={{ fontSize: '14px', fontWeight: 600 }}>Multiple Option Choice Question</div>\r\n <div style={{ fontSize: '12px', color: '#666', marginTop: 4 }}>\r\n Adds a question heading, card-style select input with image options, and a continue button\r\n </div>\r\n </div>\r\n </div>\r\n </S.ActionButton>\r\n </S.ModalBody>\r\n </S.ModalContent>\r\n </S.ModalOverlay>\r\n )}\r\n </AnimatePresence>\r\n </S.MainPreviewArea>\r\n\r\n {/* Right: section config (color-coded) */}\r\n <S.RightSidebar id=\"section-config-panel\">\r\n <S.RightSidebarContent>\r\n <S.SidebarTitle>Section config</S.SidebarTitle>\r\n {selectedSection ? (\r\n <>\r\n <div style={{ display: 'flex', justifyContent: 'flex-end', marginBottom: 12 }}>\r\n <S.DeleteButton onClick={() => removeSection(selectedSection.id)}>\r\n {selectedFromSectionList ? \"Delete from Storage\" : \"Remove from page\"}\r\n </S.DeleteButton>\r\n </div>\r\n <S.InputGroup>\r\n <S.Label>Name</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={selectedSection.name ?? \"\"}\r\n onChange={(e) =>\r\n updateSection({ ...selectedSection, name: e.target.value || undefined })\r\n }\r\n placeholder=\"Identify this section\"\r\n />\r\n </S.InputGroup>\r\n {selectedFromSectionList && (\r\n <div style={{ marginBottom: 16 }}>\r\n <S.Label>Preview</S.Label>\r\n <div style={{ marginTop: 8, padding: 12, backgroundColor: '#f9f9f9', borderRadius: 8, border: '1px solid #eee' }}>\r\n <SectionTreeRenderer\r\n sectionId={selectedSection.id}\r\n sectionsById={getSectionsById(data.sections ?? [])}\r\n isBuilderMode={true}\r\n totalPages={pages.length}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n {/* Replaced builder container colors with generic S.ConfigSection */}\r\n <S.ConfigSection $colorType={\r\n selectedSection.type === \"container\" ? \"info\" :\r\n selectedSection.type === \"input\" ? \"success\" :\r\n selectedSection.type === \"button\" ? \"primary\" :\r\n selectedSection.type === \"text\" ? \"warning\" :\r\n selectedSection.type === \"image\" ? \"secondary\" :\r\n selectedSection.type === \"divider\" ? \"secondary\" : \"secondary\"\r\n }>\r\n {selectedSection.type === \"container\" && (\r\n <ContainerConfig\r\n section={selectedSection}\r\n sectionsById={getSectionsById(data.sections ?? [])}\r\n onChange={(s) => updateSection(s)}\r\n onAddChild={() => {\r\n setAddSectionParentId(selectedSection.id);\r\n setAddSectionOpen(true);\r\n }}\r\n allSections={data.sections}\r\n />\r\n )}\r\n {selectedSection.type === \"input\" && (\r\n <InputConfig\r\n section={selectedSection}\r\n onChange={(s) => updateSection(s)}\r\n totalPages={pages.length}\r\n />\r\n )}\r\n {selectedSection.type === \"button\" && (\r\n <ButtonConfig\r\n section={selectedSection}\r\n onChange={(s) => updateSection(s)}\r\n pages={pages}\r\n />\r\n )}\r\n {selectedSection.type === \"text\" && (\r\n <TextConfig\r\n section={selectedSection}\r\n onChange={(s) => updateSection(s)}\r\n />\r\n )}\r\n {selectedSection.type === \"image\" && (\r\n <ImageConfig\r\n section={selectedSection}\r\n onChange={(s) => updateSection(s)}\r\n />\r\n )}\r\n {selectedSection.type === \"divider\" && (\r\n <DividerConfig\r\n section={selectedSection as DividerSection}\r\n onChange={(s) => updateSection(s)}\r\n />\r\n )}\r\n {selectedSection.type === \"basic\" && (\r\n <BasicComponentConfig\r\n section={selectedSection}\r\n onChange={(s) => updateSection(s)}\r\n />\r\n )}\r\n </S.ConfigSection>\r\n </>\r\n ) : (\r\n <div className=\"mt-3\">\r\n <PageConfig\r\n page={pages[safePageIndex] ?? { id: \"\", sectionIds: [] }}\r\n pageIndex={safePageIndex}\r\n onChange={(updatedPage) => updatePage(safePageIndex, updatedPage)}\r\n />\r\n <p style={{ marginTop: 16, fontSize: 13, color: '#9ca3af' }}>\r\n Click a section in the preview or add one to configure it.\r\n </p>\r\n </div>\r\n )}\r\n </S.RightSidebarContent>\r\n </S.RightSidebar>\r\n </S.MainLayout>\r\n </S.EditorContainer>\r\n </ThemeProvider>\r\n );\r\n}\r\n","import type { Section } from \"../types\";\r\n\r\n/**\r\n * Display label for a section: uses section.name when set, otherwise type-specific fallback.\r\n */\r\nexport function getSectionLabel(s: Section): string {\r\n const name = (s as { name?: string }).name?.trim();\r\n if (name) return name;\r\n switch (s.type) {\r\n case \"container\":\r\n return \"Container\";\r\n case \"input\":\r\n return (s as { label?: string }).label || \"Input\";\r\n case \"button\":\r\n return (s as { label: string }).label || \"Button\";\r\n case \"text\":\r\n return (\r\n ((s as { content?: string }).content?.slice(0, 20) || \"Text\") +\r\n (((s as { content?: string }).content?.length ?? 0) > 20 ? \"…\" : \"\")\r\n );\r\n case \"image\":\r\n return (s as { alt?: string }).alt || \"Image\";\r\n default:\r\n return \"Section\";\r\n }\r\n}\r\n","import type { TextSection, InputSection, ButtonSection } from \"../types\";\r\n\r\nexport interface TemplateConfig {\r\n text: Omit<TextSection, \"id\">;\r\n input: Omit<InputSection, \"id\" | \"fieldName\">;\r\n button: Omit<ButtonSection, \"id\">;\r\n}\r\n\r\nexport const multipleChoiceTemplate: TemplateConfig = {\r\n text: {\r\n type: \"text\",\r\n spacing: {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n },\r\n content: \"Question?\",\r\n font: \"custom\",\r\n color: \"#000000\",\r\n tag: \"h2\",\r\n bold: true,\r\n alignment: \"center\",\r\n customFontSizePx: 32,\r\n },\r\n input: {\r\n type: \"input\",\r\n spacing: {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n },\r\n placeholder: \"\",\r\n label: \"\",\r\n required: true,\r\n position: \"center\",\r\n fieldType: \"select\",\r\n selectUIType: \"card\",\r\n options: [\r\n {\r\n value: \"Single Family Home\",\r\n label: \"Single Family Home\",\r\n imageUrl:\r\n \"https://assets.prd.heyflow.com/flows/get-my-savings/www/assets/c0c3b460-f074-4d1c-baf1-2ac51a63365c/original.jpeg\",\r\n },\r\n {\r\n value: \"Manufactured Home\",\r\n label: \"Manufactured Home\",\r\n imageUrl:\r\n \"https://assets.prd.heyflow.com/flows/get-my-savings/www/assets/9eeb95e7-c1f8-477e-b38b-4f181ccce7c1/original.jpeg\",\r\n },\r\n {\r\n value: \"Apartment\",\r\n label: \"Apartment\",\r\n imageUrl:\r\n \"https://assets.prd.heyflow.com/flows/get-my-savings/www/assets/7aafd2f0-48e8-441f-af8f-40182bcbfbb5/original.png\",\r\n },\r\n {\r\n value: \"Mobile Home\",\r\n label: \"Mobile Home\",\r\n imageUrl:\r\n \"https://assets.prd.heyflow.com/flows/get-my-savings/www/assets/ba4b9426-3447-42d7-a73c-014c7a2045f2/original.jpeg\",\r\n },\r\n {\r\n value: \"Multi-Family Home\",\r\n label: \"Multi-Family Home\",\r\n imageUrl:\r\n \"https://assets.prd.heyflow.com/flows/get-my-savings/www/assets/d5b5c6fa-c93f-41ce-abcd-4891f7063d34/original.png\",\r\n },\r\n ],\r\n width: \"threeQuarter\",\r\n cardSize: \"small\",\r\n },\r\n button: {\r\n type: \"button\",\r\n spacing: {\r\n marginTop: 0,\r\n marginRight: 0,\r\n marginBottom: 0,\r\n marginLeft: 0,\r\n paddingTop: 0,\r\n paddingRight: 0,\r\n paddingBottom: 0,\r\n paddingLeft: 0,\r\n },\r\n label: \"Continue\",\r\n size: \"large\",\r\n width: \"half\",\r\n borderRadius: \"medium\",\r\n position: \"center\",\r\n textPosition: \"center\",\r\n buttonColor: \"#4f46e5\",\r\n textColor: \"#ffffff\",\r\n onClick: {\r\n type: \"goToPage\",\r\n targetPageIndex: 0, // Will be replaced dynamically\r\n },\r\n },\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.nav`\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n`;\r\n\r\nexport const Title = styled.span`\r\n font-size: 11px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n margin-bottom: 8px;\r\n display: block;\r\n`;\r\n\r\nexport const Grid = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n`;\r\n\r\nexport const PageButton = styled.button<{ $active?: boolean; $isSpecial?: boolean }>`\r\n height: 36px;\r\n min-width: 36px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 2px solid ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.border || '#e5e7eb')};\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.surface || '#ffffff')};\r\n color: ${props => props.$active ? '#ffffff' : (props.theme.colors?.text || '#1f2937')};\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n padding: ${props => props.$isSpecial ? '0 8px' : '0'};\r\n \r\n &:hover {\r\n border-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.background || '#f3f4f6')};\r\n transform: translateY(-1px);\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n }\r\n`;\r\n\r\nexport const AddButton = styled.button`\r\n height: 36px;\r\n width: 36px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 2px dashed ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n font-size: 18px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '10'};\r\n color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n transform: translateY(-1px);\r\n }\r\n`;\r\n\r\nexport const DeleteButton = styled.button`\r\n width: 100%;\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n background-color: ${props => (props.theme.colors?.error || '#ef4444') + '10'};\r\n border: 1px solid ${props => (props.theme.colors?.error || '#ef4444') + '30'};\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n margin-top: 12px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n background-color: ${props => (props.theme.colors?.error || '#ef4444') + '20'};\r\n }\r\n`;\r\n\r\nexport const ActionSection = styled.div`\r\n margin-top: 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n`;\r\n\r\nexport const ActionRow = styled.div`\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: 8px;\r\n`;\r\n\r\nexport const ActionButton = styled.button`\r\n flex: 1;\r\n padding: 6px 8px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover:not(:disabled) {\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n border-color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n`;\r\n","import React from \"react\";\r\nimport type { QuizV2Page } from \"./types\";\r\nimport * as S from \"./QuizBuilderPageNav.styles\";\r\n\r\nexport interface QuizBuilderPageNavProps {\r\n /** Number of pages (page 1, page 2, …). */\r\n count: number;\r\n /** Page data to show special page types. */\r\n pages?: QuizV2Page[];\r\n selectedIndex: number | null;\r\n onSelect: (index: number) => void;\r\n onAddPage: () => void;\r\n onDeletePage?: (index: number) => void;\r\n onDuplicatePage?: (index: number) => void;\r\n onMovePageUp?: (index: number) => void;\r\n onMovePageDown?: (index: number) => void;\r\n}\r\n\r\nexport function QuizBuilderPageNav({\r\n count,\r\n pages = [],\r\n selectedIndex,\r\n onSelect,\r\n onAddPage,\r\n onDeletePage,\r\n onDuplicatePage,\r\n onMovePageUp,\r\n onMovePageDown,\r\n}: QuizBuilderPageNavProps) {\r\n const getPageLabel = (index: number) => {\r\n const page = pages[index];\r\n if (page?.type === \"redirection\") return \"🔄\";\r\n if (page?.type === \"thankYou\") return \"✓\";\r\n return `${index + 1}`;\r\n };\r\n\r\n const getPageTitle = (index: number) => {\r\n const page = pages[index];\r\n if (page?.type === \"redirection\") return \"Redirection Page\";\r\n if (page?.type === \"thankYou\") return \"Thank You Page\";\r\n return `Page ${index + 1}`;\r\n };\r\n\r\n return (\r\n <S.Container aria-label=\"Quiz pages\">\r\n <S.Title>Pages</S.Title>\r\n <S.Grid>\r\n {Array.from({ length: count }, (_, i) => {\r\n const page = pages[i];\r\n const isSpecialPage = page?.type === \"redirection\" || page?.type === \"thankYou\";\r\n return (\r\n <S.PageButton\r\n key={i}\r\n type=\"button\"\r\n onClick={() => onSelect(i)}\r\n $active={selectedIndex === i}\r\n $isSpecial={isSpecialPage}\r\n title={getPageTitle(i)}\r\n aria-label={getPageTitle(i)}\r\n aria-current={selectedIndex === i ? \"true\" : undefined}\r\n >\r\n {getPageLabel(i)}\r\n </S.PageButton>\r\n );\r\n })}\r\n <S.AddButton\r\n type=\"button\"\r\n onClick={onAddPage}\r\n title=\"Add page\"\r\n aria-label=\"Add page\"\r\n >\r\n +\r\n </S.AddButton>\r\n </S.Grid>\r\n\r\n {selectedIndex !== null && (\r\n <S.ActionSection>\r\n <S.ActionRow>\r\n {onDuplicatePage && (\r\n <S.ActionButton\r\n type=\"button\"\r\n onClick={() => onDuplicatePage(selectedIndex)}\r\n title=\"Duplicate Page\"\r\n >\r\n Duplicate\r\n </S.ActionButton>\r\n )}\r\n <div style={{ display: 'flex', gap: 4 }}>\r\n {onMovePageUp && (\r\n <S.ActionButton\r\n type=\"button\"\r\n onClick={() => onMovePageUp(selectedIndex)}\r\n title=\"Move Up\"\r\n disabled={selectedIndex <= 0 || pages[selectedIndex]?.type !== \"regular\" || pages[selectedIndex - 1]?.type !== \"regular\"}\r\n >\r\n ↑\r\n </S.ActionButton>\r\n )}\r\n {onMovePageDown && (\r\n <S.ActionButton\r\n type=\"button\"\r\n onClick={() => onMovePageDown(selectedIndex)}\r\n title=\"Move Down\"\r\n disabled={selectedIndex >= count - 1 || pages[selectedIndex]?.type !== \"regular\" || pages[selectedIndex + 1]?.type !== \"regular\"}\r\n >\r\n ↓\r\n </S.ActionButton>\r\n )}\r\n </div>\r\n </S.ActionRow>\r\n\r\n {onDeletePage && count > 1 && (\r\n <S.DeleteButton\r\n type=\"button\"\r\n onClick={() => onDeletePage(selectedIndex)}\r\n title={`Delete page ${selectedIndex + 1}`}\r\n >\r\n Delete Page {selectedIndex + 1}\r\n </S.DeleteButton>\r\n )}\r\n </S.ActionSection>\r\n )}\r\n </S.Container>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n border-left: 4px solid ${props => props.theme.colors?.success || '#10b981'};\r\n background-color: ${props => (props.theme.colors?.success || '#10b981') + '10'};\r\n padding: 12px;\r\n width: 100%;\r\n`;\r\n\r\nexport const Header = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nexport const Title = styled.span`\r\n font-size: 11px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n`;\r\n\r\nexport const ButtonGroup = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n`;\r\n\r\nexport const LayoutButton = styled.button<{ $active?: boolean }>`\r\n border-radius: 6px;\r\n border: 1px solid ${props => props.$active ? (props.theme.colors?.success || '#10b981') : (props.theme.colors?.border || '#e5e7eb')};\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n font-weight: 500;\r\n transition: all 0.2s;\r\n background-color: ${props => props.$active ? (props.theme.colors?.success || '#10b981') + '20' : (props.theme.colors?.surface || '#ffffff')};\r\n color: ${props => props.$active ? (props.theme.colors?.success || '#10b981') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n cursor: pointer;\r\n \r\n &:hover {\r\n border-color: ${props => props.$active ? (props.theme.colors?.success || '#10b981') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n }\r\n`;\r\n\r\nexport const AddLayoutButton = styled.button`\r\n border-radius: 6px;\r\n border: 1px dashed ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n background-color: transparent;\r\n cursor: pointer;\r\n \r\n &:hover {\r\n border-color: ${props => props.theme.colors?.success || '#10b981'};\r\n color: ${props => props.theme.colors?.success || '#10b981'};\r\n background-color: ${props => (props.theme.colors?.success || '#10b981') + '10'};\r\n }\r\n`;\r\n\r\nexport const Section = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n margin-top: 12px;\r\n`;\r\n\r\nexport const SectionTitle = styled.span`\r\n font-size: 11px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n`;\r\n\r\nexport const SlotList = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n`;\r\n\r\nexport const SlotItem = styled.div`\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n border-radius: 4px;\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n padding: 6px 8px;\r\n font-size: 11px;\r\n`;\r\n\r\nexport const SlotText = styled.span`\r\n flex: 1;\r\n min-width: 0;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n`;\r\n\r\nexport const RemoveButton = styled.button`\r\n border-radius: 4px;\r\n padding: 2px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n cursor: pointer;\r\n background: transparent;\r\n border: none;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover {\r\n background-color: ${props => (props.theme.colors?.error || '#ef4444') + '10'};\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n }\r\n`;\r\n\r\nexport const AddSelect = styled.select`\r\n border-radius: 4px;\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 4px 8px;\r\n font-size: 11px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n width: 100%;\r\n cursor: pointer;\r\n \r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.success || '#10b981'};\r\n }\r\n`;\r\n\r\nexport const InfoBox = styled.div`\r\n border-radius: 4px;\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n padding: 6px 8px;\r\n font-size: 11px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n margin: 8px 0;\r\n`;\r\n","import React from \"react\";\r\nimport type { QuizV2Data, QuizV2Layout, Section } from \"./types\";\r\nimport { getSectionLabel } from \"./utils/sectionLabel\";\r\nimport * as S from \"./LayoutBuilder.styles\";\r\n\r\nexport interface LayoutBuilderProps {\r\n data: QuizV2Data;\r\n selectedLayoutId: string | null;\r\n onSelectLayout: (layoutId: string | null) => void;\r\n onLayoutChange: (layout: QuizV2Layout) => void;\r\n onAddLayout?: () => void;\r\n}\r\n\r\n/**\r\n * Edit page layouts: Header and Footer section ids. Main content = page sections (read-only).\r\n * If a page has no layout selected, first layout is used at runtime.\r\n */\r\nexport function LayoutBuilder({\r\n data,\r\n selectedLayoutId,\r\n onSelectLayout,\r\n onLayoutChange,\r\n onAddLayout,\r\n}: LayoutBuilderProps) {\r\n const layouts = data.layouts ?? [];\r\n const sections = data.sections ?? [];\r\n const sectionsById = new Map(sections.map((s) => [s.id, s]));\r\n const selectedLayout = layouts.find((l) => l.id === selectedLayoutId) ?? null;\r\n\r\n const updateSlot = (\r\n layout: QuizV2Layout,\r\n slot: \"headerSectionIds\" | \"footerSectionIds\",\r\n sectionIds: string[]\r\n ) => {\r\n onLayoutChange({ ...layout, [slot]: sectionIds });\r\n };\r\n\r\n const addToSlot = (\r\n layout: QuizV2Layout,\r\n slot: \"headerSectionIds\" | \"footerSectionIds\",\r\n sectionId: string\r\n ) => {\r\n const current = layout[slot] ?? [];\r\n if (current.includes(sectionId)) return;\r\n updateSlot(layout, slot, [...current, sectionId]);\r\n };\r\n\r\n const removeFromSlot = (\r\n layout: QuizV2Layout,\r\n slot: \"headerSectionIds\" | \"footerSectionIds\",\r\n index: number\r\n ) => {\r\n const current = layout[slot] ?? [];\r\n updateSlot(\r\n layout,\r\n slot,\r\n current.filter((_, i) => i !== index)\r\n );\r\n };\r\n\r\n return (\r\n <S.Container aria-label=\"Page layout\">\r\n <S.Header>\r\n <S.Title>Layout</S.Title>\r\n </S.Header>\r\n\r\n <S.ButtonGroup>\r\n {layouts.map((layout, index) => (\r\n <S.LayoutButton\r\n key={layout.id}\r\n type=\"button\"\r\n onClick={() =>\r\n onSelectLayout(selectedLayoutId === layout.id ? null : layout.id)\r\n }\r\n $active={selectedLayoutId === layout.id}\r\n >\r\n Layout {index + 1}\r\n </S.LayoutButton>\r\n ))}\r\n {onAddLayout && (\r\n <S.AddLayoutButton type=\"button\" onClick={onAddLayout}>\r\n + Add\r\n </S.AddLayoutButton>\r\n )}\r\n </S.ButtonGroup>\r\n\r\n {selectedLayout && (\r\n <>\r\n <S.Section>\r\n <S.SectionTitle>Header</S.SectionTitle>\r\n <SlotSectionIds\r\n sectionIds={selectedLayout.headerSectionIds ?? []}\r\n sectionsById={sectionsById}\r\n sectionLabel={getSectionLabel}\r\n onRemove={(i) =>\r\n removeFromSlot(selectedLayout, \"headerSectionIds\", i)\r\n }\r\n onAdd={(id) =>\r\n addToSlot(selectedLayout, \"headerSectionIds\", id)\r\n }\r\n allSections={sections}\r\n />\r\n </S.Section>\r\n\r\n\r\n <S.Section>\r\n <S.SectionTitle>Footer</S.SectionTitle>\r\n <SlotSectionIds\r\n sectionIds={selectedLayout.footerSectionIds ?? []}\r\n sectionsById={sectionsById}\r\n sectionLabel={getSectionLabel}\r\n onRemove={(i) =>\r\n removeFromSlot(selectedLayout, \"footerSectionIds\", i)\r\n }\r\n onAdd={(id) =>\r\n addToSlot(selectedLayout, \"footerSectionIds\", id)\r\n }\r\n allSections={sections}\r\n />\r\n </S.Section>\r\n </>\r\n )}\r\n </S.Container>\r\n );\r\n}\r\n\r\nfunction SlotSectionIds({\r\n sectionIds,\r\n sectionsById,\r\n sectionLabel,\r\n onRemove,\r\n onAdd,\r\n allSections,\r\n}: {\r\n sectionIds: string[];\r\n sectionsById: Map<string, Section>;\r\n sectionLabel: typeof getSectionLabel;\r\n onRemove: (index: number) => void;\r\n onAdd: (sectionId: string) => void;\r\n allSections: Section[];\r\n}) {\r\n const available = allSections.filter((s) => !sectionIds.includes(s.id));\r\n return (\r\n <S.SlotList>\r\n {sectionIds.map((id, index) => {\r\n const section = sectionsById.get(id);\r\n return (\r\n <S.SlotItem key={id}>\r\n <S.SlotText>\r\n {section ? sectionLabel(section) : id}\r\n </S.SlotText>\r\n <S.RemoveButton\r\n type=\"button\"\r\n onClick={() => onRemove(index)}\r\n aria-label=\"Remove\"\r\n >\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </S.RemoveButton>\r\n </S.SlotItem>\r\n );\r\n })}\r\n {available.length > 0 && (\r\n <S.AddSelect\r\n value=\"\"\r\n onChange={(e) => {\r\n const id = e.target.value;\r\n if (id) onAdd(id);\r\n e.target.value = \"\";\r\n }}\r\n >\r\n <option value=\"\">+ Add section</option>\r\n {available.map((s) => (\r\n <option key={s.id} value={s.id}>\r\n {sectionLabel(s)}\r\n </option>\r\n ))}\r\n </S.AddSelect>\r\n )}\r\n </S.SlotList>\r\n );\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport type { QuizV2Data, Section, ContainerSection } from \"./types\";\r\nimport * as S from \"./SectionListView.styles\";\r\n\r\nexport interface SectionListViewProps {\r\n data: QuizV2Data;\r\n selectedSectionId: string | null;\r\n onSelectSection: (id: string) => void;\r\n currentPageIndex: number;\r\n onClearUnused?: () => void;\r\n}\r\n\r\n/**\r\n * Displays two lists of sections:\r\n * 1. Sections relevant to the current page\r\n * 2. Completely unused sections (not used on any page)\r\n */\r\nexport function SectionListView({\r\n data,\r\n selectedSectionId,\r\n onSelectSection,\r\n currentPageIndex,\r\n onClearUnused,\r\n}: SectionListViewProps) {\r\n const sections = data.sections ?? [];\r\n const pages = data.pages ?? [];\r\n const layouts = data.layouts ?? [];\r\n\r\n // Get the current page\r\n const currentPage = pages[currentPageIndex] ?? null;\r\n const currentLayout = useMemo(() => {\r\n if (!currentPage) return null;\r\n if (currentPage.layoutId) {\r\n return layouts.find((l) => l.id === currentPage.layoutId) ?? layouts[0] ?? null;\r\n }\r\n return layouts[0] ?? null;\r\n }, [currentPage, layouts]);\r\n\r\n // Collect section IDs relevant to the current page\r\n const currentPageSectionIds = useMemo(() => {\r\n const pageIds = new Set<string>();\r\n\r\n const addContainerChildren = (sectionId: string) => {\r\n const section = sections.find((s) => s.id === sectionId);\r\n if (section?.type === \"container\") {\r\n const container = section as ContainerSection;\r\n (container.children ?? []).forEach((childId) => {\r\n pageIds.add(childId);\r\n addContainerChildren(childId);\r\n });\r\n }\r\n };\r\n\r\n if (currentPage) {\r\n (currentPage.sectionIds ?? []).forEach((id) => pageIds.add(id));\r\n }\r\n\r\n if (currentLayout) {\r\n (currentLayout.headerSectionIds ?? []).forEach((id) => pageIds.add(id));\r\n (currentLayout.footerSectionIds ?? []).forEach((id) => pageIds.add(id));\r\n }\r\n\r\n Array.from(pageIds).forEach((id) => addContainerChildren(id));\r\n return pageIds;\r\n }, [currentPage, currentLayout, sections]);\r\n\r\n // Collect all section IDs that are used anywhere in the quiz\r\n const allUsedSectionIds = useMemo(() => {\r\n const used = new Set<string>();\r\n\r\n const addContainerChildren = (sectionId: string) => {\r\n const section = sections.find((s) => s.id === sectionId);\r\n if (section?.type === \"container\") {\r\n const container = section as ContainerSection;\r\n (container.children ?? []).forEach((childId) => {\r\n used.add(childId);\r\n addContainerChildren(childId);\r\n });\r\n }\r\n };\r\n\r\n pages.forEach((page) => {\r\n (page.sectionIds ?? []).forEach((id) => used.add(id));\r\n });\r\n\r\n layouts.forEach((layout) => {\r\n (layout.headerSectionIds ?? []).forEach((id) => used.add(id));\r\n (layout.footerSectionIds ?? []).forEach((id) => used.add(id));\r\n });\r\n\r\n Array.from(used).forEach((id) => addContainerChildren(id));\r\n return used;\r\n }, [sections, pages, layouts]);\r\n\r\n const getSectionLabel = (section: Section): string => {\r\n if (section.name) return section.name;\r\n\r\n switch (section.type) {\r\n case \"container\":\r\n return \"Container\";\r\n case \"input\":\r\n return `Input: ${section.label || section.placeholder || \"Untitled\"}`;\r\n case \"button\":\r\n return `Button: ${section.label || \"Untitled\"}`;\r\n case \"text\":\r\n return `Text: ${section.content?.slice(0, 30) || \"Empty\"}${(section.content?.length ?? 0) > 30 ? \"...\" : \"\"\r\n }`;\r\n case \"image\":\r\n return `Image: ${section.alt || \"Untitled\"}`;\r\n case \"basic\":\r\n return `Progression Bar`;\r\n default:\r\n // At this point, TypeScript infers 'section' as 'never' because all cases are covered.\r\n // We return a fallback string or cast to any if we really want the type name.\r\n return `Section (${(section as any).type || \"unknown\"})`;\r\n }\r\n };\r\n\r\n const getSectionTypeIcon = (type: string): string => {\r\n switch (type) {\r\n case \"container\": return \"📦\";\r\n case \"input\": return \"📝\";\r\n case \"button\": return \"🔘\";\r\n case \"text\": return \"📄\";\r\n case \"image\": return \"🖼️\";\r\n case \"basic\": return \"📊\";\r\n default: return \"❓\";\r\n }\r\n };\r\n\r\n const sectionsById = useMemo(() => new Map(sections.map(s => [s.id, s])), [sections]);\r\n\r\n const sectionReferenceCounts = useMemo(() => {\r\n const counts = new Map<string, number>();\r\n const increment = (id: string) => counts.set(id, (counts.get(id) || 0) + 1);\r\n\r\n pages.forEach(p => (p.sectionIds ?? []).forEach(increment));\r\n layouts.forEach(l => {\r\n (l.headerSectionIds ?? []).forEach(increment);\r\n (l.footerSectionIds ?? []).forEach(increment);\r\n });\r\n sections.forEach(s => {\r\n if (s.type === \"container\") {\r\n (s as ContainerSection).children?.forEach(increment);\r\n }\r\n });\r\n return counts;\r\n }, [sections, pages, layouts]);\r\n\r\n const renderSectionHierarchy = (sectionId: string, depth: number = 0, isRed: boolean = false) => {\r\n const section = sectionsById.get(sectionId);\r\n if (!section) return null;\r\n\r\n const children = section.type === \"container\" ? (section as ContainerSection).children ?? [] : [];\r\n const isShared = (sectionReferenceCounts.get(section.id) ?? 0) > 1;\r\n\r\n return (\r\n <React.Fragment key={section.id}>\r\n <S.SectionItem\r\n $active={selectedSectionId === section.id}\r\n $depth={depth}\r\n $red={isRed}\r\n onClick={() => onSelectSection(section.id)}\r\n >\r\n <S.Icon aria-hidden>{getSectionTypeIcon(section.type)}</S.Icon>\r\n <S.Content>\r\n <S.Label>{getSectionLabel(section)}</S.Label>\r\n <div style={{ display: 'flex', gap: 4 }}>\r\n {isRed && <S.UnusedBadge>Unused</S.UnusedBadge>}\r\n {isShared && <S.SharedBadge>Shared</S.SharedBadge>}\r\n </div>\r\n </S.Content>\r\n </S.SectionItem>\r\n {children.map(childId => renderSectionHierarchy(childId, depth + 1, isRed))}\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n // Sections that are roots for the current page\r\n const pageRootIds = useMemo(() => {\r\n const roots = new Set<string>();\r\n if (currentPage) (currentPage.sectionIds ?? []).forEach(id => roots.add(id));\r\n if (currentLayout) {\r\n (currentLayout.headerSectionIds ?? []).forEach(id => roots.add(id));\r\n (currentLayout.footerSectionIds ?? []).forEach(id => roots.add(id));\r\n }\r\n return Array.from(roots);\r\n }, [currentPage, currentLayout]);\r\n\r\n // Sections that are not used anywhere\r\n const unusedRootIds = useMemo(() => {\r\n // A section is an \"unused root\" if it is not in allUsedSectionIds AND it is not a child of another section\r\n const childIds = new Set<string>();\r\n sections.forEach(s => {\r\n if (s.type === \"container\") {\r\n (s as ContainerSection).children?.forEach(cid => childIds.add(cid));\r\n }\r\n });\r\n\r\n return sections\r\n .filter(s => !allUsedSectionIds.has(s.id) && !childIds.has(s.id))\r\n .map(s => s.id);\r\n }, [sections, allUsedSectionIds]);\r\n\r\n return (\r\n <S.Container>\r\n <S.Group>\r\n <S.Title>Current Page ({currentPageSectionIds.size})</S.Title>\r\n <S.ListBox>\r\n {pageRootIds.length === 0 ? (\r\n <S.EmptyText>No sections on this page.</S.EmptyText>\r\n ) : (\r\n pageRootIds.map(id => renderSectionHierarchy(id))\r\n )}\r\n </S.ListBox>\r\n </S.Group>\r\n\r\n {unusedRootIds.length > 0 && (\r\n <S.Group>\r\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\r\n <S.Title $red style={{ marginBottom: 0 }}>Unused ({sections.filter(s => !allUsedSectionIds.has(s.id)).length})</S.Title>\r\n {onClearUnused && (\r\n <S.ClearButton onClick={(e) => {\r\n e.stopPropagation();\r\n if (window.confirm(\"Are you sure you want to permanently delete all unused sections from storage?\")) {\r\n onClearUnused();\r\n }\r\n }}>\r\n Clear All\r\n </S.ClearButton>\r\n )}\r\n </div>\r\n <S.ListBox $red>\r\n {unusedRootIds.map(id => renderSectionHierarchy(id, 0, true))}\r\n </S.ListBox>\r\n </S.Group>\r\n )}\r\n </S.Container>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n border-top: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding-top: 16px;\r\n gap: 16px;\r\n`;\r\n\r\nexport const Group = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nexport const Title = styled.span<{ $red?: boolean }>`\r\n font-size: 11px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n color: ${props => props.$red ? (props.theme.colors?.error || '#ef4444') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n margin-bottom: 8px;\r\n`;\r\n\r\nexport const ListBox = styled.div<{ $red?: boolean }>`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n max-height: 420px;\r\n overflow-y: auto;\r\n border: 1px solid ${props => props.$red ? (props.theme.colors?.error || '#ef4444') + '40' : (props.theme.colors?.border || '#e5e7eb')};\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n padding: 8px;\r\n background-color: ${props => props.$red ? (props.theme.colors?.error || '#ef4444') + '05' : (props.theme.colors?.background || '#f3f4f6')};\r\n`;\r\n\r\nexport const SectionItem = styled.button<{ $active?: boolean; $red?: boolean; $depth?: number }>`\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 8px;\r\n border-radius: 8px;\r\n padding: 8px 10px;\r\n padding-left: ${props => 10 + (props.$depth || 0) * 16}px;\r\n text-align: left;\r\n font-size: 12px;\r\n transition: all 0.2s;\r\n border: none;\r\n cursor: pointer;\r\n width: 100%;\r\n \r\n ${props => {\r\n if (props.$red) {\r\n return props.$active ? `\r\n background-color: ${props.theme.colors?.error || '#ef4444'};\r\n color: #ffffff;\r\n font-weight: 600;\r\n ` : `\r\n background-color: transparent;\r\n color: ${props.theme.colors?.error || '#ef4444'};\r\n &:hover { background-color: ${(props.theme.colors?.error || '#ef4444') + '20'}; }\r\n `;\r\n }\r\n return props.$active ? `\r\n background-color: ${props.theme.colors?.primary || '#6366f1'};\r\n color: #ffffff;\r\n font-weight: 600;\r\n box-shadow: ${props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n ` : `\r\n background-color: transparent;\r\n color: ${props.theme.colors?.text || '#1f2937'};\r\n &:hover { background-color: ${(props.theme.colors?.primary || '#6366f1') + '10'}; }\r\n `;\r\n }}\r\n`;\r\n\r\nexport const Icon = styled.span`\r\n font-size: 16px;\r\n line-height: 1;\r\n`;\r\n\r\nexport const Content = styled.div`\r\n flex: 1;\r\n min-width: 0;\r\n`;\r\n\r\nexport const Label = styled.div`\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n`;\r\n\r\nexport const UnusedBadge = styled.div`\r\n font-size: 10px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n margin-top: 2px;\r\n opacity: 0.8;\r\n`;\r\n\r\nexport const EmptyText = styled.p`\r\n font-size: 12px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n font-style: italic;\r\n padding: 12px;\r\n text-align: center;\r\n`;\r\n\r\nexport const ClearButton = styled.button`\r\n background: transparent;\r\n border: 1px solid ${props => (props.theme.colors?.error || '#ef4444') + '40'};\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n font-size: 10px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n padding: 4px 8px;\r\n border-radius: 6px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n background-color: ${props => (props.theme.colors?.error || '#ef4444') + '10'};\r\n border-color: ${props => props.theme.colors?.error || '#ef4444'};\r\n }\r\n`;\r\n\r\nexport const SharedBadge = styled.div`\r\n font-size: 9px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n margin-top: 2px;\r\n color: inherit;\r\n background: rgba(255, 255, 255, 0.2);\r\n padding: 1px 4px;\r\n border-radius: 4px;\r\n display: inline-block;\r\n opacity: 0.9;\r\n border: 1px solid rgba(255, 255, 255, 0.3);\r\n`;\r\n","import type { QuizV2Data, QuizV2Page, QuizV2Layout, Section } from \"../types\";\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return a === b;\r\n if (typeof a !== \"object\" || typeof b !== \"object\") return a === b;\r\n const keysA = Object.keys(a as object);\r\n const keysB = Object.keys(b as object);\r\n if (keysA.length !== keysB.length) return false;\r\n for (const k of keysA) {\r\n if (!keysB.includes(k)) return false;\r\n if (\r\n !deepEqual(\r\n (a as Record<string, unknown>)[k],\r\n (b as Record<string, unknown>)[k]\r\n )\r\n )\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isConfigEqual(\r\n a: Record<string, unknown> | undefined,\r\n b: Record<string, unknown> | undefined\r\n): boolean {\r\n return deepEqual(a ?? {}, b ?? {});\r\n}\r\n\r\nexport function isSectionsEqual(\r\n a: Section[] | undefined,\r\n b: Section[] | undefined\r\n): boolean {\r\n return deepEqual(a ?? [], b ?? []);\r\n}\r\n\r\nexport function isPagesEqual(\r\n a: QuizV2Page[] | undefined,\r\n b: QuizV2Page[] | undefined\r\n): boolean {\r\n return deepEqual(a ?? [], b ?? []);\r\n}\r\n\r\nexport function isLayoutsEqual(\r\n a: QuizV2Layout[] | undefined,\r\n b: QuizV2Layout[] | undefined\r\n): boolean {\r\n return deepEqual(a ?? [], b ?? []);\r\n}\r\n\r\n/** Returns true if current data differs from last saved (or never saved). */\r\nexport function isDirty(\r\n current: QuizV2Data,\r\n lastSaved: QuizV2Data | null\r\n): boolean {\r\n if (lastSaved == null) return true;\r\n if (current.id !== lastSaved.id) return true;\r\n if (!isConfigEqual(current.config, lastSaved.config)) return true;\r\n if (!isSectionsEqual(current.sections, lastSaved.sections)) return true;\r\n if (!isLayoutsEqual(current.layouts, lastSaved.layouts)) return true;\r\n if (!isPagesEqual(current.pages, lastSaved.pages)) return true;\r\n return false;\r\n}\r\n\r\n/** Section ids that are new or modified compared to last saved. */\r\nexport function getChangedSectionIds(\r\n current: QuizV2Data,\r\n lastSaved: QuizV2Data | null\r\n): Set<string> {\r\n const changed = new Set<string>();\r\n if (lastSaved == null) {\r\n (current.sections ?? []).forEach((s) => changed.add(s.id));\r\n return changed;\r\n }\r\n const savedMap = new Map((lastSaved.sections ?? []).map((s) => [s.id, s]));\r\n for (const section of current.sections ?? []) {\r\n const saved = savedMap.get(section.id);\r\n if (!saved || !deepEqual(section, saved)) changed.add(section.id);\r\n }\r\n return changed;\r\n}\r\n\r\n/** True if global config (data.config) has changed compared to last saved. */\r\nexport function isConfigChanged(\r\n current: QuizV2Data,\r\n lastSaved: QuizV2Data | null\r\n): boolean {\r\n if (lastSaved == null) return true;\r\n return !isConfigEqual(current.config, lastSaved.config);\r\n}\r\n","import React from \"react\";\r\nimport type { Section, ContainerSection } from \"../types\";\r\nimport { SectionRenderer } from \"./SectionRenderer\";\r\n\r\nexport interface BuilderSectionTreeProps {\r\n sectionId: string;\r\n sectionsById: Map<string, Section>;\r\n selectedSectionId: string | null;\r\n changedSectionIds: Set<string>;\r\n onSelectSection: (id: string) => void;\r\n /** Optional: Show reorder buttons and enable reordering */\r\n onMoveUp?: (id: string) => void;\r\n onMoveDown?: (id: string) => void;\r\n canMoveUp?: boolean;\r\n canMoveDown?: boolean;\r\n /** Total number of pages (for progress bar calculation). */\r\n totalPages?: number;\r\n /** Current page index (for progress bar calculation). */\r\n currentPageIndex?: number;\r\n}\r\n\r\n/**\r\n * Renders one section in the builder with clickable wrapper; if container, renders children recursively.\r\n */\r\nexport function BuilderSectionTree({\r\n sectionId,\r\n sectionsById,\r\n selectedSectionId,\r\n changedSectionIds,\r\n onSelectSection,\r\n onMoveUp,\r\n onMoveDown,\r\n canMoveUp,\r\n canMoveDown,\r\n totalPages = 1,\r\n currentPageIndex = 0,\r\n}: BuilderSectionTreeProps) {\r\n const section = sectionsById.get(sectionId);\r\n if (!section) return null;\r\n\r\n const isChanged = changedSectionIds.has(section.id);\r\n const isSelected = selectedSectionId === section.id;\r\n\r\n const block = (\r\n <div\r\n role=\"button\"\r\n tabIndex={0}\r\n onClick={(e) => {\r\n // Always select the section when clicking anywhere in builder mode\r\n // Disabled inputs (from isBuilderMode) will still trigger this\r\n e.stopPropagation();\r\n onSelectSection(section.id);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n onSelectSection(section.id);\r\n }\r\n }}\r\n className={`relative rounded-lg border-2 transition-colors ${isSelected\r\n ? \"border-indigo-500 bg-indigo-50/30 ring-2 ring-indigo-500/20\"\r\n : \"border-transparent bg-white hover:border-gray-200 hover:bg-gray-50/50\"\r\n } ${isChanged ? \"ring-2 ring-amber-400/50\" : \"\"}`}\r\n >\r\n {isChanged && (\r\n <span\r\n className=\"absolute right-2 top-2 z-10 rounded bg-amber-500 px-2 py-0.5 text-[10px] font-medium text-white\"\r\n aria-hidden\r\n >\r\n Modified\r\n </span>\r\n )}\r\n {(onMoveUp || onMoveDown) && (\r\n <div className=\"absolute right-2 top-2 z-10 flex flex-col gap-1\">\r\n {onMoveUp && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveUp(section.id);\r\n }}\r\n disabled={!canMoveUp}\r\n className=\"flex h-6 w-6 items-center justify-center rounded bg-white border border-gray-300 text-gray-600 hover:bg-gray-50 disabled:opacity-30 disabled:cursor-not-allowed\"\r\n title=\"Move up\"\r\n >\r\n ↑\r\n </button>\r\n )}\r\n {onMoveDown && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onMoveDown(section.id);\r\n }}\r\n disabled={!canMoveDown}\r\n className=\"flex h-6 w-6 items-center justify-center rounded bg-white border border-gray-300 text-gray-600 hover:bg-gray-50 disabled:opacity-30 disabled:cursor-not-allowed\"\r\n title=\"Move down\"\r\n >\r\n ↓\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {section.type === \"container\" ? (\r\n <SectionRenderer section={section} isBuilderMode={true} totalPages={totalPages} currentPageIndex={currentPageIndex}>\r\n {((section as ContainerSection).children ?? [])\r\n .filter((childId) => sectionsById.has(childId))\r\n .map((childId) => (\r\n <BuilderSectionTree\r\n key={childId}\r\n sectionId={childId}\r\n sectionsById={sectionsById}\r\n selectedSectionId={selectedSectionId}\r\n changedSectionIds={changedSectionIds}\r\n onSelectSection={onSelectSection}\r\n totalPages={totalPages}\r\n currentPageIndex={currentPageIndex}\r\n />\r\n ))}\r\n </SectionRenderer>\r\n ) : (\r\n <SectionRenderer section={section} isBuilderMode={true} totalPages={totalPages} currentPageIndex={currentPageIndex} />\r\n )}\r\n </div>\r\n );\r\n\r\n return block;\r\n}\r\n","import styled, { css } from 'styled-components';\r\n\r\nexport const ConfigContainer = styled.div<{ $variant?: 'primary' | 'secondary' | 'success' | 'warning' }>`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 16px;\r\n padding: 16px;\r\n border-radius: ${props => props.theme.radii?.medium || '16px'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n \r\n ${props => {\r\n switch (props.$variant) {\r\n case 'primary': return css`border-left: 4px solid ${props.theme.colors?.primary || '#6366f1'}; background-color: ${(props.theme.colors?.primary || '#6366f1') + '05'};`;\r\n case 'success': return css`border-left: 4px solid ${props.theme.colors?.success || '#10b981'}; background-color: ${(props.theme.colors?.success || '#10b981') + '05'};`;\r\n case 'warning': return css`border-left: 4px solid ${props.theme.colors?.warning || '#f59e0b'}; background-color: ${(props.theme.colors?.warning || '#f59e0b') + '05'};`;\r\n default: return css`border-left: 4px solid ${props.theme.colors?.textSecondary || '#6b7280'};`;\r\n }\r\n }}\r\n`;\r\n\r\nexport const FieldGroup = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n`;\r\n\r\nexport const Label = styled.label`\r\n font-size: 11px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n`;\r\n\r\nexport const Input = styled.input`\r\n width: 100%;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 8px 12px;\r\n font-size: 13px;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n transition: all 0.2s;\r\n \r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n box-shadow: 0 0 0 3px ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n }\r\n`;\r\n\r\nexport const TextArea = styled.textarea`\r\n width: 100%;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 8px 12px;\r\n font-size: 13px;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n transition: all 0.2s;\r\n resize: vertical;\r\n \r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n box-shadow: 0 0 0 3px ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n }\r\n`;\r\n\r\nexport const Select = styled.select`\r\n width: 100%;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 8px 12px;\r\n font-size: 13px;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n cursor: pointer;\r\n \r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n }\r\n`;\r\n\r\nexport const ButtonToggleGroup = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n`;\r\n\r\nexport const ToggleButton = styled.button<{ $active?: boolean }>`\r\n border-radius: 8px;\r\n border: 1px solid ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.border || '#e5e7eb')};\r\n padding: 6px 12px;\r\n font-size: 11px;\r\n font-weight: 600;\r\n transition: all 0.2s;\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '15' : (props.theme.colors?.surface || '#ffffff')};\r\n color: ${props => props.$active ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n cursor: pointer;\r\n \r\n &:hover {\r\n border-color: ${props => props.$active ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '20' : (props.theme.colors?.background || '#f3f4f6')};\r\n }\r\n`;\r\n\r\nexport const CheckboxGroup = styled.div`\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n cursor: pointer;\r\n`;\r\n\r\nexport const Checkbox = styled.input`\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 4px;\r\n accent-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n cursor: pointer;\r\n`;\r\n\r\nexport const OptionCard = styled.div`\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n overflow: hidden;\r\n margin-bottom: 8px;\r\n`;\r\n\r\nexport const ActionRow = styled.div`\r\n display: flex;\r\n border-top: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n`;\r\n\r\nexport const ActionButton = styled.button<{ $variant?: 'primary' | 'danger' | 'success' }>`\r\n flex: 1;\r\n padding: 8px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n border: none;\r\n background: transparent;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n ${props => {\r\n switch (props.$variant) {\r\n case 'danger': return css`color: ${props.theme.colors?.error || '#ef4444'}; &:hover { background-color: ${(props.theme.colors?.error || '#ef4444') + '15'}; }`;\r\n case 'success': return css`color: ${props.theme.colors?.success || '#10b981'}; &:hover { background-color: ${(props.theme.colors?.success || '#10b981') + '15'}; }`;\r\n case 'primary': return css`color: ${props.theme.colors?.primary || '#6366f1'}; &:hover { background-color: ${(props.theme.colors?.primary || '#6366f1') + '15'}; }`;\r\n default: return css`color: ${props.theme.colors?.textSecondary || '#6b7280'}; &:hover { background-color: ${(props.theme.colors?.textSecondary || '#6b7280') + '10'}; }`;\r\n }\r\n }}\r\n \r\n &:not(:last-child) {\r\n border-right: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n }\r\n`;\r\n","import React from \"react\";\r\nimport type { Spacing, SectionType } from \"../types\";\r\nimport { DEFAULT_SPACING, getDefaultSpacingForType } from \"../defaults\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst FIELDS: { key: keyof Spacing; label: string }[] = [\r\n { key: \"marginTop\", label: \"Margin Top\" },\r\n { key: \"marginRight\", label: \"Margin Right\" },\r\n { key: \"marginBottom\", label: \"Margin Bottom\" },\r\n { key: \"marginLeft\", label: \"Margin Left\" },\r\n { key: \"paddingTop\", label: \"Padding Top\" },\r\n { key: \"paddingRight\", label: \"Padding Right\" },\r\n { key: \"paddingBottom\", label: \"Padding Bottom\" },\r\n { key: \"paddingLeft\", label: \"Padding Left\" },\r\n];\r\n\r\nexport interface SpacingConfigProps {\r\n spacing: Spacing | undefined;\r\n onChange: (spacing: Spacing) => void;\r\n /** Section type for type-specific default when a value is omitted. */\r\n sectionType?: SectionType;\r\n}\r\n\r\nexport function SpacingConfig({ spacing, onChange, sectionType }: SpacingConfigProps) {\r\n const fallback = sectionType ? getDefaultSpacingForType(sectionType) : DEFAULT_SPACING;\r\n const value = (k: keyof Spacing) =>\r\n spacing?.[k] ?? fallback[k] ?? \"\";\r\n\r\n const set = (k: keyof Spacing, v: number | \"\") => {\r\n const num = v === \"\" ? undefined : Number(v);\r\n if (num !== undefined && (Number.isNaN(num) || num < 0)) return;\r\n onChange({ ...(spacing ?? {}), [k]: num });\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\r\n <S.Label>Spacing (px)</S.Label>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8 }}>\r\n {FIELDS.map(({ key, label }) => (\r\n <S.FieldGroup key={key}>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>{label}</span>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n value={value(key)}\r\n onChange={(e) => set(key, e.target.value === \"\" ? \"\" : e.target.valueAsNumber)}\r\n style={{ padding: '6px 10px', fontSize: 12 }}\r\n />\r\n </S.FieldGroup>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nexport interface FlexConfigProps {\r\n flex: number | undefined;\r\n onChange: (flex: number | undefined) => void;\r\n}\r\n\r\nconst FLEX_PRESETS = [\r\n { value: undefined, label: \"Auto\" },\r\n { value: 1, label: \"Flex 1\" },\r\n { value: 2, label: \"Flex 2\" },\r\n { value: 3, label: \"Flex 3\" },\r\n];\r\n\r\nexport function FlexConfig({ flex, onChange }: FlexConfigProps) {\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\r\n <S.Label>Flex (Parent Layout)</S.Label>\r\n <S.ButtonToggleGroup>\r\n {FLEX_PRESETS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={label}\r\n type=\"button\"\r\n onClick={() => onChange(value)}\r\n $active={flex === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Custom Flex Value</span>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n step={0.1}\r\n value={flex ?? \"\"}\r\n onChange={(e) => {\r\n const val = e.target.value;\r\n onChange(val === \"\" ? undefined : parseFloat(val));\r\n }}\r\n placeholder=\"e.g. 1.5 (Auto if empty)\"\r\n />\r\n </S.FieldGroup>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { BackgroundStyle, BorderPreset, BoxShadowPreset, BorderRadiusPreset } from \"../types\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst BORDER_PRESETS: { value: BorderPreset; label: string }[] = [\r\n { value: \"none\", label: \"None\" },\r\n { value: \"thin\", label: \"Thin\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"thick\", label: \"Thick\" },\r\n { value: \"dashed\", label: \"Dashed\" },\r\n { value: \"dotted\", label: \"Dotted\" },\r\n];\r\n\r\nconst BORDER_RADIUS_PRESETS: { value: BorderRadiusPreset; label: string }[] = [\r\n { value: \"none\", label: \"None\" },\r\n { value: \"sm\", label: \"Small\" },\r\n { value: \"md\", label: \"Medium\" },\r\n { value: \"lg\", label: \"Large\" },\r\n { value: \"xl\", label: \"XL\" },\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst BOX_SHADOW_PRESETS: { value: BoxShadowPreset; label: string }[] = [\r\n { value: \"none\", label: \"None\" },\r\n { value: \"sm\", label: \"Small\" },\r\n { value: \"md\", label: \"Medium\" },\r\n { value: \"lg\", label: \"Large\" },\r\n { value: \"xl\", label: \"XL\" },\r\n { value: \"inner\", label: \"Inner\" },\r\n];\r\n\r\nexport interface BackgroundConfigProps {\r\n backgroundStyle: BackgroundStyle | undefined;\r\n onChange: (backgroundStyle: BackgroundStyle) => void;\r\n}\r\n\r\nexport function BackgroundConfig({ backgroundStyle, onChange }: BackgroundConfigProps) {\r\n const style = backgroundStyle ?? {};\r\n\r\n const set = <K extends keyof BackgroundStyle>(key: K, value: BackgroundStyle[K]) => {\r\n onChange({ ...style, [key]: value });\r\n };\r\n\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\r\n <S.Label>Background & Border</S.Label>\r\n\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Background Color</span>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={style.backgroundColor || \"#ffffff\"}\r\n onChange={(e) => set(\"backgroundColor\", e.target.value)}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={style.backgroundColor || \"\"}\r\n onChange={(e) => set(\"backgroundColor\", e.target.value || undefined)}\r\n placeholder=\"#ffffff or transparent\"\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Border Style</span>\r\n <S.ButtonToggleGroup>\r\n {BORDER_PRESETS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => set(\"borderPreset\", value)}\r\n $active={(style.borderPreset ?? \"none\") === value}\r\n style={{ fontSize: 10 }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n {style.borderPreset && style.borderPreset !== \"none\" && (\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Border Color</span>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={style.borderColor || \"#e5e7eb\"}\r\n onChange={(e) => set(\"borderColor\", e.target.value)}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={style.borderColor || \"\"}\r\n onChange={(e) => set(\"borderColor\", e.target.value || undefined)}\r\n placeholder=\"#e5e7eb\"\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n )}\r\n\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Border Radius</span>\r\n <S.ButtonToggleGroup>\r\n {BORDER_RADIUS_PRESETS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => set(\"borderRadiusPreset\", value)}\r\n $active={(style.borderRadiusPreset ?? \"none\") === value}\r\n style={{ fontSize: 10 }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {style.borderRadiusPreset === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Radius (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n value={style.customBorderRadiusPx ?? 8}\r\n onChange={(e) =>\r\n set(\"customBorderRadiusPx\", e.target.value === \"\" ? undefined : parseInt(e.target.value, 10))\r\n }\r\n style={{ width: 64 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Box Shadow</span>\r\n <S.ButtonToggleGroup>\r\n {BOX_SHADOW_PRESETS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => set(\"boxShadowPreset\", value)}\r\n $active={(style.boxShadowPreset ?? \"none\") === value}\r\n style={{ fontSize: 10 }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuizV2Data } from \"../types\";\r\nimport * as S from \"./ConfigStyles\";\r\nimport styled from 'styled-components';\r\n\r\nconst UnsavedBadge = styled.span`\r\n background-color: ${props => props.theme.colors?.warning || '#f59e0b'}20;\r\n color: ${props => props.theme.colors?.warningDark || '#b45309'};\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n font-size: 9px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n`;\r\n\r\nexport interface GlobalConfigProps {\r\n data: QuizV2Data;\r\n onChange: (config: Record<string, unknown>) => void;\r\n /** When true, show visual that this panel has unsaved changes. */\r\n hasUnsavedChanges?: boolean;\r\n}\r\n\r\nconst LAYOUT_OPTIONS = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"full\", label: \"Full\" },\r\n] as const;\r\n\r\nexport function GlobalConfig({\r\n data,\r\n onChange,\r\n hasUnsavedChanges = false,\r\n}: GlobalConfigProps) {\r\n const config = data.config ?? {};\r\n const layoutMaxWidth = (config.layoutMaxWidth as string) ?? \"medium\";\r\n const quizTitle = (config.quizTitle as string) ?? \"\";\r\n const quizDescription = (config.quizDescription as string) ?? \"\";\r\n\r\n const set = (key: string, value: unknown) => {\r\n onChange({ ...config, [key]: value });\r\n };\r\n\r\n return (\r\n <S.ConfigContainer $variant={hasUnsavedChanges ? 'warning' : 'primary'}>\r\n <S.FieldGroup>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\r\n <S.Label>Layout-level config</S.Label>\r\n {hasUnsavedChanges && (\r\n <UnsavedBadge>Unsaved</UnsavedBadge>\r\n )}\r\n </div>\r\n <p style={{ fontSize: 10, color: '#6b7280', marginTop: -2 }}>\r\n Applied to every page of this quiz.\r\n </p>\r\n </S.FieldGroup>\r\n\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12, marginTop: 4 }}>\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Layout max width</S.Label>\r\n <S.Select\r\n value={layoutMaxWidth}\r\n onChange={(e) => set(\"layoutMaxWidth\", e.target.value)}\r\n >\r\n {LAYOUT_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Quiz title</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={quizTitle}\r\n onChange={(e) => set(\"quizTitle\", e.target.value)}\r\n placeholder=\"Optional title\"\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Quiz description</S.Label>\r\n <S.Input\r\n as=\"textarea\"\r\n value={quizDescription}\r\n onChange={(e: any) => set(\"quizDescription\", e.target.value)}\r\n placeholder=\"Optional description\"\r\n rows={3}\r\n style={{ minHeight: 60, resize: 'vertical' }}\r\n />\r\n </S.FieldGroup>\r\n </div>\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { QuizV2Page } from \"../types\";\r\nimport * as S from \"./ConfigStyles\";\r\nimport styled from 'styled-components';\r\n\r\nconst Badge = styled.span<{ $variant?: 'blue' | 'green' | 'gray' }>`\r\n display: inline-flex;\r\n align-items: center;\r\n padding: 2px 8px;\r\n border-radius: 6px;\r\n font-size: 10px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n \r\n ${props => {\r\n switch (props.$variant) {\r\n case 'blue': return `background-color: #dbeafe; color: #1e40af;`;\r\n case 'green': return `background-color: #dcfce7; color: #166534;`;\r\n default: return `background-color: #f3f4f6; color: #374151;`;\r\n }\r\n }}\r\n`;\r\n\r\nconst InfoBox = styled.div<{ $warning?: boolean }>`\r\n padding: 10px 12px;\r\n border-radius: 12px;\r\n font-size: 11px;\r\n line-height: 1.5;\r\n \r\n ${props => props.$warning ? `\r\n background-color: #fffbeb;\r\n color: #92400e;\r\n border: 1px solid #fde68a;\r\n ` : `\r\n background-color: #f8fafc;\r\n color: #475569;\r\n border: 1px solid #e2e8f0;\r\n `}\r\n`;\r\n\r\nexport interface PageConfigProps {\r\n page: QuizV2Page;\r\n pageIndex: number;\r\n onChange: (page: QuizV2Page) => void;\r\n}\r\n\r\nexport function PageConfig({ page, pageIndex, onChange }: PageConfigProps) {\r\n const isSpecialPage = page.type === \"redirection\" || page.type === \"thankYou\";\r\n\r\n if (!isSpecialPage) {\r\n return (\r\n <S.ConfigContainer $variant=\"primary\">\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <h3 style={{ fontSize: 14, fontWeight: 700, margin: 0 }}>Page {pageIndex + 1}</h3>\r\n <Badge>Regular Page</Badge>\r\n </div>\r\n <InfoBox>\r\n 💡 Add sections to this page using the <strong>+ button</strong> in the section tree or by selecting sections from the list.\r\n </InfoBox>\r\n </S.ConfigContainer>\r\n );\r\n }\r\n\r\n if (page.type === \"redirection\") {\r\n return (\r\n <S.ConfigContainer $variant=\"primary\">\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <h3 style={{ fontSize: 14, fontWeight: 700, margin: 0 }}>🔄 Redirection Page</h3>\r\n <Badge $variant=\"blue\">Special Page</Badge>\r\n </div>\r\n <InfoBox>\r\n Automatically redirects users after a countdown. You can add sections above the countdown.\r\n </InfoBox>\r\n <InfoBox $warning>\r\n ⚠️ This page cannot be deleted\r\n </InfoBox>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Redirect URL</S.Label>\r\n <S.Input\r\n type=\"url\"\r\n value={page.redirectUrl || \"\"}\r\n onChange={(e) => onChange({ ...page, redirectUrl: e.target.value })}\r\n placeholder=\"https://example.com\"\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Countdown Duration (s)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n min={1}\r\n max={60}\r\n value={page.redirectCountdownSeconds ?? 5}\r\n onChange={(e) =>\r\n onChange({\r\n ...page,\r\n redirectCountdownSeconds: parseInt(e.target.value, 10) || 5,\r\n })\r\n }\r\n />\r\n </S.FieldGroup>\r\n </S.ConfigContainer>\r\n );\r\n }\r\n\r\n if (page.type === \"thankYou\") {\r\n return (\r\n <S.ConfigContainer $variant=\"success\">\r\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <h3 style={{ fontSize: 14, fontWeight: 700, margin: 0 }}>✓ Thank You Page</h3>\r\n <Badge $variant=\"green\">Special Page</Badge>\r\n </div>\r\n <InfoBox>\r\n Automatically submits the form and shows a success message.\r\n </InfoBox>\r\n <InfoBox>\r\n 💡 Add custom sections to personalize the thank you message.\r\n </InfoBox>\r\n <InfoBox $warning>\r\n ⚠️ This page cannot be deleted\r\n </InfoBox>\r\n </S.ConfigContainer>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n","import React from \"react\";\r\nimport type { ContainerSection, Section, ContainerLayout } from \"../types\";\r\nimport { DEFAULT_CONTAINER_LAYOUT } from \"../defaults\";\r\nimport { getSectionLabel } from \"../utils/sectionLabel\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\nimport styled from 'styled-components';\r\n\r\nconst ChildList = styled.ul`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n`;\r\n\r\nconst ChildItem = styled.li`\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n border-radius: 12px;\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n padding: 8px 12px;\r\n font-size: 12px;\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n`;\r\n\r\nconst OrderControls = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nconst OrderButton = styled.button`\r\n border: none;\r\n background: transparent;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n padding: 2px;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover:not(:disabled) {\r\n color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '10'};\r\n border-radius: 4px;\r\n }\r\n \r\n &:disabled {\r\n opacity: 0.2;\r\n cursor: not-allowed;\r\n }\r\n`;\r\n\r\nconst AddChildButton = styled.button`\r\n width: 100%;\r\n margin-top: 8px;\r\n border-radius: 12px;\r\n border: 2px dashed ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n padding: 10px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '05'};\r\n }\r\n`;\r\n\r\nexport interface ContainerConfigProps {\r\n section: ContainerSection;\r\n sectionsById: Map<string, Section>;\r\n onChange: (section: ContainerSection) => void;\r\n /** Call to open \"Add section\" popup with this container as parent (add as child). */\r\n onAddChild?: () => void;\r\n /** List of existing sections that can be linked as children. */\r\n allSections?: Section[];\r\n}\r\n\r\nexport function ContainerConfig({\r\n section,\r\n sectionsById,\r\n onChange,\r\n onAddChild,\r\n allSections = [],\r\n}: ContainerConfigProps) {\r\n const childIds = section.children ?? [];\r\n\r\n const removeChild = (childId: string) => {\r\n const children = childIds.filter((id) => id !== childId);\r\n onChange({ ...section, children });\r\n };\r\n\r\n const moveChild = (fromIndex: number, direction: \"up\" | \"down\") => {\r\n const toIndex = direction === \"up\" ? fromIndex - 1 : fromIndex + 1;\r\n if (toIndex < 0 || toIndex >= childIds.length) return;\r\n const next = [...childIds];\r\n [next[fromIndex], next[toIndex]] = [next[toIndex], next[fromIndex]];\r\n onChange({ ...section, children: next });\r\n };\r\n\r\n const layout: ContainerLayout = {\r\n ...DEFAULT_CONTAINER_LAYOUT,\r\n ...section.layout,\r\n flexWrap: section.layout?.flexWrap ?? ((section.layout as any)?.wrap ? \"wrap\" : undefined),\r\n };\r\n\r\n const setLayout = (key: keyof ContainerLayout, value: ContainerLayout[keyof ContainerLayout]) => {\r\n onChange({ ...section, layout: { ...layout, [key]: value } });\r\n };\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"secondary\">\r\n <S.FieldGroup>\r\n <S.Label>Flex layout</S.Label>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Direction</span>\r\n <S.Select\r\n value={layout.flexDirection ?? \"column\"}\r\n onChange={(e) => setLayout(\"flexDirection\", e.target.value as \"row\" | \"column\")}\r\n >\r\n <option value=\"column\">Column</option>\r\n <option value=\"row\">Row</option>\r\n </S.Select>\r\n </S.FieldGroup>\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Gap (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n value={layout.gap ?? 16}\r\n onChange={(e) => setLayout(\"gap\", e.target.value === \"\" ? undefined : e.target.valueAsNumber)}\r\n />\r\n </S.FieldGroup>\r\n <S.FieldGroup style={{ gridColumn: 'span 2' }}>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Align Items</span>\r\n <S.Select\r\n value={layout.alignItems ?? \"stretch\"}\r\n onChange={(e) => setLayout(\"alignItems\", e.target.value as ContainerLayout[\"alignItems\"])}\r\n >\r\n <option value=\"flex-start\">Start</option>\r\n <option value=\"center\">Center</option>\r\n <option value=\"flex-end\">End</option>\r\n <option value=\"stretch\">Stretch</option>\r\n </S.Select>\r\n </S.FieldGroup>\r\n <S.FieldGroup style={{ gridColumn: 'span 2' }}>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Justify Content</span>\r\n <S.Select\r\n value={layout.justifyContent ?? \"flex-start\"}\r\n onChange={(e) => setLayout(\"justifyContent\", e.target.value as ContainerLayout[\"justifyContent\"])}\r\n >\r\n <option value=\"flex-start\">Start</option>\r\n <option value=\"center\">Center</option>\r\n <option value=\"flex-end\">End</option>\r\n <option value=\"space-between\">Space between</option>\r\n <option value=\"space-around\">Space around</option>\r\n <option value=\"space-evenly\">Space evenly</option>\r\n </S.Select>\r\n </S.FieldGroup>\r\n <S.FieldGroup style={{ gridColumn: 'span 2' }}>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Wrap</span>\r\n <S.Select\r\n value={layout.flexWrap ?? \"nowrap\"}\r\n onChange={(e) => setLayout(\"flexWrap\", e.target.value as \"nowrap\" | \"wrap\")}\r\n >\r\n <option value=\"nowrap\">No wrap</option>\r\n <option value=\"wrap\">Wrap</option>\r\n </S.Select>\r\n </S.FieldGroup>\r\n </div>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Width</S.Label>\r\n <S.ButtonToggleGroup>\r\n {[\r\n { value: \"quarter\", label: \"1/4\" },\r\n { value: \"half\", label: \"1/2\" },\r\n { value: \"threeQuarter\", label: \"3/4\" },\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"auto\", label: \"Auto\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n ].map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n onChange({\r\n ...section,\r\n width: value as ContainerSection[\"width\"],\r\n customWidthPx: value === \"custom\" ? (section.customWidthPx ?? 240) : undefined,\r\n })\r\n }\r\n $active={(section.width ?? \"full\") === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {section.width === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Width (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={100}\r\n max={1200}\r\n value={section.customWidthPx ?? 240}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customWidthPx: e.target.value === \"\" ? undefined : parseInt(e.target.value, 10),\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.CheckboxGroup onClick={() => onChange({ ...section, centerHorizontal: !section.centerHorizontal })}>\r\n <S.Checkbox\r\n type=\"checkbox\"\r\n checked={section.centerHorizontal ?? false}\r\n readOnly\r\n />\r\n <S.Label style={{ textTransform: 'none', cursor: 'pointer' }}>\r\n Center horizontally\r\n </S.Label>\r\n </S.CheckboxGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Children ({childIds.length})</S.Label>\r\n {childIds.length === 0 ? (\r\n <p style={{ fontSize: 11, color: '#6b7280', fontStyle: 'italic', padding: '8px 4px' }}>\r\n No children yet. Add sections inside this container.\r\n </p>\r\n ) : (\r\n <ChildList>\r\n {childIds.map((id, index) => {\r\n const child = sectionsById.get(id);\r\n return (\r\n <ChildItem key={id}>\r\n <OrderControls>\r\n <OrderButton\r\n type=\"button\"\r\n onClick={() => moveChild(index, \"up\")}\r\n disabled={index === 0}\r\n >\r\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\r\n </svg>\r\n </OrderButton>\r\n <OrderButton\r\n type=\"button\"\r\n onClick={() => moveChild(index, \"down\")}\r\n disabled={index === childIds.length - 1}\r\n >\r\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </OrderButton>\r\n </OrderControls>\r\n <span style={{ flex: 1, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\r\n {child ? getSectionLabel(child) : id}\r\n </span>\r\n <S.ActionButton\r\n $variant=\"danger\"\r\n onClick={() => removeChild(id)}\r\n style={{ flex: 'none', padding: 4, borderRadius: 6 }}\r\n >\r\n <svg width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </S.ActionButton>\r\n </ChildItem>\r\n );\r\n })}\r\n </ChildList>\r\n )}\r\n {onAddChild && (\r\n <AddChildButton type=\"button\" onClick={onAddChild}>\r\n + Add or Link Section\r\n </AddChildButton>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React, { useState } from \"react\";\r\nimport type { InputSection, InputFieldType, InputValidationType, SelectOption, ButtonActionType, ImageObjectFit } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport { CardUIConfig } from \"./CardUIConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst FIELD_TYPE_OPTIONS: { value: InputFieldType; label: string }[] = [\r\n { value: \"text\", label: \"Text\" },\r\n { value: \"number\", label: \"Number\" },\r\n { value: \"phone\", label: \"Phone\" },\r\n { value: \"select\", label: \"Select\" },\r\n { value: \"slider\", label: \"Slider\" },\r\n { value: \"checkbox\", label: \"Checkbox\" },\r\n];\r\n\r\nconst VALIDATION_OPTIONS: { value: InputValidationType; label: string }[] = [\r\n { value: \"none\", label: \"None\" },\r\n { value: \"email\", label: \"Email\" },\r\n { value: \"url\", label: \"URL\" },\r\n { value: \"number\", label: \"Number\" },\r\n { value: \"phone\", label: \"Phone\" },\r\n { value: \"password\", label: \"Password\" },\r\n { value: \"zipcode\", label: \"Zipcode\" },\r\n];\r\n\r\nconst WIDTH_OPTIONS: { value: NonNullable<InputSection[\"width\"]>; label: string }[] = [\r\n { value: \"quarter\", label: \"1/4\" },\r\n { value: \"half\", label: \"1/2\" },\r\n { value: \"threeQuarter\", label: \"3/4\" },\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst POSITION_OPTIONS: { value: NonNullable<InputSection[\"position\"]>; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst SELECT_UI_TYPE_OPTIONS: { value: NonNullable<InputSection[\"selectUIType\"]>; label: string }[] = [\r\n { value: \"dropdown\", label: \"Dropdown\" },\r\n { value: \"multipleChoice\", label: \"Multiple Choice\" },\r\n { value: \"card\", label: \"Card\" },\r\n];\r\n\r\nconst CARD_SIZE_OPTIONS: { value: NonNullable<InputSection[\"cardSize\"]>; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst ACTION_TYPE_OPTIONS: { value: ButtonActionType; label: string }[] = [\r\n { value: \"none\", label: \"No Action\" },\r\n { value: \"goToPage\", label: \"Go To Page\" },\r\n { value: \"toThankYouPage\", label: \"Submit Form\" },\r\n { value: \"toRedirectionPage\", label: \"Redirection\" },\r\n];\r\n\r\nconst IMAGE_OBJECT_FIT_OPTIONS: { value: ImageObjectFit; label: string }[] = [\r\n { value: \"cover\", label: \"Cover\" },\r\n { value: \"contain\", label: \"Contain\" },\r\n];\r\n\r\nexport interface InputConfigProps {\r\n section: InputSection;\r\n onChange: (section: InputSection) => void;\r\n totalPages?: number;\r\n}\r\n\r\nexport function InputConfig({ section, onChange, totalPages = 1 }: InputConfigProps) {\r\n const fieldType = section.fieldType ?? \"text\";\r\n const width = section.width ?? \"threeQuarter\";\r\n const position = section.position ?? \"left\";\r\n const selectUIType = section.selectUIType ?? \"dropdown\";\r\n const cardSize = section.cardSize ?? \"medium\";\r\n\r\n const [newOptionValue, setNewOptionValue] = useState(\"\");\r\n const [newOptionLabel, setNewOptionLabel] = useState(\"\");\r\n const [newOptionImage, setNewOptionImage] = useState(\"\");\r\n const [newOptionActionType, setNewOptionActionType] = useState<ButtonActionType>(\"none\");\r\n const [newOptionTargetPage, setNewOptionTargetPage] = useState(0);\r\n const [editingIndex, setEditingIndex] = useState<number | null>(null);\r\n\r\n const addOption = () => {\r\n if (!newOptionValue || !newOptionLabel) return;\r\n const options = section.options ?? [];\r\n const newOption: SelectOption = {\r\n value: newOptionValue,\r\n label: newOptionLabel,\r\n imageUrl: newOptionImage || undefined,\r\n onClick: newOptionActionType === \"none\"\r\n ? undefined\r\n : {\r\n type: newOptionActionType,\r\n targetPageIndex: newOptionActionType === \"goToPage\" ? newOptionTargetPage : undefined,\r\n },\r\n };\r\n onChange({ ...section, options: [...options, newOption] });\r\n setNewOptionValue(\"\");\r\n setNewOptionLabel(\"\");\r\n setNewOptionImage(\"\");\r\n setNewOptionActionType(\"none\");\r\n setNewOptionTargetPage(0);\r\n };\r\n\r\n const removeOption = (index: number) => {\r\n const options = section.options ?? [];\r\n onChange({ ...section, options: options.filter((_, i) => i !== index) });\r\n };\r\n\r\n const updateOption = (index: number, updatedOption: SelectOption) => {\r\n const options = section.options ?? [];\r\n const newOptions = [...options];\r\n newOptions[index] = updatedOption;\r\n onChange({ ...section, options: newOptions });\r\n };\r\n\r\n const cloneOption = (index: number) => {\r\n const options = section.options ?? [];\r\n const optionToClone = options[index];\r\n const clonedOption: SelectOption = {\r\n ...optionToClone,\r\n value: `${optionToClone.value}_copy`,\r\n label: `${optionToClone.label} (copy)`,\r\n };\r\n onChange({ ...section, options: [...options, clonedOption] });\r\n };\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"primary\">\r\n <S.FieldGroup>\r\n <S.Label>Field type</S.Label>\r\n <S.ButtonToggleGroup>\r\n {FIELD_TYPE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, fieldType: value })}\r\n $active={fieldType === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Width</S.Label>\r\n <S.ButtonToggleGroup>\r\n {WIDTH_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n onChange({\r\n ...section,\r\n width: value,\r\n customWidthPx: value === \"custom\" ? (section.customWidthPx ?? 240) : undefined,\r\n })\r\n }\r\n $active={width === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {width === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Width (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={100}\r\n max={1200}\r\n value={section.customWidthPx ?? 240}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customWidthPx: e.target.value === \"\" ? undefined : parseInt(e.target.value, 10),\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Position</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, position: value })}\r\n $active={position === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Field name</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.fieldName ?? \"\"}\r\n onChange={(e) => onChange({ ...section, fieldName: e.target.value })}\r\n placeholder=\"e.g., email, age\"\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Label</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.label ?? \"\"}\r\n onChange={(e) => onChange({ ...section, label: e.target.value })}\r\n placeholder=\"Optional label\"\r\n />\r\n <div style={{ marginTop: 8 }}>\r\n <S.Label style={{ fontSize: 10 }}>Label Alignment</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, labelAlignment: value })}\r\n $active={(section.labelAlignment ?? \"center\") === value}\r\n style={{ fontSize: 10, padding: '4px' }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </div>\r\n <div style={{ display: 'flex', gap: 12, marginTop: 8 }}>\r\n <div style={{ flex: 1 }}>\r\n <S.Label style={{ fontSize: 10 }}>Font Size (px)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n value={section.labelFontSize ?? 20}\r\n onChange={(e) => onChange({ ...section, labelFontSize: parseInt(e.target.value, 10) })}\r\n style={{ padding: '4px 8px', fontSize: 12 }}\r\n />\r\n </div>\r\n <div style={{ flex: 1 }}>\r\n <S.Label style={{ fontSize: 10 }}>Letter Spacing (em)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n step=\"0.01\"\r\n value={section.labelLetterSpacing ?? 0.1}\r\n onChange={(e) => onChange({ ...section, labelLetterSpacing: parseFloat(e.target.value) })}\r\n style={{ padding: '4px 8px', fontSize: 12 }}\r\n />\r\n </div>\r\n </div>\r\n </S.FieldGroup>\r\n\r\n {(fieldType === \"text\" || fieldType === \"number\" || fieldType === \"phone\" || fieldType === \"select\") && (\r\n <S.FieldGroup>\r\n <S.Label>Input text alignment</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, inputAlignment: value })}\r\n $active={(section.inputAlignment ?? \"left\") === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n )}\r\n\r\n {(fieldType === \"text\" || fieldType === \"number\") && (\r\n <S.FieldGroup>\r\n <S.Label>Placeholder</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.placeholder ?? \"\"}\r\n onChange={(e) => onChange({ ...section, placeholder: e.target.value })}\r\n placeholder=\"Placeholder text\"\r\n />\r\n </S.FieldGroup>\r\n )}\r\n\r\n {fieldType === \"select\" && (\r\n <>\r\n <S.FieldGroup>\r\n <S.Label>UI Type</S.Label>\r\n <S.ButtonToggleGroup>\r\n {SELECT_UI_TYPE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, selectUIType: value })}\r\n $active={selectUIType === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n {selectUIType === \"card\" && (\r\n <CardUIConfig section={section} onChange={onChange} />\r\n )}\r\n\r\n {(selectUIType === \"card\" || selectUIType === \"multipleChoice\") && (\r\n <S.FieldGroup>\r\n <S.Label>Image Object Fit</S.Label>\r\n <S.ButtonToggleGroup>\r\n {IMAGE_OBJECT_FIT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, imageObjectFit: value })}\r\n $active={(section.imageObjectFit ?? \"cover\") === value}\r\n style={{ flex: 1 }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n )}\r\n\r\n <S.FieldGroup>\r\n <S.Label>Options</S.Label>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {(section.options ?? []).map((option, index) => (\r\n <S.OptionCard key={index}>\r\n {editingIndex === index ? (\r\n <div style={{ padding: 12, display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n <S.Input\r\n type=\"text\"\r\n value={option.value}\r\n onChange={(e) => updateOption(index, { ...option, value: e.target.value })}\r\n placeholder=\"Value\"\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={option.label}\r\n onChange={(e) => updateOption(index, { ...option, label: e.target.value })}\r\n placeholder=\"Label\"\r\n />\r\n {(selectUIType === \"multipleChoice\" || (selectUIType === \"card\" && section.cardStyling !== \"icon\")) && (\r\n <S.Input\r\n type=\"text\"\r\n value={option.imageUrl ?? \"\"}\r\n onChange={(e) => updateOption(index, { ...option, imageUrl: e.target.value || undefined })}\r\n placeholder=\"Image URL\"\r\n />\r\n )}\r\n\r\n {selectUIType === \"card\" && section.cardStyling === \"icon\" && (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\r\n <S.Label style={{ fontSize: 10 }}>Icon Type</S.Label>\r\n <S.ButtonToggleGroup>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => updateOption(index, { ...option, iconType: \"url\" })}\r\n $active={option.iconType === \"url\" || !option.iconType}\r\n style={{ fontSize: 10, padding: '4px' }}\r\n >\r\n URL\r\n </S.ToggleButton>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => updateOption(index, { ...option, iconType: \"svg\" })}\r\n $active={option.iconType === \"svg\"}\r\n style={{ fontSize: 10, padding: '4px' }}\r\n >\r\n SVG\r\n </S.ToggleButton>\r\n </S.ButtonToggleGroup>\r\n <S.Input\r\n type=\"text\"\r\n value={option.iconValue ?? \"\"}\r\n onChange={(e) => updateOption(index, { ...option, iconValue: e.target.value || undefined })}\r\n placeholder={option.iconType === \"svg\" ? \"<svg>...</svg>\" : \"Image URL\"}\r\n />\r\n </div>\r\n )}\r\n\r\n <div style={{ borderTop: '1px solid #e5e7eb', paddingTop: 8, marginTop: 4 }}>\r\n <S.Label style={{ fontSize: 10 }}>On Select Action</S.Label>\r\n <S.ButtonToggleGroup style={{ marginTop: 4 }}>\r\n {ACTION_TYPE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => {\r\n if (value === \"none\") {\r\n updateOption(index, { ...option, onClick: undefined });\r\n } else {\r\n updateOption(index, {\r\n ...option,\r\n onClick: {\r\n type: value,\r\n targetPageIndex: value === \"goToPage\" ? (option.onClick?.targetPageIndex ?? 0) : undefined,\r\n },\r\n });\r\n }\r\n }}\r\n $active={(option.onClick?.type ?? \"none\") === value}\r\n style={{ fontSize: 9, padding: '4px 8px' }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {option.onClick?.type === \"goToPage\" && (\r\n <div style={{ marginTop: 8 }}>\r\n <S.Label style={{ fontSize: 9, display: 'block', marginBottom: 4 }}>Target Page</S.Label>\r\n <S.Select\r\n value={option.onClick.targetPageIndex ?? 0}\r\n onChange={(e) =>\r\n updateOption(index, {\r\n ...option,\r\n onClick: {\r\n ...option.onClick!,\r\n targetPageIndex: parseInt(e.target.value, 10),\r\n },\r\n })\r\n }\r\n style={{ padding: '4px 8px', fontSize: 12 }}\r\n >\r\n {Array.from({ length: totalPages }, (_, i) => (\r\n <option key={i} value={i}>\r\n Page {i + 1}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <S.ActionButton $variant=\"success\" onClick={() => setEditingIndex(null)} style={{ marginTop: 4 }}>\r\n Done\r\n </S.ActionButton>\r\n </div>\r\n ) : (\r\n <>\r\n <div style={{ padding: 12, display: 'flex', alignItems: 'center', gap: 12 }}>\r\n {option.imageUrl && (\r\n <img\r\n src={option.imageUrl}\r\n alt={option.label}\r\n style={{ width: 44, height: 44, borderRadius: 8, objectFit: 'cover', flexShrink: 0, backgroundColor: '#f3f4f6' }}\r\n />\r\n )}\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ fontSize: 13, fontWeight: 600 }}>{option.label}</div>\r\n {option.onClick && (\r\n <div style={{ fontSize: 10, color: '#6b7280', marginTop: 2 }}>\r\n {option.onClick.type === \"goToPage\"\r\n ? `→ Page ${(option.onClick.targetPageIndex ?? 0) + 1}`\r\n : option.onClick.type === \"toThankYouPage\"\r\n ? \"→ Submit Form\"\r\n : \"→ Redirection\"}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <S.ActionRow>\r\n <S.ActionButton onClick={() => setEditingIndex(index)}>Edit</S.ActionButton>\r\n <S.ActionButton onClick={() => cloneOption(index)}>Clone</S.ActionButton>\r\n <S.ActionButton $variant=\"danger\" onClick={() => removeOption(index)}>Delete</S.ActionButton>\r\n </S.ActionRow>\r\n </>\r\n )}\r\n </S.OptionCard>\r\n ))}\r\n </div>\r\n\r\n <div style={{ padding: 12, borderRadius: 12, border: '1px solid #e5e7eb', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n <S.Label>Add New Option</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={newOptionValue}\r\n onChange={(e) => setNewOptionValue(e.target.value)}\r\n placeholder=\"Value\"\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={newOptionLabel}\r\n onChange={(e) => setNewOptionLabel(e.target.value)}\r\n placeholder=\"Label\"\r\n />\r\n {(selectUIType === \"multipleChoice\" || (selectUIType === \"card\" && section.cardStyling !== \"icon\")) && (\r\n <S.Input\r\n type=\"text\"\r\n value={newOptionImage}\r\n onChange={(e) => setNewOptionImage(e.target.value)}\r\n placeholder=\"Image URL\"\r\n />\r\n )}\r\n\r\n <div style={{ borderTop: '1px solid #e5e7eb', paddingTop: 8 }}>\r\n <S.Label style={{ fontSize: 10 }}>Action on select</S.Label>\r\n <S.ButtonToggleGroup style={{ marginTop: 4 }}>\r\n {ACTION_TYPE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => setNewOptionActionType(value)}\r\n $active={newOptionActionType === value}\r\n style={{ fontSize: 9, padding: '4px 8px' }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {newOptionActionType === \"goToPage\" && (\r\n <div style={{ marginTop: 8 }}>\r\n <S.Select\r\n value={newOptionTargetPage}\r\n onChange={(e) => setNewOptionTargetPage(parseInt(e.target.value, 10))}\r\n style={{ padding: '4px 8px', fontSize: 12 }}\r\n >\r\n {Array.from({ length: totalPages }, (_, i) => (\r\n <option key={i} value={i}>\r\n Page {i + 1}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <S.ActionButton\r\n $variant=\"primary\"\r\n onClick={addOption}\r\n style={{ marginTop: 4, padding: 10, borderRadius: 8, backgroundColor: '#6366f1', color: 'white' }}\r\n >\r\n Add Option\r\n </S.ActionButton>\r\n </div>\r\n </S.FieldGroup>\r\n </>\r\n )}\r\n\r\n {fieldType === \"slider\" && (\r\n <>\r\n <div style={{ display: 'flex', gap: 12 }}>\r\n <S.FieldGroup style={{ flex: 1 }}>\r\n <S.Label>Min</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n value={section.sliderMin ?? 0}\r\n onChange={(e) => onChange({ ...section, sliderMin: e.target.valueAsNumber || 0 })}\r\n />\r\n </S.FieldGroup>\r\n <S.FieldGroup style={{ flex: 1 }}>\r\n <S.Label>Max</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n value={section.sliderMax ?? 100}\r\n onChange={(e) => onChange({ ...section, sliderMax: e.target.valueAsNumber || 100 })}\r\n />\r\n </S.FieldGroup>\r\n </div>\r\n <S.FieldGroup>\r\n <S.Label>Step</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n value={section.sliderStep ?? 1}\r\n onChange={(e) => onChange({ ...section, sliderStep: e.target.valueAsNumber || 1 })}\r\n />\r\n </S.FieldGroup>\r\n </>\r\n )}\r\n\r\n {fieldType === \"checkbox\" && (\r\n <S.FieldGroup>\r\n <S.Label>Checkbox label</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.checkboxLabel ?? \"\"}\r\n onChange={(e) => onChange({ ...section, checkboxLabel: e.target.value })}\r\n placeholder=\"I agree to the terms\"\r\n />\r\n </S.FieldGroup>\r\n )}\r\n\r\n {(fieldType === \"text\" || fieldType === \"number\") && (\r\n <S.FieldGroup>\r\n <S.Label>Validation</S.Label>\r\n <S.Select\r\n value={section.validationType ?? \"none\"}\r\n onChange={(e) => onChange({ ...section, validationType: e.target.value as InputValidationType })}\r\n >\r\n {VALIDATION_OPTIONS.map(({ value, label }) => (\r\n <option key={value} value={value}>\r\n {label}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </S.FieldGroup>\r\n )}\r\n\r\n {section.validationType && section.validationType !== \"none\" && (\r\n <S.FieldGroup>\r\n <S.Label>Validation error message</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.validationMessage ?? \"\"}\r\n onChange={(e) => onChange({ ...section, validationMessage: e.target.value })}\r\n placeholder=\"Please enter a valid value\"\r\n />\r\n </S.FieldGroup>\r\n )}\r\n\r\n <S.CheckboxGroup onClick={() => onChange({ ...section, required: !section.required })}>\r\n <S.Checkbox\r\n type=\"checkbox\"\r\n checked={section.required ?? false}\r\n readOnly\r\n />\r\n <S.Label style={{ textTransform: 'none', cursor: 'pointer' }}>\r\n Required field\r\n </S.Label>\r\n </S.CheckboxGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { InputSection, ImageObjectFit } from \"../types\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst CARD_SIZE_OPTIONS: { value: NonNullable<InputSection[\"cardSize\"]>; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst CARD_STYLING_OPTIONS: { value: NonNullable<InputSection[\"cardStyling\"]>; label: string }[] = [\r\n { value: \"default\", label: \"Default\" },\r\n { value: \"icon\", label: \"Icon Card\" },\r\n];\r\n\r\nconst IMAGE_OBJECT_FIT_OPTIONS: { value: ImageObjectFit; label: string }[] = [\r\n { value: \"cover\", label: \"Cover\" },\r\n { value: \"contain\", label: \"Contain\" },\r\n];\r\n\r\ninterface CardUIConfigProps {\r\n section: InputSection;\r\n onChange: (section: InputSection) => void;\r\n}\r\n\r\nexport function CardUIConfig({ section, onChange }: CardUIConfigProps) {\r\n const cardStyling = section.cardStyling ?? \"default\";\r\n const cardSize = section.cardSize ?? \"medium\";\r\n\r\n return (\r\n <>\r\n <S.FieldGroup>\r\n <S.Label>Card Styling</S.Label>\r\n <S.ButtonToggleGroup>\r\n {CARD_STYLING_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, cardStyling: value })}\r\n $active={cardStyling === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n {cardStyling === \"icon\" && (\r\n <S.FieldGroup>\r\n <S.Label>Icon Background Color</S.Label>\r\n <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\r\n <S.Input\r\n type=\"color\"\r\n value={section.iconBackgroundColor || \"#22c55e20\"}\r\n onChange={(e) => onChange({ ...section, iconBackgroundColor: e.target.value })}\r\n style={{ width: 44, height: 36, padding: 4, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={section.iconBackgroundColor || \"#22c55e20\"}\r\n onChange={(e) => onChange({ ...section, iconBackgroundColor: e.target.value })}\r\n placeholder=\"#hexcolor\"\r\n style={{ flex: 1 }}\r\n />\r\n <S.ActionButton\r\n onClick={() => onChange({ ...section, iconBackgroundColor: undefined })}\r\n style={{ fontSize: 10, padding: '4px 8px' }}\r\n >\r\n Reset\r\n </S.ActionButton>\r\n </div>\r\n </S.FieldGroup>\r\n )}\r\n\r\n <S.FieldGroup>\r\n <S.Label>Card size</S.Label>\r\n <S.ButtonToggleGroup>\r\n {CARD_SIZE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, cardSize: value })}\r\n $active={cardSize === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n {cardSize === \"custom\" && (\r\n <S.FieldGroup>\r\n <S.Label>Custom card size (px)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n value={section.customCardSizePx ?? 200}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customCardSizePx: parseInt(e.target.value, 10) || 200,\r\n })\r\n }\r\n min={50}\r\n />\r\n </S.FieldGroup>\r\n )}\r\n\r\n {cardStyling === \"default\" && (\r\n <S.FieldGroup>\r\n <S.Label>Image Object Fit</S.Label>\r\n <S.ButtonToggleGroup>\r\n {IMAGE_OBJECT_FIT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, imageObjectFit: value })}\r\n $active={(section.imageObjectFit ?? \"cover\") === value}\r\n style={{ flex: 1 }}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n )}\r\n </>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { ButtonSection, ButtonActionType, QuizV2Page } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst SIZE_OPTIONS: { value: NonNullable<ButtonSection[\"size\"]>; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n];\r\n\r\nconst WIDTH_OPTIONS: { value: NonNullable<ButtonSection[\"width\"]>; label: string }[] = [\r\n { value: \"quarter\", label: \"1/4\" },\r\n { value: \"half\", label: \"1/2\" },\r\n { value: \"threeQuarter\", label: \"3/4\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst RADIUS_OPTIONS: { value: NonNullable<ButtonSection[\"borderRadius\"]>; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst POSITION_OPTIONS: { value: NonNullable<ButtonSection[\"position\"]>; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst TEXT_POSITION_OPTIONS: { value: NonNullable<ButtonSection[\"textPosition\"]>; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst ACTION_OPTIONS: { value: ButtonActionType; label: string }[] = [\r\n { value: \"none\", label: \"None\" },\r\n { value: \"goToPage\", label: \"Go to Page\" },\r\n { value: \"toThankYouPage\", label: \"Submit Form\" },\r\n { value: \"toRedirectionPage\", label: \"Redirection\" },\r\n];\r\n\r\nexport interface ButtonConfigProps {\r\n section: ButtonSection;\r\n onChange: (section: ButtonSection) => void;\r\n pages: QuizV2Page[];\r\n}\r\n\r\nexport function ButtonConfig({ section, onChange, pages }: ButtonConfigProps) {\r\n const size = section.size ?? \"large\";\r\n const width = section.width ?? \"threeQuarter\";\r\n const borderRadius = section.borderRadius ?? \"medium\";\r\n const position = section.position ?? \"center\";\r\n const textPosition = section.textPosition ?? \"center\";\r\n const actionType = section.onClick?.type ?? \"none\";\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"success\">\r\n <S.FieldGroup>\r\n <S.Label>Label</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.label}\r\n onChange={(e) => onChange({ ...section, label: e.target.value })}\r\n placeholder=\"Button text\"\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Size</S.Label>\r\n <S.ButtonToggleGroup>\r\n {SIZE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, size: value })}\r\n $active={size === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Width</S.Label>\r\n <S.ButtonToggleGroup>\r\n {WIDTH_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n onChange({\r\n ...section,\r\n width: value,\r\n customWidthPx: value === \"custom\" ? (section.customWidthPx ?? 240) : undefined,\r\n })\r\n }\r\n $active={width === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {width === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Width (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={40}\r\n max={1200}\r\n value={section.customWidthPx ?? 240}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customWidthPx: e.target.value === \"\" ? undefined : e.target.valueAsNumber,\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Border radius</S.Label>\r\n <S.ButtonToggleGroup>\r\n {RADIUS_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n onChange({\r\n ...section,\r\n borderRadius: value,\r\n customBorderRadiusPx:\r\n value === \"custom\" ? (section.customBorderRadiusPx ?? 10) : undefined,\r\n })\r\n }\r\n $active={borderRadius === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {borderRadius === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Radius (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n max={48}\r\n value={section.customBorderRadiusPx ?? 10}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customBorderRadiusPx: e.target.value === \"\" ? undefined : e.target.valueAsNumber,\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Position</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, position: value })}\r\n $active={position === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Text position</S.Label>\r\n <S.ButtonToggleGroup>\r\n {TEXT_POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, textPosition: value })}\r\n $active={textPosition === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Colors</S.Label>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Button</span>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={section.buttonColor ?? \"#4f46e5\"}\r\n onChange={(e) => onChange({ ...section, buttonColor: e.target.value })}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={section.buttonColor ?? \"#4f46e5\"}\r\n onChange={(e) => onChange({ ...section, buttonColor: e.target.value })}\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n <S.FieldGroup>\r\n <span style={{ fontSize: 10, color: '#6b7280', fontWeight: 600 }}>Text</span>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={section.textColor ?? \"#ffffff\"}\r\n onChange={(e) => onChange({ ...section, textColor: e.target.value })}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={section.textColor ?? \"#ffffff\"}\r\n onChange={(e) => onChange({ ...section, textColor: e.target.value })}\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n </div>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>On click</S.Label>\r\n <S.ButtonToggleGroup>\r\n {ACTION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() =>\r\n onChange({\r\n ...section,\r\n onClick:\r\n value === \"none\"\r\n ? undefined\r\n : {\r\n type: value,\r\n targetPageIndex:\r\n value === \"goToPage\" ? (section.onClick?.targetPageIndex ?? 0) : undefined,\r\n },\r\n })\r\n }\r\n $active={actionType === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {actionType === \"goToPage\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Target page</span>\r\n <S.Select\r\n value={section.onClick?.targetPageIndex ?? 0}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n onClick: {\r\n type: \"goToPage\",\r\n targetPageIndex: parseInt(e.target.value, 10),\r\n },\r\n })\r\n }\r\n >\r\n {pages.map((_, index) => (\r\n <option key={index} value={index}>\r\n Page {index + 1}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { TextSection, TextFontSize, TextAlignment, TextTag } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\nimport styled from 'styled-components';\r\n\r\nconst TextArea = styled.textarea`\r\n width: 100%;\r\n min-height: 100px;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 12px;\r\n font-size: 14px;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n resize: vertical;\r\n transition: all 0.2s;\r\n \r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n box-shadow: 0 0 0 3px ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n }\r\n`;\r\n\r\nconst FONT_OPTIONS: { value: TextFontSize; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst TAG_OPTIONS: { value: TextTag; label: string }[] = [\r\n { value: \"p\", label: \"Paragraph\" },\r\n { value: \"h1\", label: \"H1\" },\r\n { value: \"h2\", label: \"H2\" },\r\n { value: \"h3\", label: \"H3\" },\r\n { value: \"h4\", label: \"H4\" },\r\n { value: \"h5\", label: \"H5\" },\r\n { value: \"h6\", label: \"H6\" },\r\n];\r\n\r\nconst ALIGNMENT_OPTIONS: { value: TextAlignment; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nexport interface TextConfigProps {\r\n section: TextSection;\r\n onChange: (section: TextSection) => void;\r\n}\r\n\r\nexport function TextConfig({ section, onChange }: TextConfigProps) {\r\n const font = section.font ?? \"medium\";\r\n const alignment = section.alignment ?? \"left\";\r\n const tag = section.tag ?? \"p\";\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"warning\">\r\n <S.FieldGroup>\r\n <S.Label>Content</S.Label>\r\n <TextArea\r\n value={section.content ?? \"\"}\r\n onChange={(e) => onChange({ ...section, content: e.target.value })}\r\n placeholder=\"Enter text content here...\"\r\n rows={4}\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Tag / Hierarchy</S.Label>\r\n <S.ButtonToggleGroup>\r\n {TAG_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, tag: value })}\r\n $active={tag === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Font Size</S.Label>\r\n <S.ButtonToggleGroup>\r\n {FONT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, font: value })}\r\n $active={font === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {font === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Size (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={8}\r\n max={120}\r\n value={section.customFontSizePx ?? 16}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customFontSizePx: e.target.value === \"\" ? undefined : e.target.valueAsNumber,\r\n })\r\n }\r\n style={{ width: 64 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Text Styling</S.Label>\r\n <S.ButtonToggleGroup>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, bold: !(section.bold ?? false) })}\r\n $active={section.bold ?? false}\r\n style={{ fontWeight: 'bold' }}\r\n >\r\n B\r\n </S.ToggleButton>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, italic: !(section.italic ?? false) })}\r\n $active={section.italic ?? false}\r\n style={{ fontStyle: 'italic' }}\r\n >\r\n I\r\n </S.ToggleButton>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, underline: !(section.underline ?? false) })}\r\n $active={section.underline ?? false}\r\n style={{ textDecoration: 'underline' }}\r\n >\r\n U\r\n </S.ToggleButton>\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Color</S.Label>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={section.color ?? \"#000000\"}\r\n onChange={(e) => onChange({ ...section, color: e.target.value })}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={section.color ?? \"#000000\"}\r\n onChange={(e) => onChange({ ...section, color: e.target.value })}\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Alignment</S.Label>\r\n <S.ButtonToggleGroup>\r\n {ALIGNMENT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, alignment: value })}\r\n $active={alignment === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { ImageSection, ImageSize, ImagePosition, ImageObjectFit } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst SIZE_OPTIONS: { value: ImageSize; label: string }[] = [\r\n { value: \"small\", label: \"Small\" },\r\n { value: \"medium\", label: \"Medium\" },\r\n { value: \"large\", label: \"Large\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst POSITION_OPTIONS: { value: ImagePosition; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nconst OBJECT_FIT_OPTIONS: { value: ImageObjectFit; label: string }[] = [\r\n { value: \"cover\", label: \"Cover\" },\r\n { value: \"contain\", label: \"Contain\" },\r\n];\r\n\r\nexport interface ImageConfigProps {\r\n section: ImageSection;\r\n onChange: (section: ImageSection) => void;\r\n}\r\n\r\nexport function ImageConfig({ section, onChange }: ImageConfigProps) {\r\n const size = section.size ?? \"medium\";\r\n const position = section.position ?? \"left\";\r\n const objectFit = section.objectFit ?? \"cover\";\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"success\">\r\n <S.FieldGroup>\r\n <S.Label>Media Source</S.Label>\r\n <S.ButtonToggleGroup>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, svgContent: undefined })}\r\n $active={!section.svgContent}\r\n >\r\n Image URL\r\n </S.ToggleButton>\r\n <S.ToggleButton\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, svgContent: section.svgContent || '<svg ...></svg>' })}\r\n $active={!!section.svgContent}\r\n >\r\n SVG Content\r\n </S.ToggleButton>\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n {!section.svgContent ? (\r\n <S.FieldGroup>\r\n <S.Label>Image URL</S.Label>\r\n <S.Input\r\n type=\"url\"\r\n value={section.src ?? \"\"}\r\n onChange={(e) => onChange({ ...section, src: e.target.value })}\r\n placeholder=\"https://example.com/image.jpg\"\r\n />\r\n </S.FieldGroup>\r\n ) : (\r\n <S.FieldGroup>\r\n <S.Label>SVG Code</S.Label>\r\n <S.TextArea\r\n value={section.svgContent ?? \"\"}\r\n onChange={(e) => onChange({ ...section, svgContent: e.target.value })}\r\n placeholder=\"<svg ...></svg>\"\r\n rows={5}\r\n style={{ fontFamily: 'monospace', fontSize: '11px' }}\r\n />\r\n </S.FieldGroup>\r\n )}\r\n\r\n <S.FieldGroup>\r\n <S.Label>Alt Text</S.Label>\r\n <S.Input\r\n type=\"text\"\r\n value={section.alt ?? \"\"}\r\n onChange={(e) => onChange({ ...section, alt: e.target.value })}\r\n placeholder=\"Descriptive text for accessibility\"\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Size</S.Label>\r\n <S.ButtonToggleGroup>\r\n {SIZE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, size: value })}\r\n $active={size === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {size === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Max Width (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={1}\r\n max={2000}\r\n value={section.customSizePx ?? 400}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customSizePx: e.target.value === \"\" ? undefined : e.target.valueAsNumber,\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Position</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, position: value })}\r\n $active={position === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Object Fit</S.Label>\r\n <S.ButtonToggleGroup>\r\n {OBJECT_FIT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, objectFit: value })}\r\n $active={objectFit === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { DividerSection, ImagePosition } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\nconst STYLE_OPTIONS: { value: \"solid\" | \"dashed\" | \"dotted\"; label: string }[] = [\r\n { value: \"solid\", label: \"Solid\" },\r\n { value: \"dashed\", label: \"Dashed\" },\r\n { value: \"dotted\", label: \"Dotted\" },\r\n];\r\n\r\nconst WIDTH_OPTIONS: { value: \"quarter\" | \"half\" | \"threeQuarter\" | \"full\" | \"custom\"; label: string }[] = [\r\n { value: \"quarter\", label: \"1/4\" },\r\n { value: \"half\", label: \"1/2\" },\r\n { value: \"threeQuarter\", label: \"3/4\" },\r\n { value: \"full\", label: \"Full\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst POSITION_OPTIONS: { value: ImagePosition; label: string }[] = [\r\n { value: \"left\", label: \"Left\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"right\", label: \"Right\" },\r\n];\r\n\r\nexport interface DividerConfigProps {\r\n section: DividerSection;\r\n onChange: (section: DividerSection) => void;\r\n}\r\n\r\nexport function DividerConfig({ section, onChange }: DividerConfigProps) {\r\n const lineStyle = section.lineStyle ?? \"solid\";\r\n const width = section.width ?? \"full\";\r\n const position = section.position ?? \"center\";\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"secondary\">\r\n <S.FieldGroup>\r\n <S.Label>Color</S.Label>\r\n <div style={{ display: 'flex', gap: 8 }}>\r\n <S.Input\r\n type=\"color\"\r\n value={section.color ?? \"#e5e7eb\"}\r\n onChange={(e) => onChange({ ...section, color: e.target.value })}\r\n style={{ width: 44, padding: 2, height: 36, cursor: 'pointer' }}\r\n />\r\n <S.Input\r\n type=\"text\"\r\n value={section.color ?? \"#e5e7eb\"}\r\n onChange={(e) => onChange({ ...section, color: e.target.value })}\r\n style={{ fontSize: 11, fontFamily: 'monospace' }}\r\n />\r\n </div>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Thickness (px)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n min={1}\r\n max={20}\r\n value={section.thickness ?? 1}\r\n onChange={(e) => onChange({ ...section, thickness: e.target.valueAsNumber })}\r\n />\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Line Style</S.Label>\r\n <S.ButtonToggleGroup>\r\n {STYLE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, lineStyle: value })}\r\n $active={lineStyle === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Width</S.Label>\r\n <S.ButtonToggleGroup>\r\n {WIDTH_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, width: value })}\r\n $active={width === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n {width === \"custom\" && (\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: 4 }}>\r\n <span style={{ fontSize: 11, color: '#6b7280' }}>Width (px)</span>\r\n <S.Input\r\n type=\"number\"\r\n min={1}\r\n max={2000}\r\n value={section.customWidthPx ?? 400}\r\n onChange={(e) =>\r\n onChange({\r\n ...section,\r\n customWidthPx: e.target.value === \"\" ? undefined : e.target.valueAsNumber,\r\n })\r\n }\r\n style={{ width: 80 }}\r\n />\r\n </div>\r\n )}\r\n </S.FieldGroup>\r\n\r\n <S.FieldGroup>\r\n <S.Label>Position</S.Label>\r\n <S.ButtonToggleGroup>\r\n {POSITION_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n onClick={() => onChange({ ...section, position: value })}\r\n $active={position === value}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ButtonToggleGroup>\r\n </S.FieldGroup>\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport type { BasicComponentSection, BasicComponentType } from \"../types\";\r\nimport { SpacingConfig } from \"./SpacingConfig\";\r\nimport { FlexConfig } from \"./FlexConfig\";\r\nimport { BackgroundConfig } from \"./BackgroundConfig\";\r\nimport * as S from \"./ConfigStyles\";\r\n\r\ninterface BasicComponentConfigProps {\r\n section: BasicComponentSection;\r\n onChange: (section: BasicComponentSection) => void;\r\n}\r\n\r\nconst COMPONENT_TYPE_OPTIONS: { value: BasicComponentType; label: string }[] = [\r\n { value: \"progressBar\", label: \"Progress Bar\" },\r\n];\r\n\r\nexport function BasicComponentConfig({ section, onChange }: BasicComponentConfigProps) {\r\n const componentType = section.componentType ?? \"progressBar\";\r\n\r\n return (\r\n <S.ConfigContainer $variant=\"success\">\r\n <S.FieldGroup>\r\n <S.Label>Component Type</S.Label>\r\n <S.Select\r\n value={componentType}\r\n onChange={(e) => onChange({ ...section, componentType: e.target.value as BasicComponentType })}\r\n >\r\n {COMPONENT_TYPE_OPTIONS.map((opt) => (\r\n <option key={opt.value} value={opt.value}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </S.Select>\r\n </S.FieldGroup>\r\n\r\n {componentType === \"progressBar\" && (\r\n <>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Height (px)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n min={4}\r\n max={100}\r\n value={section.progressBarHeight ?? 12}\r\n onChange={(e) => onChange({ ...section, progressBarHeight: parseInt(e.target.value, 10) })}\r\n />\r\n </S.FieldGroup>\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Radius (px)</S.Label>\r\n <S.Input\r\n type=\"number\"\r\n min={0}\r\n max={50}\r\n value={section.progressBarRadius ?? 8}\r\n onChange={(e) => onChange({ ...section, progressBarRadius: parseInt(e.target.value, 10) })}\r\n />\r\n </S.FieldGroup>\r\n </div>\r\n\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 12 }}>\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Background Color</S.Label>\r\n <S.Input\r\n type=\"color\"\r\n value={section.progressBarBgColor ?? \"#e5e7eb\"}\r\n onChange={(e) => onChange({ ...section, progressBarBgColor: e.target.value })}\r\n style={{ height: 36, padding: 2 }}\r\n />\r\n </S.FieldGroup>\r\n <S.FieldGroup>\r\n <S.Label style={{ fontSize: 10 }}>Fill Color</S.Label>\r\n <S.Input\r\n type=\"color\"\r\n value={section.progressBarFillColor ?? \"#4f46e5\"}\r\n onChange={(e) => onChange({ ...section, progressBarFillColor: e.target.value })}\r\n style={{ height: 36, padding: 2 }}\r\n />\r\n </S.FieldGroup>\r\n </div>\r\n\r\n <S.CheckboxGroup onClick={() => onChange({ ...section, showPercentage: !section.showPercentage })}>\r\n <S.Checkbox\r\n type=\"checkbox\"\r\n checked={section.showPercentage ?? true}\r\n readOnly\r\n />\r\n <S.Label style={{ textTransform: 'none', cursor: 'pointer' }}>\r\n Show Percentage\r\n </S.Label>\r\n </S.CheckboxGroup>\r\n </>\r\n )}\r\n\r\n <FlexConfig\r\n flex={section.flex}\r\n onChange={(flex) => onChange({ ...section, flex })}\r\n />\r\n\r\n <BackgroundConfig\r\n backgroundStyle={section.backgroundStyle}\r\n onChange={(backgroundStyle) => onChange({ ...section, backgroundStyle })}\r\n />\r\n\r\n <SpacingConfig\r\n spacing={section.spacing}\r\n onChange={(spacing) => onChange({ ...section, spacing })}\r\n sectionType={section.type}\r\n />\r\n </S.ConfigContainer>\r\n );\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n padding: 12px 16px;\r\n border-radius: ${props => props.theme.radii?.medium || '16px'};\r\n border: 1px solid ${props => (props.theme.colors?.primary || '#6366f1') + '40'};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '05'};\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n`;\r\n\r\nexport const TopRow = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n`;\r\n\r\nexport const LabelGroup = styled.div`\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n`;\r\n\r\nexport const Label = styled.span`\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 12px;\r\n font-weight: 600;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n`;\r\n\r\nexport const Indicator = styled.span`\r\n height: 8px;\r\n width: 8px;\r\n border-radius: 50%;\r\n background-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n`;\r\n\r\nexport const ToggleGroup = styled.div`\r\n display: flex;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n padding: 2px;\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n`;\r\n\r\nexport const ToggleButton = styled.button<{ $active?: boolean }>`\r\n border-radius: 6px;\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n transition: all 0.2s;\r\n border: none;\r\n cursor: pointer;\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '20' : 'transparent'};\r\n color: ${props => props.$active ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.textSecondary || '#6b7280')};\r\n \r\n &:hover {\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '30' : (props.theme.colors?.background || '#f3f4f6')};\r\n color: ${props => props.$active ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.text || '#1f2937')};\r\n }\r\n`;\r\n\r\nexport const Section = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n`;\r\n\r\nexport const SectionLabel = styled.label`\r\n font-size: 11px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n`;\r\n\r\nexport const PageNavigation = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n`;\r\n\r\nexport const PageButton = styled.button<{ $active?: boolean }>`\r\n border-radius: 6px;\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n transition: all 0.2s;\r\n border: 1px solid ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.border || '#e5e7eb')};\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '10' : (props.theme.colors?.background || '#f3f4f6')};\r\n color: ${props => props.$active ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.text || '#1f2937')};\r\n cursor: pointer;\r\n \r\n &:hover {\r\n background-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') + '20' : (props.theme.colors?.surface || '#ffffff')};\r\n border-color: ${props => props.$active ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.textSecondary || '#6b7280') + '50'};\r\n }\r\n`;\r\n\r\nexport const RangeInput = styled.input`\r\n height: 6px;\r\n width: 100%;\r\n cursor: pointer;\r\n appearance: none;\r\n background-color: ${props => props.theme.colors?.border || '#e5e7eb'};\r\n border-radius: 4px;\r\n \r\n &::-webkit-slider-thumb {\r\n appearance: none;\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 50%;\r\n background-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n transition: transform 0.1s;\r\n }\r\n \r\n &::-webkit-slider-thumb:hover {\r\n transform: scale(1.2);\r\n }\r\n`;\r\n\r\nexport const BottomRow = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n border-top: 1px solid ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n padding-top: 12px;\r\n margin-top: 4px;\r\n`;\r\n\r\nexport const ActionButton = styled.button<{ $primary?: boolean }>`\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n border: 1px solid ${props => props.$primary ? 'transparent' : (props.theme.colors?.border || '#e5e7eb')};\r\n background-color: ${props => props.$primary ? (props.theme.colors?.primary || '#6366f1') : (props.theme.colors?.surface || '#ffffff')};\r\n color: ${props => props.$primary ? '#ffffff' : (props.theme.colors?.text || '#1f2937')};\r\n padding: 8px 16px;\r\n font-size: 14px;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n background-color: ${props => props.$primary ? (props.theme.colors?.primaryDark || '#4f46e5') : (props.theme.colors?.background || '#f3f4f6')};\r\n transform: translateY(-1px);\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n }\r\n \r\n &:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n transform: none;\r\n box-shadow: none;\r\n }\r\n`;\r\n","import React from \"react\";\r\nimport type { QuizV2Page } from \"./types\";\r\nimport * as S from \"./LivePreviewBar.styles\";\r\n\r\nexport type PreviewViewport = \"mobile\" | \"tablet\" | \"desktop\" | \"custom\";\r\n\r\nconst VIEWPORT_OPTIONS: { value: PreviewViewport; label: string }[] = [\r\n { value: \"mobile\", label: \"Mobile\" },\r\n { value: \"tablet\", label: \"Tablet\" },\r\n { value: \"desktop\", label: \"Desktop\" },\r\n { value: \"custom\", label: \"Custom\" },\r\n];\r\n\r\nconst CUSTOM_WIDTH_MIN = 320;\r\nconst CUSTOM_WIDTH_MAX = 1200;\r\nconst CUSTOM_WIDTH_DEFAULT = 672;\r\n\r\nexport const VIEWPORT_WIDTH_CLASS: Record<\r\n Exclude<PreviewViewport, \"custom\">,\r\n string\r\n> = {\r\n mobile: \"max-w-sm\",\r\n tablet: \"max-w-3xl\",\r\n desktop: \"w-full mx-4\",\r\n};\r\n\r\nexport type PreviewViewMode = \"edit\" | \"live\";\r\n\r\nconst VIEW_MODE_OPTIONS: { value: PreviewViewMode; label: string }[] = [\r\n { value: \"edit\", label: \"Edit mode\" },\r\n { value: \"live\", label: \"Live preview\" },\r\n];\r\n\r\nexport interface LivePreviewBarProps {\r\n viewMode: PreviewViewMode;\r\n onViewModeChange: (v: PreviewViewMode) => void;\r\n viewport: PreviewViewport;\r\n onViewportChange: (v: PreviewViewport) => void;\r\n customWidthPx: number;\r\n onCustomWidthChange: (px: number) => void;\r\n dirty: boolean;\r\n onSave: () => void;\r\n onCancel: () => void;\r\n pages?: QuizV2Page[];\r\n currentPageIndex?: number;\r\n onPageChange?: (index: number) => void;\r\n}\r\n\r\nexport function LivePreviewBar({\r\n viewMode,\r\n onViewModeChange,\r\n viewport,\r\n onViewportChange,\r\n customWidthPx,\r\n onCustomWidthChange,\r\n dirty,\r\n onSave,\r\n onCancel,\r\n pages = [],\r\n currentPageIndex = 0,\r\n onPageChange,\r\n}: LivePreviewBarProps) {\r\n return (\r\n <S.Container aria-label=\"Live preview controls\">\r\n <S.TopRow>\r\n <S.LabelGroup>\r\n <S.Label>\r\n <S.Indicator aria-hidden />\r\n Preview\r\n </S.Label>\r\n <S.ToggleGroup role=\"tablist\" aria-label=\"View mode\">\r\n {VIEW_MODE_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={viewMode === value}\r\n $active={viewMode === value}\r\n onClick={() => onViewModeChange(value)}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ToggleGroup>\r\n </S.LabelGroup>\r\n <S.ToggleGroup role=\"tablist\" aria-label=\"Preview screen size\">\r\n {VIEWPORT_OPTIONS.map(({ value, label }) => (\r\n <S.ToggleButton\r\n key={value}\r\n type=\"button\"\r\n role=\"tab\"\r\n aria-selected={viewport === value}\r\n $active={viewport === value}\r\n onClick={() => onViewportChange(value)}\r\n >\r\n {label}\r\n </S.ToggleButton>\r\n ))}\r\n </S.ToggleGroup>\r\n </S.TopRow>\r\n\r\n {viewMode === \"live\" && pages.length > 1 && onPageChange && (\r\n <S.Section>\r\n <S.SectionLabel>\r\n Page Navigation\r\n </S.SectionLabel>\r\n <S.PageNavigation>\r\n {pages.map((page, index) => (\r\n <S.PageButton\r\n key={page.id}\r\n type=\"button\"\r\n onClick={() => onPageChange(index)}\r\n $active={currentPageIndex === index}\r\n aria-label={`Go to page ${index + 1}`}\r\n aria-current={currentPageIndex === index ? \"page\" : undefined}\r\n >\r\n Page {index + 1}\r\n </S.PageButton>\r\n ))}\r\n </S.PageNavigation>\r\n </S.Section>\r\n )}\r\n\r\n {viewport === \"custom\" && (\r\n <S.Section>\r\n <S.SectionLabel>\r\n Mock width: {customWidthPx}px\r\n </S.SectionLabel>\r\n <S.RangeInput\r\n type=\"range\"\r\n min={CUSTOM_WIDTH_MIN}\r\n max={CUSTOM_WIDTH_MAX}\r\n step={8}\r\n value={customWidthPx}\r\n onChange={(e) => onCustomWidthChange(Number(e.target.value))}\r\n aria-label=\"Custom preview width in pixels\"\r\n />\r\n </S.Section>\r\n )}\r\n\r\n <S.BottomRow>\r\n <S.ActionButton\r\n type=\"button\"\r\n onClick={onCancel}\r\n disabled={!dirty}\r\n >\r\n Cancel\r\n </S.ActionButton>\r\n <S.ActionButton\r\n type=\"button\"\r\n onClick={onSave}\r\n disabled={!dirty}\r\n $primary\r\n >\r\n Save\r\n </S.ActionButton>\r\n </S.BottomRow>\r\n </S.Container>\r\n );\r\n}\r\n\r\nexport { CUSTOM_WIDTH_MIN, CUSTOM_WIDTH_MAX, CUSTOM_WIDTH_DEFAULT };\r\n","import React, { useState, useEffect, useRef } from \"react\";\r\nimport { getAllQuizIds, loadQuizData } from \"./utils/quizDataLoader\";\r\nimport { getDefaultQuizV2Data } from \"./defaults\";\r\nimport type { QuizV2Data } from \"./types\";\r\nimport * as S from \"./QuizBuilderSelector.styles\";\r\n\r\nexport interface QuizBuilderSelectorProps {\r\n /** Called when user selects or creates a quiz to edit. */\r\n onSelectQuiz: (data: QuizV2Data) => void;\r\n}\r\n\r\ninterface QuizListItem {\r\n id: string;\r\n data: QuizV2Data;\r\n}\r\n\r\nexport function QuizBuilderSelector({ onSelectQuiz }: QuizBuilderSelectorProps) {\r\n const [quizzes, setQuizzes] = useState<QuizListItem[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [loadError, setLoadError] = useState<string | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n useEffect(() => {\r\n loadQuizzes();\r\n }, []);\r\n\r\n const loadQuizzes = async () => {\r\n setLoading(true);\r\n setLoadError(null);\r\n const quizIds = getAllQuizIds();\r\n const loaded = await Promise.all(\r\n quizIds.map(async (id) => {\r\n const result = await loadQuizData(id);\r\n if (result.success && result.data) return { id, data: result.data };\r\n return null;\r\n })\r\n );\r\n setQuizzes(loaded.filter((q): q is QuizListItem => q !== null));\r\n setLoading(false);\r\n };\r\n\r\n const handleCreateNew = () => {\r\n onSelectQuiz(getDefaultQuizV2Data());\r\n };\r\n\r\n const handleLoadFromFile = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n if (!file) return;\r\n setLoadError(null);\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n try {\r\n const parsed = JSON.parse(reader.result as string) as QuizV2Data;\r\n if (!parsed.pages || !Array.isArray(parsed.sections)) {\r\n setLoadError(\"Invalid quiz file: missing pages or sections.\");\r\n return;\r\n }\r\n onSelectQuiz(parsed);\r\n } catch {\r\n setLoadError(\"Invalid JSON or quiz format.\");\r\n }\r\n };\r\n reader.readAsText(file);\r\n e.target.value = \"\";\r\n };\r\n\r\n const handleSelectFromList = async (id: string) => {\r\n const result = await loadQuizData(id);\r\n if (result.success && result.data) {\r\n onSelectQuiz(result.data);\r\n } else {\r\n setLoadError(result.error ?? \"Failed to load quiz.\");\r\n }\r\n };\r\n\r\n return (\r\n <S.Container>\r\n <S.Wrapper>\r\n <S.Header>\r\n <S.Title>Quiz Builder</S.Title>\r\n <S.SubTitle>\r\n Create a new quiz, load from file, or select one to edit.\r\n </S.SubTitle>\r\n </S.Header>\r\n\r\n {loadError && (\r\n <S.ErrorBox>\r\n {loadError}\r\n </S.ErrorBox>\r\n )}\r\n\r\n <S.ButtonGrid>\r\n <S.ActionButton type=\"button\" onClick={handleCreateNew}>\r\n <S.IconCircle>\r\n <svg width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 4v16m8-8H4\" />\r\n </svg>\r\n </S.IconCircle>\r\n <S.ButtonTitle>Create New Quiz</S.ButtonTitle>\r\n <S.ButtonDesc>Start from a default template</S.ButtonDesc>\r\n </S.ActionButton>\r\n\r\n <S.ActionButton type=\"button\" onClick={() => fileInputRef.current?.click()}>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".json,application/json\"\r\n style={{ display: 'none' }}\r\n onChange={handleLoadFromFile}\r\n />\r\n <S.IconCircle>\r\n <svg width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\r\n </svg>\r\n </S.IconCircle>\r\n <S.ButtonTitle>Load Quiz</S.ButtonTitle>\r\n <S.ButtonDesc>Import from a JSON file</S.ButtonDesc>\r\n </S.ActionButton>\r\n </S.ButtonGrid>\r\n\r\n <S.ListContainer>\r\n <S.ListHeader>\r\n Select a quiz to edit\r\n </S.ListHeader>\r\n <S.ListScroll>\r\n {loading ? (\r\n <S.SpinnerWrapper>\r\n <S.Spinner />\r\n </S.SpinnerWrapper>\r\n ) : quizzes.length === 0 ? (\r\n <S.EmptyState>No saved quizzes yet.</S.EmptyState>\r\n ) : (\r\n <S.List>\r\n {quizzes.map(({ id, data }) => {\r\n const title = (data.config?.quizTitle as string) || \"Untitled Quiz\";\r\n const pageCount = data.pages?.length ?? 0;\r\n return (\r\n <S.ListItem key={id}>\r\n <S.ListItemButton\r\n type=\"button\"\r\n onClick={() => handleSelectFromList(id)}\r\n >\r\n <span style={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', marginRight: 8 }}>{title}</span>\r\n <span style={{ flexShrink: 0, fontSize: 12, color: 'inherit', opacity: 0.7 }}>\r\n {pageCount} {pageCount === 1 ? \"page\" : \"pages\"}\r\n </span>\r\n </S.ListItemButton>\r\n </S.ListItem>\r\n );\r\n })}\r\n </S.List>\r\n )}\r\n </S.ListScroll>\r\n </S.ListContainer>\r\n </S.Wrapper>\r\n </S.Container>\r\n );\r\n}\r\n","import styled, { keyframes } from 'styled-components';\r\n\r\nexport const Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 80vh;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n padding: 24px;\r\n`;\r\n\r\nexport const Wrapper = styled.div`\r\n width: 100%;\r\n max-width: 672px; /* max-w-2xl */\r\n display: flex;\r\n flex-direction: column;\r\n gap: 32px;\r\n`;\r\n\r\nexport const Header = styled.div`\r\n text-align: center;\r\n`;\r\n\r\nexport const Title = styled.h1`\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n margin-bottom: 4px;\r\n`;\r\n\r\nexport const SubTitle = styled.p`\r\n font-size: 14px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n`;\r\n\r\nexport const ErrorBox = styled.div`\r\n border-radius: ${props => props.theme.radii?.medium || '16px'};\r\n background-color: ${props => (props.theme.colors?.error || '#ef4444') + '10'};\r\n border: 1px solid ${props => (props.theme.colors?.error || '#ef4444') + '30'};\r\n color: ${props => props.theme.colors?.error || '#ef4444'};\r\n padding: 12px 16px;\r\n font-size: 14px;\r\n text-align: center;\r\n`;\r\n\r\nexport const ButtonGrid = styled.div`\r\n display: grid;\r\n gap: 16px;\r\n grid-template-columns: repeat(1, minmax(0, 1fr));\r\n \r\n @media (min-width: 640px) {\r\n grid-template-columns: repeat(2, minmax(0, 1fr));\r\n }\r\n`;\r\n\r\nexport const ActionButton = styled.button`\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: ${props => props.theme.radii?.large || '24px'};\r\n border: 2px dashed ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n padding: 32px;\r\n text-align: center;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n \r\n &:hover {\r\n border-color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '05'};\r\n transform: translateY(-2px);\r\n }\r\n`;\r\n\r\nexport const IconCircle = styled.span`\r\n display: flex;\r\n height: 48px;\r\n width: 48px;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n margin-bottom: 12px;\r\n transition: all 0.2s;\r\n \r\n ${ActionButton}:hover & {\r\n background-color: ${props => (props.theme.colors?.primary || '#6366f1') + '20'};\r\n color: ${props => props.theme.colors?.primary || '#6366f1'};\r\n }\r\n`;\r\n\r\nexport const ButtonTitle = styled.span`\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n display: block;\r\n`;\r\n\r\nexport const ButtonDesc = styled.span`\r\n margin-top: 4px;\r\n font-size: 12px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n display: block;\r\n`;\r\n\r\nexport const ListContainer = styled.div`\r\n border-radius: ${props => props.theme.radii?.large || '24px'};\r\n border: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n background-color: ${props => props.theme.colors?.surface || '#ffffff'};\r\n overflow: hidden;\r\n box-shadow: ${props => props.theme.shadows?.small || '0 1px 2px 0 rgb(0 0 0 / 0.05)'};\r\n`;\r\n\r\nexport const ListHeader = styled.h2`\r\n border-bottom: 1px solid ${props => props.theme.colors?.border || '#e5e7eb'};\r\n padding: 12px 16px;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n`;\r\n\r\nexport const ListScroll = styled.div`\r\n max-height: 256px;\r\n overflow-y: auto;\r\n padding: 8px;\r\n`;\r\n\r\nexport const List = styled.ul`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n`;\r\n\r\nexport const ListItem = styled.li`\r\n width: 100%;\r\n`;\r\n\r\nexport const ListItemButton = styled.button`\r\n display: flex;\r\n width: 100%;\r\n align-items: center;\r\n justify-content: space-between;\r\n border-radius: ${props => props.theme.radii?.small || '12px'};\r\n padding: 10px 12px;\r\n text-align: left;\r\n font-size: 14px;\r\n transition: all 0.2s;\r\n background-color: transparent;\r\n border: none;\r\n cursor: pointer;\r\n color: ${props => props.theme.colors?.text || '#1f2937'};\r\n \r\n &:hover {\r\n background-color: ${props => props.theme.colors?.background || '#f3f4f6'};\r\n }\r\n`;\r\n\r\nconst spin = keyframes`\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n`;\r\n\r\nexport const SpinnerWrapper = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 48px 0;\r\n`;\r\n\r\nexport const Spinner = styled.div`\r\n height: 32px;\r\n width: 32px;\r\n border-radius: 50%;\r\n border: 2px solid ${props => props.theme.colors?.primary || '#6366f1'};\r\n border-top-color: transparent;\r\n animation: ${spin} 1s linear infinite;\r\n`;\r\n\r\nexport const EmptyState = styled.p`\r\n text-align: center;\r\n font-size: 14px;\r\n color: ${props => props.theme.colors?.textSecondary || '#6b7280'};\r\n padding: 32px 0;\r\n`;\r\n","import styled from 'styled-components';\r\nimport { motion } from 'framer-motion';\r\nimport { theme } from './styles/theme';\r\n\r\n\r\nexport const EditorContainer = styled.div`\r\n display: flex;\r\n height: 100%;\r\n min-height: 0;\r\n width: 100%;\r\n flex: 1;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background-color: ${props => props.theme.colors.background};\r\n`;\r\n\r\nexport const TopBar = styled.div`\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 16px;\r\n border-bottom: 1px solid ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.surface};\r\n padding: 8px 16px;\r\n`;\r\n\r\nexport const ButtonGroup = styled.div`\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n`;\r\n\r\nexport const BackButton = styled.button`\r\n border-radius: ${props => props.theme.radii.small};\r\n border: 1px solid ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.surface};\r\n padding: 6px 12px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors.text};\r\n transition: ${props => props.theme.transitions.default};\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${props => props.theme.colors.background};\r\n }\r\n`;\r\n\r\nexport const CreateButton = styled(BackButton)`\r\n border-color: ${props => props.theme.colors.primaryLight};\r\n background-color: ${props => props.theme.colors.primary}10;\r\n color: ${props => props.theme.colors.primaryDark};\r\n\r\n &:hover {\r\n background-color: ${props => props.theme.colors.primary}20;\r\n }\r\n`;\r\n\r\nexport const AlertText = styled.p`\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors.warning};\r\n margin: 0;\r\n`;\r\n\r\nexport const MainLayout = styled.div`\r\n display: flex;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n overflow: hidden;\r\n\r\n @media (min-width: 1024px) {\r\n flex-direction: row;\r\n }\r\n`;\r\n\r\nexport const LeftSidebar = styled.aside`\r\n display: flex;\r\n width: 100%;\r\n flex-shrink: 0;\r\n flex-direction: column;\r\n overflow: hidden; /* Changed from overflow-y: auto to handle internal scrolling */\r\n border-right: 1px solid ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.surface};\r\n \r\n @media (min-width: 1024px) {\r\n width: 256px; /* w-64 */\r\n }\r\n`;\r\n\r\nexport const ModeSwitcher = styled.div`\r\n display: flex;\r\n border-bottom: 1px solid ${props => props.theme.colors.border};\r\n`;\r\n\r\nexport const ModeTab = styled.button<{ $active: boolean }>`\r\n flex: 1;\r\n padding: 12px;\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: ${props => props.$active ? props.theme.colors.primary : props.theme.colors.textSecondary};\r\n background: ${props => props.$active ? props.theme.colors.surface : props.theme.colors.background};\r\n border: none;\r\n border-bottom: 2px solid ${props => props.$active ? props.theme.colors.primary : 'transparent'};\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n color: ${props => props.theme.colors.primary};\r\n background: ${props => props.theme.colors.surface};\r\n }\r\n`;\r\n\r\nexport const LeftSidebarContent = styled.div`\r\n display: flex;\r\n flex: 1;\r\n flex-direction: column;\r\n gap: 16px;\r\n padding: 12px;\r\n overflow-y: auto;\r\n`;\r\n\r\nexport const MainPreviewArea = styled.main`\r\n display: flex;\r\n min-height: 0;\r\n flex: 1;\r\n flex-direction: column;\r\n overflow: hidden;\r\n background-color: ${props => props.theme.colors.background};\r\n`;\r\n\r\nexport const PreviewBarWrapper = styled.div`\r\n flex-shrink: 0;\r\n padding: 16px 16px 0;\r\n`;\r\n\r\nexport const PreviewContent = styled.div<{ width?: string | number }>`\r\n min-height: 0;\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 16px;\r\n margin: 0 auto;\r\n display: flex;\r\n flex-direction: column;\r\n width: ${props => (typeof props.width === 'number' ? `${props.width}px` : props.width || '100%')};\r\n transition: width 0.3s ease;\r\n \r\n /* Hide scrollbar for cleaner look */\r\n &::-webkit-scrollbar {\r\n width: 8px;\r\n }\r\n &::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n background-color: rgba(0,0,0,0.1);\r\n border-radius: 4px;\r\n }\r\n`;\r\n\r\nexport const LayoutContainer = styled(motion.div) <{ $isLayoutMode?: boolean }>`\r\n margin: 0 auto;\r\n display: flex; \r\n flex-direction: column;\r\n gap: 16px;\r\n background-color: ${props => props.theme.colors.surface};\r\n padding: 24px;\r\n position: relative;\r\n width: 100%; \r\n border-radius: ${props => props.theme.radii.medium};\r\n box-shadow: ${props => props.theme.shadows.medium};\r\n border: 2px solid ${props => props.$isLayoutMode ? props.theme.colors.primary + '40' : 'transparent'};\r\n`;\r\n\r\nexport const LayoutModeBadge = styled.div`\r\n position: absolute;\r\n top: -12px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background-color: ${props => props.theme.colors.primary};\r\n color: white;\r\n padding: 4px 12px;\r\n border-radius: 12px;\r\n font-size: 11px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n z-index: 10;\r\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\r\n`;\r\n\r\nexport const EmptyState = styled.div`\r\n border-radius: ${props => props.theme.radii.medium};\r\n border: 2px dashed ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.background}80;\r\n padding: 24px;\r\n text-align: center;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n`;\r\n\r\nexport const EmptyStateTitle = styled.p`\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors.text};\r\n margin: 0;\r\n`;\r\n\r\nexport const EmptyStateText = styled.p`\r\n font-size: 12px;\r\n color: ${props => props.theme.colors.textSecondary};\r\n max-width: 240px;\r\n margin: 0;\r\n`;\r\n\r\nexport const AddSectionButton = styled.button`\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n border-radius: ${props => props.theme.radii.medium};\r\n border: 2px dashed ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.background};\r\n padding: 12px 24px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors.textSecondary};\r\n transition: ${props => props.theme.transitions.default};\r\n cursor: pointer;\r\n margin: 0 auto;\r\n\r\n &:hover {\r\n border-color: ${props => props.theme.colors.primaryLight};\r\n background-color: ${props => props.theme.colors.primary}10;\r\n color: ${props => props.theme.colors.primaryDark};\r\n transform: scale(1.02);\r\n }\r\n`;\r\n\r\nexport const RightSidebar = styled.aside`\r\n display: flex;\r\n min-height: 0;\r\n width: 100%;\r\n flex-direction: column;\r\n border-left: 1px solid ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.surface};\r\n overflow-y: auto;\r\n\r\n @media (min-width: 1024px) {\r\n width: 320px; /* w-[20rem] */\r\n min-width: 320px;\r\n flex-shrink: 0;\r\n }\r\n`;\r\n\r\nexport const RightSidebarContent = styled.div`\r\n display: flex;\r\n flex: 1;\r\n flex-direction: column;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n padding: 20px;\r\n min-height: 0;\r\n gap: 16px;\r\n`;\r\n\r\nexport const SidebarTitle = styled.h3`\r\n font-size: 11px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 0.1em;\r\n color: ${props => props.theme.colors.textSecondary};\r\n margin-bottom: 4px;\r\n`;\r\n\r\nexport const ModalOverlay = styled(motion.div)`\r\n position: fixed;\r\n inset: 0;\r\n z-index: 50;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background-color: rgba(0, 0, 0, 0.4);\r\n backdrop-filter: blur(4px);\r\n padding: 16px;\r\n`;\r\n\r\nexport const ModalContent = styled(motion.div)`\r\n width: 100%;\r\n max-width: 400px;\r\n background-color: ${props => props.theme.colors.surface};\r\n border-radius: ${props => props.theme.radii.medium};\r\n box-shadow: ${props => props.theme.shadows.large};\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n`;\r\n\r\nexport const ModalHeader = styled.div`\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n border-bottom: 1px solid ${props => props.theme.colors.border};\r\n padding: 16px 20px;\r\n`;\r\n\r\nexport const ModalTitle = styled.h2`\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors.text};\r\n margin: 0;\r\n`;\r\n\r\nexport const CloseButton = styled.button`\r\n border-radius: ${props => props.theme.radii.small};\r\n padding: 6px;\r\n color: ${props => props.theme.colors.textSecondary};\r\n cursor: pointer;\r\n background: transparent;\r\n border: none;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n \r\n &:hover {\r\n background-color: ${props => props.theme.colors.background};\r\n color: ${props => props.theme.colors.text};\r\n }\r\n`;\r\n\r\nexport const ModalBody = styled.div`\r\n padding: 20px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n`;\r\n\r\nexport const ActionButton = styled(motion.button) <{ variant?: 'primary' | 'secondary' | 'danger' }>`\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n text-align: left;\r\n padding: 12px 16px;\r\n border-radius: ${props => props.theme.radii.small};\r\n border: 1px solid ${props => props.theme.colors.border};\r\n background-color: ${props => props.theme.colors.surface};\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors.text};\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n border-color: ${props => props.theme.colors.primaryLight};\r\n background-color: ${props => props.theme.colors.primary}10;\r\n }\r\n \r\n ${props => props.variant === 'primary' && `\r\n background-color: ${props.theme.colors.primary}10;\r\n color: ${props.theme.colors.primaryDark};\r\n border-color: ${props.theme.colors.primary};\r\n &:hover {\r\n background-color: ${props.theme.colors.primary}20;\r\n }\r\n `}\r\n`;\r\n\r\nexport const DeleteButton = styled.button`\r\n border-radius: ${props => props.theme.radii.small};\r\n border: 1px solid ${props => props.theme.colors.error}40;\r\n background-color: ${props => props.theme.colors.surface};\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n font-weight: 500;\r\n color: ${props => props.theme.colors.error};\r\n transition: all 0.2s;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background-color: ${props => props.theme.colors.error}10;\r\n border-color: ${props => props.theme.colors.error};\r\n }\r\n`;\r\n\r\nexport const InputGroup = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n margin-bottom: 16px;\r\n`;\r\n\r\nexport const Label = styled.label`\r\n font-size: 12px;\r\n font-weight: 600;\r\n color: ${props => props.theme.colors.textSecondary};\r\n`;\r\n\r\nexport const Input = styled.input`\r\n border-radius: ${props => props.theme.radii.small};\r\n border: 1px solid ${props => props.theme.colors.border};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n width: 100%;\r\n color: ${props => props.theme.colors.text};\r\n background-color: ${props => props.theme.colors.surface};\r\n transition: border-color 0.2s, box-shadow 0.2s;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors.primary};\r\n box-shadow: 0 0 0 3px ${props => props.theme.colors.primary}20;\r\n }\r\n`;\r\n\r\nexport const Select = styled.select`\r\n border-radius: ${props => props.theme.radii.small};\r\n border: 1px solid ${props => props.theme.colors.border};\r\n padding: 8px 12px;\r\n font-size: 14px;\r\n width: 100%;\r\n color: ${props => props.theme.colors.text};\r\n background-color: ${props => props.theme.colors.surface};\r\n cursor: pointer;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: ${props => props.theme.colors.primary};\r\n }\r\n`;\r\n\r\nexport const ConfigSection = styled.div<{ $colorType?: keyof typeof theme.colors }>`\r\n margin-bottom: 12px;\r\n`;\r\n"],"mappings":"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","names":["import_react","import_react_phone_number_input","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","INPUT_SIZE_CLASS","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","INPUT_SIZE_CLASS","PhoneInput","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","data","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","labelClass","inputClass","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","labelClass","inputClass","fieldClass","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","defaultInputClass","defaultLabelClass","import_react","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","POSITION_OPTIONS","toNumberOrUndefined","presetToPx","inputClass","labelClass","fieldClass","import_jsx_runtime","import_react","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","import_jsx_runtime","inputClass","import_react","import_jsx_runtime","inputClass","labelClass","import_react","import_jsx_runtime","inputClass","labelClass","fieldClass","import_jsx_runtime","fieldClass","labelClass","inputClass","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","fieldClass","labelClass","inputClass","import_react","import_formik","import_styled_components","generateId","uuidv4","generateId","styled","import_jsx_runtime","import_formik","import_react_phone_number_input","import_style","import_styled_components","import_framer_motion","styled","import_jsx_runtime","import_jsx_runtime","PhoneInput","import_styled_components","import_framer_motion","styled","import_jsx_runtime","import_styled_components","styled","import_jsx_runtime","import_styled_components","styled","import_jsx_runtime","import_styled_components","Wrapper","styled","import_jsx_runtime","POSITION_JUSTIFY","Wrapper","import_styled_components","import_framer_motion","Wrapper","styled","import_jsx_runtime","Wrapper","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_uuid","uuidv4","import_styled_components","styled","import_jsx_runtime","data","pages","currentPageIndex","setCurrentPageIndex","safePageIndex","headerSectionIds","footerSectionIds","rootSectionIds","sectionsById","collectInputFieldNames","withDefaultTracking","onSubmit","layoutMaxWidth","quizTitle","quizDescription","currentPage","theme","import_react","import_styled_components","import_framer_motion","import_styled_components","styled","Title","import_jsx_runtime","Title","import_styled_components","Container","styled","Header","Title","import_jsx_runtime","Container","Header","Title","import_react","import_styled_components","Container","styled","Title","Label","import_jsx_runtime","getSectionLabel","React","Label","Container","Title","import_jsx_runtime","import_styled_components","styled","Label","Input","Select","ActionRow","ActionButton","import_jsx_runtime","Label","Input","import_jsx_runtime","Label","Input","import_jsx_runtime","Label","Input","import_styled_components","import_jsx_runtime","styled","LAYOUT_OPTIONS","Label","Select","Input","import_styled_components","import_jsx_runtime","styled","InfoBox","Label","Input","import_styled_components","import_jsx_runtime","styled","Label","Select","Input","ActionButton","import_react","import_jsx_runtime","Label","Input","ActionButton","import_jsx_runtime","POSITION_OPTIONS","IMAGE_OBJECT_FIT_OPTIONS","Label","Input","POSITION_OPTIONS","Select","ActionButton","ActionRow","import_jsx_runtime","SIZE_OPTIONS","WIDTH_OPTIONS","POSITION_OPTIONS","Label","Input","Select","import_styled_components","import_jsx_runtime","TextArea","styled","Label","Input","import_jsx_runtime","SIZE_OPTIONS","POSITION_OPTIONS","Label","Input","import_jsx_runtime","WIDTH_OPTIONS","POSITION_OPTIONS","Label","Input","import_jsx_runtime","Label","Select","Input","import_styled_components","Container","styled","Label","ToggleButton","Section","PageButton","ActionButton","import_jsx_runtime","VIEWPORT_OPTIONS","CUSTOM_WIDTH_MIN","CUSTOM_WIDTH_MAX","CUSTOM_WIDTH_DEFAULT","Container","Label","ToggleButton","VIEWPORT_OPTIONS","Section","PageButton","CUSTOM_WIDTH_MIN","CUSTOM_WIDTH_MAX","ActionButton","import_react","import_styled_components","Container","styled","Wrapper","Header","Title","ActionButton","SpinnerWrapper","Spinner","EmptyState","import_jsx_runtime","Container","Wrapper","Header","Title","ActionButton","SpinnerWrapper","Spinner","EmptyState","import_styled_components","import_framer_motion","styled","ButtonGroup","EmptyState","ActionButton","DeleteButton","Label","Input","Select","import_jsx_runtime","generateId","CUSTOM_WIDTH_DEFAULT","toUnlink","sectionsWithCleanedRefs","pages","layouts","config","ButtonGroup","id","EmptyState","ActionButton","Select","DeleteButton","Label","Input"]}