{"version":3,"file":"FormPersistence.CsPRXMyp.mjs","names":["useState","useRef","useCallback","__esmMin","init_ssg_sandbox_shims","ne","window","_e","de","init_jsx_runtime","J","p","init_npm_react_18_3_1","ce","motion","init_framer_motion_DhsWWWsN","init_framer_BWFVvmND","useObserveData","addPropertyControls","Data","RenderTarget","ControlType","withCSS","createStore","dataStore","state1","setDataStore","newState","storeState","storeSetters","setStoreState","setter","useStore","state","setState","init_createStore","init_store_js__1_0","init_quizScoringShared","Border","width","style","getFormInfo","form","element","formId","pages","uuid","d","d2","c","setupAutofillOverride","INSERT_FRAME_FRAMER_FORMS_DOCS","useMultiStepFormStore","HIDDEN_CLASS_NAME","CANVAS_HIDDEN_CLASS_NAME","HideElementComponent","HideElement","HiddenComponentLabel","init_FramerFormsShared","otherProps","children","text","subtext","collectNamedFormControls","out","walk","node","t","child","findFormControlsByName","el","fieldName","coerceStoredValue","value","setNativeFormControlValue","str","set","input","dispatchInputAndChange","FormPersistence","userFormId","props","isCanvas","ref","formInfoRef","debounceTimerRef","isRestoringRef","multiStepFormState","setMultiStepFormState","multiStepFormStateRef","getStorageKey","trimmedId","STORAGE_KEY_PREFIX","normalizedPath","pathname","origin","getExpiryTimestamp","expiryTimeUnit","expiryTimeMinutes","expiryTimeHours","expiryTimeDays","expiryTimeWeeks","expiryTimeMonths","now","millisecondsToAdd","serializeForm","values","append","name","type","opt","saveToStorage","formInfo","storageKey","data","expiresAt","restorePageHistory","error","debouncedSave","DEBOUNCE_DELAY","restoreInputValue","clearStorage","restoreFromStorage","stored","valuesToRestore","pendingValues","valueEntries","restoredCount","stillPending","inputs","allInputsRestored","retryCount","pageHistory","currentState","prev","handleInput","handleSubmit","currentPageHistory","pageHistoryKey","init_FormPersistence"],"sources":["https:/framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js","https:/framer.com/m/framer/store.js@^1.0.0","https:/framerusercontent.com/modules/JuFDdB0T6hfQnnTurnv8/CQrHCALaPa5dg1MBvTut/quizScoringShared.js","https:/framerusercontent.com/modules/z8cIEIxb4MjL2nvvhvk3/3MiLXMvQ5kE7UWgyPJjd/FramerFormsShared.js","https:/framerusercontent.com/modules/52diJuraiuwpN6ldSftU/aQpsDUNcgqnvQvLHvdza/FormPersistence.js"],"sourcesContent":["import{useState,useEffect}from\"react\";import{Data,useObserveData}from\"framer\";export function createStore(state1){// Use Data so that a Preview reload resets the state\nconst dataStore=Data({state:Object.freeze({...state1})});// Create a set function that updates the state\nconst setDataStore=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(dataStore.state);}dataStore.state=Object.freeze({...dataStore.state,...newState});};// Store the initial state, copy the object if it's an object\nlet storeState=typeof state1===\"object\"?Object.freeze({...state1}):state1;// Keep a list of all the listeners, in the form of React hook setters\nconst storeSetters=new Set();// Create a set function that updates all the listeners / setters\nconst setStoreState=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(storeState);}storeState=typeof newState===\"object\"?Object.freeze({...storeState,...newState}):newState;// Update all the listeners / setters with the new value\nstoreSetters.forEach(setter=>setter(storeState));};// Create the actual hook based on everything above\nfunction useStore(){// Create the hook we are going to use as a listener\nconst[state,setState]=useState(storeState);// If we unmount the component using this hook, we need to remove the listener\n// @ts-ignore\nuseEffect(()=>{// But right now, we need to add the listener\nstoreSetters.add(setState);return()=>storeSetters.delete(setState);},[]);// If Data context exists, use Data, otherwise use vanilla React state\nif(useObserveData()===true){useObserveData();return[dataStore.state,setDataStore];}else{// Return the state and a function to update the central store\nreturn[state,setStoreState];}}return useStore;}\nexport const __FramerMetadata__ = {\"exports\":{\"createStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./createStore.map","/*\n * createStore (framer/store@1.0.1)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js\"\n","import{ControlType}from\"framer\";export const QUIZ_MULTI_SELECT_AGGREGATES=[\"sum\",\"average\",\"max\",\"min\"];export function normalizeQuizMultiSelectAggregate(raw){if(raw===\"average\"||raw===\"max\"||raw===\"min\"){return raw;}return\"sum\";}export function normalizeOptionPointRows(raw){if(!raw?.length)return[];return raw.map(r=>({optionValue:(r.optionValue??\"\").trim(),points:r.points!==undefined&&Number.isFinite(r.points)?Number(r.points):0})).filter(r=>r.optionValue.length>0);}export function parseOptionPointsAttr(attr){if(!attr)return null;try{const v=JSON.parse(attr);const rows=normalizeOptionPointRows(v.rows);if(!rows.length)return null;const defaultPoints=v.defaultPoints!==undefined&&Number.isFinite(v.defaultPoints)?Number(v.defaultPoints):0;return{defaultPoints,rows};}catch{return null;}}function resolvePartToPoints(part,rows,defaultPoints){const row=rows.find(r=>r.optionValue===part);if(row&&Number.isFinite(row.points))return row.points;return defaultPoints;}function splitMultiSelectValue(value,valueSeparator){return value.split(valueSeparator).map(s=>s.trim()).filter(Boolean);}function aggregateMultiSelectPoints(partPoints,aggregate){if(!partPoints.length)return 0;switch(aggregate){case\"sum\":return partPoints.reduce((sum,p)=>sum+p,0);case\"average\":return partPoints.reduce((sum,p)=>sum+p,0)/partPoints.length;case\"max\":return Math.max(...partPoints);case\"min\":return Math.min(...partPoints);default:return partPoints.reduce((sum,p)=>sum+p,0);}}/** Maximum achievable points for one weighted question. */export function maxWeightedQuestionPoints(parsed,multiSelect,aggregate=\"sum\"){const{rows,defaultPoints}=parsed;if(!rows.length)return 0;if(!multiSelect){const rowMax=Math.max(...rows.map(r=>r.points),defaultPoints);return Number.isFinite(rowMax)?rowMax:defaultPoints;}const positiveSum=rows.filter(r=>r.points>0).reduce((sum,r)=>sum+r.points,0);const maxPoint=Math.max(...rows.map(r=>r.points),defaultPoints);switch(aggregate){case\"sum\":return positiveSum;case\"average\":case\"max\":case\"min\":return Number.isFinite(maxPoint)?maxPoint:defaultPoints;default:return positiveSum;}}export function scoreWeightedFieldValue(value,parsed,opts){const multiSelect=opts.matchMode===\"set\";const aggregate=normalizeQuizMultiSelectAggregate(opts.multiSelectAggregate);const maxPoints=maxWeightedQuestionPoints(parsed,multiSelect,aggregate);const trimmed=value.trim();if(!trimmed){return{earned:0,maxPoints};}if(multiSelect){const sep=opts.valueSeparator??\", \";const parts=splitMultiSelectValue(trimmed,sep);const partPoints=parts.map(part=>resolvePartToPoints(part,parsed.rows,parsed.defaultPoints));const earned=aggregateMultiSelectPoints(partPoints,aggregate);return{earned,maxPoints};}const earned=resolvePartToPoints(trimmed,parsed.rows,parsed.defaultPoints);return{earned,maxPoints};}export function isQuizWeightedConfig(quiz){return!!quiz?.isQuizInput&&quiz.scoringMethod===\"weighted\"&&normalizeOptionPointRows(quiz.optionPoints).length>0;}export const QUIZ_DATA_ATTRIBUTE_KEYS=[\"data-framerforms-quiz\",\"data-framerforms-quiz-scoring\",\"data-framerforms-correct-answer\",\"data-framerforms-quiz-points\",\"data-framerforms-quiz-wrong-points\",\"data-framerforms-quiz-options\",\"data-framerforms-quiz-option-points\",\"data-framerforms-quiz-multiselect-aggregate\"];export function clearQuizDataAttributes(el){for(const key of QUIZ_DATA_ATTRIBUTE_KEYS){el.removeAttribute(key);}}export function applyQuizDataAttributes(el,attrs){clearQuizDataAttributes(el);for(const[key,value]of Object.entries(attrs)){el.setAttribute(key,value);}}export function buildQuizInputDataAttributes(quiz,options){if(!quiz?.isQuizInput)return{};if(isQuizWeightedConfig(quiz)){const rows=normalizeOptionPointRows(quiz.optionPoints);const defaultPoints=quiz.defaultOptionPoints!==undefined&&Number.isFinite(quiz.defaultOptionPoints)?Number(quiz.defaultOptionPoints):0;const attrs={\"data-framerforms-quiz\":\"true\",\"data-framerforms-quiz-scoring\":\"weighted\",\"data-framerforms-quiz-option-points\":JSON.stringify({defaultPoints,rows})};if(quiz.multiSelect){attrs[\"data-framerforms-quiz-multiselect-aggregate\"]=normalizeQuizMultiSelectAggregate(quiz.multiSelectAggregate);}if(options.quizOptionsJson&&Object.keys(options.quizOptionsJson).length){attrs[\"data-framerforms-quiz-options\"]=JSON.stringify(options.quizOptionsJson);}return attrs;}const ca=options.correctAnswer;const hasCorrect=ca!=null&&ca!==\"\"&&!(Array.isArray(ca)&&ca.length===0);if(!hasCorrect)return{};const correctStr=Array.isArray(ca)?JSON.stringify(ca):String(ca);const attrs={\"data-framerforms-quiz\":\"true\",\"data-framerforms-quiz-scoring\":\"correctIncorrect\",\"data-framerforms-correct-answer\":correctStr,\"data-framerforms-quiz-points\":String(quiz.points??1),\"data-framerforms-quiz-wrong-points\":String(quiz.wrongPoints??0)};if(options.quizOptionsJson&&Object.keys(options.quizOptionsJson).length){attrs[\"data-framerforms-quiz-options\"]=JSON.stringify(options.quizOptionsJson);}return attrs;}export function createQuizNestedControls(correctControls,options){const hideUnlessQuiz=inner=>!inner.isQuizInput;const hideUnlessWeighted=inner=>!inner.isQuizInput||inner.scoringMethod!==\"weighted\";const hideQuizMultiSelect=inner=>hideUnlessWeighted(inner)||!options?.supportsMultiSelect;const hideMultiSelectAggregate=inner=>hideQuizMultiSelect(inner)||!inner.multiSelect;const hideUnlessCorrect=inner=>!inner.isQuizInput||(inner.scoringMethod??\"correctIncorrect\")===\"weighted\";const wrappedCorrect={};for(const[key,ctrl]of Object.entries(correctControls)){const c=ctrl;const prevHidden=c.hidden;wrappedCorrect[key]={...c,hidden:inner=>hideUnlessCorrect(inner)||typeof prevHidden===\"function\"&&prevHidden(inner)};}return{isQuizInput:{type:ControlType.Boolean,title:\"Quiz\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},scoringMethod:{type:ControlType.Enum,title:\"Scoring\",options:[\"correctIncorrect\",\"weighted\"],optionTitles:[\"Correct / wrong\",\"Weighted options\"],defaultValue:\"correctIncorrect\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",hidden:hideUnlessQuiz},...wrappedCorrect,points:{type:ControlType.Number,title:\"Correct\",defaultValue:1,min:-100,max:100,step:1,displayStepper:true,hidden:hideUnlessCorrect},wrongPoints:{type:ControlType.Number,title:\"Wrong\",defaultValue:0,min:-100,max:100,step:1,displayStepper:true,hidden:hideUnlessCorrect},defaultOptionPoints:{type:ControlType.Number,title:\"If no match\",defaultValue:0,min:-1e9,max:1e9,step:.01,displayStepper:true,hidden:hideUnlessWeighted},optionPoints:{type:ControlType.Array,title:\"Points\",defaultValue:[{optionValue:\"\",points:1}],description:\"Points per answer value.\",hidden:hideUnlessWeighted,control:{type:ControlType.Object,controls:{optionValue:{type:ControlType.String,title:\"Value\",defaultValue:\"\",placeholder:\"e.g. 'Option1'\"},points:{type:ControlType.Number,title:\"Points\",defaultValue:1,min:-1e9,max:1e9,step:.01,displayStepper:true}}}},...options?.supportsMultiSelect?{multiSelect:{type:ControlType.Boolean,title:\"Multi-select\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\",hidden:hideQuizMultiSelect},multiSelectAggregate:{type:ControlType.Enum,title:\"Calculate\",options:QUIZ_MULTI_SELECT_AGGREGATES,optionTitles:[\"Sum\",\"Average\",\"Highest\",\"Lowest\"],defaultValue:\"sum\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",description:\"How to combine points when multiple options are selected.\",hidden:hideMultiSelectAggregate}}:{}};}\nexport const __FramerMetadata__ = {\"exports\":{\"normalizeOptionPointRows\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"buildQuizInputDataAttributes\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizOptionPointRow\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"maxWeightedQuestionPoints\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"NormalizedOptionPoints\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"applyQuizDataAttributes\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isQuizWeightedConfig\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CreateQuizNestedControlsOptions\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"clearQuizDataAttributes\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"normalizeQuizMultiSelectAggregate\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parseOptionPointsAttr\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QUIZ_DATA_ATTRIBUTE_KEYS\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizScoringMethod\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"scoreWeightedFieldValue\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createQuizNestedControls\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizInputConfig\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QUIZ_MULTI_SELECT_AGGREGATES\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizMultiSelectAggregate\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./quizScoringShared.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{ControlType,RenderTarget,withCSS}from\"framer\";import{forwardRef,useEffect,useState,useRef,useId,useCallback}from\"react\";import{motion}from\"framer-motion\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";import{parseOptionPointsAttr,scoreWeightedFieldValue,normalizeQuizMultiSelectAggregate}from\"https://framerusercontent.com/modules/JuFDdB0T6hfQnnTurnv8/CQrHCALaPa5dg1MBvTut/quizScoringShared.js\";// ---------------------------------------------------------------------------\n// Shared property controls (Insert Frame docs / support)\n// ---------------------------------------------------------------------------\nconst INSERT_FRAME_FRAMER_FORMS_DOCS=\"https://insertframe.io/docs/framerforms\";/** Spread into `addPropertyControls`: “Need help?” → Get support (Framer Forms docs). */export const insertFrameSupportPropertyControl={needHelp:{type:ControlType.Object,title:\"Need help?\",buttonTitle:\"Get support\",icon:\"interaction\",controls:{info:{type:ControlType.Enum,defaultValue:\"info\",options:[\"info\"],optionTitles:[\"Get support 🛟\"],displaySegmentedControl:true,title:\"Get support\",description:`Documentation and live chat: [FramerForms docs](${INSERT_FRAME_FRAMER_FORMS_DOCS}).`}}}};export const useMultiStepFormStore=createStore({});export const useQuizStore=createStore({});/** Typed tuple for consumers (avoids `as` at every call site). */export function useQuizStoreApi(){return useQuizStore();}export function createEmptyQuizScore(){return{correct:0,total:0,points:0,maxPoints:0,answers:{}};}export const useFormSubmittedStore=createStore({});export function useFormSubmittedStoreApi(){return useFormSubmittedStore();}export const HIDDEN_CLASS_NAME=\"framerforms-hidden\";const CANVAS_HIDDEN_CLASS_NAME=\"framerforms-canvas-hidden\";export const useInstanceId=()=>{const id=useId();const cleanId=id.replace(/:/g,\"\");const instanceId=`superfields-${cleanId}`;return instanceId;};export const HiddenInput=/*#__PURE__*/forwardRef(function HiddenInput({name,required,value,setInvalid,onSetValueEvent,noPrefill=false,disabled=false,style:styleProp,...rest},parentRef){const internalRef=useRef(null);const setRefs=useCallback(el=>{internalRef.current=el;if(typeof parentRef===\"function\"){parentRef(el);}else if(parentRef){parentRef.current=el;}},[parentRef]);const prevValueRef=useRef(value);// Store callback in ref to avoid listener churn\nconst onSetValueEventRef=useRef(onSetValueEvent);onSetValueEventRef.current=onSetValueEvent;useEffect(()=>{const element=internalRef.current;if(!element||!onSetValueEventRef.current)return;// Use a wrapper that always calls the latest callback\nconst handler=event=>{onSetValueEventRef.current?.(event);};element.addEventListener(\"framerFormsSetValue\",handler);// Mark as ready AFTER listener is attached - FormPersistence checks for this\nelement.dataset.framerformsSetValueReady=\"true\";return()=>{element.removeEventListener(\"framerFormsSetValue\",handler);delete element.dataset.framerformsSetValueReady;};},[])// Empty deps - only attach once\n;// Dispatch change event when value changes so FormPersistence can track updates\nuseEffect(()=>{const element=internalRef.current;if(!element)return;// Only dispatch if value actually changed (not on initial mount)\nif(prevValueRef.current!==value){prevValueRef.current=value;// Dispatch both input and change events for compatibility\nelement.dispatchEvent(new Event(\"input\",{bubbles:true}));element.dispatchEvent(new Event(\"change\",{bubbles:true}));}},[value]);return /*#__PURE__*/_jsx(\"input\",{ref:setRefs,type:\"text\",\"data-framerforms-set-value-event\":!!onSetValueEvent,\"data-framerforms-no-prefill\":noPrefill,...rest,style:{position:\"absolute\",opacity:0,pointerEvents:\"none\",inset:0,...styleProp},tabIndex:-1,name:name,required:required,value:value,disabled:disabled,onChange:()=>{},onInvalid:event=>{event.preventDefault();setInvalid(true);}});});const HideElementComponent=/*#__PURE__*/forwardRef(({},ref)=>{return /*#__PURE__*/_jsx(\"div\",{ref:ref,className:HIDDEN_CLASS_NAME});});export const HideElement=withCSS(HideElementComponent,[`div:has(> .${HIDDEN_CLASS_NAME}) { display: none; }`,`.${HIDDEN_CLASS_NAME} { display: none; }`],HIDDEN_CLASS_NAME);HideElement.displayName=\"FramerForms/Hide Element Staging\";export const HiddenComponentLabel=/*#__PURE__*/forwardRef(function HiddenComponentLabel({text,subtext=\"\",children=null,...otherProps},ref){const isCanvas=RenderTarget.current()===RenderTarget.canvas;return isCanvas?/*#__PURE__*/_jsxs(\"div\",{\"data-framerforms\":true,...otherProps,ref:ref,className:CANVAS_HIDDEN_CLASS_NAME,style:{backgroundColor:\"rgba(187, 187, 187, 0.15)\",borderRadius:10,padding:\"12px 16px\",fontFamily:\"Inter\",fontWeight:500,fontSize:12,color:\"#999\",display:\"flex\",flexDirection:\"column\",gap:4,alignItems:\"center\",textAlign:\"center\",width:\"100%\",height:\"100%\",textWrap:\"nowrap\"},children:[children,text,subtext&&/*#__PURE__*/_jsx(\"span\",{style:{opacity:.7,whiteSpace:\"pre\",lineHeight:1.4},children:subtext}),/*#__PURE__*/_jsx(Border,{width:\"1px\",style:\"solid\",borderColor:\"rgba(136, 136, 136, 0.1)\"}),/*#__PURE__*/_jsx(\"style\",{dangerouslySetInnerHTML:{__html:`\n                        [data-framer-component-container=\"true\"] div:has(> .${CANVAS_HIDDEN_CLASS_NAME}) {\n                            display: none !important;\n                        }`}})]}):/*#__PURE__*/_jsxs(\"div\",{...otherProps,ref:ref,className:HIDDEN_CLASS_NAME,children:[/*#__PURE__*/_jsx(HideElement,{}),children]});});HiddenComponentLabel.displayName=\"FramerForms/Hidden Component Label Staging\";export function iconProp({size=16,buttonTitle=\"Icon\",controls={}}={}){return{type:ControlType.Object,buttonTitle,optional:true,defaultValue:{color:\"#999\",size},controls:{image:{type:ControlType.Image},color:{type:ControlType.Color,optional:true,defaultValue:\"#999\"},size:{type:ControlType.Number,defaultValue:size,min:1,step:1,displayStepper:true},...controls}};}export function Icon({image,color,size,style={},defaultImage}){return /*#__PURE__*/_jsx(\"div\",{style:{width:size,height:size,minWidth:size,minHeight:size,pointerEvents:\"none\",backgroundColor:color,backgroundImage:color?\"none\":image?`url('${image}')`:defaultImage,maskImage:image?`url('${image}')`:defaultImage,backgroundSize:\"contain\",backgroundPosition:\"center\",maskSize:\"contain\",maskPosition:\"center\",...style}});}Icon.displayName=\"FramerForms/Icon Staging\";export function Border({width,style,transition=null,borderColor=\"inherit\",opacity=1}){return /*#__PURE__*/_jsx(motion.div,{animate:{borderColor,opacity},style:{position:\"absolute\",inset:0,borderWidth:width,borderStyle:style,borderRadius:\"inherit\",pointerEvents:\"none\"},initial:false,transition:transition});}Border.displayName=\"FramerForms/Border Staging\";export function createBackground(fill,on=null,focused=null,invalid=null){if(fill){const onOff=typeof on==\"boolean\";if(fill.type==\"color\"){let color=invalid&&fill.colorInvalid||focused&&fill.colorFocus||(onOff?on?fill.colorOn:fill.colorOff:fill.color);return{backgroundColor:color,backgroundImage:\"none\"};}else{const colorA=invalid&&fill.colorAInvalid||focused&&fill.colorAFocus||(onOff?on?fill.colorAOn:fill.colorAOff:fill.colorA);const colorB=invalid&&fill.colorBInvalid||focused&&fill.colorBFocus||(onOff?on?fill.colorBOn:fill.colorBOff:fill.colorB);return{backgroundColor:\"none\",backgroundImage:`linear-gradient(${fill.gradientAngle}deg, ${colorB}, ${colorA})`};}}return{};}export function parsePadding(padding){if(typeof padding!==\"string\"){return[0,0,0,0];}const values=padding.split(\" \");const parsedValues=values.map(value=>parseInt(value.replace(\"px\",\"\"),10));switch(parsedValues.length){case 1:const p=parsedValues[0];return[p,p,p,p];case 4:return parsedValues;}return[0,0,0,0];}export function fillProp({onOff=false,focus=true,invalid=true,optional=false,hidden=null,color=\"rgba(187, 187, 187, 0.15)\",colorA=\"#BBB\",colorB=\"#676767\",colorOn=\"rgba(70, 160, 219, 0.2)\",colorAOn=\"#66C2FF\",colorBOn=\"#0099FF\",colorOff=\"rgba(187, 187, 187, 0.15)\",colorAOff=\"#BBB\",colorBOff=\"#676767\"}={}){return{type:ControlType.Object,optional,hidden,icon:\"color\",defaultValue:{type:\"color\",...onOff?{colorOn,colorOff}:{color,colorA,colorB}},controls:{type:{type:ControlType.Enum,defaultValue:\"color\",options:[\"color\",\"linearGradient\"],optionTitles:[\"Color\",\"Gradient\"],displaySegmentedControl:true},...onOff?{colorOn:{type:ControlType.Color,defaultValue:colorOn,hidden:props=>props.type!==\"color\"},colorOff:{type:ControlType.Color,defaultValue:colorOff,hidden:props=>props.type!==\"color\"}}:{color:{type:ControlType.Color,defaultValue:color,hidden:props=>props.type!==\"color\"}},...focus?{colorFocus:{type:ControlType.Color,optional:true,title:\"Focus\",hidden:props=>props.type!==\"color\"}}:{},...invalid?{colorInvalid:{type:ControlType.Color,optional:true,title:\"Invalid\",hidden:props=>props.type!==\"color\"}}:{},...onOff?{colorAOn:{type:ControlType.Color,defaultValue:colorAOn,title:\"Colors On\",hidden:props=>props.type!==\"linearGradient\"},colorBOn:{type:ControlType.Color,defaultValue:colorBOn,title:\" \",hidden:props=>props.type!==\"linearGradient\"},colorAOff:{type:ControlType.Color,defaultValue:colorAOff,title:\"Colors Off\",hidden:props=>props.type!==\"linearGradient\"},colorBOff:{type:ControlType.Color,defaultValue:colorBOff,title:\" \",hidden:props=>props.type!==\"linearGradient\"}}:{colorA:{type:ControlType.Color,defaultValue:colorA,title:\"Colors\",hidden:props=>props.type!==\"linearGradient\"},colorB:{type:ControlType.Color,defaultValue:colorB,title:\" \",hidden:props=>props.type!==\"linearGradient\"}},...focus?{colorAFocus:{type:ControlType.Color,optional:true,title:\"Focus\",hidden:props=>props.type!==\"linearGradient\"},colorBFocus:{type:ControlType.Color,optional:true,title:\" \",hidden:props=>props.type!==\"linearGradient\"}}:{},...invalid?{colorAInvalid:{type:ControlType.Color,optional:true,title:\"Invalid\",hidden:props=>props.type!==\"linearGradient\"},colorBInvalid:{type:ControlType.Color,optional:true,title:\" \",hidden:props=>props.type!==\"linearGradient\"}}:{},gradientAngle:{type:ControlType.Number,defaultValue:0,title:\"Angle\",step:1,min:0,max:360,unit:\"\\xb0\",hidden:props=>props.type!=\"linearGradient\"}}};}export function borderProp({onOff=false,focus=true,invalid=true,defaultValue=true,color=\"rgba(136, 136, 136, 0.1)\",colorOn=\"#0099FF\",colorOff=\"rgba(136, 136, 136, 0.1)\",colorFocus=\"#0099FF\",colorInvalid=\"#FF5A6F\",hidden=null}={}){return{type:ControlType.Object,optional:true,hidden,defaultValue:defaultValue?{color,colorOn,colorOff,colorFocus,colorInvalid,width:\"1px\"}:undefined,controls:{...onOff?{colorOn:{type:ControlType.Color,defaultValue:colorOn},colorOff:{type:ControlType.Color,defaultValue:colorOff}}:{color:{type:ControlType.Color,defaultValue:color}},...focus?{colorFocus:{type:ControlType.Color,defaultValue:colorFocus,optional:true,title:\"Focus\"}}:{},...invalid?{colorInvalid:{type:ControlType.Color,defaultValue:colorInvalid,optional:true,title:\"Invalid\"}}:{},width:{type:ControlType.Padding,defaultValue:\"1px\"},style:{type:ControlType.Enum,defaultValue:\"solid\",options:[\"solid\",\"dashed\",\"dotted\",\"double\"],optionTitles:[\"Solid\",\"Dashed\",\"Dotted\",\"Double\"]}}};}export function shadowsProp({invalid=true,onOff=false}={}){return{type:ControlType.Object,buttonTitle:\"Shadows\",optional:true,controls:{...onOff?{on:{type:ControlType.BoxShadow,defaultValue:\"rgba(0, 153, 255, 0.5) 0px 2px 4px 0px\"},off:{type:ControlType.BoxShadow,defaultValue:\"rgba(0, 0, 0, 0.25) 0px 2px 4px 0px\"}}:{default:{type:ControlType.BoxShadow,defaultValue:\"rgba(0, 0, 0, 0.25) 0px 2px 4px 0px\"}},focus:{type:ControlType.BoxShadow},invalid:invalid?{type:ControlType.BoxShadow}:null}};}export function useCanvasState(ref){const[totalPages,setTotalPages]=useState(1);useEffect(()=>{const element=ref.current;let pages=null;function updateState(){setTotalPages(pages?pages.children.length:1);}if(element){const multiStepForms=document.querySelectorAll(\"div[data-framerforms-multi-step-form]\");for(const multiStepForm of multiStepForms){const form=multiStepForm.closest(\"form\")||multiStepForm.parentElement.parentElement.parentElement;if(form&&isAncestor(form,element)){pages=form.querySelector(':scope > [data-framer-name=\"Pages\" i]');}}}updateState();if(pages){const observer=new MutationObserver((mutationsList,observer)=>{for(let mutation of mutationsList){if(mutation.type===\"childList\"){updateState();}}});observer.observe(pages,{childList:true});return()=>observer.disconnect();}},[]);return{page:0,totalPages};}export function isAncestor(ancestorElement,descendantElement){if(!ancestorElement||!descendantElement){return false;}let currentElement=descendantElement;while(currentElement!==null){if(currentElement===ancestorElement){return true;}currentElement=currentElement.parentElement;}return false;}export function getFormInfo(element){const form=element?.closest(\"form\")??null;let formId=null;let pages=null;if(form){formId=form.getAttribute(\"framerforms-id\");pages=form.querySelector(':scope > [data-framer-name=\"Pages\" i]');if(!formId){formId=uuid();form.setAttribute(\"framerforms-id\",formId);}}return{form,formId,pages};}function uuid(){let d=new Date().getTime()// Timestamp\n;let d2=performance&&performance.now&&performance.now()*1e3||0// Time in microseconds since page-load or 0 if unsupported\n;return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(c){let r=Math.random()*16// random number between 0 and 16\n;if(d>0){// Use timestamp until depleted\nr=(d+r)%16|0;d=Math.floor(d/16);}else{// Use microseconds since page-load if supported\nr=(d2+r)%16|0;d2=Math.floor(d2/16);}return(c===\"x\"?r:r&3|8).toString(16);});}function parseQuizOptions(attr){if(!attr)return{};try{const v=JSON.parse(attr);return{caseSensitive:Boolean(v.caseSensitive),ignoreSpaces:Boolean(v.ignoreSpaces),useRegex:Boolean(v.useRegex),matchMode:v.matchMode===\"set\"?\"set\":\"exact\",valueSeparator:typeof v.valueSeparator===\"string\"?v.valueSeparator:\", \",multiSelectAggregate:normalizeQuizMultiSelectAggregate(v.multiSelectAggregate)};}catch{return{};}}function readQuizMultiSelectAggregate(el,opts){const fromAttr=el.getAttribute(\"data-framerforms-quiz-multiselect-aggregate\");if(fromAttr){return normalizeQuizMultiSelectAggregate(fromAttr);}return normalizeQuizMultiSelectAggregate(opts.multiSelectAggregate);}function parseExpectedAnswer(raw){if(raw==null||raw===\"\")return\"\";const trimmed=raw.trim();if(trimmed.startsWith(\"[\")&&trimmed.endsWith(\"]\")){try{const v=JSON.parse(trimmed);if(Array.isArray(v)){return v.map(x=>String(x));}}catch{return raw;}}return raw;}function normalizeCompare(s,ignoreSpaces,caseSensitive){let out=s;if(ignoreSpaces)out=out.replace(/\\s/g,\"\");if(!caseSensitive)out=out.toLowerCase();return out;}function isQuizAnswerCorrect(value,expected,opts){const matchMode=opts.matchMode??\"exact\";if(matchMode===\"set\"&&Array.isArray(expected)&&expected.length>0){const sep=opts.valueSeparator??\", \";const userParts=value.split(sep).map(s=>s.trim()).filter(Boolean);const expParts=expected.map(e=>String(e).trim()).filter(Boolean);if(userParts.length!==expParts.length)return false;const normOne=s=>normalizeCompare(s,!!opts.ignoreSpaces,!!opts.caseSensitive);const sortedUser=[...userParts].map(normOne).sort();const sortedExp=[...expParts].map(normOne).sort();return sortedUser.every((x,i)=>x===sortedExp[i]);}const caseSensitive=!!opts.caseSensitive;const ignoreSpaces=!!opts.ignoreSpaces;const useRegex=!!opts.useRegex;if(Array.isArray(expected)){return expected.some(e=>{const exp=String(e);if(useRegex){try{return new RegExp(exp).test(value);}catch{return false;}}return normalizeCompare(value,ignoreSpaces,caseSensitive)===normalizeCompare(exp,ignoreSpaces,caseSensitive);});}const exp=String(expected);if(useRegex){try{return new RegExp(exp).test(value);}catch{return false;}}return normalizeCompare(value,ignoreSpaces,caseSensitive)===normalizeCompare(exp,ignoreSpaces,caseSensitive);}function readQuizQuestionPoints(el){const pCorrect=Number(el.getAttribute(\"data-framerforms-quiz-points\")??\"1\");const pWrong=Number(el.getAttribute(\"data-framerforms-quiz-wrong-points\")??\"0\");return{maxPointsIfCorrect:Number.isFinite(pCorrect)?pCorrect:1,pointsIfWrong:Number.isFinite(pWrong)?pWrong:0};}/**\n * Read one quiz field’s live answer, expected answer text, and correctness.\n * Use the field’s `name` (same as in the Layers / form). For radio groups,\n * pass the shared `name` attribute.\n */export function getQuestionData(form,inputName){const empty={userValue:\"\",correctAnswer:\"\",isCorrect:null,isQuizField:false,maxPointsIfCorrect:0,pointsIfWrong:0};if(!form||!inputName?.trim())return empty;const esc=typeof CSS!==\"undefined\"&&typeof CSS.escape===\"function\"?CSS.escape(inputName):inputName.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"');const sel=`input[name=\"${esc}\"], select[name=\"${esc}\"], textarea[name=\"${esc}\"]`;const all=form.querySelectorAll(sel);if(all.length===0)return empty;let el=all[0];if(all.length>1&&el instanceof HTMLInputElement&&el.type===\"radio\"){let checked=null;for(const n of all){if(n instanceof HTMLInputElement&&n.type===\"radio\"&&n.checked){checked=n;break;}}el=checked??el;}const userValue=getQuizFieldValue(el);if(el.getAttribute(\"data-framerforms-quiz\")!==\"true\"){return{userValue,correctAnswer:\"\",isCorrect:null,isQuizField:false,maxPointsIfCorrect:0,pointsIfWrong:0};}if(el.getAttribute(\"data-framerforms-quiz-scoring\")===\"weighted\"){const parsed=parseOptionPointsAttr(el.getAttribute(\"data-framerforms-quiz-option-points\"));if(!parsed){return{userValue,correctAnswer:\"\",isCorrect:null,isQuizField:true,maxPointsIfCorrect:0,pointsIfWrong:0,earnedPoints:0};}const opts=parseQuizOptions(el.getAttribute(\"data-framerforms-quiz-options\"));const{earned,maxPoints}=scoreWeightedFieldValue(userValue,parsed,{...opts,multiSelectAggregate:readQuizMultiSelectAggregate(el,opts)});return{userValue,correctAnswer:\"\",isCorrect:null,isQuizField:true,maxPointsIfCorrect:maxPoints,pointsIfWrong:0,earnedPoints:earned};}const expectedRaw=el.getAttribute(\"data-framerforms-correct-answer\")??\"\";const expected=parseExpectedAnswer(expectedRaw);const opts=parseQuizOptions(el.getAttribute(\"data-framerforms-quiz-options\"));const{maxPointsIfCorrect,pointsIfWrong}=readQuizQuestionPoints(el);const correctAnswer=Array.isArray(expected)?expected.map(String).join(\", \"):String(expected??\"\");if(expected===\"\"||Array.isArray(expected)&&expected.length===0){return{userValue,correctAnswer:\"\",isCorrect:null,isQuizField:true,maxPointsIfCorrect,pointsIfWrong};}const isOk=isQuizAnswerCorrect(userValue,expected,opts);return{userValue,correctAnswer,isCorrect:isOk,isQuizField:true,maxPointsIfCorrect,pointsIfWrong};}function getQuizFieldValue(el){if(el instanceof HTMLSelectElement){return el.value??\"\";}const inp=el;if(inp.type===\"checkbox\"||inp.type===\"radio\"){return inp.checked?inp.value||\"on\":\"\";}return inp.value??\"\";}/**\n * Computes quiz score from the form DOM.\n * Correct/incorrect fields need `data-framerforms-correct-answer`.\n * Weighted fields use `data-framerforms-quiz-option-points` (no correct answer).\n * Skips inputs disabled for multi-step unvisited pages (`disabled=\"FramerForms\"`).\n */export function calculateQuizScoreFromForm(form,_scoringMode){const nodes=form.querySelectorAll('input[data-framerforms-quiz=\"true\"], select[data-framerforms-quiz=\"true\"], textarea[data-framerforms-quiz=\"true\"]');let correct=0;let total=0;let points=0;let maxPoints=0;const answers={};const countedNames=new Set;let fieldIndex=0;const fieldKey=el=>{fieldIndex+=1;return el.name?.trim()?el.name:`quiz-field-${fieldIndex}`;};nodes.forEach(el=>{if(el.getAttribute(\"disabled\")===\"FramerForms\")return;const nameKey=el.name?.trim();if(nameKey&&countedNames.has(nameKey))return;const scoringMethod=el.getAttribute(\"data-framerforms-quiz-scoring\")??\"correctIncorrect\";if(scoringMethod===\"weighted\"){const parsed=parseOptionPointsAttr(el.getAttribute(\"data-framerforms-quiz-option-points\"));if(!parsed)return;const opts=parseQuizOptions(el.getAttribute(\"data-framerforms-quiz-options\"));const value=getQuizFieldValue(el);const{earned,maxPoints:fieldMax}=scoreWeightedFieldValue(value,parsed,{...opts,multiSelectAggregate:readQuizMultiSelectAggregate(el,opts)});const key=fieldKey(el);if(nameKey)countedNames.add(nameKey);total+=1;maxPoints+=fieldMax;points+=earned;answers[key]={isCorrect:null,earnedPoints:earned};return;}if(!el.hasAttribute(\"data-framerforms-correct-answer\"))return;const expectedRaw=el.getAttribute(\"data-framerforms-correct-answer\")??\"\";const expected=parseExpectedAnswer(expectedRaw);if(expected===\"\"||Array.isArray(expected)&&expected.length===0)return;const opts=parseQuizOptions(el.getAttribute(\"data-framerforms-quiz-options\"));const pCorrect=Number(el.getAttribute(\"data-framerforms-quiz-points\")??\"1\");const pWrong=Number(el.getAttribute(\"data-framerforms-quiz-wrong-points\")??\"0\");const pc=Number.isFinite(pCorrect)?pCorrect:1;const pw=Number.isFinite(pWrong)?pWrong:0;const key=fieldKey(el);if(nameKey)countedNames.add(nameKey);total+=1;maxPoints+=pc;const value=getQuizFieldValue(el);const isOk=isQuizAnswerCorrect(value,expected,opts);if(isOk){correct+=1;points+=pc;answers[key]={isCorrect:true,earnedPoints:pc};}else{points+=pw;answers[key]={isCorrect:false,earnedPoints:pw};}});return{correct,total,points,maxPoints,answers};}// ============================================================================\n// FORM UTILITIES\n// ============================================================================\n/**\n * Clears all form input values and dispatches events to notify React components.\n * Handles regular inputs, checkboxes, radios, and custom FramerForms inputs\n * (RatingInput, PhoneNumberInput, etc.).\n *\n * @param form - The form element to clear\n */export function clearFormInputs(form){if(!form)return;// Reset the form (clears most inputs)\nform.reset();// Manually clear inputs that might not be reset by form.reset()\nconst inputs=form.querySelectorAll(\"input, select, textarea\");inputs.forEach(input=>{if(input.type===\"checkbox\"||input.type===\"radio\"){input.checked=false;}else{input.value=\"\";}// Dispatch events to notify React components\ninput.dispatchEvent(new Event(\"input\",{bubbles:true}));input.dispatchEvent(new Event(\"change\",{bubbles:true}));});// Clear custom FramerForms inputs (RatingInput, PhoneNumberInput, etc.)\n// These use HiddenInput with data-framerforms-set-value-event=\"true\"\nconst customInputs=form.querySelectorAll('input[data-framerforms-set-value-event=\"true\"]');customInputs.forEach(input=>{const inputName=input.name?.toLowerCase()||\"\";// Identify component type by checking parent structure\nconst parent=input.closest(\"[data-framerforms]\");const buttonCount=parent?.querySelectorAll('button[type=\"button\"]').length||0;// RatingInput typically has 2-10 star buttons\nconst isLikelyRating=buttonCount>=2&&buttonCount<=10;// RatingInput needs 0 to clear, others need empty string\nconst clearValue=isLikelyRating||inputName.includes(\"rating\")?0:\"\";input.dispatchEvent(new CustomEvent(\"framerFormsSetValue\",{detail:clearValue,bubbles:true}));});}// ============================================================================\n// AUTOFILL STYLING OVERRIDE\n// ============================================================================\n/**\n * Sets up global CSS to override browser autofill styling.\n * This prevents browsers from applying their default yellow/blue backgrounds\n * to autofilled form inputs, which can break custom designs.\n *\n * Runs once when the module loads and applies to all inputs on the page,\n * including native Framer components.\n */function setupAutofillOverride(){// Check if we're in a browser environment\nif(typeof document===\"undefined\")return;// Check if the style tag already exists to avoid duplicates\nconst existingStyle=document.getElementById(\"framerforms-autofill-override\");if(existingStyle)return;// Create and inject the style tag\nconst style=document.createElement(\"style\");style.id=\"framerforms-autofill-override\";style.textContent=`\n        /* Override browser autofill styling for all inputs */\n        input:-webkit-autofill,\n        input:-webkit-autofill:hover,\n        input:-webkit-autofill:focus,\n        input:-webkit-autofill:active,\n        select:-webkit-autofill,\n        select:-webkit-autofill:hover,\n        select:-webkit-autofill:focus,\n        select:-webkit-autofill:active,\n        textarea:-webkit-autofill,\n        textarea:-webkit-autofill:hover,\n        textarea:-webkit-autofill:focus,\n        textarea:-webkit-autofill:active {\n            /* Use box-shadow to override background color */\n            /* The large spread radius ensures it covers the entire input */\n            -webkit-box-shadow: 0 0 0 1000px transparent inset !important;\n            box-shadow: 0 0 0 1000px transparent inset !important;\n            \n            /* Override text color */\n            -webkit-text-fill-color: inherit !important;\n            color: inherit !important;\n            \n            /* Use transition trick to prevent background color changes */\n            /* The extremely long duration (5000s) effectively prevents the change */\n            transition: background-color 5000s ease-in-out 0s, \n                        color 5000s ease-in-out 0s !important;\n        }\n        \n        /* Ensure autofilled inputs maintain their original styling */\n        input:-webkit-autofill::first-line,\n        select:-webkit-autofill::first-line,\n        textarea:-webkit-autofill::first-line {\n            -webkit-text-fill-color: inherit !important;\n            color: inherit !important;\n        }\n    `;// Append to document head\ndocument.head.appendChild(style);}// Run the setup immediately when the module loads\n// This ensures it applies globally before any components render\nif(typeof document!==\"undefined\"){// Use requestAnimationFrame to ensure DOM is ready\nif(document.readyState===\"loading\"){document.addEventListener(\"DOMContentLoaded\",setupAutofillOverride);}else{// DOM is already loaded, run immediately\nsetupAutofillOverride();}}\nexport const __FramerMetadata__ = {\"exports\":{\"HiddenComponentLabel\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HideElement\":{\"type\":\"reactComponent\",\"name\":\"HideElement\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"insertFrameSupportPropertyControl\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCanvasState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"MultiStepFormStore\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFormSubmittedStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"shadowsProp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"calculateQuizScoreFromForm\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isAncestor\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HiddenInput\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"parsePadding\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Border\":{\"type\":\"reactComponent\",\"name\":\"Border\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizScore\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFormSubmittedStoreApi\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizStoreState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizStoreSetter\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createEmptyQuizScore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"FormInfo\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"PageHistory\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"MultiStepFormState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useInstanceId\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"InsertFrameNeedHelpProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getFormInfo\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useQuizStoreApi\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HiddenComponentLabelProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"createBackground\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"borderProp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"FormSubmittedStoreState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"QuizRuntimeState\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Icon\":{\"type\":\"reactComponent\",\"name\":\"Icon\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"getQuestionData\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HiddenInputProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HIDDEN_CLASS_NAME\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ScoringMode\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"LogicConfig\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMultiStepFormStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useQuizStore\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"clearFormInputs\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"FormSubmittedSetter\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HiddenInputOwnProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"iconProp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fillProp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef,useCallback}from\"react\";import{HiddenComponentLabel,useMultiStepFormStore,getFormInfo}from\"https://framerusercontent.com/modules/z8cIEIxb4MjL2nvvhvk3/3MiLXMvQ5kE7UWgyPJjd/FramerFormsShared.js\";const STORAGE_KEY_PREFIX=\"framerforms-draft-\";const DEBOUNCE_DELAY=600// milliseconds\n;/** Descends into open shadow roots so code components (e.g. number fields) are found. */function collectNamedFormControls(form){const out=[];function walk(node){if(node instanceof Element){if(node instanceof HTMLInputElement){const t=node.type;if(node.name&&t!==\"button\"&&t!==\"submit\"&&t!==\"reset\"){out.push(node);}}else if((node instanceof HTMLSelectElement||node instanceof HTMLTextAreaElement)&&node.name){out.push(node);}if(node.shadowRoot){walk(node.shadowRoot);}}node.childNodes.forEach(child=>walk(child));}walk(form);return out;}function findFormControlsByName(form,fieldName){return collectNamedFormControls(form).filter(el=>el.name===fieldName);}function coerceStoredValue(value){if(value==null)return\"\";if(Array.isArray(value))return String(value[0]??\"\");return String(value);}/** Sets DOM value in a way React 18+ controlled inputs observe, then bubbles input/change. */function setNativeFormControlValue(el,value){const str=coerceStoredValue(value);if(el instanceof HTMLSelectElement){const set=Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype,\"value\")?.set;if(set)set.call(el,str);else el.value=str;return;}if(el instanceof HTMLTextAreaElement){const set=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,\"value\")?.set;if(set)set.call(el,str);else el.value=str;return;}const input=el;if(input.type===\"checkbox\"||input.type===\"radio\"){return;}const set=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,\"value\")?.set;if(set)set.call(input,str);else input.value=str;}function dispatchInputAndChange(el){try{if(typeof InputEvent!==\"undefined\"){el.dispatchEvent(new InputEvent(\"input\",{bubbles:true,cancelable:true}));}else{el.dispatchEvent(new Event(\"input\",{bubbles:true}));}}catch{el.dispatchEvent(new Event(\"input\",{bubbles:true}));}el.dispatchEvent(new Event(\"change\",{bubbles:true}));}/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n * @framerDisableUnlink\n */export default function FormPersistence(props){const{formId:userFormId,restorePageHistory,expiryTimeUnit,expiryTimeMinutes,expiryTimeHours,expiryTimeDays,expiryTimeWeeks,expiryTimeMonths}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const ref=useRef(null);const formInfoRef=useRef(null);const debounceTimerRef=useRef(null);const isRestoringRef=useRef(true)// Prevent saving during initial restore\n;const[multiStepFormState,setMultiStepFormState]=useMultiStepFormStore();// Use a ref to access latest state without causing dependency loops\nconst multiStepFormStateRef=useRef(multiStepFormState);multiStepFormStateRef.current=multiStepFormState;// Generate a stable form ID\nconst getStorageKey=useCallback(()=>{// Use custom ID if provided and not empty\nconst trimmedId=userFormId?.trim();if(trimmedId){return STORAGE_KEY_PREFIX+trimmedId;}// Fallback: use origin + pathname (more stable across environments)\n// This handles Framer Preview URLs better than pathname alone\nif(typeof window!==\"undefined\"){const{origin,pathname}=window.location;// Use origin + pathname for uniqueness, but normalize it\n// Remove trailing slashes for consistency\nconst normalizedPath=pathname.replace(/\\/+$/,\"\")||\"/\";return STORAGE_KEY_PREFIX+origin+normalizedPath;}return STORAGE_KEY_PREFIX+\"default\";},[userFormId]);// Calculate expiry timestamp in milliseconds\nconst getExpiryTimestamp=useCallback(()=>{if(!expiryTimeUnit||expiryTimeUnit===\"none\"){return null// No expiry\n;}let value=0;switch(expiryTimeUnit){case\"minutes\":value=expiryTimeMinutes||0;break;case\"hours\":value=expiryTimeHours||0;break;case\"days\":value=expiryTimeDays||0;break;case\"weeks\":value=expiryTimeWeeks||0;break;case\"months\":value=expiryTimeMonths||0;break;default:return null;}if(!value||value<=0){return null// Invalid value\n;}const now=Date.now();let millisecondsToAdd=0;switch(expiryTimeUnit){case\"minutes\":millisecondsToAdd=value*60*1e3;break;case\"hours\":millisecondsToAdd=value*60*60*1e3;break;case\"days\":millisecondsToAdd=value*24*60*60*1e3;break;case\"weeks\":millisecondsToAdd=value*7*24*60*60*1e3;break;case\"months\":// Approximate month as 30 days\nmillisecondsToAdd=value*30*24*60*60*1e3;break;default:return null;}return now+millisecondsToAdd;},[expiryTimeUnit,expiryTimeMinutes,expiryTimeHours,expiryTimeDays,expiryTimeWeeks,expiryTimeMonths]);/** Snapshot all named fields, including disabled (e.g. multi-step pages use disabled=\"FramerForms\"). FormData omits disabled fields, which dropped number/text values when saving from another step or before hydration. */const serializeForm=useCallback(form=>{if(!form)return null;const values={};const append=(name,value)=>{if(values[name]!==undefined){if(Array.isArray(values[name])){values[name].push(value);}else{values[name]=[values[name],value];}}else{values[name]=value;}};const elements=collectNamedFormControls(form);elements.forEach(input=>{const name=input.name;if(!name)return;if(input instanceof HTMLInputElement){const type=input.type;if(type===\"file\")return;if(type===\"checkbox\"){if(input.checked){append(name,input.value||\"on\");}return;}if(type===\"radio\"){if(input.checked){values[name]=input.value;}return;}append(name,input.value);return;}if(input instanceof HTMLSelectElement){if(input.multiple){Array.from(input.selectedOptions).forEach(opt=>{append(name,opt.value);});}else{append(name,input.value);}return;}if(input instanceof HTMLTextAreaElement){append(name,input.value);}});return values;},[]);// Save form data to localStorage\nconst saveToStorage=useCallback(()=>{// Don't save during initial restore phase\nif(isRestoringRef.current)return;const formInfo=formInfoRef.current;if(!formInfo?.form)return;try{const storageKey=getStorageKey();const values=serializeForm(formInfo.form);const data={values,savedAt:Date.now()};// Include expiry timestamp if expiry is configured\nconst expiresAt=getExpiryTimestamp();if(expiresAt){data.expiresAt=expiresAt;}// Include page history if enabled and available\nif(restorePageHistory&&formInfo.formId){const state=multiStepFormStateRef.current[formInfo.formId];if(state?.pageHistory){data.pageHistory=state.pageHistory;}}localStorage.setItem(storageKey,JSON.stringify(data));}catch(error){// localStorage might be unavailable (private mode, quota exceeded)\nconsole.warn(\"FormPersistence: Could not save to localStorage\",error);}},[getStorageKey,serializeForm,restorePageHistory,getExpiryTimestamp]);// Debounced save handler\nconst debouncedSave=useCallback(()=>{// Don't even schedule saves during restore\nif(isRestoringRef.current)return;if(debounceTimerRef.current){clearTimeout(debounceTimerRef.current);}debounceTimerRef.current=setTimeout(()=>{// Double-check flag when debounce fires\nif(!isRestoringRef.current){saveToStorage();}},DEBOUNCE_DELAY);},[saveToStorage]);// Restore a single input value\n// Returns true if restore was successful, false if the input needs a retry\n// (e.g., if the component has a set-value-event handler but isn't ready yet)\nconst restoreInputValue=useCallback((input,value)=>{// Skip inputs that have the no-prefill attribute\nif(input.dataset?.framerformsNoPrefill===\"true\"){return true// Considered \"successful\" - no retry needed\n;}if(input instanceof HTMLInputElement&&input.type===\"checkbox\"){// For checkboxes, check if value matches or if it's in the array\nif(Array.isArray(value)){input.checked=value.includes(input.value);}else{input.checked=value===input.value||value===\"on\";}}else if(input instanceof HTMLInputElement&&input.type===\"radio\"){// For radio buttons, check the one with matching value\ninput.checked=input.value===value;}else{setNativeFormControlValue(input,value);}dispatchInputAndChange(input);// Check if this input expects a custom set-value event\nconst expectsSetValueEvent=input.dataset?.framerformsSetValueEvent===\"true\";if(expectsSetValueEvent){const isReady=input.dataset?.framerformsSetValueReady===\"true\";if(!isReady){// Listener not ready yet - need to retry\nreturn false;}}// Trigger custom FramerForms event - some components need this\n// Send the value directly as event.detail (not wrapped in an object)\ninput.dispatchEvent(new CustomEvent(\"framerFormsSetValue\",{detail:Array.isArray(value)?value[0]:value,bubbles:true}));return true;},[]);// Clear storage on form submit\nconst clearStorage=useCallback(()=>{try{const storageKey=getStorageKey();localStorage.removeItem(storageKey);}catch(error){console.warn(\"FormPersistence: Could not clear localStorage\",error);}},[getStorageKey]);// Restore form values from localStorage\nconst restoreFromStorage=useCallback((retryCount=0,pendingValues=null)=>{const formInfo=formInfoRef.current;if(!formInfo?.form){// No form found, allow saving\nisRestoringRef.current=false;return;}try{const storageKey=getStorageKey();const stored=localStorage.getItem(storageKey);if(!stored){// No stored data, allow saving\nisRestoringRef.current=false;return;}const data=JSON.parse(stored);const{values,pageHistory,expiresAt}=data;// Check if data has expired\nif(expiresAt&&Date.now()>expiresAt){// Data has expired, clear it and don't restore\nclearStorage();isRestoringRef.current=false;return;}// Use pending values from previous retry if available, otherwise use stored values\nconst valuesToRestore=pendingValues||values;if(valuesToRestore){const valueEntries=Object.entries(valuesToRestore);let restoredCount=0;const stillPending={};// Restore input values\nvalueEntries.forEach(([name,value])=>{const inputs=findFormControlsByName(formInfo.form,name);if(inputs.length>0){let allInputsRestored=true;inputs.forEach(input=>{const success=restoreInputValue(input,value);if(!success){allInputsRestored=false;}});if(allInputsRestored){restoredCount++;}else{// This input needs a retry (listener not ready yet)\nstillPending[name]=value;}}else{// Input not found yet, add to pending\nstillPending[name]=value;}});// If we have pending inputs and haven't retried too many times, try again\n// This handles both: inputs that don't exist yet, and inputs whose listeners aren't ready\nconst hasPending=Object.keys(stillPending).length>0;if(hasPending&&retryCount<5){setTimeout(()=>{restoreFromStorage(retryCount+1,stillPending);},200*(retryCount+1))// Exponential backoff: 200, 400, 600, 800, 1000ms\n;return;// Don't enable saving yet\n}}// Restore page history if enabled\nif(restorePageHistory&&pageHistory&&formInfo.formId){// Wait a bit for MultiStepForm to initialize\nsetMultiStepFormState(prev=>{const currentState=prev[formInfo.formId];if(currentState){return{[formInfo.formId]:{...currentState,pageHistory:pageHistory,isEndPage:pageHistory[pageHistory.length-1]===currentState.totalPages-1}};}return prev;});}// Restore complete - clear any pending saves triggered by the restore events\n// and allow saving after the debounce period plus buffer\nif(debounceTimerRef.current){clearTimeout(debounceTimerRef.current);debounceTimerRef.current=null;}isRestoringRef.current=false;}catch(error){console.warn(\"FormPersistence: Could not restore from localStorage\",error);}},[getStorageKey,restorePageHistory,setMultiStepFormState,restoreInputValue,clearStorage]);// Main effect: setup listeners and restore data\nuseEffect(()=>{if(isCanvas)return;const formInfo=getFormInfo(ref.current);formInfoRef.current=formInfo;const{form}=formInfo;if(!form)return;// Restore saved data on mount\nrestoreFromStorage(0);// Listen for input changes (event delegation)\nconst handleInput=()=>{debouncedSave();};// Listen for form submit to clear storage\nconst handleSubmit=()=>{// Clear the debounce timer\nif(debounceTimerRef.current){clearTimeout(debounceTimerRef.current);}clearStorage();};form.addEventListener(\"input\",handleInput);form.addEventListener(\"change\",handleInput);form.addEventListener(\"submit\",handleSubmit);return()=>{if(debounceTimerRef.current){clearTimeout(debounceTimerRef.current);}form.removeEventListener(\"input\",handleInput);form.removeEventListener(\"change\",handleInput);form.removeEventListener(\"submit\",handleSubmit);};},[isCanvas,debouncedSave,restoreFromStorage,clearStorage]);// Save page history changes when they happen\n// Track pageHistory as a string to avoid infinite loops from object reference changes\nconst formId=formInfoRef.current?.formId;const currentPageHistory=formId?multiStepFormState[formId]?.pageHistory:null;const pageHistoryKey=currentPageHistory?JSON.stringify(currentPageHistory):null;useEffect(()=>{if(isCanvas||!restorePageHistory)return;if(!formInfoRef.current?.formId)return;if(!pageHistoryKey)return;debouncedSave();},[pageHistoryKey,isCanvas,restorePageHistory,debouncedSave]);return(// @ts-ignore - HiddenComponentLabel accepts these props via forwardRef\n/*#__PURE__*/_jsx(HiddenComponentLabel,{ref:ref,\"data-framerforms-persistence\":true,text:\"Form Persistence\",subtext:userFormId?`ID: ${userFormId}`:\"Auto ID from URL\",children:/*#__PURE__*/_jsxs(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",viewBox:\"0 0 452 60\",width:\"121\",height:\"16\",style:{marginBottom:5},children:[/*#__PURE__*/_jsx(\"path\",{d:\"M 58.178 27.448 L 58.178 0.912 L 33.172 0.912 C 14.852 0.912 0 15.76 0 34.08 L 0 59.086 L 58.178 59.086 L 58.178 27.46 C 58.172 44.93 44.008 59.09 26.538 59.09 L 26.538 27.45 L 58.178 27.45 Z\",fill:\"#473DFE\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M 452.004 36.088 C 452.004 43.208 446.328 47.872 437.336 47.872 C 428.342 47.872 422.57 43.112 421.946 35.464 L 431.132 35.464 C 431.228 38.734 433.392 40.802 437.142 40.802 C 440.268 40.802 442.336 39.6 442.336 37.436 C 442.336 35.944 440.846 34.838 438.826 34.454 L 432.526 33.252 C 426.996 32.192 423.34 28.972 423.34 23.392 C 423.34 16.948 429.016 12.426 436.758 12.426 C 444.982 12.426 450.898 17.14 451.426 24.594 L 442.24 24.594 C 442 21.468 439.884 19.448 436.854 19.448 C 434.162 19.448 432.526 20.892 432.526 22.768 C 432.526 24.306 434.064 25.22 435.892 25.556 L 442.578 26.856 C 448.734 28.056 452.004 31.086 452.004 36.088 Z M 395.384 47.39 L 387.978 27.48 L 387.978 47.39 L 379.754 47.39 L 379.754 12.86 L 390.478 12.86 L 399.184 36.28 L 407.84 12.86 L 418.566 12.86 L 418.566 47.39 L 410.342 47.39 L 410.342 27.24 L 402.886 47.39 Z M 355.758 47.39 L 346.668 47.39 L 346.668 12.86 L 360.808 12.86 C 370.138 12.86 375.476 17.044 375.476 24.402 C 375.476 28.826 372.83 32.482 368.166 34.454 L 376.63 47.39 L 365.81 47.39 L 358.74 35.896 L 355.758 35.896 Z M 355.758 20.362 L 355.758 28.394 L 360.422 28.394 C 364.462 28.394 366.338 27.144 366.338 24.402 C 366.338 21.662 364.462 20.362 360.422 20.362 Z M 325.08 48.112 C 315.124 48.112 307.286 40.562 307.286 30.076 C 307.286 19.592 315.124 12.138 325.08 12.138 C 335.084 12.138 342.922 19.592 342.922 30.078 C 342.922 40.562 335.084 48.112 325.08 48.112 Z M 325.08 39.984 C 330.514 39.984 333.544 35.512 333.544 30.076 C 333.544 24.642 330.514 20.266 325.08 20.266 C 319.646 20.266 316.616 24.642 316.616 30.078 C 316.616 35.512 319.646 39.984 325.08 39.984 Z M 291.034 47.39 L 281.946 47.39 L 281.946 12.86 L 305.462 12.86 L 305.462 20.748 L 291.034 20.748 L 291.034 27.144 L 303.106 27.144 L 303.106 35.032 L 291.034 35.032 L 291.034 47.392 Z M 257.946 47.39 L 248.856 47.39 L 248.856 12.86 L 262.994 12.86 C 272.326 12.86 277.664 17.044 277.664 24.402 C 277.664 28.826 275.018 32.482 270.354 34.454 L 278.818 47.39 L 267.996 47.39 L 260.926 35.896 L 257.946 35.896 Z M 257.946 20.362 L 257.946 28.394 L 262.61 28.394 C 266.65 28.394 268.526 27.144 268.526 24.402 C 268.526 21.662 266.65 20.362 262.61 20.362 Z M 244.616 39.504 L 244.616 47.392 L 220.184 47.392 L 220.184 12.86 L 244.278 12.86 L 244.278 20.748 L 229.274 20.748 L 229.274 25.7 L 242.884 25.7 L 242.884 33.588 L 229.274 33.588 L 229.274 39.504 Z M 191.216 47.39 L 183.81 27.48 L 183.81 47.39 L 175.586 47.39 L 175.586 12.86 L 186.31 12.86 L 195.016 36.28 L 203.672 12.86 L 214.398 12.86 L 214.398 47.39 L 206.174 47.39 L 206.174 27.24 L 198.718 47.39 L 191.218 47.39 Z M 163.08 47.39 L 160.966 40.994 L 148.846 40.994 L 146.682 47.39 L 137.496 47.39 L 150.288 12.86 L 160.244 12.86 L 172.892 47.39 L 163.082 47.39 Z M 155.002 22.864 L 151.298 33.828 L 158.61 33.828 L 155 22.864 Z M 116.574 47.39 L 107.484 47.39 L 107.484 12.86 L 121.624 12.86 C 130.954 12.86 136.292 17.044 136.292 24.402 C 136.292 28.826 133.648 32.482 128.982 34.454 L 137.446 47.39 L 126.626 47.39 L 119.556 35.896 L 116.574 35.896 Z M 116.574 20.362 L 116.574 28.394 L 121.24 28.394 C 125.28 28.394 127.154 27.144 127.154 24.402 C 127.154 21.662 125.278 20.362 121.24 20.362 Z M 89.214 47.39 L 80.126 47.39 L 80.126 12.86 L 103.64 12.86 L 103.64 20.748 L 89.212 20.748 L 89.212 27.144 L 101.284 27.144 L 101.284 35.032 L 89.212 35.032 L 89.212 47.392 Z\",fill:\"#999\"})]})}));}FormPersistence.displayName=\"Form Persistence Staging\";addPropertyControls(FormPersistence,{formId:{type:ControlType.String,title:\"Form ID\",placeholder:\"Unique ID\",description:\"Unique identifier for this form. Required if you have multiple forms on the same page.\"},restorePageHistory:{type:ControlType.Boolean,title:\"Save Page\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Restore the user's position in multi-step forms.\"},expiryTimeUnit:{type:ControlType.Enum,title:\"Expires In\",defaultValue:\"none\",options:[\"none\",\"minutes\",\"hours\",\"days\",\"weeks\",\"months\"],optionTitles:[\"None\",\"Minutes\",\"Hours\",\"Days\",\"Weeks\",\"Months\"],displaySegmentedControl:false,description:\"Time unit for form data expiry. Set to 'None' to disable expiry.\"},expiryTimeMinutes:{type:ControlType.Number,title:\"Value\",defaultValue:1,min:1,max:120,step:1,hidden:props=>props.expiryTimeUnit!==\"minutes\",description:\"Number of minutes before form data expires.\"},expiryTimeHours:{type:ControlType.Number,title:\"Value\",defaultValue:1,min:1,max:72,step:1,hidden:props=>props.expiryTimeUnit!==\"hours\",description:\"Number of hours before form data expires.\"},expiryTimeDays:{type:ControlType.Number,title:\"Value\",defaultValue:1,min:1,max:364,step:1,hidden:props=>props.expiryTimeUnit!==\"days\",description:\"Number of days before form data expires.\"},expiryTimeWeeks:{type:ControlType.Number,title:\"Value\",defaultValue:1,min:1,max:52,step:1,hidden:props=>props.expiryTimeUnit!==\"weeks\",description:\"Number of weeks before form data expires.\"},expiryTimeMonths:{type:ControlType.Number,title:\"Value\",defaultValue:1,min:1,max:12,step:1,hidden:props=>props.expiryTimeUnit!==\"months\",description:\"Number of months before form data expires.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FormPersistence\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}