@swan-admin/swan-web-component 1.0.117 → 1.0.119
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BodyScan--QQkmBvw.js +2 -0
- package/dist/BodyScan--QQkmBvw.js.map +1 -0
- package/dist/BodyScan-1GnGflqx.js +2 -0
- package/dist/BodyScan-1GnGflqx.js.map +1 -0
- package/dist/BodyScan-B0MKE1vY.js +2 -0
- package/dist/BodyScan-B0MKE1vY.js.map +1 -0
- package/dist/BodyScan-B85rcTFy.js +2 -0
- package/dist/BodyScan-B85rcTFy.js.map +1 -0
- package/dist/BodyScan-B90ht9_5.js +2 -0
- package/dist/BodyScan-B90ht9_5.js.map +1 -0
- package/dist/BodyScan-BVAqja5k.js +2 -0
- package/dist/BodyScan-BVAqja5k.js.map +1 -0
- package/dist/BodyScan-BVrc-R6j.js +2 -0
- package/dist/BodyScan-BVrc-R6j.js.map +1 -0
- package/dist/BodyScan-BYbhTHgG.js +2 -0
- package/dist/BodyScan-BYbhTHgG.js.map +1 -0
- package/dist/BodyScan-Be0NcDVq.js +2 -0
- package/dist/BodyScan-Be0NcDVq.js.map +1 -0
- package/dist/BodyScan-BlT-y35F.js +2 -0
- package/dist/BodyScan-BlT-y35F.js.map +1 -0
- package/dist/BodyScan-C7dkFVxY.js +2 -0
- package/dist/BodyScan-C7dkFVxY.js.map +1 -0
- package/dist/BodyScan-CAIYPUJI.js +2 -0
- package/dist/BodyScan-CAIYPUJI.js.map +1 -0
- package/dist/BodyScan-CRfmNpg7.js +2 -0
- package/dist/BodyScan-CRfmNpg7.js.map +1 -0
- package/dist/BodyScan-Cgut5BZ2.js +2 -0
- package/dist/BodyScan-Cgut5BZ2.js.map +1 -0
- package/dist/BodyScan-CrmHVOBq.js +2 -0
- package/dist/BodyScan-CrmHVOBq.js.map +1 -0
- package/dist/BodyScan-CvT6nbKG.js +2 -0
- package/dist/BodyScan-CvT6nbKG.js.map +1 -0
- package/dist/BodyScan-DChxaIeM.js +2 -0
- package/dist/BodyScan-DChxaIeM.js.map +1 -0
- package/dist/BodyScan-De-sb6e1.js +2 -0
- package/dist/BodyScan-De-sb6e1.js.map +1 -0
- package/dist/BodyScan-DogOXXY0.js +2 -0
- package/dist/BodyScan-DogOXXY0.js.map +1 -0
- package/dist/BodyScan-b7bRBOYK.js +2 -0
- package/dist/BodyScan-b7bRBOYK.js.map +1 -0
- package/dist/BodyScan-kpbgefyc.js +2 -0
- package/dist/BodyScan-kpbgefyc.js.map +1 -0
- package/dist/BodyScan-lCqgPd6z.js +2 -0
- package/dist/BodyScan-lCqgPd6z.js.map +1 -0
- package/dist/BodyScan-lc189qhY.js +2 -0
- package/dist/BodyScan-lc189qhY.js.map +1 -0
- package/dist/BodyScan-liyrkU6l.js +2 -0
- package/dist/BodyScan-liyrkU6l.js.map +1 -0
- package/dist/BodyScan-xFn2tlOj.js +2 -0
- package/dist/BodyScan-xFn2tlOj.js.map +1 -0
- package/dist/BodyScan-ym1Rn7E9.js +2 -0
- package/dist/BodyScan-ym1Rn7E9.js.map +1 -0
- package/dist/FaceScan-1Fwy5JDo.js +2 -0
- package/dist/FaceScan-1Fwy5JDo.js.map +1 -0
- package/dist/FaceScan-D1B_6J78.js +2 -0
- package/dist/FaceScan-D1B_6J78.js.map +1 -0
- package/dist/LoadingScreen-C_pA2xaB.js +2 -0
- package/dist/LoadingScreen-C_pA2xaB.js.map +1 -0
- package/dist/LoadingScreen-HQLN5ZOg.js +2 -0
- package/dist/LoadingScreen-HQLN5ZOg.js.map +1 -0
- package/dist/bodyScan.js +1 -1
- package/dist/bodyScan.mjs +1 -1
- package/dist/faceScan.js +1 -1
- package/dist/faceScan.mjs +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/atoms/customInput/CustomInput.tsx","../src/components/onboarding/EmailStep.tsx","../src/components/onboarding/NameStep.tsx","../src/components/onboarding/GenderStep.tsx","../src/components/onboarding/HeightStep.tsx","../src/atoms/progressDots/ProgressDots.tsx","../src/components/onboarding/StepsWrapper.tsx","../src/utils/deviceFocalLengthJson/index.ts","../src/components/onboarding/Onboarding.tsx","../src/customHooks/usePhoneDetection.ts","../src/components/focalLength/FocalLengthWrapper.tsx","../src/components/focalLength/FocalLength.tsx","../src/components/educational/MuseSteps/MuseScreenRenderer.tsx","../src/components/educational/MuseSteps/index.tsx","../src/components/educational/MuseSteps/BodyScanAnimation.tsx","../src/components/educational/MuseSteps/FaceScanAnimation.tsx","../src/components/educational/MuseSteps/TypewritterScene.tsx","../src/customHooks/useMuseAnimation.ts","../src/components/educational/VolumeStep.tsx","../src/components/educational/SetupScreen.tsx","../src/components/educational/EducationalStepsWrapper.tsx","../src/components/educational/Educational.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\n/** Lightweight classnames helper to avoid depending on ../../utils/utils */\nconst cn = (...classes: Array<string | false | null | undefined>) =>\n classes.filter(Boolean).join(\" \");\n\nexport interface CustomInputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n type?: string;\n}\n\nconst CustomInput = React.forwardRef<HTMLInputElement, CustomInputProps>(\n ({ className, type, ...props }, ref) => {\n const config = useConfig();\n const input = config?.style?.input;\n const priority = input?.priority;\n return (\n <>\n <input\n type={type}\n className={`${className ? className : ''} customInput ` + cn(\n \"flex w-full px-[.75rem] h-[40px] text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed backdrop-blur-sm bg-btn font-medium pl-[1rem] pr-[2.5rem] focus:ring-1 focus:outline-none transition-all duration-200\",\n )}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n ref={ref}\n {...props}\n style={{\n background: priority?.inputBackgroundColor || input?.inputBackgroundColor || '#F9FAFC',\n color: priority?.inputTextColor || input?.inputTextColor || '#000',\n fontSize: input?.inputFontSize || '16px',\n fontWeight: input?.inputFontWeight || '400',\n border: `1px solid ${input?.inputBorderColor || 'transparent'}`,\n fontFamily: config?.style?.base?.baseFontFamily || 'Inter, sans-serif',\n borderRadius: input?.inputBorderRadius || '4px',\n }}\n />\n <style>\n {`\n .customInput::placeholder {\n color: ${priority?.inputPlaceholderColor || input?.inputPlaceholderColor || '#000'};\n font-weight: ${input?.inputFontWeight || '500'};\n opacity: 1;\n font-size: ${input?.inputFontSize || '14px'};\n }\n .customInput:focus-visible {\n box-shadow:0 0 0 2px white, 0 0 0 4px rgb(from currentColor r g b / 0.5);\n }\n\n `}\n </style>\n </>\n )}\n );\n\nCustomInput.displayName = \"CustomInput\";\n\nexport default CustomInput;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage, isValidEmail } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface EmailStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst EmailStep = ({ onComplete, initialValue, onStepComplete }: EmailStepProps) => {\n\tconst [value, setValue] = React.useState(initialValue || \"\");\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst handleNext = async (e: React.FormEvent<HTMLFormElement>) => {\n\t\te.preventDefault();\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (!value.trim()) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.emailRequired));\n\t\t\t\treturn;\n\t\t\t} else if (!isValidEmail(value.trim())) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.validEmail));\n\t\t\t} else {\n\t\t\t\tawait onStepComplete?.(value);\n\t\t\t\tonComplete?.(value);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"w-full max-w-md\">\n\t\t\t<form className=\"mt-[3.5rem]\" onSubmit={handleNext}>\n\t\t\t\t<div>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tid=\"name\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.enterEmail)}\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t\t\tsetValue(e.target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{message && (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tcolor: config?.style?.input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\t\t\tfontSize: config?.style?.input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t\t<SpecificButton type=\"submit\" disabled={!value.trim() || loading} buttonText={translate?.(LanguageKeys.next)} postfixIcon={<ArrowRight size={14} />} />\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t);\n};\n\nexport default EmailStep;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface NameStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst NameStep = ({ onComplete, initialValue, onStepComplete }: NameStepProps) => {\n\tconst [value, setValue] = React.useState(initialValue || \"\");\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst handleNext = async (e: React.FormEvent<HTMLFormElement>) => {\n\t\te.preventDefault();\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (!value.trim()) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.nameRequired));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tawait onStepComplete?.(value);\n\t\t\t\tonComplete?.(value);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"w-full max-w-md\">\n\t\t\t<form onSubmit={handleNext} className=\"mt-[3.5rem] mb-[.75rem]\">\n\t\t\t\t<div>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tid=\"name\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.enterName)}\n\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\tsetValue(e.target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{message && (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclassName=\"mt-[0.2rem] text-[16px]\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tcolor: config?.style?.input?.inputErrorColor || '#000',\n\t\t\t\t\t\t\t\tfontSize: config?.style?.input?.inputErrorFontSize || '16px',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t\t<SpecificButton disabled={!value.trim() || loading} buttonText={translate?.(LanguageKeys.next)} type=\"submit\" postfixIcon={<ArrowRight size={14} />} />\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t);\n};\n\nexport default NameStep;\n","import SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { GenderType } from \"../../utils/enums\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext, useState } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface GenderStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst GenderStep = ({ onComplete, initialValue, onStepComplete }: GenderStepProps) => {\n\tconst [genderType, setGenderType] = useState<GenderType>(initialValue);\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst input = config?.style?.input;\n\tconst priority = input?.priority;\n\n\tconst bgColor = priority?.inputBackgroundColor || input?.inputBackgroundColor || \"#F9FAFC\";\n\tconst textColor = priority?.inputTextColor || input?.inputTextColor || \"#000\";\n\tconst selectedBgColor = priority?.inputBackgroundColorSelect;\n\tconst selectedTextColor = priority?.inputBackgroundColorSelectTextColor;\n\n\tconst handleNext = async () => {\n\t\tsetLoading(true);\n\t\tsetMessage(undefined);\n\t\ttry {\n\t\t\tawait onStepComplete?.(genderType);\n\t\t\tonComplete?.(genderType);\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\" w-full flex flex-col max-w-md mt-[3.5rem] mb-[.75rem] gap-[1rem]\">\n\t\t\t\t<button\n\t\t\t\t\tclassName={` text-btnSize bg-btn cursor-pointer border leading-none rounded-[.375rem] focus-visible:ring-secondary p-[1rem] ${\n\t\t\t\t\t\tgenderType === GenderType.Male ? ` shadow-[0_1px_1px_rgba(0,0,0,0.251)]` : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetGenderType(GenderType.Male);\n\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: genderType === GenderType.Male ? selectedBgColor : bgColor,\n\t\t\t\t\t\tcolor: genderType === GenderType.Male ? selectedTextColor : textColor,\n\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${genderType === GenderType.Male ? config?.style?.base?.primaryColor : `transparent`}`,\n\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{translate?.(LanguageKeys.mens)}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclassName={`text-btnSize font-btnFont cursor-pointer leading-none rounded-[.375rem] focus-visible:ring-secondary p-[1rem] ${\n\t\t\t\t\t\tgenderType === GenderType.Female ? ` shadow-[0_1px_1px_rgba(0,0,0,0.251)]` : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetGenderType(GenderType.Female);\n\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: genderType === GenderType.Female ? selectedBgColor : bgColor,\n\t\t\t\t\t\tcolor: genderType === GenderType.Female ? selectedTextColor : textColor,\n\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${genderType === GenderType.Female ? config?.style?.base?.primaryColor : `transparent`}`,\n\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{translate?.(LanguageKeys.womens)}\n\t\t\t\t</button>\n\t\t\t\t{message && (\n\t\t\t\t\t<p\n\t\t\t\t\t\tclassName=\"mt-[0.2rem]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tcolor: input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\t\tfontSize: input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t<SpecificButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tbuttonText={translate?.(LanguageKeys.next)}\n\t\t\t\t\tpostfixIcon={<ArrowRight size={14} />}\n\t\t\t\t\tdisabled={!genderType || loading}\n\t\t\t\t\tbuttonFunc={handleNext}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\nexport default GenderStep;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { convertToCentimeters, handleErrorMessage } from \"../../utils/utils\";\nimport { MenuItem, Select } from \"@mui/material\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface HeightStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst HeightStep = ({ onComplete, initialValue, onStepComplete }: HeightStepProps) => {\n\tconst [localHeight, setLocalHeight] = useState({ cm: initialValue ? String(initialValue) : \"\", ft: \"\", inch: \"\" });\n\tconst [measurementUnit, setMeasurementUnit] = useState(\"cm\");\n\tconst [message, setMessage] = useState<string | undefined>(undefined);\n\tconst { translate, preferredLanguage } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst input = config?.style?.input;\n\tconst priority = input?.priority;\n\n\tconst inputBg = priority?.inputBackgroundColor || input?.inputBackgroundColor || \"#F9FAFC\";\n\tconst inputText = priority?.inputTextColor || input?.inputTextColor || \"#000\";\n\n\tconst handleSetHeight = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tsetMessage(undefined);\n\t\t\tif (measurementUnit === \"cm\") {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, cm: event.target.value, ft: \"\", inch: \"\" }));\n\t\t\t} else if (event.target.id === \"ft\") {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, ft: event.target.value, cm: \"\" }));\n\t\t\t} else {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, inch: event.target.value, cm: \"\" }));\n\t\t\t}\n\t\t},\n\t\t[measurementUnit],\n\t);\n\n\tconst handleMeasurementUnit = useCallback((event: any) => {\n\t\tconst val = event.target.value;\n\t\tsetMeasurementUnit(val);\n\t\tsetLocalHeight({ cm: \"\", ft: \"\", inch: \"\" });\n\t\tsetMessage(undefined);\n\t}, []);\n\n\tconst validateHeight = useCallback(\n\t\t(height: { cm: string; ft: string; inch: string }) => {\n\t\t\tif (measurementUnit === \"cm\") {\n\t\t\t\treturn !(+height.cm < 152.4 || +height.cm > 213.36);\n\t\t\t}\n\t\t\treturn !(convertToCentimeters(+height.ft, +height.inch) < 152.4 || convertToCentimeters(+height.ft, +height.inch) > 213.36);\n\t\t},\n\t\t[measurementUnit],\n\t);\n\n\tconst checkMeasurement = useCallback(async () => {\n\t\ttry {\n\t\t\tif (!validateHeight(localHeight)) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.heightError));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst height = { cm: +localHeight.cm, ft: +localHeight.ft, inch: +localHeight.inch };\n\t\t\tawait onStepComplete?.(height);\n\t\t\tonComplete?.(height);\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t}\n\t}, [localHeight, validateHeight, onStepComplete]);\n\n\tconst isButtonDisabled = useMemo(() => (!localHeight.cm && !localHeight.ft && !localHeight.inch) || !!message, [localHeight, message]);\n\n\tuseEffect(() => {\n\t\tif (localHeight.cm === \"\" && localHeight.ft !== \"\") {\n\t\t\tsetMeasurementUnit(\"ft\");\n\t\t}\n\t}, [localHeight]);\n\n\tconst renderHeightInput = useCallback(() => {\n\t\tif (measurementUnit === \"cm\") {\n\t\t\treturn (\n\t\t\t\t<div className={`w-full`}>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tid=\"cm\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.height)}\n\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tvalue={localHeight.cm}\n\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex gap-[.5rem]\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CustomInput\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tid=\"ft\"\n\t\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.heightInFt)}\n\t\t\t\t\t\t\tvalue={localHeight.ft}\n\t\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CustomInput\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tid=\"inch\"\n\t\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.heightInInch)}\n\t\t\t\t\t\t\tvalue={localHeight.inch}\n\t\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t}, [localHeight, preferredLanguage]);\n\n\treturn (\n\t\t<div className=\"h-full w-full\">\n\t\t\t<div className=\"mt-[3.5rem] mb-[.75rem]\">\n\t\t\t\t<div className=\"w-full flex gap-[.5rem]\">\n\t\t\t\t\t{renderHeightInput()}\n\t\t\t\t\t<Select\n\t\t\t\t\t\tclassName=\"bg-btn outline-none h-[40px] [&_svg]:text-base !shadow-none !outline-none !text-base\"\n\t\t\t\t\t\tvalue={measurementUnit}\n\t\t\t\t\t\tonChange={handleMeasurementUnit}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: inputBg,\n\t\t\t\t\t\t\tcolor: inputText,\n\t\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\t\tborder: `1px solid ${input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<MenuItem value=\"cm\">{translate?.(LanguageKeys.cmMeasurementUnit)}</MenuItem>\n\t\t\t\t\t\t<MenuItem value=\"ft\">{translate?.(LanguageKeys.ftMeasurementUnit)}</MenuItem>\n\t\t\t\t\t</Select>\n\t\t\t\t\t<style>\n\t\t\t\t\t\t{`\n .MuiOutlinedInput-notchedOutline {\n border: 1px solid ${input?.inputBorderColor || \"transparent\"} !important;\n outline: none;\n }\n .MuiSelect-select{\n outline: none;\n }\n .MuiSvgIcon-root{\n color: ${inputText} !important;\n }\n `}\n\t\t\t\t\t</style>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mt-2\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tcolor: input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\tfontSize: input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<SpecificButton disabled={isButtonDisabled} buttonFunc={checkMeasurement} buttonText={translate?.(LanguageKeys.next)} postfixIcon={<ArrowRight size={14} />} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default HeightStep;\n","import React, { useMemo } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface ProgressDotsProps {\n totalSteps: number;\n currentStepIndex: number;\n}\n\nconst ProgressDots: React.FC<ProgressDotsProps> = ({ totalSteps, currentStepIndex }) => {\n const config = useConfig();\n const activeColor = config?.style?.base?.primaryColor || \"#000\";\n const inactiveColor = config?.style?.base?.secondaryColor || \"#D9D9D9\";\n\n const dots = useMemo(\n () =>\n Array.from({ length: totalSteps }, (_, i) => ({\n index: i,\n isActive: i === currentStepIndex,\n isCompleted: i < currentStepIndex\n })),\n [totalSteps, currentStepIndex]\n );\n\n return (\n <div className=\"flex justify-center items-center gap-[4px] my-[1.5rem]\">\n {dots.map(({ index, isActive, isCompleted }) => (\n <div\n key={index}\n className={`h-[3px] rounded-[9999px] transition-all duration-300 ${\n isActive ? \"w-[50px]\" : \"w-[30px]\"\n }`}\n style={{\n backgroundColor: isCompleted || isActive ? activeColor : inactiveColor\n }}\n />\n ))}\n </div>\n );\n};\n\nexport default ProgressDots;\n","import { useContext } from \"react\";\nimport EmailStep from \"./EmailStep\";\nimport NameStep from \"./NameStep\";\nimport GenderStep from \"./GenderStep\";\nimport HeightStep from \"./HeightStep\";\nimport { OnboardingStep } from \"../../utils/enums\";\nimport { Step } from \"../../types/interfaces\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport ProgressDots from \"../../atoms/progressDots/ProgressDots\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\nconst StepsWrapper = ({ currentStep, onStepDone, stepOrder, visibleSteps = [] }: { currentStep: Step; onStepDone: (val: any) => void; stepOrder: any; visibleSteps?: Step[] }) => {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst resolvedConfig = useConfig();\n\n\tconst renderStep = () => {\n\t\tif (!currentStep) return null;\n\n\t\tconst commonProps = {\n\t\t\tresolvedConfig,\n\t\t\tinitialValue: currentStep.value,\n\t\t\tonComplete: onStepDone,\n\t\t\tonStepComplete: currentStep?.onStepComplete,\n\t\t};\n\n\t\tswitch (currentStep.type) {\n\t\t\tcase OnboardingStep.Email:\n\t\t\t\treturn <EmailStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Name:\n\t\t\t\treturn <NameStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Gender:\n\t\t\t\treturn <GenderStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Height:\n\t\t\t\treturn <HeightStep {...commonProps} />;\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{translate?.(LanguageKeys.noValidSteps)} {currentStep.type}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\tif (!visibleSteps.length) return <div>{translate?.(LanguageKeys.unsupportedStep)}</div>;\n\n\t// stepOrder is the resolved visible-only list (from Onboarding.tsx),\n\t// so indexOf gives the correct 0-based position in the actual navigation flow.\n\tconst absoluteIndex = currentStep ? stepOrder.indexOf(currentStep.type) : 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div id=\"swan-onboarding-bg\" style={{ background: resolvedConfig?.style?.base?.backgroundColor }} className=\"fixed common-ui-main w-full h-full z-[0] pointer-events-none top-0 left-0\"></div>\n\n\t\t\t<div className=\"px-[15px] common-ui-main relative pt-[15px] w-full flex items-center flex-col\">\n\t\t\t\t<div className=\"max-w-[28rem] mx-auto w-full\">\n\t\t\t\t\t{/* Logo */}\n\t\t\t\t\t{resolvedConfig?.logo && (\n\t\t\t\t\t\t<div className=\"text-center mb-[1rem] flex justify-center\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={resolvedConfig?.logo}\n\t\t\t\t\t\t\t\talt=\"logo\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\theight: resolvedConfig?.style?.logo?.logoHeight,\n\t\t\t\t\t\t\t\t\twidth: resolvedConfig?.style?.logo?.logoWidth,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"h-10 mx-auto\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Progress Dots */}\n\t\t\t\t\t<ProgressDots totalSteps={stepOrder.length} currentStepIndex={absoluteIndex} />\n\n\t\t\t\t\t{/* Heading */}\n\t\t\t\t\t<h1\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\t\t\tfontSize: resolvedConfig?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\t\t\tcolor: resolvedConfig?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"text-center pt-[1.5rem]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{translate?.(LanguageKeys.onboarding[currentStep?.type || \"heading\"])}\n\t\t\t\t\t</h1>\n\n\t\t\t\t\t{/* Step */}\n\t\t\t\t\t{renderStep()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\nexport default StepsWrapper;\n","import Alcatel from \"./Alcatel.json\"\nimport Apple from \"./Apple.json\"\nimport CAT from \"./CAT.json\"\nimport Fairphone from \"./Fairphone.json\"\nimport Fujitsu from \"./Fujitsu.json\"\nimport Google from \"./Google.json\"\nimport Huawei from \"./Huawei.json\"\nimport iTel from \"./iTel.json\"\nimport Lava from \"./Lava.json\"\nimport Lg from \"./Lg.json\"\nimport Motorola from \"./Motorola.json\"\nimport NokiaHmd from \"./NokiaHmd.json\"\nimport Nothing from \"./Nothing.json\"\nimport Olla from \"./Olla.json\"\nimport Oneplus from \"./Oneplus.json\"\nimport Oppo from \"./Oppo.json\"\nimport Realme from \"./Realme.json\"\nimport Samsung from \"./Samsung.json\"\nimport Sharp from \"./Sharp.json\"\nimport Sony from \"./Sony.json\"\nimport Tecno from \"./Tecno.json\"\nimport Vivo from \"./Vivo.json\"\nimport Vsmart from \"./Vsmart.json\"\nimport Wiko from \"./Wiko.json\"\nimport Xiaomi from \"./Xiaomi.json\"\n\n\n\n\nconst DevicesList=[\n Alcatel,Apple,CAT,Fairphone,Fujitsu,Google,Huawei,iTel,Lava,Lg,Motorola,NokiaHmd,Nothing,Olla,Oneplus,Oppo,Realme,Samsung,Sharp,Sony,\n Tecno,Vivo,Vsmart,Wiko,Xiaomi\n\n]\n \n\nexport default DevicesList\n","\"use client\";\nimport React, { useState, useMemo, useCallback } from \"react\";\nimport { OnboardingProps } from \"../../types/interfaces\";\nimport { resolveSteps } from \"../../utils/utils\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\nimport StepsWrapper from \"./StepsWrapper\";\nimport usePhoneDetection from \"../../customHooks/usePhoneDetection\";\n\nexport const Onboarding: React.FC<OnboardingProps> = ({ steps, config, onComplete, onDeviceDetected }) => {\n\tusePhoneDetection({ onDeviceDetected });\n\tconst visibleSteps = useMemo(() => resolveSteps(steps), [steps]);\n\tconst [values, setValues] = useState<Record<string, any>>({});\n\tconst [stepIndex, setStepIndex] = useState(0);\n\tconst currentStep = visibleSteps[stepIndex];\n\t// Hidden steps (isVisible:false) are placed first in stepOrder so they render\n\t// as pre-completed dots at the start of the progress bar. Visible steps follow\n\t// in their resolved (sorted) order. Because currentStep is always a visible step,\n\t// its indexOf position is always >= hiddenSteps.length, which means the first\n\t// N dots are permanently in \"completed\" state — no juggling, no backward jumps.\n\tconst hiddenSteps = steps.filter((s) => s.isVisible === false);\n\tconst stepOrder = [\n\t\t...hiddenSteps.map((s) => s.type),\n\t\t...visibleSteps.map((s) => s.type),\n\t];\n\n\t/** 4️⃣ Handle completion for a step */\n\tconst handleStepComplete = useCallback(\n\t\t(value: any) => {\n\t\t\tif (!currentStep) return;\n\t\t\tconst updated = { ...values, [currentStep.type]: value };\n\t\t\tsetValues(updated);\n\t\t\tif (stepIndex === visibleSteps.length - 1) {\n\t\t\t\tonComplete?.(updated);\n\t\t\t} else {\n\t\t\t\tsetStepIndex((prev) => prev + 1); // 👈 FIX\n\t\t\t}\n\t\t},\n\t\t[currentStep, values, stepIndex, visibleSteps.length, onComplete],\n\t);\n\n\tif (!visibleSteps.length) return <div>No steps configured for onboarding.</div>;\n\n\treturn (\n\t\t<LanguageContextProvider>\n\t\t\t<ConfigProvider config={config}>\n\t\t\t\t<StepsWrapper currentStep={currentStep} onStepDone={handleStepComplete} visibleSteps={visibleSteps} stepOrder={stepOrder} />\n\t\t\t</ConfigProvider>\n\t\t</LanguageContextProvider>\n\t);\n};\n","// Hook that auto-detects the user's phone model and focal length via WURFL.js (loaded dynamically).\n// Looks up the detected brand/model in DevicesList to find the camera focal length.\n// Falls back to manual selection if WURFL doesn't find a match in DevicesList.\n\nimport React, { useEffect } from \"react\";\nimport posthog from \"../utils/posthog\";\nimport DevicesList from \"../utils/deviceFocalLengthJson\";\n\ninterface DeviceInfo {\n brandName: string;\n modelName: string;\n focalLength: number;\n}\n\ninterface UsePhoneDetectionParams {\n onDeviceDetected?: (deviceInfo: { brandName: string; modelName: string; focalLength: number }) => void;\n}\n\nfunction usePhoneDetection({\n onDeviceDetected,\n}: UsePhoneDetectionParams): null {\n const handleWURFLDetectionComplete = () => {\n try {\n const wurfl = window?.WURFL;\n if (!wurfl) return;\n\n let phoneModel: { model_name: string; focal_length: number } | undefined;\n\n if (wurfl.brand_name === \"Apple\") {\n // WURFL returns generic \"iPhone\" for Apple — use a safe default focal length\n phoneModel = { model_name: \"iPhone\", focal_length: 23 };\n } else {\n for (const entry of DevicesList) {\n if (wurfl.brand_name in entry) {\n const models = (entry as Record<string, { model_name: string; focal_length: number }[]>)[wurfl.brand_name];\n phoneModel = models.find(\n (el) => el.model_name === wurfl.model_name || el.model_name === wurfl.marketing_name\n );\n if (phoneModel) break;\n }\n }\n }\n\n if (!phoneModel) return;\n const deviceInfo: DeviceInfo = {\n brandName: wurfl.brand_name,\n modelName: phoneModel.model_name,\n focalLength: phoneModel.focal_length,\n };\n\n onDeviceDetected?.({\n brandName: deviceInfo.brandName,\n modelName: deviceInfo.modelName,\n focalLength: deviceInfo.focalLength,\n });\n\n const payload: Record<string, any> = {\n type: \"auto\",\n data: JSON.stringify(deviceInfo),\n location:\"package\"\n };\n posthog.capture(`Phone Detection`, payload);\n } catch (error) {\n console.log(error, \"wurfl error\");\n }\n };\n\n useEffect(() => {\n try {\n document.addEventListener(\"WurflJSDetectionComplete\", handleWURFLDetectionComplete);\n const script = document.createElement(\"script\");\n script.src = \"//wjs.wurflcloud.com/wurfl.js\";\n script.async = true;\n document.head.appendChild(script);\n } catch (error) {\n console.log(\"error in getting device details\", error);\n }\n return () => {\n document.removeEventListener(\"WurflJSDetectionComplete\", handleWURFLDetectionComplete);\n };\n }, []);\n\n return null;\n}\n\nexport default usePhoneDetection;\n","import { useCallback, useContext, useState } from \"react\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport Header from \"../Header\";\nimport { MenuItem, Select } from \"@mui/material\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useConfig } from \"../../utils/context/configContext\";\nimport { FocalLengthProps } from \"../../types/interfaces\";\nimport DevicesList from \"../../utils/deviceFocalLengthJson\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\n\ntype PhoneModel = {\n\tid: number;\n\tmodel_name: string;\n\tfocal_length: number;\n};\n\ntype DeviceManufacturer = Record<string, PhoneModel[]>;\ntype DevicesListType = DeviceManufacturer[];\n\nconst FocalLengthWrapper = ({ onComplete }: Omit<FocalLengthProps, \"config\">) => {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst resolvedConfig = useConfig();\n\tconst [deviceInfo, setDeviceInfo] = useState({\n\t\tbrandName: \"\",\n\t\tmodel: null as PhoneModel | null,\n\t});\n\tconst [message, setMessage] = useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = useState(false);\n\n\t/* ------------ Brand Menu ------------ */\n\tconst manufacturerMenuItems = useCallback(() => {\n\t\treturn (DevicesList as DevicesListType).map((manufacturer) => {\n\t\t\tconst brandName = Object.keys(manufacturer)[0];\n\t\t\treturn (\n\t\t\t\t<MenuItem key={brandName} value={brandName}>\n\t\t\t\t\t{brandName}\n\t\t\t\t</MenuItem>\n\t\t\t);\n\t\t});\n\t}, []);\n\n\t/* ------------ Model Menu ------------ */\n\tconst phoneModelMenuItems = useCallback(() => {\n\t\tconst brandMatch = (DevicesList as DevicesListType).find((manufacturer) => {\n\t\t\tconst key = Object.keys(manufacturer)[0];\n\t\t\treturn key === deviceInfo.brandName;\n\t\t});\n\n\t\tif (!brandMatch) return null;\n\n\t\tconst key = Object.keys(brandMatch)[0];\n\t\tconst models = brandMatch[key];\n\n\t\treturn models.map((phone) => (\n\t\t\t<MenuItem key={phone.id} value={phone.id}>\n\t\t\t\t{phone.model_name}\n\t\t\t</MenuItem>\n\t\t));\n\t}, [deviceInfo.brandName]);\n\n\tconst handleSubmit = useCallback(async () => {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (deviceInfo.brandName && deviceInfo.model) {\n\t\t\t\tawait onComplete?.({\n\t\t\t\t\tbrandName: deviceInfo.brandName,\n\t\t\t\t\tmodelName: deviceInfo.model.model_name,\n\t\t\t\t\tfocalLength: deviceInfo.model.focal_length,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [deviceInfo]);\n\n\t/* ------------ Brand Change ------------ */\n\tconst handleBrandChange = (event: any) => {\n\t\tsetDeviceInfo({\n\t\t\tbrandName: event.target.value,\n\t\t\tmodel: null,\n\t\t});\n\t};\n\n\t/* ------------ Model Change ------------ */\n\tconst handleModelChange = (event: any) => {\n\t\tconst selectedId = event.target.value;\n\n\t\tconst brandMatch = (DevicesList as DevicesListType).find((m) => {\n\t\t\treturn Object.keys(m)[0] === deviceInfo.brandName;\n\t\t});\n\n\t\tif (!brandMatch) return;\n\n\t\tconst key = Object.keys(brandMatch)[0];\n\t\tconst models = brandMatch[key];\n\n\t\tconst foundModel = models.find((phone) => phone.id === selectedId);\n\n\t\tsetDeviceInfo((prev) => ({\n\t\t\t...prev,\n\t\t\tmodel: foundModel ?? null,\n\t\t}));\n\t};\n\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full common-ui-main flex-col max-w-md mx-auto pt-[1rem] p-[15px] w-full flex justify-start items-start text-center rounded-t-[20px]\"\n\t\t\tstyle={{ background: resolvedConfig?.style?.base?.backgroundColor }}\n\t\t>\n\t\t\t<div className=\"w-full max-w-[28rem] mx-auto\">\n\t\t\t\t<Header subtitle={translate?.(LanguageKeys.phoneModel)} />\n\t\t\t\t<div className=\"text-left mb-[.25rem] mt-[1rem]\">{translate?.(LanguageKeys.selectPhoneBrand)}</div>\n\n\t\t\t\t<Select\n\t\t\t\t\tonChange={handleBrandChange}\n\t\t\t\t\tclassName=\"w-full h-[40px] !shadow-none !outline-none text-left\"\n\t\t\t\t\tvalue={deviceInfo.brandName}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: resolvedConfig?.style?.input?.inputBackgroundColor || \"#F9FAFC\",\n\t\t\t\t\t\tcolor: resolvedConfig?.style?.input?.inputTextColor || \"#000\",\n\t\t\t\t\t\tfontSize: resolvedConfig?.style?.input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{manufacturerMenuItems()}\n\t\t\t\t</Select>\n\n\t\t\t\t<div className=\"text-left mb-[.25rem] mt-[1rem]\">{translate?.(LanguageKeys.selectPhoneModel)}</div>\n\n\t\t\t\t<Select\n\t\t\t\t\tonChange={handleModelChange}\n\t\t\t\t\tclassName=\"w-full bg-btn h-[40px] !shadow-none !outline-none text-left\"\n\t\t\t\t\tvalue={deviceInfo.model?.id || \"\"}\n\t\t\t\t\tdisabled={!deviceInfo.brandName}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: resolvedConfig?.style?.input?.inputBackgroundColor || \"#F9FAFC\",\n\t\t\t\t\t\tcolor: resolvedConfig?.style?.input?.inputTextColor || \"#000\",\n\t\t\t\t\t\tfontSize: resolvedConfig?.style?.input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{phoneModelMenuItems()}\n\t\t\t\t</Select>\n\t\t\t\t<style>\n\t\t\t\t\t{`\n .MuiOutlinedInput-notchedOutline {\n border: 1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"} !important;\n outline: none;\n }\n .MuiSelect-select{\n outline: none;\n }\n \n `}\n\t\t\t\t</style>\n\t\t\t\t{message && <p className=\"mt-[0.2rem] text-[16px]\">{message}</p>}\n\t\t\t</div>\n\n\t\t\t<div className=\"mt-[.75rem] mb-[1.25rem] max-w-[28rem] mx-auto w-full flex justify-end\">\n\t\t\t\t<SpecificButton\n\t\t\t\t\tdisabled={!deviceInfo?.brandName || !deviceInfo?.model || loading}\n\t\t\t\t\tpostfixIcon={<ArrowRight />}\n\t\t\t\t\tbuttonFunc={handleSubmit}\n\t\t\t\t\tbuttonText={translate?.(LanguageKeys.next)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default FocalLengthWrapper;\n","import React from \"react\";\nimport FocalLengthWrapper from \"./FocalLengthWrapper\";\nimport { FocalLengthProps } from \"../../types/interfaces\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\n\nexport const FocalLength: React.FC<FocalLengthProps> = ({\n onComplete,\n config,\n}: FocalLengthProps) => {\n return (\n <LanguageContextProvider>\n <ConfigProvider config={config}>\n <FocalLengthWrapper\n onComplete={onComplete}\n />\n </ConfigProvider>\n </LanguageContextProvider>\n );\n};\n","import React from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\n\nexport default function MuseScreenRenderer({\n\tscreenIndex,\n\tscanLinePosition,\n\tfaceZoomed,\n\tshowFaceScanLine,\n\tfaceScanLinePosition,\n\tshowLargeS,\n\ttypewriterText,\n\tfullText,\n\tscreens,\n\tvideoToShow,\n\tfaceScanVideo,\n\tsizeVideo,\n\tformFittingVideo,\n}: any) {\n\tconst screen = screens[screenIndex];\n\n\t// Map screen id to props for each component\n\tconst componentProps: any = {\n\t\tbody: { scanLinePosition, videoToShow },\n\t\tface: {\n\t\t\tfaceZoomed,\n\t\t\tshowFaceScanLine,\n\t\t\tfaceScanLinePosition,\n\t\t\tfaceScanVideo,\n\t\t},\n\t\tsizeFit: { showLargeS, typewriterText, fullText, sizeVideo },\n\t};\n\n\tconst hasComponent = !!screen.component;\n\tconst Comp = hasComponent ? screen.component : null;\n\n\tlet content = null;\n\tif (hasComponent) {\n\t\tcontent = React.createElement(Comp.type || Comp, componentProps[screen.id] || {});\n\t} else if (screen.image) {\n\t\tcontent = (\n\t\t\t<video className=\"h-full w-full object-contain border-none\" muted loop autoPlay playsInline preload=\"auto\">\n\t\t\t\t<source src={formFittingVideo} type=\"video/mp4\" />\n\t\t\t</video>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AnimatePresence mode=\"wait\">\n\t\t\t<motion.div key={screenIndex} initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -20 }} transition={{ duration: 0.4 }} className=\"w-full h-full\">\n\t\t\t\t{content}\n\t\t\t</motion.div>\n\t\t</AnimatePresence>\n\t);\n}\n","import { ArrowRight } from \"lucide-react\";\nimport BodyScanAnimation from \"./BodyScanAnimation\";\nimport FaceScanAnimation from \"./FaceScanAnimation\";\nimport TypewriterScene from \"./TypewritterScene\";\nimport { useContext, useMemo, useState } from \"react\";\nimport MuseScreenRenderer from \"./MuseScreenRenderer\";\nimport Header from \"../../Header\";\nimport { GenderType, MuseScreenStep } from \"../../../utils/enums\";\nimport {\n\tbodyScanPerson,\n\tfaceScanPerson,\n\tfaceScanVideo,\n\tfemaleScanVideo,\n\tfittingGuide,\n\tformFittingGuide,\n\tfullText,\n\tleSableDress,\n\tmaleFaceScanVideo,\n\tmaleFormFittingGuide,\n\tmaleScanVideo,\n\tmaleSizeSuggestions,\n\tOUTFIT_IMAGES,\n\tsizeSuggestions,\n} from \"../../..//utils/constants\";\nimport { MuseStepsProps } from \"../../../types/interfaces\";\nimport useMuseAnimations from \"../../../customHooks/useMuseAnimation\";\nimport SpecificButton from \"../../../atoms/specificButton/SpecificButton\";\nimport { LanguageKeys } from \"../../../utils/languageKeys\";\nimport { LanguageContext } from \"../../../utils/context/languageContext\";\nimport { useConfig } from \"../../../utils/context/configContext\";\n\nconst screens: {\n\tid: string;\n\ttitle: string;\n\tdescription: string;\n\timage: string;\n\tcomponent?: React.ReactNode;\n}[] = [\n\t{\n\t\tid: MuseScreenStep.Body,\n\t\ttitle: LanguageKeys.bodyScan,\n\t\tdescription: LanguageKeys.bodyScanDescription,\n\t\timage: bodyScanPerson,\n\t\tcomponent: <BodyScanAnimation />,\n\t},\n\t{\n\t\tid: MuseScreenStep.Face,\n\t\ttitle: LanguageKeys.faceScan,\n\t\tdescription: LanguageKeys.faceScanDescription,\n\t\timage: faceScanPerson,\n\t\tcomponent: <FaceScanAnimation />,\n\t},\n\t{\n\t\tid: MuseScreenStep.SizeFit,\n\t\ttitle: LanguageKeys.sizeFit,\n\t\tdescription: \"\",\n\t\timage: leSableDress,\n\t\tcomponent: <TypewriterScene />,\n\t},\n\t{\n\t\tid: MuseScreenStep.Ready,\n\t\ttitle: LanguageKeys.readyToStart,\n\t\tdescription: LanguageKeys.readyToStartDescription,\n\t\timage: fittingGuide,\n\t},\n];\n\nexport default function MuseSteps({ applicableScreens, gender, onNext, isCustom }: Omit<MuseStepsProps, \"config\">) {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst [currentScreen, setCurrentScreen] = useState(0);\n\tconst [scanLinePosition, setScanLinePosition] = useState(0);\n\tconst [faceZoomed, setFaceZoomed] = useState(false);\n\tconst [faceScanLinePosition, setFaceScanLinePosition] = useState(0);\n\tconst [showFaceScanLine, setShowFaceScanLine] = useState(false);\n\tconst [currentOutfit, setCurrentOutfit] = useState(0);\n\tconst [typewriterText, setTypewriterText] = useState(\"\");\n\tconst [showLargeS, setShowLargeS] = useState(false);\n\n\tconst screensToShow = useMemo(() => {\n\t\tif (isCustom) {\n\t\t\treturn screens.reduce((acc: any, el) => {\n\t\t\t\tif ([\"face\", \"sizeFit\"].includes(el.id)) {\n\t\t\t\t\treturn acc;\n\t\t\t\t}\n\t\t\t\tacc.push(el);\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\t\t}\n\t\tif (!applicableScreens?.length) {\n\t\t\treturn screens;\n\t\t}\n\t\treturn screens.filter((screen) => applicableScreens.includes(screen.id));\n\t}, [applicableScreens]);\n\n\tuseMuseAnimations({\n\t\tscreenId: screensToShow[currentScreen].id,\n\t\tsetScanLinePosition,\n\t\tsetFaceZoomed,\n\t\tsetShowFaceScanLine,\n\t\tsetFaceScanLinePosition,\n\t\tsetCurrentOutfit,\n\t\tsetTypewriterText,\n\t\tsetShowLargeS,\n\t\toutfitImages: OUTFIT_IMAGES,\n\t\tfullText,\n\t});\n\n\tconst onNextClick = () => {\n\t\tif (currentScreen < screensToShow.length - 1) {\n\t\t\tsetCurrentScreen((prev) => prev + 1);\n\t\t} else {\n\t\t\tonNext?.();\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"relative common-ui-main h-full max-w-[28rem] mx-auto w-full flex justify-center\" style={{ background: config?.style?.base?.backgroundColor }}>\n\t\t\t<div className=\"absolute bottom-0 left-0 right-0 h-full shadow-lg w-full\">\n\t\t\t\t<div className=\"h-full flex flex-col p-[1rem] w-full\">\n\t\t\t\t\t<Header noTitle />\n\t\t\t\t\t<div className=\"text-center pb-[.5rem]\">\n\t\t\t\t\t\t<h1\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontFamily: config?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\t\t\t\tfontSize: config?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\t\t\t\tcolor: config?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\t\t\t\tfontWeight: config?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{translate?.(screensToShow[currentScreen].title)}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t{screensToShow[currentScreen].description && (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName=\" mt-[.25rem] max-w-[280px] mx-auto min-h-[40px]\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n\t\t\t\t\t\t\t\t\tfontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n\t\t\t\t\t\t\t\t\tcolor: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n\t\t\t\t\t\t\t\t\tfontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{translate?.(screensToShow[currentScreen].description)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex-1 flex justify-center items-center overflow-hidden py-[1rem] relative\">\n\t\t\t\t\t\t<MuseScreenRenderer\n\t\t\t\t\t\t\tscreenIndex={currentScreen}\n\t\t\t\t\t\t\tscanLinePosition={scanLinePosition}\n\t\t\t\t\t\t\tfaceZoomed={faceZoomed}\n\t\t\t\t\t\t\tshowFaceScanLine={showFaceScanLine}\n\t\t\t\t\t\t\tfaceScanLinePosition={faceScanLinePosition}\n\t\t\t\t\t\t\toutfitImages={OUTFIT_IMAGES}\n\t\t\t\t\t\t\tcurrentOutfit={currentOutfit}\n\t\t\t\t\t\t\tshowLargeS={showLargeS}\n\t\t\t\t\t\t\ttypewriterText={typewriterText}\n\t\t\t\t\t\t\tfullText={fullText}\n\t\t\t\t\t\t\tscreens={screensToShow}\n\t\t\t\t\t\t\tvideoToShow={gender === GenderType.Male ? maleScanVideo : femaleScanVideo}\n\t\t\t\t\t\t\tfaceScanVideo={gender === GenderType.Male ? maleFaceScanVideo : faceScanVideo}\n\t\t\t\t\t\t\tsizeVideo={gender === GenderType.Male ? maleSizeSuggestions : sizeSuggestions}\n\t\t\t\t\t\t\tformFittingVideo={gender === GenderType.Male ? maleFormFittingGuide : formFittingGuide}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"pt-[.5rem] flex justify-end\">\n\t\t\t\t\t\t<SpecificButton buttonText={translate?.(LanguageKeys.next)} type=\"submit\" postfixIcon={<ArrowRight size={14} />} buttonFunc={onNextClick} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","export default function BodyScanAnimation({\n videoToShow,\n}: {\n videoToShow?: string;\n}) {\n return (\n <div className=\"relative w-full h-full common-ui-main\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n autoPlay\n loop\n playsInline\n >\n <source src={videoToShow} type=\"video/mp4\" />\n </video>\n </div>\n );\n}\n","import { FaceScanAnimationProps } from \"../../../types/interfaces\";\n\nexport default function FaceScanAnimation({\n faceZoomed,\n showFaceScanLine,\n faceScanLinePosition,\n faceScanVideo,\n}: FaceScanAnimationProps) {\n return (\n <div className=\"relative h-full w-full common-ui-main\">\n <div className=\"w-full h-full relative\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n autoPlay\n playsInline\n >\n <source src={faceScanVideo} type=\"video/mp4\" />\n </video>\n {showFaceScanLine && faceZoomed && (\n <div\n className=\"absolute w-[1px] bg-[#8B5CF6] shadow-[0_0_8px_rgba(139,92,246,0.8)] z-20\"\n style={{\n left: `${faceScanLinePosition}%`,\n top: \"0%\",\n height: \"40%\",\n opacity:\n faceScanLinePosition && faceScanLinePosition >= 0 ? 1 : 0,\n }}\n />\n )}\n </div>\n </div>\n );\n}\n","export default function TypewriterScene({ sizeVideo }: { sizeVideo?: string }) {\n return (\n <div className=\"relative common-ui-main w-full h-full flex justify-center items-center\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n loop\n autoPlay\n playsInline\n >\n <source src={sizeVideo} type=\"video/mp4\" />\n </video>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nfunction useMuseAnimations({\n screenId,\n setScanLinePosition,\n setFaceZoomed,\n setShowFaceScanLine,\n setFaceScanLinePosition,\n setCurrentOutfit,\n outfitImages,\n setTypewriterText,\n setShowLargeS,\n fullText,\n}: any) {\n const animationRefs = useRef<any>({\n scan: null,\n face: null,\n outfit: null,\n typewriter: null,\n });\n\n const cleanupAnimations = () => {\n Object.values(animationRefs.current).forEach((ref: any) => {\n if (typeof ref === \"number\") {\n cancelAnimationFrame(ref);\n } else if (ref) {\n clearTimeout(ref);\n clearInterval(ref);\n }\n });\n animationRefs.current = {\n scan: null,\n face: null,\n outfit: null,\n typewriter: null,\n };\n };\n\n useEffect(() => {\n cleanupAnimations();\n\n switch (screenId) {\n case \"body\": {\n const startTime = Date.now();\n const duration = 3000;\n\n const animateScanLine = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n setScanLinePosition(progress * 100);\n if (progress < 1) {\n animationRefs.current.scan = requestAnimationFrame(animateScanLine);\n }\n };\n\n animationRefs.current.scan = requestAnimationFrame(animateScanLine);\n break;\n }\n\n case \"face\": {\n setFaceZoomed(false);\n setShowFaceScanLine(false);\n setFaceScanLinePosition(0);\n\n animationRefs.current.face = setTimeout(() => {\n setFaceZoomed(true);\n\n setTimeout(() => {\n setShowFaceScanLine(true);\n\n const startTime = Date.now();\n const duration = 6000; // ✅ Total 6s (3s for each direction)\n\n const animateFaceScanLine = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n setFaceScanLinePosition(\n progress <= 0.5 ? progress * 2 * 100 : (2 - progress * 2) * 100\n );\n\n if (progress < 1) {\n animationRefs.current.face =\n requestAnimationFrame(animateFaceScanLine);\n }\n };\n\n animationRefs.current.face =\n requestAnimationFrame(animateFaceScanLine);\n }, 2500); // Delay after zoom\n }, 800); // Delay before zoom\n break;\n }\n\n case \"sizeFit\": {\n setCurrentOutfit(0);\n animationRefs.current.outfit = setInterval(() => {\n setCurrentOutfit((prev: any) => (prev + 1) % outfitImages.length);\n }, 1500);\n break;\n }\n\n case \"ready\": {\n setShowLargeS(false);\n setTypewriterText(\"\");\n\n animationRefs.current.typewriter = setTimeout(() => {\n setShowLargeS(true);\n setTimeout(() => {\n let currentIndex = 0;\n const typeNextChar = () => {\n if (currentIndex < fullText.length) {\n setTypewriterText(fullText.slice(0, currentIndex + 1));\n currentIndex++;\n animationRefs.current.typewriter = setTimeout(typeNextChar, 30);\n }\n };\n typeNextChar();\n }, 1000);\n }, 800);\n break;\n }\n\n default:\n break;\n }\n\n return cleanupAnimations;\n }, [screenId]);\n}\n\nexport default useMuseAnimations;\n","import { ArrowRight, Volume2 } from \"lucide-react\";\nimport { useState, useEffect, useContext } from \"react\";\nimport Header from \"../Header\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface VolumeStepProps {\n onNext: () => void;\n}\n\nexport default function VolumeScreen({ onNext }: VolumeStepProps) {\n const { translate } = useContext(LanguageContext) || {};\n const config = useConfig();\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isAnimationPaused, setIsAnimationPaused] = useState(false);\n\n useEffect(() => {\n const handleMouseMove = (e: any) => {\n setMousePosition({ x: e.clientX, y: e.clientY });\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n return () => window.removeEventListener(\"mousemove\", handleMouseMove);\n }, []);\n\n const toggleAnimationPause = () => {\n setIsAnimationPaused((prev) => !prev);\n };\n\n function hexToRgba(hex: string, alpha: number = 1): string {\n hex = hex.replace(\"#\", \"\");\n if (hex.length === 3) {\n hex = hex.split(\"\").map((h) => h + h).join(\"\");\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n\n const brandColor = config?.style?.base?.brandColor || \"#000\";\n const rgba1 = hexToRgba(brandColor, 0.19);\n const rgba2 = hexToRgba(brandColor, 0.23);\n const rgba3 = hexToRgba(brandColor, 0.24);\n\n const calculateHolographicEffect = () => {\n const windowWidth = typeof window !== \"undefined\" ? window.innerWidth : 1000;\n const windowHeight = typeof window !== \"undefined\" ? window.innerHeight : 1000;\n const normalizedX = (mousePosition.x / windowWidth) * 2 - 1;\n const normalizedY = (mousePosition.y / windowHeight) * 2 - 1;\n const rotateX = normalizedY * 5;\n const rotateY = normalizedX * -5;\n return {\n transform: `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`,\n background: \"#fff\",\n boxShadow: `0 0 20px ${rgba1}, 0 0 30px ${rgba2}`,\n };\n };\n\n const holographicStyle = calculateHolographicEffect();\n\n return (\n <div\n className=\"flex h-full max-w-[28rem] mx-auto w-full flex-col relative items-center justify-center overflow-hidden max-w-md mx-auto bg-primary text-base\"\n style={{ background: config?.style?.base?.backgroundColor }}\n >\n <div className=\"flex justify-start absolute z-[99] top-[1rem] max-w-md mx-auto w-full px-[1rem]\">\n <Header noTitle />\n </div>\n <div className=\"relative mb-[2rem]\">\n {[...Array(3)].map((_, i) => (\n <div\n key={i}\n className=\"absolute rounded-[9999px]\"\n style={{\n width: \"100px\",\n height: \"100px\",\n minHeight: \"100px\",\n minWidth: \"100px\",\n background: config?.style?.base?.backgroundColor || \"#fff\",\n boxShadow: `0 0 20px 2px ${rgba3}`,\n border: \"none\",\n filter: \"blur(1px)\",\n margin: \"0 auto\",\n left: \"50%\",\n top: \"50%\",\n animation: isAnimationPaused\n ? \"none\"\n : `gentleRipple 15s cubic-bezier(0.1, 0.5, 0.2, 1) ${i * 5}s infinite`,\n opacity: isAnimationPaused ? 1 : 0,\n transform: isAnimationPaused\n ? \"translate(-50%, -50%) scale(0.5)\"\n : \"translate(-50%, -50%)\",\n }}\n />\n ))}\n <div\n className=\"relative z-10 rounded-[9999px] p-[1.5rem] cursor-pointer transition-all backdrop-blur-sm\"\n style={{\n ...holographicStyle,\n transition: \"transform 0.1s ease-out, box-shadow 0.1s ease-out\",\n }}\n onClick={toggleAnimationPause}\n >\n <Volume2\n className=\"w-[3rem] h-[3rem] relative z-10\"\n style={{ filter: \"drop-shadow(0 0 5px rgba(255, 255, 255, 0.7))\" }}\n color={config?.style?.base?.primaryColor || \"#000\"}\n />\n </div>\n </div>\n\n <div className=\"relative z-10 text-center max-w-[20rem]\">\n <div\n className=\" mb-[.5rem]\"\n style={{\n fontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n fontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n color: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n fontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n }}\n >\n {translate?.(LanguageKeys.turnUpVolume)}\n </div>\n </div>\n\n <div className=\"absolute bottom-[1rem] right-0 max-w-[28rem] mx-auto w-full px-[1rem] max-w-md mx-auto\">\n <div className=\"flex justify-end\">\n <SpecificButton\n buttonFunc={() => onNext()}\n postfixIcon={<ArrowRight />}\n buttonText={translate?.(LanguageKeys.continue)}\n />\n </div>\n </div>\n <style>{`\n @keyframes gentleRipple {\n 0% {\n transform: translate(-50%, -50%) scale(0.5) translateZ(0);\n opacity: 0.7;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n transform: translate(-50%, -50%) scale(25) translateZ(0);\n opacity: 0;\n }\n }\n`}</style>\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { ArrowRight } from \"lucide-react\";\nimport Header from \"../Header\";\nimport { maleSetupVideo, setupVideo } from \"../../utils/constants\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { GenderType } from \"../../utils/enums\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { useConfig } from \"../../utils/context/configContext\";\nimport { Gender } from \"../../types/interfaces\";\n\ninterface SetupScreenProps {\n gender: Gender;\n onNext?: () => void;\n}\n\nexport default function SetupScreen({ gender, onNext }: SetupScreenProps) {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"flex h-full max-w-[28rem] mx-auto w-full p-[1rem] common-ui-main relative flex-col items-center overflow-hidden max-w-md mx-auto bg-primary text-base\"\n\t\t\tstyle={{ background: config?.style?.base?.backgroundColor }}\n\t\t>\n\t\t\t<div className=\"flex justify-start max-w-md mx-auto w-full \">\n\t\t\t\t<Header noTitle />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"mb-[1rem] text-[32px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: config?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\tfontSize: config?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\tcolor: config?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\tfontWeight: config?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{translate?.(LanguageKeys.phonePlacement)}\n\t\t\t</h2>\n\t\t\t<p\n\t\t\t\tclassName=\"text-center text-gray-600 text-sm mt-1 max-w-[280px] mx-auto min-h-[40px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n\t\t\t\t\tfontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n\t\t\t\t\tcolor: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n\t\t\t\t\tfontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{translate?.(LanguageKeys.phonePlacementDescription)}\n\t\t\t</p>\n\t\t\t<div className=\"relative w-full h-full flex flex-col items-center max-w-md pt-[1rem]\">\n\t\t\t\t<div className=\"relative w-full h-auto\">\n\t\t\t\t\t<video className=\"h-full w-full object-contain border-none\" muted loop autoPlay playsInline>\n\t\t\t\t\t\t<source src={gender === GenderType.Male ? maleSetupVideo : setupVideo} type=\"video/mp4\" />\n\t\t\t\t\t</video>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"absolute bottom-[0] max-w-[28rem] mx-auto w-full left-0 right-0 flex justify-center max-w-md mx-auto\">\n\t\t\t\t\t<div className=\"flex justify-end w-full\">\n\t\t\t\t\t\t<SpecificButton buttonFunc={() => onNext?.()} buttonText={translate?.(LanguageKeys.continue)} postfixIcon={<ArrowRight />} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useState } from \"react\";\nimport MuseSteps from \"./MuseSteps\";\nimport VolumeStep from \"./VolumeStep\";\nimport SetupScreen from \"./SetupScreen\";\nimport { EducationalProps } from \"../../types/interfaces\";\nimport { GenderType, MuseScreenStep, SectionType } from \"../../utils/enums\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\nconst EducationalStepsWrapper = ({ sections, gender, onComplete, isCustom }: EducationalProps) => {\n\tconst [step, setStep] = useState(1);\n\n\tswitch (step) {\n\t\tcase 1:\n\t\t\treturn (\n\t\t\t\t<MuseSteps\n\t\t\t\t\tapplicableScreens={\n\t\t\t\t\t\tsections?.[0] === SectionType.Full || !sections || !sections?.length\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: sections[0] === SectionType.Body\n\t\t\t\t\t\t\t? [MuseScreenStep.Body, MuseScreenStep.SizeFit, MuseScreenStep.Ready]\n\t\t\t\t\t\t\t: [MuseScreenStep.Face, MuseScreenStep.SizeFit]\n\t\t\t\t\t}\n\t\t\t\t\tisCustom={isCustom}\n\t\t\t\t\tgender={gender || GenderType.Male}\n\t\t\t\t\tonNext={() => setStep(2)}\n\t\t\t\t/>\n\t\t\t);\n\n\t\tcase 2:\n\t\t\treturn <VolumeStep onNext={() => (sections?.[0] === SectionType.Face ? onComplete?.() : setStep(3))} />;\n\n\t\tcase 3:\n\t\t\treturn <SetupScreen gender={gender || GenderType.Male} onNext={onComplete} />;\n\n\t\tdefault:\n\t\t\treturn <></>;\n\t}\n};\n\nexport default EducationalStepsWrapper;\n","import { EducationalProps } from \"../../types/interfaces\";\nimport { GenderType } from \"../../utils/enums\";\nimport EducationalStepsWrapper from \"./EducationalStepsWrapper\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\n\nexport const Educational: React.FC<EducationalProps> = ({\n sections = [],\n config,\n gender = GenderType.Male,\n onComplete,\n isCustom,\n}) => {\n return (\n <LanguageContextProvider>\n <ConfigProvider config={config}>\n <EducationalStepsWrapper\n sections={sections}\n gender={gender}\n onComplete={onComplete}\n isCustom={isCustom}\n />\n </ConfigProvider>\n </LanguageContextProvider>\n );\n};\n"],"names":["cn","classes","filter","Boolean","join","CustomInput","React","forwardRef","className","type","props","ref","config","useConfig","input","style","priority","_jsxs","_Fragment","children","_jsx","autoCapitalize","autoCorrect","background","inputBackgroundColor","color","inputTextColor","fontSize","inputFontSize","fontWeight","inputFontWeight","border","inputBorderColor","fontFamily","base","baseFontFamily","borderRadius","inputBorderRadius","inputPlaceholderColor","displayName","EmailStep","onComplete","initialValue","onStepComplete","value","setValue","useState","message","setMessage","undefined","loading","setLoading","translate","useContext","LanguageContext","onSubmit","async","e","preventDefault","trim","LanguageKeys","emailRequired","isValidEmail","validEmail","error","handleErrorMessage","required","id","placeholder","enterEmail","onChange","target","inputErrorColor","inputErrorFontSize","SpecificButton","disabled","buttonText","next","postfixIcon","ArrowRight","size","NameStep","nameRequired","enterName","GenderStep","genderType","setGenderType","bgColor","textColor","selectedBgColor","inputBackgroundColorSelect","selectedTextColor","inputBackgroundColorSelectTextColor","GenderType","Male","onClick","primaryColor","mens","Female","womens","buttonFunc","HeightStep","localHeight","setLocalHeight","cm","String","ft","inch","measurementUnit","setMeasurementUnit","preferredLanguage","inputBg","inputText","handleSetHeight","useCallback","event","prev","handleMeasurementUnit","val","validateHeight","height","convertToCentimeters","checkMeasurement","heightError","isButtonDisabled","useMemo","useEffect","renderHeightInput","inputMode","heightInFt","heightInInch","Select","MenuItem","cmMeasurementUnit","ftMeasurementUnit","ProgressDots","totalSteps","currentStepIndex","activeColor","inactiveColor","secondaryColor","dots","Array","from","length","_","i","index","isActive","isCompleted","map","backgroundColor","StepsWrapper","currentStep","onStepDone","stepOrder","visibleSteps","resolvedConfig","unsupportedStep","absoluteIndex","indexOf","logo","src","alt","logoHeight","width","logoWidth","heading","headingFontFamily","headingFontSize","headingColor","headingFontWeight","onboarding","commonProps","OnboardingStep","Email","Name","Gender","Height","noValidSteps","renderStep","DevicesList","Onboarding","steps","onDeviceDetected","handleWURFLDetectionComplete","wurfl","window","WURFL","phoneModel","brand_name","model_name","focal_length","entry","find","el","marketing_name","deviceInfo","brandName","modelName","focalLength","payload","data","JSON","stringify","location","posthog","capture","console","log","document","addEventListener","script","createElement","head","appendChild","removeEventListener","usePhoneDetection","resolveSteps","values","setValues","stepIndex","setStepIndex","s","isVisible","handleStepComplete","updated","LanguageContextProvider","ConfigProvider","FocalLengthWrapper","setDeviceInfo","model","manufacturerMenuItems","manufacturer","Object","keys","phoneModelMenuItems","brandMatch","phone","handleSubmit","Header","subtitle","selectPhoneBrand","selectPhoneModel","selectedId","m","foundModel","FocalLength","MuseScreenRenderer","screenIndex","scanLinePosition","faceZoomed","showFaceScanLine","faceScanLinePosition","showLargeS","typewriterText","fullText","screens","videoToShow","faceScanVideo","sizeVideo","formFittingVideo","screen","componentProps","body","face","sizeFit","hasComponent","component","Comp","content","image","muted","loop","autoPlay","playsInline","preload","AnimatePresence","mode","motion","div","initial","opacity","y","animate","exit","transition","duration","MuseScreenStep","Body","title","bodyScan","description","bodyScanDescription","bodyScanPerson","Face","faceScan","faceScanDescription","faceScanPerson","left","top","SizeFit","leSableDress","Ready","readyToStart","readyToStartDescription","fittingGuide","MuseSteps","applicableScreens","gender","onNext","isCustom","currentScreen","setCurrentScreen","setScanLinePosition","setFaceZoomed","setFaceScanLinePosition","setShowFaceScanLine","currentOutfit","setCurrentOutfit","setTypewriterText","setShowLargeS","screensToShow","reduce","acc","includes","push","screenId","outfitImages","animationRefs","useRef","scan","outfit","typewriter","cleanupAnimations","current","forEach","cancelAnimationFrame","clearTimeout","clearInterval","startTime","Date","now","animateScanLine","elapsed","progress","Math","min","requestAnimationFrame","setTimeout","animateFaceScanLine","setInterval","currentIndex","typeNextChar","slice","useMuseAnimations","OUTFIT_IMAGES","noTitle","subheading","subheadingFontFamily","subheadingFontSize","subheadingColor","subheadingFontWeight","maleScanVideo","femaleScanVideo","maleFaceScanVideo","maleSizeSuggestions","sizeSuggestions","maleFormFittingGuide","formFittingGuide","VolumeScreen","mousePosition","setMousePosition","x","isAnimationPaused","setIsAnimationPaused","handleMouseMove","clientX","clientY","hexToRgba","hex","alpha","replace","split","h","parseInt","substring","brandColor","rgba1","rgba2","rgba3","holographicStyle","windowWidth","innerWidth","windowHeight","innerHeight","normalizedX","transform","boxShadow","calculateHolographicEffect","minHeight","minWidth","margin","animation","Volume2","turnUpVolume","continue","SetupScreen","phonePlacement","phonePlacementDescription","maleSetupVideo","setupVideo","EducationalStepsWrapper","sections","step","setStep","SectionType","Full","VolumeStep","Educational"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/atoms/customInput/CustomInput.tsx","../src/components/onboarding/EmailStep.tsx","../src/components/onboarding/NameStep.tsx","../src/components/onboarding/GenderStep.tsx","../src/components/onboarding/HeightStep.tsx","../src/atoms/progressDots/ProgressDots.tsx","../src/components/onboarding/StepsWrapper.tsx","../src/utils/deviceFocalLengthJson/index.ts","../src/components/onboarding/Onboarding.tsx","../src/customHooks/usePhoneDetection.ts","../src/components/focalLength/FocalLengthWrapper.tsx","../src/components/focalLength/FocalLength.tsx","../src/components/educational/MuseSteps/MuseScreenRenderer.tsx","../src/components/educational/MuseSteps/index.tsx","../src/components/educational/MuseSteps/BodyScanAnimation.tsx","../src/components/educational/MuseSteps/FaceScanAnimation.tsx","../src/components/educational/MuseSteps/TypewritterScene.tsx","../src/customHooks/useMuseAnimation.ts","../src/components/educational/VolumeStep.tsx","../src/components/educational/SetupScreen.tsx","../src/components/educational/EducationalStepsWrapper.tsx","../src/components/educational/Educational.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\n/** Lightweight classnames helper to avoid depending on ../../utils/utils */\nconst cn = (...classes: Array<string | false | null | undefined>) =>\n classes.filter(Boolean).join(\" \");\n\nexport interface CustomInputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {\n className?: string;\n type?: string;\n}\n\nconst CustomInput = React.forwardRef<HTMLInputElement, CustomInputProps>(\n ({ className, type, ...props }, ref) => {\n const config = useConfig();\n const input = config?.style?.input;\n const priority = input?.priority;\n return (\n <>\n <input\n type={type}\n className={`${className ? className : ''} customInput ` + cn(\n \"flex w-full px-[.75rem] h-[40px] text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed backdrop-blur-sm bg-btn font-medium pl-[1rem] pr-[2.5rem] focus:ring-1 focus:outline-none transition-all duration-200\",\n )}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n ref={ref}\n {...props}\n style={{\n background: priority?.inputBackgroundColor || input?.inputBackgroundColor || '#F9FAFC',\n color: priority?.inputTextColor || input?.inputTextColor || '#000',\n fontSize: input?.inputFontSize || '16px',\n fontWeight: input?.inputFontWeight || '400',\n border: `1px solid ${input?.inputBorderColor || 'transparent'}`,\n fontFamily: config?.style?.base?.baseFontFamily || 'Inter, sans-serif',\n borderRadius: input?.inputBorderRadius || '4px',\n }}\n />\n <style>\n {`\n .customInput::placeholder {\n color: ${priority?.inputPlaceholderColor || input?.inputPlaceholderColor || '#000'};\n font-weight: ${input?.inputFontWeight || '500'};\n opacity: 1;\n font-size: ${input?.inputFontSize || '14px'};\n }\n .customInput:focus-visible {\n box-shadow:0 0 0 2px white, 0 0 0 4px rgb(from currentColor r g b / 0.5);\n }\n\n `}\n </style>\n </>\n )}\n );\n\nCustomInput.displayName = \"CustomInput\";\n\nexport default CustomInput;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage, isValidEmail } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface EmailStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst EmailStep = ({ onComplete, initialValue, onStepComplete }: EmailStepProps) => {\n\tconst [value, setValue] = React.useState(initialValue || \"\");\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst handleNext = async (e: React.FormEvent<HTMLFormElement>) => {\n\t\te.preventDefault();\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (!value.trim()) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.emailRequired));\n\t\t\t\treturn;\n\t\t\t} else if (!isValidEmail(value.trim())) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.validEmail));\n\t\t\t} else {\n\t\t\t\tawait onStepComplete?.(value);\n\t\t\t\tonComplete?.(value);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"w-full max-w-md\">\n\t\t\t<form className=\"mt-[3.5rem]\" onSubmit={handleNext}>\n\t\t\t\t<div>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tid=\"name\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.enterEmail)}\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t\t\tsetValue(e.target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{message && (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tcolor: config?.style?.input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\t\t\tfontSize: config?.style?.input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t\t<SpecificButton type=\"submit\" disabled={!value.trim() || loading} buttonText={translate?.(LanguageKeys.next)} postfixIcon={<ArrowRight size={14} />} />\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t);\n};\n\nexport default EmailStep;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface NameStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst NameStep = ({ onComplete, initialValue, onStepComplete }: NameStepProps) => {\n\tconst [value, setValue] = React.useState(initialValue || \"\");\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst handleNext = async (e: React.FormEvent<HTMLFormElement>) => {\n\t\te.preventDefault();\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (!value.trim()) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.nameRequired));\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tawait onStepComplete?.(value);\n\t\t\t\tonComplete?.(value);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"w-full max-w-md\">\n\t\t\t<form onSubmit={handleNext} className=\"mt-[3.5rem] mb-[.75rem]\">\n\t\t\t\t<div>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tid=\"name\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.enterName)}\n\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\tsetValue(e.target.value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t{message && (\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclassName=\"mt-[0.2rem] text-[16px]\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tcolor: config?.style?.input?.inputErrorColor || '#000',\n\t\t\t\t\t\t\t\tfontSize: config?.style?.input?.inputErrorFontSize || '16px',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t\t<SpecificButton disabled={!value.trim() || loading} buttonText={translate?.(LanguageKeys.next)} type=\"submit\" postfixIcon={<ArrowRight size={14} />} />\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t);\n};\n\nexport default NameStep;\n","import SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { GenderType } from \"../../utils/enums\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { ArrowRight } from \"lucide-react\";\nimport React, { useContext, useState } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface GenderStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst GenderStep = ({ onComplete, initialValue, onStepComplete }: GenderStepProps) => {\n\tconst [genderType, setGenderType] = useState<GenderType>(initialValue);\n\tconst [message, setMessage] = React.useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = React.useState(false);\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst input = config?.style?.input;\n\tconst priority = input?.priority;\n\n\tconst bgColor = priority?.inputBackgroundColor || input?.inputBackgroundColor || \"#F9FAFC\";\n\tconst textColor = priority?.inputTextColor || input?.inputTextColor || \"#000\";\n\tconst selectedBgColor = priority?.inputBackgroundColorSelect;\n\tconst selectedTextColor = priority?.inputBackgroundColorSelectTextColor;\n\n\tconst handleNext = async () => {\n\t\tsetLoading(true);\n\t\tsetMessage(undefined);\n\t\ttry {\n\t\t\tawait onStepComplete?.(genderType);\n\t\t\tonComplete?.(genderType);\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\" w-full flex flex-col max-w-md mt-[3.5rem] mb-[.75rem] gap-[1rem]\">\n\t\t\t\t<button\n\t\t\t\t\tclassName={` text-btnSize bg-btn cursor-pointer border leading-none rounded-[.375rem] focus-visible:ring-secondary p-[1rem] ${\n\t\t\t\t\t\tgenderType === GenderType.Male ? ` shadow-[0_1px_1px_rgba(0,0,0,0.251)]` : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetGenderType(GenderType.Male);\n\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: genderType === GenderType.Male ? selectedBgColor : bgColor,\n\t\t\t\t\t\tcolor: genderType === GenderType.Male ? selectedTextColor : textColor,\n\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${genderType === GenderType.Male ? config?.style?.base?.primaryColor : `transparent`}`,\n\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{translate?.(LanguageKeys.mens)}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tclassName={`text-btnSize font-btnFont cursor-pointer leading-none rounded-[.375rem] focus-visible:ring-secondary p-[1rem] ${\n\t\t\t\t\t\tgenderType === GenderType.Female ? ` shadow-[0_1px_1px_rgba(0,0,0,0.251)]` : \"\"\n\t\t\t\t\t}`}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetGenderType(GenderType.Female);\n\t\t\t\t\t\tsetMessage(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: genderType === GenderType.Female ? selectedBgColor : bgColor,\n\t\t\t\t\t\tcolor: genderType === GenderType.Female ? selectedTextColor : textColor,\n\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${genderType === GenderType.Female ? config?.style?.base?.primaryColor : `transparent`}`,\n\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{translate?.(LanguageKeys.womens)}\n\t\t\t\t</button>\n\t\t\t\t{message && (\n\t\t\t\t\t<p\n\t\t\t\t\t\tclassName=\"mt-[0.2rem]\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tcolor: input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\t\tfontSize: input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex justify-end mt-[.5rem]\">\n\t\t\t\t<SpecificButton\n\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\tbuttonText={translate?.(LanguageKeys.next)}\n\t\t\t\t\tpostfixIcon={<ArrowRight size={14} />}\n\t\t\t\t\tdisabled={!genderType || loading}\n\t\t\t\t\tbuttonFunc={handleNext}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\nexport default GenderStep;\n","import CustomInput from \"../../atoms/customInput/CustomInput\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { convertToCentimeters, handleErrorMessage } from \"../../utils/utils\";\nimport { MenuItem, Select } from \"@mui/material\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useCallback, useContext, useEffect, useMemo, useState } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface HeightStepProps {\n\tonComplete: (value: any) => void;\n\tinitialValue?: any;\n\tonStepComplete?: (value: any) => Promise<void> | void;\n}\n\nconst HeightStep = ({ onComplete, initialValue, onStepComplete }: HeightStepProps) => {\n\tconst [localHeight, setLocalHeight] = useState({ cm: initialValue ? String(initialValue) : \"\", ft: \"\", inch: \"\" });\n\tconst [measurementUnit, setMeasurementUnit] = useState(\"cm\");\n\tconst [message, setMessage] = useState<string | undefined>(undefined);\n\tconst { translate, preferredLanguage } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst input = config?.style?.input;\n\tconst priority = input?.priority;\n\n\tconst inputBg = priority?.inputBackgroundColor || input?.inputBackgroundColor || \"#F9FAFC\";\n\tconst inputText = priority?.inputTextColor || input?.inputTextColor || \"#000\";\n\n\tconst handleSetHeight = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tsetMessage(undefined);\n\t\t\tif (measurementUnit === \"cm\") {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, cm: event.target.value, ft: \"\", inch: \"\" }));\n\t\t\t} else if (event.target.id === \"ft\") {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, ft: event.target.value, cm: \"\" }));\n\t\t\t} else {\n\t\t\t\tsetLocalHeight((prev) => ({ ...prev, inch: event.target.value, cm: \"\" }));\n\t\t\t}\n\t\t},\n\t\t[measurementUnit],\n\t);\n\n\tconst handleMeasurementUnit = useCallback((event: any) => {\n\t\tconst val = event.target.value;\n\t\tsetMeasurementUnit(val);\n\t\tsetLocalHeight({ cm: \"\", ft: \"\", inch: \"\" });\n\t\tsetMessage(undefined);\n\t}, []);\n\n\tconst validateHeight = useCallback(\n\t\t(height: { cm: string; ft: string; inch: string }) => {\n\t\t\tif (measurementUnit === \"cm\") {\n\t\t\t\treturn !(+height.cm < 152.4 || +height.cm > 213.36);\n\t\t\t}\n\t\t\treturn !(convertToCentimeters(+height.ft, +height.inch) < 152.4 || convertToCentimeters(+height.ft, +height.inch) > 213.36);\n\t\t},\n\t\t[measurementUnit],\n\t);\n\n\tconst checkMeasurement = useCallback(async () => {\n\t\ttry {\n\t\t\tif (!validateHeight(localHeight)) {\n\t\t\t\tsetMessage(translate?.(LanguageKeys.heightError));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst height = { cm: +localHeight.cm, ft: +localHeight.ft, inch: +localHeight.inch };\n\t\t\tawait onStepComplete?.(height);\n\t\t\tonComplete?.(height);\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t}\n\t}, [localHeight, validateHeight, onStepComplete]);\n\n\tconst isButtonDisabled = useMemo(() => (!localHeight.cm && !localHeight.ft && !localHeight.inch) || !!message, [localHeight, message]);\n\n\tuseEffect(() => {\n\t\tif (localHeight.cm === \"\" && localHeight.ft !== \"\") {\n\t\t\tsetMeasurementUnit(\"ft\");\n\t\t}\n\t}, [localHeight]);\n\n\tconst renderHeightInput = useCallback(() => {\n\t\tif (measurementUnit === \"cm\") {\n\t\t\treturn (\n\t\t\t\t<div className={`w-full`}>\n\t\t\t\t\t<CustomInput\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tid=\"cm\"\n\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.height)}\n\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\tinputMode=\"numeric\"\n\t\t\t\t\t\tvalue={localHeight.cm}\n\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t} else {\n\t\t\treturn (\n\t\t\t\t<div className=\"flex gap-[.5rem]\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CustomInput\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tid=\"ft\"\n\t\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.heightInFt)}\n\t\t\t\t\t\t\tvalue={localHeight.ft}\n\t\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<CustomInput\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tid=\"inch\"\n\t\t\t\t\t\t\tclassName=\"!pr-[10px]\"\n\t\t\t\t\t\t\tplaceholder={translate?.(LanguageKeys.heightInInch)}\n\t\t\t\t\t\t\tvalue={localHeight.inch}\n\t\t\t\t\t\t\tonChange={handleSetHeight}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\t}, [localHeight, preferredLanguage]);\n\n\treturn (\n\t\t<div className=\"h-full w-full\">\n\t\t\t<div className=\"mt-[3.5rem] mb-[.75rem]\">\n\t\t\t\t<div className=\"w-full flex gap-[.5rem]\">\n\t\t\t\t\t{renderHeightInput()}\n\t\t\t\t\t<Select\n\t\t\t\t\t\tclassName=\"bg-btn outline-none h-[40px] [&_svg]:text-base !shadow-none !outline-none !text-base\"\n\t\t\t\t\t\tvalue={measurementUnit}\n\t\t\t\t\t\tonChange={handleMeasurementUnit}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tbackground: inputBg,\n\t\t\t\t\t\t\tcolor: inputText,\n\t\t\t\t\t\t\tfontSize: input?.inputFontSize || \"16px\",\n\t\t\t\t\t\t\tfontWeight: input?.inputFontWeight || \"400\",\n\t\t\t\t\t\t\tborder: `1px solid ${input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\t\tfontFamily: config?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t\t\tborderRadius: input?.inputBorderRadius || \"4px\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<MenuItem value=\"cm\">{translate?.(LanguageKeys.cmMeasurementUnit)}</MenuItem>\n\t\t\t\t\t\t<MenuItem value=\"ft\">{translate?.(LanguageKeys.ftMeasurementUnit)}</MenuItem>\n\t\t\t\t\t</Select>\n\t\t\t\t\t<style>\n\t\t\t\t\t\t{`\n .MuiOutlinedInput-notchedOutline {\n border: 1px solid ${input?.inputBorderColor || \"transparent\"} !important;\n outline: none;\n }\n .MuiSelect-select{\n outline: none;\n }\n .MuiSvgIcon-root{\n color: ${inputText} !important;\n }\n `}\n\t\t\t\t\t</style>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"mt-2\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tcolor: input?.inputErrorColor || \"#000\",\n\t\t\t\t\t\tfontSize: input?.inputErrorFontSize || \"16px\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{message}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<SpecificButton disabled={isButtonDisabled} buttonFunc={checkMeasurement} buttonText={translate?.(LanguageKeys.next)} postfixIcon={<ArrowRight size={14} />} />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default HeightStep;\n","import React, { useMemo } from \"react\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface ProgressDotsProps {\n totalSteps: number;\n currentStepIndex: number;\n}\n\nconst ProgressDots: React.FC<ProgressDotsProps> = ({ totalSteps, currentStepIndex }) => {\n const config = useConfig();\n const activeColor = config?.style?.base?.primaryColor || \"#000\";\n const inactiveColor = config?.style?.base?.secondaryColor || \"#D9D9D9\";\n\n const dots = useMemo(\n () =>\n Array.from({ length: totalSteps }, (_, i) => ({\n index: i,\n isActive: i === currentStepIndex,\n isCompleted: i < currentStepIndex\n })),\n [totalSteps, currentStepIndex]\n );\n\n return (\n <div className=\"flex justify-center items-center gap-[4px] my-[1.5rem]\">\n {dots.map(({ index, isActive, isCompleted }) => (\n <div\n key={index}\n className={`h-[3px] rounded-[9999px] transition-all duration-300 ${\n isActive ? \"w-[50px]\" : \"w-[30px]\"\n }`}\n style={{\n backgroundColor: isCompleted || isActive ? activeColor : inactiveColor\n }}\n />\n ))}\n </div>\n );\n};\n\nexport default ProgressDots;\n","import { useContext } from \"react\";\nimport EmailStep from \"./EmailStep\";\nimport NameStep from \"./NameStep\";\nimport GenderStep from \"./GenderStep\";\nimport HeightStep from \"./HeightStep\";\nimport { OnboardingStep } from \"../../utils/enums\";\nimport { Step } from \"../../types/interfaces\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport ProgressDots from \"../../atoms/progressDots/ProgressDots\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\nconst StepsWrapper = ({ currentStep, onStepDone, stepOrder, visibleSteps = [] }: { currentStep: Step; onStepDone: (val: any) => void; stepOrder: any; visibleSteps?: Step[] }) => {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst resolvedConfig = useConfig();\n\n\tconst renderStep = () => {\n\t\tif (!currentStep) return null;\n\n\t\tconst commonProps = {\n\t\t\tresolvedConfig,\n\t\t\tinitialValue: currentStep.value,\n\t\t\tonComplete: onStepDone,\n\t\t\tonStepComplete: currentStep?.onStepComplete,\n\t\t};\n\n\t\tswitch (currentStep.type) {\n\t\t\tcase OnboardingStep.Email:\n\t\t\t\treturn <EmailStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Name:\n\t\t\t\treturn <NameStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Gender:\n\t\t\t\treturn <GenderStep {...commonProps} />;\n\t\t\tcase OnboardingStep.Height:\n\t\t\t\treturn <HeightStep {...commonProps} />;\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{translate?.(LanguageKeys.noValidSteps)} {currentStep.type}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t}\n\t};\n\n\tif (!visibleSteps.length) return <div>{translate?.(LanguageKeys.unsupportedStep)}</div>;\n\n\t// stepOrder is the resolved visible-only list (from Onboarding.tsx),\n\t// so indexOf gives the correct 0-based position in the actual navigation flow.\n\tconst absoluteIndex = currentStep ? stepOrder.indexOf(currentStep.type) : 0;\n\n\treturn (\n\t\t<>\n\t\t\t<div id=\"swan-onboarding-bg\" style={{ background: resolvedConfig?.style?.base?.backgroundColor }} className=\"fixed common-ui-main w-full h-full z-[0] pointer-events-none top-0 left-0\"></div>\n\n\t\t\t<div className=\"px-[15px] common-ui-main relative pt-[15px] w-full flex items-center flex-col\">\n\t\t\t\t<div className=\"max-w-[28rem] mx-auto w-full\">\n\t\t\t\t\t{/* Logo */}\n\t\t\t\t\t{resolvedConfig?.logo && (\n\t\t\t\t\t\t<div className=\"text-center mb-[1rem] flex justify-center\">\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={resolvedConfig?.logo}\n\t\t\t\t\t\t\t\talt=\"logo\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\theight: resolvedConfig?.style?.logo?.logoHeight,\n\t\t\t\t\t\t\t\t\twidth: resolvedConfig?.style?.logo?.logoWidth,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"h-10 mx-auto\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Progress Dots */}\n\t\t\t\t\t<ProgressDots totalSteps={stepOrder.length} currentStepIndex={absoluteIndex} />\n\n\t\t\t\t\t{/* Heading */}\n\t\t\t\t\t<h1\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\t\t\tfontSize: resolvedConfig?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\t\t\tcolor: resolvedConfig?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"text-center pt-[1.5rem]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{translate?.(LanguageKeys.onboarding[currentStep?.type || \"heading\"])}\n\t\t\t\t\t</h1>\n\n\t\t\t\t\t{/* Step */}\n\t\t\t\t\t{renderStep()}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n\nexport default StepsWrapper;\n","import Alcatel from \"./Alcatel.json\"\nimport Apple from \"./Apple.json\"\nimport CAT from \"./CAT.json\"\nimport Fairphone from \"./Fairphone.json\"\nimport Fujitsu from \"./Fujitsu.json\"\nimport Google from \"./Google.json\"\nimport Huawei from \"./Huawei.json\"\nimport iTel from \"./iTel.json\"\nimport Lava from \"./Lava.json\"\nimport Lg from \"./Lg.json\"\nimport Motorola from \"./Motorola.json\"\nimport NokiaHmd from \"./NokiaHmd.json\"\nimport Nothing from \"./Nothing.json\"\nimport Olla from \"./Olla.json\"\nimport Oneplus from \"./Oneplus.json\"\nimport Oppo from \"./Oppo.json\"\nimport Realme from \"./Realme.json\"\nimport Samsung from \"./Samsung.json\"\nimport Sharp from \"./Sharp.json\"\nimport Sony from \"./Sony.json\"\nimport Tecno from \"./Tecno.json\"\nimport Vivo from \"./Vivo.json\"\nimport Vsmart from \"./Vsmart.json\"\nimport Wiko from \"./Wiko.json\"\nimport Xiaomi from \"./Xiaomi.json\"\n\n\n\n\nconst DevicesList=[\n Alcatel,Apple,CAT,Fairphone,Fujitsu,Google,Huawei,iTel,Lava,Lg,Motorola,NokiaHmd,Nothing,Olla,Oneplus,Oppo,Realme,Samsung,Sharp,Sony,\n Tecno,Vivo,Vsmart,Wiko,Xiaomi\n\n]\n \n\nexport default DevicesList\n","\"use client\";\nimport React, { useState, useMemo, useCallback } from \"react\";\nimport { OnboardingProps } from \"../../types/interfaces\";\nimport { resolveSteps } from \"../../utils/utils\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\nimport StepsWrapper from \"./StepsWrapper\";\nimport usePhoneDetection from \"../../customHooks/usePhoneDetection\";\n\nexport const Onboarding: React.FC<OnboardingProps> = ({ steps, config, onComplete, onDeviceDetected }) => {\n\tusePhoneDetection({ onDeviceDetected });\n\tconst visibleSteps = useMemo(() => resolveSteps(steps), [steps]);\n\tconst [values, setValues] = useState<Record<string, any>>({});\n\tconst [stepIndex, setStepIndex] = useState(0);\n\tconst currentStep = visibleSteps[stepIndex];\n\t// Hidden steps (isVisible:false) are placed first in stepOrder so they render\n\t// as pre-completed dots at the start of the progress bar. Visible steps follow\n\t// in their resolved (sorted) order. Because currentStep is always a visible step,\n\t// its indexOf position is always >= hiddenSteps.length, which means the first\n\t// N dots are permanently in \"completed\" state — no juggling, no backward jumps.\n\tconst hiddenSteps = steps.filter((s) => s.isVisible === false);\n\tconst stepOrder = [\n\t\t...hiddenSteps.map((s) => s.type),\n\t\t...visibleSteps.map((s) => s.type),\n\t];\n\n\t/** 4️⃣ Handle completion for a step */\n\tconst handleStepComplete = useCallback(\n\t\t(value: any) => {\n\t\t\tif (!currentStep) return;\n\t\t\tconst updated = { ...values, [currentStep.type]: value };\n\t\t\tsetValues(updated);\n\t\t\tif (stepIndex === visibleSteps.length - 1) {\n\t\t\t\tonComplete?.(updated);\n\t\t\t} else {\n\t\t\t\tsetStepIndex((prev) => prev + 1); // 👈 FIX\n\t\t\t}\n\t\t},\n\t\t[currentStep, values, stepIndex, visibleSteps.length, onComplete],\n\t);\n\n\tif (!visibleSteps.length) return <div>No steps configured for onboarding.</div>;\n\n\treturn (\n\t\t<LanguageContextProvider>\n\t\t\t<ConfigProvider config={config}>\n\t\t\t\t<StepsWrapper currentStep={currentStep} onStepDone={handleStepComplete} visibleSteps={visibleSteps} stepOrder={stepOrder} />\n\t\t\t</ConfigProvider>\n\t\t</LanguageContextProvider>\n\t);\n};\n","// Hook that auto-detects the user's phone model and focal length via WURFL.js (loaded dynamically).\n// Looks up the detected brand/model in DevicesList to find the camera focal length.\n// Falls back to manual selection if WURFL doesn't find a match in DevicesList.\n\nimport React, { useEffect } from \"react\";\nimport posthog from \"../utils/posthog\";\nimport DevicesList from \"../utils/deviceFocalLengthJson\";\n\ninterface DeviceInfo {\n brandName: string;\n modelName: string;\n focalLength: number;\n}\n\ninterface UsePhoneDetectionParams {\n onDeviceDetected?: (deviceInfo: { brandName: string; modelName: string; focalLength: number }) => void;\n}\n\nfunction usePhoneDetection({\n onDeviceDetected,\n}: UsePhoneDetectionParams): null {\n const handleWURFLDetectionComplete = () => {\n try {\n const wurfl = window?.WURFL;\n if (!wurfl) return;\n\n let phoneModel: { model_name: string; focal_length: number } | undefined;\n\n if (wurfl.brand_name === \"Apple\") {\n // WURFL returns generic \"iPhone\" for Apple — use a safe default focal length\n phoneModel = { model_name: \"iPhone\", focal_length: 23 };\n } else {\n for (const entry of DevicesList) {\n if (wurfl.brand_name in entry) {\n const models = (entry as Record<string, { model_name: string; focal_length: number }[]>)[wurfl.brand_name];\n phoneModel = models.find(\n (el) => el.model_name === wurfl.model_name || el.model_name === wurfl.marketing_name\n );\n if (phoneModel) break;\n }\n }\n }\n\n if (!phoneModel) return;\n const deviceInfo: DeviceInfo = {\n brandName: wurfl.brand_name,\n modelName: phoneModel.model_name,\n focalLength: phoneModel.focal_length,\n };\n\n onDeviceDetected?.({\n brandName: deviceInfo.brandName,\n modelName: deviceInfo.modelName,\n focalLength: deviceInfo.focalLength,\n });\n\n const payload: Record<string, any> = {\n type: \"auto\",\n data: JSON.stringify(deviceInfo),\n location:\"package\"\n };\n posthog.capture(`Phone Detection`, payload);\n } catch (error) {\n console.log(error, \"wurfl error\");\n }\n };\n\n useEffect(() => {\n try {\n document.addEventListener(\"WurflJSDetectionComplete\", handleWURFLDetectionComplete);\n const script = document.createElement(\"script\");\n script.src = \"//wjs.wurflcloud.com/wurfl.js\";\n script.async = true;\n document.head.appendChild(script);\n } catch (error) {\n console.log(\"error in getting device details\", error);\n }\n return () => {\n document.removeEventListener(\"WurflJSDetectionComplete\", handleWURFLDetectionComplete);\n };\n }, []);\n\n return null;\n}\n\nexport default usePhoneDetection;\n","import { useCallback, useContext, useState } from \"react\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport Header from \"../Header\";\nimport { MenuItem, Select } from \"@mui/material\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { ArrowRight } from \"lucide-react\";\nimport { useConfig } from \"../../utils/context/configContext\";\nimport { FocalLengthProps } from \"../../types/interfaces\";\nimport DevicesList from \"../../utils/deviceFocalLengthJson\";\nimport { handleErrorMessage } from \"../../utils/utils\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\n\ntype PhoneModel = {\n\tid: number;\n\tmodel_name: string;\n\tfocal_length: number;\n};\n\ntype DeviceManufacturer = Record<string, PhoneModel[]>;\ntype DevicesListType = DeviceManufacturer[];\n\nconst FocalLengthWrapper = ({ onComplete }: Omit<FocalLengthProps, \"config\">) => {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst resolvedConfig = useConfig();\n\tconst [deviceInfo, setDeviceInfo] = useState({\n\t\tbrandName: \"\",\n\t\tmodel: null as PhoneModel | null,\n\t});\n\tconst [message, setMessage] = useState<string | undefined>(undefined);\n\tconst [loading, setLoading] = useState(false);\n\n\t/* ------------ Brand Menu ------------ */\n\tconst manufacturerMenuItems = useCallback(() => {\n\t\treturn (DevicesList as DevicesListType).map((manufacturer) => {\n\t\t\tconst brandName = Object.keys(manufacturer)[0];\n\t\t\treturn (\n\t\t\t\t<MenuItem key={brandName} value={brandName}>\n\t\t\t\t\t{brandName}\n\t\t\t\t</MenuItem>\n\t\t\t);\n\t\t});\n\t}, []);\n\n\t/* ------------ Model Menu ------------ */\n\tconst phoneModelMenuItems = useCallback(() => {\n\t\tconst brandMatch = (DevicesList as DevicesListType).find((manufacturer) => {\n\t\t\tconst key = Object.keys(manufacturer)[0];\n\t\t\treturn key === deviceInfo.brandName;\n\t\t});\n\n\t\tif (!brandMatch) return null;\n\n\t\tconst key = Object.keys(brandMatch)[0];\n\t\tconst models = brandMatch[key];\n\n\t\treturn models.map((phone) => (\n\t\t\t<MenuItem key={phone.id} value={phone.id}>\n\t\t\t\t{phone.model_name}\n\t\t\t</MenuItem>\n\t\t));\n\t}, [deviceInfo.brandName]);\n\n\tconst handleSubmit = useCallback(async () => {\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tif (deviceInfo.brandName && deviceInfo.model) {\n\t\t\t\tawait onComplete?.({\n\t\t\t\t\tbrandName: deviceInfo.brandName,\n\t\t\t\t\tmodelName: deviceInfo.model.model_name,\n\t\t\t\t\tfocalLength: deviceInfo.model.focal_length,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tsetMessage(handleErrorMessage(error));\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [deviceInfo]);\n\n\t/* ------------ Brand Change ------------ */\n\tconst handleBrandChange = (event: any) => {\n\t\tsetDeviceInfo({\n\t\t\tbrandName: event.target.value,\n\t\t\tmodel: null,\n\t\t});\n\t};\n\n\t/* ------------ Model Change ------------ */\n\tconst handleModelChange = (event: any) => {\n\t\tconst selectedId = event.target.value;\n\n\t\tconst brandMatch = (DevicesList as DevicesListType).find((m) => {\n\t\t\treturn Object.keys(m)[0] === deviceInfo.brandName;\n\t\t});\n\n\t\tif (!brandMatch) return;\n\n\t\tconst key = Object.keys(brandMatch)[0];\n\t\tconst models = brandMatch[key];\n\n\t\tconst foundModel = models.find((phone) => phone.id === selectedId);\n\n\t\tsetDeviceInfo((prev) => ({\n\t\t\t...prev,\n\t\t\tmodel: foundModel ?? null,\n\t\t}));\n\t};\n\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"h-full common-ui-main flex-col max-w-md mx-auto pt-[1rem] p-[15px] w-full flex justify-start items-start text-center rounded-t-[20px]\"\n\t\t\tstyle={{ background: resolvedConfig?.style?.base?.backgroundColor }}\n\t\t>\n\t\t\t<div className=\"w-full max-w-[28rem] mx-auto\">\n\t\t\t\t<Header subtitle={translate?.(LanguageKeys.phoneModel)} />\n\t\t\t\t<div className=\"text-left mb-[.25rem] mt-[1rem]\">{translate?.(LanguageKeys.selectPhoneBrand)}</div>\n\n\t\t\t\t<Select\n\t\t\t\t\tonChange={handleBrandChange}\n\t\t\t\t\tclassName=\"w-full h-[40px] !shadow-none !outline-none text-left\"\n\t\t\t\t\tvalue={deviceInfo.brandName}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: resolvedConfig?.style?.input?.inputBackgroundColor || \"#F9FAFC\",\n\t\t\t\t\t\tcolor: resolvedConfig?.style?.input?.inputTextColor || \"#000\",\n\t\t\t\t\t\tfontSize: resolvedConfig?.style?.input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{manufacturerMenuItems()}\n\t\t\t\t</Select>\n\n\t\t\t\t<div className=\"text-left mb-[.25rem] mt-[1rem]\">{translate?.(LanguageKeys.selectPhoneModel)}</div>\n\n\t\t\t\t<Select\n\t\t\t\t\tonChange={handleModelChange}\n\t\t\t\t\tclassName=\"w-full bg-btn h-[40px] !shadow-none !outline-none text-left\"\n\t\t\t\t\tvalue={deviceInfo.model?.id || \"\"}\n\t\t\t\t\tdisabled={!deviceInfo.brandName}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tbackground: resolvedConfig?.style?.input?.inputBackgroundColor || \"#F9FAFC\",\n\t\t\t\t\t\tcolor: resolvedConfig?.style?.input?.inputTextColor || \"#000\",\n\t\t\t\t\t\tfontSize: resolvedConfig?.style?.input?.inputFontSize || \"16px\",\n\t\t\t\t\t\tfontWeight: resolvedConfig?.style?.input?.inputFontWeight || \"400\",\n\t\t\t\t\t\tborder: `1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"}`,\n\t\t\t\t\t\tfontFamily: resolvedConfig?.style?.base?.baseFontFamily || \"Inter, sans-serif\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{phoneModelMenuItems()}\n\t\t\t\t</Select>\n\t\t\t\t<style>\n\t\t\t\t\t{`\n .MuiOutlinedInput-notchedOutline {\n border: 1px solid ${resolvedConfig?.style?.input?.inputBorderColor || \"transparent\"} !important;\n outline: none;\n }\n .MuiSelect-select{\n outline: none;\n }\n \n `}\n\t\t\t\t</style>\n\t\t\t\t{message && <p className=\"mt-[0.2rem] text-[16px]\">{message}</p>}\n\t\t\t</div>\n\n\t\t\t<div className=\"mt-[.75rem] mb-[1.25rem] max-w-[28rem] mx-auto w-full flex justify-end\">\n\t\t\t\t<SpecificButton\n\t\t\t\t\tdisabled={!deviceInfo?.brandName || !deviceInfo?.model || loading}\n\t\t\t\t\tpostfixIcon={<ArrowRight />}\n\t\t\t\t\tbuttonFunc={handleSubmit}\n\t\t\t\t\tbuttonText={translate?.(LanguageKeys.next)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default FocalLengthWrapper;\n","import React from \"react\";\nimport FocalLengthWrapper from \"./FocalLengthWrapper\";\nimport { FocalLengthProps } from \"../../types/interfaces\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\n\nexport const FocalLength: React.FC<FocalLengthProps> = ({\n onComplete,\n config,\n}: FocalLengthProps) => {\n return (\n <LanguageContextProvider>\n <ConfigProvider config={config}>\n <FocalLengthWrapper\n onComplete={onComplete}\n />\n </ConfigProvider>\n </LanguageContextProvider>\n );\n};\n","import React from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\n\nexport default function MuseScreenRenderer({\n\tscreenIndex,\n\tscanLinePosition,\n\tfaceZoomed,\n\tshowFaceScanLine,\n\tfaceScanLinePosition,\n\tshowLargeS,\n\ttypewriterText,\n\tfullText,\n\tscreens,\n\tvideoToShow,\n\tfaceScanVideo,\n\tsizeVideo,\n\tformFittingVideo,\n}: any) {\n\tconst screen = screens[screenIndex];\n\n\t// Map screen id to props for each component\n\tconst componentProps: any = {\n\t\tbody: { scanLinePosition, videoToShow },\n\t\tface: {\n\t\t\tfaceZoomed,\n\t\t\tshowFaceScanLine,\n\t\t\tfaceScanLinePosition,\n\t\t\tfaceScanVideo,\n\t\t},\n\t\tsizeFit: { showLargeS, typewriterText, fullText, sizeVideo },\n\t};\n\n\tconst hasComponent = !!screen.component;\n\tconst Comp = hasComponent ? screen.component : null;\n\n\tlet content = null;\n\tif (hasComponent) {\n\t\tcontent = React.createElement(Comp.type || Comp, componentProps[screen.id] || {});\n\t} else if (screen.image) {\n\t\tcontent = (\n\t\t\t<video className=\"h-full w-full object-contain border-none\" muted loop autoPlay playsInline preload=\"auto\">\n\t\t\t\t<source src={formFittingVideo} type=\"video/mp4\" />\n\t\t\t</video>\n\t\t);\n\t}\n\n\treturn (\n\t\t<AnimatePresence mode=\"wait\">\n\t\t\t<motion.div key={screenIndex} initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} exit={{ opacity: 0, y: -20 }} transition={{ duration: 0.4 }} className=\"w-full h-full\">\n\t\t\t\t{content}\n\t\t\t</motion.div>\n\t\t</AnimatePresence>\n\t);\n}\n","import { ArrowRight } from \"lucide-react\";\nimport BodyScanAnimation from \"./BodyScanAnimation\";\nimport FaceScanAnimation from \"./FaceScanAnimation\";\nimport TypewriterScene from \"./TypewritterScene\";\nimport { useContext, useMemo, useState } from \"react\";\nimport MuseScreenRenderer from \"./MuseScreenRenderer\";\nimport Header from \"../../Header\";\nimport { GenderType, MuseScreenStep } from \"../../../utils/enums\";\nimport {\n\tbodyScanPerson,\n\tfaceScanPerson,\n\tfaceScanVideo,\n\tfemaleScanVideo,\n\tfittingGuide,\n\tformFittingGuide,\n\tfullText,\n\tleSableDress,\n\tmaleFaceScanVideo,\n\tmaleFormFittingGuide,\n\tmaleScanVideo,\n\tmaleSizeSuggestions,\n\tOUTFIT_IMAGES,\n\tsizeSuggestions,\n} from \"../../..//utils/constants\";\nimport { MuseStepsProps } from \"../../../types/interfaces\";\nimport useMuseAnimations from \"../../../customHooks/useMuseAnimation\";\nimport SpecificButton from \"../../../atoms/specificButton/SpecificButton\";\nimport { LanguageKeys } from \"../../../utils/languageKeys\";\nimport { LanguageContext } from \"../../../utils/context/languageContext\";\nimport { useConfig } from \"../../../utils/context/configContext\";\n\nconst screens: {\n\tid: string;\n\ttitle: string;\n\tdescription: string;\n\timage: string;\n\tcomponent?: React.ReactNode;\n}[] = [\n\t{\n\t\tid: MuseScreenStep.Body,\n\t\ttitle: LanguageKeys.bodyScan,\n\t\tdescription: LanguageKeys.bodyScanDescription,\n\t\timage: bodyScanPerson,\n\t\tcomponent: <BodyScanAnimation />,\n\t},\n\t{\n\t\tid: MuseScreenStep.Face,\n\t\ttitle: LanguageKeys.faceScan,\n\t\tdescription: LanguageKeys.faceScanDescription,\n\t\timage: faceScanPerson,\n\t\tcomponent: <FaceScanAnimation />,\n\t},\n\t{\n\t\tid: MuseScreenStep.SizeFit,\n\t\ttitle: LanguageKeys.sizeFit,\n\t\tdescription: \"\",\n\t\timage: leSableDress,\n\t\tcomponent: <TypewriterScene />,\n\t},\n\t{\n\t\tid: MuseScreenStep.Ready,\n\t\ttitle: LanguageKeys.readyToStart,\n\t\tdescription: LanguageKeys.readyToStartDescription,\n\t\timage: fittingGuide,\n\t},\n];\n\nexport default function MuseSteps({ applicableScreens, gender, onNext, isCustom }: Omit<MuseStepsProps, \"config\">) {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\tconst [currentScreen, setCurrentScreen] = useState(0);\n\tconst [scanLinePosition, setScanLinePosition] = useState(0);\n\tconst [faceZoomed, setFaceZoomed] = useState(false);\n\tconst [faceScanLinePosition, setFaceScanLinePosition] = useState(0);\n\tconst [showFaceScanLine, setShowFaceScanLine] = useState(false);\n\tconst [currentOutfit, setCurrentOutfit] = useState(0);\n\tconst [typewriterText, setTypewriterText] = useState(\"\");\n\tconst [showLargeS, setShowLargeS] = useState(false);\n\n\tconst screensToShow = useMemo(() => {\n\t\tif (isCustom) {\n\t\t\treturn screens.reduce((acc: any, el) => {\n\t\t\t\tif ([\"face\", \"sizeFit\"].includes(el.id)) {\n\t\t\t\t\treturn acc;\n\t\t\t\t}\n\t\t\t\tacc.push(el);\n\t\t\t\treturn acc;\n\t\t\t}, []);\n\t\t}\n\t\tif (!applicableScreens?.length) {\n\t\t\treturn screens;\n\t\t}\n\t\treturn screens.filter((screen) => applicableScreens.includes(screen.id));\n\t}, [applicableScreens]);\n\n\tuseMuseAnimations({\n\t\tscreenId: screensToShow[currentScreen].id,\n\t\tsetScanLinePosition,\n\t\tsetFaceZoomed,\n\t\tsetShowFaceScanLine,\n\t\tsetFaceScanLinePosition,\n\t\tsetCurrentOutfit,\n\t\tsetTypewriterText,\n\t\tsetShowLargeS,\n\t\toutfitImages: OUTFIT_IMAGES,\n\t\tfullText,\n\t});\n\n\tconst onNextClick = () => {\n\t\tif (currentScreen < screensToShow.length - 1) {\n\t\t\tsetCurrentScreen((prev) => prev + 1);\n\t\t} else {\n\t\t\tonNext?.();\n\t\t}\n\t};\n\treturn (\n\t\t<div className=\"relative common-ui-main h-full max-w-[28rem] mx-auto w-full flex justify-center\" style={{ background: config?.style?.base?.backgroundColor }}>\n\t\t\t<div className=\"absolute bottom-0 left-0 right-0 h-full shadow-lg w-full\">\n\t\t\t\t<div className=\"h-full flex flex-col p-[1rem] w-full\">\n\t\t\t\t\t<Header noTitle />\n\t\t\t\t\t<div className=\"text-center pb-[.5rem]\">\n\t\t\t\t\t\t<h1\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tfontFamily: config?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\t\t\t\tfontSize: config?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\t\t\t\tcolor: config?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\t\t\t\tfontWeight: config?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{translate?.(screensToShow[currentScreen].title)}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t{screensToShow[currentScreen].description && (\n\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\tclassName=\" mt-[.25rem] max-w-[280px] mx-auto min-h-[40px]\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tfontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n\t\t\t\t\t\t\t\t\tfontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n\t\t\t\t\t\t\t\t\tcolor: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n\t\t\t\t\t\t\t\t\tfontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{translate?.(screensToShow[currentScreen].description)}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex-1 flex justify-center items-center overflow-hidden py-[1rem] relative\">\n\t\t\t\t\t\t<MuseScreenRenderer\n\t\t\t\t\t\t\tscreenIndex={currentScreen}\n\t\t\t\t\t\t\tscanLinePosition={scanLinePosition}\n\t\t\t\t\t\t\tfaceZoomed={faceZoomed}\n\t\t\t\t\t\t\tshowFaceScanLine={showFaceScanLine}\n\t\t\t\t\t\t\tfaceScanLinePosition={faceScanLinePosition}\n\t\t\t\t\t\t\toutfitImages={OUTFIT_IMAGES}\n\t\t\t\t\t\t\tcurrentOutfit={currentOutfit}\n\t\t\t\t\t\t\tshowLargeS={showLargeS}\n\t\t\t\t\t\t\ttypewriterText={typewriterText}\n\t\t\t\t\t\t\tfullText={fullText}\n\t\t\t\t\t\t\tscreens={screensToShow}\n\t\t\t\t\t\t\tvideoToShow={gender === GenderType.Male ? maleScanVideo : femaleScanVideo}\n\t\t\t\t\t\t\tfaceScanVideo={gender === GenderType.Male ? maleFaceScanVideo : faceScanVideo}\n\t\t\t\t\t\t\tsizeVideo={gender === GenderType.Male ? maleSizeSuggestions : sizeSuggestions}\n\t\t\t\t\t\t\tformFittingVideo={gender === GenderType.Male ? maleFormFittingGuide : formFittingGuide}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"pt-[.5rem] flex justify-end\">\n\t\t\t\t\t\t<SpecificButton buttonText={translate?.(LanguageKeys.next)} type=\"submit\" postfixIcon={<ArrowRight size={14} />} buttonFunc={onNextClick} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","export default function BodyScanAnimation({\n videoToShow,\n}: {\n videoToShow?: string;\n}) {\n return (\n <div className=\"relative w-full h-full common-ui-main\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n autoPlay\n loop\n playsInline\n >\n <source src={videoToShow} type=\"video/mp4\" />\n </video>\n </div>\n );\n}\n","import { FaceScanAnimationProps } from \"../../../types/interfaces\";\n\nexport default function FaceScanAnimation({\n faceZoomed,\n showFaceScanLine,\n faceScanLinePosition,\n faceScanVideo,\n}: FaceScanAnimationProps) {\n return (\n <div className=\"relative h-full w-full common-ui-main\">\n <div className=\"w-full h-full relative\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n autoPlay\n playsInline\n >\n <source src={faceScanVideo} type=\"video/mp4\" />\n </video>\n {showFaceScanLine && faceZoomed && (\n <div\n className=\"absolute w-[1px] bg-[#8B5CF6] shadow-[0_0_8px_rgba(139,92,246,0.8)] z-20\"\n style={{\n left: `${faceScanLinePosition}%`,\n top: \"0%\",\n height: \"40%\",\n opacity:\n faceScanLinePosition && faceScanLinePosition >= 0 ? 1 : 0,\n }}\n />\n )}\n </div>\n </div>\n );\n}\n","export default function TypewriterScene({ sizeVideo }: { sizeVideo?: string }) {\n return (\n <div className=\"relative common-ui-main w-full h-full flex justify-center items-center\">\n <video\n className=\"h-full w-full object-contain border-none\"\n muted\n loop\n autoPlay\n playsInline\n >\n <source src={sizeVideo} type=\"video/mp4\" />\n </video>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\n\nfunction useMuseAnimations({\n screenId,\n setScanLinePosition,\n setFaceZoomed,\n setShowFaceScanLine,\n setFaceScanLinePosition,\n setCurrentOutfit,\n outfitImages,\n setTypewriterText,\n setShowLargeS,\n fullText,\n}: any) {\n const animationRefs = useRef<any>({\n scan: null,\n face: null,\n outfit: null,\n typewriter: null,\n });\n\n const cleanupAnimations = () => {\n Object.values(animationRefs.current).forEach((ref: any) => {\n if (typeof ref === \"number\") {\n cancelAnimationFrame(ref);\n } else if (ref) {\n clearTimeout(ref);\n clearInterval(ref);\n }\n });\n animationRefs.current = {\n scan: null,\n face: null,\n outfit: null,\n typewriter: null,\n };\n };\n\n useEffect(() => {\n cleanupAnimations();\n\n switch (screenId) {\n case \"body\": {\n const startTime = Date.now();\n const duration = 3000;\n\n const animateScanLine = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n setScanLinePosition(progress * 100);\n if (progress < 1) {\n animationRefs.current.scan = requestAnimationFrame(animateScanLine);\n }\n };\n\n animationRefs.current.scan = requestAnimationFrame(animateScanLine);\n break;\n }\n\n case \"face\": {\n setFaceZoomed(false);\n setShowFaceScanLine(false);\n setFaceScanLinePosition(0);\n\n animationRefs.current.face = setTimeout(() => {\n setFaceZoomed(true);\n\n setTimeout(() => {\n setShowFaceScanLine(true);\n\n const startTime = Date.now();\n const duration = 6000; // ✅ Total 6s (3s for each direction)\n\n const animateFaceScanLine = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n setFaceScanLinePosition(\n progress <= 0.5 ? progress * 2 * 100 : (2 - progress * 2) * 100\n );\n\n if (progress < 1) {\n animationRefs.current.face =\n requestAnimationFrame(animateFaceScanLine);\n }\n };\n\n animationRefs.current.face =\n requestAnimationFrame(animateFaceScanLine);\n }, 2500); // Delay after zoom\n }, 800); // Delay before zoom\n break;\n }\n\n case \"sizeFit\": {\n setCurrentOutfit(0);\n animationRefs.current.outfit = setInterval(() => {\n setCurrentOutfit((prev: any) => (prev + 1) % outfitImages.length);\n }, 1500);\n break;\n }\n\n case \"ready\": {\n setShowLargeS(false);\n setTypewriterText(\"\");\n\n animationRefs.current.typewriter = setTimeout(() => {\n setShowLargeS(true);\n setTimeout(() => {\n let currentIndex = 0;\n const typeNextChar = () => {\n if (currentIndex < fullText.length) {\n setTypewriterText(fullText.slice(0, currentIndex + 1));\n currentIndex++;\n animationRefs.current.typewriter = setTimeout(typeNextChar, 30);\n }\n };\n typeNextChar();\n }, 1000);\n }, 800);\n break;\n }\n\n default:\n break;\n }\n\n return cleanupAnimations;\n }, [screenId]);\n}\n\nexport default useMuseAnimations;\n","import { ArrowRight, Volume2 } from \"lucide-react\";\nimport { useState, useEffect, useContext } from \"react\";\nimport Header from \"../Header\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\ninterface VolumeStepProps {\n onNext: () => void;\n}\n\nexport default function VolumeScreen({ onNext }: VolumeStepProps) {\n const { translate } = useContext(LanguageContext) || {};\n const config = useConfig();\n const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });\n const [isAnimationPaused, setIsAnimationPaused] = useState(false);\n\n useEffect(() => {\n const handleMouseMove = (e: any) => {\n setMousePosition({ x: e.clientX, y: e.clientY });\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n return () => window.removeEventListener(\"mousemove\", handleMouseMove);\n }, []);\n\n const toggleAnimationPause = () => {\n setIsAnimationPaused((prev) => !prev);\n };\n\n function hexToRgba(hex: string, alpha: number = 1): string {\n hex = hex.replace(\"#\", \"\");\n if (hex.length === 3) {\n hex = hex.split(\"\").map((h) => h + h).join(\"\");\n }\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n\n const brandColor = config?.style?.base?.brandColor || \"#000\";\n const rgba1 = hexToRgba(brandColor, 0.19);\n const rgba2 = hexToRgba(brandColor, 0.23);\n const rgba3 = hexToRgba(brandColor, 0.24);\n\n const calculateHolographicEffect = () => {\n const windowWidth = typeof window !== \"undefined\" ? window.innerWidth : 1000;\n const windowHeight = typeof window !== \"undefined\" ? window.innerHeight : 1000;\n const normalizedX = (mousePosition.x / windowWidth) * 2 - 1;\n const normalizedY = (mousePosition.y / windowHeight) * 2 - 1;\n const rotateX = normalizedY * 5;\n const rotateY = normalizedX * -5;\n return {\n transform: `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`,\n background: \"#fff\",\n boxShadow: `0 0 20px ${rgba1}, 0 0 30px ${rgba2}`,\n };\n };\n\n const holographicStyle = calculateHolographicEffect();\n\n return (\n <div\n className=\"flex h-full max-w-[28rem] mx-auto w-full flex-col relative items-center justify-center overflow-hidden max-w-md mx-auto bg-primary text-base\"\n style={{ background: config?.style?.base?.backgroundColor }}\n >\n <div className=\"flex justify-start absolute z-[99] top-[1rem] max-w-md mx-auto w-full px-[1rem]\">\n <Header noTitle />\n </div>\n <div className=\"relative mb-[2rem]\">\n {[...Array(3)].map((_, i) => (\n <div\n key={i}\n className=\"absolute rounded-[9999px]\"\n style={{\n width: \"100px\",\n height: \"100px\",\n minHeight: \"100px\",\n minWidth: \"100px\",\n background: config?.style?.base?.backgroundColor || \"#fff\",\n boxShadow: `0 0 20px 2px ${rgba3}`,\n border: \"none\",\n filter: \"blur(1px)\",\n margin: \"0 auto\",\n left: \"50%\",\n top: \"50%\",\n animation: isAnimationPaused\n ? \"none\"\n : `gentleRipple 15s cubic-bezier(0.1, 0.5, 0.2, 1) ${i * 5}s infinite`,\n opacity: isAnimationPaused ? 1 : 0,\n transform: isAnimationPaused\n ? \"translate(-50%, -50%) scale(0.5)\"\n : \"translate(-50%, -50%)\",\n }}\n />\n ))}\n <div\n className=\"relative z-10 rounded-[9999px] p-[1.5rem] cursor-pointer transition-all backdrop-blur-sm\"\n style={{\n ...holographicStyle,\n transition: \"transform 0.1s ease-out, box-shadow 0.1s ease-out\",\n }}\n onClick={toggleAnimationPause}\n >\n <Volume2\n className=\"w-[3rem] h-[3rem] relative z-10\"\n style={{ filter: \"drop-shadow(0 0 5px rgba(255, 255, 255, 0.7))\" }}\n color={config?.style?.base?.primaryColor || \"#000\"}\n />\n </div>\n </div>\n\n <div className=\"relative z-10 text-center max-w-[20rem]\">\n <div\n className=\" mb-[.5rem]\"\n style={{\n fontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n fontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n color: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n fontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n }}\n >\n {translate?.(LanguageKeys.turnUpVolume)}\n </div>\n </div>\n\n <div className=\"absolute bottom-[1rem] right-0 max-w-[28rem] mx-auto w-full px-[1rem] max-w-md mx-auto\">\n <div className=\"flex justify-end\">\n <SpecificButton\n buttonFunc={() => onNext()}\n postfixIcon={<ArrowRight />}\n buttonText={translate?.(LanguageKeys.continue)}\n />\n </div>\n </div>\n <style>{`\n @keyframes gentleRipple {\n 0% {\n transform: translate(-50%, -50%) scale(0.5) translateZ(0);\n opacity: 0.7;\n }\n 50% {\n opacity: 0.4;\n }\n 100% {\n transform: translate(-50%, -50%) scale(25) translateZ(0);\n opacity: 0;\n }\n }\n`}</style>\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { ArrowRight } from \"lucide-react\";\nimport Header from \"../Header\";\nimport { maleSetupVideo, setupVideo } from \"../../utils/constants\";\nimport { LanguageContext } from \"../../utils/context/languageContext\";\nimport { LanguageKeys } from \"../../utils/languageKeys\";\nimport { GenderType } from \"../../utils/enums\";\nimport SpecificButton from \"../../atoms/specificButton/SpecificButton\";\nimport { useConfig } from \"../../utils/context/configContext\";\nimport { Gender } from \"../../types/interfaces\";\n\ninterface SetupScreenProps {\n gender: Gender;\n onNext?: () => void;\n}\n\nexport default function SetupScreen({ gender, onNext }: SetupScreenProps) {\n\tconst { translate } = useContext(LanguageContext) || {};\n\tconst config = useConfig();\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"flex h-full max-w-[28rem] mx-auto w-full p-[1rem] common-ui-main relative flex-col items-center overflow-hidden max-w-md mx-auto bg-primary text-base\"\n\t\t\tstyle={{ background: config?.style?.base?.backgroundColor }}\n\t\t>\n\t\t\t<div className=\"flex justify-start max-w-md mx-auto w-full \">\n\t\t\t\t<Header noTitle />\n\t\t\t</div>\n\t\t\t<h2\n\t\t\t\tclassName=\"mb-[1rem] text-[32px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: config?.style?.heading?.headingFontFamily || \"SeriouslyNostalgic Fn\",\n\t\t\t\t\tfontSize: config?.style?.heading?.headingFontSize || \"32px\",\n\t\t\t\t\tcolor: config?.style?.heading?.headingColor || \"#000\",\n\t\t\t\t\tfontWeight: config?.style?.heading?.headingFontWeight || \"normal\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{translate?.(LanguageKeys.phonePlacement)}\n\t\t\t</h2>\n\t\t\t<p\n\t\t\t\tclassName=\"text-center text-gray-600 text-sm mt-1 max-w-[280px] mx-auto min-h-[40px]\"\n\t\t\t\tstyle={{\n\t\t\t\t\tfontFamily: config?.style?.subheading?.subheadingFontFamily || \"'Inter', sans-serif\",\n\t\t\t\t\tfontSize: config?.style?.subheading?.subheadingFontSize || \"14px\",\n\t\t\t\t\tcolor: config?.style?.subheading?.subheadingColor || \"#4b5563\",\n\t\t\t\t\tfontWeight: config?.style?.subheading?.subheadingFontWeight || \"normal\",\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{translate?.(LanguageKeys.phonePlacementDescription)}\n\t\t\t</p>\n\t\t\t<div className=\"relative w-full h-full flex flex-col items-center max-w-md pt-[1rem]\">\n\t\t\t\t<div className=\"relative w-full h-auto\">\n\t\t\t\t\t<video className=\"h-full w-full object-contain border-none\" muted loop autoPlay playsInline>\n\t\t\t\t\t\t<source src={gender === GenderType.Male ? maleSetupVideo : setupVideo} type=\"video/mp4\" />\n\t\t\t\t\t</video>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"absolute bottom-[0] max-w-[28rem] mx-auto w-full left-0 right-0 flex justify-center max-w-md mx-auto\">\n\t\t\t\t\t<div className=\"flex justify-end w-full\">\n\t\t\t\t\t\t<SpecificButton buttonFunc={() => onNext?.()} buttonText={translate?.(LanguageKeys.continue)} postfixIcon={<ArrowRight />} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { useState } from \"react\";\nimport MuseSteps from \"./MuseSteps\";\nimport VolumeStep from \"./VolumeStep\";\nimport SetupScreen from \"./SetupScreen\";\nimport { EducationalProps } from \"../../types/interfaces\";\nimport { GenderType, MuseScreenStep, SectionType } from \"../../utils/enums\";\nimport { useConfig } from \"../../utils/context/configContext\";\n\nconst EducationalStepsWrapper = ({ sections, gender, onComplete, isCustom }: EducationalProps) => {\n\tconst [step, setStep] = useState(1);\n\n\tswitch (step) {\n\t\tcase 1:\n\t\t\treturn (\n\t\t\t\t<MuseSteps\n\t\t\t\t\tapplicableScreens={\n\t\t\t\t\t\tsections?.[0] === SectionType.Full || !sections || !sections?.length\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: sections[0] === SectionType.Body\n\t\t\t\t\t\t\t? [MuseScreenStep.Body, MuseScreenStep.SizeFit, MuseScreenStep.Ready]\n\t\t\t\t\t\t\t: [MuseScreenStep.Face, MuseScreenStep.SizeFit]\n\t\t\t\t\t}\n\t\t\t\t\tisCustom={isCustom}\n\t\t\t\t\tgender={gender || GenderType.Male}\n\t\t\t\t\tonNext={() => setStep(2)}\n\t\t\t\t/>\n\t\t\t);\n\n\t\tcase 2:\n\t\t\treturn <VolumeStep onNext={() => (sections?.[0] === SectionType.Face ? onComplete?.() : setStep(3))} />;\n\n\t\tcase 3:\n\t\t\treturn <SetupScreen gender={gender || GenderType.Male} onNext={onComplete} />;\n\n\t\tdefault:\n\t\t\treturn <></>;\n\t}\n};\n\nexport default EducationalStepsWrapper;\n","import { EducationalProps } from \"../../types/interfaces\";\nimport { GenderType } from \"../../utils/enums\";\nimport EducationalStepsWrapper from \"./EducationalStepsWrapper\";\nimport LanguageContextProvider from \"../../utils/context/languageContext\";\nimport { ConfigProvider } from \"../../utils/context/configContext\";\n\nexport const Educational: React.FC<EducationalProps> = ({\n sections = [],\n config,\n gender = GenderType.Male,\n onComplete,\n isCustom,\n}) => {\n return (\n <LanguageContextProvider>\n <ConfigProvider config={config}>\n <EducationalStepsWrapper\n sections={sections}\n gender={gender}\n onComplete={onComplete}\n isCustom={isCustom}\n />\n </ConfigProvider>\n </LanguageContextProvider>\n );\n};\n"],"names":["cn","classes","filter","Boolean","join","CustomInput","React","forwardRef","className","type","props","ref","config","useConfig","input","style","priority","_jsxs","_Fragment","children","_jsx","autoCapitalize","autoCorrect","background","inputBackgroundColor","color","inputTextColor","fontSize","inputFontSize","fontWeight","inputFontWeight","border","inputBorderColor","fontFamily","base","baseFontFamily","borderRadius","inputBorderRadius","inputPlaceholderColor","displayName","EmailStep","onComplete","initialValue","onStepComplete","value","setValue","useState","message","setMessage","undefined","loading","setLoading","translate","useContext","LanguageContext","onSubmit","async","e","preventDefault","trim","LanguageKeys","emailRequired","isValidEmail","validEmail","error","handleErrorMessage","required","id","placeholder","enterEmail","onChange","target","inputErrorColor","inputErrorFontSize","SpecificButton","disabled","buttonText","next","postfixIcon","ArrowRight","size","NameStep","nameRequired","enterName","GenderStep","genderType","setGenderType","bgColor","textColor","selectedBgColor","inputBackgroundColorSelect","selectedTextColor","inputBackgroundColorSelectTextColor","GenderType","Male","onClick","primaryColor","mens","Female","womens","buttonFunc","HeightStep","localHeight","setLocalHeight","cm","String","ft","inch","measurementUnit","setMeasurementUnit","preferredLanguage","inputBg","inputText","handleSetHeight","useCallback","event","prev","handleMeasurementUnit","val","validateHeight","height","convertToCentimeters","checkMeasurement","heightError","isButtonDisabled","useMemo","useEffect","renderHeightInput","inputMode","heightInFt","heightInInch","Select","MenuItem","cmMeasurementUnit","ftMeasurementUnit","ProgressDots","totalSteps","currentStepIndex","activeColor","inactiveColor","secondaryColor","dots","Array","from","length","_","i","index","isActive","isCompleted","map","backgroundColor","StepsWrapper","currentStep","onStepDone","stepOrder","visibleSteps","resolvedConfig","unsupportedStep","absoluteIndex","indexOf","logo","src","alt","logoHeight","width","logoWidth","heading","headingFontFamily","headingFontSize","headingColor","headingFontWeight","onboarding","commonProps","OnboardingStep","Email","Name","Gender","Height","noValidSteps","renderStep","DevicesList","Onboarding","steps","onDeviceDetected","handleWURFLDetectionComplete","wurfl","window","WURFL","phoneModel","brand_name","model_name","focal_length","entry","find","el","marketing_name","deviceInfo","brandName","modelName","focalLength","payload","data","JSON","stringify","location","posthog","capture","console","log","document","addEventListener","script","createElement","head","appendChild","removeEventListener","usePhoneDetection","resolveSteps","values","setValues","stepIndex","setStepIndex","s","isVisible","handleStepComplete","updated","LanguageContextProvider","ConfigProvider","FocalLengthWrapper","setDeviceInfo","model","manufacturerMenuItems","manufacturer","Object","keys","phoneModelMenuItems","brandMatch","phone","handleSubmit","Header","subtitle","selectPhoneBrand","selectPhoneModel","selectedId","m","foundModel","FocalLength","MuseScreenRenderer","screenIndex","scanLinePosition","faceZoomed","showFaceScanLine","faceScanLinePosition","showLargeS","typewriterText","fullText","screens","videoToShow","faceScanVideo","sizeVideo","formFittingVideo","screen","componentProps","body","face","sizeFit","hasComponent","component","Comp","content","image","muted","loop","autoPlay","playsInline","preload","AnimatePresence","mode","motion","div","initial","opacity","y","animate","exit","transition","duration","MuseScreenStep","Body","title","bodyScan","description","bodyScanDescription","bodyScanPerson","Face","faceScan","faceScanDescription","faceScanPerson","left","top","SizeFit","leSableDress","Ready","readyToStart","readyToStartDescription","fittingGuide","MuseSteps","applicableScreens","gender","onNext","isCustom","currentScreen","setCurrentScreen","setScanLinePosition","setFaceZoomed","setFaceScanLinePosition","setShowFaceScanLine","currentOutfit","setCurrentOutfit","setTypewriterText","setShowLargeS","screensToShow","reduce","acc","includes","push","screenId","outfitImages","animationRefs","useRef","scan","outfit","typewriter","cleanupAnimations","current","forEach","cancelAnimationFrame","clearTimeout","clearInterval","startTime","Date","now","animateScanLine","elapsed","progress","Math","min","requestAnimationFrame","setTimeout","animateFaceScanLine","setInterval","currentIndex","typeNextChar","slice","useMuseAnimations","OUTFIT_IMAGES","noTitle","subheading","subheadingFontFamily","subheadingFontSize","subheadingColor","subheadingFontWeight","maleScanVideo","femaleScanVideo","maleFaceScanVideo","maleSizeSuggestions","sizeSuggestions","maleFormFittingGuide","formFittingGuide","VolumeScreen","mousePosition","setMousePosition","x","isAnimationPaused","setIsAnimationPaused","handleMouseMove","clientX","clientY","hexToRgba","hex","alpha","replace","split","h","parseInt","substring","brandColor","rgba1","rgba2","rgba3","holographicStyle","windowWidth","innerWidth","windowHeight","innerHeight","normalizedX","transform","boxShadow","calculateHolographicEffect","minHeight","minWidth","margin","animation","Volume2","turnUpVolume","continue","SetupScreen","phonePlacement","phonePlacementDescription","maleSetupVideo","setupVideo","EducationalStepsWrapper","sections","step","setStep","SectionType","Full","VolumeStep","Educational"],"mappings":"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"}
|