{"version":3,"file":"shared-lib.D70l6r_A.mjs","names":["useState","useRef"],"sources":["https:/framerusercontent.com/modules/HDAkrahb3ethcU2GAef2/nCb5ot8a39Uw7ZcMqia0/tokens.js","https:/framerusercontent.com/modules/YFy4SNb784n2qKl2hppy/GBtnVzB0BJq3YcX7fdeG/motion.js"],"sourcesContent":["// ─── Primitive layer — what colors ARE ───────────────────────────────────────\n// Raw values only. No role names. Components never import this directly.\nexport const colors={// Core palette (2026-09-22 system redesign)\nslate:\"#3d3c34\",yellow:\"#faf06b\",red:\"#ea5932\",ember:\"#b9783a\",creamWarm:\"#fffbe6\",// Text-safe tints — solid colors, verified ≥4.5:1 on creamWarm/white. TEXT/foreground use only.\nslateSecondary:\"#58564b\",slateTertiary:\"#757465\",redText:\"#c05033\",redTextHover:\"#ae4c33\",yellowFillHover:\"#ebe165\",emberText:\"#9c6838\",// Opacity variants — non-text overlays only (scrims, dividers, image overlays). Never use for body/label text — see slateSecondary/slateTertiary above.\nslateMuted:\"rgba(61,60,52,0.55)\",slateFaint:\"rgba(61,60,52,0.30)\",slateHair:\"rgba(61,60,52,0.12)\",// Opacity variants — cream (warm)\ncreamMuted:\"rgba(255,251,230,0.70)\",creamFaint:\"rgba(255,251,230,0.30)\",// Legacy / unused\ncream:\"#fff9e5\",gold:\"#cad02d\",goldDark:\"#8f8439\",orange:\"#f26422\",blue:\"#0057bd\",cyan:\"#00b7e1\",pink:\"#fe75ad\",offWhite:\"#f7f7f7\"};// ─── Semantic layer — what colors DO ─────────────────────────────────────────\n// Role aliases pointing to primitives. Components use this for all role-based colors.\n// Section background strategy (2026-09-23): one cream. Rhythm comes from colour bands, not cream ↔ white —\n// page rhythm \"Illustration-led\": red hero → slate feature, cream for reading, yellow for join/newsletter, slate footer.\n// Two touching sections with the same surface get the semantic.border hairline (Section.tsx borderBottom/join).\nexport const semantic={// Text hierarchy — all AA-verified (≥4.5:1) on surface and surfaceYellow (textTertiary: 4.0:1 on yellow — large text only there)\ntextPrimary:colors.slate,textSecondary:colors.slateSecondary,textTertiary:colors.slateTertiary,// Cream text — the text color for surfaceDark, surfaceRed AND surfaceEmber (2026-09-23 decision).\n// 10.7:1 on slate; 3.4:1 on red and 3.5:1 on ember → large text only on red/ember (see below).\ntextOnDark:colors.creamWarm,// Section backgrounds — default warm cream; alternate or apply section-specific tone\nsurface:colors.creamWarm,surfaceAlt:colors.creamWarm,// \"surfaceAlt\", FoodSystemSection, OurRole, LandingHero, PastEventsGallery) migrate to \"surface\"\nsurfaceDark:colors.slate,// Colored section backgrounds — full section backgrounds are allowed for all three (2026-09-23).\n// Raw brand colors, exactly as given — no tinting or darkening.\n// Yellow pairs with textPrimary. Red and ember pair with textOnDark (cream) — NOT slate (slate is 3.2/3.1:1).\n// Cream on red/ember only clears 3.4/3.5:1: large text (≥24px, or ≥19px bold), illustration, buttons\n// (which sit on their own fill) and cards only — never body-sized copy directly on the band.\n// Hero subline on red stays above the illustration and is set at large-text size.\nsurfaceYellow:colors.yellow,surfaceRed:colors.red,surfaceEmber:colors.ember,// Interactive — TEXT/foreground use only (links, hover color, focus rings, icons). Yellow cannot\n// serve this role (1.1:1 on cream, illegible as text) — see interactiveFill below for the yellow brand fill.\n// Link hover varies by surface (2026-09-23): interactive on surface; interactiveOnDark on surfaceDark;\n// on surfaceYellow/Red/Ember hover keeps the text color and adds an underline (no palette text color passes there).\ninteractive:colors.redText,interactiveHover:colors.redTextHover,interactiveOnDark:colors.yellow,// Interactive fill — BACKGROUND/BORDER use only (buttons, progress bars, dots, active borders/rings).\n// Always pair with textPrimary or surface on top — never textOnDark (yellow fails against white/cream text).\ninteractiveFill:colors.yellow,interactiveFillHover:colors.yellowFillHover,// Accent — red fill for badges, alerts, section accents. Large text (≥18.66px, or ≥14pt bold) or\n// icons only on top (~3.2–3.4:1) — never small body text; use interactive/interactiveHover for red-as-text.\naccent:colors.red,accentHover:\"#de5632\",// Tertiary — ember fill for warmth/heritage accents. Large text or icons only on top (~3.1:1) —\n// never small body text; use colors.emberText (4.5:1) if ember-as-text is needed.\ntertiary:colors.ember,tertiaryHover:\"#b07339\",// Borders and dividers — slate at low opacity (decorative hairline only, not a state indicator)\nborder:colors.slateHair,// Status — form/inline feedback text (e.g. newsletter, contact form submit results). The brand\n// palette has no green/blue (adding one needs asking first — see color-system exploration notes),\n// so success reuses textPrimary and must pair with an icon or copy, never color alone (WCAG 1.4.1).\nsuccess:colors.slate,error:colors.redText};// ─── Component layer — component-specific tokens ──────────────────────────────\nexport const component={cardTextMuted:colors.creamWarm,navSurface:colors.creamWarm,backToTopInk:colors.creamMuted,headingOnCream:colors.red,// Card type accents — \"colour-coded\" cards (2026-09-23): cards stay neutral cream; ONE element per type\n// carries its colour (event date block, programme thumb, news tag, press mark). Fill use only.\ncardAccentEvent:colors.red,cardAccentProgram:colors.ember,cardAccentNews:colors.yellow,cardAccentPress:colors.slate,// Focus — no rings/outlines around elements (2026-09-23 decision).\n// Links & buttons: highlighter fill behind the label. Form fields: the field's own border thickens by 1px, nothing else.\nfocusFill:colors.yellow,focusFillOnYellow:colors.slate,inputBorder:colors.slateFaint,inputBorderWidth:1,inputBorderWidthActive:2};// ─── Typography ───────────────────────────────────────────────────────────────\nexport const typography={// Desktop\ndisplay:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:700,fontSize:\"4rem\",lineHeight:\"1em\",letterSpacing:\"-0.03em\"},h1:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"3.4rem\",lineHeight:\"1.05em\",letterSpacing:\"-0.02em\"},h2:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"2.8rem\",lineHeight:\"1.1em\",letterSpacing:\"-0.02em\"},h3:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"2.25rem\",lineHeight:\"1.2em\",letterSpacing:\"-0.01em\"},h4:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:400,fontSize:\"1.375rem\",lineHeight:\"1.25em\",letterSpacing:\"-0.01em\"},body:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:400,fontSize:\"1rem\",lineHeight:\"1.65em\",letterSpacing:\"0px\"},label:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:600,fontSize:\"0.78rem\",lineHeight:\"1.4em\",letterSpacing:\"0.04em\"},labelMuted:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:400,fontSize:\"0.7rem\",lineHeight:\"1.4em\",letterSpacing:\"0.04em\"},eyebrow:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:500,fontSize:\"0.7rem\",lineHeight:\"1.4em\",letterSpacing:\"0.12em\",textTransform:\"uppercase\"},nav:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:500,fontSize:\"0.88rem\",lineHeight:\"1.2em\",letterSpacing:\"0.02em\"},emphasis:{fontFamily:\"'Spectral', serif\",fontWeight:700,fontSize:\"0.88rem\",lineHeight:\"1.4em\",letterSpacing:\"0.02em\"},// Mobile variants\ndisplayMobile:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:700,fontSize:\"2.25rem\",lineHeight:\"1.1em\",letterSpacing:\"-0.02em\"},// Mobile heading scale widened 2026-09-23 (was 28 / 20.8 / 19.5px — headings barely above 16px body)\nh1Mobile:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"2.25rem\",lineHeight:\"1.1em\",letterSpacing:\"-0.015em\"},h2Mobile:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"1.75rem\",lineHeight:\"1.15em\",letterSpacing:\"-0.01em\"},h3Mobile:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"1.375rem\",lineHeight:\"1.25em\",letterSpacing:\"-0.005em\"},h4Mobile:{fontFamily:\"'Bricolage Grotesque', sans-serif\",fontWeight:500,fontSize:\"1.125rem\",lineHeight:\"1.35em\",letterSpacing:\"0px\"},bodyMobile:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:400,fontSize:\"1rem\",lineHeight:\"1.6em\",letterSpacing:\"0px\"},eyebrowMobile:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:500,fontSize:\"0.72rem\",lineHeight:\"1.4em\",letterSpacing:\"0.12em\",textTransform:\"uppercase\"},navMobile:{fontFamily:\"'Epilogue', sans-serif\",fontWeight:500,fontSize:\"0.88rem\",lineHeight:\"1.2em\",letterSpacing:\"0.02em\"},emphasisMobile:{fontFamily:\"'Spectral', serif\",fontWeight:700,fontSize:\"0.88rem\",lineHeight:\"1.4em\",letterSpacing:\"0.02em\"}};export default function Tokens(){return null;}// ─── Spacing ──────────────────────────────────────────────────────────────────\nexport const space={sectionDesktop:\"120px\",sectionTablet:\"80px\",sectionMobile:\"56px\",containerDesktop:\"96px\",containerTablet:\"48px\",containerMobile:\"28px\",gapStandard:\"16px\",gapSmall:\"8px\",gapLarge:\"24px\"};// ─── Layout ───────────────────────────────────────────────────────────────────\nexport const layout={headerGapDesktop:\"56px\",headerGapTablet:\"40px\",headerGapMobile:\"32px\",cardPadding:\"24px\",containerMax:1400,headingMax:\"680px\",bodyMax:\"560px\"};// ─── Radius ───────────────────────────────────────────────────────────────────\n// Capped at 8px max site-wide (2026-09-23 decision). Perfect circles (border-radius: 50%\n// on icon buttons, avatars, hover-ripple rings) are an intentional shape, not a radius value\n// scaled from this table, and are explicitly exempt — see PROJECT_CONTEXT.md §5.\nexport const radius={card:\"8px\",button:\"8px\",label:\"8px\"};// ─── Button ───────────────────────────────────────────────────────────────────\nexport const button={iconDesktop:\"40px\",iconMobile:\"32px\"};// Elevation — PROJECT_CONTEXT.md §14's universal card-hover shadow, rebased from the old ink\n// rgb(28,28,28) to slate rgb(61,60,52) — was duplicated as a raw string in ProjectCard.tsx/ProgramCard.tsx.\nexport const shadow={card:\"0 16px 48px rgba(61,60,52,0.12)\",cardOff:\"0 16px 48px rgba(61,60,52,0)\",// Cream card on a cream surface (2026-09-23: white card fill retired) — hairline + soft lift at rest,\n// same two layers on hover so the transition interpolates. On any non-cream surface the card lifts on its own.\ncardRest:\"0 0 0 1px rgba(61,60,52,0.12), 0 4px 16px rgba(61,60,52,0.06)\",cardRestHover:\"0 0 0 1px rgba(61,60,52,0.12), 0 16px 48px rgba(61,60,52,0.12)\"};export function surfaceInk(tone=\"surface\"){const bg=semantic[tone];if(tone===\"surfaceDark\")return{// All text on slate is full cream — no muted/tinted cream for copy (2026-09-23: faded cream read as grey).\nbg,dark:true,text:semantic.textOnDark,textSecondary:semantic.textOnDark,textTertiary:semantic.textOnDark,eyebrow:semantic.textOnDark,link:semantic.textOnDark,linkHover:semantic.interactiveOnDark,linkHoverUnderline:false,fill:semantic.interactiveFill,fillText:semantic.textPrimary,fillHover:semantic.interactiveFillHover,border:colors.creamFaint,borderStrong:colors.creamMuted,card:colors.creamWarm,heading:semantic.textOnDark,accent:colors.yellow};if(tone===\"surfaceRed\"||tone===\"surfaceEmber\")return{bg,dark:true,text:semantic.textOnDark,textSecondary:semantic.textOnDark,textTertiary:semantic.textOnDark,eyebrow:semantic.textOnDark,link:semantic.textOnDark,linkHover:semantic.textOnDark,linkHoverUnderline:true,fill:semantic.interactiveFill,fillText:semantic.textPrimary,fillHover:semantic.interactiveFillHover,border:colors.creamFaint,borderStrong:semantic.textOnDark,card:colors.creamWarm,heading:semantic.textOnDark,accent:semantic.textOnDark};if(tone===\"surfaceYellow\")return{bg,dark:false,text:semantic.textPrimary,textSecondary:semantic.textSecondary,textTertiary:semantic.textSecondary,eyebrow:semantic.textPrimary,link:semantic.textPrimary,linkHover:semantic.textPrimary,linkHoverUnderline:true,fill:component.focusFillOnYellow,fillText:semantic.textOnDark,fillHover:colors.slateSecondary,border:colors.slateHair,borderStrong:colors.slateFaint,card:colors.creamWarm,heading:semantic.textPrimary,accent:semantic.textPrimary};return{bg,dark:false,text:semantic.textPrimary,textSecondary:semantic.textSecondary,textTertiary:semantic.textTertiary,eyebrow:semantic.interactive,link:semantic.textPrimary,linkHover:semantic.interactive,linkHoverUnderline:false,fill:semantic.interactiveFill,fillText:semantic.textPrimary,fillHover:semantic.interactiveFillHover,border:semantic.border,borderStrong:component.inputBorder,card:colors.creamWarm,heading:component.headingOnCream,accent:semantic.textPrimary};}// Header lede (intro paragraph under an h1). On red/ember no palette color passes AA at body size, so the\n// lede steps up to the h4 scale there — the \"text above the illustration is set large\" rule. Elsewhere: body.\nexport function ledeType(tone,isMobile){if(tone===\"surfaceRed\"||tone===\"surfaceEmber\")return isMobile?typography.h4Mobile:typography.h4;return isMobile?typography.bodyMobile:typography.body;}// Focus — no rings (2026-09-23). Returns CSS for `selector:focus-visible`.\n//   \"link\":   highlighter fill behind the label (yellow, or slate on yellow surfaces)\n//   \"button\": the filled button shows its hover fill (pass it as `fill`) — a highlighter on a filled button would vanish.\n//             Without `fill`: slate (or yellow on surfaceYellow).\n//   \"input\":  the field's own border thickens 1px → 2px, same color. Nothing else.\nexport function focusCss(selector,kind,tone=\"surface\",fill){const onYellow=tone===\"surfaceYellow\";if(kind===\"input\")return`${selector}{outline:none}${selector}:focus,${selector}:focus-visible{outline:none;border-width:${component.inputBorderWidthActive}px}`;if(kind===\"button\"){const f=fill??(onYellow?{bg:semantic.interactiveFill,fg:semantic.textPrimary}:{bg:colors.slate,fg:semantic.textOnDark});return`${selector}:focus-visible{outline:none;background-color:${f.bg} !important;color:${f.fg} !important}`;}return`${selector}:focus-visible{outline:none;background:${onYellow?component.focusFillOnYellow:component.focusFill};color:${onYellow?semantic.textOnDark:semantic.textPrimary} !important;border-radius:4px;box-decoration-break:clone;-webkit-box-decoration-break:clone}`;}// ─── Spacing resolver ─────────────────────────────────────────────────────────\n// The one place responsive section spacing is decided. Full-width sections pass their own\n// measured width (= frame width). Never pass a card's width — see PROJECT_CONTEXT.md §6 and §8.\nexport const breakpoints={tablet:768,desktop:1024};export function getSpacing(width){const tier=width<breakpoints.tablet?\"mobile\":width<breakpoints.desktop?\"tablet\":\"desktop\";const pick=(mobile,tablet,desktop)=>tier===\"mobile\"?mobile:tier===\"tablet\"?tablet:desktop;return{tier,isMobile:tier===\"mobile\",isTablet:tier===\"tablet\",isDesktop:tier===\"desktop\",hPad:pick(space.containerMobile,space.containerTablet,space.containerDesktop),vPad:pick(space.sectionMobile,space.sectionTablet,space.sectionDesktop),headerGap:pick(layout.headerGapMobile,layout.headerGapTablet,layout.headerGapDesktop)};}\nexport const __FramerMetadata__ = {\"exports\":{\"colors\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"surfaceInk\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"semantic\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"component\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"focusCss\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Tier\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"space\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"breakpoints\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"layout\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"button\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"SurfaceTone\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"radius\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"getSpacing\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"SurfaceInk\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"Spacing\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"shadow\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ledeType\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"typography\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./tokens.map","// WoF motion tokens — single source of truth for all animation work.\n// Read MOTION_SYSTEM.md before making any changes here.\n// Do not introduce new curves or durations without updating both files.\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{useScroll,useSpring,useTransform,animate}from\"framer-motion\";import{RenderTarget}from\"framer\";// ─── Easing ──────────────────────────────────────────────────────────────────\n// Framer-array form: [x1, y1, x2, y2]\nexport const ease={primary:[.5,0,0,1],text:[.38,.005,.215,1],spring:[.2,.8,.4,1.1],inOut:[.455,.03,.515,.955],scroll:[.33,1,.68,1]};// CSS string form: for inline style `transition` values\nexport const easeCss={primary:\"cubic-bezier(0.5, 0, 0, 1)\",text:\"cubic-bezier(0.38, 0.005, 0.215, 1)\",spring:\"cubic-bezier(0.2, 0.8, 0.4, 1.1)\",inOut:\"cubic-bezier(0.455, 0.03, 0.515, 0.955)\",scroll:\"cubic-bezier(0.33, 1, 0.68, 1)\"};// ─── Duration (seconds) ──────────────────────────────────────────────────────\nexport const dur={micro:.2,short:.4,medium:.65,long:.85,page:1,landing:1.3};// ─── Stagger ─────────────────────────────────────────────────────────────────\nexport const stagger={item:.12,layer:.25,maxDepth:4};// ─── Motion constants ─────────────────────────────────────────────────────────\nexport const HERO_RISE_Y=40// px — hero content Y offset (§4.3)\n;export const ICON_NOD_Y=12// % — button icon nod on hover (§4.7)\n;export const PRESS_SCALE=.98// × the element's current scale while pressed (§4.7a)\n;// ─── Transition helpers ───────────────────────────────────────────────────────\n// Standard scroll-reveal — transform + opacity with split easing (§4.4 simple elements)\nexport function revealTransition(delaySec=0){return[`transform ${dur.medium}s ${easeCss.primary} ${delaySec}s`,`opacity   ${dur.medium}s ${easeCss.text}    ${delaySec}s`].join(\", \");}// Hero content rise — longer duration (§4.3)\nexport function heroTransition(delaySec=0){return[`transform ${dur.long}s ${easeCss.primary} ${delaySec}s`,`opacity   ${dur.long}s ${easeCss.text}    ${delaySec}s`].join(\", \");}// Card background bloom — spring scale only, no opacity (§4.4 cards with visible bg)\n// Hidden state: scale(0). Visible state: scale(1).\nexport function cardBgTransition(delaySec=0){return`transform ${dur.medium}s ${easeCss.spring} ${delaySec}s`;}// Card content layer — rises from slightly above, fades in after background (§4.4)\n// Hidden state: translateY(-10px) opacity 0. Visible: translateY(0) opacity 1.\n// Default delay matches stagger.layer (0.25s) so content follows the background.\nexport function cardContentTransition(delaySec=stagger.layer){return[`transform ${dur.short}s ${easeCss.inOut} ${delaySec}s`,`opacity   ${dur.short}s ${easeCss.inOut} ${delaySec}s`].join(\", \");}// ─── Component-scoped inertial scroll (new — pending MOTION_SYSTEM.md write-up) ──────\n//\n// A spring-damped scroll progress, scoped to one element's own bounds via `target: ref`.\n// Unlike §4.8 parallax (useScroll + useTransform, 1:1 with scroll position), this value\n// LAGS the real scroll position and settles into it — the \"weighted glide\" feel, confined\n// entirely to the calling component. It never touches window/document scroll structure,\n// so it's safe next to <Section pinned> (position: sticky) elsewhere on the page.\n//\n// Do not use on a component whose motion is already driven by useSection().progress\n// (OurRole, StackedCards, and other `pinned` consumers) — that progress is real-time by\n// design (it drives things like a synced needle/step position) and a spring on top of it\n// would fight, not complement, the existing timing. Also skip on components with their own\n// dedicated sequence rather than a scroll reveal (e.g. LandingHero's circle).\n//\n// Overdamped on purpose: no bounce/overshoot (matches §6 — spring overshoot is reserved\n// for micro-interactions only, never primary reveals).\nexport function useInertialProgress(ref,options){const{scrollYProgress}=useScroll({target:ref,offset:[\"start 0.9\",\"start 0.2\"]});return useSpring(scrollYProgress,{damping:options?.damping??30,stiffness:options?.stiffness??90,mass:options?.mass??.6});}// ─── Component-scoped parallax + inertia (new — pending MOTION_SYSTEM.md write-up) ───\n//\n// Continuous drift for a VISUAL layer (image, illustration) as it transits the viewport —\n// §4.8's existing parallax idea (position depends on scroll), but inertia-damped so the\n// drift itself has a little weight rather than tracking scroll 1:1. `distance` is the total\n// px travel (±distance/2 around rest), kept small per §4.8 (\"keep parallax depth subtle\").\n//\n// Targets a VISUAL element only, never a text block — moving running text against nothing\n// reads as jitter, not depth (see PROJECT_CONTEXT.md §6 \"Animating text size or weight\").\n// For the entrance fade-up on text, use useInertialProgress above instead; the two combine\n// cleanly on a hero that has both an image column and a text column, each with its own ref.\nexport function useParallaxY(ref,distance=24,options){const{scrollYProgress}=useScroll({target:ref,offset:[\"start end\",\"end start\"]});const smooth=useSpring(scrollYProgress,{damping:options?.damping??30,stiffness:options?.stiffness??90,mass:options?.mass??.6});return useTransform(smooth,[0,1],[distance/2,-distance/2]);}// ─── Animated window scroll (new — pending MOTION_SYSTEM.md write-up) ─────────\n//\n// Scrolls the window to `top` using the SAME easing vocabulary as everything else\n// (ease.primary, a flat token duration — never distance-scaled, matching how every\n// other WoF transition works: dur.* is always a fixed number, not a function of\n// how far something travels). Native `window.scrollTo({behavior:\"smooth\"})` uses\n// the browser's own fixed, non-configurable curve, which is why nav-to-section\n// scrolling read as a different, less refined motion than the rest of the site.\n// Reduced motion: jump instantly, no animation (matches every other helper here).\n// isAutoScrolling(): true while one of these runs, so scroll listeners (Section's step paging) can tell a\n// programmatic glide (back to top, marker click) from the user's own momentum.\n// `top` may be a function: it is re-read every frame, so the glide lands where the target is at the end,\n// not where it was when the glide started (see scrollToTarget below).\nlet autoScrolls=0;export function isAutoScrolling(){return autoScrolls>0;}export function animatedScrollTo(top,durationSec=dur.medium,easing=ease.primary){if(typeof window===\"undefined\")return;const to=typeof top===\"function\"?top:()=>top;if(prefersReducedMotion()){window.scrollTo({top:to(),behavior:\"auto\"});return;}const start=window.scrollY;if(Math.abs(to()-start)<1)return;autoScrolls++;let done=false;const finish=()=>{if(!done){done=true;autoScrolls--;}};animate(0,1,{duration:durationSec,ease:easing,onUpdate:v=>window.scrollTo(0,start+(to()-start)*v),onComplete:finish});setTimeout(finish,durationSec*1e3+200)// in case onComplete never fires (interrupted)\n;}// ─── Scroll to a section (2026-10-08) ─────────────────────────────────────────\n//\n// pageTop: an element's top in page coordinates from the offsetTop chain, so transforms don't move it\n// (getBoundingClientRect includes the §4.4 reveal's 24px `translate` while a heading waits below the fold).\n// Not for elements inside a sticky frame (Section pinned); target the section around it instead.\nexport function pageTop(el){let y=0;for(let n=el;n;n=n.offsetParent)y+=n.offsetTop;return y;}// scrollToTarget: glide to getTop() (null = not on the page yet) with animatedScrollTo on ease.scroll, re-reading\n// the target every frame. ease.scroll, not ease.primary: primary's slow start left the page still for ~120ms after a\n// click (5% of the way at 100ms) and then raced (up to 580px a frame), which read as lag. With `settle` (a page that has just loaded), wait until the target has held still for\n// SETTLE_MS first: code components render at their 1200px default width before they measure, so on a phone\n// the page is about twice its real height for the first frames (/about, 2026-10-08: \"Hoe wij werken\" read\n// at 7011px, 3029px 40ms later), and a glide aimed then ran to the bottom of the page.\nconst SETTLE_MS=250;export const SECTION_GLIDE=\"wof:section-glide\";export function scrollToTarget(getTop,opts={}){if(typeof window===\"undefined\")return;const t0=performance.now();let last=null;let stillSince=t0;const begin=()=>{opts.onStart?.();window.dispatchEvent(new Event(SECTION_GLIDE))// Navigation keeps the bar shown, so every jump ends with it in view\n;animatedScrollTo(()=>Math.max(0,getTop()??window.scrollY),opts.durationSec??dur.medium,ease.scroll);};const wait=()=>{const top=getTop();const now=performance.now();if(top===null){if(now-t0<3e3)requestAnimationFrame(wait);return;}if(!opts.settle)return begin();if(last===null||Math.abs(top-last)>1){last=top;stillSince=now;}if(now-stillSince>=SETTLE_MS||now-t0>2500)return begin();requestAnimationFrame(wait);};wait();}// navBarHeight: how much of the top of the screen the site nav bar covers once it settles — the space it reserves in\n// the page (Navigation.tsx data-wof-nav), 0 while it is hidden on scroll or hasn't entered yet. Not the drawn bar:\n// that animates its height after a size change, while the page content moves at once, so a glide aimed at the\n// drawn bar landed 13–30px off for a section near the top of the page (2026-10-08).\nexport function navBarHeight(){if(typeof document===\"undefined\")return 0;const nav=document.querySelector(\"[data-wof-nav]\");return!nav||nav.hasAttribute(\"data-wof-nav-hidden\")?0:nav.offsetHeight;}// scrollToSection: every in-page section jump (§4.7c) — glide so the element's top edge (or, with `below`, its\n// bottom edge: \"scroll past this hero\") sits right under the nav bar.\nexport function scrollToSection(getEl,opts={}){scrollToTarget(()=>{const el=getEl();if(!el||!el.offsetParent)return null// not rendered yet, or hidden\n;return pageTop(el)+(opts.below?el.offsetHeight:0)-navBarHeight();},opts);}// ─── Reduced motion ───────────────────────────────────────────────────────────\nexport function prefersReducedMotion(){if(typeof window===\"undefined\")return false;return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;}// ─── Card & row interaction (MOTION_SYSTEM §4.6a, §4.7a) ──────────────────────\n//\n// One source for \"is this card active?\", so hover, keyboard and touch behave the same on every card:\n//   active  — mouse/pen hover, OR keyboard focus (:focus-visible) on the card, a link inside it, or the\n//             Framer link around it. Focus shows the hover state instead of a ring (2026-09-23 decision).\n//             Touch never sets it: a tap fires pointerenter too, which started the flood right before\n//             the page changed.\n//   pressed — pointer held down: scale × PRESS_SCALE, arrow nudge doubled. On touch it waits\n//             TOUCH_PRESS_DELAY so a scroll that starts on a card doesn't wobble it; a quick tap still\n//             gets a short press.\n//   side    — the half the pointer came in from; the flood sweeps in from there (floodStyle).\n//   wrapped — whether a Framer link already wraps the card (null until mounted). When it doesn't and the\n//             card has a URL, render <CardLink>: a real <a> over the card (keyboard, cmd-click, copy link).\n//             Decided after mount because a card inside a Framer link must never contain a second <a>.\n// Callers still skip transforms on the canvas and with reduced motion.\nconst TOUCH_PRESS_DELAY=60// ms\n;export function useCardInteraction(ref){const[hover,setHover]=useState(false);const[focus,setFocus]=useState(false);const[pressed,setPressed]=useState(false);const[side,setSide]=useState(\"left\");const[wrapped,setWrapped]=useState(null);const timer=useRef(undefined);const pending=useRef(false);useEffect(()=>{const el=ref.current;if(!el)return;const anchor=el.parentElement?el.parentElement.closest(\"a\"):null;setWrapped(!!anchor);const target=anchor||el;if(anchor)anchor.style.outline=\"none\"// the card's active state is the focus indicator\n;const onIn=e=>{let visible=true;try{visible=e.target.matches(\":focus-visible\");}catch{}if(visible){setSide(\"left\");setFocus(true);}};const onOut=()=>setFocus(false);// Back/forward cache restores React state as it was at the click — clear it\nconst onShow=e=>{if(e.persisted){setHover(false);setFocus(false);setPressed(false);}};target.addEventListener(\"focusin\",onIn);target.addEventListener(\"focusout\",onOut);window.addEventListener(\"pageshow\",onShow);return()=>{target.removeEventListener(\"focusin\",onIn);target.removeEventListener(\"focusout\",onOut);window.removeEventListener(\"pageshow\",onShow);clearTimeout(timer.current);};},[]);const release=()=>{clearTimeout(timer.current);pending.current=false;setPressed(false);};const handlers={onPointerEnter:e=>{if(e.pointerType===\"touch\")return;const r=e.currentTarget.getBoundingClientRect();setSide(e.clientX>r.left+r.width/2?\"right\":\"left\");setHover(true);},onPointerLeave:e=>{setHover(false);if(e.pointerType!==\"touch\")release()// touch \"leaves\" on every lift — keep the tap's short press\n;},onPointerDown:e=>{if(e.button!==0)return;clearTimeout(timer.current);if(e.pointerType!==\"touch\"){setPressed(true);return;}pending.current=true;timer.current=setTimeout(()=>{pending.current=false;setPressed(true);},TOUCH_PRESS_DELAY);},onPointerUp:e=>{if(e.pointerType===\"touch\"&&pending.current){// A tap shorter than the delay: show the press briefly anyway\nclearTimeout(timer.current);pending.current=false;setPressed(true);timer.current=setTimeout(()=>setPressed(false),dur.micro*1e3);return;}release();},onPointerCancel:()=>release()};return{active:hover||focus,pressed,side,wrapped,handlers};}// A real link over the whole card, for cards that aren't inside a Framer link (see `wrapped` above).\n// The card needs position: relative. Its own active state is the focus indicator, so no ring.\nexport function CardLink({href,label}){const external=/^https?:\\/\\//.test(href);return /*#__PURE__*/_jsx(\"a\",{href:href,\"aria-label\":label,target:external?\"_blank\":undefined,rel:external?\"noopener noreferrer\":undefined,style:{position:\"absolute\",inset:0,zIndex:3,borderRadius:\"inherit\",outline:\"none\",WebkitTapHighlightColor:\"transparent\"}});}// Mouse/trackpad available? False on phones and tablets. Hover-only content must be shown statically\n// when false (PROJECT_CONTEXT §14: no content that only a mouse can reveal). SSR assumes true.\nexport function useCanHover(){const[can,setCan]=useState(true);useEffect(()=>{if(typeof window===\"undefined\"||!window.matchMedia)return;const mq=window.matchMedia(\"(hover: hover) and (pointer: fine)\");const update=()=>setCan(mq.matches);update();mq.addEventListener?.(\"change\",update);return()=>mq.removeEventListener?.(\"change\",update);},[]);return can;}// The flood (PROJECT_CONTEXT §14): sweeps in from the side the pointer entered (dur.short, ease.spring — was\n// dur.medium until 2026-09-24, \"too slow\"), and on exit FADES out in step with the text colour (dur.short,\n// ease.inOut) — retracting it left half-reverted cream text over bare cream for ~150ms. The scale resets only\n// after the fade. The text colour must never lead the sweep (cream text on cream): give the card's text colour\n// transition the same `sec`. EventCard passes dur.micro (2026-09-24, \"still too slow\" — event cards only).\n// Reduced motion: opacity only, both ways.\nexport function floodStyle(on,side,noMotion,sec=dur.short){if(noMotion)return{opacity:on?1:0,transition:`opacity ${sec}s ${easeCss.inOut}`};return{transformOrigin:`${side} center`,transform:on?\"scaleX(1)\":\"scaleX(0)\",opacity:on?1:0,transition:on?`transform ${sec}s ${easeCss.spring}, opacity 0s`:`opacity ${sec}s ${easeCss.inOut}, transform 0s linear ${sec}s`};}const NUDGE_PX={internal:[4,0],external:[2,-2],down:[0,3],download:[0,2],up:[0,-3]};export function arrowNudge(dir,active,pressed=false){if(!active&&!pressed)return\"none\";const[x,y]=NUDGE_PX[dir];const k=pressed?2:1;return`translate(${x*k}px, ${y*k}px)`;}const revealSubs=new Map;let revealIO=null;let revealBatch=[];let revealFrame=0;let revealNextFree=0// seconds (performance.now) — the earliest start of the next reveal\n;function flushReveals(){revealFrame=0;const now=performance.now()/1e3;// Nothing starts while the page hero is still rising — checked at every flush, not only for content on screen at\n// mount: a hero that first renders in another layout (AboutHero on a phone, 2026-10-12) can move content into\n// view a moment later, and that content arrives here through the scroll observer.\nconst hold=now+heroRiseWait();revealNextFree=Math.max(revealNextFree,hold);const cap=hold+(stagger.maxDepth-1)*stagger.item;const rows=revealBatch.map(el=>({el,r:el.getBoundingClientRect()}));rows.sort((a,b)=>Math.round(a.r.top/8)-Math.round(b.r.top/8)||a.r.left-b.r.left);let t=Math.max(now,revealNextFree);for(const{el}of rows){const at=Math.min(t,cap);const sub=revealSubs.get(el);revealSubs.delete(el);revealIO?.unobserve(el);if(sub)sub(at-now);t=at+stagger.item;}revealNextFree=t;revealBatch=[];}function queueReveal(el){if(revealSubs.has(el)&&!revealBatch.includes(el))revealBatch.push(el);}function scheduleFlush(){if(revealBatch.length&&!revealFrame)revealFrame=requestAnimationFrame(flushReveals);}// The bottom 10% of the screen is excluded so content rises a little after it enters — but the last ~10% of\n// the PAGE can never get above that line (footer bottom bar on a tall screen). Once the page can't scroll any\n// further, everything still waiting that is on screen reveals, in the same order.\nfunction revealAtPageEnd(){if(!revealSubs.size)return;const root=document.documentElement;if(window.scrollY+window.innerHeight<root.scrollHeight-2)return;revealSubs.forEach((_,el)=>{const r=el.getBoundingClientRect();if(r.top<window.innerHeight&&r.bottom>0)queueReveal(el);});scheduleFlush();}// How long until the page hero's rise (heroRise, §4.3) has started its last item, plus one stagger step, so\n// content on screen at load follows the hero instead of leading it. 0 when there is no hero or it has played.\nfunction heroRiseWait(){let wait=0;document.querySelectorAll(\".wof-hero\").forEach(h=>{const d=parseFloat(getComputedStyle(h).getPropertyValue(\"--wof-d\"))||.4;const anim=typeof h.getAnimations===\"function\"?h.getAnimations()[0]:null;const elapsed=anim&&typeof anim.currentTime===\"number\"?anim.currentTime/1e3:0;wait=Math.max(wait,d+stagger.item-elapsed);});return Math.max(0,wait);}function watchReveal(el,sub,now=false){if(now){// On screen at load: no observer, straight into the queue (it sorts top → bottom with the others)\nrevealSubs.set(el,sub);revealBatch.push(el);scheduleFlush();return()=>{revealSubs.delete(el);revealBatch=revealBatch.filter(x=>x!==el);};}if(!revealIO){revealIO=new IntersectionObserver(entries=>{for(const e of entries)if(e.isIntersecting)queueReveal(e.target);scheduleFlush();},{threshold:0,rootMargin:\"0px 0px -10% 0px\"});window.addEventListener(\"scroll\",revealAtPageEnd,{passive:true});window.addEventListener(\"resize\",revealAtPageEnd,{passive:true});}revealSubs.set(el,sub);revealIO.observe(el);requestAnimationFrame(revealAtPageEnd)// a page too short to scroll at all\n;return()=>{revealSubs.delete(el);revealIO?.unobserve(el);revealBatch=revealBatch.filter(x=>x!==el);};}const REVEAL_Y=24// px (§4.4)\n;export const REVEAL_FAILSAFE_S=2.5// s — pending content fades in on its own if JS never runs (site head code keyframes)\n;export function useReveal(ref,transition){const[state,setState]=useState(()=>RenderTarget.current()===RenderTarget.canvas?\"rest\":\"pending\");const[delay,setDelay]=useState(0);const reduced=useRef(false);useEffect(()=>{const el=ref.current;if(!el||typeof window===\"undefined\"||typeof IntersectionObserver===\"undefined\"||RenderTarget.current()===RenderTarget.canvas){setState(\"rest\");return;}const onScreen=el.getBoundingClientRect().top<window.innerHeight;// The failsafe already showed it (a very slow load): leave it as it is rather than hide it again\nif(onScreen&&parseFloat(getComputedStyle(el).opacity)>.5){setState(\"rest\");return;}reduced.current=prefersReducedMotion();setState(\"hidden\");let done;const stop=watchReveal(el,d=>{setDelay(d);setState(\"in\");done=setTimeout(()=>setState(\"rest\"),(d+dur.medium)*1e3+50);},onScreen);return()=>{stop();clearTimeout(done);};},[]);const own=transition?[transition]:[];if(state===\"pending\")return{opacity:0,animation:`wofRevealFailsafe ${dur.short}s ${easeCss.text} ${REVEAL_FAILSAFE_S}s forwards`,transition:own.join(\", \")||\"none\"};if(state===\"rest\")return transition?{transition}:{};if(state===\"hidden\")return{opacity:0,translate:reduced.current?undefined:`0 ${REVEAL_Y}px`,transition:own.join(\", \")||\"none\"};const parts=[`opacity ${dur.medium}s ${easeCss.text} ${delay}s`];if(!reduced.current)parts.push(`translate ${dur.medium}s ${easeCss.primary} ${delay}s`);return{opacity:1,translate:reduced.current?undefined:\"0 0\",transition:[...parts,...own].join(\", \")};}// ─── Hero rise on page load (MOTION_SYSTEM §4.3, 2026-10-06) ─────────────────────────────────\n//\n// Pure CSS, so it plays from the server-rendered HTML on first paint without waiting for JS (no flash of\n// visible-then-hidden text). Render <HeroRiseStyles /> once in the hero, then spread heroRise(i) on each\n// item in reading order: i = 0 → delay 0.4s, then stagger.item per item (§4.3). translate 40px → 0 + opacity,\n// dur.long, ease.primary (translate) + ease.text (opacity). Reduced motion: opacity only. Canvas: pass\n// `off` (no animation, so the canvas shows the final layout).\nconst HERO_CSS=`\n@keyframes wofHeroY { from { translate: 0 ${HERO_RISE_Y}px } to { translate: 0 0 } }\n@keyframes wofHeroO { from { opacity: 0 } to { opacity: 1 } }\n.wof-hero { animation: wofHeroY ${dur.long}s ${easeCss.primary} var(--wof-d, 0.4s) both, wofHeroO ${dur.long}s ${easeCss.text} var(--wof-d, 0.4s) both; }\n@media (prefers-reduced-motion: reduce) { .wof-hero { animation: wofHeroO ${dur.long}s ${easeCss.text} var(--wof-d, 0.4s) both; } }\n`;export function HeroRiseStyles(){return /*#__PURE__*/_jsx(\"style\",{children:HERO_CSS});}export function heroRise(index,off=false){if(off)return{};return{className:\"wof-hero\",style:{[\"--wof-d\"]:`${(.4+index*stagger.item).toFixed(2)}s`}};}// §4.4 rise for content that appears after a click (Meer laden, a filter change). Items past\n// stagger.maxDepth arrive together with the 4th. No-op with reduced motion.\nexport function revealIn(el,index=0){if(typeof el.animate!==\"function\"||prefersReducedMotion())return;el.animate([{opacity:0,transform:\"translateY(24px)\"},{opacity:1,transform:\"none\"}],{duration:dur.medium*1e3,easing:easeCss.primary,delay:Math.min(index,stagger.maxDepth-1)*stagger.item*1e3,fill:\"backwards\"});}export default function Motion(){return null;}\nexport const __FramerMetadata__ = {\"exports\":{\"floodStyle\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"easeCss\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"revealIn\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"heroTransition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"stagger\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"SECTION_GLIDE\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"cardBgTransition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"dur\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"isAutoScrolling\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"scrollToTarget\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCanHover\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ArrowDir\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"scrollToSection\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ease\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ICON_NOD_Y\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"navBarHeight\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"prefersReducedMotion\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"EnterSide\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"revealTransition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useCardInteraction\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"PRESS_SCALE\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useParallaxY\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HERO_RISE_Y\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useInertialProgress\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"heroRise\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"arrowNudge\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"cardContentTransition\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"HeroRiseStyles\":{\"type\":\"reactComponent\",\"name\":\"HeroRiseStyles\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"REVEAL_FAILSAFE_S\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CardLink\":{\"type\":\"reactComponent\",\"name\":\"CardLink\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"pageTop\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"animatedScrollTo\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useReveal\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./motion.map"],"mappings":"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"}