{"version":3,"file":"Variant_selector.ChFPT2sj.mjs","names":["useMemo","maxParts","getBorderWidth","getBorderStyle","getBorderColor","adjustBorderRadius","useMemo"],"sources":["https:/framerusercontent.com/modules/YJSlZPJ3OtkgZ7JnMbkR/qItcTMFagKkirpMkCQFE/Utils.js","https:/framerusercontent.com/modules/9b4zJBr97cGoCaUw99YG/mYMxNWnPnF79VFqp28ni/Hooks.js","https:/framerusercontent.com/modules/W4tqGjcLIoIG56X9KCvh/6wkLFVa7zpWzB6rHAGSk/Placeholder_state.js","https:/framerusercontent.com/modules/8tz291z0qufTiAyO29YU/Kr5vJ3Xv73XfEHvqRwAS/Variant_button.js","https:/framerusercontent.com/modules/Yka9BTwP6pnUEgruT9LS/Jc9IxeCuGijc2VjPdP2l/Helpers.js","https:/framerusercontent.com/modules/iesOg5jXxMF9FWC1YGiR/9CoNgiGWRqpk9zxq4mQQ/Variant_image.js","https:/framerusercontent.com/modules/Meh2p99DzON6Pbyel14V/zbp8ctBe3ir0LOvQlk1s/Variant_color.js","https:/framerusercontent.com/modules/2trYS2Zee5YYYduPj7X7/pfVaUtL6iHwlSY7zupaE/Filtered_group_view.js","https:/framerusercontent.com/modules/O4SyIrImO0lFCBVnjE4R/xCT8RlCyQ7s7WqxnMCZD/Default_variant_view.js","https:/framerusercontent.com/modules/ZZZL9FqToObg8GkOUY1O/ICXv21qIF0a8KIg1LKyE/Variant_selector.js"],"sourcesContent":["// ------------------------------------------------------------ //\n// UTILITY FUNCTIONS\n// ------------------------------------------------------------ //\n/**\n * Split a variant title into option values by index\n */export function getOptionValuesFromTitle(title){if(!title)return[];return title.split(\" / \").map(s=>s.trim());}/**\n * Find the variant that matches a set of option values at all indices\n */export function findVariantByOptionValues(variants,optionValues){for(const v of variants){const parts=getOptionValuesFromTitle(v.title||\"\");let allMatch=true;for(let i=0;i<optionValues.length;i++){const desired=optionValues[i];if(!desired)continue;// skip unspecified\nif(String(parts[i]||\"\")!==String(desired)){allMatch=false;break;}}if(allMatch)return v;}return null;}/**\n * Extract image numbers for a given variant from the mapping string\n * Format: [img 1 ~ 123][img 2 ~ 456]\n */export function extractImageNumbersForVariant(mappingString,variantId){if(!mappingString||!variantId)return[];const result=[];const regex=/\\[img (\\d+) ~ (\\d+)\\]/g;let match;while((match=regex.exec(mappingString))!==null){const imageNum=match[1];const mappedVariantId=match[2];if(String(mappedVariantId)===String(variantId)){result.push(imageNum);}}return result;}/**\n * Dispatch gallery sync event for variant image selection\n */export function dispatchGallerySyncEvent(shopifyProductId,imageNumber){if(typeof window===\"undefined\")return;const evt=new CustomEvent(\"frameship_variant_image_selected\",{detail:{imageNumber,shopifyProductID:`gid://shopify/Product/${shopifyProductId}`}});document.dispatchEvent(evt);}\nexport const __FramerMetadata__ = {\"exports\":{\"extractImageNumbersForVariant\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getOptionValuesFromTitle\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"dispatchGallerySyncEvent\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"findVariantByOptionValues\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Utils.map","import{useMemo,useEffect}from\"react\";import{extractImageNumbersForVariant,dispatchGallerySyncEvent}from\"https://framerusercontent.com/modules/YJSlZPJ3OtkgZ7JnMbkR/qItcTMFagKkirpMkCQFE/Utils.js\";import{isBrowserFn}from\"https://framerusercontent.com/modules/0cFx6PDS8kp3yxNfnoIw/3wFcPS10LYSFljb1q710/Framer_utils.js\";// ------------------------------------------------------------ //\n// CUSTOM HOOKS\n// ------------------------------------------------------------ //\n/**\n * Parse CMS Variant Options from JSON string\n */export function useParsedVariantOptions(variantOptions){return useMemo(()=>{if(!variantOptions)return null;try{const parsed=JSON.parse(variantOptions);// transfrom the ID to the format gid://shopify/ProductOption/10535841136801\nconst transformed=parsed.map(option=>({...option,id:`gid://shopify/ProductOption/${option.id}`}));if(Array.isArray(transformed))return transformed;return null;}catch{return null;}},[variantOptions]);}/**\n * Infer option groups from variants or use CMS options\n */export function useInferredOptionGroups(variants,cmsVariantOptions){return useMemo(()=>{if(!variants.length)return[];// If CMS Variant Options are provided, trust their names and values\nif(cmsVariantOptions&&cmsVariantOptions.length>0){const maxParts=variants.reduce((m,v)=>{const parts=(v.title||\"\").split(\" / \");return Math.max(m,parts.length);},0);const limited=cmsVariantOptions.slice(0,maxParts);return limited.map((opt,idx)=>({index:idx,name:opt.name,values:Array.from(new Set(opt.values.map(v=>String(v)))).filter(Boolean)}));}// Fallback: infer groups as Option 1, Option 2, ... based on variant title parts\nconst maxParts=variants.reduce((m,v)=>{const parts=(v.title||\"\").split(\" / \");return Math.max(m,parts.length);},0);const groups=[];for(let i=0;i<maxParts;i++){groups.push({index:i,name:`Option ${i+1}`,values:new Set});}for(const v of variants){const parts=(v.title||\"\").split(\" / \");for(let i=0;i<maxParts;i++){const value=String(parts[i]||\"\").trim();if(value)groups[i].values.add(value);}}return groups.map(g=>({index:g.index,name:g.name,values:Array.from(g.values)}));},[variants,cmsVariantOptions]);}/**\n * Determine effective filter settings from props\n */export function useEffectiveFilter(filterGroups,filterGroupTitles,filterType){return useMemo(()=>{if(filterGroups)return filterGroups;const titles=(filterGroupTitles||\"\").split(\",\").map(t=>t.trim()).filter(Boolean);const type=filterType||\"all\";return{filterType:type,variantGroupTitles:titles};},[filterGroups,filterGroupTitles,filterType]);}/**\n * Find the target group based on filter settings\n */export function useTargetGroup(effectiveFilter,inferredOptionGroups){return useMemo(()=>{if(effectiveFilter.filterType!==\"contains\")return null;if(!effectiveFilter.variantGroupTitles?.length)return null;const wantedNames=effectiveFilter.variantGroupTitles.map(n=>n.toLowerCase());// Match by name (case-insensitive)\nconst byName=inferredOptionGroups.find(g=>wantedNames.includes(g.name.toLowerCase()));if(byName)return byName;// If no names match (e.g., inferred names like Option 1), allow using positional keywords \"Option 1\"\nconst byFallback=inferredOptionGroups.find(g=>wantedNames.includes(`option ${g.index+1}`));return byFallback||null;},[effectiveFilter,inferredOptionGroups]);}/**\n * Keep gallery in sync when selection changes\n */export function useGallerySync(variantImageMapping,selectedVariantId,shopifyProductId){const isBrowser=isBrowserFn();useEffect(()=>{if(!isBrowser)return;if(!variantImageMapping||!selectedVariantId||!shopifyProductId)return;const imageNumbersForVariant=extractImageNumbersForVariant(variantImageMapping,selectedVariantId);const firstImageNumber=imageNumbersForVariant[0];if(!firstImageNumber)return;dispatchGallerySyncEvent(shopifyProductId,Number(firstImageNumber));},[variantImageMapping,selectedVariantId,shopifyProductId,isBrowser]);}/**\n * Check if component should be hidden based on filter rules\n */export function useFilterVisibility(effectiveFilter,groupNamesLower){return useMemo(()=>{if(effectiveFilter.filterType===\"contains\"&&effectiveFilter.variantGroupTitles?.length){const wanted=effectiveFilter.variantGroupTitles.map(t=>t.toLowerCase());const hasMatch=groupNamesLower.some(n=>wanted.includes(n));if(!hasMatch)return false;}if(effectiveFilter.filterType===\"doesn't contain\"&&effectiveFilter.variantGroupTitles?.length){const blocked=effectiveFilter.variantGroupTitles.map(t=>t.toLowerCase());const hasBlocked=groupNamesLower.some(n=>blocked.includes(n));if(hasBlocked)return false;}return true;},[effectiveFilter,groupNamesLower]);}\nexport const __FramerMetadata__ = {\"exports\":{\"useTargetGroup\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useGallerySync\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useFilterVisibility\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useParsedVariantOptions\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useEffectiveFilter\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useInferredOptionGroups\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Hooks.map","import{jsx as _jsx}from\"react/jsx-runtime\";export function PlaceholderState(props){if(props.type===\"button\"&&props.buttonConfig){const{buttonConfig}=props;const font=buttonConfig.font||{};const defaultStyles=buttonConfig.defaultStyles||{};const gap=buttonConfig.gap||4;const buttonStyles={height:buttonConfig.height,width:buttonConfig.width,padding:buttonConfig.padding,borderRadius:buttonConfig.borderRadius,backgroundColor:defaultStyles.backgroundColor||\"#fff\",color:defaultStyles.textColor||\"#000\",border:defaultStyles.border?`${defaultStyles.border.borderWidth||1}px ${defaultStyles.border.borderStyle||\"solid\"} ${defaultStyles.border.borderColor||\"#ccc\"}`:\"1px solid #ccc\",fontFamily:font.fontFamily||\"inherit\",fontSize:font.fontSize?`${font.fontSize}px`:\"14px\",fontWeight:font.fontWeight||\"normal\",cursor:\"pointer\",transition:\"all 0.2s ease\",display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\"};return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",gap},children:[\"S\",\"M\",\"L\"].map(size=>/*#__PURE__*/_jsx(\"button\",{style:buttonStyles,\"aria-label\":`Select ${size} size`,children:size},size))});}if(props.type===\"image\"&&props.imageConfig){const{imageConfig}=props;const gap=imageConfig.gap||4;const border=imageConfig.border?.default||{};const imagePlaceholderStyles={width:imageConfig.width,height:imageConfig.height,borderRadius:imageConfig.borderRadius||\"6px\",backgroundColor:imageConfig.background||\"#f0f0f0\",border:border?`${border.borderWidth||1}px ${border.borderStyle||\"solid\"} ${border.borderColor||\"#ccc\"}`:\"1px solid #ccc\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:\"#999\",fontSize:\"12px\",fontWeight:\"500\",cursor:\"pointer\",transition:\"all 0.2s ease\"};return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",flexWrap:\"wrap\",gap},children:[1,2,3].map(i=>/*#__PURE__*/_jsx(\"div\",{style:imagePlaceholderStyles,\"aria-label\":`Placeholder variant ${i}`,children:i},i))});}if(props.type===\"color\"&&props.colorConfig){const{colorConfig}=props;const gap=colorConfig.gap||4;const border=colorConfig.border?.default||{};const colorPlaceholderStyles={width:colorConfig.size,height:colorConfig.size,borderRadius:colorConfig.borderRadius||\"50%\",border:border?`${border.borderWidth||1}px ${border.borderStyle||\"solid\"} ${border.borderColor||\"#ccc\"}`:\"1px solid #ccc\",display:\"block\",cursor:\"pointer\",transition:\"all 0.2s ease\"};const sampleColors=[\"#ff0000\",\"#00ff00\",\"#0000ff\"];return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",flexWrap:\"wrap\",gap},children:sampleColors.map((color,i)=>/*#__PURE__*/_jsx(\"div\",{style:{...colorPlaceholderStyles,backgroundColor:color},\"aria-label\":`Placeholder color swatch ${i+1}`},i))});}return null;}\nexport const __FramerMetadata__ = {\"exports\":{\"PlaceholderState\":{\"type\":\"reactComponent\",\"name\":\"PlaceholderState\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Placeholder_state.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{motion}from\"framer-motion\";// ------------------------------------------------------------ //\n// MAIN COMPONENT\n// ------------------------------------------------------------ //\nexport function VariantButton(props){const baseStyles=buildBaseButtonStyles(props.config);const animateStyles=props.isSelected?buildSelectedButtonStyles(props.config):buildDefaultButtonStyles(props.config);const hoverStyles=props.isSelected?{}:buildHoverButtonStyles(props.config);return /*#__PURE__*/_jsx(motion.button,{style:baseStyles,animate:animateStyles,onClick:props.onClick,\"aria-label\":props.ariaLabel,\"aria-pressed\":props.isSelected,whileHover:hoverStyles,whileTap:{scale:props.config.tapScale},transition:{duration:.15,ease:\"easeOut\"},children:props.label});}// ------------------------------------------------------------ //\n// UTILITY FUNCTIONS\n// ------------------------------------------------------------ //\n/**\n * Converts a BorderProps object to a CSS border string\n */function borderPropsToCss(borderProps){// If shorthand border is provided, use it\nif(borderProps.border){return borderProps.border;}// Otherwise, build from individual properties\nconst width=borderProps.borderWidth||0;const style=borderProps.borderStyle||\"solid\";const color=borderProps.borderColor||\"transparent\";return`${width}px ${style} ${color}`;}/**\n * Builds base CSSProperties that don't animate\n */function buildBaseButtonStyles(config){return{display:\"inline-flex\",alignItems:\"center\",justifyContent:\"center\",height:config.height,width:config.widthType===\"fit\"?\"fit-content\":config.widthType===\"fill\"?\"100%\":config.width,padding:config.padding,borderRadius:config.borderRadius,border:borderPropsToCss(config.defaultStyles.border),cursor:\"pointer\",...config.font};}/**\n * Builds animatable CSSProperties for default state\n */function buildDefaultButtonStyles(config){return{border:borderPropsToCss(config.defaultStyles.border),backgroundColor:config.defaultStyles.backgroundColor,color:config.defaultStyles.textColor};}/**\n * Builds animatable CSSProperties for selected state\n */function buildSelectedButtonStyles(config){return{border:borderPropsToCss(config.selectedStyles.border),backgroundColor:config.selectedStyles.backgroundColor,color:config.selectedStyles.textColor};}/**\n * Builds hover styles for animation\n */function buildHoverButtonStyles(config){return{border:borderPropsToCss(config.hoverStyles.border),backgroundColor:config.hoverStyles.backgroundColor,color:config.hoverStyles.textColor};}\nexport const __FramerMetadata__ = {\"exports\":{\"VariantButtonConfigProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"VariantButton\":{\"type\":\"reactComponent\",\"name\":\"VariantButton\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Variant_button.map","export const DEFAULT_PRODUCT_IMAGE=\"https://framerusercontent.com/images/oqyYSLXhERdfkDY5XMVyprSYO0.webp\";export const DEFAULT_PRODUCT_IMAGE_2=\"https://framerusercontent.com/images/ub17BCl84mP9KkiTTOme1UDyvk.webp\";export const DEFAULT_PRODUCT_IMAGE_3=\"https://framerusercontent.com/images/ORfm700yP1zckvftzPEQOe006k.webp\";export function extractImageNumbersForVariant(mappingString,variantId){if(!mappingString||!variantId)return[];const result=[];const regex=/\\[img (\\d+) ~ (\\d+)\\]/g;let match;while((match=regex.exec(mappingString))!==null){const imageNum=match[1];const mappedVariantId=match[2];if(String(mappedVariantId)===String(variantId)){result.push(imageNum);}}return result;}export function getVariantIdForImageNumber(mappingString,imageNumber){if(!mappingString||!imageNumber)return null;const regex=/\\[img (\\d+) ~ (\\d+)\\]/g;let match;while((match=regex.exec(mappingString))!==null){const imageNum=Number(match[1]);const variantId=match[2];if(imageNum===imageNumber)return variantId;}return null;}export function getObjectFit(objectFit){if(objectFit===\"fill\")return\"cover\";if(objectFit===\"fit\")return\"contain\";if(objectFit===\"stretch\")return\"fill\";return\"cover\";}\nexport const __FramerMetadata__ = {\"exports\":{\"getVariantIdForImageNumber\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_PRODUCT_IMAGE_3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_PRODUCT_IMAGE_2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getObjectFit\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_PRODUCT_IMAGE\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"extractImageNumbersForVariant\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Helpers.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{motion}from\"framer-motion\";import{getObjectFit}from\"https://framerusercontent.com/modules/Yka9BTwP6pnUEgruT9LS/Jc9IxeCuGijc2VjPdP2l/Helpers.js\";export function VariantImage(props){const{config,isSelected}=props;// Extract border properties\nconst defaultBorderWidth=getBorderWidth(config.border.default);const selectedBorderWidth=getBorderWidth(config.border.selected);const defaultBorderStyle=getBorderStyle(config.border.default);const selectedBorderStyle=getBorderStyle(config.border.selected);const defaultBorderColor=getBorderColor(config.border.default);const selectedBorderColor=getBorderColor(config.border.selected);// Calculate border widths to prevent layout shifts:\n// - Inner element always has the default border width (always visible)\n// - Wrapper has the \"extra\" width for selected state (transparent when not selected)\n// - Total border slot = max(defaultWidth, selectedWidth) — constant, no layout shift!\nconst innerWidth=defaultBorderWidth;const wrapperWidth=Math.max(0,selectedBorderWidth-defaultBorderWidth);// Total border slot for border radius calculation\nconst totalBorderSlot=innerWidth+wrapperWidth;// Wrapper div handles the \"extra\" border that appears when selected\n// Width is constant to prevent layout shifts, only color animates\nconst wrapperStyles={display:\"inline-flex\",borderRadius:config.borderRadius,borderWidth:wrapperWidth,borderStyle:selectedBorderStyle,cursor:\"pointer\"};// Inner element always shows the default border width\n// Color changes between default and selected\nconst imageStyles={width:config.width,height:config.height,objectFit:getObjectFit(config.imageFit),objectPosition:config.imageFit===\"fill\"?`${config?.focalPoint?.x??50}% ${config?.focalPoint?.y??50}%`:undefined,borderRadius:adjustBorderRadius(config.borderRadius,totalBorderSlot),borderWidth:innerWidth,borderStyle:isSelected?selectedBorderStyle:defaultBorderStyle,background:config.background||\"transparent\",display:\"block\",cursor:\"pointer\"};const borderTransition={duration:.2,ease:\"easeOut\"};function handleKeyDown(e){if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();props.onClick();}}return /*#__PURE__*/_jsx(motion.div,{style:wrapperStyles,animate:{// Wrapper border is transparent when not selected, colored when selected\n// Width stays constant (wrapperWidth) to prevent layout shifts\nborderColor:isSelected?selectedBorderColor:\"rgba(0, 0, 0, 0)\"},initial:false,whileTap:{scale:config.tapScale},transition:borderTransition,onClick:props.onClick,role:\"button\",tabIndex:0,\"aria-label\":props.ariaLabel,\"aria-pressed\":isSelected,onKeyDown:handleKeyDown,children:/*#__PURE__*/_jsx(motion.img,{src:props.src,alt:props.alt,style:imageStyles,initial:false,animate:{// Inner border color transitions between default and selected\n// Width stays constant (innerWidth = defaultBorderWidth)\nborderColor:isSelected?selectedBorderColor:defaultBorderColor},transition:borderTransition})});}// ------------------------------------------------------------ //\n// UTILITY FUNCTIONS\n// ------------------------------------------------------------ //\n/**\n * Extracts border width from BorderProps\n */function getBorderWidth(borderProps){if(borderProps.borderWidth!==undefined){return borderProps.borderWidth;}// Try to parse from shorthand border string\nif(borderProps.border){const match=borderProps.border.match(/^(\\d+(?:\\.\\d+)?)/);if(match){return parseFloat(match[1]);}}return 1;// fallback\n}/**\n * Extracts border style from BorderProps\n */function getBorderStyle(borderProps){if(borderProps.borderStyle){return borderProps.borderStyle;}// Try to parse from shorthand border string\nif(borderProps.border){const parts=borderProps.border.split(\" \");// Border shorthand is typically \"width style color\"\nif(parts.length>=2){return parts[1];}}return\"solid\";// fallback\n}/**\n * Extracts border color from BorderProps\n */function getBorderColor(borderProps){if(borderProps.borderColor){return borderProps.borderColor;}// Try to parse from shorthand border string\nif(borderProps.border){const parts=borderProps.border.split(\" \");// Border shorthand is typically \"width style color\"\nif(parts.length>=3){return parts.slice(2).join(\" \");}}return\"transparent\";}/**\n * Adjusts border radius to account for nested border\n * Subtracts the offset from numeric values to keep corners aligned\n */function adjustBorderRadius(borderRadius,offset){// Handle simple numeric values like \"8px\" or \"8\"\nconst match=borderRadius.match(/^(\\d+(?:\\.\\d+)?)(px|%|em|rem)?$/);if(match){const value=parseFloat(match[1]);const unit=match[2]||\"px\";const adjusted=Math.max(0,value-offset);return`${adjusted}${unit}`;}// For complex values, return as-is\nreturn borderRadius;}\nexport const __FramerMetadata__ = {\"exports\":{\"VariantImage\":{\"type\":\"reactComponent\",\"name\":\"VariantImage\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"VariantImageConfigProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Variant_image.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{motion}from\"framer-motion\";// ------------------------------------------------------------ //\n// VARIANT COLOR COMPONENT\n// ------------------------------------------------------------ //\nexport function VariantColor(props){const{config,isSelected,colorValue}=props;// Extract border properties\nconst defaultBorderWidth=getBorderWidth(config.border.default);const selectedBorderWidth=getBorderWidth(config.border.selected);const defaultBorderStyle=getBorderStyle(config.border.default);const selectedBorderStyle=getBorderStyle(config.border.selected);const defaultBorderColor=getBorderColor(config.border.default);const selectedBorderColor=getBorderColor(config.border.selected);// Calculate border widths to prevent layout shifts:\n// - Inner element always has the default border width (always visible)\n// - Wrapper has the \"extra\" width for selected state (transparent when not selected)\n// - Total border slot = max(defaultWidth, selectedWidth) — constant, no layout shift!\nconst innerWidth=defaultBorderWidth;const wrapperWidth=Math.max(0,selectedBorderWidth-defaultBorderWidth);// Total border slot for border radius calculation\nconst totalBorderSlot=innerWidth+wrapperWidth;// Wrapper div handles the \"extra\" border that appears when selected\n// Width is constant to prevent layout shifts, only color animates\nconst wrapperStyles={display:\"inline-flex\",borderRadius:config.borderRadius,borderWidth:wrapperWidth,borderStyle:selectedBorderStyle,cursor:\"pointer\"};// Inner element always shows the default border width\n// Color changes between default and selected\nconst swatchStyles={width:config.size,height:config.size,borderRadius:adjustBorderRadius(config.borderRadius,totalBorderSlot),backgroundColor:colorValue||\"#cccccc\",borderWidth:innerWidth,borderStyle:isSelected?selectedBorderStyle:defaultBorderStyle,display:\"block\",padding:0,margin:0,cursor:\"pointer\"};const borderTransition={duration:.2,ease:\"easeOut\"};function handleKeyDown(e){if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();props.onClick();}}return /*#__PURE__*/_jsx(motion.div,{style:wrapperStyles,animate:{// Wrapper border is transparent when not selected, colored when selected\n// Width stays constant (wrapperWidth) to prevent layout shifts\nborderColor:isSelected?selectedBorderColor:\"rgba(0, 0, 0, 0)\"},initial:false,whileTap:{scale:config.tapScale},transition:borderTransition,onClick:props.onClick,role:\"button\",tabIndex:0,\"aria-label\":props.ariaLabel,\"aria-pressed\":isSelected,onKeyDown:handleKeyDown,children:/*#__PURE__*/_jsx(motion.button,{style:swatchStyles,initial:false,animate:{// Inner border color transitions between default and selected\n// Width stays constant (innerWidth = defaultBorderWidth)\nborderColor:isSelected?selectedBorderColor:defaultBorderColor},transition:borderTransition})});}// ------------------------------------------------------------ //\n// UTILITY FUNCTIONS\n// ------------------------------------------------------------ //\n/**\n * Extracts border width from BorderProps\n */function getBorderWidth(borderProps){if(borderProps.borderWidth!==undefined){return borderProps.borderWidth;}// Try to parse from shorthand border string\nif(borderProps.border){const match=borderProps.border.match(/^(\\d+(?:\\.\\d+)?)/);if(match){return parseFloat(match[1]);}}return 1;// fallback\n}/**\n * Extracts border style from BorderProps\n */function getBorderStyle(borderProps){if(borderProps.borderStyle){return borderProps.borderStyle;}// Try to parse from shorthand border string\nif(borderProps.border){const parts=borderProps.border.split(\" \");// Border shorthand is typically \"width style color\"\nif(parts.length>=2){return parts[1];}}return\"solid\";// fallback\n}/**\n * Extracts border color from BorderProps\n */function getBorderColor(borderProps){if(borderProps.borderColor){return borderProps.borderColor;}// Try to parse from shorthand border string\nif(borderProps.border){const parts=borderProps.border.split(\" \");// Border shorthand is typically \"width style color\"\nif(parts.length>=3){return parts.slice(2).join(\" \");}}return\"transparent\";}/**\n * Adjusts border radius to account for nested border\n * Subtracts the offset from numeric values to keep corners aligned\n */function adjustBorderRadius(borderRadius,offset){// Handle simple numeric values like \"8px\" or \"8\"\nconst match=borderRadius.match(/^(\\d+(?:\\.\\d+)?)(px|%|em|rem)?$/);if(match){const value=parseFloat(match[1]);const unit=match[2]||\"px\";const adjusted=Math.max(0,value-offset);return`${adjusted}${unit}`;}// For complex values like \"50%\", return as-is\nreturn borderRadius;}\nexport const __FramerMetadata__ = {\"exports\":{\"VariantColor\":{\"type\":\"reactComponent\",\"name\":\"VariantColor\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"VariantColorConfigProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Variant_color.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{getOptionValuesFromTitle,findVariantByOptionValues}from\"https://framerusercontent.com/modules/YJSlZPJ3OtkgZ7JnMbkR/qItcTMFagKkirpMkCQFE/Utils.js\";import{VariantButton}from\"https://framerusercontent.com/modules/8tz291z0qufTiAyO29YU/Kr5vJ3Xv73XfEHvqRwAS/Variant_button.js\";import{VariantImage}from\"https://framerusercontent.com/modules/iesOg5jXxMF9FWC1YGiR/9CoNgiGWRqpk9zxq4mQQ/Variant_image.js\";import{VariantColor}from\"https://framerusercontent.com/modules/Meh2p99DzON6Pbyel14V/zbp8ctBe3ir0LOvQlk1s/Variant_color.js\";export function FilteredGroupView(props){const{targetGroup,variants,selectedVariantId,onVariantSelect,type,effectiveFilter,gap,buttonConfig,imageConfig,colorConfig,colorMapping,wrap}=props;function getColorValueForOptionValue(optionValue){if(!colorMapping||colorMapping.length===0){return\"#cccccc\";}const mapping=colorMapping.find(m=>m.colorName===optionValue);return mapping?.colorValue||\"#cccccc\";}// Check if we should hide when only one option is available\nconst whenSingleImage=effectiveFilter.whenSingleImage||\"hide\";if(whenSingleImage===\"hide\"&&targetGroup.values.length===1){return null;}const selectedVariant=variants.find(v=>v.id===selectedVariantId);const selectedParts=getOptionValuesFromTitle(selectedVariant?.title||\"\");// For each value in the target group, pick a representative variant\nconst items=targetGroup.values.map(value=>{// Determine if this value is selected\nconst isSelectedValue=String(selectedParts[targetGroup.index]||\"\")===String(value);// Choose representative variant: keep other option values from selected variant when possible\nlet representative=null;if(selectedParts.length){const desired=[...selectedParts];desired[targetGroup.index]=value;representative=findVariantByOptionValues(variants,desired);}if(!representative){// Fallback to first variant matching just this group's value\nrepresentative=variants.find(v=>{const parts=getOptionValuesFromTitle(v.title||\"\");return String(parts[targetGroup.index]||\"\")===String(value);})||null;}const handleSelect=()=>{if(!representative)return;onVariantSelect(representative.id);};const key=`${targetGroup.name}-${value}`;const ariaLabel=`Select ${String(value)} ${targetGroup.name}`;if(type===\"image\"){return /*#__PURE__*/_jsx(VariantImage,{src:representative?.image?.url,alt:representative?.image?.altText||String(value),isSelected:isSelectedValue,onClick:handleSelect,ariaLabel:ariaLabel,config:imageConfig},key);}if(type===\"color\"){const colorValue=getColorValueForOptionValue(String(value));return /*#__PURE__*/_jsx(VariantColor,{colorValue:colorValue,colorName:String(value),isSelected:isSelectedValue,onClick:handleSelect,ariaLabel:ariaLabel,config:colorConfig},key);}return /*#__PURE__*/_jsx(VariantButton,{label:String(value),isSelected:isSelectedValue,onClick:handleSelect,ariaLabel:ariaLabel,config:buttonConfig},key);});return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",flexWrap:wrap?\"wrap\":\"nowrap\",gap:gap},children:items});}\nexport const __FramerMetadata__ = {\"exports\":{\"FilteredGroupView\":{\"type\":\"reactComponent\",\"name\":\"FilteredGroupView\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","import{jsx as _jsx}from\"react/jsx-runtime\";import{VariantButton}from\"https://framerusercontent.com/modules/8tz291z0qufTiAyO29YU/Kr5vJ3Xv73XfEHvqRwAS/Variant_button.js\";import{VariantImage}from\"https://framerusercontent.com/modules/iesOg5jXxMF9FWC1YGiR/9CoNgiGWRqpk9zxq4mQQ/Variant_image.js\";import{VariantColor}from\"https://framerusercontent.com/modules/Meh2p99DzON6Pbyel14V/zbp8ctBe3ir0LOvQlk1s/Variant_color.js\";import{getOptionValuesFromTitle}from\"https://framerusercontent.com/modules/YJSlZPJ3OtkgZ7JnMbkR/qItcTMFagKkirpMkCQFE/Utils.js\";export function DefaultVariantView(props){const{variants,selectedVariantId,onVariantSelect,type,gap,buttonConfig,imageConfig,colorConfig,colorMapping,wrap}=props;function getColorValueForVariant(variant){if(!colorMapping||colorMapping.length===0){return\"#cccccc\";}// Get the first option value from the variant title\n// For color variants, we assume the first option is the color\nconst optionValues=getOptionValuesFromTitle(variant.title||\"\");const colorName=optionValues[0]||\"\";// Find matching color mapping\nconst mapping=colorMapping.find(m=>m.colorName===colorName);return mapping?.colorValue||\"#cccccc\";}return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",flexWrap:wrap?\"wrap\":\"nowrap\",gap:gap},children:variants.map(variant=>{const isSelected=selectedVariantId===variant.id;const ariaLabel=`Select ${variant.title} variant`;if(type===\"image\"){return /*#__PURE__*/_jsx(VariantImage,{src:variant.image?.url,alt:variant.image?.altText||variant.title,isSelected:isSelected,onClick:()=>onVariantSelect(variant.id),ariaLabel:ariaLabel,config:imageConfig},variant.id);}if(type===\"color\"){const optionValues=getOptionValuesFromTitle(variant.title||\"\");const colorName=optionValues[0]||variant.title;const colorValue=getColorValueForVariant(variant);return /*#__PURE__*/_jsx(VariantColor,{colorValue:colorValue,colorName:colorName,isSelected:isSelected,onClick:()=>onVariantSelect(variant.id),ariaLabel:ariaLabel,config:colorConfig},variant.id);}return /*#__PURE__*/_jsx(VariantButton,{label:variant.title,isSelected:isSelected,onClick:()=>onVariantSelect(variant.id),ariaLabel:ariaLabel,config:buttonConfig},variant.id);})});}\nexport const __FramerMetadata__ = {\"exports\":{\"DefaultVariantView\":{\"type\":\"reactComponent\",\"name\":\"DefaultVariantView\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","import{jsx as _jsx}from\"react/jsx-runtime\";import{useMemo}from\"react\";import{addPropertyControls,ControlType}from\"framer\";import{useProductSelectionStore}from\"https://framerusercontent.com/modules/8l7kldZFdo4Q33wHQBGB/yNIABzdTP3fu4mWtyAdp/Product_selection_store.js\";import{parseShopifyData}from\"https://framerusercontent.com/modules/Vu8sM3DwKDdSi2bltsPi/Uam6NjjQgBdbM2uxwvNZ/Parse_shopify_data.js\";import{isOnFramerCanvasFn}from\"https://framerusercontent.com/modules/0cFx6PDS8kp3yxNfnoIw/3wFcPS10LYSFljb1q710/Framer_utils.js\";import{useParsedVariantOptions,useInferredOptionGroups,useEffectiveFilter,useTargetGroup,useGallerySync,useFilterVisibility}from\"https://framerusercontent.com/modules/9b4zJBr97cGoCaUw99YG/mYMxNWnPnF79VFqp28ni/Hooks.js\";import{extractImageNumbersForVariant,dispatchGallerySyncEvent}from\"https://framerusercontent.com/modules/YJSlZPJ3OtkgZ7JnMbkR/qItcTMFagKkirpMkCQFE/Utils.js\";import{PlaceholderState}from\"https://framerusercontent.com/modules/W4tqGjcLIoIG56X9KCvh/6wkLFVa7zpWzB6rHAGSk/Placeholder_state.js\";import{FilteredGroupView}from\"https://framerusercontent.com/modules/2trYS2Zee5YYYduPj7X7/pfVaUtL6iHwlSY7zupaE/Filtered_group_view.js\";import{DefaultVariantView}from\"https://framerusercontent.com/modules/O4SyIrImO0lFCBVnjE4R/xCT8RlCyQ7s7WqxnMCZD/Default_variant_view.js\";import{SHARED_COLORS}from\"https://framerusercontent.com/modules/Nrs4jz2AAEOfEZRQEQij/7Ao2SBt1Ssf683HHXgzl/Shared_styles.js\";import{SHOPIFY_DATA_DESCRIPTION,SUPPORT_CONTROL,VARIANT_IMAGE_MAPPING_DESCRIPTION,VARIANT_OPTIONS_DESCRIPTION}from\"https://framerusercontent.com/modules/G9UZNzEc4NZQrMJzPvWx/tl22i1lNtmmpBOq8EDe4/Shared_props.js\";// ------------------------------------------------------------ //\n// MAIN COMPONENT\n// ------------------------------------------------------------ //\n/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerDisableUnlink\n */export default function VariantSelector(props){// Parse and prepare data (must happen before any early returns for hooks)\nconst shopifyData=parseShopifyData(props.shopifyData||\"\");const hasMultipleVariants=(shopifyData?.variants?.length||0)>1;const variants=shopifyData?.variants||[];// Get selection state (all hooks must be called unconditionally)\nconst selectedVariantId=useProductSelectionStore(state=>state.getSelectedVariant(shopifyData?.id,variants));const setSelectedVariant=useProductSelectionStore(state=>state.setSelectedVariant);// Parse CMS variant options and infer groups\nconst cmsVariantOptions=useParsedVariantOptions(props.variantOptions);const inferredOptionGroups=useInferredOptionGroups(variants,cmsVariantOptions);// Determine filter settings and target group\nconst effectiveFilter=useEffectiveFilter(props.filterGroups,props.filterGroupTitles,props.filterType);const targetGroup=useTargetGroup(effectiveFilter,inferredOptionGroups);// Check filter visibility rules\nconst groupNamesLower=useMemo(()=>inferredOptionGroups.map(g=>g.name.toLowerCase()),[inferredOptionGroups]);const isVisible=useFilterVisibility(effectiveFilter,groupNamesLower);// Keep gallery in sync with variant selection\nuseGallerySync(props.variantImageMapping,selectedVariantId,shopifyData?.id);// Now we can do conditional rendering (after all hooks)\nconst isOnFramerCanvas=isOnFramerCanvasFn();// Show placeholder when on Framer canvas without data\nif(isOnFramerCanvas&&!props.shopifyData){return /*#__PURE__*/_jsx(PlaceholderState,{type:props.type,buttonConfig:props.buttonConfig,imageConfig:props.imageConfig,colorConfig:props.colorConfig});}// Handle variant selection\nfunction handleVariantSelect(variantId){setSelectedVariant(shopifyData?.id,variantId);// Dispatch gallery sync event if mapping exists\nif(typeof window===\"undefined\")return;if(!props.variantImageMapping||!shopifyData?.id)return;const imageNumbersForVariant=extractImageNumbersForVariant(props.variantImageMapping,variantId);const firstImageNumber=imageNumbersForVariant[0];if(firstImageNumber){dispatchGallerySyncEvent(shopifyData.id,Number(firstImageNumber));}}// Early returns for edge cases\nif(!isVisible)return null;if(!hasMultipleVariants)return null;const gap=props.type===\"button\"?props.buttonConfig.gap:props.type===\"image\"?props.imageConfig.gap:props.colorConfig.gap;// Render filtered group view when filter is active\nif(effectiveFilter.filterType===\"contains\"&&targetGroup){return /*#__PURE__*/_jsx(FilteredGroupView,{targetGroup:targetGroup,variants:variants,selectedVariantId:selectedVariantId,onVariantSelect:handleVariantSelect,type:props.type,effectiveFilter:effectiveFilter,gap:gap,wrap:props.buttonConfig.wrap,buttonConfig:props.buttonConfig,imageConfig:props.imageConfig,colorConfig:props.colorConfig,colorMapping:props.colorMapping});}// Render default view (all variants)\nreturn /*#__PURE__*/_jsx(DefaultVariantView,{variants:variants,selectedVariantId:selectedVariantId,onVariantSelect:handleVariantSelect,type:props.type,gap:gap,wrap:props.buttonConfig.wrap,buttonConfig:props.buttonConfig,imageConfig:props.imageConfig,colorConfig:props.colorConfig,colorMapping:props.colorMapping});}// ------------------------------------------------------------ //\n// PROPERTY CONTROLS\n// ------------------------------------------------------------ //\naddPropertyControls(VariantSelector,{shopifyData:{type:ControlType.String,description:SHOPIFY_DATA_DESCRIPTION},variantImageMapping:{type:ControlType.String,title:\"Variant Image Mapping\",description:VARIANT_IMAGE_MAPPING_DESCRIPTION},variantOptions:{type:ControlType.String,title:\"Variant Options\",description:VARIANT_OPTIONS_DESCRIPTION},type:{type:ControlType.Enum,options:[\"button\",\"image\",\"color\"],optionTitles:[\"Button\",\"Image\",\"Color\"],defaultValue:\"button\",displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},buttonConfig:{type:ControlType.Object,title:\"🎨 Styling\",buttonTitle:\"Colors, Padding, etc.\",controls:{widthType:{type:ControlType.Enum,title:\"Width Type\",options:[\"fit\",\"fill\",\"fixed\"],optionTitles:[\"Fit\",\"Fill\",\"Fixed\"],defaultValue:\"fixed\",displaySegmentedControl:true},width:{type:ControlType.Number,title:\"Width\",defaultValue:40,min:1,step:1,unit:\"px\",hidden:props=>props.widthType!==\"fixed\"},height:{type:ControlType.Number,title:\"Height\",defaultValue:30,min:1,step:1,unit:\"px\"},padding:{// @ts-expect-error - Padding is not a valid control type in this Framer npm version\ntype:ControlType.Padding,title:\"Padding\",defaultValue:\"0px\"},borderRadius:{// @ts-expect-error - BorderRadius is not a valid control type in this Framer npm version\ntype:ControlType.BorderRadius,title:\"Radius\",defaultValue:\"6px\"},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\"},defaultStyles:{type:ControlType.Object,title:\"🎨 Default Styles\",buttonTitle:\"Colors, Border\",controls:{backgroundColor:{type:ControlType.Color,title:\"Background Color\",defaultValue:SHARED_COLORS.background},textColor:{type:ControlType.Color,title:\"Text Color\",defaultValue:SHARED_COLORS.foreground},border:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Border\",defaultValue:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}}}},selectedStyles:{type:ControlType.Object,title:\"🎨 Selected Styles\",buttonTitle:\"Colors, Border\",controls:{backgroundColor:{type:ControlType.Color,title:\"Background Color\",defaultValue:SHARED_COLORS.foreground},textColor:{type:ControlType.Color,title:\"Text Color\",defaultValue:SHARED_COLORS.background},border:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Border\",defaultValue:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}}}},hoverStyles:{type:ControlType.Object,title:\"🎨 Hover Styles\",buttonTitle:\"Colors, Border\",controls:{backgroundColor:{type:ControlType.Color,title:\"Background Color\",defaultValue:SHARED_COLORS.backgroundHover},textColor:{type:ControlType.Color,title:\"Text Color\",defaultValue:SHARED_COLORS.foreground},border:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Border\",defaultValue:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}}},description:\"Only applies when the button is not selected\"},tapScale:{type:ControlType.Number,title:\"Tap Scale\",defaultValue:.98,min:0,max:1,step:.01},gap:{type:ControlType.Number,title:\"Gap\",defaultValue:4,min:0,max:100,step:1,unit:\"px\"},wrap:{type:ControlType.Boolean,title:\"Wrap Layout\",defaultValue:true}},defaultValue:{padding:\"8px 16px 8px 16px\",borderRadius:6,defaultStyles:{backgroundColor:SHARED_COLORS.background,textColor:SHARED_COLORS.foreground,border:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}},selectedStyles:{backgroundColor:SHARED_COLORS.foreground,textColor:SHARED_COLORS.background,border:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}},hoverStyles:{backgroundColor:SHARED_COLORS.backgroundHover,textColor:SHARED_COLORS.foreground,border:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}},gap:4,wrap:true},hidden:props=>props.type!==\"button\"},imageConfig:{type:ControlType.Object,title:\"🎨 Styling\",buttonTitle:\"Size, Fit, Border, etc.\",controls:{width:{type:ControlType.Number,title:\"Width\",defaultValue:60,min:20,max:200,step:1},height:{type:ControlType.Number,title:\"Height\",defaultValue:60,min:20,max:200,step:1},imageFit:{type:ControlType.Enum,title:\"Image Fit\",options:[\"fill\",\"fit\",\"stretch\"],optionTitles:[\"Fill\",\"Fit\",\"Stretch\"],defaultValue:\"fill\"},focalPoint:{type:ControlType.Object,title:\"Focal Point\",buttonTitle:\"X, Y Position\",controls:{x:{type:ControlType.Number,title:\"X Position\",defaultValue:50,min:0,max:100,step:1,unit:\"%\",description:\"Horizontal focal point (0% = left, 100% = right)\"},y:{type:ControlType.Number,title:\"Y Position\",defaultValue:50,min:0,max:100,step:1,unit:\"%\",description:\"Vertical focal point (0% = top, 100% = bottom)\"}},hidden:props=>props.imageFit!==\"fill\",defaultValue:{x:50,y:50}},borderRadius:{// @ts-expect-error - BorderRadius is not a valid control type in this Framer npm version\ntype:ControlType.BorderRadius,title:\"Border Radius\",defaultValue:\"6px\"},background:{type:ControlType.Color,title:\"Background Color\",defaultValue:\"transparent\"},border:{type:ControlType.Object,title:\"Border\",controls:{default:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Default Border\",defaultValue:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}},selected:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Selected Border\",defaultValue:{borderWidth:2,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}}}},gap:{type:ControlType.Number,title:\"Gap\",defaultValue:4,min:0,max:100,step:1,unit:\"px\"},wrap:{type:ControlType.Boolean,title:\"Wrap Layout\",defaultValue:true},tapScale:{type:ControlType.Number,title:\"Tap Scale\",defaultValue:.98,min:0,max:1,step:.01}},defaultValue:{width:60,height:60,imageFit:\"fill\",focalPoint:{x:50,y:50},borderRadius:\"6px\",background:\"transparent\",border:{default:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover},selected:{borderWidth:2,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}},gap:4,wrap:true},hidden:props=>props.type!==\"image\"},colorMapping:{type:ControlType.Array,title:\"Color Mapping\",description:\"Map all Shopify variant option color names to color values\",control:{type:ControlType.Object,controls:{colorName:{type:ControlType.String,title:\"Color Name\",description:\"Must match exactly the Shopify option value\"},colorValue:{type:ControlType.Color,title:\"Color\"}}},hidden:props=>props.type!==\"color\"},colorConfig:{type:ControlType.Object,title:\"🎨 Styling\",buttonTitle:\"Size, Border, etc.\",controls:{size:{type:ControlType.Number,title:\"Size\",defaultValue:32,min:20,max:100,step:1,unit:\"px\"},borderRadius:{// @ts-expect-error - BorderRadius is not a valid control type in this Framer npm version\ntype:ControlType.BorderRadius,title:\"Border Radius\",defaultValue:\"50%\"},border:{type:ControlType.Object,title:\"Border\",controls:{default:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Default Border\",defaultValue:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover}},selected:{// @ts-expect-error - Border is not a valid control type in this Framer npm version\ntype:ControlType.Border,title:\"Selected Border\",defaultValue:{borderWidth:2,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}}}},gap:{type:ControlType.Number,title:\"Gap\",defaultValue:4,min:0,max:100,step:1,unit:\"px\"},tapScale:{type:ControlType.Number,title:\"Tap Scale\",defaultValue:.98,min:0,max:1,step:.01}},defaultValue:{size:40,borderRadius:\"50%\",border:{default:{borderWidth:1,borderStyle:\"solid\",borderColor:SHARED_COLORS.backgroundHover},selected:{borderWidth:2,borderStyle:\"solid\",borderColor:SHARED_COLORS.foreground}},gap:4,tapScale:.98},hidden:props=>props.type!==\"color\"},filterType:{type:ControlType.Enum,options:[\"all\",\"contains\",\"doesn't contain\"],optionTitles:[\"All\",\"Contains\",\"Doesn't contain\"],defaultValue:\"all\"},filterGroupTitles:{type:ControlType.String,title:\"Filter Group Titles\",description:\"e.g. Color, Size, etc. Must match the title of the Shopify variant group exactly.\",hidden:props=>props.filterType===\"all\"},...SUPPORT_CONTROL});VariantSelector.displayName=\"Variant Selector\";\nexport const __FramerMetadata__ = {\"exports\":{\"VariantSelectorProps\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"VariantSelector\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"any\"}},\"ColorMapping\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}