{"version":3,"file":"Loading.CkZcAwf1.mjs","names":["useMemo","useMemo","useMemo","useState","useCallback","useMemo","React","useState","useRef","useCallback","useState","useCallback","useRef","React.useCallback"],"sources":["https:/framerusercontent.com/modules/VTUDdizacRHpwbkOamr7/AykinQJbgwl92LvMGZwu/constants.js","https:/framerusercontent.com/modules/D4TWeLfcxT6Tysr2BlYg/iZjmqdxVx1EOiM3k1FaW/useOnNavigationTargetChange.js","https:/framerusercontent.com/modules/ExNgrA7EJTKUPpH6vIlN/eiOrSJ2Ab5M9jPCvVwUz/useConstant.js","https:/framerusercontent.com/modules/D2Lz5CmnNVPZFFiZXalt/QaCzPbriZBfXWZIIycFI/colorFromToken.js","https:/framerusercontent.com/modules/3mKFSGQqKHV82uOV1eBc/5fbRLvOpxZC0JOXugvwm/isMotionValue.js","https:/framerusercontent.com/modules/xDiQsqBGXzmMsv7AlEVy/uhunpMiNsbXxzjlXsg1y/useUniqueClassName.js","https:/framerusercontent.com/modules/ETACN5BJyFTSo0VVDJfu/NHRqowOiXkF9UwOzczF7/variantUtils.js","https:/framerusercontent.com/modules/eMBrwoqQK7h6mEeGQUH8/GuplvPJVjmxpk9zqOTcb/isBrowser.js","https:/framerusercontent.com/modules/v9AWX2URmiYsHf7GbctE/XxKAZ9KlhWqf5x1JMyyF/useOnChange.js","https:/framerusercontent.com/modules/kNDwabfjDEb3vUxkQlZS/fSIr3AOAYbGlfSPgXpYu/useAutoMotionValue.js","https:/framerusercontent.com/modules/cuQH4dmpDnV8YK1mSgQX/KqRXqunFjE6ufhpc7ZRu/useFontControls.js","https:/framerusercontent.com/modules/afBE9Yx1W6bY5q32qPxe/m3q7puE2tbo1S2C0s0CT/useRenderTarget.js","https:/framerusercontent.com/modules/zGkoP8tPDCkoBzMdt5uq/0zFSjxIYliHxrQQnryFX/useControlledState.js","https:/framerusercontent.com/modules/5SM58HxZHxjjv7aLMOgQ/WXz9i6mVki0bBCrKdqB3/propUtils.js","https:/framerusercontent.com/modules/G4IfyjvwmaeSBpdb4TWu/OIjZRBmWDcIE2B6qgG1j/index.js","https:/framerusercontent.com/modules/N07JJZfuMtyHijtiRRgH/E4KLlxWtRCBXncxm1cnX/FC_ProductPrice.js","https:/framerusercontent.com/modules/Da0ApllLKQHSw8djEYKs/NKlmeTJYy3YIy3O2qsS9/cloning.js","https:/framerusercontent.com/modules/FXrY3V9ZYVL8aziafDQn/HIuMDRrKIIcsJe65kZwo/initialize.js","https:/framerusercontent.com/modules/DfixsupJND2Hhr1xcPbk/zYiTTDRsHtf2S3Zf8E7G/FC_ProductPurchaseButton.js","https:/framerusercontent.com/modules/B12xzzGu5tV27jDrWyaW/dyGmYzzIUDiXU0ubHYzE/FC_ProductVariantState.js","https:/framer.com/m/framer/default-utils.js@^0.45.0","https:/framerusercontent.com/modules/NQ9LlTfXzHTRhTTi6qMI/5u9VoSaQM7qxLI2scUcH/Loading.js"],"sourcesContent":["import { ControlType } from \"framer\";\nexport const fontStack = `\"Inter\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"`;\nexport const containerStyles = {\n    position: \"relative\",\n    width: \"100%\",\n    height: \"100%\",\n    display: \"flex\",\n    justifyContent: \"center\",\n    alignItems: \"center\"\n};\nexport const emptyStateStyle = {\n    ...containerStyles,\n    borderRadius: 6,\n    background: \"rgba(136, 85, 255, 0.3)\",\n    color: \"#85F\",\n    border: \"1px dashed #85F\",\n    flexDirection: \"column\"\n};\nexport const defaultEvents = {\n    onClick: {\n        type: ControlType.EventHandler\n    },\n    onMouseEnter: {\n        type: ControlType.EventHandler\n    },\n    onMouseLeave: {\n        type: ControlType.EventHandler\n    }\n};\nexport const fontSizeOptions = {\n    type: ControlType.Number,\n    title: \"Font Size\",\n    min: 2,\n    max: 200,\n    step: 1,\n    displayStepper: true\n};\nexport const fontControls = {\n    font: {\n        type: ControlType.Boolean,\n        title: \"Font\",\n        defaultValue: false,\n        disabledTitle: \"Default\",\n        enabledTitle: \"Custom\"\n    },\n    fontFamily: {\n        type: ControlType.String,\n        title: \"Family\",\n        placeholder: \"Inter\",\n        hidden: ({ font  })=>!font\n    },\n    fontWeight: {\n        type: ControlType.Enum,\n        title: \"Weight\",\n        options: [\n            100,\n            200,\n            300,\n            400,\n            500,\n            600,\n            700,\n            800,\n            900\n        ],\n        optionTitles: [\n            \"Thin\",\n            \"Extra-light\",\n            \"Light\",\n            \"Regular\",\n            \"Medium\",\n            \"Semi-bold\",\n            \"Bold\",\n            \"Extra-bold\",\n            \"Black\", \n        ],\n        hidden: ({ font  })=>!font\n    }\n};\n// @TODO check if we're missing anything here — there doesn't seem to be a reliable browser API for this\nexport const localeOptions = {\n    af: \"Afrikaans\",\n    sq: \"Albanian\",\n    an: \"Aragonese\",\n    ar: \"Arabic (Standard)\",\n    \"ar-dz\": \"Arabic (Algeria)\",\n    \"ar-bh\": \"Arabic (Bahrain)\",\n    \"ar-eg\": \"Arabic (Egypt)\",\n    \"ar-iq\": \"Arabic (Iraq)\",\n    \"ar-jo\": \"Arabic (Jordan)\",\n    \"ar-kw\": \"Arabic (Kuwait)\",\n    \"ar-lb\": \"Arabic (Lebanon)\",\n    \"ar-ly\": \"Arabic (Libya)\",\n    \"ar-ma\": \"Arabic (Morocco)\",\n    \"ar-om\": \"Arabic (Oman)\",\n    \"ar-qa\": \"Arabic (Qatar)\",\n    \"ar-sa\": \"Arabic (Saudi Arabia)\",\n    \"ar-sy\": \"Arabic (Syria)\",\n    \"ar-tn\": \"Arabic (Tunisia)\",\n    \"ar-ae\": \"Arabic (U.A.E.)\",\n    \"ar-ye\": \"Arabic (Yemen)\",\n    hy: \"Armenian\",\n    as: \"Assamese\",\n    ast: \"Asturian\",\n    az: \"Azerbaijani\",\n    eu: \"Basque\",\n    bg: \"Bulgarian\",\n    be: \"Belarusian\",\n    bn: \"Bengali\",\n    bs: \"Bosnian\",\n    br: \"Breton\",\n    my: \"Burmese\",\n    ca: \"Catalan\",\n    ch: \"Chamorro\",\n    ce: \"Chechen\",\n    zh: \"Chinese\",\n    \"zh-hk\": \"Chinese (Hong Kong)\",\n    \"zh-cn\": \"Chinese (PRC)\",\n    \"zh-sg\": \"Chinese (Singapore)\",\n    \"zh-tw\": \"Chinese (Taiwan)\",\n    cv: \"Chuvash\",\n    co: \"Corsican\",\n    cr: \"Cree\",\n    hr: \"Croatian\",\n    cs: \"Czech\",\n    da: \"Danish\",\n    nl: \"Dutch (Standard)\",\n    \"nl-be\": \"Dutch (Belgian)\",\n    en: \"English\",\n    \"en-au\": \"English (Australia)\",\n    \"en-bz\": \"English (Belize)\",\n    \"en-ca\": \"English (Canada)\",\n    \"en-ie\": \"English (Ireland)\",\n    \"en-jm\": \"English (Jamaica)\",\n    \"en-nz\": \"English (New Zealand)\",\n    \"en-ph\": \"English (Philippines)\",\n    \"en-za\": \"English (South Africa)\",\n    \"en-tt\": \"English (Trinidad & Tobago)\",\n    \"en-gb\": \"English (United Kingdom)\",\n    \"en-us\": \"English (United States)\",\n    \"en-zw\": \"English (Zimbabwe)\",\n    eo: \"Esperanto\",\n    et: \"Estonian\",\n    fo: \"Faeroese\",\n    fa: \"Farsi\",\n    fj: \"Fijian\",\n    fi: \"Finnish\",\n    fr: \"French (Standard)\",\n    \"fr-be\": \"French (Belgium)\",\n    \"fr-ca\": \"French (Canada)\",\n    \"fr-fr\": \"French (France)\",\n    \"fr-lu\": \"French (Luxembourg)\",\n    \"fr-mc\": \"French (Monaco)\",\n    \"fr-ch\": \"French (Switzerland)\",\n    fy: \"Frisian\",\n    fur: \"Friulian\",\n    gd: \"Gaelic (Scots)\",\n    \"gd-ie\": \"Gaelic (Irish)\",\n    gl: \"Galacian\",\n    ka: \"Georgian\",\n    de: \"German (Standard)\",\n    \"de-at\": \"German (Austria)\",\n    \"de-de\": \"German (Germany)\",\n    \"de-li\": \"German (Liechtenstein)\",\n    \"de-lu\": \"German (Luxembourg)\",\n    \"de-ch\": \"German (Switzerland)\",\n    el: \"Greek\",\n    gu: \"Gujurati\",\n    ht: \"Haitian\",\n    he: \"Hebrew\",\n    hi: \"Hindi\",\n    hu: \"Hungarian\",\n    is: \"Icelandic\",\n    id: \"Indonesian\",\n    iu: \"Inuktitut\",\n    ga: \"Irish\",\n    it: \"Italian (Standard)\",\n    \"it-ch\": \"Italian (Switzerland)\",\n    ja: \"Japanese\",\n    kn: \"Kannada\",\n    ks: \"Kashmiri\",\n    kk: \"Kazakh\",\n    km: \"Khmer\",\n    ky: \"Kirghiz\",\n    tlh: \"Klingon\",\n    ko: \"Korean\",\n    \"ko-kp\": \"Korean (North Korea)\",\n    \"ko-kr\": \"Korean (South Korea)\",\n    la: \"Latin\",\n    lv: \"Latvian\",\n    lt: \"Lithuanian\",\n    lb: \"Luxembourgish\",\n    mk: \"FYRO Macedonian\",\n    ms: \"Malay\",\n    ml: \"Malayalam\",\n    mt: \"Maltese\",\n    mi: \"Maori\",\n    mr: \"Marathi\",\n    mo: \"Moldavian\",\n    nv: \"Navajo\",\n    ng: \"Ndonga\",\n    ne: \"Nepali\",\n    no: \"Norwegian\",\n    nb: \"Norwegian (Bokmal)\",\n    nn: \"Norwegian (Nynorsk)\",\n    oc: \"Occitan\",\n    or: \"Oriya\",\n    om: \"Oromo\",\n    \"fa-ir\": \"Persian/Iran\",\n    pl: \"Polish\",\n    pt: \"Portuguese\",\n    \"pt-br\": \"Portuguese (Brazil)\",\n    pa: \"Punjabi\",\n    \"pa-in\": \"Punjabi (India)\",\n    \"pa-pk\": \"Punjabi (Pakistan)\",\n    qu: \"Quechua\",\n    rm: \"Rhaeto-Romanic\",\n    ro: \"Romanian\",\n    \"ro-mo\": \"Romanian (Moldavia)\",\n    ru: \"Russian\",\n    \"ru-mo\": \"Russian (Moldavia)\",\n    sz: \"Sami (Lappish)\",\n    sg: \"Sango\",\n    sa: \"Sanskrit\",\n    sc: \"Sardinian\",\n    sd: \"Sindhi\",\n    si: \"Singhalese\",\n    sr: \"Serbian\",\n    sk: \"Slovak\",\n    sl: \"Slovenian\",\n    so: \"Somani\",\n    sb: \"Sorbian\",\n    es: \"Spanish\",\n    \"es-ar\": \"Spanish (Argentina)\",\n    \"es-bo\": \"Spanish (Bolivia)\",\n    \"es-cl\": \"Spanish (Chile)\",\n    \"es-co\": \"Spanish (Colombia)\",\n    \"es-cr\": \"Spanish (Costa Rica)\",\n    \"es-do\": \"Spanish (Dominican Republic)\",\n    \"es-ec\": \"Spanish (Ecuador)\",\n    \"es-sv\": \"Spanish (El Salvador)\",\n    \"es-gt\": \"Spanish (Guatemala)\",\n    \"es-hn\": \"Spanish (Honduras)\",\n    \"es-mx\": \"Spanish (Mexico)\",\n    \"es-ni\": \"Spanish (Nicaragua)\",\n    \"es-pa\": \"Spanish (Panama)\",\n    \"es-py\": \"Spanish (Paraguay)\",\n    \"es-pe\": \"Spanish (Peru)\",\n    \"es-pr\": \"Spanish (Puerto Rico)\",\n    \"es-es\": \"Spanish (Spain)\",\n    \"es-uy\": \"Spanish (Uruguay)\",\n    \"es-ve\": \"Spanish (Venezuela)\",\n    sx: \"Sutu\",\n    sw: \"Swahili\",\n    sv: \"Swedish\",\n    \"sv-fi\": \"Swedish (Finland)\",\n    \"sv-sv\": \"Swedish (Sweden)\",\n    ta: \"Tamil\",\n    tt: \"Tatar\",\n    te: \"Teluga\",\n    th: \"Thai\",\n    tig: \"Tigre\",\n    ts: \"Tsonga\",\n    tn: \"Tswana\",\n    tr: \"Turkish\",\n    tk: \"Turkmen\",\n    uk: \"Ukrainian\",\n    hsb: \"Upper Sorbian\",\n    ur: \"Urdu\",\n    ve: \"Venda\",\n    vi: \"Vietnamese\",\n    vo: \"Volapuk\",\n    wa: \"Walloon\",\n    cy: \"Welsh\",\n    xh: \"Xhosa\",\n    ji: \"Yiddish\",\n    zu: \"Zulu\"\n};\n\nexport const __FramerMetadata__ = {\"exports\":{\"fontSizeOptions\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fontControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"localeOptions\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fontStack\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"emptyStateStyle\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultEvents\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./constants.map","import { useIsInCurrentNavigationTarget } from \"framer\";\nimport { useEffect } from \"react\";\nexport function useOnEnter(onEnter, enabled) {\n    return useOnSpecificTargetChange(true, onEnter, enabled);\n}\nexport function useOnExit(onExit, enabled) {\n    return useOnSpecificTargetChange(false, onExit, enabled);\n}\nfunction useOnSpecificTargetChange(goal, callback, enabled = true) {\n    const isInTarget = useIsInCurrentNavigationTarget();\n    useEffect(()=>{\n        if (enabled && isInTarget === goal) callback();\n    }, [\n        isInTarget\n    ]);\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useOnEnter\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOnExit\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useOnNavigationTargetChange.map","import { useRef } from \"react\";\n/**\n * Creates a constant value over the lifecycle of a component.\n *\n * Even if `useMemo` is provided an empty array as its final argument, it doesn't offer\n * a guarantee that it won't re-run for performance reasons later on. By using `useConstant`\n * you can ensure that initialisers don't execute twice or more.\n */ export function useConstant(init) {\n    const ref = useRef(null);\n    if (ref.current === null) {\n        ref.current = init();\n    }\n    return ref.current;\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useConstant\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useConstant.map","import { Color } from \"framer\";\nexport function colorFromToken(color) {\n    if (color.startsWith(\"var(--token-\")) return \"rgb\" + color.split(\") /*\")[0].split(\", rgb\")[1];\n    return color;\n}\nexport function colorTokentoValue(color) {\n    return Color(colorFromToken(color)).toValue();\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"colorFromToken\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"colorTokentoValue\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./colorFromToken.map","import { MotionValue } from \"framer\";\nexport const isMotionValue = (v)=>v instanceof MotionValue\n;\n\nexport const __FramerMetadata__ = {\"exports\":{\"isMotionValue\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./isMotionValue.map","import * as React from \"react\";\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nconst l = ()=>letters[Math.floor(Math.random() * letters.length)]\n;\nexport const randomID = ()=>l() + l() + l() + l() + l() + l() + l() + l() + l()\n;\nfunction createUniqueClass(suffix) {\n    return `framer-${suffix}-${randomID()}`;\n}\nexport function useUniqueClassName(suffix, deps) {\n    const [className, setClassName] = React.useState(createUniqueClass(suffix));\n    React.useEffect(()=>{\n        setClassName(createUniqueClass(suffix));\n    }, [\n        suffix,\n        ...deps\n    ]);\n    return className;\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useUniqueClassName\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"randomID\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useUniqueClassName.map","import { ControlType } from \"framer\";\n// I realize this only applies to select right now\n// but we can work on it in here\nexport function getVariantControls(Component, variant, additionalControls = {\n}) {\n    return {\n        [`${variant}TextColor`]: {\n            type: ControlType.Color,\n            title: \"Text Color\",\n            defaultValue: Component.defaultProps[`${variant}TextColor`],\n            hidden: (props)=>props.variant !== variant\n        },\n        [`${variant}IconColor`]: {\n            type: ControlType.Color,\n            title: \"Icon Color\",\n            defaultValue: Component.defaultProps[`${variant}IconColor`],\n            hidden: (props)=>props.variant !== variant\n        },\n        [`${variant}BackgroundColor`]: {\n            type: ControlType.Color,\n            title: \"Bg Color\",\n            defaultValue: Component.defaultProps[`${variant}BackgroundColor`],\n            hidden: (props)=>props.variant !== variant\n        },\n        [`${variant}BorderColor`]: {\n            type: ControlType.Color,\n            title: \"Border Color\",\n            defaultValue: Component.defaultProps[`${variant}BorderColor`],\n            hidden: (props)=>props.variant !== variant\n        },\n        [`${variant}BorderWidth`]: {\n            type: ControlType.Number,\n            title: \" \",\n            min: 0,\n            max: 5,\n            displayStepper: true,\n            defaultValue: Component.defaultProps[`${variant}BorderWidth`],\n            hidden: (props)=>props.variant !== variant\n        },\n        ...additionalControls\n    };\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"getVariantControls\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./variantUtils.map","import { useMemo } from \"react\";\nexport const isBrowserSafari = ()=>{\n    if (typeof navigator !== `undefined`) {\n        const userAgent = navigator.userAgent.toLowerCase();\n        const isSafari = (userAgent.indexOf(\"safari\") > -1 || userAgent.indexOf(\"framermobile\") > -1 || userAgent.indexOf(\"framerx\") > -1) && userAgent.indexOf(\"chrome\") < 0;\n        return isSafari;\n    } else return false;\n};\nexport const useIsBrowserSafari = ()=>useMemo(()=>isBrowserSafari()\n    , [])\n;\n\nexport const __FramerMetadata__ = {\"exports\":{\"useIsBrowserSafari\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isBrowserSafari\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./isBrowser.map","import { useEffect } from \"react\";\n//@ts-ignore\nimport { isMotionValue } from \"https://framerusercontent.com/modules/3mKFSGQqKHV82uOV1eBc/5fbRLvOpxZC0JOXugvwm/isMotionValue.js\";\nexport function useOnChange(value, callback) {\n    useEffect(()=>// @ts-ignore this should be detected as a MV :shrug:\n        isMotionValue(value) ? value.onChange(callback) : undefined\n    );\n}\nexport function useMultiOnChange(values, handler) {\n    useEffect(()=>{\n        const subscriptions = values.map((value)=>value.onChange(handler)\n        );\n        return ()=>subscriptions.forEach((unsubscribe)=>unsubscribe()\n            )\n        ;\n    });\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"Subscriber\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOnChange\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMultiOnChange\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useOnChange.map","import { useCallback, useEffect, useRef } from \"react\";\nimport { motionValue, animate, RenderTarget } from \"framer\";\n// @ts-ignore\nimport { isMotionValue } from \"https://framerusercontent.com/modules/3mKFSGQqKHV82uOV1eBc/5fbRLvOpxZC0JOXugvwm/isMotionValue.js\";\n// @ts-ignore\nimport { useConstant } from \"https://framerusercontent.com/modules/ExNgrA7EJTKUPpH6vIlN/eiOrSJ2Ab5M9jPCvVwUz/useConstant.js\";\nexport function useAutoMotionValue(inputValue, options) {\n    var ref;\n    // Put options on a local ref\n    // Might wanna just memo instead but it works for now\n    const optionsRef = useRef(options);\n    const animation = useRef();\n    const didInitialMount = useRef(false);\n    const isOnCanvas = RenderTarget.current() === RenderTarget.canvas;\n    // in-progress - trying to figure out effect hooks\n    const onChangeDeps = (options === null || options === void 0 ? void 0 : options.onChangeDeps) ? options.onChangeDeps : [];\n    // Memoize the onChange handler\n    const onChange = useCallback(options === null || options === void 0 ? void 0 : options.onChange, [\n        ...onChangeDeps, \n    ]);\n    // Optionally scale the value from props\n    const transformer = useCallback((value)=>((ref = optionsRef.current) === null || ref === void 0 ? void 0 : ref.transform) ? optionsRef.current.transform(value) : value\n    , []);\n    // Create new MotionValue from inputValue\n    const value = useConstant(()=>isMotionValue(inputValue) ? inputValue : motionValue(transformer(inputValue))\n    );\n    // Setting value from prop change\n    useEffect(()=>{\n        if (!isMotionValue(inputValue) && didInitialMount.current) {\n            var ref1, ref2;\n            const newValue = transformer(inputValue);\n            (ref1 = animation.current) === null || ref1 === void 0 ? void 0 : ref1.stop();\n            // Call change callback\n            if (onChange) onChange(newValue, value);\n            // Trigger animation to new value\n            if (((ref2 = optionsRef.current) === null || ref2 === void 0 ? void 0 : ref2.animate) && !isOnCanvas) {\n                var ref3;\n                // @ts-ignore\n                animation.current = animate(value, newValue, (ref3 = optionsRef.current) === null || ref3 === void 0 ? void 0 : ref3.transition);\n            } else {\n                value.set(newValue);\n            }\n        }\n        didInitialMount.current = true;\n    }, [\n        inputValue,\n        ...onChangeDeps\n    ]);\n    return value;\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useAutoMotionValue\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}","// @ts-ignore\nimport{fontStore}from\"framer\";import{useEffect}from\"react\";import{fontStack}from\"https://framerusercontent.com/modules/VTUDdizacRHpwbkOamr7/AykinQJbgwl92LvMGZwu/constants.js\";const fontWeights={100:\"Thin\",200:\"Extra-light\",300:\"Light\",400:\"Regular\",500:\"Medium\",600:\"Semi-bold\",700:\"Bold\",800:\"Extra-bold\",900:\"Black\"};export function useFontControls(props){const{fontFamily=\"Inter\",fontSize=16,fontWeight=400,font=false}=props;const fontWeightName=fontWeights[fontWeight];const customFontStack=`\"${fontFamily} ${fontWeightName}\", \"${fontFamily}\", ${fontStack}`;const fontFamilyStyle=fontFamily?{fontSize,fontWeight,fontFamily:customFontStack}:{fontSize,fontWeight};const fetchCustomFonts=async()=>{await fontStore.loadWebFontsFromSelectors([`CUSTOM;${fontFamily}`,`CUSTOM;${fontFamily} ${fontWeightName}`,`GF;${fontFamily}-${fontWeightName.toLowerCase()}`,]).catch(e=>console.error(e));};useEffect(()=>{if(font)fetchCustomFonts();},[font,fontFamily,fontWeight]);return fontFamilyStyle;}\nexport const __FramerMetadata__ = {\"exports\":{\"useFontControls\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useFontControls.map","import { useMemo } from \"react\";\nimport { RenderTarget } from \"framer\";\nexport function useRenderTarget() {\n    const currentRenderTarget = useMemo(()=>RenderTarget.current()\n    , []);\n    return currentRenderTarget;\n}\nexport function useIsInPreview() {\n    const inPreview = useMemo(()=>RenderTarget.current() === RenderTarget.preview\n    , []);\n    return inPreview;\n}\nexport function useIsOnCanvas() {\n    const onCanvas = useMemo(()=>RenderTarget.current() === RenderTarget.canvas\n    , []);\n    return onCanvas;\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useIsInPreview\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useRenderTarget\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIsOnCanvas\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useRenderTarget.map","import * as React from \"react\";\nexport function useControlledState(value) {\n    const [controlledValue, setValue] = React.useState(value);\n    React.useEffect(()=>{\n        setValue(value);\n    }, [\n        value\n    ]);\n    return [\n        controlledValue,\n        setValue\n    ];\n}\n\nexport const __FramerMetadata__ = {\"exports\":{\"useControlledState\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./useControlledState.map","import { useMemo } from \"react\";\nimport { ControlType } from \"framer\";\nexport function useRadius(props) {\n    const { borderRadius , isMixedBorderRadius , topLeftRadius , topRightRadius , bottomRightRadius , bottomLeftRadius ,  } = props;\n    const radiusValue = useMemo(()=>isMixedBorderRadius ? `${topLeftRadius}px ${topRightRadius}px ${bottomRightRadius}px ${bottomLeftRadius}px` : `${borderRadius}px`\n    , [\n        borderRadius,\n        isMixedBorderRadius,\n        topLeftRadius,\n        topRightRadius,\n        bottomRightRadius,\n        bottomLeftRadius, \n    ]);\n    return radiusValue;\n}\nexport const borderRadiusControl = {\n    borderRadius: {\n        title: \"Radius\",\n        type: ControlType.FusedNumber,\n        toggleKey: \"isMixedBorderRadius\",\n        toggleTitles: [\n            \"Radius\",\n            \"Radius per corner\"\n        ],\n        valueKeys: [\n            \"topLeftRadius\",\n            \"topRightRadius\",\n            \"bottomRightRadius\",\n            \"bottomLeftRadius\", \n        ],\n        valueLabels: [\n            \"TL\",\n            \"TR\",\n            \"BR\",\n            \"BL\"\n        ],\n        min: 0\n    }\n};\nexport function usePadding(props) {\n    const { padding , paddingPerSide , paddingTop , paddingRight , paddingBottom , paddingLeft ,  } = props;\n    const paddingValue = useMemo(()=>paddingPerSide ? `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px` : padding\n    , [\n        padding,\n        paddingPerSide,\n        paddingTop,\n        paddingRight,\n        paddingBottom,\n        paddingLeft, \n    ]);\n    return paddingValue;\n}\nexport const paddingControl = {\n    padding: {\n        type: ControlType.FusedNumber,\n        toggleKey: \"paddingPerSide\",\n        toggleTitles: [\n            \"Padding\",\n            \"Padding per side\"\n        ],\n        valueKeys: [\n            \"paddingTop\",\n            \"paddingRight\",\n            \"paddingBottom\",\n            \"paddingLeft\", \n        ],\n        valueLabels: [\n            \"T\",\n            \"R\",\n            \"B\",\n            \"L\"\n        ],\n        min: 0,\n        title: \"Padding\"\n    }\n};\n\nexport const __FramerMetadata__ = {\"exports\":{\"borderRadiusControl\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useRadius\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"RadiusProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"PaddingProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"usePadding\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"paddingControl\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./propUtils.map","import{defaultEvents,localeOptions,fontControls,fontSizeOptions,emptyStateStyle,containerStyles,fontStack}from\"https://framerusercontent.com/modules/VTUDdizacRHpwbkOamr7/AykinQJbgwl92LvMGZwu/constants.js\";import{useOnEnter,useOnExit}from\"https://framerusercontent.com/modules/D4TWeLfcxT6Tysr2BlYg/iZjmqdxVx1EOiM3k1FaW/useOnNavigationTargetChange.js\";import{useConstant}from\"https://framerusercontent.com/modules/ExNgrA7EJTKUPpH6vIlN/eiOrSJ2Ab5M9jPCvVwUz/useConstant.js\";import{colorTokentoValue,colorFromToken}from\"https://framerusercontent.com/modules/D2Lz5CmnNVPZFFiZXalt/QaCzPbriZBfXWZIIycFI/colorFromToken.js\";import{isMotionValue}from\"https://framerusercontent.com/modules/3mKFSGQqKHV82uOV1eBc/5fbRLvOpxZC0JOXugvwm/isMotionValue.js\";import{useUniqueClassName,randomID}from\"https://framerusercontent.com/modules/xDiQsqBGXzmMsv7AlEVy/uhunpMiNsbXxzjlXsg1y/useUniqueClassName.js\";import{getVariantControls}from\"https://framerusercontent.com/modules/ETACN5BJyFTSo0VVDJfu/NHRqowOiXkF9UwOzczF7/variantUtils.js\";import{useIsBrowserSafari}from\"https://framerusercontent.com/modules/eMBrwoqQK7h6mEeGQUH8/GuplvPJVjmxpk9zqOTcb/isBrowser.js\";import{useMultiOnChange,useOnChange}from\"https://framerusercontent.com/modules/v9AWX2URmiYsHf7GbctE/XxKAZ9KlhWqf5x1JMyyF/useOnChange.js\";import{mstoMinAndSec,secondsToMinutes}from\"https://framerusercontent.com/modules/4zHZnO5JojN1PrIbu2jm/revv9QCWpkh8lPzi2jje/time.js\";import{useAutoMotionValue}from\"https://framerusercontent.com/modules/kNDwabfjDEb3vUxkQlZS/fSIr3AOAYbGlfSPgXpYu/useAutoMotionValue.js\";import{useFontControls}from\"https://framerusercontent.com/modules/cuQH4dmpDnV8YK1mSgQX/KqRXqunFjE6ufhpc7ZRu/useFontControls.js\";import{useRenderTarget,useIsInPreview,useIsOnCanvas}from\"https://framerusercontent.com/modules/afBE9Yx1W6bY5q32qPxe/m3q7puE2tbo1S2C0s0CT/useRenderTarget.js\";import{useControlledState}from\"https://framerusercontent.com/modules/zGkoP8tPDCkoBzMdt5uq/0zFSjxIYliHxrQQnryFX/useControlledState.js\";import{usePadding,useRadius,paddingControl,borderRadiusControl}from\"https://framerusercontent.com/modules/5SM58HxZHxjjv7aLMOgQ/WXz9i6mVki0bBCrKdqB3/propUtils.js\";import{detectAutoSizingAxis}from\"https://framerusercontent.com/modules/8CkHAZatUz1UR8jNTcfD/HwbnIAZlUmQ2oTpcLkaH/detectAutoSizingAxis.js\";export{useOnEnter,useOnExit,defaultEvents,isMotionValue,colorFromToken,colorTokentoValue,localeOptions,fontControls,fontSizeOptions,emptyStateStyle,containerStyles,fontStack,useUniqueClassName,getVariantControls,useIsBrowserSafari,randomID,useConstant,useMultiOnChange,useOnChange,usePadding,useRadius,paddingControl,borderRadiusControl,mstoMinAndSec,useFontControls,secondsToMinutes,useAutoMotionValue,useRenderTarget,useIsInPreview,useControlledState,detectAutoSizingAxis,useIsOnCanvas,};\nexport const __FramerMetadata__ = {\"exports\":{\"useConstant\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isMotionValue\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fontControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultEvents\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useUniqueClassName\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMultiOnChange\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOnChange\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIsOnCanvas\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOnExit\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fontSizeOptions\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"colorTokentoValue\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useRadius\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getVariantControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"colorFromToken\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"usePadding\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fontStack\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useControlledState\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFontControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAutoMotionValue\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"emptyStateStyle\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIsInPreview\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIsBrowserSafari\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"detectAutoSizingAxis\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"borderRadiusControl\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"mstoMinAndSec\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"randomID\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"localeOptions\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOnEnter\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"secondsToMinutes\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useRenderTarget\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"paddingControl\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}","/*\n * Framer Commerce\n * Confidential and Proprietary - All Rights Reserved\n * Unauthorized use, reproduction, distribution, or disclosure of this\n * source code or any related information is strictly prohibited.\n *\n * This software is the exclusive property of Framer Commerce (\"Company\").\n * It is considered highly confidential and proprietary information.\n *\n * Any use, copying, modification, distribution, or sharing of this software,\n * in whole or in part, without the express written permission of the Company\n * is strictly prohibited and may result in legal action.\n *\n * DISCLAIMER: This software does not provide any express or\n * implied warranties, including, but not limited to, the implied warranties\n * of merchantability and fitness for a particular purpose. In no event shall\n * Framer Commerce be liable for any direct, indirect, incidental, special,\n * exemplary, or consequential damages (including, but not limited to, procurement\n * of substitute goods or services; loss of use, data, or profits; or business\n * interruption) however caused and on any theory of liability, whether in\n * contract, strict liability, or tort (including negligence or otherwise)\n * arising in any way out of the use of this software, even if advised of\n * the possibility of such damage.\n *\n * Any unauthorized possession, use, copying, distribution, or dissemination\n * of this software will be considered a breach of confidentiality and may\n * result in legal action.\n *\n * For inquiries, contact:\n * Framer Commerce\n * Email: hello@framercommerce.com\n *\n * © 2025 Butter Supply Inc. All Rights Reserved.\n */import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useCallback,useEffect,useMemo,useState}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{get}from\"lodash-es\";import{useIsBrowser}from\"https://framerusercontent.com/modules/ncBs5KPMI9I5GEta13fn/zGXDjuZapa1SGy6D8P5e/IsBrowser.js\";import{knownCurrenciesWithCodeAsSymbol}from\"https://framerusercontent.com/modules/k9s4cejdkBGDjmzudhzM/18cq93eooqM4YmdbL7E2/currencyMaps.js\";import{getLocaleFromCountry}from\"https://framerusercontent.com/modules/vC6fzbfO83MgBPIhn5zl/DUlbmWuOELzEUenVmv3G/locales.js\";// Helper function to check if a currency's symbol is the same as its code\nconst isCurrencySymbolSameAsCode=currencyCode=>{// For some currencies like CHF, the browser might use the code as the symbol\nif(!currencyCode)return false;if(knownCurrenciesWithCodeAsSymbol.includes(currencyCode)){return true;}try{const formatted=new Intl.NumberFormat(undefined,{style:\"currency\",currency:currencyCode,currencyDisplay:\"narrowSymbol\"}).format(0);// Remove digits, decimal points, and common formatting characters\nconst cleanFormatted=formatted.replace(/[0-9.,\\s]/g,\"\");// Check if what remains is the currency code\nreturn cleanFormatted===currencyCode;}catch(e){return false;}};/**\n * @framerDisableUnlink\n */export default function FC_ProductPrice(props){const{shopifyProductID,canvasPrice,format:{showCurrency,showSymbol,showDecimals,currencyCode}={},fromText=\"from\"}=props;const isBrowser=useIsBrowser();const[product,setProduct]=useState();const[activeVariant,setActiveVariant]=useState();const[subscriptionPrice,setSubscriptionPrice]=useState(()=>{if(typeof window!==\"undefined\"){const persisted=window.__fc_activeSubscription?.[shopifyProductID];if(persisted?.price)return persisted.price;}return null;});const[selectedCurrency,setSelectedCurrency]=useState(\"\");const[selectedCountryCode,setSelectedCountryCode]=useState(\"\");const[selectedCountry,setSelectedCountry]=useState(\"\");const[isLoadingPrice,setIsLoadingPrice]=useState(false);const[partialSelections,setPartialSelections]=useState({});const[variantSelectorAction,setVariantSelectorAction]=useState(\"\");const[waitingForVariantSelection,setWaitingForVariantSelection]=useState(false);// PERFORMANCE OPTIMIZATION: Progressive loading state\n// - Show prices immediately for fast perceived performance\n// - Compute ranges in background using requestIdleCallback\n// - Cache computed ranges to avoid recalculation\nconst[isRangeComputed,setIsRangeComputed]=useState(false);const[computedPriceRange,setComputedPriceRange]=useState({min:null,max:null});// Compute product price range from variants when product.priceRange is missing/partial\nconst getProductPriceRange=useCallback((p,useCompareAt=false)=>{if(!p)return{min:null,max:null};// Prefer product-level range when available\nconst rangePath=useCompareAt?\"compareAtPriceRange\":\"priceRange\";const minFromProduct=get(p,`${rangePath}.minVariantPrice.amount`);const maxFromProduct=get(p,`${rangePath}.maxVariantPrice.amount`);let minVal=minFromProduct?parseFloat(minFromProduct):null;let maxVal=maxFromProduct?parseFloat(maxFromProduct):null;if(minVal===null||isNaN(minVal)||maxVal===null||isNaN(maxVal)){// OPTIMIZED: Use reduce for better performance on large variant lists\nconst edges=p?.variants?.edges||[];if(edges.length>0){const{min,max}=edges.reduce((acc,{node:v})=>{if(!v)return acc;const fieldPath=useCompareAt?\"compareAtPrice.amount\":\"price.amount\";const amtStr=get(v,fieldPath);const amt=amtStr?parseFloat(amtStr):NaN;if(!isNaN(amt)&&amt>0){if(acc.min===null||amt<acc.min)acc.min=amt;if(acc.max===null||amt>acc.max)acc.max=amt;}return acc;},{min:null,max:null});minVal=min;maxVal=max;}}return{min:typeof minVal===\"number\"&&!isNaN(minVal)?minVal:null,max:typeof maxVal===\"number\"&&!isNaN(maxVal)?maxVal:null};},[selectedCurrency]);// Progressive range computation - compute in background after initial render\nuseEffect(()=>{if(!product||isRangeComputed)return;// Use requestIdleCallback for non-blocking computation\nconst computeRange=()=>{const range=getProductPriceRange(product,false);setComputedPriceRange(range);setIsRangeComputed(true);};// Delay computation to prioritize initial render\nif(\"requestIdleCallback\"in window){requestIdleCallback(computeRange,{timeout:200});}else{// Fallback for browsers without requestIdleCallback\nsetTimeout(computeRange,100);}},[product,isRangeComputed,getProductPriceRange]);// Reset range computation when product changes\nuseEffect(()=>{if(product){setIsRangeComputed(false);setComputedPriceRange({min:null,max:null});}},[product]);// Initialize currency and country code on page load\nuseEffect(()=>{if(!isBrowser)return;const storedCurrency=localStorage.getItem(\"selectedCurrency\");const storedCountryCode=localStorage.getItem(\"selectedCountryCode\");const storedCountry=localStorage.getItem(\"selectedCountry\");setSelectedCurrency(storedCurrency||\"USD\");setSelectedCountryCode(storedCountryCode||\"US\");setSelectedCountry(storedCountry||\"United States\");},[isBrowser]);// Handle variant changes\nconst handleVariantChange=useCallback(async e=>{// Check for purchase action flag - if this is a purchase action, don't update variant state\nif(e.detail?.isPurchaseAction){//console.log(\"Purchase action detected, returning\", e.detail?.isPurchaseAction)\nreturn;}if(!e.detail||e.detail.productId!==`gid://shopify/Product/${shopifyProductID}`){return;}// console.log(\"variantSelectorAction\", e.detail.onClickAction)\nsetVariantSelectorAction(e.detail.onClickAction);// Clear waiting state when variant changes are received\nsetWaitingForVariantSelection(false);//console.log(\"Price component: Variant change event received, clearing wait state\")\n//console.log(\"handleVariantChange\", e.detail)\nsetIsLoadingPrice(true);try{// Get products from shopXtools storage\nconst products=window.shopXtools?.products||[];const _matchingProduct=products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);if(_matchingProduct){setProduct(_matchingProduct.node);// Find the matching variant in the current product data\nconst matchingVariant=_matchingProduct.node?.variants?.edges?.find(({node})=>node.selectedOptions.every(option=>e.detail.selectedOptions.find(detailOption=>detailOption.name===option.name&&detailOption.value===option.value)));if(matchingVariant){if(e.detail.onClickAction===\"purchase\"){setActiveVariant(null);setPartialSelections({[e.detail.selectedOptions[0].name]:e.detail.selectedOptions[0].value});}else if(e.detail?.isCompleteVariant===false){// Partial selection: keep partial range behavior\nsetActiveVariant(null);if(Array.isArray(e.detail.selectedOptions)){const partial={};e.detail.selectedOptions.forEach(opt=>{if(opt?.name)partial[opt.name]=opt.value;});setPartialSelections(partial);}}else{setActiveVariant(matchingVariant.node);setPartialSelections({});}}}}catch(error){// Fallback\nif(e.detail?.isCompleteVariant){setActiveVariant(e.detail);if(e.detail.onClickAction!==\"purchase\"){setPartialSelections({});}}else{setActiveVariant(null);if(Array.isArray(e.detail?.selectedOptions)){const partial={};e.detail.selectedOptions.forEach(opt=>{if(opt?.name)partial[opt.name]=opt.value;});setPartialSelections(partial);}}}finally{setIsLoadingPrice(false);}},[shopifyProductID]);// Handle currency changes\nconst handleCurrencyChange=useCallback(event=>{setIsLoadingPrice(true);const{currency,countryCode,country}=event.detail;setSelectedCurrency(currency);setSelectedCountryCode(countryCode);setSelectedCountry(country);try{// Get products from shopXtools storage\nconst products=window.shopXtools?.products||[];const _matchingProduct=products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);if(_matchingProduct){setProduct(_matchingProduct.node);// Preserve active variant selection if possible\nif(activeVariant){const matchingVariant=_matchingProduct.node.variants?.edges.find(({node})=>node.selectedOptions.every(option=>activeVariant.selectedOptions.find(activeOption=>activeOption.name===option.name&&activeOption.value===option.value)));if(matchingVariant){setActiveVariant(matchingVariant.node);}}}}catch(error){// Error handling\n}finally{setIsLoadingPrice(false);}},[shopifyProductID,activeVariant]);// Listen for currency changes\nuseEffect(()=>{if(!isBrowser)return;window.addEventListener(\"currency_changed\",handleCurrencyChange);return()=>{window.removeEventListener(\"currency_changed\",handleCurrencyChange);};},[isBrowser,handleCurrencyChange]);// Initial product load\nuseEffect(()=>{if(!isBrowser)return;// Single handler for all product-ready events (both priority and regular)\nconst handleProductsReady=e=>{if(product&&product.id===`gid://shopify/Product/${shopifyProductID}`){return;}if(!Array.isArray(e.detail?.products))return;// console.log('Products ready event received in Price component', e);\nconst matchingProduct=e.detail.products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);if(matchingProduct){setProduct(matchingProduct.node);// console.log('Product loaded:', matchingProduct.node.title);\nif(matchingProduct.node?.variants?.edges?.length===1){setActiveVariant(matchingProduct.node.variants.edges[0].node);}}};// Add event listeners - single handleProductsReady handles both events\ndocument.addEventListener(\"data__products-ready\",handleProductsReady);document.addEventListener(\"product__active-variant__changed\",handleVariantChange);// Cleanup\nreturn()=>{document.removeEventListener(\"data__products-ready\",handleProductsReady);document.removeEventListener(\"product__active-variant__changed\",handleVariantChange);};},[isBrowser,shopifyProductID,selectedCurrency,selectedCountryCode,product]);const loadProduct=async()=>{try{// console.log('Loading product...');\n// Get products from shopXtools storage\nconst products=Array.isArray(window?.shopXtools?.products)?window.shopXtools.products:[];const _matchingProduct=products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);if(_matchingProduct){setProduct(_matchingProduct.node);// console.log(\n//   'Product found after immediate initialization:',\n//   _matchingProduct.node?.title\n// );\nif(_matchingProduct.node?.variants?.edges?.length===1){setActiveVariant(_matchingProduct.node.variants.edges[0].node);}}else{// Product not found - request priority fetch\nif(window?.shopXtools?.getProducts){// console.log('Product not found - request priority fetch...');\nwindow.shopXtools.getProducts(shopifyProductID);}}}catch(error){console.error(\"Error loading product:\",error);}};useEffect(()=>{if(!isBrowser)return;loadProduct();},[isBrowser]);// Wait for variant selection events with timeout\nuseEffect(()=>{if(!isBrowser||!product)return;// Only wait for variant selection if it's a multi-variant product\nconst isMultiVariant=product.variants?.edges?.length>1;if(!isMultiVariant)return;// Set waiting state and start timeout\nsetWaitingForVariantSelection(true);// console.log(\"Price component: Waiting for variant selection events...\")\nconst timeout=setTimeout(()=>{// If no variant selection events received within timeout, assume no variant selector\nsetWaitingForVariantSelection(false);//console.log(\"Price component: No variant selection events received, showing product price\")\n},1e3)// 1 second timeout\n;return()=>{clearTimeout(timeout);};},[isBrowser,product]);// Add subscription price listener\nuseEffect(()=>{if(!isBrowser)return;// Check for persisted subscription state that may have been set\n// before this component mounted (solves timing/race on page refresh)\nconst persisted=window.__fc_activeSubscription?.[shopifyProductID];if(persisted?.price&&!subscriptionPrice){setSubscriptionPrice(persisted.price);}const handleSubscriptionPriceUpdate=e=>{// Ignore events for other products\nif(e.detail?.productId&&e.detail.productId!==shopifyProductID)return;if(e.detail?.price){setSubscriptionPrice(e.detail.price);}else{setSubscriptionPrice(null);}};const handleVariantOptionSelected=e=>{//console.log(\"variant_option_selected\", e.detail)\nif(e.detail?.isPurchaseAction){// console.log(\n//     \"Purchase action is true, returning\",\n//     e.detail?.isPurchaseAction\n// )\nreturn;}// Check if this event is for our product\nconst eventProductId=e.detail?.productId;const expectedProductId=`gid://shopify/Product/${shopifyProductID}`;if(eventProductId&&eventProductId!==expectedProductId){//console.log(\"Event not for this product\", eventProductId, expectedProductId)\nreturn;}// Clear waiting state when variant selection events are received\nsetWaitingForVariantSelection(false);//console.log(\"Price component: Variant selection event received, clearing wait state\")\nsetIsLoadingPrice(true);if(e.detail?.optionName&&e.detail?.value){setPartialSelections({[e.detail.optionName]:e.detail.value});//console.log(\"setting partialSelections from individual option\", e.detail.optionName, e.detail.value)\n}setIsLoadingPrice(false);};document.addEventListener(\"subscription__price-update\",handleSubscriptionPriceUpdate);document.addEventListener(\"variant_option_selected\",handleVariantOptionSelected);document.addEventListener(\"__variant_option_selected\",handleVariantOptionSelected);return()=>{document.removeEventListener(\"subscription__price-update\",handleSubscriptionPriceUpdate);document.removeEventListener(\"variant_option_selected\",handleVariantOptionSelected);document.removeEventListener(\"__variant_option_selected\",handleVariantOptionSelected);};},[isBrowser,shopifyProductID]);// Get currency formatting options at component level\nconst _currencyCode=useMemo(()=>{const variantCurrency=get(activeVariant,\"price.currencyCode\");const productCurrency=get(product,\"priceRange.minVariantPrice.currencyCode\");return variantCurrency||productCurrency||\"USD\";},[activeVariant,product]);const showMockValues=useMemo(()=>RenderTarget.current()===RenderTarget.canvas||isBrowser&&window.location.origin.endsWith(\"framercanvas.com\"),[isBrowser]);// Common function to format price based on options\nconst formatPriceWithOptions=(numericPrice,currCode)=>{const symbolSameAsCode=isCurrencySymbolSameAsCode(currCode);// Get locale from selected country code\nconst locale=getLocaleFromCountry(selectedCountryCode);// Log browser user agent for debugging iOS-specific issues\n// if (isBrowser) {\n//     console.log(\"[FC_ProductPrice] Format debug:\", {\n//         userAgent: navigator.userAgent,\n//         isCurrencySymbolSameAsCode: symbolSameAsCode,\n//         currencyCode: currCode,\n//         selectedCountryCode,\n//         locale,\n//         showSymbol,\n//         showCurrency,\n//         showDecimals,\n//     })\n// }\n// Determine if we should show decimals based on the setting\nconst shouldShowDecimals=()=>{if(showDecimals===\"Always show\")return true;if(showDecimals===\"Never show\")return false;if(showDecimals===\"Hide when .00\"){// Check if the decimal part is zero\nreturn numericPrice%1!==0;}return true// Default fallback\n;};const decimalDigits=shouldShowDecimals()?2:0;// If showing neither symbol nor code, just format the number\nif(!showSymbol&&!showCurrency){const formattedNumber=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);return formattedNumber;}// Special case for USD to prevent \"US$\" display in Safari iOS\nif(currCode===\"USD\"&&showSymbol){// Check if running on iOS device\nconst isIOS=isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream;// Format USD manually to avoid the iOS \"US$\" prefix\nif(isIOS){const number=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);let result;if(!showCurrency){result=`$${number}`// Just \"$50\" format\n;}else{result=`$${number} USD`// \"$50 USD\" format\n;}return result;}else{// For non-iOS devices, continue with normal formatting but use\n// a more controlled approach to ensure consistency\nlet result;if(!showCurrency){result=new Intl.NumberFormat(locale,{style:\"currency\",currency:\"USD\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits,currencyDisplay:\"narrowSymbol\"}).format(numericPrice);}else{const withSymbol=new Intl.NumberFormat(locale,{style:\"currency\",currency:\"USD\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits,currencyDisplay:\"narrowSymbol\"}).format(numericPrice);result=`${withSymbol} USD`;}return result;}}// For currencies where symbol is same as code (like CHF)\nif(symbolSameAsCode){// If showing currency code, always use code-first format and ignore symbol\nif(showCurrency&&!showSymbol){const number=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);const output=`${currCode} ${number}`;return output;}if(showSymbol&&!showCurrency){const number=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);const output=`${currCode} ${number}`;return output;}if(showCurrency&&showSymbol){const number=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);const result=`${currCode} ${number}`;return result;}}// For currencies with distinct symbols (like USD with $)\n// If showing only the code (no symbol)\nif(!showSymbol&&showCurrency){const number=new Intl.NumberFormat(locale,{style:\"decimal\",minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits}).format(numericPrice);// For normal currencies, show code after the number\nconst result=`${number} ${currCode}`;return result;}// If showing only the symbol (no code)\nif(showSymbol&&!showCurrency){const result=new Intl.NumberFormat(locale,{style:\"currency\",currency:currCode,minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits,currencyDisplay:\"narrowSymbol\"}).format(numericPrice);return result;}// If showing both symbol and code\nconst withSymbol=new Intl.NumberFormat(locale,{style:\"currency\",currency:currCode,minimumFractionDigits:decimalDigits,maximumFractionDigits:decimalDigits,currencyDisplay:\"narrowSymbol\"}).format(numericPrice);const result=`${withSymbol} ${currCode}`;return result;};const text=useMemo(()=>{if(!isBrowser)return\"\";// For canvas view, handle the display options directly\nif(typeof RenderTarget!==\"undefined\"&&(RenderTarget.current()===RenderTarget.canvas||showMockValues)){// Parse canvasPrice as range format (e.g., \"200.00-250.00\")\nlet minPrice;let maxPrice;if(canvasPrice){const priceRange=canvasPrice.split(\"-\");if(priceRange.length===2){minPrice=priceRange[0].trim();maxPrice=priceRange[1].trim();}else{// If no range format, use the single price for both min and max\nminPrice=canvasPrice;maxPrice=canvasPrice;}}const numericPrice=parseFloat(minPrice);const numericMaxPrice=parseFloat(maxPrice);const currentCurrencyCode=currencyCode||\"USD\";const formattedPrice=formatPriceWithOptions(numericPrice,currentCurrencyCode);// Handle displayPrice logic for canvas preview\nif(props.displayPrice===\"minimum price\"){// If min and max are the same, just show one price (no \"from\" prefix)\nif(Math.abs(numericPrice-numericMaxPrice)<.01){return formattedPrice;}return`${fromText} ${formattedPrice}`;}if(props.displayPrice===\"range\"){const formattedMaxPrice=formatPriceWithOptions(numericMaxPrice,currentCurrencyCode);// If min and max are the same, just show one price\nif(Math.abs(numericPrice-numericMaxPrice)<.01){return formattedPrice;}return`${formattedPrice} - ${formattedMaxPrice}`;}return formattedPrice;}// For live view, use the selected currency or preview currency\nconst amount=subscriptionPrice||activeVariant&&get(activeVariant,\"price.amount\");if(!amount&&!activeVariant&&!product?.priceRange){return\"\";}const currentCurrencyCode=selectedCurrency||currencyCode||\"USD\";// Use cached range if available, otherwise compute on-demand\nconst range=computedPriceRange.min!==null?computedPriceRange:getProductPriceRange(product,false);const{min:computedMin,max:computedMax}=range;// FAST PATH: If we have an amount (subscription or active variant), format it immediately\nif(amount){const numericPrice=parseFloat(amount);if(isNaN(numericPrice))return\"\";const formattedPrice=formatPriceWithOptions(numericPrice,currentCurrencyCode);return formattedPrice;}// FAST PATH: Single variant products - show price immediately\nif(product?.variants?.edges?.length===1&&!activeVariant){const variant=product.variants.edges[0].node;if(variant?.price?.amount){const numericPrice=parseFloat(variant.price.amount);if(!isNaN(numericPrice)){return formatPriceWithOptions(numericPrice,currentCurrencyCode);}}}// Handle partial selections (when user selects only some variant options)\nconst hasPartialSelections=Object.keys(partialSelections).length>0;const hasCompleteVariant=activeVariant&&activeVariant.selectedOptions?.length>0;//console.log(\"hasPartialSelections\", hasPartialSelections)\n//console.log(\"hasCompleteVariant\", hasCompleteVariant)\n//console.log(\"product\", product)\n//console.log(\"partialSelections\", partialSelections)\nif(hasPartialSelections&&!hasCompleteVariant&&product?.variants?.edges?.length&&variantSelectorAction!==\"purchase\"){// Filter variants that match the partial selections\nconst matchingVariants=product.variants.edges.filter(({node:variant})=>{return variant.selectedOptions.every(option=>{// If this option is in our partial selections, it must match\nif(partialSelections[option.name]){return partialSelections[option.name]===option.value;}// If not in partial selections, any value is fine\nreturn true;});});// console.log(\"matchingVariants\", matchingVariants)\nif(matchingVariants.length>0){//console.log(\"matchingVariants\", matchingVariants)\n// Calculate min and max prices for matching variants\nconst prices=matchingVariants.map(({node:variant})=>parseFloat(variant.price?.amount||\"0\")).filter(price=>price>0);if(prices.length>0){const minPrice=Math.min(...prices);const maxPrice=Math.max(...prices);const formattedMinPrice=formatPriceWithOptions(minPrice,currentCurrencyCode);if(props.displayPrice===\"range\"){// If min and max are the same, just show one price\nif(Math.abs(minPrice-maxPrice)<.01){return formattedMinPrice;}const formattedMaxPrice=formatPriceWithOptions(maxPrice,currentCurrencyCode);return`${formattedMinPrice} - ${formattedMaxPrice}`;}if(props.displayPrice===\"minimum price\"){// If min and max are the same, just show one price (no \"from\" prefix)\nif(Math.abs(minPrice-maxPrice)<.01){return formattedMinPrice;}return`${fromText} ${formattedMinPrice}`;}}}}// Handle price range display logic for complete product (no active variant)\nif(!activeVariant&&product?.priceRange||variantSelectorAction===\"purchase\"&&product?.priceRange){// If we're waiting for variant selection, don't show product price\nif(waitingForVariantSelection){return\"\";}// PROGRESSIVE ENHANCEMENT: Show min price immediately, enhance with range when computed\nif(computedMin){const formattedMinPrice=formatPriceWithOptions(computedMin,currentCurrencyCode);// If we have both min and max, show range\nif(computedMax&&Math.abs(computedMin-computedMax)>.01){if(props.displayPrice===\"range\"){const formattedMaxPrice=formatPriceWithOptions(computedMax,currentCurrencyCode);return`${formattedMinPrice} - ${formattedMaxPrice}`;}if(props.displayPrice===\"minimum price\"){// If min and max are the same, just show one price (no \"from\" prefix)\nif(Math.abs(computedMin-computedMax)<.01){return formattedMinPrice;}return`${fromText} ${formattedMinPrice}`;}}// Single price or fallback\nif(props.displayPrice===\"range\"){return formattedMinPrice;}// If min and max are the same, just show one price (no \"from\" prefix)\nif(computedMax&&Math.abs(computedMin-computedMax)<.01){return formattedMinPrice;}return`${fromText} ${formattedMinPrice}`;}// FALLBACK: Use product-level range if available\nconst productMinPrice=get(product,\"priceRange.minVariantPrice.amount\");const productMaxPrice=get(product,\"priceRange.maxVariantPrice.amount\");if(productMinPrice){const numericMinPrice=parseFloat(productMinPrice);if(!isNaN(numericMinPrice)&&numericMinPrice>0){const formattedMinPrice=formatPriceWithOptions(numericMinPrice,currentCurrencyCode);if(props.displayPrice===\"range\"){if(productMaxPrice){const numericMaxPrice=parseFloat(productMaxPrice);if(!isNaN(numericMaxPrice)&&numericMaxPrice>0&&Math.abs(numericMinPrice-numericMaxPrice)>.01){const formattedMaxPrice=formatPriceWithOptions(numericMaxPrice,currentCurrencyCode);return`${formattedMinPrice} - ${formattedMaxPrice}`;}}return formattedMinPrice;}// If min and max are the same, just show one price (no \"from\" prefix)\nif(productMaxPrice){const numericMaxPrice=parseFloat(productMaxPrice);if(!isNaN(numericMaxPrice)&&Math.abs(numericMinPrice-numericMaxPrice)<.01){return formattedMinPrice;}}return`${fromText} ${formattedMinPrice}`;}}}// Absolute last fallback: try active variant again or show nothing\nreturn\"\";},[isBrowser,showMockValues,activeVariant,product,canvasPrice,showCurrency,showSymbol,currencyCode,showDecimals,selectedCurrency,selectedCountryCode,subscriptionPrice,props.displayPrice,partialSelections,variantSelectorAction,fromText,waitingForVariantSelection,getProductPriceRange]);const compareAtPrice=useMemo(()=>{// For partial selections (variant groups), check if any matching variants have compareAtPrice\nif(Object.keys(partialSelections).length>0&&product?.variants?.edges?.length){const matchingVariants=product.variants.edges.filter(({node:variant})=>{return variant.selectedOptions.every(option=>{if(partialSelections[option.name]){return partialSelections[option.name]===option.value;}return true;});});// Check if ALL matching variants have a valid compareAtPrice\nconst allMatchingVariantsHaveComparePrice=matchingVariants.every(({node:variant})=>{const compareAmount=get(variant,\"compareAtPrice.amount\");return compareAmount&&parseFloat(compareAmount)>0;});// If not all matching variants have compareAtPrice, return empty string\nif(!allMatchingVariantsHaveComparePrice){return\"\";}// If all matching variants have compareAtPrice, use the minimum for consistency\nconst comparePrices=matchingVariants.map(({node:variant})=>parseFloat(get(variant,\"compareAtPrice.amount\")||\"0\")).filter(price=>price>0);if(comparePrices.length>0){const minComparePrice=Math.min(...comparePrices);const currentCurrencyCode=selectedCurrency||currencyCode||\"USD\";return formatPriceWithOptions(minComparePrice,currentCurrencyCode);}}// For active variant, use its compareAtPrice\nif(activeVariant){const amount=get(activeVariant,\"compareAtPrice.amount\");if(!amount)return\"\";const numericPrice=parseFloat(amount);if(isNaN(numericPrice)||numericPrice<=0)return\"\";const currentCurrencyCode=selectedCurrency||currencyCode||\"USD\";return formatPriceWithOptions(numericPrice,currentCurrencyCode);}// For product level (no variant selected), check if ALL variants have compareAtPrice\nif(product?.variants?.edges?.length){const allVariantsHaveComparePrice=product.variants.edges.every(({node:variant})=>{const compareAmount=get(variant,\"compareAtPrice.amount\");return compareAmount&&parseFloat(compareAmount)>0;});// If not all variants have compareAtPrice, don't show sale styling\nif(!allVariantsHaveComparePrice){return\"\";}// If all variants have compareAtPrice, use the product-level compareAtPriceRange\nconst amount=get(product,\"compareAtPriceRange.minVariantPrice.amount\");if(!amount)return\"\";const numericPrice=parseFloat(amount);if(isNaN(numericPrice)||numericPrice<=0)return\"\";const currentCurrencyCode=selectedCurrency||currencyCode||\"USD\";return formatPriceWithOptions(numericPrice,currentCurrencyCode);}return\"\";},[activeVariant,product,partialSelections,currencyCode,showCurrency,showSymbol,showDecimals,selectedCurrency,selectedCountryCode,showMockValues,props.format]);const numericValue=useMemo(()=>parseFloat(compareAtPrice.replace(/[^\\d.-]/g,\"\")),[compareAtPrice]);const hasValidCompareAtPrice=!isNaN(numericValue)&&numericValue>0;const shouldDisplay=useMemo(()=>{if(showMockValues)return true;if(!text)return false;const value=parseFloat(text.replace(/[^\\d.-]/g,\"\"));return!isNaN(value)&&value>0;},[text,showMockValues]);const computedStyles=useMemo(()=>{const baseStyles={margin:0,padding:0,lineHeight:1,whiteSpace:\"nowrap\",display:\"inline-block\",width:\"auto\"};const priceStyles=hasValidCompareAtPrice?props.saleFont:props.regularFont;const priceColor=hasValidCompareAtPrice?props.saleColor:props.regularColor;return{...baseStyles,...priceStyles,color:priceColor};},[hasValidCompareAtPrice,props.saleFont,props.regularFont,props.saleColor,props.regularColor]);// console.log(\"Text\", text)\n// // Price calculation logging\n// useEffect(() => {\n//     console.log(\"[FC_ProductPrice] Price State Update:\", {\n//         activeVariant,\n//         product,\n//         selectedCurrency,\n//         subscriptionPrice,\n//     })\n// }, [activeVariant, product, selectedCurrency, subscriptionPrice])\n// useEffect(() => {\n//     console.log(\"Active variant updated:\", activeVariant);\n// }, [activeVariant]);\n// Return placeholder during SSR\nif(!isBrowser||isLoadingPrice){return /*#__PURE__*/_jsx(\"div\",{style:{display:\"none\"}});}// Progressive enhancement: Show loading state only when we have no data at all\nconst shouldShowLoading=!product&&!activeVariant&&!subscriptionPrice&&!showMockValues;if(shouldShowLoading){return /*#__PURE__*/_jsx(\"div\",{style:{display:\"none\"}});}// Show progressive loading indicator when computing ranges\nconst isComputingRange=product&&!isRangeComputed&&product.variants?.edges?.length>1;return /*#__PURE__*/_jsx(\"div\",{style:{display:\"inline-block\",maxWidth:\"100%\",width:\"auto\",whiteSpace:\"nowrap\",overflow:\"visible\",transform:\"none\",transition:\"none\",animation:\"none\",willChange:\"auto\"},children:/*#__PURE__*/_jsxs(\"p\",{style:{...computedStyles,transform:\"none\",transition:\"none\",animation:\"none\",willChange:\"auto\"},children:[text,isComputingRange&&/*#__PURE__*/_jsx(\"span\",{style:{opacity:.6,fontSize:\"0.8em\",marginLeft:\"4px\"},children:\"...\"})]})});}FC_ProductPrice.defaultProps={shopifyProductID:\"\",canvasPrice:\"50.00\",fromText:\"from\",format:{showCurrency:true,showSymbol:true,currencyCode:\"USD\",showDecimals:\"Always show\"}};addPropertyControls(FC_ProductPrice,{shopifyProductID:{type:ControlType.String,title:\"Product ID\",description:\"Connect to CMS (required).\"},canvasPrice:{type:ControlType.String,title:\"Price\",defaultValue:\"50.00\",description:\"Connect to CMS (for canvas preview only).\"},displayPrice:{type:ControlType.Enum,title:\"Varying Prices\",options:[\"minimum price\",\"range\"],optionTitles:[\"Minimum Price\",\"Range\"],defaultValue:\"minimum price\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\",description:\"When a product has multiple prices and a variant has not been selected.\"},fromText:{type:ControlType.String,title:\"Prefix\",placeholder:\"from\",defaultValue:\"from\",hidden:props=>props.displayPrice!==\"minimum price\"},format:{type:ControlType.Object,title:\"Format\",controls:{showSymbol:{type:ControlType.Boolean,title:\"Symbol\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"$, \\xa3, €, etc.\"},showCurrency:{type:ControlType.Boolean,title:\"Code\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\",description:\"USD, EUR, CHF, etc.\"},showDecimals:{type:ControlType.Enum,title:\"Decimals\",defaultValue:\"Always show\",options:[\"Always show\",\"Never show\",\"Hide when .00\"],optionTitles:[\"Always show\",\"Never show\",\"Hide when .00\"],displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},currencyCode:{type:ControlType.Enum,title:\"Preview\",defaultValue:\"USD\",options:[\"USD\",\"EUR\",\"GBP\",\"CHF\",\"JPY\",\"CAD\",\"AUD\",\"CNY\",\"HKD\",\"NZD\",\"SEK\",\"KRW\",\"SGD\",\"NOK\",\"MXN\",\"INR\",\"RUB\",\"ZAR\",\"TRY\",\"BRL\",\"TWD\",\"DKK\",\"PLN\",\"THB\",\"IDR\",\"HUF\",\"CZK\",\"ILS\",\"CLP\",\"PHP\",\"AED\",\"COP\",\"SAR\",\"MYR\",\"RON\"],description:\"Currency is for canvas preview only.\"}}},/** Font and Color Controls */regularFont:{type:ControlType.Font,title:\"Regular\",controls:\"extended\"},regularColor:{type:ControlType.Color,title:\"↳ Color\",defaultValue:\"#000\"},saleFont:{type:ControlType.Font,title:\"Sale\",controls:\"extended\"},saleColor:{type:ControlType.Color,title:\"↳ Color\",defaultValue:\"#FF0000\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FC_ProductPrice\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FC_ProductPrice.map","import React from\"react\";// It walks every level of the element tree: each nested container, stack, frame gets rendersWithMotion = false\n// It preserves all other props (styles, events, Framer props)\n// It prevents Framer from rewrapping anything in internal motion components, which stops layout animation flickers, re-renders, and performance loss\nexport function sanitizeChildrenRecursively(node){if(!/*#__PURE__*/React.isValidElement(node))return node;// Clone node with motion props disabled\nconst sanitizedProps={...node.props,rendersWithMotion:false,layoutId:undefined,scopeId:undefined};// If there are nested children, recurse into them\nif(node.props.children){sanitizedProps.children=React.Children.map(node.props.children,sanitizeChildrenRecursively);}return /*#__PURE__*/React.cloneElement(node,sanitizedProps);}\nexport const __FramerMetadata__ = {\"exports\":{\"sanitizeChildrenRecursively\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./cloning.map","/**\n * Initialization utilities for Framer Commerce\n * This file contains functions that should run when the application first loads\n */import{getUTMParameters,getSCARefParameters}from\"https://framerusercontent.com/modules/w24ELWa2giT3SFaWpV77/398w6fPyag8B92ojouQr/utmParams.js\";/**\n * Initialize global functionality for the store\n * This includes capturing UTM parameters, setting up event listeners, etc.\n */export function initializeStore(){// Capture UTM and SCA ref parameters when the page loads\nif(typeof window!==\"undefined\"){// Initialize UTM parameter tracking\ngetUTMParameters();// Initialize SCA ref parameter tracking\ngetSCARefParameters();// Add a listener for history changes to capture tracking parameters\n// when users navigate between pages\ntry{const originalPushState=history.pushState;const originalReplaceState=history.replaceState;history.pushState=function(){originalPushState.apply(this,arguments);getUTMParameters()// Capture UTM parameters after navigation\n;getSCARefParameters()// Capture SCA ref parameters after navigation\n;};history.replaceState=function(){originalReplaceState.apply(this,arguments);getUTMParameters()// Capture UTM parameters after navigation\n;getSCARefParameters()// Capture SCA ref parameters after navigation\n;};// Also listen for popstate events (back/forward navigation)\nwindow.addEventListener(\"popstate\",()=>{getUTMParameters();getSCARefParameters();});}catch(error){console.error(\"Error setting up history listeners:\",error);}}}// Auto-initialize if this module is loaded\ninitializeStore();export default initializeStore;\nexport const __FramerMetadata__ = {\"exports\":{\"initializeStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","/*\n * Framer Commerce\n * Confidential and Proprietary - All Rights Reserved\n * Unauthorized use, reproduction, distribution, or disclosure of this\n * source code or any related information is strictly prohibited.\n *\n * This software is the exclusive property of Framer Commerce (\"Company\").\n * It is considered highly confidential and proprietary information.\n *\n * Any use, copying, modification, distribution, or sharing of this software,\n * in whole or in part, without the express written permission of the Company\n * is strictly prohibited and may result in legal action.\n *\n * DISCLAIMER: This software does not provide any express or\n * implied warranties, including, but not limited to, the implied warranties\n * of merchantability and fitness for a particular purpose. In no event shall\n * Framer Commerce be liable for any direct, indirect, incidental, special,\n * exemplary, or consequential damages (including, but not limited to, procurement\n * of substitute goods or services; loss of use, data, or profits; or business\n * interruption) however caused and on any theory of liability, whether in\n * contract, strict liability, or tort (including negligence or otherwise)\n * arising in any way out of the use of this software, even if advised of\n * the possibility of such damage.\n *\n * Any unauthorized possession, use, copying, distribution, or dissemination\n * of this software will be considered a breach of confidentiality and may\n * result in legal action.\n *\n * For inquiries, contact:\n * Framer Commerce\n * Email: hello@framercommerce.com\n *\n * © 2025 Butter Supply Inc. All Rights Reserved.\n */import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useState,useRef,useCallback,cloneElement}from\"react\";import{createCartMutation,addToCartMutation,cartQuery,updateCartAttributes,updateCartCurrency,getProductMetafields}from\"https://framerusercontent.com/modules/yiRfl1JCGhIBUL31WVDk/wupS2XmBAHu1kBQNv9pi/mutations_v2.js\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{get}from\"lodash-es\";import{appendAllTrackingParamsToUrl}from\"https://framerusercontent.com/modules/w24ELWa2giT3SFaWpV77/398w6fPyag8B92ojouQr/utmParams.js\";import{appendLanguageToUrl}from\"https://framerusercontent.com/modules/vC6fzbfO83MgBPIhn5zl/DUlbmWuOELzEUenVmv3G/locales.js\";import{useIsBrowser}from\"https://framerusercontent.com/modules/ncBs5KPMI9I5GEta13fn/zGXDjuZapa1SGy6D8P5e/IsBrowser.js\";import{trackFacebookPixelAddToCart,trackFacebookPixelInitiateCheckout,trackFacebookPixelViewContent}from\"https://framerusercontent.com/modules/6Zs9CjkPbKzHjoy8LK08/iqoIwmJw4hztafi4V4IV/Fb_pixel.js\";import{sanitizeChildrenRecursively}from\"https://framerusercontent.com/modules/Da0ApllLKQHSw8djEYKs/NKlmeTJYy3YIy3O2qsS9/cloning.js\";// Import initialization utility to ensure UTM tracking is set up\nimport\"https://framerusercontent.com/modules/FXrY3V9ZYVL8aziafDQn/HIuMDRrKIIcsJe65kZwo/initialize.js\";/**\n * @framerDisableUnlink\n */export default function FC_ProductPurchaseButton(props){const{shopifyProductID,available,OutOfStock,SelectVariant,LoadingState,maxQuantity,shopifyProductVariantId,BuyNowATC,title=\"Add to Cart\",required=false,openCart=true}=props;// State from original component\nconst[product,setProduct]=useState();const[activeVariant,setActiveVariant]=useState();const[isInStock,setIsInStock]=useState(true);const[needsVariantSelection,setNeedsVariantSelection]=useState(false);const[isLoading,setIsLoading]=useState(true);const[hasInitialized,setHasInitialized]=useState(false);const[countryCode,setCountryCode]=useState();const isBrowser=useIsBrowser();// Additional state for cart functionality — read persisted state to\n// avoid flickering to 'one-time' on Framer component-variant remounts\nconst[planSelected,setPlanSelected]=useState(()=>{if(typeof window!==\"undefined\"){const persisted=window.__fc_activeSubscription?.[shopifyProductID];if(persisted?.subscriptionId)return persisted.subscriptionId;}return\"one-time\";});const[cartExistingData,setCartExistingData]=useState();const[errorMessage,setErrorMessage]=useState();const[productQuantity,setProductQuantity]=useState(1);const viewContentFired=useRef(false);const[autoSelectFirst,setAutoSelectFirst]=useState(false);const[isVariantManuallySelected,setIsVariantManuallySelected]=useState(false);const[maxQuantityReached,setMaxQuantityReached]=useState(false);const[orderMax,setOrderMax]=useState(0);// Check if variant is autoselected by default\nuseEffect(()=>{if(!isBrowser)return;//console.log(\"FC_ProductPurchaseButton mounted\")\nconst handleAutoSelectFlag=event=>{// console.log(\n//     \"Auto Select event received as:\",\n//     event.detail.autoSelectFirst\n// )\nif(event.detail.shopifyProductID!==`gid://shopify/Product/${props.shopifyProductID}`){return;}setAutoSelectFirst(event.detail.autoSelectFirst);window.__fc_autoSelectFirst=event.detail.autoSelectFirst;//console.log(\"Auto Select First Flag:\", event.detail.autoSelectFirst)\n};document.addEventListener(\"auto_select_first_flag\",handleAutoSelectFlag);return()=>{document.removeEventListener(\"auto_select_first_flag\",handleAutoSelectFlag);};},[isBrowser]);// Calculate total inventory helper function\nconst calculateTotalInventory=useCallback(productData=>{if(!productData||productData===\"404\")return 0;// If totalInventory is available, use it\nif(typeof productData.totalInventory===\"number\"){return productData.totalInventory;}// Otherwise sum up variant quantities\nreturn get(productData,\"variants.edges\",[]).reduce((total,{node})=>{return total+(node.quantityAvailable||0);},0);},[]);// Helper function to check if variant is available for sale\nconst isVariantAvailable=useCallback(variant=>{if(!variant)return false;// If availableForSale is true, the variant can be sold regardless of quantity\nif(variant.availableForSale)return true;// If availableForSale is false, check quantity\nreturn variant.quantityAvailable>0;},[]);// Error handling\nuseEffect(()=>{if(errorMessage&&isBrowser){const event=new CustomEvent(\"errorChanged\",{detail:errorMessage});window.dispatchEvent(event);}},[errorMessage]);// Load cart from localStorage\nuseEffect(()=>{if(!isBrowser||!window[\"shopXtools\"])return;// Try to load cart ID first\nconst savedCartId=localStorage.getItem(\"shopX_cart_id\");if(savedCartId){// If we have a cart ID, fetch the cart data\nwindow.shopXtools.handleCartMutation(cartQuery,{cartId:savedCartId}).then(data=>{if(data?.cart){setCartExistingData(data.cart);window.shopXtools.cart=data.cart;localStorage.setItem(\"shopXtools.cart\",JSON.stringify(data.cart));}}).catch(error=>{// Clear invalid cart data\nlocalStorage.removeItem(\"shopX_cart_id\");localStorage.removeItem(\"shopXtools.cart\");});}// Check for persisted subscription state that may have been set\n// before this component mounted (solves race on page load when\n// default is \"Subscribe\")\nconst persisted=window.__fc_activeSubscription?.[shopifyProductID];if(persisted?.subscriptionId){setPlanSelected(persisted.subscriptionId);}const handleSubscriptionChange=event=>{// Only apply subscription selection for this specific product\nif(event.detail?.productId&&event.detail.productId!==shopifyProductID)return;setPlanSelected(event.detail.subscriptionId);};document.addEventListener(\"subscription__selection-sync\",handleSubscriptionChange);return()=>document.removeEventListener(\"subscription__selection-sync\",handleSubscriptionChange);},[isBrowser,shopifyProductID]);// Add this at the top level with other event handlers\nconst handleQuantityChange=event=>{// console.log(\"Quantity change event received:\", event.detail)\nsetProductQuantity(event.detail);};useEffect(()=>{if(isBrowser){window.addEventListener(\"FcQuantitySelectorchanges\",handleQuantityChange);// Cleanup\nreturn()=>{window.removeEventListener(\"FcQuantitySelectorchanges\",handleQuantityChange);};}},[isBrowser]);// Separate effect for ViewContent tracking - more reliable\nuseEffect(()=>{if(!isBrowser||!product||viewContentFired.current)return;// Wait for either activeVariant or at least one variant to be available\nconst hasVariantData=activeVariant||product.variants?.edges?.length>0;if(hasVariantData){// console.log('[ViewContent] Firing ViewContent event for product:', product.title);\ntrackFacebookPixelViewContent({variant:activeVariant||product.variants?.edges?.[0]?.node,product:product,currency:activeVariant?.price?.currencyCode||product.variants?.edges?.[0]?.node?.price?.currencyCode||\"USD\"});viewContentFired.current=true;}},[isBrowser,product,activeVariant]);useEffect(()=>{if(!isBrowser)return;const handleCurrencyChange=async event=>{const{countryCode}=event.detail;setCountryCode(countryCode);const existingCartId=localStorage.getItem(\"shopX_cart_id\");if(existingCartId){try{const updateData=await window.shopXtools.handleCartMutation(updateCartCurrency,{cartId:existingCartId,countryCode:countryCode});if(updateData?.cartBuyerIdentityUpdate?.cart){window.shopXtools.cart=updateData.cartBuyerIdentityUpdate.cart;window.dispatchEvent(new Event(\"shopXtools-cart-update\"));}else{window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:\"Failed to update cart with new country code\"}));}}catch(error){window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:error.message||\"Failed to update cart currency\"}));}}};window.addEventListener(\"currency_changed\",handleCurrencyChange);return()=>{window.removeEventListener(\"currency_changed\",handleCurrencyChange);};},[isBrowser]);// Load product data and set up event listeners\nuseEffect(()=>{if(!isBrowser)return;const handleSingleVariantProduct=productNode=>{if(!productNode)return false;const variants=get(productNode,\"variants.edges\",[]);if(variants.length===1){const variant=variants[0].node;setActiveVariant(variant);if(!isVariantManuallySelected){window.__fc_activeVariantId=variant.id;}setIsInStock(isVariantAvailable(variant));setNeedsVariantSelection(false);return true;}return false;};const handleProductData=_matchingProduct=>{// Early return if we already have this exact product loaded\nif(product&&product!==\"404\"){const currentProductId=product?.id;const incomingProductId=_matchingProduct?.node?.id;if(currentProductId&&incomingProductId&&currentProductId===incomingProductId){// console.log(\n//   '[handleProductData] Product already loaded, skipping update'\n// );\nreturn;}}// console.log(\n//   '[handleProductData] Processing product update',\n//   product,\n//   _matchingProduct\n// );\nif(_matchingProduct){const productNode=_matchingProduct.node;setProduct(productNode||\"404\");// Fetch order_max if we have a product handle\nif(productNode?.handle){fetchOrderMax(productNode.handle);}// If shopifyProductVariantId is provided, find and set that variant\nif(shopifyProductVariantId&&productNode){const variantId=`gid://shopify/ProductVariant/${shopifyProductVariantId}`;const matchingVariant=get(productNode,\"variants.edges\",[]).find(({node})=>node.id===variantId);if(matchingVariant){setActiveVariant(matchingVariant.node);if(!isVariantManuallySelected){window.__fc_activeVariantId=matchingVariant.node.id;}setIsInStock(isVariantAvailable(matchingVariant.node));setNeedsVariantSelection(false);return;// Exit early as we've found our variant\n}}// Immediately handle single variant products\nif(handleSingleVariantProduct(productNode)){return;// Exit early as we've handled the single variant\n}if(autoSelectFirst&&!isVariantManuallySelected){//console.log(\"Auto-selecting the first variant\");\nconst firstAvailableVariant=productNode.variants.edges.find(edge=>edge.node.availableForSale)?.node;if(firstAvailableVariant){setActiveVariant(firstAvailableVariant);if(!isVariantManuallySelected){window.__fc_activeVariantId=firstAvailableVariant.id;}setIsInStock(isVariantAvailable(firstAvailableVariant));setNeedsVariantSelection(false);return;// Exit early as we've set the active variant\n}}// For multi-variant products without a selected variant\nconst variants=get(productNode,\"variants.edges\",[]);const hasMultipleVariants=variants.length>1;const optionsCount=get(productNode,\"options\",[]).length||0;// Only update needsVariantSelection if we don't have an active variant.\n// This is to prevent the \"Select Variant\" button from showing when the variant is already selected.\nif(!activeVariant){if(!autoSelectFirst&&hasMultipleVariants){setNeedsVariantSelection(true);}else{setNeedsVariantSelection(!shopifyProductVariantId&&hasMultipleVariants);}}// Check if any variant is available\nconst anyVariantAvailable=variants.some(({node})=>isVariantAvailable(node));setIsInStock(anyVariantAvailable);// If nothing is available, do not prompt for variant selection\nif(!anyVariantAvailable){setNeedsVariantSelection(false);}}else{setProduct(\"404\");setIsInStock(false);}};// Check if we already have product data available\nif(window.shopXtools?.products&&Array.isArray(window.shopXtools.products)&&!product){const _matchingProduct=window.shopXtools.products.find(({node})=>node.id===`gid://shopify/Product/${shopifyProductID}`);if(_matchingProduct){// console.log(\n//   '[PURCHASE BUTTON] Found matching product on mount, loading it'\n// );\nhandleProductData(_matchingProduct);}else{// console.log(\n//   '[PURCHASE BUTTON] No matching product found in existing products'\n// );\n}}const productsReadyHandler=()=>{if(window?.shopXtools?.products){const matchingProduct=window.shopXtools.products.find(({node:product})=>product.id===`gid://shopify/Product/${shopifyProductID}`);// console.log(\n//   '[productsReadyHandler] Found matching product:',\n//   !!matchingProduct\n// );\n// Only update if we don't already have this product data loaded\nif(!product||product===\"404\"){// console.log(\n//   '[productsReadyHandler] No product loaded yet, calling handleProductData'\n// );\nhandleProductData(matchingProduct);}}};const variantChangeHandler=e=>{// Only update the variant if no shopifyProductVariantId is provided\n// console.log(\"Variant changed, active variant is\", e.detail)\nif(e.detail.productId!==`gid://shopify/Product/${shopifyProductID}`){return;}if(e.detail){// Normalize completeness: some dispatchers may omit isCompleteVariant.\nconst productOptions=get(product,\"options\",[])||[];const selectedArray=Array.isArray(e.detail.selectedOptions)?e.detail.selectedOptions:[];const selectedNames=new Set(selectedArray.map(o=>o?.name).filter(Boolean));const isCompleteFromNames=productOptions.length>0&&productOptions.every(opt=>selectedNames.has(opt.name));const isComplete=e.detail.isCompleteVariant===true||isCompleteFromNames;// If selection is partial, DO NOT treat it as an active variant for purchasing\nif(!isComplete){setIsVariantManuallySelected(true);setActiveVariant(null);window.__fc_activeVariantId=undefined;setNeedsVariantSelection(true);return;}// Complete selection – safe to treat as active variant\nsetActiveVariant(e.detail);setIsVariantManuallySelected(true);window.__fc_activeVariantId=e.detail.id;setIsInStock(e.detail.quantityAvailable>0);// console.log(\"e.detail.id\", e.detail.id)\n// console.log(\n//     \"window.__fc_activeVariantId\",\n//     window.__fc_activeVariantId\n// )\nconst cartQuantity=getCurrentCartQuantity(e.detail.id);// console.log(\"variantChangeHandler: cartQuantity\", cartQuantity)\n// if there's a cart item, it can reach the stock limit only if variant's quantityAvailable > 0\n// if variant's quantityAvailable = 0, it's out of stock, and we don't show 'limit reached' state\n// if variant's quantityAvailable < 0, continue selling when out of stock is enabled, so limit cannot ever be reached\nif(cartQuantity===e.detail.quantityAvailable&&e.detail.quantityAvailable>0){// console.log(\"variantChangeHandler: max reached\")\nsetMaxQuantityReached(true);}else{setMaxQuantityReached(false);}// When autoSelectFirst is false, we need to make sure all variants are selected\n// before changing the button state\n// Only mark selection as complete when all options are selected\nif(isComplete){setNeedsVariantSelection(false);}else{setNeedsVariantSelection(true);}}};document.addEventListener(\"data__products-ready\",productsReadyHandler);document.addEventListener(\"product__active-variant__changed\",variantChangeHandler);return()=>{document.removeEventListener(\"data__products-ready\",productsReadyHandler);document.removeEventListener(\"product__active-variant__changed\",variantChangeHandler);};},[shopifyProductID,shopifyProductVariantId,activeVariant,isBrowser,calculateTotalInventory,autoSelectFirst,product]);// Update variant selection state when activeVariant changes\nuseEffect(()=>{if(!product||product===\"404\")return;const variants=get(product,\"variants.edges\",[]);const hasMultipleVariants=variants.length>1;const noVariantSelected=!activeVariant&&!shopifyProductVariantId;// console.log('Variant selection state update:', {\n//     hasMultipleVariants,\n//     noVariantSelected,\n//     activeVariant,\n//     shopifyProductVariantId\n// })\nsetNeedsVariantSelection(hasMultipleVariants&&noVariantSelected);},[product,activeVariant,shopifyProductVariantId]);// Cart functionality\n// Add new state for order field validation\nconst[orderFieldError,setOrderFieldError]=useState(false);// Debug logging function\nconst logDebug=(message,data)=>{// Empty function - no logging\n};// Enhanced validation function with logging\nconst validateOrderField=()=>{if(!props.required){logDebug(\"Validation skipped - not required\",{required:props.required});return true;}const productSpecificKey=`fc_cart_attributes_${props.shopifyProductID}`;const storedAttributes=sessionStorage.getItem(productSpecificKey);logDebug(\"Checking stored attributes\",{productSpecificKey,hasStoredAttributes:!!storedAttributes});if(!storedAttributes){return false;}try{const parsedAttrs=JSON.parse(storedAttributes);// Check if any attribute has a non-empty value\nconst hasValidValue=Object.values(parsedAttrs).some(value=>value&&String(value).trim()!==\"\");logDebug(\"Validation result\",{attributes:parsedAttrs,isValid:hasValidValue});return hasValidValue;}catch(error){return false;}};// Effect to initialize validation state\nuseEffect(()=>{if(props.required){const isValid=validateOrderField();logDebug(\"Initial validation\",{isValid,required:props.required});setOrderFieldError(!isValid);}},[props.required,props.shopifyProductID]);// Listen for order field changes with logging\nuseEffect(()=>{if(props.required){const handleOrderFieldChange=event=>{logDebug(\"Order field change event received\",event.detail);const isValid=validateOrderField();setOrderFieldError(!isValid);logDebug(\"Order field validation updated\",{isValid,orderFieldError:!isValid});};window.addEventListener(\"orderFieldChanged\",handleOrderFieldChange);return()=>window.removeEventListener(\"orderFieldChanged\",handleOrderFieldChange);}},[props.required]);const[isInputRequired,setIsInputRequired]=useState(false);// Effect to check if the input field exists and is required\nuseEffect(()=>{const checkInputRequirement=()=>{const configKey=`fc_input_config_${shopifyProductID}`;const config=sessionStorage.getItem(configKey);// Only set as required if the config exists and required is true\nif(config){const{required}=JSON.parse(config);setIsInputRequired(required);}else{// If no config exists, the field isn't on the page\nsetIsInputRequired(false);}};checkInputRequirement();// Listen for config changes\nwindow.addEventListener(\"inputConfigChanged\",checkInputRequirement);return()=>window.removeEventListener(\"inputConfigChanged\",checkInputRequirement);},[shopifyProductID]);const getLineItem=()=>{const merchandiseId=activeVariant?.id||(props.shopifyProductVariantId?`gid://shopify/ProductVariant/${props.shopifyProductVariantId}`:null);if(!merchandiseId){throw new Error(\"No valid product variant selected\");}const lineItem={merchandiseId,quantity:productQuantity};// Add selling plan ID if a subscription is selected\nif(planSelected&&planSelected!==\"one-time\"){lineItem[\"sellingPlanId\"]=planSelected;}try{const productSpecificKey=`fc_cart_attributes_${props.shopifyProductID}`;const stored=sessionStorage.getItem(productSpecificKey);if(!stored)return lineItem;const data=JSON.parse(stored);// Get all attributes instead of just checking for specific ones\nconst attributes=[];// Process all key-value pairs in the stored data\nObject.entries(data).forEach(([key,value])=>{if(value&&String(value).trim()){attributes.push({key,value:String(value).trim()});}});// Only add attributes if we have any\nif(attributes.length>0){lineItem[\"attributes\"]=attributes;}}catch(e){console.error(\"Error adding attributes to cart item:\",e);}return lineItem;};// Fetch order_max from product metafields\nconst fetchOrderMax=useCallback(async productHandle=>{if(!productHandle)return;try{const metafieldsResponse=await window.shopXtools?.handleCartMutation?.(getProductMetafields,{handle:productHandle});const max=parseInt(metafieldsResponse?.product?.metafield_order_max?.value,10);if(!isNaN(max)&&max>0){setOrderMax(max);// console.log(\"Fetched order max\", max)\n}else{setOrderMax(0);}}catch(error){console.warn(\"Could not fetch product metafields for order_max:\",error);setOrderMax(0);}},[]);// Modify the getCurrentCartQuantity function to calculate per-product quantity\nconst getCurrentCartQuantity=useCallback(variantId=>{// if (!cartExistingData?.lines?.edges) {\n//     return 0\n// }\nconst liveCart=window?.shopXtools?.cart;setCartExistingData(liveCart);const liveEdges=liveCart?.lines?.edges;if(!liveEdges)return 0;// If we have a product handle, calculate per-product quantity\nif(product?.handle&&orderMax>0){const productVariantIds=get(product,\"variants.edges\",[]).map(({node})=>node.id);const totalQuantity=liveEdges.reduce((total,{node})=>{if(productVariantIds.includes(node.merchandise.id)){return total+node.quantity;}return total;},0);// console.log(\"getCurrentCartQuantity (per-product):\", totalQuantity)\nreturn totalQuantity;}// Fallback to variant-specific quantity\nconst quantity=liveEdges.reduce((total,{node})=>{if(node.merchandise.id===variantId){return total+node.quantity;}return total;},0);// console.log(\"getCurrentCartQuantity (per-variant):\", quantity)\nreturn quantity;},[product,orderMax]);const handleAddToCart=async()=>{try{if(!isBrowser)return;const variantId=activeVariant?.id||(props.shopifyProductVariantId?`gid://shopify/ProductVariant/${props.shopifyProductVariantId}`:null);const currentCartQuantity=getCurrentCartQuantity(variantId);// console.log(\"currentCartQuantity\", currentCartQuantity)\n// Check order_max from product metafields\nif(orderMax>0){// console.log(\"orderMax > 0\", orderMax)\n// Check if we've already reached the product limit\nif(currentCartQuantity>=orderMax){// console.log(\"currentCartQuantity >= orderMax: Max reached\")\nsetMaxQuantityReached(true);return;}}// Check quantityAvailable when orderMax is 0 or not set\nif(orderMax===0&&activeVariant&&activeVariant.quantityAvailable>0){// console.log(\"orderMax is 0, checking quantityAvailable\")\n// console.log(\"activeVariant.quantityAvailable\", activeVariant.quantityAvailable)\n// Check if we've already reached the available quantity\nif(currentCartQuantity>=activeVariant.quantityAvailable){// console.log(\"currentCartQuantity >= quantityAvailable: Max reached\")\nsetMaxQuantityReached(true);return;}}if(props.required||isInputRequired){const productSpecificKey=`fc_cart_attributes_${props.shopifyProductID}`;const storedAttributes=sessionStorage.getItem(productSpecificKey);const inputElement=document.querySelector(`[data-product-id=\"${props.shopifyProductID}\"]`);const currentInputValue=inputElement?.value||\"\";// Don't check for unsaved input if there's no input element or value\nif(inputElement&&currentInputValue&&storedAttributes){try{// Parse stored attributes\nconst parsedAttrs=JSON.parse(storedAttributes);// Check if the current input value is different from any of the stored attribute values\nconst valueIsSaved=Object.values(parsedAttrs).some(attrValue=>String(attrValue).trim()===currentInputValue.trim());if(!valueIsSaved){window.dispatchEvent(new CustomEvent(\"inputValidationFailed\",{detail:{productId:props.shopifyProductID,message:\"Please save your input before adding to cart\"}}));return;}}catch(e){// If we can't parse stored attributes, we can't validate\nwindow.dispatchEvent(new CustomEvent(\"inputValidationFailed\",{detail:{productId:props.shopifyProductID,message:\"Please fill in all required fields\"}}));return;}}// Now check if there are any stored attributes at all\nif(!storedAttributes){window.dispatchEvent(new CustomEvent(\"inputValidationFailed\",{detail:{productId:props.shopifyProductID,message:\"Please fill in all required fields\"}}));return;}// Finally check if any of the stored attributes has a valid value\ntry{const parsedAttrs=JSON.parse(storedAttributes);const hasValidValue=Object.values(parsedAttrs).some(value=>value&&String(value).trim()!==\"\");if(!hasValidValue){window.dispatchEvent(new CustomEvent(\"inputValidationFailed\",{detail:{productId:props.shopifyProductID,message:\"Please fill in all required fields\"}}));return;}}catch(e){window.dispatchEvent(new CustomEvent(\"inputValidationFailed\",{detail:{productId:props.shopifyProductID,message:\"Please fill in all required fields\"}}));return;}}const lines=[getLineItem()];// console.log(\"handleAddToCart lines:\", lines)\n// Retrieve the selected country code from localStorage\nconst countryCode=localStorage.getItem(\"selectedCountryCode\");let existingCartId=localStorage.getItem(\"shopX_cart_id\");if(!BuyNowATC){if(existingCartId){try{const cartValidation=await window.shopXtools.handleCartMutation(cartQuery,{cartId:existingCartId});if(!cartValidation?.cart){localStorage.removeItem(\"shopX_cart_id\");localStorage.removeItem(\"shopXtools.cart\");existingCartId=null;}}catch(error){localStorage.removeItem(\"shopX_cart_id\");localStorage.removeItem(\"shopXtools.cart\");existingCartId=null;}}if(!existingCartId){try{const cartData=await window.shopXtools.handleCartMutation(createCartMutation,{lines,countryCode:countryCode});if(cartData?.cartCreate?.cart?.id){localStorage.setItem(\"shopX_cart_id\",cartData.cartCreate.cart.id);localStorage.setItem(\"shopXtools.cart\",JSON.stringify(cartData.cartCreate.cart));window.shopXtools.cart=cartData.cartCreate.cart;setCartExistingData(window.shopXtools.cart);// Dispatch event after updating the cart\nwindow.dispatchEvent(new Event(\"shopXtools-cart-update\"));// Analytics\nconst currency=activeVariant?.price?.currencyCode||\"USD\";const value=parseFloat((parseFloat(activeVariant?.price?.amount||\"0\")*productQuantity).toFixed(2));const item_id=cleanShopifyId(activeVariant?.id);const item_name=product?.title||\"\";// const item_variant = activeVariant?.selectedOptions\n//     .map(opt => `${opt.name} ${opt.value}`)\n//     .join(\" / \") || null\nconst item_variant=activeVariant?.selectedOptions?activeVariant.selectedOptions.map(opt=>`${opt.name} ${opt.value}`).join(\" / \")||null:\"\";const price=parseFloat(activeVariant?.price?.amount||\"0\");// Google Analytics tracking (add_to_cart)\nif(item_id&&item_name&&item_variant&&price>0){const payload={currency,value,items:[{item_id,item_name,item_variant,price,item_brand:product?.vendor||null,item_category:product?.productType||null,quantity:productQuantity,// TagHound compatibility\nSKU:item_id,\"Item Name\":item_name}]};// console.log('[FC_ProductPurchaseButton ANALYTICS] About to fire add_to_cart with payload:', payload);\nif(typeof window.fcTrackGAEvent===\"function\"){window.fcTrackGAEvent(\"add_to_cart\",payload);// console.log('[FC_ProductPurchaseButton ANALYTICS] Fired add_to_cart:', payload.items[0]);\n}}else{console.warn(\"❌ Skipping add_to_cart: missing item data\",{item_id,item_name,item_variant,price,value});}// Meta Pixel tracking\ntrackFacebookPixelAddToCart({variant:activeVariant,product:product,quantity:productQuantity,currency:currency});window.shopXtools.dispatchEvent(\"checkout__changed\",{__triggerCartModal:openCart});}else{window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:\"Failed to add to cart\"}));}}catch(error){window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:error.message||\"Failed to create new cart\"}));}}else{const cartData=await window.shopXtools.handleCartMutation(addToCartMutation,{cartId:existingCartId,lines});if(cartData?.cartLinesAdd?.cart){localStorage.setItem(\"shopXtools.cart\",JSON.stringify(cartData.cartLinesAdd.cart));window.shopXtools.cart=cartData.cartLinesAdd.cart;// console.log(\"handleAddToCart cart:\", window.shopXtools.cart)\nsetCartExistingData(window.shopXtools.cart);// Dispatch event after updating the cart\nwindow.dispatchEvent(new Event(\"shopXtools-cart-update\"));// Google Analytics tracking\nconst currency=activeVariant?.price?.currencyCode||\"USD\";const value=parseFloat((parseFloat(activeVariant?.price?.amount||\"0\")*productQuantity).toFixed(2));const item_id=cleanShopifyId(activeVariant?.id);const item_name=product?.title||\"\";// const item_variant = activeVariant?.selectedOptions\n//     .map(opt => `${opt.name} ${opt.value}`)\n//     .join(\" / \") || null\nconst item_variant=activeVariant?.selectedOptions?activeVariant.selectedOptions.map(opt=>`${opt.name} ${opt.value}`).join(\" / \")||null:\"\";const price=parseFloat(activeVariant?.price?.amount||\"0\");// Google Analytics tracking (add_to_cart)\nif(item_id&&item_name&&item_variant&&price>0){const payload={currency,value,items:[{item_id,item_name,item_variant,price,item_brand:product?.vendor||null,item_category:product?.productType||null,quantity:productQuantity,// TagHound compatibility\nSKU:item_id,\"Item Name\":item_name}]};// console.log('[FC_ProductPurchaseButton ANALYTICS] About to fire add_to_cart with payload:', payload);\nif(typeof window.fcTrackGAEvent===\"function\"){window.fcTrackGAEvent(\"add_to_cart\",payload);// console.log('[FC_ProductPurchaseButton ANALYTICS] Fired add_to_cart:', payload.items[0]);\n}}else{console.warn(\"❌ Skipping add_to_cart: missing item data\",{item_id,item_name,item_variant,price,value});}// Meta Pixel tracking\ntrackFacebookPixelAddToCart({variant:activeVariant,product:product,quantity:productQuantity,currency:currency});window.shopXtools.dispatchEvent(\"checkout__changed\",{__triggerCartModal:openCart});}else{window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:\"Failed to add to cart\"}));}}}// Directly proceed to checkout without opening the cart modal\nif(BuyNowATC){//console.log(\"Directly proceeding to checkout without opening the cart modal\")\n// Create the cart and proceed to checkout\nconst variables={lines,countryCode:countryCode};//console.log(\"Sending mutation with variables:\", variables)\nconst result=await window[\"shopXtools\"]?.handleTemporaryCartMutation(createCartMutation,variables);//console.log(\"result:\", result)\nconst checkoutUrl=result.cartCreate.cart.checkoutUrl;if(checkoutUrl){//console.log(\"checkoutUrl:\", checkoutUrl)\nlet finalCheckoutUrl=checkoutUrl;if(finalCheckoutUrl){// Analytics\nconst currency=activeVariant?.price?.currencyCode||\"USD\";const value=parseFloat((parseFloat(activeVariant?.price?.amount||\"0\")*productQuantity).toFixed(2));const item_id=cleanShopifyId(activeVariant?.id);const item_name=product?.title||\"\";// const item_variant = activeVariant?.selectedOptions\n//     .map(opt => `${opt.name} ${opt.value}`)\n//     .join(\" / \") || null\nconst item_variant=activeVariant?.selectedOptions?activeVariant.selectedOptions.map(opt=>`${opt.name} ${opt.value}`).join(\" / \")||null:\"\";const price=parseFloat(activeVariant?.price?.amount||\"0\");// Google Analytics tracking (begin_checkout)\nif(item_id&&item_name&&item_variant&&price>0){const payload={currency,value,items:[{item_id,item_name,item_variant,price,item_brand:product?.vendor||null,item_category:product?.productType||null,quantity:productQuantity,// TagHound compatibility\nSKU:item_id,\"Item Name\":item_name}]};// console.log('[FC_ProductPurchaseButton ANALYTICS] About to fire begin_checkout with payload:', payload);\nif(typeof window.fcTrackGAEvent===\"function\"){window.fcTrackGAEvent(\"begin_checkout\",payload);// console.log('[FC_ProductPurchaseButton ANALYTICS] Fired begin_checkout:', payload.items[0]);\n}}else{console.warn(\"❌ Skipping begin_checkout: missing item data\",{item_id,item_name,item_variant,price,value});}// Meta Pixel tracking\ntrackFacebookPixelInitiateCheckout({variant:activeVariant,product:product,quantity:productQuantity,currency:currency,useBeacon:true});finalCheckoutUrl=appendAllTrackingParamsToUrl(finalCheckoutUrl);finalCheckoutUrl=appendLanguageToUrl(finalCheckoutUrl);window.location.assign(finalCheckoutUrl);}}else{window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:\"Failed to create cart for checkout\"}));}}if(lines[0].attributes){// const cartId = existingCartId || cartData?.cartCreate?.cart?.id;\nconst cartId=existingCartId//removed check for cartData\n;await window.shopXtools.handleCartMutation(updateCartAttributes,{cartId,attributes:lines[0].attributes});}}catch(error){window.dispatchEvent(new CustomEvent(\"errorChanged\",{detail:error.message||\"Failed to add item to cart\"}));}};// Update loading state when product data is received\nuseEffect(()=>{if(product){setIsLoading(false);}},[product]);// Initialize hasInitialized\nuseEffect(()=>{if(!hasInitialized&&(product||shopifyProductID)){// && (product || shopifyProductID) part ensures the button is rendered in Framer preview\n// Small delay to ensure we have all the necessary data\nconst timer=setTimeout(()=>{setHasInitialized(true);},50);return()=>clearTimeout(timer);}},[product]);// Handle loading state for canvas preview\nconst isDesignOrPreview=RenderTarget.current()===RenderTarget.canvas;let content=null;if(isDesignOrPreview){content=available?.[0]||null// Always show available state in canvas\n;}else if(!hasInitialized){content=null;}else if(maxQuantityReached&&maxQuantity?.[0]){content=maxQuantity?.[0]||null;}else if(!isInStock&&!activeVariant?.availableForSale||activeVariant&&!isVariantAvailable(activeVariant)||product&&!get(product,\"variants.edges\",[]).some(({node})=>isVariantAvailable(node))||props.required&&orderFieldError){// Prioritize Out of Stock over prompting variant selection\ncontent=OutOfStock?.[0]||null;}else if(needsVariantSelection){content=SelectVariant?.[0]||null;}else{content=available?.[0]||null;}// Near the bottom of the component where we create clonedElement\nconst canAddToCart=(isInStock||activeVariant&&activeVariant.availableForSale)&&!needsVariantSelection&&!maxQuantityReached&&(!props.required||!orderFieldError);const handleClick=e=>{if(canAddToCart){handleAddToCart();}};// Single consolidated effect for maxQuantityReached\nuseEffect(()=>{const variantId=activeVariant?.id||(props.shopifyProductVariantId?`gid://shopify/ProductVariant/${props.shopifyProductVariantId}`:null);// Always read from live cart to avoid stale state after updates\nconst currentQuantity=getCurrentCartQuantity(variantId);// console.log(\"currentQuantity\", currentQuantity)\nlet shouldBeAtMax=false;// Check orderMax first (takes precedence)\nif(orderMax>0){shouldBeAtMax=currentQuantity>=orderMax;// console.log(\"orderMax check - shouldBeAtMax:\", shouldBeAtMax)\n}else if(orderMax===0&&activeVariant){if(activeVariant.quantityAvailable>0&&activeVariant.availableForSale){// If no orderMax, check quantityAvailable\nshouldBeAtMax=currentQuantity>=activeVariant.quantityAvailable;// console.log(\"quantityAvailable check - shouldBeAtMax:\", shouldBeAtMax)\n}}if(shouldBeAtMax!==maxQuantityReached){// console.log(\"shouldBeAtMax !== maxQuantityReached\", maxQuantityReached, shouldBeAtMax)\nsetMaxQuantityReached(shouldBeAtMax);}},[orderMax,activeVariant,props.shopifyProductVariantId,maxQuantityReached,getCurrentCartQuantity]);// Add this effect near the other useEffect hooks\nuseEffect(()=>{if(orderMax>0){window.dispatchEvent(new CustomEvent(\"setMaxQuantity\",{detail:{productId:props.shopifyProductID,maxQuantity:orderMax}}));}},[orderMax,props.shopifyProductID]);// Add this effect to handle cart updates\nuseEffect(()=>{const variantId=activeVariant?.id||(props.shopifyProductVariantId?`gid://shopify/ProductVariant/${props.shopifyProductVariantId}`:null);const currentInCart=getCurrentCartQuantity(variantId);if(orderMax>0&&cartExistingData){// Handle orderMax scenario\nconst remainingAllowed=Math.max(0,orderMax-currentInCart);window.dispatchEvent(new CustomEvent(\"setMaxQuantity\",{detail:{productId:props.shopifyProductID,maxQuantity:remainingAllowed}}));// console.log(\"sending setMaxQuantity, orderMAx > 0 (cartExistingData)\", {\n//     detail: {\n//         productId: props.shopifyProductID,\n//         maxQuantity: remainingAllowed,\n//     },\n// })\n}else if(orderMax===0&&activeVariant&&cartExistingData){// console.log(\"cartExistingData, currentInCart\", cartExistingData, currentInCart)\nif(activeVariant.quantityAvailable>0&&activeVariant.availableForSale){// Handle quantityAvailable scenario\nconst remainingAllowed=Math.max(0,activeVariant.quantityAvailable-currentInCart);window.dispatchEvent(new CustomEvent(\"setMaxQuantity\",{detail:{productId:props.shopifyProductID,maxQuantity:remainingAllowed}}));// console.log(\"sending setMaxQuantity,  orderMAx = 0 (cartExistingData)\", {\n//     detail: {\n//         productId: props.shopifyProductID,\n//         maxQuantity: remainingAllowed,\n//     },\n// })\n}}},[cartExistingData,orderMax,activeVariant,props.shopifyProductVariantId,getCurrentCartQuantity,productQuantity]);// Effect to handle general cart updates\nuseEffect(()=>{const handleCartUpdate=()=>{// console.log(\"handleCartUpdate: Cart updated, refreshing purchase button state\")\n// Force recalculation of maxQuantityReached state\nconst variantId=activeVariant?.id||null;const currentQuantity=getCurrentCartQuantity(variantId);if(orderMax>0){const shouldBeAtMax=currentQuantity>=orderMax;setMaxQuantityReached(shouldBeAtMax);// console.log(\"handleCartUpdate: orderMax > 0, shouldBeAtMax:\", shouldBeAtMax)\n}else if(orderMax===0&&activeVariant&&activeVariant.quantityAvailable>0){const shouldBeAtMax=currentQuantity>=activeVariant.quantityAvailable;setMaxQuantityReached(shouldBeAtMax);// console.log(\"handleCartUpdate: orderMax = 0, shouldBeAtMax:\", shouldBeAtMax)\n}else{setMaxQuantityReached(false);// console.log(\"handleCartUpdate: resetting maxQuantityReached to false\")\n}const orderMaxRemainingAllowed=Math.max(0,orderMax-currentQuantity);// console.log(\"handleCartUpdate: orderMaxRemainingAllowed\", orderMaxRemainingAllowed)\nconst variantQnt=activeVariant?.quantityAvailable<=0&&activeVariant?.availableForSale?100:activeVariant?.quantityAvailable;// console.log(\"handleCartUpdate: variantQnt\", variantQnt)\nconst remainingAllowed=Math.max(0,variantQnt-currentQuantity);// console.log(\"handleCartUpdate: remainingAllowed\", remainingAllowed)\nwindow.dispatchEvent(new CustomEvent(\"setMaxQuantity\",{detail:{productId:props.shopifyProductID,maxQuantity:orderMax>0?orderMaxRemainingAllowed:remainingAllowed}}));// console.log(\"handleCartUpdate: sending setMaxQuantity\", {\n//     detail: {\n//         productId: props.shopifyProductID,\n//         maxQuantity: orderMax > 0 ? orderMaxRemainingAllowed : remainingAllowed,\n//     },\n// })\n};window.addEventListener(\"shopXtools-cart-update\",handleCartUpdate);return()=>window.removeEventListener(\"shopXtools-cart-update\",handleCartUpdate);},[activeVariant,orderMax,getCurrentCartQuantity,props.shopifyProductID]);useEffect(()=>{if(!isBrowser)return;const handleResize=()=>{if(typeof window!==\"undefined\"&&window.__fc_autoSelectFirst!==undefined){setAutoSelectFirst(window.__fc_autoSelectFirst);}if(typeof window!==\"undefined\"&&window.__fc_activeVariantId!==undefined){const storedId=window.__fc_activeVariantId;// console.log(\"storedId\", storedId)\nif(storedId){const variants=get(product,\"variants.edges\",[]);const found=variants.find(({node})=>node.id===storedId);// console.log(\"found\", found)\nif(found)setActiveVariant(found.node);// console.log(\"setting activeVariant\", found.node)\n}}if(product){const variants=get(product,\"variants.edges\",[]);const hasMultipleVariants=variants.length>1;// console.log(\"activeVariant\", activeVariant)\nif(autoSelectFirst){setNeedsVariantSelection(false);// console.log(\"handleResize: autoSelectFirst, setting needsVariantSelection to false\");\n}else if(activeVariant){// If a variant is already selected, don't require selection\nsetNeedsVariantSelection(false);// console.log(\"handleResize: activeVariant exists, setting needsVariantSelection to false\");\n}else if(!autoSelectFirst&&hasMultipleVariants){setNeedsVariantSelection(true);// console.log(\"handleResize: !autoSelectFirst && hasMultipleVariants\", autoSelectFirst, hasMultipleVariants);\n}else{setNeedsVariantSelection(!shopifyProductVariantId&&hasMultipleVariants);//console.log(\"handleResize: !shopifyProductVariantId && hasMultipleVariants\", shopifyProductVariantId, hasMultipleVariants);\n}}};window.addEventListener(\"resize\",handleResize);return()=>{window.removeEventListener(\"resize\",handleResize);};},[isBrowser,product,activeVariant,autoSelectFirst,shopifyProductVariantId]);const viewItemTrackedRef=useRef();const pageViewTrackedRef=useRef(false);// Single consolidated analytics effect\nuseEffect(()=>{if(!product)return;// Helper to extract brand and category if available\nconst item_brand=product.vendor||null;const item_category=product.productType||null;// Always fire page_view on initial load\nif(!pageViewTrackedRef.current){const productId=cleanShopifyId(product.id);const productName=product.title;const defaultVariant=get(product,\"variants.edges\",[])[0]?.node;let payload;if(defaultVariant){// Product with variants\npayload={currency:defaultVariant.price?.currencyCode||\"USD\",value:parseFloat(defaultVariant.price?.amount||\"0\"),items:[{item_id:cleanShopifyId(defaultVariant.id),item_name:productName,item_variant:defaultVariant.title,price:parseFloat(defaultVariant.price?.amount||\"0\"),item_brand,item_category,quantity:1,// TagHound compatibility\nSKU:cleanShopifyId(defaultVariant.id),\"Item Name\":productName}]};}else{// Product with no variants\npayload={currency:product.priceRange?.minVariantPrice?.currencyCode||\"USD\",value:parseFloat(product.priceRange?.minVariantPrice?.amount||\"0\"),items:[{item_id:productId,item_name:productName,price:parseFloat(product.priceRange?.minVariantPrice?.amount||\"0\"),item_brand,item_category,quantity:1,// TagHound compatibility\nSKU:productId,\"Item Name\":productName}]};}// We do not fire GA4 page_view manually; GA4 config handles it. Keep only view_item below.\npageViewTrackedRef.current=true;}// Fire view_item when variant is selected\nif(activeVariant&&product?.title){const item_id=cleanShopifyId(activeVariant.id);const item_name=product.title;// console.log(\"activeVariant\", activeVariant)\nconst item_variant=activeVariant?.selectedOptions?activeVariant.selectedOptions.map(opt=>`${opt.name} ${opt.value}`).join(\" / \")||null:\"\";const price=parseFloat(activeVariant.price?.amount||\"0\");const currency=activeVariant.price?.currencyCode||\"USD\";const value=price;// Only fire if all data is present and not already tracked for this variant\nif(item_id&&item_name&&item_variant&&price>0&&viewItemTrackedRef.current!==item_id){const payload={currency,value,items:[{item_id,item_name,item_variant,price,item_brand,item_category,quantity:1,// TagHound compatibility\nSKU:item_id,\"Item Name\":item_name}]};if(payload.items&&payload.items.length>0&&payload.items[0].item_id&&payload.items[0].item_name){window.fcTrackGAEvent&&window.fcTrackGAEvent(\"view_item\",payload);viewItemTrackedRef.current=item_id;}else{// Skipping view_item - invalid payload\n}}}},[product,activeVariant]);useEffect(()=>{// On state transition, blur any currently focused button that is about to be hidden\nconst focused=document.activeElement;if(focused&&focused.closest(\".fc-purchase-button-container\")){focused.blur();}},[content]);// Determine canvas preview content\nlet canvasContent=null;if(isDesignOrPreview){// If \"Available\" (Add to Cart) is connected, it dominates\nif(available?.[0]){canvasContent=available[0];}else if(SelectVariant?.[0]){canvasContent=SelectVariant[0];}else if(OutOfStock?.[0]){canvasContent=OutOfStock[0];}else if(maxQuantity?.[0]){canvasContent=maxQuantity[0];}else if(LoadingState?.[0]){canvasContent=LoadingState[0];}}// Check if we need to show \"Connect Instance\" in canvas\nconst hasAnyState=available?.[0]||SelectVariant?.[0]||OutOfStock?.[0]||maxQuantity?.[0]||LoadingState?.[0];if(isDesignOrPreview&&!hasAnyState){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:\"#666\",fontSize:\"14px\",border:\"1px dashed #ccc\",borderRadius:\"4px\"},children:\"Connect Instance\"});}const href=typeof window!==\"undefined\"?window.location.href:\"\";const isPreview=href.includes(\"framercanvas.com\")// projects in preview always run under the internal domain framercanvas.com\n;// Sanitize content instances before cloning\nconst sanitizedCanvasContent=canvasContent?sanitizeChildrenRecursively(canvasContent):null;const sanitizedLoadingState=LoadingState?.[0]?sanitizeChildrenRecursively(LoadingState[0]):null;const sanitizedContent=content?sanitizeChildrenRecursively(content):null;return /*#__PURE__*/_jsxs(\"div\",{style:{height:\"100%\",position:\"relative\"},role:\"none\",className:\"fc-purchase-button-container\",children:[/*#__PURE__*/_jsx(\"style\",{children:`\n                .fc-purchase-button-container :focus-visible {\n                    outline: ${props.focus.width}px solid ${props.focus.color} !important;\n                    outline-offset: ${props.focus.padding}px !important;\n                    border-radius: ${props.focus.radius}px !important;\n                }\n            `}),isDesignOrPreview?sanitizedCanvasContent&&/*#__PURE__*/cloneElement(sanitizedCanvasContent,{style:{...canvasContent?.props?.style||{},width:\"100%\",height:\"100%\",cursor:\"pointer\",outline:\"none\"},onClick:handleClick,role:\"button\",\"aria-label\":canvasContent===available?.[0]?props.BuyNowATC?\"Buy now\":\"Add to cart\":canvasContent===SelectVariant?.[0]?\"Select variant\":canvasContent===OutOfStock?.[0]?\"Out of stock\":canvasContent===maxQuantity?.[0]?\"Max quantity reached\":\"Loading\"}):isLoading&&!props.skipLoading&&sanitizedLoadingState&&!isPreview?/*#__PURE__*/cloneElement(sanitizedLoadingState,{style:{...LoadingState[0].props?.style||{},width:\"100%\",height:\"100%\",outline:\"none\"},role:\"status\",\"aria-label\":`Loading ${props.BuyNowATC?\"buy now\":\"add to cart\"} button`,\"aria-live\":\"polite\",tabIndex:-1}):sanitizedContent?/*#__PURE__*/cloneElement(sanitizedContent,{style:{...content?.props?.style||{},width:\"100%\",height:\"100%\",cursor:canAddToCart?\"pointer\":\"not-allowed\",outline:\"none\"},onClick:canAddToCart?handleClick:undefined,onKeyDown:canAddToCart?e=>{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();handleClick(e);}}:undefined,role:\"button\",\"aria-disabled\":!canAddToCart,\"aria-label\":content===available?.[0]?props.BuyNowATC?\"Buy now\":\"Add to cart\":content===SelectVariant?.[0]?\"Select variant\":content===OutOfStock?.[0]?\"Out of stock\":\"Max quantity reached\",tabIndex:hasInitialized?0:-1}):null]});}addPropertyControls(FC_ProductPurchaseButton,{shopifyProductID:{type:ControlType.String,title:\"Product ID\",description:\"Connect to CMS (required)\"},LoadingState:{type:ControlType.ComponentInstance,title:\"Loading\",hidden:props=>props.skipLoading,description:\"Display when product/variant is determining state to show.\"},available:{type:ControlType.ComponentInstance,title:\"Available\",description:\"Display when product/variant is available (Add to Cart or Buy Now).\"},SelectVariant:{type:ControlType.ComponentInstance,title:\"Select Variant\",description:\"Display when product/variant requires a variant selection.\"},OutOfStock:{type:ControlType.ComponentInstance,title:\"Out of Stock\",description:\"Display when product/variant is out of stock.\"},maxQuantity:{type:ControlType.ComponentInstance,title:\"Limit Reached\",description:\"Display when maximum cart quantity is reached.  \\n\\n –––– \\n\\n Connect each state to button component off-page. \\n\\n If you detatch the button component, you'll need to reconnect the states.\"},BuyNowATC:{title:\"Buy Now\",type:ControlType.Boolean,enabledTitle:\"Yes\",disabledTitle:\"No\",defaultValue:false},skipLoading:{title:\"Loading State\",type:ControlType.Boolean,enabledTitle:\"No\",disabledTitle:\"Yes\",defaultValue:false},openCart:{title:\"Trigger Cart\",description:\"If button is inside the cart, select No to keep the cart open.\",type:ControlType.Boolean,enabledTitle:\"Yes\",disabledTitle:\"No\",defaultValue:true,hidden:props=>props.BuyNowATC},focus:{type:ControlType.Object,title:\"Focus\",controls:{radius:{type:ControlType.Number,title:\"Radius\",defaultValue:0,min:0,max:100,step:1,displayStepper:true},width:{type:ControlType.Number,title:\"Width\",defaultValue:2,min:0,max:20,step:1,displayStepper:true},padding:{type:ControlType.Number,title:\"Padding\",defaultValue:2,min:0,max:20,step:1,displayStepper:true},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#007AFF\"}}},shopifyProductVariantId:{type:ControlType.String,title:\"Variant ID\",description:\"Advanced: Manually set a specific product variant ID (optional).\"}});// Utility to clean Shopify GID to just the numeric ID\nconst cleanShopifyId=gid=>gid?.split(\"/\").pop();\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FC_ProductPurchaseButton\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FC_ProductPurchaseButton.map","/*\n * Framer Commerce\n * Confidential and Proprietary - All Rights Reserved\n * Unauthorized use, reproduction, distribution, or disclosure of this\n * source code or any related information is strictly prohibited.\n *\n * This software is the exclusive property of Framer Commerce (\"Company\").\n * It is considered highly confidential and proprietary information.\n *\n * Any use, copying, modification, distribution, or sharing of this software,\n * in whole or in part, without the express written permission of the Company\n * is strictly prohibited and may result in legal action.\n *\n * DISCLAIMER: This software does not provide any express or\n * implied warranties, including, but not limited to, the implied warranties\n * of merchantability and fitness for a particular purpose. In no event shall\n * Framer Commerce be liable for any direct, indirect, incidental, special,\n * exemplary, or consequential damages (including, but not limited to, procurement\n * of substitute goods or services; loss of use, data, or profits; or business\n * interruption) however caused and on any theory of liability, whether in\n * contract, strict liability, or tort (including negligence or otherwise)\n * arising in any way out of the use of this software, even if advised of\n * the possibility of such damage.\n *\n * Any unauthorized possession, use, copying, distribution, or dissemination\n * of this software will be considered a breach of confidentiality and may\n * result in legal action.\n *\n * For inquiries, contact:\n * Framer Commerce\n * Email: hello@framercommerce.com\n *\n * © 2025 Butter Supply Inc. All Rights Reserved.\n */import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{useEffect,useState,useCallback}from\"react\";import{get}from\"lodash-es\";/**\n * @framerDisableUnlink\n */export default function FC_ProductVariantState(props){const{shopifyProductID,textTemplate}=props;const[product,setProduct]=useState();const[selectedOptions,setSelectedOptions]=useState({});// Move handler outside useEffect for better stability\nconst handleVariantSelection=useCallback(event=>{// Directly set the new selected options\nsetSelectedOptions(prev=>({...prev,[event.detail.optionName]:event.detail.value}));},[]);useEffect(()=>{if(window[\"shopXtools\"]&&Array.isArray(window[\"shopXtools\"].products)){const _matchingProduct=window[\"shopXtools\"].products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);setProduct(_matchingProduct?_matchingProduct.node:\"404\");}else{document.addEventListener(\"data__products-ready\",e=>{if(Array.isArray(e.detail.products)){const _matchingProduct=e.detail.products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);setProduct(_matchingProduct?_matchingProduct.node:\"404\");}});}document.addEventListener(\"variant_option_selected\",handleVariantSelection);return()=>{document.removeEventListener(\"variant_option_selected\",handleVariantSelection);};},[shopifyProductID,handleVariantSelection]);useEffect(()=>{const handleCurrencyChange=event=>{const{currency}=event.detail;if(window[\"shopXtools\"]&&Array.isArray(window[\"shopXtools\"].products)){const _matchingProduct=window[\"shopXtools\"].products.find(({node:_product})=>_product.id===`gid://shopify/Product/${shopifyProductID}`);if(_matchingProduct){setProduct(_matchingProduct.node);}}};window.addEventListener(\"currency_changed\",handleCurrencyChange);return()=>{window.removeEventListener(\"currency_changed\",handleCurrencyChange);};},[shopifyProductID]);const options=get(product,\"options\",[]);// Get remaining unselected options\nconst remainingOptions=options.filter(opt=>!selectedOptions[opt.name]).map(opt=>opt.name);// In Framer canvas or when shopXtools is not ready, show placeholder\nconst isFramerCanvas=typeof window===\"undefined\"||!window[\"shopXtools\"];const displayText=isFramerCanvas?textTemplate.replace(\"{{variant}}\",\"Size\"):remainingOptions.length===0?\"\":textTemplate.replace(\"{{variant}}\",remainingOptions.join(\", \"));// If no text to display, return empty div\nif(!displayText){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\"}});}return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\"},children:/*#__PURE__*/_jsx(\"p\",{style:{...props.font,color:props.color,margin:0,textAlign:\"center\",textTransform:props.textTransform},children:displayText})});}FC_ProductVariantState.defaultProps={shopifyProductID:\"\",textTemplate:\"Select {{variant}}\",textTransform:\"none\",color:\"#000000\"};addPropertyControls(FC_ProductVariantState,{shopifyProductID:{type:ControlType.String,title:\"Product ID\"},textTemplate:{type:ControlType.String,title:\"Format\",description:\"Use {{variant}} to insert the variant name\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#000000\"},textTransform:{type:ControlType.Enum,title:\"Transform\",options:[\"None\",\"Uppercase\",\"Lowercase\",\"Capitalize\"],defaultValue:\"none\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FC_ProductVariantState\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FC_ProductVariantState.map","/*\n * index (framer/default-utils@0.45.0)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/G4IfyjvwmaeSBpdb4TWu/OIjZRBmWDcIE2B6qgG1j/index.js\"\n","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{useRef,useEffect}from\"react\";import{addPropertyControls,ControlType,useAnimation,motion}from\"framer\";import{defaultEvents,useOnEnter,useOnExit}from\"https://framer.com/m/framer/default-utils.js@^0.45.0\";var Indicators;(function(Indicators){Indicators[\"DotWave\"]=\"Dots\";Indicators[\"Material\"]=\"Material\";Indicators[\"IOS\"]=\"iOS\";})(Indicators||(Indicators={}));const angleInRadians=angleInDegrees=>(angleInDegrees-90)*(Math.PI/180);const polarToCartesian=(centerX,centerY,radius,angleInDegrees)=>{const a=angleInRadians(angleInDegrees);return{x:centerX+radius*Math.cos(a),y:centerY+radius*Math.sin(a)};};const arc=(x,y,radius,startAngle,endAngle)=>{const fullCircle=endAngle-startAngle===360;const start=polarToCartesian(x,y,radius,endAngle-0.01);const end=polarToCartesian(x,y,radius,startAngle);const arcFlag=endAngle-startAngle<=180?\"0\":\"1\";let d=[\"M\",start.x,start.y,\"A\",radius,radius,0,arcFlag,0,end.x,end.y,].join(\" \");if(fullCircle)d+=\"z\";return d;};function Spinner({color}){const length=360;const endPercentage=length/360*100;const strokeWidth=10;const width=100;const height=100;return(/*#__PURE__*/ _jsxs(motion.div,{style:{height:\"85%\",width:\"85%\",position:\"relative\",originX:0.5,originY:0.5},animate:{rotate:360},transition:{loop:Infinity,ease:\"linear\",duration:0.5},children:[/*#__PURE__*/ _jsx(motion.svg,{style:{height:\"100%\",width:\"100%\",top:0,left:0,right:0,bottom:0,position:\"absolute\",WebkitMask:`conic-gradient(rgba(0, 0, 0, 0.0) 0%, rgba(0, 0, 0,1.0) ${endPercentage}%)`},viewBox:\"0 0 100 100\",children:/*#__PURE__*/ _jsx(\"g\",{transform:\"translate(0 0)\",children:/*#__PURE__*/ _jsx(\"path\",{d:arc(width/2,height/2,width/2-strokeWidth/2,0,length),fill:\"none\",stroke:color,strokeWidth:strokeWidth,strokeLinecap:\"round\"})})}),/*#__PURE__*/ _jsx(motion.svg,{style:{height:\"100%\",width:\"100%\",position:\"absolute\"},viewBox:\"0 0 100 100\",children:/*#__PURE__*/ _jsx(\"g\",{transform:\"translate(50 0)\",children:/*#__PURE__*/ _jsx(\"path\",{d:\"M 0 0 C 2.761 0 5 2.239 5 5 C 5 7.761 2.761 10 0 10 C 0 10 0 0 0 0 Z\",fill:color})})})]}));}// <path d=\"M 0 0 C 2.761 0 5 2.239 5 5 C 5 7.761 2.761 10 0 10 C 0 10 0 0 0 0 Z\" fill=\"#CCC\"></path>\n// function Spinner({ color }) {\n//     return (\n//         <svg style={{ height: \"85%\", width: \"85%\" }} viewBox=\"0 0 100 100\">\n//             <motion.g\n//                 transform=\"translate(3 3)\"\n//                 animate={{ rotate: 360 }}\n//                 transition={{ loop: Infinity, ease: \"linear\", duration: 1 }}\n//             >\n//                 {pathStrings.map((data, i) => {\n//                     return <path d={data} fill={color} opacity={i / pathStrings.length} />\n//                 })}\n//             </motion.g>\n//         </svg>\n//     )\n// }\nfunction DotWave({color,animation}){const circles=[0,1,2];const{delay,ease,duration,...animProps}=animation;const transition=animation.type===\"spring\"?animProps:{...animProps,ease,duration};// console.log(animProps)\nreturn(/*#__PURE__*/ _jsx(motion.svg,{style:{height:\"85%\",width:\"85%\"},viewBox:\"0 0 30 30\",variants:{show:{transition:{delayChildren:0.1,staggerChildren:0.12}}},animate:\"show\",children:circles.map(circle=>/*#__PURE__*/ _jsx(motion.circle,{style:{fill:color},variants:{hidden:{y:0},show:{y:[0,0,0,-10,0,0,0]}},transition:{...transition,yoyo:Infinity},r:3,cx:circle*10+5,cy:15},circle))}));}function Material({color,animation}){return(/*#__PURE__*/ _jsx(motion.svg,{style:{height:\"85%\",width:\"85%\",overflow:\"visible\",originX:\"50%\",originY:\"50%\"},animate:{rotate:360},transition:{ease:\"linear\",loop:Infinity,duration:2},viewBox:\"25 25 50 50\",children:/*#__PURE__*/ _jsx(motion.circle,{style:{stroke:color,strokeLinecap:\"round\"},animate:{strokeDasharray:[\"1, 200\",\"89, 200\",\"89, 200\"],strokeDashoffset:[0,-35,-124]},transition:{...animation,loop:Infinity,ease:\"easeInOut\"},cx:\"50\",cy:\"50\",r:\"20\",fill:\"none\",strokeWidth:2,strokeMiterlimit:\"10\"})}));}function IOS({color,animation}){const particles=12;// this was the death of me\nconst arrayRotate=(arr,n)=>arr.slice(n,arr.length).concat(arr.slice(0,n));const lines=[...new Array(particles)].map((l,i)=>0.9/particles*i+0.1).reverse();const lineOpacities=lines.map((l,i)=>arrayRotate(lines,i));return(/*#__PURE__*/ _jsx(motion.svg,{viewBox:\"-15 -15 30 30\",style:{width:\"100%\",height:\"100%\"},children:lineOpacities.map((lineKeyframes,i)=>/*#__PURE__*/ _jsx(motion.g,{initial:{opacity:lineKeyframes[0]},animate:{opacity:lineKeyframes},transition:{...animation,loop:Infinity,repeatDelay:0.0005},children:/*#__PURE__*/ _jsx(\"rect\",{style:{width:7,height:2,fill:color,transform:`rotate(${(particles-i)/particles*360-90}deg)`},x:5,y:-1,rx:1})},i))}));}function getIndicator(indicator,props){switch(indicator){case Indicators.DotWave:return(/*#__PURE__*/ _jsx(DotWave,{...props}));case Indicators.Material:return(/*#__PURE__*/ _jsx(Material,{...props}));case Indicators.IOS:return(/*#__PURE__*/ _jsx(IOS,{...props}));// case Indicators.Spinner:\n//     return <Spinner {...props} />\ndefault:return(/*#__PURE__*/ _jsx(DotWave,{...props}));}}export function handleTimeout(duration,callback){const id=setTimeout(callback,duration*1e3);return()=>clearTimeout(id);}/**\n * Loading\n *\n * @framerIntrinsicWidth 40\n * @framerIntrinsicHeight 40\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */ export function Loading(props){const{duration,onTimeout,fadeOut,hasDuration,indicator,onClick,onMouseDown,onMouseUp,onMouseEnter,onMouseLeave,style}=props;const controls=useAnimation();const animDuration=fadeOut?Math.min(duration,0.35):0;const animDelay=fadeOut?duration-animDuration:duration;const currentIndicator=getIndicator(indicator,props);const handlers=useRef([]);const onFadeOut=React.useCallback(()=>{if(hasDuration)controls.start({opacity:0,transition:{duration:animDuration,ease:\"easeIn\"}});},[hasDuration,animDuration]);const resetOpacity=async()=>{controls.set({opacity:1});};useOnEnter(()=>{resetOpacity();if(hasDuration)handlers.current=[handleTimeout(duration,onTimeout),handleTimeout(animDelay,onFadeOut),];});// Cancel all timers on exit.\nuseOnExit(()=>handlers.current.forEach(cleanup=>cleanup));// Cancel all timers on unmount.\nuseEffect(()=>()=>handlers.current.forEach(cleanup=>cleanup),[]);return(/*#__PURE__*/ _jsx(motion.div,{onClick,onMouseDown,onMouseUp,onMouseEnter,onMouseLeave,animate:controls,style:{position:\"relative\",overflow:\"show\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\",...style},children:currentIndicator}));}Loading.defaultProps={height:40,width:40,duration:2,color:\"#888\",animation:{type:\"tween\",ease:\"linear\",duration:1.3},hasDuration:false};// Learn more: https://framer.com/api/property-controls/\naddPropertyControls(Loading,{indicator:{title:\"Indicator\",type:ControlType.Enum,options:Object.keys(Indicators).map(i=>Indicators[i])},color:{type:ControlType.Color,defaultValue:\"#888\"},// transition: { title: \"Animation\", type: ControlType.Transition },\nhasDuration:{title:\"Duration\",type:ControlType.Boolean,defaultValue:Loading.defaultProps.hasDuration,enabledTitle:\"Timeout\",disabledTitle:\"Infinity\"},duration:{title:\"Time\",hidden:({hasDuration})=>!hasDuration,min:0.1,max:10,defaultValue:Loading.defaultProps.duration,type:ControlType.Number,step:0.1},animation:{type:ControlType.Transition},fadeOut:{title:\"Fade Out\",hidden:({hasDuration})=>!hasDuration,type:ControlType.Boolean,enabledTitle:\"Yes\",disabledTitle:\"No\"},onTimeout:{type:ControlType.EventHandler},...defaultEvents});\nexport const __FramerMetadata__ = {\"exports\":{\"handleTimeout\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Loading\":{\"type\":\"reactComponent\",\"name\":\"Loading\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"40\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicHeight\":\"40\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Loading.map"],"mappings":"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"}