:root{
  --night:#050A14; --ink:#F4F8FF; --mute:#9DB2CC; --blue:#3EA6FF; --red:#FF2D4A; --gold:#FFC93C;
  --acc:var(--blue); --glass:rgba(255,255,255,.06); --edge:rgba(255,255,255,.16);
  --line:rgba(255,255,255,.16); --card:rgba(255,255,255,.06); --steel:var(--blue); --live:var(--red);
  --display:"Barlow Condensed","Arial Narrow",Impact,sans-serif;
  --body:"Barlow",system-ui,-apple-system,"Segoe UI",sans-serif;
}
html[data-live="baseball"],html[data-live="personal"]{--acc:var(--red)}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;background:var(--night);overflow-x:clip}
body{margin:0;color:var(--ink);font:400 17px/1.45 var(--body);overflow-x:clip;
  background:radial-gradient(120% 70% at 50% 0%,#12305A 0%,#050A14 60%) fixed var(--night)}
a{color:inherit}
:focus-visible{outline:3px solid var(--gold);outline-offset:3px}

#fx{position:fixed;inset:0;width:100%;height:100%;z-index:0;display:block}
.veil{position:fixed;inset:0;z-index:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(5,10,20,0) 30%,rgba(5,10,20,.55) 100%)}
.wrap{position:relative;z-index:1;max-width:560px;margin:0 auto;padding:28px max(18px,env(safe-area-inset-right)) 72px max(18px,env(safe-area-inset-left))}

/* Bottom bar on /, /baseball, /projects and /gaming. Sits above the iPhone home indicator. */
:root{--nav:58px}
.nav{position:fixed;left:0;right:0;bottom:0;z-index:4;display:flex;justify-content:center;
  padding:0 max(6px,env(safe-area-inset-right)) env(safe-area-inset-bottom) max(6px,env(safe-area-inset-left));
  background:rgba(5,10,20,.86);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border-top:1px solid var(--edge)}
.nav a{position:relative;flex:1;max-width:150px;min-height:var(--nav);display:flex;align-items:center;justify-content:center;
  color:var(--mute);text-decoration:none;font:800 italic 20px/1 var(--display);text-transform:uppercase;letter-spacing:.04em}
.nav a[aria-current]{color:var(--ink)}
.nav a[aria-current]::before{content:"";position:absolute;top:-1px;left:20%;right:20%;height:4px;background:var(--acc);transform:skewX(-24deg);transition:background .6s}
html[data-live="baseball"] .nav a[data-tab="baseball"]::after,html[data-live="personal"] .nav a[data-tab="home"]::after{
  content:"";flex:none;width:8px;height:8px;margin-left:6px;border-radius:50%;background:var(--red);animation:pulse 1s ease-in-out infinite}
.has-nav .wrap{padding-bottom:calc(60px + var(--nav) + env(safe-area-inset-bottom))}
.has-nav .hero{min-height:calc(100svh - var(--nav) - env(safe-area-inset-bottom));padding-top:clamp(110px,calc(60svh - 280px),30svh)}

/* Hero */
.hero{min-height:100svh;display:flex;flex-direction:column;justify-content:flex-end;padding:52svh 0 26px;margin-top:-28px}
.handle{margin:0;font:700 italic 24px/1 var(--display);letter-spacing:.06em;color:var(--acc);transition:color .6s}
.hero h1{margin:6px 0 10px;font:800 italic clamp(64px,24vw,132px)/.8 var(--display);text-transform:uppercase;letter-spacing:-.01em;
  text-shadow:-3px 0 var(--red),3px 0 var(--blue);animation:split 5s steps(1) infinite}
.hero h1 span{display:block}
.hero h1 span + span{color:transparent;-webkit-text-stroke:2px var(--ink);text-shadow:none}
.hero h1 + #bug{margin-top:10px}
.hero .line{margin:0 0 18px;color:var(--ink);max-width:32ch;font-weight:500}
.hint{margin:0;color:var(--mute);font-size:14px}
@keyframes split{
  0%,91%,100%{text-shadow:-3px 0 var(--red),3px 0 var(--blue);transform:none}
  92%{text-shadow:-9px 2px var(--red),8px -2px var(--blue);transform:skewX(-8deg)}
  94%{text-shadow:7px -1px var(--red),-9px 1px var(--blue);transform:skewX(5deg) translateX(4px)}
  96%{text-shadow:-5px 0 var(--red),5px 0 var(--blue);transform:none}
}

/* Plain header for /go and /qr */
.id{border-left:6px solid var(--acc);padding-left:14px;margin-bottom:22px}
.id h1{margin:4px 0 8px;font:800 italic 60px/.9 var(--display);text-transform:uppercase}
.id .line{margin:0;color:var(--mute);max-width:34ch}
.back{display:inline-block;margin-bottom:18px;color:var(--acc);font-weight:600;text-decoration:none}

/* Scorebug: the live status strip */
.bug{display:flex;align-items:stretch;min-height:68px;border-radius:8px;overflow:hidden;text-decoration:none;
  border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);margin-bottom:14px}
.bug-tag{display:flex;align-items:center;gap:8px;padding:0 14px;font:800 italic 24px/1 var(--display);letter-spacing:.03em;
  background:rgba(255,255,255,.1);color:var(--mute);white-space:nowrap;text-transform:uppercase}
.bug-body{display:flex;flex-direction:column;justify-content:center;padding:10px 14px;min-width:0}
.bug-title{font:700 24px/1.05 var(--display)}
.bug-sub{color:var(--mute);font-size:15px}
.bug-thumb{flex:none;width:120px;object-fit:cover}
.rows .bug{margin-bottom:0}
.bug.is-replay{color:inherit}
.bug.is-replay .bug-title{font-size:20px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.bug.is-live{border-color:var(--red);background:rgba(255,45,74,.16);box-shadow:0 0 0 0 rgba(255,45,74,.7);animation:beacon 1.6s ease-out infinite}
.bug.is-live .bug-tag{background:var(--red);color:#fff}
.bug.is-live .bug-sub{color:#FFD5DB}
.bug.is-live .dot{width:10px;height:10px;border-radius:50%;background:#fff;animation:pulse 1s ease-in-out infinite}
@keyframes pulse{50%{opacity:.2}}
@keyframes beacon{100%{box-shadow:0 0 0 22px rgba(255,45,74,0)}}

/* Ticker tape */
.tape{margin:0 -18px;overflow:hidden;background:var(--acc);color:var(--night);transform:rotate(-2deg) scale(1.04);transition:background .6s}
.tape-in{display:flex;white-space:pre;padding:9px 0;font:800 italic 22px/1 var(--display);text-transform:uppercase;letter-spacing:.05em}
.tape-in span{flex:none;animation:tape 11s linear infinite;will-change:transform}
@keyframes tape{to{transform:translateX(-100%)}}

/* Sections */
section{margin-top:54px;opacity:0;transform:translateY(44px) scale(.97);transition:opacity .7s cubic-bezier(.2,.8,.2,1),transform .7s cubic-bezier(.2,.8,.2,1)}
section.in,.no-io section{opacity:1;transform:none}
h2{margin:0 0 14px;font:800 italic 46px/.9 var(--display);text-transform:uppercase}
h2::after{content:"";display:block;width:64px;height:5px;margin-top:8px;background:var(--acc);transform:skewX(-24deg);transition:background .6s}
section > p{margin:-2px 0 14px;color:var(--mute)}

.big{position:relative;display:block;padding:20px 18px;border-radius:8px;color:#fff;text-decoration:none;margin-bottom:10px;overflow:hidden;
  background:linear-gradient(110deg,#0B4EA2,#3EA6FF,#FF2D4A,#0B4EA2);background-size:300% 100%;animation:slide 7s linear infinite;
  box-shadow:0 10px 40px -10px var(--blue)}
.big strong{display:block;font:800 italic 34px/1 var(--display);text-transform:uppercase}
.big span{font-size:15px;font-weight:500}
@keyframes slide{to{background-position:300% 0}}

.rows{display:grid;gap:9px}
.row{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:60px;padding:10px 16px;
  border:1px solid var(--edge);border-radius:8px;background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  color:inherit;text-decoration:none;text-align:left;font:inherit;cursor:pointer;overflow:hidden;
  transition:transform .18s,border-color .18s,box-shadow .18s}
a.row::before,button.row::before{content:"";position:absolute;inset:0;transform:translateX(-120%) skewX(-24deg);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.22),transparent);transition:transform .5s}
a.row:hover,button.row:hover,a.row:active,button.row:active{transform:translateX(6px) skewX(-2deg);border-color:var(--acc);box-shadow:-6px 0 0 var(--acc),0 0 30px -6px var(--acc)}
a.row:hover::before,button.row:hover::before,a.row:active::before,button.row:active::before{transform:translateX(120%) skewX(-24deg)}
.row-name{font-weight:600}
.row-note{color:var(--mute);font-size:15px;text-align:right}
.row.is-empty{background:transparent;border-style:dashed;cursor:default;-webkit-backdrop-filter:none;backdrop-filter:none}
.row.is-empty .row-name{color:var(--mute);font-weight:500}
.row.is-static{cursor:default}
.row.is-top{border:2px solid var(--red);box-shadow:0 0 30px -6px var(--red)}
.row.is-top .row-note{color:var(--red);font-weight:700}
#tips a.row:hover,#tips a.row:active{border-color:var(--gold);box-shadow:-6px 0 0 var(--gold),0 0 30px -6px var(--gold)}

/* About me: photo and contact */
.photo{display:block;width:100%;height:auto;border:1px solid var(--edge);border-radius:8px}
.save{display:flex;align-items:center;justify-content:center;min-height:64px;margin:12px 0 9px;border-radius:8px;background:var(--gold);color:var(--night);
  text-decoration:none;font:800 italic 28px/1 var(--display);text-transform:uppercase}
.save:active{background:var(--ink)}
.big.work{margin:9px 0 0}

.chips{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.chip{padding:8px 14px;border-radius:999px;border:1px solid var(--edge);background:var(--glass);color:var(--ink);font:500 15px var(--body);cursor:pointer}
.chip[aria-pressed="true"]{background:var(--ink);color:var(--night);border-color:var(--ink)}
.status{font-size:13px;font-weight:600;color:var(--acc);white-space:nowrap}
.proj{display:flex;flex-direction:column;min-width:0}
.proj small{color:var(--mute);font-size:14px;font-weight:400}

.tipline{margin-top:44px;padding:14px 16px;border-left:4px solid var(--gold);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:0 8px 8px 0;font-size:15px}
.tipline a{font-weight:600;color:var(--gold)}
section + .tipline{margin-top:14px}
.share{display:block;width:100%;min-height:60px;margin-top:44px;border:2px solid var(--ink);border-radius:8px;background:transparent;color:var(--ink);
  font:800 italic 26px/1 var(--display);text-transform:uppercase;cursor:pointer}
.share:active{background:var(--ink);color:var(--night)}

/* Exit velo readout when the ball gets hit */
.velo{position:fixed;left:50%;top:30%;z-index:3;pointer-events:none;transform:translate(-50%,-50%) scale(.4) rotate(-6deg);opacity:0;
  font:800 italic 64px/.85 var(--display);text-transform:uppercase;text-align:center;color:var(--gold);text-shadow:4px 4px 0 var(--red);white-space:nowrap}
.velo small{display:block;font-size:22px;color:var(--ink);text-shadow:none;letter-spacing:.08em}
.velo.pop{animation:pop 1.3s cubic-bezier(.2,1.4,.3,1) forwards}
@keyframes pop{0%{opacity:0;transform:translate(-50%,-50%) scale(.4) rotate(-6deg)}15%{opacity:1;transform:translate(-50%,-50%) scale(1.15) rotate(-6deg)}
  70%{opacity:1;transform:translate(-50%,-60%) scale(1) rotate(-6deg)}100%{opacity:0;transform:translate(-50%,-90%) scale(.9) rotate(-6deg)}}

/* /projects page */
.pcards{display:grid;gap:14px}
h2.group{margin-top:34px;font-size:38px}
#projlist > h2.group:first-child{margin-top:18px}
.pcard{display:block;overflow:hidden;padding:18px;border:1px solid var(--edge);border-radius:8px;background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  color:inherit;text-decoration:none;transition:transform .18s,border-color .18s,box-shadow .18s}
a.pcard:hover,a.pcard:active{transform:translateX(6px);border-color:var(--acc);box-shadow:-6px 0 0 var(--acc),0 0 30px -6px var(--acc)}
.pcard-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.pcard-shot{display:block;width:calc(100% + 36px);max-width:none;height:auto;margin:-18px -18px 16px;border-bottom:1px solid var(--edge)}
.pcard h3{margin:0;font:800 italic 32px/.95 var(--display);text-transform:uppercase}
.pcard p{margin:10px 0 0}
.pill{flex:none;padding:5px 10px;border:1px solid var(--edge);border-radius:999px;font-size:13px;font-weight:600;white-space:nowrap;color:var(--mute)}
.pill-live{background:var(--blue);border-color:var(--blue);color:var(--night)}
.pill-building{border-color:var(--gold);color:var(--gold)}
.pcard-go{display:inline-block;margin-top:12px;font-weight:600;color:var(--acc)}
a.pcard .pcard-go::after{content:" \2192"}
div.pcard .pcard-go{color:var(--mute);font-weight:400}

/* /go control page */
label{display:block;margin:14px 0 6px;font-weight:600}
input,select{width:100%;min-height:52px;padding:10px 12px;border:1px solid var(--edge);border-radius:8px;background:#0E1A2C;color:var(--ink);font:inherit}
.check{display:flex;align-items:center;gap:10px;font-weight:400}
.check input{width:22px;min-height:22px}
.act{display:block;width:100%;min-height:64px;margin-top:10px;border:0;border-radius:8px;font:800 italic 28px/1 var(--display);text-transform:uppercase;cursor:pointer;color:var(--night);background:var(--blue)}
.act.go-ball{background:var(--red);color:#fff}
.act.stop{background:transparent;color:var(--ink);border:2px solid var(--ink)}
.act:disabled{opacity:.5}
.msg{min-height:1.5em;margin:12px 0 0;font-weight:600}
.msg.bad{color:var(--red)}
.todo{margin:0;padding-left:20px;color:var(--mute)}

/* /qr page */
.qrgrid{display:grid;gap:18px}
.qrcard{padding:18px;border:1px solid var(--edge);border-radius:8px;background:var(--glass);text-align:center}
.qrcard .qr{max-width:300px;margin:12px auto}
.qrcard .url{color:var(--mute);font-size:14px;word-break:break-all}
.qrcard .scan{font:800 italic 28px/1 var(--display);text-transform:uppercase;margin-bottom:12px}
.qrcard button{min-height:46px;padding:0 16px;margin:0 4px;border:1px solid var(--edge);border-radius:8px;background:transparent;color:var(--ink);font:600 15px var(--body);cursor:pointer}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
  section{opacity:1;transform:none}
}
@media print{
  html,body{background:#fff;color:#000}
  .noprint,.nav{display:none}
  .qrcard{border:0;page-break-after:always;padding-top:60px;color:#000}
  .qrcard .url{color:#333}
  .qrcard .qr{max-width:480px}
  .qrcard button{display:none}
}
