{"version":3,"file":"Randomizeorder.B1y1RdY9.mjs","names":["React.useState","React.useRef"],"sources":["https:/framerusercontent.com/modules/il7kGJTqu7hR98mse1Ut/w6ZfAPHOxYaula4syZeA/BackButton.js","https:/framerusercontent.com/modules/Q1AN3P0VMART3klo8Cz9/y3E544hSGTjnwlYW0aHj/Randomizeorder.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";// ---------------------------------------------------------------------------\n// BackButton\n// ---------------------------------------------------------------------------\n// A persistent \"go back\" control, safe to place once in a shared header /\n// site layout so it appears on every page automatically. Calls the\n// browser's native history.back() — takes the visitor to whatever page and\n// scroll position they were actually on before, exactly like a browser's\n// own back button.\n//\n// This is completely separate from a Product Page's own \"Previous / Next\"\n// product navigation at the bottom — those move between CMS items in a\n// collection; this moves through the browser's session history. They don't\n// share any logic and can't interfere with each other.\n//\n// On the very first page of a session (nothing to go back to), it hides\n// itself rather than showing a dead-end button.\n// ---------------------------------------------------------------------------\n// Must match the key CategoryFilterBar.tsx writes to — this is how a\n// product page finds out which exact Shop URL (category + subcategory) the\n// visitor actually came from, deterministically, rather than guessing via\n// the browser's native history stack.\nconst LAST_SHOP_URL_KEY=\"vestra:lastShopUrl:v1\";// Must match the key ShopArrivalVeil.tsx reads — set right before we\n// navigate to a remembered Shop URL, so that component knows to mask the\n// brief static-snapshot flash on arrival rather than showing it.\nconst VEIL_FLAG_KEY=\"vestra:arrivalVeil:v1\";function readRememberedShopUrl(){if(typeof window===\"undefined\")return\"\";try{return window.sessionStorage.getItem(LAST_SHOP_URL_KEY)||\"\";}catch(e){return\"\";}}export function BackButton(props){const{label,textColor,borderColor,hoverBorderColor,hideOnEntryPage,debug}=props;const[canGoBack,setCanGoBack]=React.useState(true);const[hovered,setHovered]=React.useState(false);// REINFORCEMENT: Framer's site turns out to be a HYBRID — some\n// navigations are soft SPA content-swaps, others are genuine full page\n// reloads (confirmed by watching the browser console fully clear on\n// some back-navigations but not others). That means the browser's\n// native back-history for this site can't be trusted to land\n// somewhere sensible or even consistent. Rather than keep depending on\n// history.back(), this button first checks for a URL that\n// CategoryFilterBar explicitly remembered (the exact last Shop page\n// state — category and subcategory — the visitor was actually on) and\n// jumps straight there directly when one exists and it isn't just the\n// page you're already on. Only when nothing is remembered (e.g. the\n// visitor arrived from somewhere other than a filtered Shop view) does\n// this fall back to the browser's native back().\nconst go=()=>{const remembered=readRememberedShopUrl();const here=typeof window!==\"undefined\"?window.location.pathname+window.location.search:\"\";if(debug){console.log(`[BB] CLICK — remembered=\"${remembered}\" here=\"${here}\" history.length=${typeof window!==\"undefined\"?window.history.length:\"?\"}`);}if(remembered&&remembered!==here){if(debug)console.log(`[BB] navigating directly to remembered URL`);try{window.sessionStorage.setItem(VEIL_FLAG_KEY,\"1\");}catch(e){}window.location.href=remembered;return;}if(debug)console.log(`[BB] no useful remembered URL — falling back to history.back()`);if(typeof window!==\"undefined\")window.history.back();};// Re-checked on every render (no dependency array), not just at mount —\n// same defensive pattern as above: a component that persists across a\n// soft page-swap shouldn't get stuck with a stale answer.\nReact.useEffect(()=>{if(typeof window===\"undefined\")return;setCanGoBack(window.history.length>1||!!readRememberedShopUrl());});if(hideOnEntryPage&&!canGoBack)return null;return /*#__PURE__*/_jsxs(\"div\",{role:\"button\",tabIndex:0,onClick:go,onKeyDown:e=>{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();go();}},onMouseEnter:()=>setHovered(true),onMouseLeave:()=>setHovered(false),style:{display:\"inline-flex\",alignItems:\"center\",gap:8,padding:\"10px 18px\",borderRadius:999,border:\"1px solid \"+(hovered?hoverBorderColor:borderColor),background:\"transparent\",color:textColor,fontFamily:\"Switzer, Inter, sans-serif\",fontSize:13,letterSpacing:\"0.04em\",textTransform:\"uppercase\",cursor:\"pointer\",userSelect:\"none\",boxSizing:\"border-box\",width:\"fit-content\"},children:[/*#__PURE__*/_jsxs(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",strokeWidth:\"2\",strokeLinecap:\"round\",strokeLinejoin:\"round\",children:[/*#__PURE__*/_jsx(\"path\",{d:\"M19 12H5\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M12 19l-7-7 7-7\"})]}),label]});}BackButton.defaultProps={label:\"Back\",textColor:\"rgba(245,243,238,0.92)\",borderColor:\"rgba(245,243,238,0.32)\",hoverBorderColor:\"#C7F34A\",hideOnEntryPage:true,debug:true};addPropertyControls(BackButton,{label:{type:ControlType.String,title:\"Label\"},textColor:{type:ControlType.Color,title:\"Text Color\"},borderColor:{type:ControlType.Color,title:\"Border Color\"},hoverBorderColor:{type:ControlType.Color,title:\"Hover Border Color\"},hideOnEntryPage:{type:ControlType.Boolean,title:\"Hide If Nothing To Go Back To\",description:\"Hides the button on a visitor's very first page (e.g. arriving from Google), where there's genuinely nowhere to go back to within the site.\"},debug:{type:ControlType.Boolean,title:\"Debug Logging\",description:\"Logs to the browser console (prefixed [BB]). Turn off once behavior is confirmed correct.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"BackButton\":{\"type\":\"reactComponent\",\"name\":\"BackButton\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BackButton.map","import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";// ---------------------------------------------------------------------------\n// RandomizeOrder — v2\n// ---------------------------------------------------------------------------\n// REWRITE RATIONALE: v1 reordered cards by physically moving their DOM\n// nodes (appendChild). That broke a scroll-triggered reveal animation\n// elsewhere on this site (built on the Lenis smooth-scroll library),\n// which tracks each card by its ORIGINAL position in the document —\n// moving a card's actual DOM node desynced that animation for whichever\n// card got moved, leaving it stuck mid-transition (visually huge,\n// misplaced, or stretched).\n//\n// This version never moves anything in the DOM. It only sets the CSS\n// `order` property on each card — a standard flex/grid layout property\n// that changes VISUAL position without touching document structure at\n// all. Every card stays exactly where it always was in the DOM, so any\n// other script tracking original positions (scroll animations included)\n// keeps working correctly, while the on-screen order still changes\n// exactly as intended.\n//\n// Randomizes the VISUAL display order of a Collection List's repeated\n// cards — without touching your CMS data, its sort order, or any other\n// component on the page.\n//\n// SAFE TO USE ALONGSIDE CategoryFilterBar / ProductVisibilityFilter: this\n// component sets `order` exactly once on mount and never watches for\n// further DOM changes, so it can't loop or fight with those components'\n// own MutationObservers.\n//\n// PLACEMENT: drop this ONCE as a direct child of the grid/list wrapper you\n// want randomized — e.g. the Shop All grid, a homepage category section's\n// grid, or the \"You may also like\" grid on product pages. One instance\n// per grid, same convention as ProductVisibilityFilter: it finds the grid\n// by climbing up from its own position in the layer tree.\n//\n// REQUIREMENTS:\n//  - The repeated card element inside the grid needs a consistent Layer\n//    name (default \"Product Card\") so this can find every card via\n//    Framer's auto-generated data-framer-name attribute.\n//  - The grid container itself must be a flex or CSS grid layout (which\n//    every Framer Stack / Collection List already is) — that's what makes\n//    the `order` property have any effect. If it isn't, this safely does\n//    nothing rather than falling back to the DOM-moving approach that\n//    caused the animation glitch.\n//\n// CANVAS: does nothing on Framer's editing canvas — card order there\n// always stays exactly as laid out. Only Preview and the published site\n// get randomized.\n//\n// CAVEATS WORTH KNOWING:\n//  - If a grid uses pagination or lazy-loads more cards on scroll, this\n//    only shuffles whatever's already rendered at mount time — cards\n//    loaded later won't be mixed in retroactively.\n//  - Stays consistent for one browsing session: the same shuffle order\n//    persists across page views (via sessionStorage) as long as the\n//    number of cards in this grid doesn't change, so someone bouncing\n//    between pages doesn't see the order jump around mid-visit. Closing\n//    the tab/browser (or a genuinely new session) gets a fresh shuffle.\n//    If the card count changes (e.g. a product added/removed), this\n//    automatically falls back to a fresh shuffle for that grid.\n// ---------------------------------------------------------------------------\nfunction climb(el,levels){let cur=el;for(let i=0;i<levels;i++){if(!cur.parentElement)break;cur=cur.parentElement;}return cur;}function shuffle(arr){const a=arr.slice();for(let i=a.length-1;i>0;i--){const j=Math.floor(Math.random()*(i+1));const tmp=a[i];a[i]=a[j];a[j]=tmp;}return a;}function shuffledIndices(length){const idx=Array.from({length},(_,i)=>i);return shuffle(idx);}function isValidPermutation(candidate,length){if(!Array.isArray(candidate))return false;if(candidate.length!==length)return false;const seen=new Set;for(const v of candidate){if(typeof v!==\"number\"||v<0||v>=length||seen.has(v)){return false;}seen.add(v);}return true;}function sessionKeyFor(storageKey){const path=typeof window!==\"undefined\"?window.location.pathname:\"\";return`vestra:randomizeOrder:v1:${storageKey}:${path}`;}function readStoredOrder(key,length){if(typeof window===\"undefined\")return null;try{const raw=window.sessionStorage.getItem(key);if(!raw)return null;const parsed=JSON.parse(raw);return isValidPermutation(parsed,length)?parsed:null;}catch(e){return null;}}function writeStoredOrder(key,order){if(typeof window===\"undefined\")return;try{window.sessionStorage.setItem(key,JSON.stringify(order));}catch(e){// storage unavailable (private mode, quota, etc.) — fail silently,\n// this just means every load reshuffles fresh instead of persisting\n}}/**\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicWidth 1\n * @framerIntrinsicHeight 1\n */export function RandomizeOrder(props){const{scopeAncestorLevels,cardLayerName,storageKey,debug}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const selfRef=React.useRef(null);const hasRun=React.useRef(false);React.useLayoutEffect(()=>{if(isCanvas)return;if(hasRun.current)return;hasRun.current=true;const selfEl=selfRef.current;if(!selfEl)return;const gridRoot=climb(selfEl,scopeAncestorLevels);if(!gridRoot){if(debug)console.log(\"[Randomize] no gridRoot found — bailing\");return;}if(debug){// Same diagnostic pattern as ProductVisibilityFilter: scan every\n// ancestor level and report how many cards each one contains,\n// so the correct Scope Ancestor Levels value is readable\n// directly from the console.\nconsole.log(`[Randomize] --- scope level scan ---`);for(let lvl=0;lvl<=10;lvl++){const testRoot=climb(selfEl,lvl);const testCards=testRoot.querySelectorAll(`[data-framer-name=\"${cardLayerName}\"]`);console.log(`[Randomize] level ${lvl}: ${testCards.length} match(es)`,testRoot);}console.log(`[Randomize] --- end scan (use the level where the match count equals your card count) ---`);}const cards=Array.from(gridRoot.querySelectorAll(`[data-framer-name=\"${cardLayerName}\"]`));if(debug){console.log(`[Randomize] gridRoot:`,gridRoot,`\n[Randomize] found ${cards.length} card(s) matching \"${cardLayerName}\"`);}if(cards.length<2)return;const containerDisplay=window.getComputedStyle(gridRoot).display;const supportsOrder=containerDisplay===\"flex\"||containerDisplay===\"inline-flex\"||containerDisplay===\"grid\"||containerDisplay===\"inline-grid\";if(!supportsOrder){if(debug){console.log(`[Randomize] gridRoot's computed display is \"${containerDisplay}\", not flex/grid — the CSS \"order\" property has no effect here, so skipping rather than falling back to moving DOM nodes (which caused a scroll-animation glitch on this site previously). If this grid genuinely needs randomizing, let me know and we'll look at why it isn't flex/grid.`);}return;}const key=sessionKeyFor(storageKey);let indices=readStoredOrder(key,cards.length);let source=\"stored\";if(!indices){indices=shuffledIndices(cards.length);writeStoredOrder(key,indices);source=\"fresh\";}if(debug){console.log(`[Randomize] session key: \"${key}\" — using ${source} order:`,indices);}// Set CSS `order` on each card to its new visual rank — this never\n// touches the DOM structure itself, only paint/layout order, so\n// anything else tracking these elements by their original DOM\n// position (scroll animations included) is completely unaffected.\nindices.forEach((originalCardIndex,newVisualPosition)=>{cards[originalCardIndex].style.order=String(newVisualPosition);});if(debug){console.log(`[Randomize] applied order to ${indices.length} card(s)`);}},[scopeAncestorLevels,cardLayerName,storageKey,debug,isCanvas]);if(isCanvas){return /*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",alignItems:\"center\",justifyContent:\"center\",width:\"100%\",height:\"100%\",minHeight:24,background:\"rgba(199,243,74,0.12)\",border:\"1px dashed #C7F34A\",color:\"#C7F34A\",fontSize:9,fontFamily:\"monospace\",textAlign:\"center\",padding:2,boxSizing:\"border-box\"},children:\"Randomize (inactive on canvas)\"});}return /*#__PURE__*/_jsx(\"span\",{ref:selfRef,\"aria-hidden\":\"true\",style:{display:\"none\"}});}RandomizeOrder.defaultProps={scopeAncestorLevels:1,cardLayerName:\"Product Card\",storageKey:\"randomize\",debug:true};addPropertyControls(RandomizeOrder,{scopeAncestorLevels:{type:ControlType.Number,title:\"Scope Ancestor Levels\",min:0,max:10,step:1,description:\"How many levels up from THIS component to find the container that wraps the whole grid you want shuffled.\"},cardLayerName:{type:ControlType.String,title:\"Card Layer Name\",description:\"The Layer name of each repeated card inside the grid (case-sensitive, must match exactly).\"},storageKey:{type:ControlType.String,title:\"Storage Key\",description:'Unique name for THIS grid, e.g. \"shop-all\", \"related\", \"homepage-flower\". Must be different on every instance you place — reusing the same key across different grids will mix up their remembered order.'},debug:{type:ControlType.Boolean,title:\"Debug Logging\",description:\"Logs to the browser console (prefixed [Randomize]), including a scope-level scan to help you set Scope Ancestor Levels correctly. Turn off once everything shuffles correctly.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"RandomizeOrder\":{\"type\":\"reactComponent\",\"name\":\"RandomizeOrder\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Randomizeorder.map"],"mappings":"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"}