/* Control volume: shared motion layer for every board.
   Physics-true motion only: fronts propagate, residuals converge, boundaries march, heat diffuses. */

/* ---------- page shell ---------- */
.cv{isolation:isolate;position:relative;cursor:crosshair}
.cv a,.cv button,.cv input,.cv label{cursor:pointer}
.cv ::selection{background:#65d6c9;color:#071007}
.probe,.snd,.sweep span,.boot,.tick{font-family:'JetBrains Mono',ui-monospace,monospace}
.rail path{vector-effect:non-scaling-stroke}
.cv::before{content:"";position:fixed;inset:-72px;z-index:-1;pointer-events:none;opacity:.5;
  background-image:linear-gradient(to right,rgba(45,58,49,.38) 1px,transparent 1px),linear-gradient(to bottom,rgba(45,58,49,.38) 1px,transparent 1px);
  background-size:36px 36px;animation:cv-drift 32s linear infinite}
/* a real element behind the page, so the cold front can invert the ground too */
.cv::after{content:"";position:fixed;inset:0;z-index:-2;pointer-events:none;background:#070807}
@keyframes cv-drift{to{transform:translate(36px,36px)}}

/* ---------- page transition: a heat front sweeps across, the state point ticks over ---------- */
.sweep{position:fixed;inset:0;z-index:70;pointer-events:none;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(90deg,transparent 0%,#fcffa4 1.5%,#f98e09 4%,#bc3754 8%,#57106e 13%,#070807 20%,#070807 100%);
  animation:cv-sweep 1.25s cubic-bezier(.7,0,.25,1) both}
.sweep::after{content:"";position:absolute;top:0;bottom:0;left:22%;border-left:1.5px dashed #65d6c9;opacity:.7}
.sweep span{position:relative;font-size:13px;letter-spacing:.32em;color:#65d6c9;animation:cv-label 1.25s ease both}
.sweep span::before{content:"CONVERGING  ";color:#a9b3a8}
@keyframes cv-sweep{0%,38%{transform:translateX(-6%)}100%{transform:translateX(110%)}}
@keyframes cv-label{0%{opacity:0;letter-spacing:.6em}20%,45%{opacity:1;letter-spacing:.32em}70%,100%{opacity:0}}

/* ---------- probe cursor and heat blob ---------- */
.heat{position:fixed;left:0;top:0;width:260px;height:260px;border-radius:50%;pointer-events:none;z-index:40;opacity:.18;
  background:radial-gradient(circle,rgba(252,255,164,.6) 0%,rgba(249,142,9,.38) 20%,rgba(188,55,84,.24) 42%,rgba(87,16,110,.12) 62%,transparent 71%);
  mix-blend-mode:screen;transition:opacity .4s ease;will-change:transform;transform:translate(-999px,-999px)}
.cv:has(a:hover) .heat,.cv:has(button:hover) .heat,.cv:has(.cd:hover) .heat,.cv:has(article:hover) .heat,.cv:has([data-probe]:hover) .heat{opacity:.85}
.probe{position:fixed;left:0;top:0;z-index:41;pointer-events:none;font-size:11px;letter-spacing:.08em;white-space:nowrap;
  color:#c9cfc6;background:rgba(7,8,7,.82);border:1px solid #2d3a31;padding:5px 9px 5px 22px;border-radius:3px;transition:opacity .2s,background .2s,color .2s;
  backdrop-filter:blur(6px)}
.probe i{position:absolute;left:8px;top:50%;width:7px;height:7px;margin-top:-3.5px;border-radius:50%;background:#65d6c9;animation:cv-pulse 1.4s ease-in-out infinite}
.cv:has([data-probe]:hover) .probe{background:#fcffa4;color:#071007;border-color:#fcffa4}
.cv:has([data-probe]:hover) .probe i{background:#bc3754}
[data-probe]{transition:text-shadow .3s}
[data-probe]:hover{text-shadow:0 0 18px rgba(249,142,9,.35)}
@keyframes cv-pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.7);opacity:.35}}
@media (hover:none){.heat,.probe{display:none}.cv{cursor:auto}}

/* ---------- scroll rail: the residual converges as you read ---------- */
.rail{position:fixed;left:0;right:0;top:0;height:12px;z-index:50;pointer-events:none}
.rail svg{width:100%;height:100%;display:block}
.cv .rail svg path.rp{fill:none;stroke:#65d6c9;stroke-width:1.6;stroke-dasharray:1000;stroke-dashoffset:1000;animation:none}
.cv .rail svg line{stroke:#d7b46a;stroke-width:1;stroke-dasharray:4 5;opacity:.45}
@supports (animation-timeline: scroll()){.cv .rail svg path.rp{animation:cv-rail linear both;animation-timeline:scroll(root)}}
@keyframes cv-rail{to{stroke-dashoffset:0}}

/* ---------- sound toggle ---------- */
.snd{position:fixed;right:20px;bottom:20px;z-index:55;display:flex;align-items:center;gap:10px;min-height:44px;padding:0 16px;border-radius:999px;
  background:rgba(13,17,14,.9);border:1px solid #2d3a31;color:#c9cfc6;font-size:11px;letter-spacing:.14em;backdrop-filter:blur(10px)}
.snd svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round}
.snd[aria-pressed="true"]{border-color:#65d6c9;color:#65d6c9}
.snd[aria-pressed="true"] .sw{animation:cv-wave .9s ease-in-out infinite}
.snd .sw{opacity:.3;transform-box:fill-box;transform-origin:left center}
.snd[aria-pressed="true"] .sw{opacity:1}
@keyframes cv-wave{0%,100%{transform:scaleX(.6)}50%{transform:scaleX(1.15)}}

/* ---------- entrances ---------- */
.cv h1{animation:cv-converge 1.4s cubic-bezier(.22,1,.36,1) .6s both}
@keyframes cv-converge{from{opacity:0;letter-spacing:.2em;filter:blur(10px)}55%{filter:blur(0)}to{opacity:1}}
.cv section{animation:cv-rise .9s cubic-bezier(.22,1,.36,1) .8s both}
@supports (animation-timeline: view()){
  .cv section{animation:cv-rise linear both;animation-timeline:view();animation-range:entry 0px entry 220px}
}
@keyframes cv-rise{from{opacity:0;transform:translateY(32px);filter:blur(3px)}to{opacity:1;transform:none;filter:none}}

/* ---------- type: headings gain optical weight under the probe ---------- */
.cv h2,.cv h3{transition:font-weight .4s cubic-bezier(.22,1,.36,1),letter-spacing .4s}
.cv h2:hover,.cv h3:hover{font-weight:690!important;letter-spacing:-.025em!important}
.cv .eb::after{content:"_";margin-left:6px;animation:cv-caret 1.1s steps(1) infinite}
@keyframes cv-caret{50%{opacity:0}}

/* ---------- navigation: the underline is a flow line ---------- */
.cv>header:not(.site-header):not(.academic-header){position:relative;overflow:hidden}
.cv header nav a{position:relative;transition:color .25s}
.cv header nav a::after{content:"";position:absolute;left:0;right:0;bottom:4px;height:1.5px;
  background:repeating-linear-gradient(90deg,currentColor 0 5px,transparent 5px 9px);transform:scaleX(0);transform-origin:left;transition:transform .4s cubic-bezier(.22,1,.36,1)}
.cv header nav a:hover::after{transform:scaleX(1);animation:cv-flow .5s linear infinite}
.cv header nav a:hover{color:#f2f0e7!important}
@keyframes cv-flow{to{background-position:9px 0}}
.cv>header::after{content:"";position:absolute;top:0;bottom:0;width:140px;left:-140px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(101,214,201,.14),transparent);animation:cv-scan 8s ease-in-out 2s infinite}
@keyframes cv-scan{0%{left:-140px}35%,100%{left:100%}}

/* ---------- cards: heat up, lift, and the mesh refines ---------- */
.cv .cd{position:relative;transition:transform .45s cubic-bezier(.22,1,.36,1),border-color .45s,box-shadow .45s}
.cv .cd::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;
  background-image:linear-gradient(to right,rgba(249,142,9,.16) 1px,transparent 1px),linear-gradient(to bottom,rgba(249,142,9,.16) 1px,transparent 1px);
  background-size:28px 28px;transition:opacity .5s,background-size .7s cubic-bezier(.22,1,.36,1)}
.cv .cd:hover{transform:translateY(-4px);border-color:rgba(249,142,9,.6)!important;box-shadow:0 22px 60px rgba(188,55,84,.16),0 0 0 1px rgba(249,142,9,.12)}
.cv .cd:hover::after{opacity:.2;background-size:9px 9px}
.cv main article{transition:background .35s}
.cv main article:hover{background-image:linear-gradient(90deg,rgba(101,214,201,.06),transparent 70%)}

/* ---------- residual: the hatch creeps, because it is never quite done ---------- */
.cv .rs{animation:cv-creep 5s linear infinite}
@keyframes cv-creep{to{background-position:22.6px 0}}

/* ---------- control surfaces: dashed boundaries that march ---------- */
.cs{position:relative;border-color:transparent!important}
.cs::before{content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;
  background:linear-gradient(90deg,var(--cs,#65d6c9) 55%,transparent 0) 0 0/12px 1.5px repeat-x,
             linear-gradient(90deg,var(--cs,#65d6c9) 55%,transparent 0) 0 100%/12px 1.5px repeat-x,
             linear-gradient(0deg,var(--cs,#65d6c9) 55%,transparent 0) 0 0/1.5px 12px repeat-y,
             linear-gradient(0deg,var(--cs,#65d6c9) 55%,transparent 0) 100% 0/1.5px 12px repeat-y;
  animation:cv-cs 1.2s linear infinite;transition:filter .4s}
.cs.a{--cs:#d7b46a}.cs.b{--cs:#8fb7ff}.cs.g{--cs:#9bd69f}.cs.n{--cs:#43544a}
.cs:hover{--cs:#f98e09}
.cs:hover::before{animation-duration:.45s;filter:drop-shadow(0 0 6px rgba(249,142,9,.6))}
.cv .cs.cd:hover{border-color:transparent!important}
@keyframes cv-cs{to{background-position:12px 0,-12px 100%,0 -12px,100% 12px}}

/* ---------- streams: arrows advect ---------- */
.fl{display:inline-block;animation:cv-nudge 1.6s ease-in-out infinite}
.fl:nth-child(2){animation-delay:.2s}.fl:nth-child(3){animation-delay:.4s}
@keyframes cv-nudge{0%,100%{transform:translateX(0)}50%{transform:translateX(6px);color:#65d6c9}}
.dot{animation:cv-pulse 1.8s ease-in-out infinite}

/* ---------- buttons: spring lift, glow ring, a light sweep ---------- */
.cv a[style*="min-height"],.cv button{position:relative;overflow:hidden;transition:transform .3s cubic-bezier(.34,1.56,.64,1),box-shadow .3s,filter .3s}
.cv a[style*="min-height"]:hover,.cv button:hover{transform:translateY(-2px);box-shadow:0 0 0 4px rgba(101,214,201,.16),0 12px 30px rgba(0,0,0,.45)}
.cv a[style*="min-height"]:active,.cv button:active{transform:translateY(0) scale(.96)}
.cv a[style*="min-height"]::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.32) 50%,transparent 70%);transform:translateX(-130%);transition:transform .7s}
.cv a[style*="min-height"]:hover::before{transform:translateX(130%)}
.cv a.m{transition:letter-spacing .35s cubic-bezier(.22,1,.36,1),text-shadow .35s}
.cv a.m:hover{letter-spacing:.2em!important;text-shadow:0 0 14px currentColor}

/* floating controls stay fixed even though buttons get position:relative above */
.cv .snd,.cv .thm,.cv .cmdbtn{position:fixed}
.cv .snd:hover,.cv .thm:hover,.cv .cmdbtn:hover{transform:translateY(-2px)}

/* ---------- curves draw themselves; tolerance lines march ---------- */
.cv svg.cv-draw polyline,.cv .boot svg polyline{stroke-dasharray:1400;stroke-dashoffset:1400;animation:cv-draw 2.6s cubic-bezier(.22,1,.36,1) .9s forwards}
.cv svg.cv-draw path[vector-effect]{stroke-dasharray:2400;stroke-dashoffset:2400;animation:cv-draw 2.6s cubic-bezier(.22,1,.36,1) .9s forwards}
.cv svg.cv-draw line[stroke-dasharray],.cv .boot svg line[stroke-dasharray]{animation:cv-march 1.6s linear infinite}
@keyframes cv-draw{to{stroke-dashoffset:0}}
@keyframes cv-march{to{stroke-dashoffset:-20}}

/* ---------- data elements ---------- */
.cv .cv-lane .bar{transform-origin:left center;animation:cv-grow 1.3s cubic-bezier(.22,1,.36,1) .9s both}
@keyframes cv-grow{from{transform:scaleX(0);opacity:0}to{transform:none;opacity:1}}
.grow{transform-origin:left center;animation:cv-grow 1.4s cubic-bezier(.22,1,.36,1) 1s both}
.cv .course-grade{animation:cv-pop .7s cubic-bezier(.34,1.56,.64,1) 1.1s both}
@keyframes cv-pop{from{transform:scale(.3);opacity:0}to{transform:none;opacity:1}}
.cv input[type=range]{accent-color:#65d6c9;width:100%;height:32px;margin:0}

/* ---------- emotes: custom reactive glyphs ---------- */
.gl{width:26px;height:26px;stroke:currentColor;fill:none;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;overflow:visible;flex:none;
  transition:transform .45s cubic-bezier(.34,1.56,.64,1)}
.gl *{transform-box:fill-box}
.emo:hover .gl,.gl:hover{transform:scale(1.28) rotate(-6deg)}
.gl-flame .fp{transform-origin:50% 100%;animation:cv-flick 1.3s ease-in-out infinite}
.gl-flame .fi{transform-origin:50% 100%;animation:cv-flick 1s ease-in-out .2s infinite reverse}
@keyframes cv-flick{0%,100%{transform:scale(1,1) skewX(0)}30%{transform:scale(.92,1.08) skewX(4deg)}65%{transform:scale(1.05,.95) skewX(-4deg)}}
.gl-therm .hg{transform-origin:50% 100%;animation:cv-merc 2.8s ease-in-out infinite}
@keyframes cv-merc{0%,100%{transform:scaleY(.35)}50%{transform:scaleY(1)}}
.gl-wave .wv{stroke-dasharray:5 3;animation:cv-wv 1s linear infinite}
@keyframes cv-wv{to{stroke-dashoffset:-8}}
.gl-gear .gg{transform-origin:center;animation:cv-spin 7s linear infinite}
.emo:hover .gl-gear .gg{animation-duration:1.4s}
@keyframes cv-spin{to{transform:rotate(360deg)}}
.gl-cup .st{animation:cv-steam 2.4s ease-in-out infinite;opacity:0}
.gl-cup .st:nth-of-type(2){animation-delay:.8s}.gl-cup .st:nth-of-type(3){animation-delay:1.6s}
@keyframes cv-steam{0%{transform:translateY(3px);opacity:0}40%{opacity:1}100%{transform:translateY(-6px);opacity:0}}
.gl-cycle .cy{transform-origin:center;animation:cv-spin 5s linear infinite}
.gl-check .ck{stroke-dasharray:30;stroke-dashoffset:0}
.emo:hover .gl-check .ck,.gl-check:hover .ck{animation:cv-redraw .7s ease both}
@keyframes cv-redraw{from{stroke-dashoffset:30}to{stroke-dashoffset:0}}
.gl .pt{animation:cv-pulse 1.4s ease-in-out infinite;transform-origin:center}
.gl .pt:nth-of-type(2){animation-delay:.7s}
.gl-mesh .mr{animation:cv-refine 3s ease-in-out infinite}
@keyframes cv-refine{0%,100%{opacity:.15}50%{opacity:1}}
.gl-lamp .lf{transform-origin:50% 100%;animation:cv-flick 1.1s ease-in-out infinite}
.gl-spark .sk{transform-origin:center;animation:cv-twinkle 1.8s ease-in-out infinite}
@keyframes cv-twinkle{0%,100%{transform:scale(.6) rotate(0);opacity:.5}50%{transform:scale(1.1) rotate(45deg);opacity:1}}
.gl-nest .n2{animation:cv-cs-n 2.4s ease-in-out infinite}.gl-nest .n3{animation:cv-cs-n 2.4s ease-in-out .4s infinite}
@keyframes cv-cs-n{0%,100%{opacity:.3}50%{opacity:1}}
.gl-key .kk{animation:cv-press 1.6s ease-in-out infinite}
@keyframes cv-press{0%,70%,100%{transform:translateY(0)}80%{transform:translateY(2px)}}
.gl-bob .bb{transform-origin:50% 0;animation:cv-bob 2s ease-in-out infinite}
@keyframes cv-bob{0%,100%{transform:rotate(-8deg)}50%{transform:rotate(8deg)}}
.gl-sun .sr{transform-origin:center;animation:cv-spin 12s linear infinite}

/* ---------- filter coffee loader: decoction rises as the residual falls ---------- */
.cf .dr{animation:cv-drip 1.5s cubic-bezier(.5,0,.8,.6) infinite;opacity:0}
.cf .dr:nth-of-type(2){animation-delay:.5s}.cf .dr:nth-of-type(3){animation-delay:1s}
@keyframes cv-drip{0%{transform:translateY(0);opacity:0}12%{opacity:1}100%{transform:translateY(26px);opacity:0}}
.cf .lv{transform-box:fill-box;transform-origin:50% 100%;animation:cv-fill 6s ease-in-out infinite alternate}
@keyframes cv-fill{from{transform:scaleY(.08)}to{transform:scaleY(.95)}}
.cf .stm{animation:cv-steam 2.6s ease-in-out infinite;opacity:0}
.cf .stm:nth-of-type(2){animation-delay:1.3s}

/* ---------- boot sequence ---------- */
.boot{position:fixed;inset:0;z-index:80;background:#070807;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box;
  transition:opacity .8s ease,visibility .8s,transform .8s cubic-bezier(.7,0,.25,1)}
.boot.done{opacity:0;visibility:hidden;pointer-events:none;transform:scale(1.04)}
.cv .boot svg polyline{animation-delay:.15s;animation-duration:2.4s}
.boot .ln{opacity:0;animation:cv-type .01s steps(1) forwards}
.boot .ln:nth-child(1){animation-delay:.2s}.boot .ln:nth-child(2){animation-delay:.6s}.boot .ln:nth-child(3){animation-delay:1s}
.boot .ln:nth-child(4){animation-delay:1.4s}.boot .ln:nth-child(5){animation-delay:1.9s}.boot .ln:nth-child(6){animation-delay:2.4s}
@keyframes cv-type{to{opacity:1}}

/* ---------- telemetry ticker ---------- */
.tick{display:flex;width:max-content;animation:cv-tick 38s linear infinite}
.tick:hover{animation-play-state:paused}
@keyframes cv-tick{to{transform:translateX(-50%)}}

/* ---------- heat-source toy ---------- */
.field{position:relative;touch-action:none;cursor:grab;overflow:hidden}
.field:active{cursor:grabbing}
.iso{position:absolute;width:120px;height:120px;border-radius:50%;border:1px dashed rgba(252,255,164,.55);pointer-events:none;transform:translate(-50%,-50%);animation:cv-ring 2.4s ease-out infinite}
.iso:nth-of-type(2){animation-delay:.8s}.iso:nth-of-type(3){animation-delay:1.6s}
@keyframes cv-ring{from{transform:translate(-50%,-50%) scale(.2);opacity:.9}to{transform:translate(-50%,-50%) scale(1.9);opacity:0}}
.src{position:absolute;width:18px;height:18px;border-radius:50%;background:#fcffa4;box-shadow:0 0 24px 8px rgba(249,142,9,.6);transform:translate(-50%,-50%);pointer-events:none}

/* ---------- Kerala folklore egg ---------- */
.night{position:fixed;inset:0;z-index:90;display:flex;align-items:center;justify-content:center;padding:24px;box-sizing:border-box;
  background:radial-gradient(ellipse at 72% 18%,#16233f 0%,#070a12 55%,#030406 100%);animation:cv-fade 1.4s ease both}
@keyframes cv-fade{from{opacity:0}to{opacity:1}}
.night .moon{animation:cv-glow 6s ease-in-out infinite}
@keyframes cv-glow{0%,100%{filter:drop-shadow(0 0 8px rgba(242,240,231,.4))}50%{filter:drop-shadow(0 0 22px rgba(242,240,231,.8))}}
.night .lf{transform-box:fill-box;transform-origin:50% 100%;animation:cv-flick 1.1s ease-in-out infinite}
.night .eyes{animation:cv-eyes 7s ease-in-out infinite}
@keyframes cv-eyes{0%,62%,70%,100%{opacity:0}64%,68%{opacity:.9}}
.night .leaf{transform-box:fill-box;transform-origin:50% 100%;animation:cv-sway 5s ease-in-out infinite}
@keyframes cv-sway{0%,100%{transform:rotate(-2deg)}50%{transform:rotate(2deg)}}
.night .fly{animation:cv-firefly 9s ease-in-out infinite}
.night .fly:nth-of-type(2){animation-delay:3s}.night .fly:nth-of-type(3){animation-delay:6s}
@keyframes cv-firefly{0%,100%{transform:translate(0,0);opacity:.2}50%{transform:translate(30px,-24px);opacity:1}}

/* ---------- keyboard focus for the console shortcut ---------- */
.cv:focus{outline:none}

/* ---------- cold / hot: a cold front sweeps in from the thermometer ---------- */
.frost{position:fixed;inset:0;z-index:60;pointer-events:none;
  -webkit-backdrop-filter:invert(.93) hue-rotate(180deg) saturate(.9);backdrop-filter:invert(.93) hue-rotate(180deg) saturate(.9);
  clip-path:circle(0% at calc(100% - 64px) calc(100% - 92px));transition:clip-path 1.4s cubic-bezier(.7,0,.25,1)}
.frost.on{clip-path:circle(150% at calc(100% - 64px) calc(100% - 92px))}
.thm,.cmdbtn{position:fixed;z-index:55;display:flex;align-items:center;gap:10px;min-height:44px;padding:0 16px;border-radius:999px;
  background:rgba(13,17,14,.9);border:1px solid #2d3a31;color:#c9cfc6;font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;letter-spacing:.14em;backdrop-filter:blur(10px)}
.thm{right:20px;bottom:72px}
.thm[aria-pressed="true"]{color:#8fb7ff;border-color:#8fb7ff}
.cmdbtn{left:20px;bottom:20px}
.cmdbtn span{padding:3px 6px;border:1px solid #43544a;border-radius:4px;font-size:10px;color:#65d6c9}

/* ---------- monsoon: Kerala rain, June to September ---------- */
.rain{position:fixed;inset:0;z-index:44;pointer-events:none;overflow:hidden}
.rain i{position:absolute;inset:-30%;transform:rotate(9deg);
  background-image:linear-gradient(to bottom,transparent 0 82%,rgba(143,183,255,.5) 82% 100%);background-size:100% 140px;
  -webkit-mask-image:repeating-linear-gradient(90deg,#000 0 1px,transparent 1px 41px);mask-image:repeating-linear-gradient(90deg,#000 0 1px,transparent 1px 41px);
  animation:cv-rain .5s linear infinite}
.rain i:nth-child(2){background-size:100% 200px;
  -webkit-mask-image:repeating-linear-gradient(90deg,transparent 0 19px,#000 19px 20px,transparent 20px 67px);mask-image:repeating-linear-gradient(90deg,transparent 0 19px,#000 19px 20px,transparent 20px 67px);
  animation:cv-rain2 .8s linear infinite;opacity:.65}
.rain span{position:absolute;right:20px;top:24px;font-family:'JetBrains Mono',ui-monospace,monospace;font-size:11px;letter-spacing:.14em;color:#8fb7ff;
  background:rgba(7,8,7,.75);padding:6px 10px;border:1px solid #2d3a31;border-radius:3px}
@keyframes cv-rain{to{background-position:0 140px}}
@keyframes cv-rain2{to{background-position:0 200px}}

/* ---------- solver console ---------- */
.cmdk{position:fixed;inset:0;z-index:85;background:rgba(3,4,3,.66);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  display:flex;align-items:flex-start;justify-content:center;padding:12vh 16px 16px;box-sizing:border-box;animation:cv-fade .25s ease both}
.cmdbox{width:min(640px,100%);background:#070807;border:1px solid #2d3a31;border-radius:12px;overflow:hidden;
  box-shadow:0 28px 90px rgba(0,0,0,.6),0 0 0 1px rgba(101,214,201,.12);font-family:'JetBrains Mono',ui-monospace,monospace;animation:cv-pop .35s cubic-bezier(.34,1.56,.64,1) both}
.cmdhd{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid #2d3a31;font-size:11px;letter-spacing:.16em;color:#65d6c9}
.cmdhd button{min-height:36px;padding:0 10px;border:1px solid #2d3a31;border-radius:4px;background:transparent;color:#a9b3a8;font:inherit;font-size:11px}
.cmdin{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid #2d3a31;color:#d7b46a;font-size:16px}
.cmdin input{flex:1;min-width:0;background:transparent;border:0;outline:0;color:#f2f0e7;font:inherit;font-size:16px;caret-color:#65d6c9}
.cmdin input::placeholder{color:#5f6b62}
.cmdlist{display:flex;flex-direction:column;max-height:46vh;overflow:auto;padding:6px}
.cmdit{display:flex;justify-content:space-between;gap:16px;align-items:center;min-height:44px;padding:0 12px;border-radius:6px;border:0;
  background:transparent;color:#f2f0e7;text-align:left;font:inherit;font-size:13px;text-decoration:none;width:100%;box-sizing:border-box}
.cv .cmdit:hover{transform:none;box-shadow:none}
.cmdit:hover,.cmdit:focus-visible{background:rgba(101,214,201,.12);outline:none}
.cmdlist>*:first-child .cmdit,.cmdlist>.cmdit:first-child{background:rgba(101,214,201,.07)}
.cmdit b{font-weight:500}
.cmdit span{color:#a9b3a8;font-size:11px;letter-spacing:.04em;text-align:right}
.cmdlog{padding:10px 16px;border-top:1px solid #2d3a31;font-size:11px;letter-spacing:.06em;color:#9bd69f}

/* ---------- mesh refinement toy ---------- */
.mesh-lines{transition:opacity .4s}
.lvl{min-height:44px;padding:0 18px;border-radius:6px;font-family:'JetBrains Mono',ui-monospace,monospace;font-size:12px;letter-spacing:.1em;cursor:pointer}

/* ---------- year as a cycle ---------- */
.yr-dot{animation:cv-pulse 2s ease-in-out infinite;transform-box:fill-box;transform-origin:center}

/* ---------- motion off when asked ---------- */
@media (prefers-reduced-motion: reduce){
  .cv *,.cv *::before,.cv *::after,.cv::before{animation:none!important;transition:none!important}
  .sweep,.heat,.probe,.boot{display:none!important}
  .cv svg polyline,.cv svg path{stroke-dashoffset:0!important}
}


/* Accessible date interaction for the live year motif, including lab demo. */
.cv-year-controls {display:flex;flex-direction:column;gap:10px;min-width:0;width:100%;max-width:100%;margin:4px 0}
.cv-year-controls label{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 12px;font:11px/1.5 'JetBrains Mono',monospace;letter-spacing:.04em;color:#d7b46a}
.cv-year-controls output{color:#65d6c9;font-variant-numeric:tabular-nums;letter-spacing:0}
.cv-year-controls input[type=range]{width:100%;min-width:0;min-height:34px;accent-color:#65d6c9;cursor:ew-resize}
.cv-year-controls button{align-self:start;min-height:44px;border:1px solid #43544a;background:#121813;border-radius:7px;padding:0 14px;color:#f2f0e7;font:11px 'JetBrains Mono',monospace;cursor:pointer}
.cv-year-controls button:disabled{opacity:.45;cursor:default}
.cv-year-controls :focus-visible{outline:3px solid #f98e09;outline-offset:3px}
.cv-year-svg {overflow:visible}
.probe{box-sizing:border-box;width:max-content;max-width:min(320px,calc(100vw - 24px));white-space:normal;overflow-wrap:anywhere;line-height:1.35}
.probe span{display:block;min-width:0}
@media(max-width:560px){.probe{max-width:calc(100vw - 24px);font-size:10px}}


/* Probe is hidden until a pointer interaction; year telemetry owns its own space. */
body.cv .probe {opacity:0}
body.cv:has([data-cv-toy="year"]:hover) .probe,
body.cv:has(dialog[open]) .probe {
  opacity:0!important;transition:none!important;
}

/* Mobile control bar: keep console, sound and temperature options functional
   without fixed-position pills obscuring charts or case rows. */
@media(max-width:600px){
 body.cv .cmdbtn,body.cv .snd,body.cv .thm{
   position:static!important;
   inset:auto!important;
   display:inline-flex;
   vertical-align:middle;
   margin:10px 6px 10px 10px;
   transform:none!important;
   min-height:44px;
   max-width:calc(100% - 20px);
 }
 body.cv .cmdbtn:hover,body.cv .snd:hover,body.cv .thm:hover{transform:none!important}
}
