/* Charts and pages generated by bench/benchmarks/build_comparison_page.py
   (/compare/ and everything under it) and build_benchmarks_page.py (/benchmarks/).
   Series colors are validated (dataviz validate_palette.js, light, #fff
   surface, adjacent pairs): csvlite #0e96a8, DuckDB #c2603f, Polars #6b56c9,
   pandas #b48a00, in that order. Four lines are always direct-labelled, as
   four series must be. --alt is the context grey for a tool's load-first mode. */
:root{--ours:#0e96a8;--duckdb:#c2603f;--polars:#6b56c9;--pandas:#b48a00;--alt:#8a9597;--grid:#e6ebe8;--card:#fff}

.perf-main{padding:0 0 110px}
.perf-hero{padding:46px 0 64px;background:var(--ink);color:#e3eeee}
.perf-hero .breadcrumbs{color:#9fb3b3}
.perf-hero .breadcrumbs a{border-color:rgba(255,255,255,.2)}
.perf-hero .eyebrow{color:var(--lime)}
.perf-hero h1{max-width:980px;margin:0 0 18px;color:#fff;font-size:clamp(40px,6vw,76px);line-height:1.04;letter-spacing:-.045em}
.perf-hero h1 em{font-style:normal;color:var(--lime)}
.hero-sub{margin:0 0 44px;color:#a9bcbc;font-size:17px}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:1px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.12);border-radius:18px;overflow:hidden}
.kpi{display:flex;flex-direction:column;gap:6px;padding:24px 26px;background:#15302f}
.kpi-label{color:#9fb3b3;font-size:12px;font-weight:750;letter-spacing:.08em;text-transform:uppercase}
.kpi strong{color:#fff;font-family:Poppins,sans-serif;font-weight:600;font-size:clamp(28px,3.2vw,42px);line-height:1.1;letter-spacing:-.03em}
.kpi-note{color:#c7d6d5;font-size:14px}

.perf-section{padding:72px 0 0}
.section-head{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:14px 30px;margin:0 0 22px}
.section-head h2{margin:0;font-size:clamp(30px,3.6vw,46px);line-height:1.1;letter-spacing:-.04em}
.section-head p{margin:0;color:var(--muted);font-size:15px}

/* Speed-up strip: one lane per tool and size, log axis, parity at 1×. */
.strip-wrap{overflow-x:auto;padding:26px 28px 22px;background:var(--card);border:1px solid var(--line);border-radius:18px}
.strip-svg{width:100%;min-width:620px;height:auto;overflow:visible;font-variant-numeric:tabular-nums}
.strip-svg .faster-zone{fill:#f1f8f9}
.strip-svg .zone-label{fill:var(--teal-dark);font-size:12px;font-weight:750}
.strip-svg .grid{stroke:var(--grid);stroke-width:1}
.strip-svg .parity{stroke:var(--ink);stroke-width:1.5}
.strip-svg .tick{fill:var(--muted);font-size:11px}
.strip-svg .parity-label{fill:var(--ink-soft);font-weight:700}
.strip-svg .lane{stroke:var(--grid);stroke-width:1}
.strip-svg .lane-label{fill:var(--muted);font-size:11px}
.strip-svg .lane-oom{fill:#8d3b22;font-size:11px;font-weight:700}
.strip-svg .tool-name{fill:var(--ink);font-family:Poppins,sans-serif;font-size:15px;font-weight:600}
.strip-svg .tool-key.duckdb{fill:var(--duckdb)}.strip-svg .tool-key.polars{fill:var(--polars)}.strip-svg .tool-key.pandas{fill:var(--pandas)}
.strip-svg .tool-sum{fill:var(--ink);font-family:Poppins,sans-serif;font-size:20px;font-weight:600}
.strip-svg .tool-sub{fill:var(--muted);font-size:11px}
.strip-svg .dot{stroke:var(--card);stroke-width:2}
.strip-svg .dot.duckdb{fill:var(--duckdb)}.strip-svg .dot.polars{fill:var(--polars)}.strip-svg .dot.pandas{fill:var(--pandas)}
.strip-svg .hit-dot{fill:transparent}
.strip-svg .pt{cursor:default}
.strip-svg .pt:hover .dot{stroke:var(--ink);stroke-width:1.5}

/* Size switch: the one filter; it scopes the table and chart below it. */
.size-switch{display:inline-flex;padding:4px;background:var(--paper-2);border-radius:999px}
.size-switch button{padding:9px 18px;border:0;border-radius:999px;background:transparent;color:var(--ink-soft);font-size:14px;font-weight:750;cursor:pointer}
.size-switch button[aria-pressed="true"]{background:var(--ink);color:#fff}
.size-switch button:focus-visible{outline:3px solid var(--teal);outline-offset:2px}

.legend{display:flex;flex-wrap:wrap;gap:6px 18px;color:var(--ink-soft);font-size:13px;font-weight:650}
.legend span{display:inline-flex;align-items:center;gap:7px}
.key{display:inline-block;width:14px;height:3px;border-radius:2px;vertical-align:middle}
.key.ours{background:var(--ours)}.key.duckdb{background:var(--duckdb)}.key.polars{background:var(--polars)}.key.pandas{background:var(--pandas)}.key.alt{background:var(--alt)}

.size-panel{padding:26px 28px;background:var(--card);border:1px solid var(--line);border-radius:18px}
.size-panel+.size-panel{margin-top:22px}
.size-panel[hidden]{display:none}
.panel-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 16px;margin:0 0 16px}
.panel-head h3{margin:0;font-family:Poppins,sans-serif;font-size:24px;letter-spacing:-.03em}
.panel-head p{margin:0;color:var(--muted);font-size:13px}

.results{width:100%;min-width:600px;border-collapse:collapse;font-size:14px;font-variant-numeric:tabular-nums}
.results.wide{min-width:720px}
.results th,.results td{padding:10px 8px;border-bottom:1px solid var(--grid);text-align:left;vertical-align:middle}
.results tr>:first-child{position:sticky;left:0;z-index:1;background:var(--card)}
.results thead th{padding-top:0;color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}
.results thead .key{margin-right:6px}
.results tbody tr:last-child th,.results tbody tr:last-child td{border-bottom:0}
.results tbody th{font-weight:750;white-space:nowrap}
.results tbody th small{display:block;color:var(--muted);font-size:11px;font-weight:500}
.results .num{text-align:right;white-space:nowrap}
.results.wide td.num{color:var(--ink-soft)}
.results.wide td.best{color:var(--ink);font-weight:850}
.results.wide td.ours{background:#f0f8f9}
.results td.oom{color:#8d3b22;font-size:12px;font-weight:700}
.results .oom-note{display:block;color:#8d3b22;font-size:10px;font-weight:700;white-space:nowrap}
.results .pair{width:30%;min-width:120px}
.bar{display:block;height:8px;border-radius:0 4px 4px 0;min-width:2px}
.bar+.bar{margin-top:2px}
.bar.ours{background:var(--ours)}.bar.duckdb{background:var(--duckdb)}.bar.polars{background:var(--polars)}.bar.pandas{background:var(--pandas)}
.chip{display:inline-block;padding:3px 8px;border-radius:5px;font-size:12px;font-weight:800;white-space:nowrap}
.chip.win{background:#dff1f3;color:#075963}
.chip.par{background:#eceee9;color:var(--ink-soft)}
.chip.loss{background:#f7e4dc;color:#8d3b22}
.scroll-note{display:none;margin:0 0 8px;color:var(--teal-dark);font-size:12px;font-weight:750}

.session{max-width:760px;margin:30px 0 0;padding-top:24px;border-top:1px solid var(--grid)}
.session figcaption{display:flex;flex-direction:column;margin:0 0 10px}
.session figcaption b{font-family:Poppins,sans-serif;font-size:18px;font-weight:600;letter-spacing:-.02em}
.session figcaption span{color:var(--muted);font-size:13px}
.session .legend{margin:0 0 6px}
.session-svg{width:100%;height:auto;overflow:visible}
.session-svg .grid{stroke:var(--grid);stroke-width:1}
.session-svg .tick{fill:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}
.session-svg .axis-title{fill:var(--muted);font-size:12px}
.session-svg .line{fill:none;stroke-width:2;stroke-linejoin:round;stroke-linecap:round}
.session-svg .line.ours{stroke:var(--ours);stroke-width:2.5}.session-svg .line.duckdb{stroke:var(--duckdb)}.session-svg .line.polars{stroke:var(--polars)}.session-svg .line.pandas{stroke:var(--pandas)}.session-svg .line.alt{stroke:var(--alt)}
.session-svg .dot{stroke:var(--card);stroke-width:2}
.session-svg .dot.ours{fill:var(--ours)}.session-svg .dot.duckdb{fill:var(--duckdb)}.session-svg .dot.polars{fill:var(--polars)}.session-svg .dot.pandas{fill:var(--pandas)}.session-svg .dot.alt{fill:var(--alt)}
.session-svg .end-value{fill:var(--ink);font-size:15px;font-weight:800}
.session-svg .end-name{fill:var(--ink-soft);font-size:12px;font-weight:650}
.session-svg .hit{fill:transparent;cursor:crosshair}
.session-svg .crosshair{stroke:var(--ink);stroke-width:1;opacity:0;pointer-events:none}
.session-svg.tracking .crosshair{opacity:.35}
.data-view{margin-top:6px;font-size:13px}
.data-view summary{color:var(--muted);cursor:pointer}
.data-view table{margin-top:8px;border-collapse:collapse;font-variant-numeric:tabular-nums}
.data-view th,.data-view td{padding:4px 14px 4px 0;text-align:left;white-space:nowrap}

.chart-tip{position:fixed;z-index:50;padding:9px 12px;background:var(--ink);color:#dfe9e9;border-radius:8px;box-shadow:0 10px 30px rgba(16,36,38,.25);font-size:12px;line-height:1.5;pointer-events:none;font-variant-numeric:tabular-nums}
.chart-tip b{display:block;margin-bottom:2px;color:#fff;font-size:12px}

/* Head-to-head links from the overview to each tool's page. */
.h2h-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.h2h-card{display:flex;flex-direction:column;gap:6px;padding:24px 26px;background:var(--card);border:1px solid var(--line);border-radius:18px;transition:transform .2s,box-shadow .2s}
.h2h-card:hover,.h2h-card:focus-visible{transform:translateY(-3px);box-shadow:0 14px 34px rgba(16,36,38,.08)}
.h2h-name{display:flex;align-items:center;gap:9px;font-weight:800}
.h2h-name .key{width:18px}
.h2h-card strong{font-family:Poppins,sans-serif;font-size:42px;font-weight:600;line-height:1.1;letter-spacing:-.03em}
.h2h-note{color:var(--muted);font-size:13px}
.h2h-link{margin-top:10px;color:var(--teal-dark);font-size:14px;font-weight:800}

/* "The code you'd write": the benchmarked code beside csvlite's one step. */
.code-list{display:grid;gap:16px}
.code-row{display:grid;grid-template-columns:190px minmax(0,1fr) 220px;gap:22px;align-items:center;padding:20px 22px;background:var(--card);border:1px solid var(--line);border-radius:16px}
.code-label b{display:block;font-family:Poppins,sans-serif;font-size:18px;font-weight:600}
.code-label span{display:flex;align-items:center;gap:7px;margin-top:3px;color:var(--ink-soft);font-size:13px;font-variant-numeric:tabular-nums}
.code-label span:last-child{color:var(--muted);font-size:11px}
.code{margin:0;padding:14px 16px;overflow-x:auto;background:#102426;color:#d9e6e5;border-radius:10px;font-size:12.5px;line-height:1.55}
.code-ours{display:flex;flex-direction:column;gap:4px;padding:14px 16px;background:#f0f8f9;border-radius:10px;color:#075963;font-weight:800;font-size:14px}
.code-ours span{color:var(--teal-dark);font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.sibling-links{margin:28px 0 0;color:var(--muted);font-size:14px}
.sibling-links a{color:var(--teal-dark);font-weight:750;text-decoration:underline;text-underline-offset:3px}

/* The /compare/ hub. Rows another tool cannot show are neutral grey so the
   one csvlite bar carries the emphasis; code tools keep their series color. */
.hub-grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:22px;align-items:start}
.hub-grid.for-code{grid-template-columns:minmax(0,5fr) minmax(0,7fr)}
.cap-card{margin:0;padding:24px 26px;background:var(--card);border:1px solid var(--line);border-radius:18px}
.cap-card figcaption{display:flex;flex-direction:column;margin:0 0 18px}
.cap-card figcaption b{font-family:Poppins,sans-serif;font-size:18px;font-weight:600;letter-spacing:-.02em}
.cap-card figcaption span{color:var(--muted);font-size:13px}
.cap-row{display:grid;grid-template-columns:142px minmax(0,1fr) 104px;gap:12px;align-items:center;margin:0 0 14px;font-size:13px}
.cap-row b{font-weight:750}
.cap-track{display:block;height:12px;background:#eef1ef;border-radius:0 6px 6px 0}
.cap-track i{display:block;height:100%;border-radius:0 6px 6px 0;background:#9aa6a8}
.cap-track i.ours{background:var(--ours)}.cap-track i.duckdb{background:var(--duckdb)}.cap-track i.polars{background:var(--polars)}.cap-track i.pandas{background:var(--pandas)}
.cap-value{text-align:right;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap}
.cap-value small{display:block;color:var(--muted);font-size:11px;font-weight:600}
.cap-source{margin:16px 0 0;color:var(--muted);font-size:12px}
.cap-source a{color:var(--teal-dark);font-weight:750;text-decoration:underline;text-underline-offset:3px}
.apps-card{background:var(--card);border:1px solid var(--line);border-radius:18px;overflow:hidden}
.apps-card .table-scroll{margin:0}
.apps-card .scroll-note{margin:14px 16px 0}
.apps{width:100%;min-width:620px;border-collapse:collapse;font-size:13px}
.apps th,.apps td{padding:13px 16px;border-bottom:1px solid var(--grid);text-align:left;vertical-align:top}
.apps thead th{padding-top:18px}
.apps thead th{color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.06em;text-transform:uppercase}
.apps tbody tr:last-child th,.apps tbody tr:last-child td{border-bottom:0}
.apps tbody th{font-weight:800;white-space:nowrap}
.apps tbody th a:not(.src){color:var(--teal-dark);text-decoration:underline;text-underline-offset:3px}
.apps .src{color:var(--muted);font-weight:600;font-size:12px}
.apps tr>:first-child{position:sticky;left:0;z-index:1;background:var(--card)}
.apps tr.ours{background:#f0f8f9}
.apps tr.ours>:first-child{background:#f0f8f9}
.apps tr.ours td{color:#075963;font-weight:750}
.h2h-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}
.h2h-card .h2h-word{font-size:30px}
.promise-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;background:var(--line);border:1px solid var(--line);border-radius:16px;overflow:hidden}
.promise-row div{display:flex;flex-direction:column;gap:4px;padding:20px 22px;background:var(--card)}
.promise-row b{font-family:Poppins,sans-serif;font-size:20px;font-weight:600}
.promise-row span{color:var(--ink-soft);font-size:14px}

/* Head-to-head pages: "Choose X for" cards; csvlite's card carries the accent. */
.choose-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}
.choose-grid.n3{grid-template-columns:repeat(3,minmax(0,1fr))}
.choose-card{padding:26px 28px;background:var(--card);border:1px solid var(--line);border-radius:18px}
.choose-card.ours{background:#f0f8f9;border-color:rgba(14,150,168,.35)}
.choose-card h3{margin:0 0 14px;font-family:Poppins,sans-serif;font-size:20px;font-weight:600;letter-spacing:-.02em}
.choose-card.ours h3{color:#075963}
.choose-card ul{margin:0;padding:0;list-style:none;display:grid;gap:10px}
.choose-card li{position:relative;padding-left:22px;color:var(--ink-soft);font-size:15px;line-height:1.5}
.choose-card li::before{content:"";position:absolute;left:2px;top:.55em;width:9px;height:9px;border-radius:50%;background:#9aa6a8}
.choose-card.ours li::before{background:var(--ours)}
.perf-section>.cap-card{max-width:620px}
.sibling-links+.sibling-links{margin-top:8px}

/* /benchmarks/: csvlite alone, warm vs cold is one hue in two shades
   (#5fbecb / #086a77, dataviz --ordinal PASS on #fff). */
.key.warm,.bar.warm{background:#5fbecb}.key.cold,.bar.cold{background:#086a77}
.table-legend{margin:0 0 14px}
.results.bench{min-width:520px}
.results.ladder{min-width:560px}
.results.ladder td small{display:block;color:var(--muted);font-size:11px;font-weight:600}
.results.ladder th small{display:block;color:var(--muted);font-size:11px;font-weight:500}
.chip.refused{background:#eceee9;color:var(--muted)}
/* The refusal rationale: dark like the hero, so it reads as the page's
   one editorial aside rather than another data card. */
.refusal-note{margin:0 0 22px;padding:28px 30px;background:var(--ink);color:#dfe9e9;border-radius:18px;scroll-margin-top:24px}
.refusal-kicker{margin:0 0 18px;color:var(--lime);font-size:12px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.refusal-points{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:26px}
.refusal-points div{display:flex;flex-direction:column;gap:6px}
.refusal-points b{color:#fff;font-family:Poppins,sans-serif;font-size:20px;font-weight:600;letter-spacing:-.02em}
.refusal-points span{color:#b9cccb;font-size:14px;line-height:1.6}
.refusal-tip{margin:22px 0 0;padding-top:16px;border-top:1px solid rgba(255,255,255,.12);color:#dfe9e9;font-size:14px;font-weight:650}
.ladder-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:22px}
.ladder-grid>.cap-card{min-width:0}
.ladder-grid .table-scroll{margin:0}
.range-svg{width:100%;min-width:620px;height:auto;font-variant-numeric:tabular-nums}
.range-svg .grid{stroke:var(--grid);stroke-width:1}
.range-svg .tick{fill:var(--muted);font-size:10px}
.range-svg .row-label{fill:var(--ink-soft);font-size:10.5px;font-weight:600}
.range-svg .span{stroke-width:3;stroke-linecap:round}
.range-svg .span.warm{stroke:#5fbecb}.range-svg .span.cold{stroke:#086a77}
.range-svg .mid{stroke:var(--card);stroke-width:2}
.range-svg .mid.warm{fill:#5fbecb}.range-svg .mid.cold{fill:#086a77}
.range-svg .hit{fill:transparent}
.data-view.files{margin-top:18px}
.data-view.files code{font-size:11px;word-break:break-all}
.data-view.files p{margin:8px 0 0;color:var(--muted)}

.method{padding-top:56px}
.method-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;margin:0;background:var(--line);border:1px solid var(--line);border-radius:16px;overflow:hidden}
.method-grid div{padding:18px 20px;background:var(--paper)}
.method-grid dt{margin:0 0 4px;color:var(--muted);font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}
.method-grid dd{margin:0;color:var(--ink-soft);font-size:13px;line-height:1.55}
.method-grid a{color:var(--teal-dark);text-decoration:underline;text-underline-offset:3px}
.perf-cta{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:18px;margin-top:56px}
.perf-cta h2{margin:0;font-size:clamp(28px,3vw,40px)}

@media(max-width:1000px){.kpis{grid-template-columns:repeat(2,minmax(0,1fr))}.choose-grid{grid-template-columns:1fr}.method-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.h2h-grid{grid-template-columns:1fr}.code-row{grid-template-columns:1fr;gap:12px}.hub-grid,.hub-grid.for-code{grid-template-columns:1fr}.ladder-grid{grid-template-columns:1fr}.refusal-points{grid-template-columns:1fr;gap:18px}}
@media(max-width:560px){.perf-hero{padding-top:30px}.kpi{padding:18px}.kpi strong{font-size:28px}.size-panel,.strip-wrap{padding:18px 14px}.size-switch button{padding:8px 12px;font-size:13px}.method-grid{grid-template-columns:1fr}.results{font-size:13px}.results th,.results td{padding:9px 5px}.chip{padding:3px 5px;font-size:11px}.scroll-note{display:block}.h2h-grid.two,.promise-row{grid-template-columns:1fr}.cap-row{grid-template-columns:92px minmax(0,1fr) 84px;gap:8px}.results:not(.wide){min-width:0}.results:not(.wide) .pair,.results:not(.wide) thead th:nth-child(4){display:none}.results:not(.wide) tbody th{white-space:normal}}
