{"version":3,"file":"shared-lib.The47R-7.mjs","names":["useState","useRef","useCallback","_Fragment"],"sources":["https:/framerusercontent.com/modules/9xxo50nsd2KoEMWuNNSQ/Qndxl2N0pkJe3aAUW2Px/ThemeToggle.js","https:/framerusercontent.com/modules/Vgl3ltAwxDJC5eeB8V5T/kE8FUI3oynBn1p1zvzfz/frmoOjyf5.js","https:/framerusercontent.com/modules/3o6Vq7qTrZGp5KthuAzy/jqlggNh6oQIgzyBNRG2L/siteMetadata.js"],"sourcesContent":["// Theme switching for the portfolio.\n//\n// This file holds two things:\n//\n//   withThemeToggle — a code OVERRIDE applied to the marketplace SpringSwitch\n//     instance on `/`, `/work/asos-flipbook`, `/work/39bc` and\n//     `/work/foundry-court`. It carries all the theme logic and corrects the\n//     switch's colours, icon and mobile layout.\n//\n//   ThemeToggle (default export) — a self-contained pull-cord switch that\n//     renders the same control without the marketplace component. Used on the\n//     six pages the SpringSwitch could not be added to; see the note above the\n//     component for why.\n//\n// Both write the same localStorage key, so a visitor's choice carries across\n// every page regardless of which one they land on, and both draw the same\n// icon: a MOON in light, a SUN in dark.\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{forwardRef,useCallback,useEffect,useRef,useState,startTransition}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{motion,useMotionValue,useTransform}from\"framer-motion\";const STORAGE_KEY=\"theme-toggle-override\";const TOGGLE_SELECTOR='[data-framer-name=\"Theme Toggle\"]';/** How long the switch's own colours take to cross-fade on a theme change. */const THEME_FADE=\"0.4s\";/**\n * Colours for the switch's own chrome (cord + handle icon), per theme. These\n * mirror the /Portfolio Text color style.\n */const TOGGLE_CHROME_COLOR={light:\"rgb(26, 26, 26)\",dark:\"rgb(232, 232, 228)\"};/** Mirrors /Portfolio Background — the handle disc. */const HANDLE_BACKGROUND={light:\"rgb(253, 253, 252)\",dark:\"rgb(19, 19, 18)\"};/** Mirrors /Portfolio Divider — the hairline around the handle. */const HANDLE_BORDER={light:\"rgba(26, 26, 26, 0.11)\",dark:\"rgb(42, 42, 40)\"};const TOGGLE_CHROME_STYLE_ID=\"theme-toggle-chrome\";/** Marks the icon this file injects into the marketplace switch's handle. */const INJECTED_ICON_ATTR=\"data-portfolio-theme-icon\";/**\n * ICON GEOMETRY, shared by the React components and the DOM builder below so\n * the two switches cannot drift apart.\n *\n * The switch shows the theme you would GET by activating it: a moon while the\n * page is light, a sun while it is dark.\n */const MOON_PATH=\"M20.743 13.045a8.53 8.53 0 0 1-9.788-9.788 1 1 0 0 0-1.519-1.06A10 10 0 1 0 21.803 14.56a1 1 0 0 0-1.06-1.515Z\";const SUN_RAYS=[\"M12 2.25v2.5\",\"M12 19.25v2.5\",\"m4.93 4.93 1.77 1.77\",\"m17.3 17.3 1.77 1.77\",\"M2.25 12h2.5\",\"M19.25 12h2.5\",\"m4.93 19.07 1.77-1.77\",\"m17.3 6.7 1.77-1.77\"];const SVG_NS=\"http://www.w3.org/2000/svg\";/**\n * Framer paints the handle icon through an SVG sprite whose stroke reads\n * `var(--1m973uw, rgb(0,0,0))`, and it sets that custom property directly on\n * the <svg>. Overriding it needs a rule of at least equal specificity on the\n * same element — inheriting from an ancestor is not enough.\n *\n * ⚠️ This name is a Framer-generated hash tied to the current switch instance.\n * If the switch is deleted and re-inserted, re-read it from the sprite markup\n * (look for `stroke=\"var(--…)\"` inside the <svg> referenced by <use href>).\n */const ICON_COLOR_VAR=\"--1m973uw\";/** Framer's phone breakpoint. Tablet and desktop keep the cord. */const PHONE_MEDIA=\"(max-width: 809.98px)\";const PHONE_MAX_WIDTH=809.98;function getSystemTheme(){if(typeof window!==\"undefined\"&&typeof window.matchMedia===\"function\"){return window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\";}return\"light\";}function readStoredTheme(){if(typeof window!==\"undefined\"){try{const saved=window.localStorage.getItem(STORAGE_KEY);if(saved===\"light\"||saved===\"dark\")return saved;}catch(error){console.warn(\"ThemeToggle: unable to access localStorage.\",error);}}return null;}function storeTheme(theme){if(typeof window===\"undefined\")return;try{window.localStorage.setItem(STORAGE_KEY,theme);}catch(error){console.warn(\"ThemeToggle: unable to persist theme.\",error);}}let cachedThemeTokens=null;/**\n * Framer publishes color-style tokens as CSS custom properties:\n *   body { --token-xxx: <light value> }\n *   @media (prefers-color-scheme: dark) { body { --token-xxx: <dark value> } }\n *\n * That media query tracks the OS setting only, so it cannot be overridden by\n * attributes, classes or style.colorScheme. A manual toggle therefore has to\n * re-declare the token values inline on the document, which outranks both\n * rules. Values are read from the live stylesheet, so colour changes made in\n * Framer are picked up automatically.\n */function collectThemeTokens(){if(cachedThemeTokens)return cachedThemeTokens;const light={};const dark={};const isRootRule=rule=>{if(!(rule instanceof CSSStyleRule))return false;return rule.selectorText.split(\",\").some(sel=>[\"body\",\"html\",\":root\"].includes(sel.trim()));};const readTokens=(rule,target)=>{for(let i=0;i<rule.style.length;i++){const prop=rule.style[i];if(prop.startsWith(\"--token-\")){target[prop]=rule.style.getPropertyValue(prop).trim();}}};for(const sheet of Array.from(document.styleSheets)){let rules;try{rules=sheet.cssRules;}catch(error){continue;}for(const rule of Array.from(rules)){if(isRootRule(rule)){readTokens(rule,light);}else if(rule instanceof CSSMediaRule&&rule.conditionText.includes(\"prefers-color-scheme\")&&rule.conditionText.includes(\"dark\")){for(const inner of Array.from(rule.cssRules)){if(isRootRule(inner))readTokens(inner,dark);}}}}cachedThemeTokens={light,dark};return cachedThemeTokens;}/**\n * The visible switch on the four original pages is a SpringSwitch-style\n * component, not the ThemeToggle component below. Two things are corrected\n * here, both unreachable from the Framer XML:\n *\n * 1. COLOUR. The cord's `stroke` attribute and the handle icon's\n *    ICON_COLOR_VAR both ship a single value shared by BOTH themes (white /\n *    #e8e8e4), so they vanish against the light background. The cord colour\n *    sits at the component's default and so is never serialized as an\n *    attribute; the icon prop only accepts a literal colour (a color-style\n *    path silently coerces to black). Forcing both from a stylesheet works\n *    because CSS outranks SVG presentation attributes.\n *\n * 2. MOBILE LAYOUT. On phones the content column is full-bleed (24px padding),\n *    so there is no gutter and the 201px cord runs straight through the body\n *    copy — it strikes through the first line of the bio. Below 810px the cord\n *    is hidden and the handle is pulled up to the top-right corner, leaving a\n *    44×44 tap target clear of all text. Tablet and desktop keep the cord;\n *    their 620px column leaves a wide empty gutter for it.\n *\n * ⚠️ The `path[stroke]` selector is deliberately attribute-qualified. It must\n * NOT be loosened to bare `path`: the injected sun's rays are <path> elements\n * that take their colour from the parent <g>, and a blanket rule here erased\n * them (they rendered as an empty dot). The injected icon carries no `stroke`\n * attribute, so this rule cannot reach it — that is the whole point.\n */function applyToggleChrome(theme){if(typeof document===\"undefined\"||!document.head)return;const color=TOGGLE_CHROME_COLOR[theme];let style=document.getElementById(TOGGLE_CHROME_STYLE_ID);if(!style){style=document.createElement(\"style\");style.id=TOGGLE_CHROME_STYLE_ID;document.head.appendChild(style);}const next=[`${TOGGLE_SELECTOR} svg path[stroke] { stroke: ${color} !important; }`,`${TOGGLE_SELECTOR} svg, ${TOGGLE_SELECTOR} use { ${ICON_COLOR_VAR}: ${color} !important; }`,`@media ${PHONE_MEDIA} {`,`  ${TOGGLE_SELECTOR} > div > svg { display: none !important; }`,`  ${TOGGLE_SELECTOR} > div > div { margin-top: 0 !important; padding: 11px !important; cursor: pointer !important; }`,`}`].join(\"\\n\");if(style.textContent!==next)style.textContent=next;}/** Builds the moon/sun as real SVG nodes, for injection into the marketplace switch. */function buildIcon(theme,size,color){const svg=document.createElementNS(SVG_NS,\"svg\");svg.setAttribute(INJECTED_ICON_ATTR,theme);svg.setAttribute(\"viewBox\",\"0 0 24 24\");svg.setAttribute(\"width\",String(size));svg.setAttribute(\"height\",String(size));svg.setAttribute(\"fill\",\"none\");svg.setAttribute(\"aria-hidden\",\"true\");if(theme===\"light\"){const moon=document.createElementNS(SVG_NS,\"path\");moon.setAttribute(\"d\",MOON_PATH);moon.style.fill=color;svg.appendChild(moon);return svg;}const disc=document.createElementNS(SVG_NS,\"circle\");disc.setAttribute(\"cx\",\"12\");disc.setAttribute(\"cy\",\"12\");disc.setAttribute(\"r\",\"4.5\");disc.style.fill=color;svg.appendChild(disc);const rays=document.createElementNS(SVG_NS,\"g\");rays.setAttribute(\"stroke-width\",\"1.8\");rays.setAttribute(\"stroke-linecap\",\"round\");rays.style.stroke=color;rays.style.fill=\"none\";for(const d of SUN_RAYS){const ray=document.createElementNS(SVG_NS,\"path\");ray.setAttribute(\"d\",d);rays.appendChild(ray);}svg.appendChild(rays);return svg;}/**\n * Gives the marketplace switch the same moon/sun behaviour as the code\n * component below.\n *\n * ⚠️ The switch ships ONE sprite and reuses it for both themes — verified on\n * the live site: `<use href=\"#1466876926\">` is a sun in light AND dark, so the\n * moon has never appeared, despite the two handle layers being NAMED \"Moon\"\n * and \"Sun\". The glyph is baked into the sprite and the only exposed prop is a\n * colour, so it cannot be swapped from Framer. Instead: hide the sprite's own\n * <svg> and hang our own next to it.\n */function applyToggleIcon(theme){if(typeof document===\"undefined\")return;const host=document.querySelector(TOGGLE_SELECTOR);if(!host)return;const sprite=Array.from(host.querySelectorAll(\"svg\")).find(svg=>svg.querySelector(\"use\"));if(!sprite||!sprite.parentElement)return;const slot=sprite.parentElement;sprite.style.display=\"none\";const size=Number(sprite.getAttribute(\"width\"))||Math.round(sprite.getBoundingClientRect().width)||14;const existing=slot.querySelector(`[${INJECTED_ICON_ATTR}]`);if(existing&&existing.getAttribute(INJECTED_ICON_ATTR)===theme)return;if(existing)existing.remove();slot.appendChild(buildIcon(theme,size,TOGGLE_CHROME_COLOR[theme]));}function applyThemeToDocument(theme){if(typeof document===\"undefined\")return;const root=document.documentElement;const body=document.body;root.setAttribute(\"data-theme\",theme);root.setAttribute(\"data-framer-theme\",theme);root.style.colorScheme=theme;root.classList.remove(\"light\",\"dark\",\"framer-theme-light\",\"framer-theme-dark\");root.classList.add(theme,\"framer-theme-\"+theme);if(body){body.setAttribute(\"data-theme\",theme);body.setAttribute(\"data-framer-theme\",theme);body.style.colorScheme=theme;body.classList.remove(\"light\",\"dark\",\"framer-theme-light\",\"framer-theme-dark\");body.classList.add(theme,\"framer-theme-\"+theme);}const tokens=collectThemeTokens();const values=theme===\"dark\"?tokens.dark:tokens.light;for(const[prop,value]of Object.entries(values)){root.style.setProperty(prop,value);if(body)body.style.setProperty(prop,value);}applyToggleChrome(theme);applyToggleIcon(theme);}let delegationInstalled=false;export function withThemeToggle(Component){return /*#__PURE__*/forwardRef(function WithThemeToggle(props,ref){const[theme,setTheme]=useState(()=>{const saved=readStoredTheme();return saved??getSystemTheme();});const themeRef=useRef(theme);themeRef.current=theme;const[hasManualOverride,setHasManualOverride]=useState(()=>readStoredTheme()!==null);const setAndPersistTheme=useCallback(nextTheme=>{storeTheme(nextTheme);applyThemeToDocument(nextTheme);startTransition(()=>{setTheme(nextTheme);setHasManualOverride(true);});},[]);useEffect(()=>{const initialTheme=readStoredTheme()??getSystemTheme();applyThemeToDocument(initialTheme);startTransition(()=>setTheme(initialTheme));},[]);/**\n         * The switch mounts its cord and handle after this override's first\n         * effect, and it rewrites the cord's stroke attribute as it animates.\n         * Re-assert the chrome and the icon over the next second so both are\n         * in place once those nodes exist.\n         */useEffect(()=>{applyToggleChrome(theme);applyToggleIcon(theme);const timers=[0,120,600,1200].map(delay=>window.setTimeout(()=>{applyToggleChrome(theme);applyToggleIcon(theme);},delay));return()=>timers.forEach(id=>window.clearTimeout(id));},[theme]);useEffect(()=>{if(typeof window===\"undefined\"||hasManualOverride)return;const media=window.matchMedia(\"(prefers-color-scheme: dark)\");const onChange=event=>{const nextTheme=event.matches?\"dark\":\"light\";applyThemeToDocument(nextTheme);startTransition(()=>setTheme(nextTheme));};media.addEventListener(\"change\",onChange);return()=>media.removeEventListener(\"change\",onChange);},[hasManualOverride]);/**\n         * SpringSwitch does not forward event-handler props to its DOM, so\n         * onClick/onPointerDown/etc. passed to <Component> never attach —\n         * the cord animated but no toggle callback could ever fire. Instead,\n         * listen at the document level for any press that starts inside the\n         * toggle instance; a plain click, a cord pull and a tap on the mobile\n         * handle all end in a pointerup, and any of them completes the toggle.\n         */useEffect(()=>{if(typeof document===\"undefined\"||delegationInstalled)return;delegationInstalled=true;let pressStartedInToggle=false;const isInToggle=target=>target instanceof Element&&!!target.closest(TOGGLE_SELECTOR);const toggle=()=>{setAndPersistTheme(themeRef.current===\"dark\"?\"light\":\"dark\");};const onPointerDown=event=>{pressStartedInToggle=isInToggle(event.target);};const onPointerUp=()=>{if(!pressStartedInToggle)return;pressStartedInToggle=false;toggle();};const onKeyDown=event=>{const key=event.key;if((key===\"Enter\"||key===\" \")&&isInToggle(event.target)){event.preventDefault();toggle();}};document.addEventListener(\"pointerdown\",onPointerDown,true);document.addEventListener(\"pointerup\",onPointerUp,true);document.addEventListener(\"keydown\",onKeyDown,true);const host=document.querySelector(TOGGLE_SELECTOR);if(host){host.setAttribute(\"role\",\"switch\");if(!host.getAttribute(\"aria-label\"))host.setAttribute(\"aria-label\",\"Toggle theme\");host.tabIndex=0;host.style.cursor=\"pointer\";}return()=>{delegationInstalled=false;document.removeEventListener(\"pointerdown\",onPointerDown,true);document.removeEventListener(\"pointerup\",onPointerUp,true);document.removeEventListener(\"keydown\",onKeyDown,true);};},[setAndPersistTheme]);useEffect(()=>{if(typeof document===\"undefined\")return;const host=document.querySelector(TOGGLE_SELECTOR);if(host)host.setAttribute(\"aria-checked\",theme===\"dark\"?\"true\":\"false\");},[theme]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}/**\n * Horizontal offset of the cord's centre from the container's left edge. With\n * the container 56px wide and pinned 24px from the right, this puts the cord\n * 30px in from the viewport edge — matching the SpringSwitch instance.\n */const CORD_CENTRE=50;const CONTAINER_WIDTH=56;/** Invisible grab area around the handle, so the 22px disc is easy to hit. */const GRAB_SIZE=40;/** Tap target on phones, where there is no cord to pull. */const TAP_SIZE=44;/**\n * ⚠️ fill/stroke are set through `style`, not as SVG presentation attributes,\n * so they cross-fade on the same clock as the handle behind them. Flipping the\n * icon instantly while the handle was still easing made it read as the wrong\n * colour — briefly dark-on-dark — for the length of the fade.\n */function ThemeIcon({theme,size,color}){const fade=`fill ${THEME_FADE} ease, stroke ${THEME_FADE} ease`;return /*#__PURE__*/_jsx(\"svg\",{width:size,height:size,viewBox:\"0 0 24 24\",fill:\"none\",\"aria-hidden\":\"true\",children:theme===\"light\"?/*#__PURE__*/_jsx(\"path\",{d:MOON_PATH,style:{fill:color,transition:fade}}):/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"circle\",{cx:\"12\",cy:\"12\",r:\"4.5\",style:{fill:color,transition:fade}}),/*#__PURE__*/_jsx(\"g\",{strokeWidth:\"1.8\",strokeLinecap:\"round\",style:{stroke:color,fill:\"none\",transition:fade},children:SUN_RAYS.map(d=>/*#__PURE__*/_jsx(\"path\",{d:d},d))})]})});}/**\n * A self-contained pull-cord theme switch.\n *\n * WHY THIS EXISTS. The marketplace SpringSwitch takes its two handles as slot\n * props, and those props are ComponentInstance-typed: they cannot be read or\n * written over MCP, and they do not survive a copy/paste or a duplicate —\n * either yields a cord with an empty 0×0 handle and no icon. That made adding\n * it to the six remaining case studies a manual, per-page job in the\n * properties panel. This component renders the same control from code, so it\n * can be placed anywhere without wiring.\n *\n * Geometry is measured from the live SpringSwitch at 1440px so the two read as\n * the same control: a 3px cord running 201px down from the pin, centred 30px\n * from the right edge, ending in a 22px handle carrying a 14px icon.\n *\n * FOUR THINGS THAT LOOK LIKE OVER-ENGINEERING BUT ARE NOT:\n *\n * 1. IT PORTALS TO document.body. `position: fixed` only pins to the viewport\n *    when no ancestor is transformed. The published page has no transformed\n *    ancestors (verified), but Framer's PREVIEW scales the page, which makes\n *    a fixed child anchor to that scaled box instead — the switch lands on the\n *    wrong side. The portal removes it from that subtree.\n *\n * 2. ITS EVENTS ARE BOUND NATIVELY, NOT THROUGH REACT PROPS. React attaches\n *    synthetic listeners to the app's ROOT CONTAINER, and the portal puts this\n *    outside it — so `onKeyDown` silently never fired and the switch could not\n *    be operated from the keyboard. Anything portalled out of the Framer root\n *    must bind its own listeners. framer-motion's drag and tap already use\n *    native listeners, which is why the mouse kept working and hid this.\n *\n * 3. IT MEASURES ITS OWN PAGE FRAME, NOT THE WINDOW. Framer emits every\n *    breakpoint variant into the DOM and hides the inactive ones with CSS, so\n *    `window.matchMedia` cannot tell which frame this instance belongs to — in\n *    preview it reported the desktop width for the phone frame and rendered a\n *    cord where the tap button belongs. Walking up from the in-place marker to\n *    the widest ancestor gives the frame's real width (390 / 810 / 1200).\n *\n * 4. IT RENDERS NOTHING WHEN ITS MARKER IS HIDDEN. This is what stops the\n *    portal from painting three switches at once — one per breakpoint variant.\n *    Only the variant CSS leaves visible gets to draw.\n *\n * ⚠️ Do NOT name a layer holding this component \"Theme Toggle\". The\n * withThemeToggle override above injects a stylesheet keyed on\n * `[data-framer-name=\"Theme Toggle\"]` that hides `> div > svg` below 810px.\n * That rule is meant for the marketplace switch and would hide this\n * component's own cord. Name these layers \"Theme Switch\".\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n * @framerIntrinsicWidth 1\n * @framerIntrinsicHeight 1\n */export default function ThemeToggle(props){const{top,right,cordLength,cordWidth,handleSize,maxPull,ariaLabel,zIndex,style}=props;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const[theme,setTheme]=useState(()=>readStoredTheme()??getSystemTheme());const[hasManualOverride,setHasManualOverride]=useState(()=>readStoredTheme()!==null);const markerRef=useRef(null);const uiRef=useRef(null);const[placement,setPlacement]=useState(null);const pull=useMotionValue(0);const cordHeight=useTransform(pull,value=>cordLength+Math.max(0,value));/**\n     * A drag ends in both onDragEnd and a click, and a keyboard press can land\n     * alongside one too. One toggle per gesture.\n     */const lastToggleAt=useRef(0);const toggle=useCallback(()=>{const now=Date.now();if(now-lastToggleAt.current<250)return;lastToggleAt.current=now;setTheme(current=>{const next=current===\"dark\"?\"light\":\"dark\";storeTheme(next);return next;});setHasManualOverride(true);},[]);/**\n     * Applying on mount is the point of the component: it is what makes a page\n     * honour a choice the visitor made elsewhere on the site, rather than\n     * following the OS preference alone.\n     */useEffect(()=>{if(isCanvas)return;applyThemeToDocument(theme);},[theme,isCanvas]);/** Which breakpoint frame is this instance in, and is that frame visible? */useEffect(()=>{if(isCanvas)return;const measure=()=>{const el=markerRef.current;if(!el)return;const visible=el.getClientRects().length>0;let frameWidth=0;let node=el.parentElement;while(node&&node!==document.body){frameWidth=Math.max(frameWidth,node.getBoundingClientRect().width);node=node.parentElement;}if(!frameWidth)frameWidth=window.innerWidth;setPlacement(prev=>prev&&prev.visible===visible&&prev.frameWidth===frameWidth?prev:{visible,frameWidth});};measure();// Framer settles its layout after hydration; re-measure as it does.\nconst timers=[60,300,900].map(delay=>window.setTimeout(measure,delay));window.addEventListener(\"resize\",measure);window.addEventListener(\"orientationchange\",measure);return()=>{timers.forEach(id=>window.clearTimeout(id));window.removeEventListener(\"resize\",measure);window.removeEventListener(\"orientationchange\",measure);};},[isCanvas]);/**\n     * Native click/keydown binding — see note 2 in the component doc above.\n     * Deliberately re-bound on every render: the container is recreated when\n     * the breakpoint or theme changes, and a stale ref would go dead silently.\n     */useEffect(()=>{const el=uiRef.current;if(!el)return;const onClick=()=>toggle();const onKeyDown=event=>{if(event.key===\"Enter\"||event.key===\" \"){event.preventDefault();toggle();}};el.addEventListener(\"click\",onClick);el.addEventListener(\"keydown\",onKeyDown);return()=>{el.removeEventListener(\"click\",onClick);el.removeEventListener(\"keydown\",onKeyDown);};});useEffect(()=>{if(typeof window===\"undefined\"||hasManualOverride||isCanvas)return;const media=window.matchMedia(\"(prefers-color-scheme: dark)\");const onChange=event=>{startTransition(()=>setTheme(event.matches?\"dark\":\"light\"));};media.addEventListener(\"change\",onChange);return()=>media.removeEventListener(\"change\",onChange);},[hasManualOverride,isCanvas]);/**\n     * The layer's own box. Framer's `style` (width/height 1px) belongs HERE and\n     * must never reach the fixed container — spreading it there overrode the\n     * container's 56px width with 1px and pushed the cord off the right edge.\n     */const marker=/*#__PURE__*/_jsx(\"div\",{ref:markerRef,style:{width:1,height:1,pointerEvents:\"none\",...style}});/**\n     * The canvas has no viewport to pin against — Framer draws pages on a\n     * transformed, pannable surface, and every breakpoint frame is on screen at\n     * once. Nothing sensible can be drawn there, so draw nothing rather than\n     * something misleading. Use Preview (▶) to see it.\n     */if(isCanvas)return marker;if(!placement||!placement.visible)return marker;const isPhone=placement.frameWidth<=PHONE_MAX_WIDTH;const chrome=TOGGLE_CHROME_COLOR[theme];const handle=/*#__PURE__*/_jsx(\"div\",{style:{width:handleSize,height:handleSize,borderRadius:\"50%\",boxSizing:\"border-box\",background:HANDLE_BACKGROUND[theme],border:`1px solid ${HANDLE_BORDER[theme]}`,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",transition:`background-color ${THEME_FADE} ease, border-color ${THEME_FADE} ease`},children:/*#__PURE__*/_jsx(ThemeIcon,{theme:theme,size:Math.round(handleSize*.64),color:chrome})});const container={position:\"fixed\",top,right,width:CONTAINER_WIDTH,height:isPhone?TAP_SIZE:cordLength+handleSize,pointerEvents:\"none\",zIndex};const ui=isPhone?/*#__PURE__*/_jsx(\"div\",{ref:uiRef,style:container,children:/*#__PURE__*/_jsx(\"div\",{role:\"switch\",\"aria-checked\":theme===\"dark\",\"aria-label\":ariaLabel,tabIndex:0,style:{position:\"absolute\",left:CORD_CENTRE-TAP_SIZE/2,top:0,width:TAP_SIZE,height:TAP_SIZE,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",pointerEvents:\"auto\",cursor:\"pointer\",outline:\"none\",WebkitTapHighlightColor:\"transparent\"},children:handle})}):/*#__PURE__*/_jsxs(\"div\",{ref:uiRef,style:container,children:[/*#__PURE__*/_jsx(motion.div,{style:{position:\"absolute\",left:CORD_CENTRE-cordWidth/2,top:0,width:cordWidth,height:cordHeight,borderRadius:cordWidth,background:chrome,transition:`background-color ${THEME_FADE} ease`,pointerEvents:\"auto\",cursor:\"pointer\"}}),/*#__PURE__*/_jsx(motion.div,{role:\"switch\",\"aria-checked\":theme===\"dark\",\"aria-label\":ariaLabel,tabIndex:0,drag:\"y\",dragConstraints:{top:0,bottom:maxPull},dragElastic:.12,dragMomentum:false,dragSnapToOrigin:true,dragTransition:{bounceStiffness:300,bounceDamping:20},onDragEnd:toggle,style:{position:\"absolute\",left:CORD_CENTRE-GRAB_SIZE/2,top:cordLength-1-(GRAB_SIZE-handleSize)/2,width:GRAB_SIZE,height:GRAB_SIZE,y:pull,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",pointerEvents:\"auto\",cursor:\"grab\",outline:\"none\",touchAction:\"none\",WebkitTapHighlightColor:\"transparent\"},children:handle})]});return /*#__PURE__*/_jsxs(_Fragment,{children:[marker,/*#__PURE__*/createPortal(ui,document.body)]});}addPropertyControls(ThemeToggle,{top:{type:ControlType.Number,title:\"Top\",defaultValue:24,min:0,max:300,unit:\"px\",step:1},right:{type:ControlType.Number,title:\"Right\",defaultValue:24,min:0,max:300,unit:\"px\",step:1},cordLength:{type:ControlType.Number,title:\"Cord\",defaultValue:201,min:40,max:400,unit:\"px\",step:1},cordWidth:{type:ControlType.Number,title:\"Cord Width\",defaultValue:3,min:1,max:8,unit:\"px\",step:1},handleSize:{type:ControlType.Number,title:\"Handle\",defaultValue:22,min:14,max:48,unit:\"px\",step:1},maxPull:{type:ControlType.Number,title:\"Max Pull\",defaultValue:90,min:0,max:240,unit:\"px\",step:1},ariaLabel:{type:ControlType.String,title:\"Aria Label\",defaultValue:\"Toggle theme\",placeholder:\"Toggle theme\"},zIndex:{type:ControlType.Number,title:\"Z Index\",defaultValue:8,min:0,max:100,step:1,displayStepper:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ThemeToggle\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"1\",\"framerIntrinsicHeight\":\"1\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"withThemeToggle\":{\"type\":\"reactHoc\",\"name\":\"withThemeToggle\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ThemeToggle.map","// Generated by Framer (40d1ed3)\nimport{fontStore}from\"framer\";fontStore.loadFonts([]);export const fonts=[{explicitInter:true,fonts:[]}];export const css=[\".framer-Z9sM2 .framer-styles-preset-1wkz1ny:not(.rich-text-wrapper), .framer-Z9sM2 .framer-styles-preset-1wkz1ny.rich-text-wrapper a { --framer-link-hover-text-color: var(--token-20dcb3e7-13cc-49cd-9f1c-b9058ff4beee); --framer-link-hover-text-decoration: underline; --framer-link-hover-text-decoration-color: var(--token-2c207e10-c5b8-41cc-95b3-97f718465253); --framer-link-text-color: var(--token-20dcb3e7-13cc-49cd-9f1c-b9058ff4beee); --framer-link-text-decoration: underline; --framer-link-text-decoration-color: var(--token-83cee1ef-ee2f-404a-8771-39be95f51a64); --framer-link-text-decoration-offset: 3px; --framer-link-text-decoration-thickness: 1px; transition-delay: 0s; transition-duration: 0.18s; transition-property: color,text-decoration-color,text-decoration-thickness,text-underline-offset; transition-timing-function: cubic-bezier(0.44, 0, 0.56, 1); }\"];export const className=\"framer-Z9sM2\";\nexport const __FramerMetadata__ = {\"exports\":{\"className\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fonts\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"css\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// Generated by Framer (089ff9b)\nexport default function metadata(params,activeLocale){return{description:\"Personal portfolio for Kim Michelle Lee, a marketer and builder working across strategy, copy, design, build, and AI workflows.\",favicon:\"https://framerusercontent.com/assets/1ZiGYq5G5IIbMlUCWFZpcbhHek0.jpg\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/NxyDO5iVLPOcsSDMjODYC9DjP8.jpg\",title:\"Kim Michelle Lee\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}