/* Free tools (/tools/). Builds on base.css + pages.css tokens. */
.ph.tool-head{padding-block:clamp(12px,2.5vw,28px) clamp(28px,4vw,44px)}
.ph.tool-head .ph-title{font-size:clamp(30px,4vw,48px)}
.toolsec{padding-top:clamp(24px,4vw,44px)}
.tool{background:var(--surface);border:1px solid var(--line);border-radius:18px;padding:clamp(14px,2.4vw,26px);box-shadow:0 30px 70px -50px rgba(17,26,38,.45);display:grid;gap:18px;min-width:0}
.tool *{min-width:0}
.tool-top{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;font:500 12px var(--f-mono);color:var(--muted)}
.tool-top .priv{display:inline-flex;align-items:center;gap:8px}
.tool-top .priv::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 4px var(--ok-soft)}
.cols2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px}
.cols3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
@media (max-width:820px){.cols2,.cols3{grid-template-columns:minmax(0,1fr)}}

/* source widget */
.tsrc{display:grid;gap:8px;position:relative}
.src-bar{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}
.src-bar label{font:600 13px var(--f-mono);letter-spacing:.04em;text-transform:uppercase;color:var(--ink)}
.src-act{display:flex;gap:6px}
.src-box{position:relative}
.tsrc textarea,.tool textarea.plain{width:100%;min-height:190px;resize:vertical;font:13px/1.6 var(--f-mono);color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:10px 12px;tab-size:4;display:block}
.tsrc textarea:focus,.tool textarea.plain:focus,.tool input:focus,.tool select:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}
.src-drop{position:absolute;inset:0;display:none;place-items:center;border:2px dashed var(--accent);border-radius:10px;background:var(--accent-soft);color:var(--accent);font:600 14px var(--f-mono);pointer-events:none}
.tsrc.drag .src-drop{display:grid}
.tsrc.drag.has-file{outline:2px dashed var(--accent);outline-offset:4px;border-radius:10px}
.src-file{display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid var(--line);background:var(--bg);border-radius:10px;padding:12px;font:13px var(--f-mono);flex-wrap:wrap}
.src-file .src-fname{overflow-wrap:anywhere}
.src-file .src-fname::before{content:"📄 "}
.src-opts{display:flex;gap:14px;align-items:end;flex-wrap:wrap}
.src-meta{font:12px var(--f-mono);color:var(--muted);min-height:18px}

/* controls */
.ctrls{display:flex;flex-wrap:wrap;gap:14px 18px;align-items:end}
.fld{display:grid;gap:5px;font-size:13px}
.fld>span{font:500 11.5px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.fld small{color:var(--muted);font-size:12px}
.tool select,.tool input[type=text],.tool input[type=number],.tool input[type=search]{font:14px var(--f-body);color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:8px 10px;min-height:38px;max-width:100%}
.tool select{padding-right:28px}
.tool input[type=number]{width:9em;font-family:var(--f-mono)}
.tool input.mono,.tool .mono-in{font-family:var(--f-mono);font-size:13px}
.chk{display:inline-flex;align-items:center;gap:7px;font-size:14px;cursor:pointer;user-select:none;min-height:38px}
.chk input{width:16px;height:16px;accent-color:var(--accent);margin:0}
.rng{display:flex;align-items:center;gap:10px}
.rng input[type=range]{width:180px;accent-color:var(--accent)}
.rng output{font:600 14px var(--f-mono);min-width:3ch}
.more-opts{border:1px solid var(--line);border-radius:10px;padding:0 14px;background:var(--bg)}
.more-opts>summary{cursor:pointer;padding:10px 0;font:500 12.5px var(--f-mono);color:var(--muted);list-style:none}
.more-opts>summary::-webkit-details-marker{display:none}
.more-opts>summary::before{content:"+ ";color:var(--accent)}
.more-opts[open]>summary::before{content:"− "}
.more-opts[open]{padding-bottom:14px}
.more-opts .ctrls+.ctrls{margin-top:12px}

/* buttons */
.tbtn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font:600 14.5px var(--f-body);padding:10px 18px;border-radius:9px;border:1px solid transparent;background:var(--accent);color:#fff;cursor:pointer;min-height:42px;text-decoration:none;white-space:nowrap}
.tbtn:hover{filter:brightness(1.08)}
.tbtn:disabled{opacity:.5;cursor:not-allowed;filter:none}
:root[data-theme="dark"] .tbtn:not(.ghost){color:#0B1320}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .tbtn:not(.ghost){color:#0B1320}}
.tbtn.ghost{background:transparent;color:var(--ink);border-color:var(--line)}
.tbtn.ghost:hover{border-color:var(--accent);color:var(--accent);filter:none}
.tbtn.sm{font-size:12.5px;padding:5px 10px;min-height:30px;border-radius:7px;font-family:var(--f-mono);font-weight:500}
.acts{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.acts .sp{flex:1}

/* status and progress */
.tsay{font-size:14.5px;border-radius:10px;padding:10px 14px;border:1px solid var(--line);background:var(--bg);color:var(--ink)}
.tsay.warn{border-color:var(--amber);background:var(--amber-soft)}
.tsay.err{border-color:#D14343;background:rgba(209,67,67,.08)}
.tsay.ok{border-color:var(--ok);background:var(--ok-soft)}
.tprogw{display:grid;gap:6px}
.tprog{height:8px;border-radius:4px;background:var(--line);overflow:hidden}
.tprog i{display:block;height:100%;width:0;background:var(--accent);transition:width .15s}
.tprog-t{font:12px var(--f-mono);color:var(--muted)}

/* results */
.out{display:grid;gap:14px}
.out[hidden]{display:none}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:0;background:var(--surface);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.stats div{background:var(--surface);padding:14px 16px;display:grid;gap:2px;align-content:start;box-shadow:1px 0 0 var(--line),0 1px 0 var(--line)}
.stats b{font-family:var(--f-display);font-stretch:112%;font-weight:750;font-size:clamp(22px,2.4vw,28px);line-height:1.1;font-variant-numeric:tabular-nums}
.stats span{font-size:12.5px;color:var(--muted);line-height:1.35}
.stats .ok b{color:var(--ok)}.stats .warn b{color:var(--amber)}.stats .bad b{color:#D14343}
.chipset{display:flex;flex-wrap:wrap;gap:6px}
.chipset button{font:500 12.5px var(--f-mono);border:1px solid var(--line);background:var(--bg);color:var(--muted);border-radius:999px;padding:6px 12px;cursor:pointer}
.chipset button b{color:var(--ink);font-weight:600}
.chipset button[aria-selected="true"]{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}
.chipset button[aria-selected="true"] b{color:var(--accent)}
.tgrid-wrap{overflow:auto;max-height:560px;border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.tgrid{border-collapse:separate;border-spacing:0;width:100%;min-width:620px;font:13px/1.45 var(--f-mono)}
.tgrid.narrow{min-width:0}
.tgrid th{position:sticky;top:0;z-index:1;background:var(--bg);text-align:left;font:600 11.5px var(--f-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--muted);padding:9px 12px;border-bottom:1px solid var(--line);white-space:nowrap}
.tgrid td{padding:8px 12px;border-bottom:1px solid var(--line);vertical-align:top;max-width:420px;overflow-wrap:break-word}
.tgrid tr:last-child td{border-bottom:0}
.tgrid td.num,.tgrid th.num{text-align:right;font-variant-numeric:tabular-nums}
.tgrid td.dim,.tgrid .dim{color:var(--muted)}
.tgrid tr.hl td{background:var(--amber-soft)}
.tgrid tr.bad td{background:rgba(209,67,67,.07)}
.tgrid tr.okr td{background:var(--ok-soft)}
.tgrid td small{display:block;color:var(--muted);font-size:11.5px}
.tgrid select{font:12.5px var(--f-mono);padding:4px 6px;min-height:30px;max-width:260px}
.tgrid-more{display:flex;justify-content:space-between;align-items:center;gap:10px;font:12px var(--f-mono);color:var(--muted);padding-top:8px;flex-wrap:wrap}
.spill{display:inline-grid;grid-template-columns:52px auto;align-items:center;gap:8px;white-space:nowrap}
.spill i{display:block;height:6px;border-radius:3px;background:linear-gradient(90deg,currentColor var(--w,100%),var(--line) 0)}
.spill.ok{color:var(--ok)}.spill.warn{color:var(--amber)}.spill.bad{color:#D14343}
.spill b{font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink)}
.tag2{display:inline-block;font:600 11px var(--f-mono);padding:2px 8px;border-radius:999px;white-space:nowrap;border:1px solid var(--line);color:var(--muted)}
.tag2.ok{color:var(--ok);background:var(--ok-soft);border-color:transparent}
.tag2.warn{color:var(--amber);background:var(--amber-soft);border-color:transparent}
.tag2.bad{color:#D14343;background:rgba(209,67,67,.1);border-color:transparent}
.tag2.blue{color:var(--accent);background:var(--accent-soft);border-color:transparent}
.codeout{position:relative}
.codeout pre{margin:0;max-height:480px;overflow:auto;background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:14px 16px;font:12.5px/1.6 var(--f-mono);white-space:pre;tab-size:2}
.kvs{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.kvs div{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--bg);display:grid;gap:3px}
.kvs>div>span{font:500 11px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.kvs b{font:600 15px var(--f-mono);overflow-wrap:anywhere}
.kvs small{font-size:12.5px;color:var(--muted)}

/* hub */
.tool-cards .pcard .m{font-family:var(--f-mono);font-size:12px;color:var(--ok);background:var(--ok-soft);padding:2px 8px;border-radius:5px;width:max-content;max-width:100%}
.tool-intro{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;margin-bottom:28px}
.tool-intro div{border:1px solid var(--line);border-radius:14px;padding:16px 18px;background:var(--surface)}
.tool-intro b{display:block;font-family:var(--f-display);font-stretch:112%;font-weight:700;font-size:17px;margin-bottom:4px}
.tool-intro p{font-size:14.5px;color:var(--muted)}
@media (max-width:820px){.tool-intro{grid-template-columns:minmax(0,1fr)}}

@media (max-width:560px){
  .tool{border-radius:14px;padding:12px}
  .rng input[type=range]{width:140px}
  .tbtn{flex:1 1 auto}
  .src-act .tbtn,.tgrid-more .tbtn{flex:0 0 auto}
}
@media print{.toolsec{display:none}}

/* profiler cards */
.pcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,340px),1fr));gap:14px}
.pcol{border:1px solid var(--line);border-radius:14px;background:var(--bg);padding:16px;display:grid;gap:12px;align-content:start}
.pcol header{display:flex;justify-content:space-between;gap:10px;align-items:start}
.pcol h3{font:700 15px var(--f-mono);overflow-wrap:anywhere}
.pbar{height:8px;border-radius:4px;background:var(--line);overflow:hidden;display:flex}
.pbar i{display:block;height:100%;background:var(--ok)}
.pbar i.ph{background:var(--amber)}
.pkv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px;margin:0}
.pkv dt{font:500 10.5px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.pkv dd{margin:0;font:13px var(--f-mono);overflow-wrap:anywhere}
.ptop{display:grid;gap:4px;font:12.5px var(--f-mono)}
.ptop b{font:500 10.5px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:2px}
.ptop div{display:grid;grid-template-columns:minmax(0,1fr) 70px 44px;gap:8px;align-items:center}
.ptop.pat div{grid-template-columns:minmax(0,1fr) 44px}
.ptop span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ptop i{display:block;height:6px;border-radius:3px;background:linear-gradient(90deg,var(--accent) var(--w),var(--line) 0)}
.ptop em{font-style:normal;text-align:right;color:var(--muted)}
.piss{list-style:none;margin:0;padding:0;display:grid;gap:6px;font-size:13.5px;line-height:1.45}
.piss li{padding:7px 10px;border-radius:8px;border-left:3px solid var(--amber);background:var(--amber-soft)}
.piss li.bad{border-left-color:#D14343;background:rgba(209,67,67,.08)}
.pok{font-size:13.5px;color:var(--ok)}

/* MRZ */
.mrz-in{font:16px/1.7 var(--f-mono)!important;letter-spacing:.08em;text-transform:uppercase;min-height:120px!important}
.mrzbox{font:clamp(11px,1.55vw,17px)/1.9 var(--f-mono);letter-spacing:.06em;background:var(--bg);border:1px solid var(--line);border-radius:12px;padding:12px 14px;overflow-x:auto;white-space:pre}
.mrzbox span{border-radius:3px;padding:1px 0}
.m-type{background:rgba(111,149,255,.18)}.m-state{background:rgba(79,208,143,.2)}.m-name{background:rgba(242,169,59,.16)}
.m-doc{background:rgba(111,149,255,.28)}.m-date{background:rgba(185,120,255,.2)}.m-sex{background:rgba(79,208,143,.32)}.m-opt{background:rgba(140,153,173,.18)}
.m-ck{background:var(--ink);color:var(--surface);font-weight:600}
.m-ck.m-bad{background:#D14343;color:#fff}
.calc{display:flex;gap:10px;align-items:center;flex-wrap:wrap;font-size:14px}

/* selector tester */
.fields{display:grid;gap:8px}
.frow{display:grid;grid-template-columns:minmax(80px,140px) minmax(0,1fr) 150px auto 64px 34px;gap:8px;align-items:center}
.frow .fa[hidden]{display:none}
.frow:not(:has(.fa:not([hidden]))){grid-template-columns:minmax(80px,140px) minmax(0,1fr) 150px 64px 34px}
.fcount{font:600 12px var(--f-mono);text-align:right;color:var(--muted)}
.fcount.ok{color:var(--ok)}.fcount.none{color:var(--amber)}.fcount.bad{color:#D14343}
@media (max-width:700px){
  .frow,.frow:not(:has(.fa:not([hidden]))){grid-template-columns:minmax(0,1fr) auto 40px;border:1px solid var(--line);border-radius:10px;padding:8px;background:var(--bg)}
  .frow .fn{grid-row:1;grid-column:1/-1}.frow .fs{grid-row:2;grid-column:1/-1}
  .frow .fx{grid-row:3;grid-column:1}.frow .fcount{grid-row:3;grid-column:2}.frow .frm{grid-row:3;grid-column:3;flex:0 0 auto}
  .frow .fa{grid-row:4;grid-column:1/-1}
}

/* ROI */
.roi-in{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,210px),1fr));gap:14px 18px}
.unit{display:flex;align-items:center;gap:6px;min-width:0}
.unit input{flex:1 1 auto;min-width:0;width:auto!important}
.unit em{font:500 12.5px var(--f-mono);font-style:normal;color:var(--muted);white-space:nowrap}
.chartw{position:relative;border:1px solid var(--line);border-radius:12px;background:var(--surface);padding:10px 8px 4px}
.chartw h3{font:600 13px var(--f-body);color:var(--ink);padding:4px 8px 0}
.chartw p{font-size:12.5px;color:var(--muted);padding:0 8px}
#chart{position:relative}
#chart svg{display:block;width:100%;height:auto;overflow:visible}
#chart{min-height:220px}
#chart .g{stroke:var(--line);stroke-width:1}
#chart .g.z{stroke:var(--muted);stroke-width:1.2}
#chart .yl{font:11px var(--f-mono);fill:var(--muted);text-anchor:end}
#chart .xl{font:11px var(--f-mono);fill:var(--muted);text-anchor:middle}
#chart .ln{fill:none;stroke:var(--accent);stroke-width:2.2;stroke-linejoin:round;stroke-linecap:round}
#chart .pb{fill:var(--accent);stroke:var(--surface);stroke-width:2}
#chart .pbl{font:600 12px var(--f-body);fill:var(--ink)}
#chart .hx{stroke:var(--muted);stroke-width:1;stroke-dasharray:3 3}
#chart .hd{fill:var(--accent);stroke:var(--surface);stroke-width:2}
#chart .hit{cursor:crosshair}
.ctip{position:absolute;pointer-events:none;background:var(--ink);color:var(--surface);border-radius:8px;padding:6px 10px;font:12px var(--f-mono);display:grid;gap:1px;min-width:140px;z-index:2}
.ctip b{font:600 11px var(--f-mono);opacity:.75}
.math ol{margin:0;padding-left:1.2em;display:grid;gap:6px;font-size:14.5px}
.math b{font-weight:600}

/* accepted files + sample file */
.src-accept{display:flex;justify-content:space-between;gap:6px 12px;flex-wrap:wrap;font-size:12.5px;color:var(--muted);line-height:1.45}
.src-accept b{font:600 12px var(--f-mono);color:var(--ink)}
.linkbtn{background:none;border:0;padding:0;font:500 12.5px var(--f-body);color:var(--accent);cursor:pointer;text-decoration:underline;text-underline-offset:3px}
.src-meta:empty{display:none}

/* 1-2-3 stepper */
.tg{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
.tg-steps{list-style:none;margin:0;padding:0;display:flex;gap:6px;flex-wrap:wrap;counter-reset:s}
.tg-steps li{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--muted);padding:6px 12px 6px 6px;border:1px solid var(--line);border-radius:999px;background:var(--bg);transition:all .25s}
.tg-steps li::before{counter-increment:s;content:counter(s);display:grid;place-items:center;width:22px;height:22px;border-radius:50%;font:600 12px var(--f-mono);background:var(--line);color:var(--ink);transition:all .25s}
.tg-steps li.now{border-color:var(--accent);color:var(--ink);box-shadow:0 0 0 3px var(--accent-soft)}
.tg-steps li.now::before{background:var(--accent);color:#fff}
.tg-steps li.done{color:var(--ink)}
.tg-steps li.done::before{content:"✓";background:var(--ok);color:#fff}
@media (max-width:560px){.tg-steps{width:100%}.tg-steps li{flex:1 1 100%}}

/* breakdown bar */
.bd-t{font:500 11px var(--f-mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:6px}
.bd{display:flex;height:14px;border-radius:7px;overflow:hidden;gap:2px;background:var(--surface)}
.bd i{display:block;min-width:4px;transition:flex-grow .5s ease}
.bd-l{display:flex;flex-wrap:wrap;gap:4px 16px;margin-top:8px;font-size:13px;color:var(--muted)}
.bd-l span{display:inline-flex;align-items:center;gap:6px}
.bd-l b{color:var(--ink);font-weight:600}.bd-l em{font-style:normal;font-family:var(--f-mono);font-size:12px}
.bd-l i{width:10px;height:10px;border-radius:3px;display:inline-block}
.bd .ok,.bd-l .ok{background:var(--ok)}.bd .ok2,.bd-l .ok2{background:color-mix(in srgb,var(--ok) 55%,var(--surface))}
.bd .warn,.bd-l .warn{background:var(--amber)}.bd .bad,.bd-l .bad{background:#D14343}
.bd .blue,.bd-l .blue{background:var(--accent)}.bd .mute,.bd-l .mute{background:var(--line)}

/* histogram */
.hg-h{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:13px;color:var(--muted);margin-bottom:8px}
.hg-h b{color:var(--ink);font-weight:600}
.hg{position:relative;display:grid;grid-template-columns:repeat(20,1fr);gap:2px;height:100px;padding-top:18px;align-items:end;border-bottom:1px solid var(--line)}
.hg-c{height:100%;display:flex;align-items:flex-end}
.hg-c i{display:block;width:100%;border-radius:3px 3px 0 0;transition:height .4s ease}
.hg-c i.ok{background:var(--ok)}.hg-c i.warn{background:var(--amber)}.hg-c i.bad{background:#D14343;opacity:.75}
.hg-th{position:absolute;top:0;bottom:0;border-left:2px dashed var(--ink);pointer-events:none}
.hg-th em{position:absolute;top:0;left:5px;font:600 11px var(--f-mono);font-style:normal;color:var(--ink)}
.hg-x{display:flex;justify-content:space-between;font:11px var(--f-mono);color:var(--muted);margin-top:4px}
.viz{border:1px solid var(--line);border-radius:12px;background:var(--bg);padding:14px 16px;display:grid;gap:14px}

/* ================= tool hero figures (CSS only; core.js adds .play and replays every 10s) ================= */
.ph.tool-head{align-items:center}
.ph-uses{list-style:none;margin:18px 0 0;padding:0;display:grid;gap:7px;max-width:58ch}
.ph-uses li{position:relative;padding-left:22px;color:var(--band-ink);font-size:15px;line-height:1.5}
.ph-uses li::before{content:"";position:absolute;left:2px;top:.55em;width:9px;height:9px;border-radius:2px;background:var(--band-accent);transform:rotate(45deg)}
.ph-uses b{font-weight:600}
.ph-use-h{display:block;margin-top:22px;font:500 11.5px var(--f-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--band-muted)}
.tf{min-height:0;font-size:12px}
.tf .tag{font-size:10px}
.tf-dim{color:var(--band-muted)!important;font-style:italic}
/* animation building blocks */
@keyframes tf-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes tf-pop{0%{opacity:0;transform:scale(.6)}70%{opacity:1;transform:scale(1.08)}100%{opacity:1;transform:scale(1)}}
@keyframes tf-grow{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes tf-fill{from{width:0}to{width:var(--w)}}
@keyframes tf-type{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes tf-hl{to{background:rgba(242,169,59,.16);border-color:var(--band-amber)}}
@keyframes tf-collapse{to{max-height:0;padding-top:0;padding-bottom:0;margin-top:-4px;border-width:0;opacity:0}}
@keyframes tf-mark{to{background:rgba(111,149,255,.28);box-shadow:0 0 0 1px var(--band-accent)}}
@keyframes tf-ok{to{background:var(--band-ok);color:var(--band)}}
@keyframes tf-glow{to{background:rgba(242,169,59,.3);box-shadow:0 0 0 1px var(--band-amber)}}
@keyframes tf-free{to{color:var(--band-ok);border-color:var(--band-ok);background:rgba(79,208,143,.12)}}
.tf.play .tf-in{animation:tf-in .45s ease var(--d,0s) both}
.tf.play .tf-pop{animation:tf-pop .45s ease var(--d,0s) both}
.tf.play .tf-ln i{animation:tf-grow .35s ease var(--d,0s) both}
.tf.play .tf-fill{animation:tf-fill .8s ease var(--d,0s) both}
.tf.play .tf-type{animation:tf-type .45s steps(18) var(--d,0s) both}
.tf.play .tf-row{animation:tf-in .35s ease var(--d,0s) both}
.tf.play .tf-row.tf-gone{animation:tf-in .35s ease var(--d,0s) both,tf-hl .3s ease 2.3s forwards,tf-collapse .5s ease 4.3s forwards}
.tf.play .tf-hl{animation:tf-mark .3s ease var(--d,0s) forwards}
.tf.play .tf-ck{animation:tf-ok .3s ease var(--d,0s) forwards}
.tf.play .tf-glow{animation:tf-glow .3s ease var(--d,0s) forwards}
.tf.play .tf-p{animation:tf-in .35s ease var(--d,0s) both}
.tf.play .tf-p.free{animation:tf-in .35s ease var(--d,0s) both,tf-free .4s ease 3.5s forwards}
.tf.out>*:not(.fig-h):not(.fig-f){opacity:0;transition:opacity .35s}
/* static end state (no JS, reduced motion, preview cards) */
.tf:not(.play) .tf-row.tf-gone{display:none}
.tf:not(.play) .tf-hl{background:rgba(111,149,255,.28);box-shadow:0 0 0 1px var(--band-accent)}
.tf:not(.play) .tf-ck{background:var(--band-ok);color:var(--band)}
.tf:not(.play) .tf-p.free{color:var(--band-ok);border-color:var(--band-ok);background:rgba(79,208,143,.12)}
.tf:not(.play) .tf-fill{width:var(--w)}
.tf:not(.play) .tf-glow{background:rgba(242,169,59,.3);box-shadow:0 0 0 1px var(--band-amber)}
@media (prefers-reduced-motion:reduce){.tf *{animation:none!important}}

/* fuzzy */
.tf-pairs{display:grid;gap:7px}
.tf-ph,.tf-pair{display:grid;grid-template-columns:minmax(0,1fr) 34px minmax(0,1.15fr) 38px;gap:6px;align-items:center}
.tf-ph{font:500 10px var(--f-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--band-muted)}
.tf-pair>span:not(.tag):not(.tf-ln){font:12px var(--f-mono);color:var(--band-ink);background:var(--band-tint);border:1px solid var(--band-line);border-radius:7px;padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tf-pair .tag{justify-self:end}
.tf-ln{height:2px;display:block}
.tf-ln i{display:block;height:2px;width:100%;transform-origin:left;background:var(--band-ok)}
.tf-ln.amber i{background:var(--band-amber)}.tf-ln.bad i{background:var(--band-bad);opacity:.5;background:repeating-linear-gradient(90deg,var(--band-bad) 0 4px,transparent 4px 7px)}
.tf-key{display:flex;gap:14px;font:500 10.5px var(--f-mono);color:var(--band-muted);flex-wrap:wrap}
.tf-key span{display:inline-flex;align-items:center;gap:5px}.tf-key i{width:8px;height:8px;border-radius:2px;display:inline-block}
.tf-key .ok{background:var(--band-ok)}.tf-key .amber{background:var(--band-amber)}.tf-key .bad{background:var(--band-bad)}
/* standardizer */
.tf-std{display:grid;gap:16px}
.tf-grp{display:grid;grid-template-columns:minmax(0,1.3fr) 22px minmax(0,1fr);gap:8px;align-items:center}
.tf-chips{display:flex;flex-wrap:wrap;gap:5px}
.tf-chip{font:12px var(--f-mono);color:var(--band-ink);background:var(--band-tint);border:1px solid var(--band-line);border-radius:999px;padding:4px 9px;display:inline-flex;gap:6px;align-items:center}
.tf-chip em{font-style:normal;font-size:9.5px;color:var(--band-muted);text-transform:uppercase;letter-spacing:.05em}
.tf-arrow{color:var(--band-accent);font:600 16px var(--f-mono);text-align:center}
.tf-canon{font:600 14px var(--f-body);color:var(--band-ink);border:1.5px solid var(--band-ok);background:rgba(79,208,143,.1);border-radius:10px;padding:9px 12px;display:grid;gap:2px}
.tf-canon small{font:500 10.5px var(--f-mono);color:var(--band-ok)}
/* dedupe */
.tf-tbl{display:grid;gap:4px}
.tf-row{display:grid;grid-template-columns:20px minmax(0,1fr) minmax(0,1.2fr) auto;gap:8px;align-items:center;font:12px var(--f-mono);color:var(--band-ink);border:1px solid var(--band-line);border-radius:7px;padding:6px 9px;background:var(--band-tint);max-height:34px;overflow:hidden;white-space:pre}
.tf-row>span{overflow:hidden;text-overflow:ellipsis}
.tf-n{color:var(--band-muted)}
.tf-count{display:flex;justify-content:space-between;align-items:center;gap:10px;font:12px var(--f-mono);color:var(--band-muted);flex-wrap:wrap}
.tf-count b{color:var(--band-ok);font-weight:600;font-size:13px}
/* profiler */
.tf-prof{display:grid;gap:9px}
.tf-pc{display:grid;grid-template-columns:86px minmax(0,1fr) auto;gap:10px;align-items:center}
.tf-pn{font:12px var(--f-mono);color:var(--band-ink)}
.tf-bar,.tf-bar2{display:block;height:8px;border-radius:4px;background:var(--band-tint2);overflow:hidden}
.tf-fill{display:block;height:100%;width:var(--w);background:var(--band-ok);border-radius:4px}
.tf-bar2{height:14px;border-radius:7px}
.tf-bar2 .tf-fill{background:var(--band-amber)}.tf-bar2 .tf-fill.ok{background:var(--band-ok)}
/* sql / json / selector shared */
.tf-two{display:grid;grid-template-columns:minmax(0,.95fr) minmax(0,1.1fr);gap:8px}
.tf-pre{margin:0;font:11px/1.6 var(--f-mono);color:var(--band-ink);white-space:pre;overflow:hidden}
.tf-pre .tf-type{display:block}
.tf-pre i{font-style:normal;color:var(--band-ok)}
.tf-pre b{font-weight:500;border-radius:3px}
.tf-pre b.k1{color:var(--band-accent)}.tf-pre b.k2{color:var(--band-amber)}
.tf-mini{display:grid;gap:4px;font:11px var(--f-mono)}
.tf-mh,.tf-mr{display:grid;grid-template-columns:.6fr 1.2fr 1fr;gap:6px;padding:5px 6px;border-radius:6px}
.tf-mini2 .tf-mh,.tf-mini2 .tf-mr{grid-template-columns:1.4fr 1fr}
.tf-mh{color:var(--band-muted);border-bottom:1px solid var(--band-line);border-radius:0;font-size:10px}
.tf-mh span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tf-mh .k1{color:var(--band-accent)}.tf-mh .k2{color:var(--band-amber)}
.tf-mr{color:var(--band-ink);background:var(--band-tint)}
.tf-note{margin-top:10px;font:500 11px var(--f-body);color:var(--band-ok)}
.tf-selq{font:13px var(--f-mono);color:var(--band-ink);border:1px solid var(--band-accent);border-radius:8px;padding:7px 10px;background:var(--band-well)}
.tf-selq::before{content:"selector  ";color:var(--band-muted);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase}
.tf-selq .tf-type{display:inline-block}
/* mrz */
.tf-mrz{font:clamp(9.5px,1.05vw,12.5px)/2 var(--f-mono);letter-spacing:.04em;color:var(--band-ink);background:var(--band-well);border:1px solid var(--band-line);border-radius:10px;padding:8px 10px;white-space:pre;overflow:hidden}
.tf-mrz span,.tf-mrz b{border-radius:3px}
.tf-mrz .m-name{background:rgba(242,169,59,.16)}
.tf-ck{font-weight:600;padding:0 1px}
/* dates */
.tf-dates{display:grid;gap:6px}
.tf-dr{display:grid;grid-template-columns:minmax(0,1fr) 22px minmax(0,1fr) auto;gap:8px;align-items:center;font:12px var(--f-mono);color:var(--band-ink)}
.tf-dr>span:first-child{background:var(--band-tint);border:1px solid var(--band-line);border-radius:7px;padding:5px 8px;white-space:nowrap}
.tf-dr b{font-weight:600;color:var(--band-ok)}.tf-dr b.amber{color:var(--band-amber)}.tf-dr b.bad{color:var(--band-bad)}
/* fte */
.tf-fte{display:grid;gap:12px}
.tf-hb{display:grid;grid-template-columns:110px minmax(0,1fr) 84px;gap:10px;align-items:center;font:12px var(--f-mono);color:var(--band-muted)}
.tf-hb b{color:var(--band-ink);font-weight:600;text-align:right}
.tf-team{display:grid;grid-template-columns:110px auto 1fr;gap:10px;align-items:center;margin-top:4px}
.tf-lbl{font:12px var(--f-mono);color:var(--band-muted)}
.tf-ppl{display:flex;gap:6px}
.tf-p{width:38px;height:38px;border-radius:50%;border:1.5px solid var(--band-line);display:grid;place-items:center;color:var(--band-muted);background:var(--band-tint)}
.tf-p svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.tf-big{justify-self:end;font:800 18px var(--f-display);font-stretch:112%;color:var(--band-ok)}
@media (max-width:560px){
  .tf-two{grid-template-columns:minmax(0,1fr)}
  .tf-hb,.tf-team{grid-template-columns:78px minmax(0,1fr) 92px}
  .tf-team{grid-template-columns:90px auto}.tf-big{grid-column:1/-1;justify-self:start}
  .tf-pc{grid-template-columns:78px minmax(0,1fr)}.tf-pc .tag{grid-column:2}
}

[data-sample]{border-color:var(--accent)!important;color:var(--accent)!important}
.tool-top.tg{align-items:center}

/* profiler glance */
.gl{display:grid;gap:4px}
.gl-r{display:grid;grid-template-columns:minmax(90px,180px) minmax(0,1fr) 44px 92px;gap:10px;align-items:center;font:12.5px var(--f-mono);color:var(--ink);text-decoration:none;padding:4px 6px;border-radius:6px}
.gl-r:hover{background:var(--surface)}
.gl-n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gl-b{display:flex;height:8px;border-radius:4px;background:var(--line);overflow:hidden}
.gl-b i{display:block;height:100%;background:var(--ok)}.gl-b i.ph{background:var(--amber)}
.gl-p{text-align:right;color:var(--muted)}
.gl-r .tag2{justify-self:start}
@media (max-width:560px){.gl-r{grid-template-columns:minmax(0,1fr) 64px 40px}.gl-r .tag2{display:none}}
.pcol{scroll-margin-top:90px}

/* FTE calculator */
.qs{border:1px solid var(--line);border-radius:14px;padding:16px 18px;background:var(--bg);display:grid;gap:14px}
.qs-h{display:flex;align-items:center;gap:10px;font:700 16px var(--f-display);font-stretch:108%;color:var(--ink)}
.qs-h span{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;font:600 13px var(--f-mono)}
:root[data-theme="dark"] .qs-h span{color:#0B1320}
@media (prefers-color-scheme: dark){:root:not([data-theme="light"]) .qs-h span{color:#0B1320}}
.qgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr));gap:16px 20px}
.qgrid .fld>span{font:600 14px var(--f-body);letter-spacing:0;text-transform:none;color:var(--ink)}
.qgrid .fld small{font-size:12.5px;line-height:1.45}
.opt{font:500 11px var(--f-mono);font-style:normal;color:var(--muted);background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:1px 7px;margin-left:4px;vertical-align:1px;text-transform:none;letter-spacing:0}
.unit select{min-width:0;flex:0 0 auto}
.fld.bad input{border-color:#D14343;box-shadow:0 0 0 2px rgba(209,67,67,.15)}
.ferr{font-style:normal;font-size:12.5px;color:#D14343;font-weight:600}
.sw{font-weight:600}
.headline{font-size:clamp(17px,1.8vw,20px);line-height:1.55;color:var(--ink)}
.headline b{color:var(--ok);font-weight:650}
.ba-r{display:grid;grid-template-columns:130px minmax(0,1fr) 84px;gap:10px;align-items:center;font-size:13.5px;margin-top:6px}
.ba-r b{font:600 13px var(--f-mono);text-align:right}
.ba-t{display:block;height:16px;border-radius:8px;background:var(--line);overflow:hidden}
.ba-t i{display:block;height:100%;border-radius:8px;transition:width .5s ease}
.ba-t i.warn{background:var(--amber)}.ba-t i.ok{background:var(--ok)}
.ba-note{font-size:12.5px;color:var(--muted);margin-top:8px}
.pps{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
.pp{position:relative;width:40px;height:40px;border-radius:50%;border:1.5px solid var(--line);display:grid;place-items:center;color:var(--muted);background:linear-gradient(90deg,var(--ok-soft) var(--f),transparent 0)}
.pp svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}
.pp[style*="--f:100%"]{color:var(--ok);border-color:var(--ok)}
.pp-key{display:flex;gap:16px;flex-wrap:wrap;font-size:12.5px;color:var(--muted);margin-top:8px}
.pp-key span{display:inline-flex;align-items:center;gap:6px}.pp-key i{width:10px;height:10px;border-radius:50%;border:1.5px solid var(--line);display:inline-block}.pp-key i.g{background:var(--ok-soft);border-color:var(--ok)}
.calcbox{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:12px;padding:14px 18px;background:var(--bg)}
.calcbox h3{font:700 15px var(--f-display);margin-bottom:10px}
.calcbox ol{list-style:none;margin:0;padding:0;display:grid;gap:0;counter-reset:m}
.calcbox li{display:grid;grid-template-columns:200px minmax(0,1fr);gap:12px;padding:8px 0;border-top:1px solid var(--line);font-size:14px;counter-increment:m}
.calcbox li:first-child{border-top:0}
.calcbox li>span:first-child{color:var(--muted)}
.calcbox li>span:first-child::before{content:counter(m) ". ";font-family:var(--f-mono);font-size:12px}
.calcbox li>span:last-child{font-family:var(--f-mono);font-size:13px;overflow-wrap:anywhere}
.calcbox b{color:var(--ink);font-weight:650}
.fte-x{font-size:13.5px;color:var(--muted);margin-top:12px;max-width:70ch}
.fte-x b{color:var(--ink)}
#fte-def b{color:var(--ink);font-weight:600}
@media (max-width:560px){.calcbox li{grid-template-columns:minmax(0,1fr);gap:2px}.ba-r{grid-template-columns:96px minmax(0,1fr) 70px}}

/* hub chooser */
.pick{margin-bottom:28px}
.pick-h{font-family:var(--f-display);font-stretch:112%;font-weight:750;font-size:clamp(22px,2.6vw,28px);margin-bottom:14px}
.pick-g{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.pick-g a{display:flex;justify-content:space-between;align-items:center;gap:14px;padding:13px 16px;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--ink);text-decoration:none;font-size:15px;line-height:1.4;transition:border-color .2s,transform .2s}
.pick-g a:hover{border-color:var(--accent);transform:translateY(-1px)}
.pick-g b{font-weight:600}
.pick-g em{font:500 12.5px var(--f-mono);font-style:normal;color:var(--accent);white-space:nowrap}
@media (max-width:760px){.pick-g{grid-template-columns:minmax(0,1fr)}.pick-g a{flex-direction:column;align-items:flex-start;gap:4px}}
.qgrid .fld{align-content:start}
.headline b.neg{color:#D14343}
