{"version":3,"file":"CSS.BUVGDdE6.mjs","names":["useState"],"sources":["https:/framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js","https:/framer.com/m/framer/store.js@^1.0.0","https:/framerusercontent.com/modules/28rXvpPsrum7FH6cMELS/1jCAazZw1EGHjrG5Nu5D/Utils.js","https:/framer.com/m/framer/utils.js@^0.9.0","https:/framerusercontent.com/modules/DCd2OowPD520wFKIk6Sj/gC88aCpJAAgaZwdwC3PS/CSS.js"],"sourcesContent":["import{useState,useEffect}from\"react\";import{Data,useObserveData}from\"framer\";export function createStore(state1){// Use Data so that a Preview reload resets the state\nconst dataStore=Data({state:Object.freeze({...state1})});// Create a set function that updates the state\nconst setDataStore=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(dataStore.state);}dataStore.state=Object.freeze({...dataStore.state,...newState});};// Store the initial state, copy the object if it's an object\nlet storeState=typeof state1===\"object\"?Object.freeze({...state1}):state1;// Keep a list of all the listeners, in the form of React hook setters\nconst storeSetters=new Set();// Create a set function that updates all the listeners / setters\nconst setStoreState=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(storeState);}storeState=typeof newState===\"object\"?Object.freeze({...storeState,...newState}):newState;// Update all the listeners / setters with the new value\nstoreSetters.forEach(setter=>setter(storeState));};// Create the actual hook based on everything above\nfunction useStore(){// Create the hook we are going to use as a listener\nconst[state,setState]=useState(storeState);// If we unmount the component using this hook, we need to remove the listener\n// @ts-ignore\nuseEffect(()=>{// But right now, we need to add the listener\nstoreSetters.add(setState);return()=>storeSetters.delete(setState);},[]);// If Data context exists, use Data, otherwise use vanilla React state\nif(useObserveData()===true){useObserveData();return[dataStore.state,setDataStore];}else{// Return the state and a function to update the central store\nreturn[state,setStoreState];}}return useStore;}\nexport const __FramerMetadata__ = {\"exports\":{\"createStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./createStore.map","/*\n * createStore (framer/store@1.0.1)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js\"\n","export const centerContent = {\n    display: \"flex\",\n    justifyContent: \"center\",\n    alignItems: \"center\"\n};\nexport const autoSizingText = {\n    width: \"max-content\",\n    wordBreak: \"break-word\",\n    overflowWrap: \"break-word\",\n    overflow: \"hidden\",\n    whiteSpace: \"pre-wrap\",\n    flexShrink: 0\n};\nexport const defaultContainerStyles = {\n    ...centerContent,\n    overflow: \"hidden\"\n};\nexport const containerStyles = defaultContainerStyles;\nexport const randomColor = ()=>\"#\" + Math.floor(Math.random() * 16777215).toString(16)\n;\n\nexport const __FramerMetadata__ = {\"exports\":{\"centerContent\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"autoSizingText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultContainerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"randomColor\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./Utils.map","/*\n * Utils (framer/utils@0.9.0)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/28rXvpPsrum7FH6cMELS/1jCAazZw1EGHjrG5Nu5D/Utils.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect}from\"react\";// @ts-ignore\nimport{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";// @ts-ignore\nimport{randomColor}from\"https://framer.com/m/framer/utils.js@^0.9.0\";// ---------------------------------------------------------------------------\n// Framer demo overrides (unchanged)\n// ---------------------------------------------------------------------------\nconst useStore=createStore({background:\"#0099FF\"});export function withRotate(Component){return /*#__PURE__*/forwardRef((props,ref)=>/*#__PURE__*/_jsx(Component,{ref:ref,...props,animate:{rotate:90},transition:{duration:2}}));}export function withHover(Component){return /*#__PURE__*/forwardRef((props,ref)=>/*#__PURE__*/_jsx(Component,{ref:ref,...props,whileHover:{scale:1.05}}));}export function withRandomColor(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store,setStore]=useStore();return /*#__PURE__*/_jsx(Component,{ref:ref,...props,animate:{background:store.background},onClick:()=>setStore({background:randomColor()})});});}// ---------------------------------------------------------------------------\n// CASE STUDIES GRID — CMS-driven spans + ZERO CROPPING (updated for your NEW layer names)\n// Targets:\n// - List/container: \"Case Studies\", \"Case Study List\", \"Grid - Primary\"\n// - Item: \"Case Study\" (component instance)\n// - Inside item: \"Card\" > \"Image Wrapper\" > \"Thumbnail\" + \"Grid Span\" text field\n// ---------------------------------------------------------------------------\nexport function withCaseStudiesGridSpan(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{const existing=document.getElementById(\"cs-grid-span-styles\");if(existing)existing.remove();const style=document.createElement(\"style\");style.id=\"cs-grid-span-styles\";style.innerHTML=`\n/* =========================================================\n   GRID / LIST CONTAINERS\n   (we keep this flexible so rows can grow)\n========================================================= */\n[data-framer-name=\"Case Studies\"],\n[data-framer-name=\"Case Study List\"],\n[data-framer-name=\"Grid - Primary\"],\n[data-framer-name=\"CMS Grid\"] {\n  grid-auto-flow: dense !important;\n  grid-auto-rows: auto !important;\n  align-items: start !important;\n}\n\n/* =========================================================\n   ITEM (the CMS card instance)\n========================================================= */\n[data-framer-name=\"Case Study\"],\n[data-framer-name=\"Case Study Item\"],\n[data-framer-name=\"CMS Case Study Item\"] {\n  width: 100% !important;\n  height: auto !important;\n  min-height: unset !important;\n  max-height: none !important;\n  align-self: stretch !important;\n}\n\n/* STOP CLIPPING (Framer often sets overflow hidden on wrappers) */\n[data-framer-name=\"Case Study\"] *,\n[data-framer-name=\"Case Study Item\"] *,\n[data-framer-name=\"CMS Case Study Item\"] * {\n  /* let media show fully */\n  overflow: visible !important;\n}\n\n/* =========================================================\n   CARD / IMAGE WRAPPER / THUMBNAIL\n   Your component shows:\n   Card > Image Wrapper > Thumbnail\n========================================================= */\n\n/* Ensure wrappers don't force a crop-window */\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Card\"],\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Image Wrapper\"] {\n  height: auto !important;\n  min-height: unset !important;\n  max-height: none !important;\n  overflow: visible !important;\n}\n\n/* --- If Thumbnail is an <img>/<video> --- */\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"] img,\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"] picture,\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"] video,\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"] iframe {\n  width: 100% !important;\n  height: auto !important;\n  max-width: 100% !important;\n  max-height: none !important;\n  object-fit: contain !important;\n  object-position: center center !important;\n  aspect-ratio: auto !important;\n  display: block !important;\n}\n\n/* --- If Thumbnail is a Framer \"Fill\" (background-image) --- */\n/* Force contain everywhere it can hide \"cover\" */\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"],\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Thumbnail\"] [style*=\"background-image\"],\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Card\"] [style*=\"background-image\"],\n[data-framer-name=\"Case Study\"] [data-framer-name=\"Image Wrapper\"] [style*=\"background-image\"],\n[data-framer-name=\"Case Study\"] [style*=\"background-image\"] {\n  background-size: contain !important;\n  background-position: center center !important;\n  background-repeat: no-repeat !important;\n}\n\n/* ALSO neutralize any object-fit: cover that sneaks in */\n[data-framer-name=\"Case Study\"] img,\n[data-framer-name=\"Case Study\"] video {\n  object-fit: contain !important;\n  object-position: center center !important;\n}\n\n/* =========================================================\n   HIDE HELPER FIELD (Grid Span text layer inside the card)\n========================================================= */\n[data-framer-name=\"Grid Span\"],\n[data-framer-name=\"gridSpan\"],\n[data-framer-name=\"layout-flag\"] {\n  display: none !important;\n}\n`;document.head.appendChild(style);const applySpans=()=>{// Find the grid/list container (your new structure uses \"Case Studies\")\nconst grid=document.querySelector('[data-framer-name=\"Case Studies\"]')||document.querySelector('[data-framer-name=\"Case Study List\"]')||document.querySelector('[data-framer-name=\"Grid - Primary\"]')||document.querySelector('[data-framer-name=\"CMS Grid\"]');if(!grid)return;// Items are your Case Study component instances inside the list\nconst items=grid.querySelectorAll('[data-framer-name=\"Case Study\"], [data-framer-name=\"Case Study Item\"], [data-framer-name=\"CMS Case Study Item\"]');items.forEach(item=>{const el=item;// pull the bound \"Grid Span\" text node inside the item\nconst spanEl=el.querySelector('[data-framer-name=\"Grid Span\"]')||el.querySelector('[data-framer-name=\"gridSpan\"]')||el.querySelector('[data-framer-name=\"layout-flag\"]');const raw=spanEl?.textContent?.trim()||\"1\";// supports \"1\", \"2\", \"3\", and also \"2x1\"/\"3x1\" just in case\nlet span=1;if(raw===\"2\"||raw===\"2x1\")span=2;else if(raw===\"3\"||raw===\"3x1\")span=3;el.style.gridColumn=`span ${span}`;el.style.gridRow=\"span 1\";});};applySpans();const observer=new MutationObserver(applySpans);observer.observe(document.body,{childList:true,subtree:true});return()=>{observer.disconnect();style.remove();};},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}// ---------------------------------------------------------------------------\n// MEDIA GRID — NO CROPPING, IMAGE OR VIDEO (unchanged behavior, slightly hardened)\n// ---------------------------------------------------------------------------\nexport function withMediaGrid(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{const existing=document.getElementById(\"cs-media-grid-styles\");if(existing)existing.remove();const style=document.createElement(\"style\");style.id=\"cs-media-grid-styles\";style.innerHTML=`\n[data-framer-name=\"Case Study Medias\"] {\n  max-width: 1200px;\n  margin: 0 auto;\n}\n\n/* Images (img tags) */\n[data-framer-name=\"Case Study Medias\"] img,\n[data-framer-name=\"Case Study Medias\"] picture {\n  width: 100% !important;\n  height: auto !important;\n  object-fit: contain !important;\n  object-position: center center !important;\n  aspect-ratio: auto !important;\n  display: block !important;\n}\n\n/* Background-image based “image layers” */\n[data-framer-name=\"Case Study Medias\"] [style*=\"background-image\"] {\n  background-size: contain !important;\n  background-position: center center !important;\n  background-repeat: no-repeat !important;\n}\n\n/* Videos */\n[data-framer-name=\"Case Study Medias\"] video,\n[data-framer-name=\"Case Study Medias\"] iframe {\n  width: 100% !important;\n  height: auto !important;\n  object-fit: contain !important;\n  object-position: center center !important;\n  aspect-ratio: auto !important;\n  display: block !important;\n}\n\n/* Hide helpers */\n[data-framer-name=\"Video URL\"],\n[data-framer-name=\"layout-flag\"] {\n  display: none !important;\n}\n`;document.head.appendChild(style);return()=>style.remove();},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}// Prevent synthetic touch hover from changing the thumbnail layout.\nexport function withStableTouchThumbnails(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{const selector='a[data-framer-name=\"Card\"], a[data-framer-name=\"Card - Hover\"], a[data-framer-name=\"Other Project Card\"], a[data-framer-name=\"Other Project Card - Hover\"]';const keepThumbnailStable=event=>{if(!window.matchMedia(\"(max-width: 809px), (hover: none), (pointer: coarse)\").matches)return;const target=event.target;const related=event.relatedTarget;const onCard=target instanceof Element&&target.closest(selector);const toCard=related instanceof Element&&related.closest(selector);if(onCard||toCard)event.stopImmediatePropagation();};const events=[\"mouseover\",\"mouseenter\",\"mouseout\",\"mouseleave\",\"pointerover\",\"pointerenter\",\"pointerout\",\"pointerleave\"];events.forEach(name=>document.addEventListener(name,keepThumbnailStable,true));document.documentElement.setAttribute(\"data-soulrack-touch-thumbnails\",\"ready\");return()=>{events.forEach(name=>document.removeEventListener(name,keepThumbnailStable,true));};},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}// Give the mobile header name a generous tap area without moving the text.\nexport function withMobileHomeLinkHitArea(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{if(document.getElementById(\"soulrack-mobile-home-link\"))return;const style=document.createElement(\"style\");style.id=\"soulrack-mobile-home-link\";style.textContent=`\n@media (max-width: 809px) {\n  nav[data-framer-name$=\"Mobile\"] > [data-framer-name=\"Container\"] {\n    overflow: visible !important;\n  }\n  nav a[href=\"./\"], nav a[href=\"../\"], nav a[href=\"/\"] {\n    overflow: visible !important;\n    touch-action: manipulation;\n  }\n  nav a[href=\"./\"]::after, nav a[href=\"../\"]::after, nav a[href=\"/\"]::after {\n    content: \"\";\n    position: absolute;\n    inset: -15.5px 0;\n    pointer-events: auto;\n  }\n}\n`;document.head.appendChild(style);},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withMobileHomeLinkHitArea\":{\"type\":\"reactHoc\",\"name\":\"withMobileHomeLinkHitArea\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withRotate\":{\"type\":\"reactHoc\",\"name\":\"withRotate\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withRandomColor\":{\"type\":\"reactHoc\",\"name\":\"withRandomColor\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCaseStudiesGridSpan\":{\"type\":\"reactHoc\",\"name\":\"withCaseStudiesGridSpan\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withHover\":{\"type\":\"reactHoc\",\"name\":\"withHover\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withStableTouchThumbnails\":{\"type\":\"reactHoc\",\"name\":\"withStableTouchThumbnails\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMediaGrid\":{\"type\":\"reactHoc\",\"name\":\"withMediaGrid\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CSS.map"],"mappings":"kMAA8E,SAAgB,EAAY,EAAO,CACjH,IAAM,EAAU,EAAK,CAAC,MAAM,OAAO,OAAO,CAAC,GAAG,CAAM,CAAC,CAAC,CAAC,EACjD,EAAa,GAAU,CAC1B,OAAO,GAAW,aAAY,EAAS,EAAS,EAAU,KAAK,GAAG,EAAU,MAAM,OAAO,OAAO,CAAC,GAAG,EAAU,MAAM,GAAG,CAAQ,CAAC,CAAE,EACjI,EAAW,OAAO,GAAS,SAAS,OAAO,OAAO,CAAC,GAAG,CAAM,CAAC,EAAE,EAC7D,EAAa,IAAI,IACjB,EAAc,GAAU,CAC3B,OAAO,GAAW,aAAY,EAAS,EAAS,CAAU,GAAG,EAAW,OAAO,GAAW,SAAS,OAAO,OAAO,CAAC,GAAG,EAAW,GAAG,CAAQ,CAAC,EAAE,EACjJ,EAAa,QAAQ,GAAQ,EAAO,CAAU,CAAC,CAAE,EACjD,SAAS,GAAU,CACnB,GAAK,CAAC,EAAM,GAAUA,EAAS,CAAU,EAKzC,OAHA,OACA,EAAa,IAAI,CAAQ,MAAY,EAAa,OAAO,CAAQ,GAAI,CAAC,CAAC,EACpE,EAAe,IAAI,IAAM,EAAe,EAAQ,CAAC,EAAU,MAAM,CAAY,GAC1E,CAAC,EAAM,CAAa,CAAG,CAAC,OAAO,CAAS,iBAfT,IAAwC,kCEAhE,EAAgB,CACzB,QAAS,OACT,eAAgB,SAChB,WAAY,QAChB,EAWI,CADA,GAAG,CACO,sBEgGd,SAAgB,EAAc,EAAU,CAAC,OAAoB,GAAY,EAAM,KAAO,MAAc,CAAC,IAAM,EAAS,SAAS,eAAe,sBAAsB,EAAK,GAAS,EAAS,OAAO,EAAE,IAAM,EAAM,SAAS,cAAc,OAAO,EAwCzM,MAxC2M,GAAM,GAAG,uBAAuB,EAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwC5R,SAAS,KAAK,YAAY,CAAK,MAAY,EAAM,OAAO,CAAE,EAAE,CAAC,CAAC,EAAsB,EAAK,EAAU,CAAK,MAAI,GAAG,CAAK,CAAC,EAAG,CAAE,CAC5H,SAAgB,EAA0B,EAAU,CAAC,OAAoB,GAAY,EAAM,KAAO,MAAc,CAAC,IAAM,EAAS,6JAAmK,EAAoB,GAAO,CAAC,GAAG,CAAC,EAAO,WAAW,sDAAsD,CAAC,CAAC,QAAQ,OAAO,IAAM,EAAO,EAAM,OAAa,EAAQ,EAAM,cAAoB,EAAO,aAAkB,SAAS,EAAO,QAAQ,CAAQ,EAAQ,EAAO,aAAmB,SAAS,EAAQ,QAAQ,CAAQ,GAAK,GAAQ,IAAO,EAAM,yBAAyB,CAAE,EAAQ,EAAO,CAAC,YAAY,aAAa,WAAW,aAAa,cAAc,eAAe,aAAa,cAAc,EAAiK,OAA/J,EAAO,QAAQ,GAAM,SAAS,iBAAiB,EAAK,EAAoB,EAAI,CAAC,EAAE,SAAS,gBAAgB,aAAa,iCAAiC,OAAO,MAAY,CAAC,EAAO,QAAQ,GAAM,SAAS,oBAAoB,EAAK,EAAoB,EAAI,CAAC,CAAE,CAAE,EAAE,CAAC,CAAC,EAAsB,EAAK,EAAU,CAAK,MAAI,GAAG,CAAK,CAAC,EAAG,CAAE,CACxkC,SAAgB,EAA0B,EAAU,CAAC,OAAoB,GAAY,EAAM,KAAO,MAAc,CAAC,GAAG,SAAS,eAAe,2BAA2B,EAAE,OAAO,IAAM,EAAM,SAAS,cAAc,OAAO,EAAE,EAAM,GAAG,4BAA4B,EAAM,YAAY;;;;;;;;;;;;;;;;EAgBjR,SAAS,KAAK,YAAY,CAAK,CAAE,EAAE,CAAC,CAAC,EAAsB,EAAK,EAAU,CAAK,MAAI,GAAG,CAAK,CAAC,EAAG,CAAE,qBAzKzD,IAAwC,IACd,IACA,EAGrD,EAAY,CAAC,WAAW,SAAS,CAAC"}