{"version":3,"file":"TerminalNav.CD6XSpPJ.mjs","names":["React.useState","React.useRef","React.useMemo"],"sources":["https:/framerusercontent.com/modules/FxGpNp4RZ5ODlbJ0LKzd/FgDGs4yDHKZzWJFpzYIY/TerminalNav.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";// Framer can pass a colour prop as a hex string or as rgb()/var(...) at\n// different points, and that representation isn't guaranteed to be\n// identical between the server's pre-render and the client's hydration\n// pass. Interpolating a raw colour prop straight into a style string (in\n// a template literal) then risks the two renders producing different\n// text for that attribute — a real, confirmed cause of hydration errors\n// on this project (see memory on bradleyowen.ca's hydration issue).\n// Parsing and re-serializing to one canonical rgb()/rgba() form fixes\n// that regardless of which format was passed in. Same pattern already\n// used in AlterEgos.tsx/BetterSection.tsx/ContactSection.tsx.\nfunction toRGB(c){const hex=(c||\"\").match(/#([0-9a-f]{3,8})\\b/i);if(hex){let h=hex[1];if(h.length<=4)h=h.split(\"\").map(x=>x+x).join(\"\");const n=parseInt(h.slice(0,6),16);return[n>>16&255,n>>8&255,n&255];}const m=(c||\"\").match(/rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i);return m?[+m[1],+m[2],+m[3]]:[0,0,0];}function rgba(c,a){const[r,g,b]=toRGB(c);return`rgba(${r},${g},${b},${a})`;}const ITEMS=[\"Story\",\"Better & Better\",\"Alter Egos\",\"Blog\",\"Contact\"];const ANCHORS=[\"#story\",\"#better-better\",\"#alter-egos\",\"#blog\",\"#contact\"];export default function TerminalNav(props){const{green,cream,black,fontFamily}=props;const[open,setOpen]=React.useState(false);const[cursorOn,setCursorOn]=React.useState(true);const[menuPulse,setMenuPulse]=React.useState(false);const itemRefs=React.useRef([]);// Stable per-index ref setters. An inline `ref={(el) => ...}` is a new\n// function every render, which makes React tear the ref down to null\n// and reattach it on every re-render — including the cursor's own\n// 530ms blink tick. The typing sequence below can land on that\n// momentary null and silently abort after the first item, so these\n// setters are memoized once instead.\nconst itemRefSetters=React.useMemo(()=>ITEMS.map((_,i)=>el=>{itemRefs.current[i]=el;}),[]);// ---- Custom terminal-caret cursor, site-wide ------------------------\n// Framer only writes <html lang=\"...\"> when a project has more than\n// one locale configured; this site has just the one default locale, so\n// the published page ships with no lang attribute at all (confirmed on\n// the live site, not just a guess). Set it client-side instead — this\n// is the one component mounted on every page, so it lives here.\nReact.useEffect(()=>{if(typeof document===\"undefined\")return;if(!document.documentElement.lang){document.documentElement.lang=\"en\";}},[]);// Swaps the native pointer for a blinking green caret with a short\n// fading trail. Desktop-only (a real mouse, not touch) and off entirely\n// under prefers-reduced-motion, where it would just be noise. This is\n// the one component mounted on every page, so it lives here.\nconst caretRef=React.useRef(null);const trailLayerRef=React.useRef(null);React.useEffect(()=>{const fine=typeof window!==\"undefined\"&&window.matchMedia?.(\"(pointer: fine)\").matches;const reduced=typeof window!==\"undefined\"&&window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;if(!fine||reduced)return;const caretNode=caretRef.current;const trailNode=trailLayerRef.current;if(!caretNode||!trailNode)return;const caret=caretNode;const trailLayer=trailNode;const prevCursor=document.documentElement.style.cursor;document.documentElement.style.cursor=\"none\";let lastTrailAt=0;let hovering=false;const setScale=()=>{caret.style.transform=`translate(-50%,-50%) scale(${hovering?1.8:1})`;};setScale();const interactiveSelector='a, button, [role=\"button\"], input, textarea, select, [data-cursor-hover]';function onMove(e){caret.style.left=e.clientX+\"px\";caret.style.top=e.clientY+\"px\";caret.style.opacity=\"1\";const now=e.timeStamp||performance.now();if(now-lastTrailAt>55){lastTrailAt=now;const ghost=document.createElement(\"span\");ghost.style.position=\"fixed\";ghost.style.left=e.clientX+\"px\";ghost.style.top=e.clientY+\"px\";ghost.style.width=\"5px\";ghost.style.height=\"5px\";ghost.style.marginLeft=\"-2.5px\";ghost.style.marginTop=\"-2.5px\";ghost.style.background=green;ghost.style.opacity=\"0.55\";ghost.style.pointerEvents=\"none\";ghost.style.transition=\"opacity 0.45s ease, transform 0.45s ease\";trailLayer.appendChild(ghost);requestAnimationFrame(()=>{ghost.style.opacity=\"0\";ghost.style.transform=\"scale(0.3)\";});setTimeout(()=>ghost.remove(),480);}const target=e.target;const isInteractive=!!target?.closest(interactiveSelector);if(isInteractive!==hovering){hovering=isInteractive;setScale();}}function onLeave(){caret.style.opacity=\"0\";}function onEnter(){caret.style.opacity=\"1\";}window.addEventListener(\"mousemove\",onMove,{passive:true});document.documentElement.addEventListener(\"mouseleave\",onLeave);document.documentElement.addEventListener(\"mouseenter\",onEnter);return()=>{document.documentElement.style.cursor=prevCursor;window.removeEventListener(\"mousemove\",onMove);document.documentElement.removeEventListener(\"mouseleave\",onLeave);document.documentElement.removeEventListener(\"mouseenter\",onEnter);trailLayer.innerHTML=\"\";};},[green]);React.useEffect(()=>{function onPulse(){setMenuPulse(true);setTimeout(()=>setMenuPulse(false),2200);}window.addEventListener(\"nav-pulse-better\",onPulse);return()=>window.removeEventListener(\"nav-pulse-better\",onPulse);},[]);React.useEffect(()=>{const id=setInterval(()=>setCursorOn(v=>!v),530);return()=>clearInterval(id);},[]);// Ambient \"click me\" glow on [ menu ], always on (separate CSS property\n// from the one-time nav-pulse-better burst below, so the two layer\n// instead of fighting over the same style). Desktop also gets\n// section-locking scroll-snap here, since this is the one component\n// that's always mounted on every page.\nconst css=`\n@keyframes menuGlow {\n  0%, 100% { filter: drop-shadow(0 0 1px ${rgba(green,1)}) drop-shadow(0 0 2px ${rgba(green,1)}); }\n  50% { filter: drop-shadow(0 0 6px ${rgba(green,1)}) drop-shadow(0 0 15px ${rgba(green,1)}); }\n}\n@media (min-width: 760px) {\n  html { scroll-snap-type: y mandatory; }\n}\n.bo-arrow-hint { display: none; }\n@media (min-width: 760px) {\n  .bo-arrow-hint { display: flex; }\n}\n@keyframes caretBlink {\n  0%, 45% { opacity: 1; }\n  50%, 95% { opacity: 0.15; }\n  100% { opacity: 1; }\n}\n`;React.useEffect(()=>{if(!open)return;let idx=0;function typeItem(el,text,onDone){el.innerHTML=\"\";const prompt=document.createElement(\"span\");prompt.textContent=\"> \";prompt.style.color=green;el.appendChild(prompt);let i=0;function step(){if(i>=text.length){onDone();return;}const ch=document.createElement(\"span\");ch.textContent=text[i];ch.style.color=green;el.appendChild(ch);i++;setTimeout(()=>{Array.from(el.children).slice(1).forEach(c=>c.style.color=cream);step();},9);}step();}function next(){if(idx>=ITEMS.length)return;const el=itemRefs.current[idx];if(!el)return;typeItem(el,ITEMS[idx],()=>{idx++;setTimeout(next,40);});}next();// Unconditional backstop: if the step-by-step typewriter chain\n// gets interrupted partway (observed in the wild — a pre-existing\n// hydration-recovery remount elsewhere on this page can tear this\n// effect down mid-sequence), the menu must never show blank or\n// half-typed items. A flat pass a couple seconds later fills in\n// whatever isn't already complete, in the same resting colours\n// the finished typewriter effect leaves behind.\n// Deliberately NOT cleared on effect cleanup/unmount: if something\n// is remounting this component faster than 2.5s repeatedly, a\n// cancellable timer would just keep resetting and never fire. This\n// one is allowed to outlive its effect and simply no-ops safely if\n// the refs it touches are gone by the time it runs.\nwindow.setTimeout(()=>{ITEMS.forEach((text,i)=>{const el=itemRefs.current[i];if(!el||el.textContent===\"> \"+text)return;el.innerHTML=\"\";const prompt=document.createElement(\"span\");prompt.textContent=\"> \";prompt.style.color=green;el.appendChild(prompt);const rest=document.createElement(\"span\");rest.textContent=text;rest.style.color=cream;el.appendChild(rest);});},2500);},[open]);// ---- Ambient telemetry HUD -------------------------------------------\n// A small always-on corner readout: the visitor's own local clock, and\n// which section they're currently on. Genuine, computed values only —\n// no invented personal stats — kept quiet (low contrast, small type) so\n// it rewards attention without competing with the actual content.\nconst[clock,setClock]=React.useState(\"\");const[sectionLabel,setSectionLabel]=React.useState(\"\");const SECTIONS=[[\"story\",\"story\"],[\"better-better\",\"better_and_better\"],[\"alter-egos\",\"alter_egos\"],[\"blog\",\"blog\"],[\"contact\",\"contact\"]];React.useEffect(()=>{if(typeof window!==\"undefined\"&&window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches)return;function tick(){setClock(new Date().toLocaleTimeString([],{hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\",hour12:false}));}tick();const id=setInterval(tick,1e3);let raf=0;function onScroll(){if(raf)return;raf=requestAnimationFrame(()=>{raf=0;let current=\"\";for(const[id]of SECTIONS){const el=document.getElementById(id);if(el&&el.getBoundingClientRect().top<=120)current=id;}const found=SECTIONS.find(([id])=>id===current);setSectionLabel(found?found[1]:\"\");});}onScroll();window.addEventListener(\"scroll\",onScroll,{passive:true});return()=>{clearInterval(id);window.removeEventListener(\"scroll\",onScroll);if(raf)cancelAnimationFrame(raf);};},[]);// ---- Arrow-key section jump (desktop) --------------------------------\n// ArrowDown/ArrowUp jump to the next/previous top-level stop (top of\n// page, then each main section in order), layered on top of normal\n// scroll/trackpad rather than replacing it. Jumps the whole section,\n// not each Story chapter individually — those stay on native scroll.\n// Ignored while typing in a form field (the Contact section has\n// inputs) or while the full-screen menu is open.\nReact.useEffect(()=>{const STOPS=[null,...SECTIONS.map(([id])=>id)];function currentStopIndex(){let idx=0;SECTIONS.forEach(([id],i)=>{const el=document.getElementById(id);if(el&&el.getBoundingClientRect().top<=120)idx=i+1;});return idx;}function onKeyDown(e){if(e.key!==\"ArrowDown\"&&e.key!==\"ArrowUp\")return;if(open)return;// StorySection.tsx owns ArrowDown/ArrowUp itself while it's\n// centered in view (steps through its 9 chapters) — this must\n// stay out of its way rather than double-handle the same\n// keypress. Same \"in view\" test it uses internally.\nconst storyEl=document.getElementById(\"story\");if(storyEl){const r=storyEl.getBoundingClientRect();const storyInView=r.top<=window.innerHeight/2&&r.bottom>=window.innerHeight/2;if(storyInView)return;}const target=e.target;const tag=target?.tagName;if(tag===\"INPUT\"||tag===\"TEXTAREA\"||tag===\"SELECT\"||target?.isContentEditable)return;e.preventDefault();const reduced=typeof window!==\"undefined\"&&window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;const behavior=reduced?\"auto\":\"smooth\";const next=Math.min(STOPS.length-1,Math.max(0,currentStopIndex()+(e.key===\"ArrowDown\"?1:-1)));const id=STOPS[next];if(!id){window.scrollTo({top:0,behavior});return;}document.getElementById(id)?.scrollIntoView({behavior});}window.addEventListener(\"keydown\",onKeyDown);return()=>window.removeEventListener(\"keydown\",onKeyDown);},[open]);// Small burst of bits from the click point, launching the visitor to\n// the destination section — a lighter, DOM-span echo of the same bits\n// engine Hero/BetterSection/ContactSection use, scoped to one quick\n// radial burst rather than a full explode/assemble sequence.\nconst burstLayerRef=React.useRef(null);function burstAt(x,y){const stage=burstLayerRef.current;if(!stage||typeof window!==\"undefined\"&&window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches)return;const N=14;for(let i=0;i<N;i++){const el=document.createElement(\"span\");el.textContent=Math.random()>.5?\"1\":\"0\";el.style.position=\"fixed\";el.style.left=x+\"px\";el.style.top=y+\"px\";el.style.color=green;el.style.fontFamily=\"'JetBrains Mono', monospace\";el.style.fontWeight=\"700\";el.style.fontSize=10+Math.random()*10+\"px\";el.style.textShadow=`0 0 6px ${green}`;el.style.pointerEvents=\"none\";el.style.opacity=\"1\";el.style.transition=\"transform 0.55s cubic-bezier(0.2,0.7,0.3,1), opacity 0.55s ease\";stage.appendChild(el);const ang=Math.random()*Math.PI*2;const dist=40+Math.random()*90;requestAnimationFrame(()=>{el.style.transform=`translate(${Math.cos(ang)*dist}px, ${Math.sin(ang)*dist-20}px) scale(0.4)`;el.style.opacity=\"0\";});setTimeout(()=>el.remove(),600);}}function handleClick(anchor,e){// TEMP DEBUG — remove once the Better & Better / Alter Egos menu\n// bug is confirmed fixed.\nconsole.log(`[DEBUG t=${Date.now()}] TerminalNav.handleClick anchor=${anchor} scrollY=${window.scrollY}`);burstAt(e?e.clientX:window.innerWidth/2,e?e.clientY:window.innerHeight/2);setOpen(false);// Announce the destination before the scroll starts. Sections\n// along the way (e.g. Better & Better, when the target is further\n// down like Alter Egos) use this to suppress their own\n// scroll-position auto-triggers for the duration of the jump —\n// trying to infer \"is this scroll just passing through\" from\n// scroll-event timing alone proved unreliable (a long native\n// smooth scroll doesn't fire one for every intermediate\n// position), so this makes the intent explicit instead of\n// inferring it.\nconsole.log(`[DEBUG t=${Date.now()}] TerminalNav dispatching nav-scroll-target detail=${anchor}`);window.dispatchEvent(new CustomEvent(\"nav-scroll-target\",{detail:anchor}));setTimeout(()=>{const el=document.querySelector(anchor);console.log(`[DEBUG t=${Date.now()}] TerminalNav starting scrollIntoView(${anchor}) found=${!!el} scrollY=${window.scrollY}`);if(el)el.scrollIntoView({behavior:\"smooth\"});},140);}return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",fontFamily},children:[/*#__PURE__*/_jsx(\"link\",{href:\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap\",rel:\"stylesheet\"}),/*#__PURE__*/_jsx(\"style\",{children:css}),clock&&/*#__PURE__*/_jsxs(\"div\",{\"aria-hidden\":\"true\",style:{position:\"fixed\",left:24,bottom:\"calc(20px + env(safe-area-inset-bottom, 0px))\",zIndex:5,color:cream,opacity:.35,fontSize:11,letterSpacing:.5,pointerEvents:\"none\",display:\"flex\",gap:10},children:[/*#__PURE__*/_jsx(\"span\",{children:clock}),sectionLabel&&/*#__PURE__*/_jsxs(\"span\",{children:[\"~/\",/*#__PURE__*/_jsx(\"span\",{style:{color:green},children:sectionLabel})]})]}),/*#__PURE__*/_jsxs(\"div\",{className:\"bo-arrow-hint\",\"aria-hidden\":\"true\",style:{position:\"fixed\",right:24,bottom:\"calc(20px + env(safe-area-inset-bottom, 0px))\",zIndex:5,color:cream,opacity:open?0:.35,fontSize:11,letterSpacing:.5,pointerEvents:\"none\",alignItems:\"center\",gap:6,transition:\"opacity 0.3s ease\"},children:[/*#__PURE__*/_jsx(\"span\",{style:{color:green},children:\"↑↓\"}),/*#__PURE__*/_jsx(\"span\",{children:\"navigate\"})]}),/*#__PURE__*/_jsx(\"div\",{ref:burstLayerRef,\"aria-hidden\":\"true\",style:{position:\"fixed\",inset:0,zIndex:999,pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"div\",{ref:trailLayerRef,\"aria-hidden\":\"true\",style:{position:\"fixed\",inset:0,zIndex:1e3,pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"div\",{ref:caretRef,\"aria-hidden\":\"true\",style:{position:\"fixed\",left:\"-100px\",top:\"-100px\",width:\"3px\",height:\"18px\",background:rgba(green,1),boxShadow:`0 0 6px ${rgba(green,1)}`,opacity:0,pointerEvents:\"none\",zIndex:1001,transition:\"opacity 0.2s ease, transform 0.12s ease\",animation:\"caretBlink 1.1s step-end infinite\"}}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",alignItems:\"flex-start\",gap:10,padding:\"20px 32px\"},children:[/*#__PURE__*/_jsxs(\"div\",{id:\"bo-wordmark\",style:{color:cream,fontWeight:700,fontSize:16,letterSpacing:1,cursor:\"default\"},children:[\"BRADLEY OWEN\",/*#__PURE__*/_jsx(\"span\",{style:{color:green,opacity:cursorOn?1:0},children:\"_\"})]}),/*#__PURE__*/_jsx(\"div\",{style:{display:\"inline-block\",animation:\"menuGlow 2.6s ease-in-out infinite\"},children:/*#__PURE__*/_jsx(\"div\",{id:\"bo-menu-btn\",onClick:()=>setOpen(true),style:{color:green,fontSize:15,cursor:\"pointer\",border:`1px solid ${rgba(green,1)}`,borderRadius:4,padding:\"6px 14px\",transform:`scale(${menuPulse?1.5:1})`,transformOrigin:\"left center\",transition:\"transform 0.5s cubic-bezier(0.3,0.6,0.3,1), text-shadow 0.5s ease, box-shadow 0.5s ease\",textShadow:menuPulse?`0 0 10px ${rgba(green,1)}, 0 0 28px ${rgba(green,1)}, 0 0 50px ${rgba(green,1)}`:\"none\",boxShadow:menuPulse?`0 0 12px ${rgba(green,1)}`:\"none\"},children:\"[ menu ]\"})})]}),open&&/*#__PURE__*/_jsxs(\"div\",{style:{position:\"fixed\",inset:0,background:black,display:\"flex\",flexDirection:\"column\",justifyContent:\"center\",alignItems:\"flex-start\",padding:\"0 60px\",gap:18,zIndex:999},children:[/*#__PURE__*/_jsx(\"div\",{onClick:()=>setOpen(false),style:{position:\"absolute\",top:24,right:32,color:cream,cursor:\"pointer\",fontSize:14},children:\"[x] close\"}),ITEMS.map((item,i)=>/*#__PURE__*/_jsx(\"div\",{ref:itemRefSetters[i],onClick:e=>handleClick(ANCHORS[i],e),onMouseEnter:e=>{Array.from(e.currentTarget.children).slice(1).forEach(c=>c.style.color=green);},onMouseLeave:e=>{Array.from(e.currentTarget.children).slice(1).forEach(c=>c.style.color=cream);},style:{color:cream,fontSize:32,cursor:\"pointer\",minHeight:38}},item)),/*#__PURE__*/_jsx(\"div\",{style:{marginTop:40,color:\"#5f5e5a\",fontSize:13},children:\"$ whoami_\"})]})]});}TerminalNav.defaultProps={green:\"#8fbf6f\",cream:\"#f2ede3\",black:\"#0b0b0a\",fontFamily:\"'JetBrains Mono', monospace\"};addPropertyControls(TerminalNav,{green:{type:ControlType.Color,title:\"Green accent\"},cream:{type:ControlType.Color,title:\"Cream text\"},black:{type:ControlType.Color,title:\"Background\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TerminalNav\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TerminalNav.map"],"mappings":"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"}