{"version":3,"file":"StickyPin.DIDAppV-.mjs","names":["extractVimeoId","loadVimeoScript","vimeoScriptPromise","useRef","useState","useCallback","useRef","useState","useState","useCallback","useRef","_Fragment","useState","useRef","useCallback","React.Fragment","useMemo","useRef"],"sources":["https:/framerusercontent.com/modules/fAUxFGP9gsbVpKuqk5A9/V2YCRGJMuR8TdlTeROVO/FadeInText.js","https:/framerusercontent.com/modules/6LUraRAaw7x7Z3mRVWnI/pgOKsCURFeEwJHm6yUrF/FluidText.js","https:/framerusercontent.com/modules/KHszfnEalNuUdgdN1rEZ/amiXDYYEOtxqGusBsxxo/HeroBoundsMarker.js","https:/framerusercontent.com/modules/4FUyCgG5JNbCe7Z5s9zH/SAGH080nnbJVTvNSPYJU/RecentWorkVideo.js","https:/framerusercontent.com/modules/03YeEoZqcYZyB9dU7Fic/0R0Nft3S32tddPLVK249/RevealText.js","https:/framerusercontent.com/modules/0YvX3DhYnrmq1ePKLtYG/tBStYy9bUMA56OiRd60i/ScrollLogo.js","https:/framerusercontent.com/modules/NpVP1MgsoHTGXgXRuCF8/KRmXHAIMaTNdgnlI7Wgv/SectionColorMarker.js","https:/framerusercontent.com/modules/39FaDBE0qRBBIpmSHA7H/6HLob0DHvLZgTePeq4XW/ServicesInteractive.js","https:/framerusercontent.com/modules/oV8M8t7VQaSGSUcB0aBg/1KqkjQ3b3h5PmXCx2ueA/StickyPin.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{motion,useScroll,useTransform}from\"framer-motion\";/**\n * The hero subtitle: fades in and rises slightly on mount\n * (`fadeInDuration`), matching ScrollLogo's own entrance so \"MISC\" and\n * this line appear together. Separately fades out as the page scrolls\n * away from the hero (`scrollFadeOutRange`) — the two are independent,\n * nested motion layers so they don't fight over the `opacity` style.\n */export default function FadeInText(props){const{text,fontSize,color,fontFamily,textAlign,lineHeight,fadeInDuration,scrollFadeOutRange}=props;const{scrollY}=useScroll();const scrollOpacity=useTransform(scrollY,[0,Math.max(scrollFadeOutRange,1)],[1,scrollFadeOutRange>0?0:1]);return /*#__PURE__*/_jsx(motion.div,{style:{opacity:scrollOpacity},children:/*#__PURE__*/_jsx(motion.p,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:fadeInDuration,ease:\"easeOut\"},style:{margin:0,fontSize,color,fontFamily,textAlign,lineHeight},children:text})});}addPropertyControls(FadeInText,{text:{type:ControlType.String,defaultValue:\"A boundaryless sound studio crafting original music, sound design & sonic identity.\"},fontSize:{type:ControlType.Number,defaultValue:20,min:8,max:100},color:{type:ControlType.Color,defaultValue:\"#171717\"},fontFamily:{type:ControlType.String,defaultValue:\"Inter, sans-serif\"},textAlign:{type:ControlType.Enum,options:[\"left\",\"center\",\"right\"],defaultValue:\"center\"},lineHeight:{type:ControlType.Number,defaultValue:1.5,min:1,max:2.5,step:.05},fadeInDuration:{type:ControlType.Number,defaultValue:.8,min:.1,max:3,step:.1},scrollFadeOutRange:{type:ControlType.Number,defaultValue:150,min:0,max:1e3}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FadeInText\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FadeInText.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Text whose size scales with the viewport width instead of staying a\n * fixed number of pixels, so it keeps the same visual weight on wide\n * monitors that the layout (which stretches to full width) has.\n *\n * Font size = clamp(minSize, vwSize vw, maxSize). Choose vwSize as\n * (design size in px at a 1200px-wide window) / 12, e.g. 28px at 1200\n * => 2.33. Set minSize very low (and maxSize very high) for fully\n * proportional scaling. `spaceBelow` (also in vw, same 1200px-based\n * scale: px / 12) adds spacing under the text that scales the same\n * way, so gaps between stacked pieces keep their proportions.\n * Framer text styles can't use viewport units, which is why this lives\n * in a component. Optionally renders as a link.\n *\n * Line breaks: write `\\n` (backslash + n) in the text, or press Enter\n * in the text field of the property panel — both become real line\n * breaks.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n */export default function FluidText(props){const{text,link,fontFamily,fontWeight,minSize,vwSize,maxSize,lineHeight,letterSpacing,spaceBelow,color,textAlign,opacity}=props;const content=(text||\"\").replace(/\\\\n/g,\"\\n\");const style={display:\"block\",width:\"100%\",fontFamily,fontWeight,fontSize:`clamp(${minSize}px, ${vwSize}vw, ${maxSize}px)`,lineHeight,letterSpacing,color,textAlign,opacity,margin:0,paddingBottom:spaceBelow?`${spaceBelow}vw`:0,boxSizing:\"border-box\",textDecoration:\"none\",whiteSpace:\"pre-line\"};if(link){return /*#__PURE__*/_jsx(\"a\",{href:link,style:{...style,cursor:\"pointer\"},children:content});}return /*#__PURE__*/_jsx(\"div\",{style:style,children:content});}addPropertyControls(FluidText,{text:{type:ControlType.String,defaultValue:\"Text\",displayTextArea:true},link:{type:ControlType.Link,defaultValue:\"\"},fontFamily:{type:ControlType.String,defaultValue:\"'Bodoni Moda', serif\"},fontWeight:{type:ControlType.Number,defaultValue:500,min:100,max:900,step:100},minSize:{type:ControlType.Number,defaultValue:28,min:1,max:200},vwSize:{type:ControlType.Number,defaultValue:2.4,min:.5,max:12,step:.05},maxSize:{type:ControlType.Number,defaultValue:80,min:8,max:600},lineHeight:{type:ControlType.Number,defaultValue:1.05,min:.8,max:2,step:.05},letterSpacing:{type:ControlType.String,defaultValue:\"-0.02em\"},spaceBelow:{type:ControlType.Number,defaultValue:0,min:0,max:20,step:.05,description:\"Space under the text in vw (px at 1200px wide \\xf7 12).\"},color:{type:ControlType.Color,defaultValue:\"rgb(23, 23, 23)\"},textAlign:{type:ControlType.Enum,options:[\"left\",\"center\",\"right\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"left\",displaySegmentedControl:true},opacity:{type:ControlType.Number,defaultValue:1,min:0,max:1,step:.05}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FluidText\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FluidText.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Invisible marker that stretches to cover its parent hero section.\n * ScrollLogo, DynamicNav and DynamicInstagramIcon all read its live\n * `getBoundingClientRect().height` via `document.getElementById` to\n * know exactly how tall the hero section renders at (varies with\n * viewport size), so the scroll-linked dock animation and the header\n * reveal always finish exactly when the hero has fully scrolled past —\n * no fixed guess, no gap.\n *\n * Give this instance `position=\"absolute\"` with width/height 100% inside\n * the hero section. Its own top/left position doesn't matter — only its\n * height is read.\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function HeroBoundsMarker(props){const{boundsId}=props;return /*#__PURE__*/_jsx(\"div\",{id:boundsId,style:{width:\"100%\",height:\"100%\",pointerEvents:\"none\"}});}addPropertyControls(HeroBoundsMarker,{boundsId:{type:ControlType.String,defaultValue:\"hero-bounds\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"HeroBoundsMarker\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HeroBoundsMarker.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useCallback,useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType}from\"framer\";import{motion,AnimatePresence}from\"framer-motion\";function extractVimeoId(url){const match=url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);return match?match[1]:null;}let vimeoScriptPromise=null;function loadVimeoScript(){if(typeof window===\"undefined\")return Promise.resolve();if(window.Vimeo)return Promise.resolve();if(vimeoScriptPromise)return vimeoScriptPromise;vimeoScriptPromise=new Promise(resolve=>{const script=document.createElement(\"script\");script.src=\"https://player.vimeo.com/api/player.js\";script.async=true;script.onload=()=>resolve();document.head.appendChild(script);});return vimeoScriptPromise;}/**\n * \"Recent Work\" preview tile. The ambient looping preview uses a\n * lightweight self-hosted `previewVideoFile` (a short muted MP4/WebM\n * clip, uploaded directly via this component's own property panel —\n * Framer handles the file storage/URL itself, same as its native\n * Video layer) rendered as a native `<video>` — this is what makes\n * the loop load instantly, unlike a Vimeo iframe embed. If no file\n * is uploaded it falls back to looping a 5s window of the Vimeo\n * video itself (slower, kept for compatibility). Clicking always\n * opens the full Vimeo video (real controls, unmuted, from 0:00).\n *\n * This renders only the box itself — the surrounding \"Recent Work\" /\n * title / category labels are separate layers positioned by the\n * parent frame, not part of this component.\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function RecentWorkVideo(props){const{vimeoUrl,previewVideoFile,loopSeconds,radius}=props;const videoId=extractVimeoId(vimeoUrl);const usingNativePreview=(previewVideoFile||\"\").trim().length>0;const containerRef=useRef(null);const previewIframeRef=useRef(null);const previewPlayerRef=useRef(null);const lastClientPos=useRef({x:0,y:0});const[hovering,setHovering]=useState(false);const[cursorPos,setCursorPos]=useState({x:0,y:0});const[modalOpen,setModalOpen]=useState(false);// Only needed for the slow Vimeo-iframe fallback path.\nuseEffect(()=>{if(usingNativePreview||!videoId)return undefined;let cancelled=false;loadVimeoScript().then(()=>{if(cancelled||!previewIframeRef.current||!window.Vimeo)return;const player=new window.Vimeo.Player(previewIframeRef.current);previewPlayerRef.current=player;player.setMuted(true);player.getDuration().then(duration=>{if(cancelled)return;const half=loopSeconds/2;const mid=duration/2;const start=Math.max(mid-half,0);const end=Math.min(mid+half,duration);player.setCurrentTime(start).then(()=>player.play());player.on(\"timeupdate\",data=>{if(data.seconds>=end){player.setCurrentTime(start);}});});});return()=>{cancelled=true;previewPlayerRef.current?.off(\"timeupdate\");};},[usingNativePreview,videoId,loopSeconds]);const handleMouseMove=useCallback(e=>{lastClientPos.current={x:e.clientX,y:e.clientY};setCursorPos({x:e.clientX,y:e.clientY});},[]);const handleMouseEnter=useCallback(e=>{lastClientPos.current={x:e.clientX,y:e.clientY};setCursorPos({x:e.clientX,y:e.clientY});setHovering(true);},[]);// Scrolling (wheel/trackpad) doesn't fire mousemove, so without\n// this the tooltip is left showing at a stale position while the\n// box scrolls away underneath a stationary cursor. But the cursor\n// often DOESN'T move during a scroll either (trackpad gestures) —\n// so on every scroll we recheck whether the last known cursor\n// point still falls inside this tile's (now-moved) box: if it\n// does, keep hovering; only clear it once the box has actually\n// scrolled out from under the cursor.\nuseEffect(()=>{if(!hovering)return undefined;const onScroll=()=>{const rect=containerRef.current?.getBoundingClientRect();const{x,y}=lastClientPos.current;const stillInside=!!rect&&x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom;if(!stillInside)setHovering(false);};window.addEventListener(\"scroll\",onScroll,{passive:true,capture:true});return()=>window.removeEventListener(\"scroll\",onScroll,{capture:true});},[hovering]);useEffect(()=>{if(!modalOpen)return undefined;const onKey=e=>{if(e.key===\"Escape\")setModalOpen(false);};window.addEventListener(\"keydown\",onKey);return()=>window.removeEventListener(\"keydown\",onKey);},[modalOpen]);const modal=modalOpen&&videoId?/*#__PURE__*/_jsx(AnimatePresence,{children:/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:e=>{e.stopPropagation();setModalOpen(false);},style:{position:\"fixed\",inset:0,background:\"rgba(0,0,0,0.9)\",zIndex:1e4,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:\"5vw\"},children:/*#__PURE__*/_jsxs(motion.div,{initial:{scale:.96,opacity:0},animate:{scale:1,opacity:1},exit:{scale:.96,opacity:0},transition:{duration:.25,ease:\"easeOut\"},onClick:e=>e.stopPropagation(),style:{width:\"100%\",maxWidth:1100,aspectRatio:\"16 / 9\",position:\"relative\"},children:[/*#__PURE__*/_jsx(\"iframe\",{src:`https://player.vimeo.com/video/${videoId}?autoplay=1&muted=0&controls=1&title=0&byline=0&portrait=0`,style:{width:\"100%\",height:\"100%\",border:\"none\"},allow:\"autoplay; fullscreen; picture-in-picture\",allowFullScreen:true}),/*#__PURE__*/_jsx(\"button\",{onClick:()=>setModalOpen(false),style:{position:\"absolute\",top:-40,right:0,background:\"none\",border:\"none\",color:\"#fff\",fontSize:28,cursor:\"pointer\",lineHeight:1},\"aria-label\":\"Close\",children:\"\\xd7\"})]})})}):null;return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,onMouseEnter:handleMouseEnter,onMouseLeave:()=>setHovering(false),onMouseMove:handleMouseMove,onClick:()=>videoId&&setModalOpen(true),style:{position:\"relative\",width:\"100%\",height:\"100%\",borderRadius:radius,overflow:\"hidden\",cursor:hovering?\"none\":\"pointer\",background:\"#d0d0d0\"},children:[usingNativePreview?/*#__PURE__*/_jsx(\"video\",{src:previewVideoFile,autoPlay:true,muted:true,loop:true,playsInline:true,preload:\"auto\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",pointerEvents:\"none\"}}):videoId?/*#__PURE__*/_jsx(\"iframe\",{ref:previewIframeRef,loading:\"lazy\",src:`https://player.vimeo.com/video/${videoId}?background=1&muted=1&controls=0&loop=0&autoplay=0&title=0&byline=0&portrait=0&dnt=1`,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",pointerEvents:\"none\",border:\"none\"},allow:\"autoplay; fullscreen\"}):null,/*#__PURE__*/_jsx(AnimatePresence,{children:hovering&&!modalOpen&&/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.2}},exit:{opacity:0,transition:{duration:0}},style:{position:\"fixed\",left:cursorPos.x,top:cursorPos.y,transform:\"translate(-50%, -50%)\",color:\"#ffffff\",fontFamily:\"Inter, sans-serif\",fontSize:17,fontWeight:500,textDecoration:\"underline\",pointerEvents:\"none\",zIndex:9999,whiteSpace:\"nowrap\"},children:\"VIEW\"})}),modal&&typeof document!==\"undefined\"?/*#__PURE__*/createPortal(modal,document.body):null]});}addPropertyControls(RecentWorkVideo,{vimeoUrl:{type:ControlType.String,defaultValue:\"https://vimeo.com/76979871\"},previewVideoFile:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],description:\"Short muted clip for the ambient loop. Leave empty to fall back to the (slower) Vimeo preview.\"},loopSeconds:{type:ControlType.Number,defaultValue:5,min:1,max:20},radius:{type:ControlType.Number,defaultValue:24,min:0,max:100}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"RecentWorkVideo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./RecentWorkVideo.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{addPropertyControls,ControlType}from\"framer\";import{motion,useMotionValue,animate}from\"framer-motion\";/**\n * Plain text that fades in while rising from below when it scrolls into\n * view, and fades out (in place) once it has left the screen completely;\n * scrolling back brings it in again, every time. `delay` lets several\n * instances in the same section appear one after another.\n * Defaults match the project's /Body text style (Inter 15px / 1.45).\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function RevealText(props){const{text,fontFamily,fontSize,lineHeight,letterSpacing,color,opacity,textAlign,distance,duration,delay,triggerOffset}=props;const ref=useRef(null);const[shown,setShown]=useState(false);const opacityValue=useMotionValue(0);const yValue=useMotionValue(distance);// Show: once the text is `triggerOffset`% of the viewport height above\n// the bottom edge of the screen. Hide: only once it is completely off\n// screen. In between (partly visible) the current state is kept.\nuseEffect(()=>{const el=ref.current;if(!el)return undefined;if(typeof IntersectionObserver===\"undefined\"){setShown(true);return undefined;}const showObserver=new IntersectionObserver(entries=>{if(entries.some(entry=>entry.isIntersecting))setShown(true);},{rootMargin:`0px 0px -${triggerOffset}% 0px`});const hideObserver=new IntersectionObserver(entries=>{if(entries.every(entry=>!entry.isIntersecting))setShown(false);},{rootMargin:\"0px\"});showObserver.observe(el);hideObserver.observe(el);return()=>{showObserver.disconnect();hideObserver.disconnect();};},[triggerOffset]);useEffect(()=>{if(shown){const fade=animate(opacityValue,opacity,{duration,delay,ease:[.22,1,.36,1]});const rise=animate(yValue,0,{duration,delay,ease:[.22,1,.36,1]});return()=>{fade.stop();rise.stop();};}// Fade out in place, then park the text below its resting spot so the\n// next reveal starts from underneath again.\nconst fadeOut=animate(opacityValue,0,{duration:.4,ease:\"easeOut\",onComplete:()=>yValue.set(distance)});return()=>fadeOut.stop();},[shown,opacity,duration,delay,distance,opacityValue,yValue]);return /*#__PURE__*/_jsx(motion.div,{ref:ref,style:{opacity:opacityValue,y:yValue,margin:0,fontFamily,fontSize,lineHeight,letterSpacing,color,textAlign,whiteSpace:\"pre-wrap\"},children:text});}addPropertyControls(RevealText,{text:{type:ControlType.String,defaultValue:\"Recent Work\"},fontFamily:{type:ControlType.String,defaultValue:\"Inter, sans-serif\"},fontSize:{type:ControlType.Number,defaultValue:15,min:6,max:200},lineHeight:{type:ControlType.Number,defaultValue:1.45,min:.8,max:3,step:.05},letterSpacing:{type:ControlType.Number,defaultValue:0,min:-10,max:20,step:.1},color:{type:ControlType.Color,defaultValue:\"rgb(23, 23, 23)\"},opacity:{type:ControlType.Number,defaultValue:.5,min:0,max:1,step:.05},textAlign:{type:ControlType.Enum,options:[\"left\",\"center\",\"right\"],defaultValue:\"left\"},distance:{type:ControlType.Number,defaultValue:24,min:0,max:200},duration:{type:ControlType.Number,defaultValue:.9,min:.1,max:3,step:.1},delay:{type:ControlType.Number,defaultValue:0,min:0,max:3,step:.05},triggerOffset:{type:ControlType.Number,defaultValue:10,min:0,max:60}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"RevealText\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./RevealText.map","import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useCallback,useEffect,useLayoutEffect,useRef,useState,startTransition}from\"react\";import{addPropertyControls,ControlType}from\"framer\";import{motion,useScroll,useTransform,useMotionValueEvent}from\"framer-motion\";/**\n * Duplicated in DynamicNav.tsx and DynamicInstagramIcon.tsx on purpose:\n * Framer only exposes component exports for cross-file import, not plain\n * hooks, so this small scroll-spy is kept local to each file that needs it.\n */function useActiveSectionColor(linePx,initialColor){const[color,setColor]=useState(initialColor);const{scrollY}=useScroll();const evaluate=useCallback(()=>{if(typeof document===\"undefined\")return;const sections=Array.from(document.querySelectorAll(\"[data-scroll-section-color]\"));if(sections.length===0)return;let best=null;for(const el of sections){const top=el.getBoundingClientRect().top;if(top<=linePx&&(!best||top>best.top)){best={top,el};}}const target=best?best.el:sections[0];const value=target.getAttribute(\"data-scroll-section-color\");if(value===\"light\"||value===\"dark\"){setColor(prev=>prev===value?prev:value);}},[linePx]);useMotionValueEvent(scrollY,\"change\",evaluate);useEffect(()=>{evaluate();window.addEventListener(\"resize\",evaluate);return()=>window.removeEventListener(\"resize\",evaluate);},[evaluate]);return color;}/**\n * The single \"MISC\" wordmark that lives in the hero at full size and,\n * as the page scrolls, continuously shrinks and slides into the\n * header's logo slot (`headerTargetId`). Position and scale are pure\n * functions of scrollY (framer-motion useTransform), not a timed\n * animation, so scrubbing the scrollbar scrubs the effect.\n *\n * Plain solid-color text throughout. In the hero, the color adapts to\n * whichever section is currently behind the header (`lightColor` /\n * `darkColor`, via useActiveSectionColor) for legibility. As the\n * wordmark docks into the header, that color smoothly interpolates\n * toward the fixed `dockedColor` — by the time it's fully docked it's\n * always `dockedColor`, regardless of section. A halftone-mosaic\n * rendering with a hover-to-color-change interaction plus an\n * auto-playing entrance \"wave\", and separately a hollow/outline\n * scroll effect, were both built and iterated on extensively in\n * earlier versions, but were ultimately removed in favor of this\n * simpler, static wordmark.\n *\n * On mount, the wordmark fades in and rises slightly (`fadeInDuration`)\n * — kept in sync with the subtitle's own matching entrance (see\n * FadeInText.tsx) so both appear together.\n *\n * The scroll distance the dock animation completes over is read live\n * from `heroBoundsId` (an element that stretches to cover the whole\n * hero section — see HeroBoundsMarker.tsx) and multiplied by\n * `heroRangeFactor` (< 1 finishes the dock a bit before the hero fully\n * scrolls past, so it doesn't feel sluggish; DynamicNav /\n * DynamicInstagramIcon use the same factor so the header reveal still\n * lines up with dock-completion). The static `scrollRange` prop is only\n * a fallback used before the marker is found.\n *\n * A hidden same-size \"sizer\" span is rendered in normal flow to reserve\n * the hero's layout space, while the actual visible glyph is a second,\n * fixed-position element that does the animating. This is the one place\n * in this project that intentionally uses `position: fixed` inside a\n * code component: the effect requires escaping the normal document flow\n * and tracking the viewport directly, which Framer's native layout\n * system cannot express.\n *\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function ScrollLogo(props){const{text,heroFontSize,letterSpacing,headerTargetId,heroBoundsId,heroRangeFactor,scrollRange,headerHeight,lightColor,darkColor,dockedColor,fontFamily,fadeInDuration}=props;const sizerRef=useRef(null);const[rect,setRect]=useState(null);const[dynamicRange,setDynamicRange]=useState(null);const{scrollY}=useScroll();// \"light\" section behind header -> dark text. \"dark\" section -> light text.\nconst activeColor=useActiveSectionColor(headerHeight,\"light\");const color=activeColor===\"dark\"?lightColor:darkColor;const letterSpacingValue=`${letterSpacing}em`;const measure=useCallback(()=>{if(typeof window===\"undefined\"||typeof document===\"undefined\")return;if(!sizerRef.current)return;const sourceRect=sizerRef.current.getBoundingClientRect();const targetEl=document.getElementById(headerTargetId);if(!targetEl)return;const targetRect=targetEl.getBoundingClientRect();const next={start:{top:sourceRect.top+window.scrollY,left:sourceRect.left,width:sourceRect.width,height:sourceRect.height},target:{top:targetRect.top,left:targetRect.left,width:targetRect.width,height:targetRect.height}};startTransition(()=>setRect(next));const heroEl=document.getElementById(heroBoundsId);if(heroEl){const h=heroEl.getBoundingClientRect().height*heroRangeFactor;if(h>0)setDynamicRange(h);}},[headerTargetId,heroBoundsId,heroRangeFactor]);useLayoutEffect(()=>{measure();// Re-measure once webfonts finish swapping in, since that can\n// change the sizer's natural width after first paint.\nconst fontLoadTimer=window.setTimeout(measure,300);window.addEventListener(\"resize\",measure);return()=>{window.clearTimeout(fontLoadTimer);window.removeEventListener(\"resize\",measure);};},[measure,letterSpacing]);const effectiveRange=dynamicRange??scrollRange;const scale=rect?rect.target.width/rect.start.width:1;const dx=rect?rect.target.left-rect.start.left:0;const dy=rect?rect.target.top-rect.start.top:0;const scaleMV=useTransform(scrollY,[0,effectiveRange],[1,scale]);const xMV=useTransform(scrollY,[0,effectiveRange],[0,dx]);const yMV=useTransform(scrollY,[0,effectiveRange],[0,dy]);// Smoothly interpolates from the hero's section-adaptive color to\n// the fixed `dockedColor`, finishing exactly when the dock\n// animation itself finishes (same [0, effectiveRange] scroll span).\nconst textColorMV=useTransform(scrollY,[0,effectiveRange],[color,dockedColor]);return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"span\",{ref:sizerRef,style:{display:\"inline-block\",visibility:\"hidden\",fontFamily,fontSize:heroFontSize,fontWeight:500,letterSpacing:letterSpacingValue,lineHeight:1,whiteSpace:\"nowrap\"},children:text}),rect&&/*#__PURE__*/_jsx(motion.div,{style:{position:\"fixed\",top:rect.start.top,left:rect.start.left,width:rect.start.width,height:rect.start.height,transformOrigin:\"top left\",scale:scaleMV,x:xMV,y:yMV,zIndex:950,pointerEvents:\"none\"},children:/*#__PURE__*/_jsx(motion.span,{initial:{opacity:0,y:16},animate:{opacity:1,y:0},transition:{duration:fadeInDuration,ease:\"easeOut\"},style:{position:\"absolute\",top:0,left:0,fontFamily,fontSize:heroFontSize,fontWeight:500,letterSpacing:letterSpacingValue,lineHeight:1,color:textColorMV,whiteSpace:\"nowrap\",pointerEvents:\"none\"},children:text})})]});}addPropertyControls(ScrollLogo,{text:{type:ControlType.String,defaultValue:\"MISC\"},heroFontSize:{type:ControlType.Number,defaultValue:72,min:20,max:400},letterSpacing:{type:ControlType.Number,defaultValue:.05,min:-.1,max:.5,step:.01},headerTargetId:{type:ControlType.String,defaultValue:\"header-logo-slot\"},heroBoundsId:{type:ControlType.String,defaultValue:\"hero-bounds\"},heroRangeFactor:{type:ControlType.Number,defaultValue:.8,min:.1,max:1,step:.05},scrollRange:{type:ControlType.Number,defaultValue:250,min:50,max:2e3},headerHeight:{type:ControlType.Number,defaultValue:72,min:40,max:200},lightColor:{type:ControlType.Color,defaultValue:\"#E6E6E6\"},darkColor:{type:ControlType.Color,defaultValue:\"#171717\"},dockedColor:{type:ControlType.Color,defaultValue:\"#33A200\"},fontFamily:{type:ControlType.String,defaultValue:\"'Bodoni Moda', serif\"},fadeInDuration:{type:ControlType.Number,defaultValue:.8,min:.1,max:3,step:.1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrollLogo\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerSupportedLayoutHeight\":\"auto\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ScrollLogo.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Invisible marker dropped inside a section frame so the fixed header\n * knows what background color is currently behind it. Give this\n * component's Framer wrapper `position=\"absolute\"` with 0 insets so it\n * silently stretches to cover its parent section without affecting\n * layout, then set `color` to match that section's background\n * (light background -> \"light\", dark background -> \"dark\").\n *\n * Optionally also stamps a DOM `id` (via `elementId`) so other\n * components (e.g. ScrollSnapGate) can locate this same element's\n * document position without needing a second marker of their own.\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function SectionColorMarker(props){const{color,elementId}=props;return /*#__PURE__*/_jsx(\"div\",{id:elementId||undefined,\"data-scroll-section-color\":color,style:{width:\"100%\",height:\"100%\",pointerEvents:\"none\"}});}addPropertyControls(SectionColorMarker,{color:{type:ControlType.Enum,options:[\"light\",\"dark\"],optionTitles:[\"Light background\",\"Dark background\"],defaultValue:\"light\"},elementId:{type:ControlType.String,defaultValue:\"\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"SectionColorMarker\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./SectionColorMarker.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{useCallback,useEffect,useMemo,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType}from\"framer\";import{motion,AnimatePresence}from\"framer-motion\";function extractVimeoId(url){const match=url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);return match?match[1]:null;}let vimeoScriptPromise=null;function loadVimeoScript(){if(typeof window===\"undefined\")return Promise.resolve();if(window.Vimeo)return Promise.resolve();if(vimeoScriptPromise)return vimeoScriptPromise;vimeoScriptPromise=new Promise(resolve=>{const script=document.createElement(\"script\");script.src=\"https://player.vimeo.com/api/player.js\";script.async=true;script.onload=()=>resolve();document.head.appendChild(script);});return vimeoScriptPromise;}/* ------------------------------------------------------------------ *//* Colour extraction (list mode)                                       *//* ------------------------------------------------------------------ */const COLOR_STOPS=8;const colorCache=new Map;const colorPromises=new Map;// Decode at most two sources at a time so a list of videos doesn't stall the page.\nlet runningExtractions=0;const extractionQueue=[];function runQueued(task){return new Promise((resolve,reject)=>{const start=()=>{runningExtractions++;task().then(resolve,reject).finally(()=>{runningExtractions--;const next=extractionQueue.shift();if(next)next();});};if(runningExtractions<2)start();else extractionQueue.push(start);});}/** Average colour of COLOR_STOPS vertical slices of a drawable (left → right). */function sampleSlices(source){const w=48;const h=10;const canvas=document.createElement(\"canvas\");canvas.width=w;canvas.height=h;const ctx=canvas.getContext(\"2d\",{willReadFrequently:true});if(!ctx)throw new Error(\"no canvas\");ctx.drawImage(source,0,0,w,h);const{data}=ctx.getImageData(0,0,w,h)// throws if the canvas is tainted (no CORS)\n;const slice=w/COLOR_STOPS;const out=[];for(let s=0;s<COLOR_STOPS;s++){let r=0;let g=0;let b=0;let n=0;for(let y=0;y<h;y++){for(let x=Math.floor(s*slice);x<Math.floor((s+1)*slice);x++){const i=(y*w+x)*4;r+=data[i];g+=data[i+1];b+=data[i+2];n++;}}out.push([Math.round(r/n),Math.round(g/n),Math.round(b/n)]);}return out;}function colorsFromVideoFile(url){return new Promise((resolve,reject)=>{const video=document.createElement(\"video\");video.crossOrigin=\"anonymous\";video.muted=true;video.playsInline=true;video.preload=\"auto\";let done=false;const finish=fn=>{if(done)return;done=true;window.clearTimeout(timer);video.removeAttribute(\"src\");video.load();fn();};const timer=window.setTimeout(()=>finish(()=>reject(new Error(\"timeout\"))),12e3);video.addEventListener(\"error\",()=>finish(()=>reject(new Error(\"video error\"))));video.addEventListener(\"loadeddata\",()=>{// A frame a little way in avoids a black first frame.\nconst target=Math.min(.8,(video.duration||1)*.2);video.addEventListener(\"seeked\",()=>{try{const colors=sampleSlices(video);finish(()=>resolve(colors));}catch(e){finish(()=>reject(e));}},{once:true});video.currentTime=target;});video.src=url;});}async function colorsFromVimeoThumbnail(vimeoUrl){const res=await fetch(`https://vimeo.com/api/oembed.json?url=${encodeURIComponent(vimeoUrl)}&width=640`);if(!res.ok)throw new Error(\"oembed\");const json=await res.json();const thumb=json.thumbnail_url;if(!thumb)throw new Error(\"no thumbnail\");return new Promise((resolve,reject)=>{const img=new Image;img.crossOrigin=\"anonymous\";img.onload=()=>{try{resolve(sampleSlices(img));}catch(e){reject(e);}};img.onerror=()=>reject(new Error(\"thumbnail load\"));img.src=thumb;});}function getRowColors(key,previewUrl,vimeoUrl){const cached=colorCache.get(key);if(cached!==undefined)return Promise.resolve(cached);const existing=colorPromises.get(key);if(existing)return existing;const promise=runQueued(async()=>{try{if(previewUrl.trim().length>0)return await colorsFromVideoFile(previewUrl);return await colorsFromVimeoThumbnail(vimeoUrl);}catch(e){// Fall back to the Vimeo thumbnail when the clip can't be read (e.g. no CORS).\nif(previewUrl.trim().length>0&&extractVimeoId(vimeoUrl||\"\")){try{return await colorsFromVimeoThumbnail(vimeoUrl);}catch(e2){return null;}}return null;}}).then(colors=>{colorCache.set(key,colors);return colors;});colorPromises.set(key,promise);return promise;}/** The row's colours (left → right), or null while loading / if they can't be read. */function useRowColors(previewUrl,vimeoUrl,enabled){const key=(previewUrl||\"\").trim()?`clip:${previewUrl}`:vimeoUrl?`vimeo:${vimeoUrl}`:\"\";const[colors,setColors]=useState(()=>key?colorCache.get(key)??null:null);useEffect(()=>{if(!enabled||!key||typeof window===\"undefined\")return undefined;let cancelled=false;getRowColors(key,previewUrl||\"\",vimeoUrl||\"\").then(result=>{if(!cancelled)setColors(result);});return()=>{cancelled=true;};},[enabled,key,previewUrl,vimeoUrl]);return colors;}const PAPER=[240,240,240];const clamp255=n=>Math.max(0,Math.min(255,Math.round(n)));/** Push a colour away from grey so the bar reads richer (1 = unchanged). */function saturate(color,amount){const grey=.2126*color[0]+.7152*color[1]+.0722*color[2];return[clamp255(grey+(color[0]-grey)*amount),clamp255(grey+(color[1]-grey)*amount),clamp255(grey+(color[2]-grey)*amount)];}/** Mix a colour towards the page background: strength 1 = the real colour, 0 = the background. */function tint(color,strength){return[Math.round(PAPER[0]+(color[0]-PAPER[0])*strength),Math.round(PAPER[1]+(color[1]-PAPER[1])*strength),Math.round(PAPER[2]+(color[2]-PAPER[2])*strength)];}const luma=c=>(.2126*c[0]+.7152*c[1]+.0722*c[2])/255;const css=c=>`rgb(${c[0]}, ${c[1]}, ${c[2]})`;/**\n * One video tile, used by both layouts. `aspect` set (e.g. \"2.9 / 1\"): the\n * tile keeps that box and drives its own height. `aspect` undefined: the\n * tile fills the height its parent gives it. The video is always cropped\n * cover-style to whatever box results. The preview clip sits paused and\n * plays (from the start) only while the cursor is over the tile; click\n * opens the full Vimeo video in a lightbox.\n */function VideoTile({vimeoUrl,previewVideoUrl,radius,aspect}){const videoId=extractVimeoId(vimeoUrl||\"\");const usingNativePreview=(previewVideoUrl||\"\").trim().length>0;const nativeVideoRef=useRef(null);const previewIframeRef=useRef(null);const previewPlayerRef=useRef(null);const loopRangeRef=useRef(null);const containerRef=useRef(null);const lastClientPos=useRef({x:0,y:0});const[hovering,setHovering]=useState(false);const[cursorPos,setCursorPos]=useState({x:0,y:0});const[modalOpen,setModalOpen]=useState(false);// Don't start loading anything until the tile is actually near the\n// viewport. Mounting all previews at once is what made the grid\n// feel slow — this staggers the load to whatever's about to be seen.\nconst[inView,setInView]=useState(false);useEffect(()=>{const el=containerRef.current;if(!el||typeof IntersectionObserver===\"undefined\"){setInView(true);return undefined;}const observer=new IntersectionObserver(entries=>{if(entries[0]?.isIntersecting){setInView(true);observer.disconnect();}},{rootMargin:\"300px\"});observer.observe(el);return()=>observer.disconnect();},[]);// Play the native preview only while actually hovered.\n// Restart from the top of the loop window each time it's re-hovered.\nuseEffect(()=>{const el=nativeVideoRef.current;if(!usingNativePreview||!el)return undefined;if(hovering){el.currentTime=0;el.play().catch(()=>{});}else{el.pause();}return undefined;},[hovering,usingNativePreview,inView]);// Only needed for the slow Vimeo-iframe fallback path (used when\n// no lightweight previewVideoUrl clip has been provided yet). Sets\n// up the player and the mid-video loop window once, but only\n// actually starts/stops playback in response to `hovering` below.\nuseEffect(()=>{if(usingNativePreview||!videoId||!inView)return undefined;let cancelled=false;loadVimeoScript().then(()=>{if(cancelled||!previewIframeRef.current||!window.Vimeo)return;const player=new window.Vimeo.Player(previewIframeRef.current);previewPlayerRef.current=player;player.setMuted(true);player.getDuration().then(duration=>{if(cancelled)return;const half=2.5;const mid=duration/2;const start=Math.max(mid-half,0);const end=Math.min(mid+half,duration);loopRangeRef.current={start,end};player.on(\"timeupdate\",data=>{if(data.seconds>=end){player.setCurrentTime(start);}});});});return()=>{cancelled=true;previewPlayerRef.current?.off(\"timeupdate\");};},[usingNativePreview,videoId,inView]);useEffect(()=>{if(usingNativePreview)return undefined;const player=previewPlayerRef.current;const range=loopRangeRef.current;if(!player||!range)return undefined;if(hovering){player.setCurrentTime(range.start).then(()=>player.play());}else{player.pause();}return undefined;},[hovering,usingNativePreview]);// Position relative to this tile's own box (not the viewport) so a\n// transformed ancestor elsewhere in Framer's DOM can't throw off a\n// `position: fixed` calculation.\nconst updateCursorFromEvent=useCallback(e=>{lastClientPos.current={x:e.clientX,y:e.clientY};const rect=containerRef.current?.getBoundingClientRect();if(!rect)return;setCursorPos({x:e.clientX-rect.left,y:e.clientY-rect.top});},[]);const handleMouseEnter=useCallback(e=>{updateCursorFromEvent(e);setHovering(true);},[updateCursorFromEvent]);// Scrolling doesn't fire mousemove, so on every scroll recheck whether\n// the last known cursor point still falls inside this tile's box.\nuseEffect(()=>{if(!hovering)return undefined;const onScroll=()=>{const rect=containerRef.current?.getBoundingClientRect();const{x,y}=lastClientPos.current;const stillInside=!!rect&&x>=rect.left&&x<=rect.right&&y>=rect.top&&y<=rect.bottom;if(stillInside&&rect){setCursorPos({x:x-rect.left,y:y-rect.top});}else{setHovering(false);}};window.addEventListener(\"scroll\",onScroll,{passive:true,capture:true});return()=>window.removeEventListener(\"scroll\",onScroll,{capture:true});},[hovering]);useEffect(()=>{if(!modalOpen)return undefined;const onKey=e=>{if(e.key===\"Escape\")setModalOpen(false);};window.addEventListener(\"keydown\",onKey);return()=>window.removeEventListener(\"keydown\",onKey);},[modalOpen]);const modal=modalOpen&&videoId?/*#__PURE__*/_jsx(AnimatePresence,{children:/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:e=>{e.stopPropagation();setModalOpen(false);},style:{position:\"fixed\",inset:0,background:\"rgba(0,0,0,0.9)\",zIndex:1e4,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:\"5vw\"},children:/*#__PURE__*/_jsxs(motion.div,{initial:{scale:.96,opacity:0},animate:{scale:1,opacity:1},exit:{scale:.96,opacity:0},transition:{duration:.25,ease:\"easeOut\"},onClick:e=>e.stopPropagation(),style:{width:\"100%\",maxWidth:1100,aspectRatio:\"16 / 9\",position:\"relative\"},children:[/*#__PURE__*/_jsx(\"iframe\",{src:`https://player.vimeo.com/video/${videoId}?autoplay=1&muted=0&controls=1&title=0&byline=0&portrait=0`,style:{width:\"100%\",height:\"100%\",border:\"none\"},allow:\"autoplay; fullscreen; picture-in-picture\",allowFullScreen:true}),/*#__PURE__*/_jsx(\"button\",{onClick:()=>setModalOpen(false),style:{position:\"absolute\",top:-40,right:0,background:\"none\",border:\"none\",color:\"#fff\",fontSize:28,cursor:\"pointer\",lineHeight:1},\"aria-label\":\"Close\",children:\"\\xd7\"})]})})}):null;// `containerType: \"size\"` lets the Vimeo iframe size itself to cover\n// this box (cqw/cqh); it is not in Framer's bundled CSSProperties type.\nconst containerStyle={position:\"relative\",width:\"100%\",height:aspect?undefined:\"100%\",aspectRatio:aspect,minHeight:0,borderRadius:radius,overflow:\"hidden\",cursor:hovering?\"none\":\"default\",background:\"#282828\",containerType:\"size\"};return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,onMouseEnter:handleMouseEnter,onMouseLeave:()=>setHovering(false),onMouseMove:updateCursorFromEvent,onClick:e=>{e.stopPropagation();if(videoId)setModalOpen(true);},style:containerStyle,children:[inView&&usingNativePreview?/*#__PURE__*/_jsx(\"video\",{ref:nativeVideoRef,src:previewVideoUrl,muted:true,loop:true,playsInline:true,preload:\"auto\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",pointerEvents:\"none\"}}):inView&&videoId?// Vimeo background iframes are always 16:9: size it so it\n// covers this tile's box and let the tile's overflow crop it.\n/*#__PURE__*/_jsx(\"iframe\",{ref:previewIframeRef,loading:\"lazy\",src:`https://player.vimeo.com/video/${videoId}?background=1&muted=1&controls=0&loop=0&autoplay=0&title=0&byline=0&portrait=0&dnt=1`,style:{position:\"absolute\",top:\"50%\",left:\"50%\",width:\"max(100cqw, calc(100cqh * 16 / 9))\",height:\"max(100cqh, calc(100cqw * 9 / 16))\",transform:\"translate(-50%, -50%)\",pointerEvents:\"none\",border:\"none\"},allow:\"autoplay; fullscreen\"}):null,/*#__PURE__*/_jsx(AnimatePresence,{children:hovering&&!modalOpen&&/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.2}},exit:{opacity:0,transition:{duration:0}},style:{position:\"absolute\",left:cursorPos.x,top:cursorPos.y,transform:\"translate(-50%, -50%)\",color:\"#ffffff\",fontFamily:\"Inter, sans-serif\",fontSize:15,fontWeight:500,textDecoration:\"underline\",pointerEvents:\"none\",zIndex:9999,whiteSpace:\"nowrap\"},children:\"VIEW\"})}),modal&&typeof document!==\"undefined\"?/*#__PURE__*/createPortal(modal,document.body):null]});}const FALLBACK_VIDEOS=[\"https://vimeo.com/76979871\"];const FALLBACK_PREVIEWS=[];// Wall layout: 1 hero tile across the full content width, then rows of two\n// tiles. Every row below the hero has the same height (a fixed fraction of\n// the content width) and its two tiles split the width with alternating\n// proportions. 1 hero + 3 rows x 2 = exactly 7 videos; anything past 7 is\n// ignored (the list layout shows up to 7 rows too).\nconst MAX_VIDEOS=7;const HERO_ASPECT=\"2.9 / 1\";const ROW_ASPECT=\"3.5 / 1\";const ROW_TEMPLATES=[\"4fr 5fr\",\"5fr 4fr\",\"4fr 5fr\"];// List layout\nconst LINE=\"rgba(23, 23, 23, 0.14)\";const INK=\"rgb(23, 23, 23)\";const MUTED=\"rgb(146, 140, 132)\";const EASE=[.22,1,.36,1];const ROW_DURATION=.6;const NAV_PAD=70// height of the fixed site header the pinned stage must clear\n;const pad2=n=>String(n).padStart(2,\"0\");// Scroll mode (one row per scroll gesture)\nconst STEP_COOLDOWN_MS=900// after a row opens, ignore scrolling for at least this long\n;const GESTURE_QUIET_MS=220// …and until the wheel has then been completely quiet this long\n;const TOUCH_THRESHOLD_PX=28;/**\n * One list row. Closed: a single line \"01 — Title / Category / Year\"\n * in large type — with `gradientOn`, on a crisp-edged left→right colour\n * gradient taken from that video's own colours (read automatically from\n * the preview clip, or the Vimeo thumbnail; made a little richer, then\n * mixed towards the page background by `strength`). A soft gloss sits\n * on top of the bar (`gloss`: a light top edge, a darker bottom edge and\n * a diagonal highlight streak). Optionally the left/right ends fade into\n * the page (`edgeFade`). Open: the row grows, the gradient fades out, a\n * small \"01 — Title\" sits on the left, the video in the middle and a\n * small \"Category / Year\" on the right. The row's height is animated\n * between two measured pixel heights, so every row that opens/closes\n * moves in lock-step. `onHover` / `onSelect` decide how a row gets opened.\n */function ListRow({index,item,open,closedHeight,openHeight,padX,openPadLeft,openPadRight,videoWidth,videoHeight,vimeoUrl,previewVideoUrl,radius,isLast,gradientOn,strength,gloss,edgeFade,rowGap,onHover,onSelect}){const title=item.title||\"\";const meta=[item.category,item.year].filter(v=>!!v&&String(v).trim().length>0);// Gradient + readable text colour for the closed state.\nconst rawColors=useRowColors(previewVideoUrl,vimeoUrl,gradientOn);const tinted=rawColors?rawColors.map(c=>tint(saturate(c,1.25),strength)):null;const gradient=tinted?`linear-gradient(90deg, ${tinted.map(css).join(\", \")})`:\"none\";const averageLuma=tinted?tinted.reduce((sum,c)=>sum+luma(c),0)/tinted.length:1;const darkBar=gradientOn&&!!tinted&&averageLuma<.5;const closedInk=darkBar?\"rgb(255, 255, 255)\":INK;const closedMuted=darkBar?\"rgba(255, 255, 255, 0.72)\":gradientOn&&tinted?\"rgba(23, 23, 23, 0.55)\":MUTED;// Gloss: light top edge → darker bottom edge, plus a diagonal highlight streak.\nconst sheen=gloss>0?`linear-gradient(105deg, rgba(255,255,255,0) 28%, rgba(255,255,255,${(.2*gloss).toFixed(3)}) 46%, rgba(255,255,255,0) 64%), `+`linear-gradient(180deg, rgba(255,255,255,${(.24*gloss).toFixed(3)}) 0%, rgba(255,255,255,${(.04*gloss).toFixed(3)}) 48%, rgba(0,0,0,${(.14*gloss).toFixed(3)}) 100%)`:\"none\";// Optional fade of both ends of the bar into the page (top and bottom stay as they are).\nconst edgeMask=edgeFade>0?`linear-gradient(90deg, transparent 0%, #000 ${edgeFade}%, #000 ${100-edgeFade}%, transparent 100%)`:\"none\";// Closed-row type (large)\nconst titleStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(14px, 1.5vw, 26px)\",color:closedInk,whiteSpace:\"nowrap\"};const numberStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(11px, 1.1vw, 19px)\",color:closedMuted};const metaStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(11px, 1.15vw, 20px)\",whiteSpace:\"nowrap\"};// Open-row type (small)\nconst openTitleStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(10px, 0.8vw, 15px)\",color:INK,whiteSpace:\"nowrap\"};const openNumberStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(8px, 0.55vw, 11px)\",color:MUTED};const openMetaStyle={fontFamily:\"Inter, sans-serif\",fontSize:\"clamp(10px, 0.8vw, 15px)\",whiteSpace:\"nowrap\"};return /*#__PURE__*/_jsxs(motion.div,{onMouseEnter:onHover,onClick:onSelect,initial:false,animate:{height:open?openHeight:closedHeight},transition:{duration:ROW_DURATION,ease:EASE},style:{position:\"relative\",overflow:\"hidden\",borderTop:gradientOn?\"none\":`1px solid ${LINE}`,borderBottom:!gradientOn&&isLast?`1px solid ${LINE}`:\"none\",marginBottom:gradientOn&&!isLast?rowGap:0,cursor:!open&&(onHover||onSelect)?\"pointer\":\"default\",boxSizing:\"content-box\"},children:[gradientOn?/*#__PURE__*/_jsx(motion.div,{initial:false,animate:{opacity:open||!tinted?0:1},transition:{duration:open?.35:.7,delay:open?0:.15},style:{position:\"absolute\",left:0,right:0,top:0,height:closedHeight,background:gloss>0?`${sheen}, ${gradient}`:gradient,WebkitMaskImage:edgeMask,maskImage:edgeMask,pointerEvents:\"none\"}}):null,/*#__PURE__*/_jsxs(motion.div,{animate:{opacity:open?0:1},transition:{duration:open?.2:.4,delay:open?0:.2},style:{position:\"absolute\",left:0,right:0,top:0,height:closedHeight,padding:`0 ${padX}px`,display:\"flex\",alignItems:\"center\",gap:\"0.9em\",pointerEvents:open?\"none\":\"auto\"},children:[/*#__PURE__*/_jsx(\"span\",{style:numberStyle,children:pad2(index+1)}),/*#__PURE__*/_jsx(\"span\",{style:{...numberStyle},children:\"—\"}),/*#__PURE__*/_jsx(\"span\",{style:titleStyle,children:title}),meta.map((value,i)=>/*#__PURE__*/_jsxs(React.Fragment,{children:[/*#__PURE__*/_jsx(\"span\",{style:{...metaStyle,color:closedMuted},children:\"/\"}),/*#__PURE__*/_jsx(\"span\",{style:{...metaStyle,color:closedMuted},children:value})]},i))]}),/*#__PURE__*/_jsxs(motion.div,{animate:{opacity:open?1:0},transition:{duration:open?.45:.2,delay:open?.25:0},style:{position:\"absolute\",left:0,right:0,top:0,height:openHeight,padding:`0 ${openPadRight}px 0 ${openPadLeft}px`,display:\"grid\",gridTemplateColumns:`1fr ${videoWidth}px 1fr`,alignItems:\"center\",pointerEvents:open?\"auto\":\"none\"},children:[/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"0.9em\"},children:[/*#__PURE__*/_jsx(\"span\",{style:openNumberStyle,children:pad2(index+1)}),/*#__PURE__*/_jsx(\"span\",{style:openNumberStyle,children:\"—\"}),/*#__PURE__*/_jsx(\"span\",{style:openTitleStyle,children:title})]}),/*#__PURE__*/_jsx(\"div\",{style:{width:videoWidth,height:videoHeight},children:open?/*#__PURE__*/_jsx(VideoTile,{vimeoUrl:vimeoUrl,previewVideoUrl:previewVideoUrl,radius:radius}):null}),/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",justifyContent:\"flex-end\",alignItems:\"center\",gap:\"0.7em\"},children:meta.map((value,i)=>/*#__PURE__*/_jsxs(React.Fragment,{children:[i>0?/*#__PURE__*/_jsx(\"span\",{style:{...openMetaStyle,color:MUTED},children:\"/\"}):null,/*#__PURE__*/_jsx(\"span\",{style:{...openMetaStyle,color:INK},children:value})]},i))})]})]});}/**\n * \"Services\" section: three category headers (Sound Design / Music /\n * Other). Hovering a header brings its title+description up to full\n * (base) size and swaps what's below to that category's videos;\n * non-active headers sit at a smaller scale. The last hovered category\n * stays active when the cursor leaves.\n *\n * `layoutMode`:\n *  - \"wall\" (default): a tile wall (1 hero + rows of two).\n *  - \"list\": an accordion project list. Each row reads\n *    \"01 — Title / Category / Year\"; hovering a row opens it to show its\n *    video in the middle (small title left, small category/year right).\n *    The first row is open on load, the last hovered row stays open.\n *    Closed rows are crisp colour bars with a gloss, coloured from the\n *    video (`gradientRows`, `gradientStrength`, `gradientGloss`,\n *    `gradientEdgeFade`).\n *    Sized in % of the list width: `closedRowPercent`,\n *    `openPaddingPercent`, `listVideoWidthPercent`, `listVideoRadius`.\n *    With `scrollDriven` the whole section is pinned to the screen while\n *    it is on screen and ONE scroll gesture (a wheel flick, a trackpad\n *    swipe, a touch swipe) opens exactly ONE next/previous row, however\n *    far or long that gesture is: after a row opens, nothing more is\n *    accepted until the wheel has stopped completely (trackpad inertia\n *    included) and a cooldown has passed. While pinned, the page itself\n *    does not scroll; once the last row is open, scrolling down (or the\n *    first row, scrolling up) carries on with normal page scrolling. The\n *    category headers stay pinned at the top (so they can be switched at\n *    any time) and only the list slides up under them so the open row\n *    stays on screen. Clicking a closed row opens it.\n *\n * The whole section is inset from the viewport edges by a proportional\n * margin and all text is fluid (vw-based `clamp()`).\n *\n * Each category has parallel flat lists (matched by index): `*Videos`\n * (full Vimeo URL, opened on click), `*PreviewVideos` (a lightweight\n * self-hosted clip used for the hover loop; leave an index empty to fall\n * back to a slower Vimeo-iframe preview) and, for the list layout,\n * `*Items` (title / category / year).\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function ServicesInteractive(props){const layoutMode=props.layoutMode??\"wall\";const soundDesignTitle=props.soundDesignTitle??\"Sound Design\";const soundDesignDescription=props.soundDesignDescription??\"\";const soundDesignVideos=props.soundDesignVideos&&props.soundDesignVideos.length>0?props.soundDesignVideos:FALLBACK_VIDEOS;const soundDesignPreviewVideos=props.soundDesignPreviewVideos??FALLBACK_PREVIEWS;const soundDesignItems=props.soundDesignItems??[];const musicTitle=props.musicTitle??\"Music\";const musicDescription=props.musicDescription??\"\";const musicVideos=props.musicVideos&&props.musicVideos.length>0?props.musicVideos:FALLBACK_VIDEOS;const musicPreviewVideos=props.musicPreviewVideos??FALLBACK_PREVIEWS;const musicItems=props.musicItems??[];const otherTitle=props.otherTitle??\"Other\";const otherDescription=props.otherDescription??\"\";const otherVideos=props.otherVideos&&props.otherVideos.length>0?props.otherVideos:FALLBACK_VIDEOS;const otherPreviewVideos=props.otherPreviewVideos??FALLBACK_PREVIEWS;const otherItems=props.otherItems??[];const activeScale=props.activeScale??1;const inactiveScale=props.inactiveScale??.75;const dimOpacity=props.dimOpacity??.35;const gridTopGap=props.gridTopGap??28;const gridSidePadding=props.gridSidePadding??0;const videoGap=props.videoGap??10;const videoRadius=props.videoRadius??0;const listTopGap=props.listTopGap??50;const listVideoWidthPercent=props.listVideoWidthPercent??45;const listVideoAspect=props.listVideoAspect??1.78;const listVideoRadiusPercent=props.listVideoRadius??6;const closedRowPercent=props.closedRowPercent??7.5;const openPaddingPercent=props.openPaddingPercent??13.7;const gradientRows=props.gradientRows??true;const gradientStrength=Math.min(Math.max(props.gradientStrength??85,0),100)/100;const gradientGloss=Math.min(Math.max(props.gradientGloss??60,0),100)/100;const gradientEdgeFade=Math.min(Math.max(props.gradientEdgeFade??0,0),45);// Extra page length (in screen heights) the section stays pinned for. Kept short:\n// only the gap between \"pinned\" and the surrounding page, not a scroll distance per row.\nconst pinExtraVh=Math.min(Math.max(props.scrollStepVh??30,10),100);const isList=layoutMode===\"list\";const scrollMode=isList&&(props.scrollDriven??false);const[active,setActive]=useState(\"soundDesign\");const[openIndex,setOpenIndex]=useState(0);const[scrollIndex,setScrollIndex]=useState(0);const[viewportH,setViewportH]=useState(900);const[headerH,setHeaderH]=useState(190);const categories=useMemo(()=>[{key:\"soundDesign\",title:soundDesignTitle,description:soundDesignDescription,videos:soundDesignVideos,previewVideos:soundDesignPreviewVideos,items:soundDesignItems},{key:\"music\",title:musicTitle,description:musicDescription,videos:musicVideos,previewVideos:musicPreviewVideos,items:musicItems},{key:\"other\",title:otherTitle,description:otherDescription,videos:otherVideos,previewVideos:otherPreviewVideos,items:otherItems}],[soundDesignTitle,soundDesignDescription,soundDesignVideos,soundDesignPreviewVideos,soundDesignItems,musicTitle,musicDescription,musicVideos,musicPreviewVideos,musicItems,otherTitle,otherDescription,otherVideos,otherPreviewVideos,otherItems]);const activeCategory=categories.find(c=>c.key===active)??categories[0];const videos=activeCategory.videos.slice(0,MAX_VIDEOS);const rowCount=videos.length;// List mode: row geometry follows the measured list width so everything\n// scales together at any viewport size.\nconst listRef=useRef(null);const[listWidth,setListWidth]=useState(1e3);useEffect(()=>{const el=listRef.current;if(!el||typeof ResizeObserver===\"undefined\")return undefined;const update=()=>{const width=el.getBoundingClientRect().width;if(width>0)setListWidth(width);};update();const observer=new ResizeObserver(update);observer.observe(el);return()=>observer.disconnect();},[isList,scrollMode]);// Scroll mode: measure the category header block.\nconst headerRef=useRef(null);useEffect(()=>{const el=headerRef.current;if(!scrollMode||!el||typeof ResizeObserver===\"undefined\")return undefined;const update=()=>{const height=el.getBoundingClientRect().height;if(height>0)setHeaderH(height);};update();const observer=new ResizeObserver(update);observer.observe(el);return()=>observer.disconnect();},[scrollMode]);// Scroll mode: one gesture = one row. While the section is pinned on screen the\n// wheel / touch events are taken over (the page itself stays put) and each gesture\n// moves the open row by exactly one; at the first/last row the events are left\n// alone so the page scrolls on normally.\nconst trackRef=useRef(null);const indexRef=useRef(0);const rowCountRef=useRef(0);indexRef.current=scrollIndex;rowCountRef.current=rowCount;useEffect(()=>{if(!scrollMode||typeof window===\"undefined\")return undefined;let lastStep=0;let lastWheelTime=0;let awaitingQuiet=false// set after a step: the wheel must stop completely before the next one\n;let touchY=0;let touchConsumed=false;const engaged=()=>{const el=trackRef.current;if(!el)return false;const rect=el.getBoundingClientRect();return rect.top<=1&&rect.bottom>=window.innerHeight-1;};const step=dir=>{const next=Math.min(Math.max(indexRef.current+dir,0),Math.max(rowCountRef.current-1,0));indexRef.current=next;setScrollIndex(next);lastStep=performance.now();awaitingQuiet=true;};// Scrolling past either end of the list lets the page carry on.\nconst atEnd=dir=>dir<0&&indexRef.current<=0||dir>0&&indexRef.current>=rowCountRef.current-1;const onWheel=e=>{if(e.ctrlKey||!engaged())return;const dir=Math.sign(e.deltaY);if(dir===0||atEnd(dir))return;e.preventDefault();const now=performance.now();// Every wheel event (even the tiny inertia tail) counts as \"still scrolling\".\nconst quiet=now-lastWheelTime>GESTURE_QUIET_MS;lastWheelTime=now;if(quiet)awaitingQuiet=false;if(awaitingQuiet)return;if(Math.abs(e.deltaY)<4)return;if(now-lastStep>STEP_COOLDOWN_MS)step(dir);};const onTouchStart=e=>{touchY=e.touches[0]?.clientY??0;touchConsumed=false;};const onTouchMove=e=>{if(!engaged())return;const y=e.touches[0]?.clientY??touchY;const dy=touchY-y// > 0: finger moving up = scrolling down\n;const dir=Math.sign(dy);if(dir===0||atEnd(dir))return;if(e.cancelable)e.preventDefault();if(!touchConsumed&&Math.abs(dy)>TOUCH_THRESHOLD_PX&&performance.now()-lastStep>STEP_COOLDOWN_MS){touchConsumed=true;step(dir);}};// Keep the starting row sensible when the section is entered from above or below.\nconst onScroll=()=>{const el=trackRef.current;if(!el)return;const rect=el.getBoundingClientRect();const vh=window.innerHeight;setViewportH(prev=>prev===vh?prev:vh);if(rect.top>vh*.6)setScrollIndex(prev=>prev===0?prev:0);else if(rect.bottom<vh*.4){const last=Math.max(rowCountRef.current-1,0);setScrollIndex(prev=>prev===last?prev:last);}};onScroll();window.addEventListener(\"wheel\",onWheel,{passive:false});window.addEventListener(\"touchstart\",onTouchStart,{passive:true});window.addEventListener(\"touchmove\",onTouchMove,{passive:false});window.addEventListener(\"scroll\",onScroll,{passive:true});window.addEventListener(\"resize\",onScroll);return()=>{window.removeEventListener(\"wheel\",onWheel);window.removeEventListener(\"touchstart\",onTouchStart);window.removeEventListener(\"touchmove\",onTouchMove);window.removeEventListener(\"scroll\",onScroll);window.removeEventListener(\"resize\",onScroll);};},[scrollMode]);const selectCategory=key=>{if(key===active)return;setActive(key);setOpenIndex(0);};const renderTile=(index,aspect)=>/*#__PURE__*/_jsx(VideoTile,{vimeoUrl:videos[index],previewVideoUrl:activeCategory.previewVideos[index]||\"\",radius:videoRadius,aspect:aspect},index);let body;let listShift=0;if(isList){const closedHeight=Math.max(56,Math.round(listWidth*closedRowPercent/100));const videoWidth=Math.round(listWidth*listVideoWidthPercent/100);const videoHeight=Math.round(videoWidth/Math.max(listVideoAspect,.5));const openVerticalPad=Math.round(listWidth*openPaddingPercent/100);const openHeight=videoHeight+openVerticalPad*2;const padX=Math.round(listWidth*.04);const openPadLeft=Math.round(listWidth*.012);const openPadRight=Math.round(listWidth*.026);const listVideoRadius=Math.round(videoWidth*listVideoRadiusPercent/100);const rowGap=Math.max(6,Math.round(listWidth*.008));const currentIndex=scrollMode?scrollIndex:openIndex;const safeOpenIndex=Math.min(currentIndex,Math.max(rowCount-1,0));// Scroll mode: the list lives in a clipped region under the pinned\n// header; slide it up just enough to keep the open row inside that region.\nif(scrollMode){const regionH=Math.max(viewportH-NAV_PAD-headerH-listTopGap,200);const openTop=safeOpenIndex*(closedHeight+rowGap);const needed=openTop+openHeight+16-regionH;listShift=-Math.min(Math.max(needed,0),openTop);}body=/*#__PURE__*/_jsx(\"div\",{ref:listRef,style:{marginTop:scrollMode?0:listTopGap},children:/*#__PURE__*/_jsx(AnimatePresence,{mode:\"wait\",children:/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0,y:20},animate:{opacity:1,y:0},exit:{opacity:0},transition:{duration:.4,ease:EASE},children:Array.from({length:rowCount}).map((_,i)=>{const fallback={title:`Project ${pad2(i+1)}`,category:activeCategory.title,year:\"\"};return /*#__PURE__*/_jsx(ListRow,{index:i,item:activeCategory.items[i]??fallback,open:i===safeOpenIndex,closedHeight:closedHeight,openHeight:openHeight,padX:padX,openPadLeft:openPadLeft,openPadRight:openPadRight,videoWidth:videoWidth,videoHeight:videoHeight,vimeoUrl:videos[i],previewVideoUrl:activeCategory.previewVideos[i]||\"\",radius:listVideoRadius,isLast:i===rowCount-1,gradientOn:gradientRows,strength:gradientStrength,gloss:gradientGloss,edgeFade:gradientEdgeFade,rowGap:rowGap,onHover:scrollMode?undefined:()=>setOpenIndex(i),onSelect:scrollMode?()=>setScrollIndex(i):()=>setOpenIndex(i)},i);})},activeCategory.key)})});}else{// Index 0 = hero. The rest go two per row against the cycling column\n// templates; a lone last tile falls back to a single full-width column.\nconst rows=[];if(videos.length>0){rows.push(/*#__PURE__*/_jsx(\"div\",{children:renderTile(0,HERO_ASPECT)},\"hero\"));}for(let i=1,rowIndex=0;i<videos.length;rowIndex++){const template=ROW_TEMPLATES[rowIndex%ROW_TEMPLATES.length];const count=template.split(\" \").length;const rowVideos=videos.slice(i,i+count);const columns=rowVideos.length===count?template:\"1fr\";rows.push(/*#__PURE__*/_jsx(\"div\",{style:{display:\"grid\",gridTemplateColumns:columns,gridTemplateRows:\"minmax(0, 1fr)\",columnGap:videoGap,width:\"100%\",aspectRatio:ROW_ASPECT},children:rowVideos.map((_,j)=>renderTile(i+j))},`row-${i}`));i+=rowVideos.length;}body=/*#__PURE__*/_jsx(\"div\",{style:{padding:`${gridTopGap}px ${gridSidePadding}px 0 ${gridSidePadding}px`},children:/*#__PURE__*/_jsx(AnimatePresence,{mode:\"wait\",children:/*#__PURE__*/_jsx(motion.div,{initial:{opacity:0,y:28},animate:{opacity:1,y:0},exit:{opacity:0},transition:{duration:.45,ease:[.22,1,.36,1]},style:{display:\"flex\",flexDirection:\"column\",gap:videoGap},children:rows},activeCategory.key)})});}// Header typography differs per layout (the list is full-width, so its\n// headers are larger).\nconst titleFont=isList?\"clamp(18px, 2.3vw, 56px)\":\"clamp(16px, 1.8vw, 44px)\";const titleGap=isList?\"clamp(6px, 0.8vw, 22px)\":\"clamp(6px, 0.7vw, 20px)\";const descFont=isList?\"clamp(12px, 1.2vw, 28px)\":\"clamp(11px, 0.95vw, 24px)\";const descWidth=isList?\"clamp(240px, 24vw, 600px)\":\"clamp(220px, 19vw, 520px)\";const headerBlock=/*#__PURE__*/_jsx(\"div\",{ref:headerRef,style:{display:\"flex\",flexDirection:\"row\",width:\"100%\",gap:10,alignItems:\"flex-end\",flexShrink:0},children:categories.map((category,index)=>{const isActive=category.key===active;const transformOrigin=index===0?\"bottom left\":index===categories.length-1?\"bottom right\":\"bottom center\";return /*#__PURE__*/_jsx(\"div\",{onMouseEnter:()=>selectCategory(category.key),style:{flex:\"1 1 0\",minWidth:0,padding:\"34px 0 0 0\",cursor:\"pointer\",position:\"relative\",zIndex:isActive?2:1},children:/*#__PURE__*/_jsxs(motion.div,{animate:{scale:isActive?activeScale:inactiveScale,opacity:isActive?1:dimOpacity},transition:{duration:.6,ease:[.22,1,.36,1]},style:{transformOrigin},children:[/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"'Bodoni Moda', serif\",fontWeight:500,fontSize:titleFont,lineHeight:1.1,color:INK,marginBottom:titleGap},children:category.title}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:\"Inter, sans-serif\",fontSize:descFont,lineHeight:1.45,color:MUTED,maxWidth:descWidth},children:category.description})]})},category.key);})});// Scroll mode: a track a little taller than the screen with a pinned\n// (sticky) full-height stage. The category header stays put at the top;\n// only the list region under it slides up so the open row stays on screen.\nif(scrollMode){return /*#__PURE__*/_jsx(\"div\",{ref:trackRef,style:{width:\"100%\",height:`${100+pinExtraVh}vh`,position:\"relative\"},children:/*#__PURE__*/_jsxs(\"div\",{style:{position:\"sticky\",top:0,height:\"100vh\",overflow:\"hidden\",padding:`${NAV_PAD}px 3.2vw 0 3.2vw`,boxSizing:\"border-box\",display:\"flex\",flexDirection:\"column\"},children:[headerBlock,/*#__PURE__*/_jsx(\"div\",{style:{flex:1,minHeight:0,overflow:\"hidden\",marginTop:listTopGap},children:/*#__PURE__*/_jsx(motion.div,{initial:false,animate:{y:listShift},transition:{duration:ROW_DURATION,ease:EASE},children:body})})]})});}return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",padding:isList?\"0 3.2vw 110px 3.2vw\":\"0 12.75vw 110px 12.75vw\",boxSizing:\"border-box\"},children:[headerBlock,body]});}const placeholderVideos=Array(7).fill(\"https://vimeo.com/76979871\");const emptyPreviews=[];const placeholderItems=category=>[\"ASAHI BEER Super Dry\",\"Project 02\",\"Project 03\",\"Project 04\",\"Project 05\",\"Project 06\",\"Project 07\"].map(title=>({title,category,year:\"2026\"}));const itemControl={type:ControlType.Object,controls:{title:{type:ControlType.String,defaultValue:\"Project title\"},category:{type:ControlType.String,defaultValue:\"Category\"},year:{type:ControlType.String,defaultValue:\"2026\"}}};addPropertyControls(ServicesInteractive,{layoutMode:{type:ControlType.Enum,options:[\"wall\",\"list\"],optionTitles:[\"Video wall\",\"Accordion list\"],defaultValue:\"wall\"},soundDesignTitle:{type:ControlType.String,defaultValue:\"Sound Design\"},soundDesignDescription:{type:ControlType.String,defaultValue:\"Placeholder for sonic worlds, sound systems, and immersive experiences.\"},soundDesignVideos:{type:ControlType.Array,control:{type:ControlType.String},defaultValue:placeholderVideos},soundDesignPreviewVideos:{type:ControlType.Array,control:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\",\"mov\"]},defaultValue:emptyPreviews,description:\"Upload a short muted clip per video (same order). Leave an item empty to fall back to Vimeo preview.\"},soundDesignItems:{type:ControlType.Array,control:itemControl,defaultValue:placeholderItems(\"Sound Design\"),description:\"List mode: title / category / year shown in each row (same order as the videos).\"},musicTitle:{type:ControlType.String,defaultValue:\"Music\"},musicDescription:{type:ControlType.String,defaultValue:\"Placeholder for original scores, campaigns, and music-led narratives.\"},musicVideos:{type:ControlType.Array,control:{type:ControlType.String},defaultValue:placeholderVideos},musicPreviewVideos:{type:ControlType.Array,control:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\",\"mov\"]},defaultValue:emptyPreviews,description:\"Upload a short muted clip per video (same order). Leave an item empty to fall back to Vimeo preview.\"},musicItems:{type:ControlType.Array,control:itemControl,defaultValue:placeholderItems(\"Music\"),description:\"List mode: title / category / year shown in each row (same order as the videos).\"},otherTitle:{type:ControlType.String,defaultValue:\"Other\"},otherDescription:{type:ControlType.String,defaultValue:\"Placeholder for collaborations, experiments, and unexplored directions.\"},otherVideos:{type:ControlType.Array,control:{type:ControlType.String},defaultValue:placeholderVideos},otherPreviewVideos:{type:ControlType.Array,control:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\",\"mov\"]},defaultValue:emptyPreviews,description:\"Upload a short muted clip per video (same order). Leave an item empty to fall back to Vimeo preview.\"},otherItems:{type:ControlType.Array,control:itemControl,defaultValue:placeholderItems(\"Other\"),description:\"List mode: title / category / year shown in each row (same order as the videos).\"},activeScale:{type:ControlType.Number,defaultValue:1,min:.5,max:2,step:.05},inactiveScale:{type:ControlType.Number,defaultValue:.75,min:.3,max:1,step:.05},dimOpacity:{type:ControlType.Number,defaultValue:.35,min:0,max:1,step:.05},gridTopGap:{type:ControlType.Number,defaultValue:28,min:0,max:160,step:1},gridSidePadding:{type:ControlType.Number,defaultValue:0,min:0,max:300,step:1},videoGap:{type:ControlType.Number,defaultValue:10,min:0,max:80,step:1},videoRadius:{type:ControlType.Number,defaultValue:0,min:0,max:60,step:1},listTopGap:{type:ControlType.Number,defaultValue:50,min:0,max:160,step:1,description:\"List mode: gap between the category headers and the list.\"},listVideoWidthPercent:{type:ControlType.Number,defaultValue:45,min:20,max:80,step:.1,unit:\"%\",description:\"List mode: video width as a % of the list width.\"},listVideoAspect:{type:ControlType.Number,defaultValue:1.78,min:1,max:4,step:.01,description:\"List mode: video box width / height.\"},listVideoRadius:{type:ControlType.Number,defaultValue:6,min:0,max:25,step:.1,unit:\"%\",description:\"List mode: corner radius as a % of the video width.\"},closedRowPercent:{type:ControlType.Number,defaultValue:7.5,min:3,max:25,step:.1,unit:\"%\",description:\"List mode: height of a closed row, as a % of the list width.\"},openPaddingPercent:{type:ControlType.Number,defaultValue:13.7,min:0,max:40,step:.5,unit:\"%\",description:\"List mode: empty space above and below the video in the open row, as a % of the list width.\"},gradientRows:{type:ControlType.Boolean,defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"List mode: colour closed rows with a gradient read from each video.\"},gradientStrength:{type:ControlType.Number,defaultValue:85,min:0,max:100,step:1,unit:\"%\",description:\"List mode: how strong the colour is (100% = the video's real colours; lower = paler). Text turns white on dark bars.\"},gradientGloss:{type:ControlType.Number,defaultValue:60,min:0,max:100,step:1,unit:\"%\",description:\"List mode: gloss on the bars — a light top edge, a darker bottom edge and a diagonal highlight (0 = flat).\"},gradientEdgeFade:{type:ControlType.Number,defaultValue:0,min:0,max:45,step:1,unit:\"%\",description:\"List mode: how much of each end of the bar fades out into the page background (0 = crisp edges).\"},scrollDriven:{type:ControlType.Boolean,defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"List mode: pin the section; one scroll gesture opens exactly one next/previous row. At the first/last row the page scrolls on normally. The category headers stay pinned. Click a closed row to open it.\"},scrollStepVh:{type:ControlType.Number,defaultValue:30,min:10,max:100,step:5,unit:\"vh\",description:\"Scroll mode: extra page length (in screen heights) the section stays pinned for. Keep it short.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ServicesInteractive\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ServicesInteractive.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Invisible utility: makes an ancestor element `position: sticky`.\n * Framer's own `position` XML attribute gets silently rewritten to\n * `absolute`, so this applies the style directly to the real DOM\n * node instead. Framer wraps each inserted component instance in an\n * extra container div, so `levels` counts how many `parentElement`\n * hops are needed to reach the actual section frame (2 by default).\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function StickyPin(props){const{top,zIndex,levels}=props;const ref=useRef(null);useEffect(()=>{let target=ref.current;for(let i=0;i<levels&&target;i++){target=target.parentElement;}if(!target)return undefined;const el=target;const apply=()=>{el.style.setProperty(\"position\",\"sticky\",\"important\");el.style.setProperty(\"top\",`${top}px`,\"important\");el.style.setProperty(\"z-index\",`${zIndex}`,\"important\");};apply();const observer=new MutationObserver(apply);observer.observe(el,{attributes:true,attributeFilter:[\"style\"]});return()=>observer.disconnect();},[top,zIndex,levels]);return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{width:0,height:0}});}addPropertyControls(StickyPin,{top:{type:ControlType.Number,defaultValue:70,min:0,max:300},zIndex:{type:ControlType.Number,defaultValue:1,min:0,max:10},levels:{type:ControlType.Number,defaultValue:2,min:1,max:5,step:1}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"StickyPin\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"fixed\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./StickyPin.map"],"mappings":"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"}