/* observability.gofr.dev — matched to gofr.dev's real design system (extracted from
   its live CSS): deep-navy dark theme (#0F172A), slate panels, sky-cyan accent,
   Inter for UI text and a system mono stack for code — the same typography
   gofr.dev itself serves, so clicking through from gofr.dev feels like one site.
   App shell borrows the mqtt-dashboard pattern: sidebar + stat tiles. */

/* Inter — self-hosted (a strict CSP forbids font CDNs, and a silent fallback to
   system-ui would quietly undo the match). One variable file covers 100-900. */
@font-face{font-family:'Inter';src:url("fonts/inter-variable.woff2") format("woff2");font-weight:100 900;font-display:swap;font-style:normal}
:root{
  --bg:#0F172A; --bg-2:#111C30;
  --surface:#111A2E; --surface-2:#0F1728; --surface-3:#16213A;
  --line:#1E293B; --line-2:#273449;
  --ink:#E7EDF5; --ink-2:#94A3B8; --ink-3:#64748B;
  --cyan:#38BDF8; --cyan-2:#7DD3FC; --blue:#60A5FA; --indigo:#818CF8;
  --glow:rgba(56,189,248,.35);
  --good:#34D399; --warn:#FBBF24; --crit:#F87171;
  --good-bg:rgba(52,211,153,.12); --crit-bg:rgba(248,113,113,.12); --warn-bg:rgba(251,191,36,.12);
  --grad:linear-gradient(95deg,#38BDF8,#60A5FA 60%,#818CF8);
  --sans:'Inter',ui-sans-serif,system-ui,-apple-system,'Segoe UI',sans-serif;
  --display:'Inter',var(--sans);
  --mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,'Liberation Mono','Courier New',monospace;
  --radius:12px; --radius-sm:8px;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);
  font-optical-sizing:auto;font-feature-settings:'cv11','ss01';font-synthesis-weight:none;
  font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;
  min-height:100vh;display:flex;flex-direction:column}
/* ambient glow — gofr.dev's actual blur-cyan / blur-indigo assets */
body::before{content:"";position:fixed;inset:0;z-index:-2;pointer-events:none;opacity:.55;
  background-image:url("blur-cyan.webp"),url("blur-indigo.webp");
  background-repeat:no-repeat,no-repeat;
  background-position:top -340px left -220px, top -300px right -240px;
  background-size:820px,900px}
/* gofr.dev's signature line-and-node graph, top-right, faded like on gofr.dev */
body::after{content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:.7;
  background-image:url("hero-lines.svg");background-repeat:no-repeat;
  background-position:top -180px right -120px;background-size:min(680px,60vw);
  mask-image:linear-gradient(to bottom,#000 0,#000 32%,transparent 62%);
  -webkit-mask-image:linear-gradient(to bottom,#000 0,#000 32%,transparent 62%)}
a{color:var(--cyan);text-decoration:none}
a:hover{color:var(--cyan-2)}
.muted{color:var(--ink-3)}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}
h1,h2,h3,h4{font-family:var(--display);font-weight:500;letter-spacing:-.02em;margin:0}

/* ---------- top bar (gofr.dev-style: transparent, borderless, tiny slate links) ---------- */
/* transparent at the top so it blends into the hero; a soft frosted backdrop
   fades in only once the page is scrolled (the only time content can bleed
   through) — no hard band at rest. */
.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;
  gap:24px;padding:18px clamp(16px,4vw,44px);background:transparent;
  transition:background .25s ease, backdrop-filter .25s ease, box-shadow .25s ease}
.topbar.scrolled{background:rgba(11,17,32,.66);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  box-shadow:0 1px 0 rgba(255,255,255,.03)}
.nav-left{display:flex;align-items:center;gap:26px;min-width:0}
.brand{font-family:var(--display);font-weight:600;font-size:1.06rem;color:var(--ink);letter-spacing:-.02em;display:flex;align-items:center;gap:9px;flex:0 0 auto}
.brand:hover{color:var(--ink)}
.brand .logo-img{height:28px;width:auto;display:block}
.brand .dev{color:var(--cyan)}
.topbar nav{display:flex;gap:20px;align-items:center;font-size:.78rem}
.topbar nav a{color:var(--ink-2);font-weight:400;transition:color .12s ease}
.topbar nav a:hover{color:var(--ink)}
.nav-right{display:flex;align-items:center;gap:16px;font-size:.78rem;flex:0 0 auto}
.nav-right a{color:var(--ink-2)}
.nav-right a:hover{color:var(--ink)}
/* GitHub star pill (mirrors gofr.dev's main-app widget) */
.gh-pill{display:inline-flex;align-items:center;gap:7px;padding:5px 11px;border:1px solid var(--line-2);
  border-radius:999px;color:var(--ink-2);background:rgba(255,255,255,.02);transition:border-color .12s ease,color .12s ease}
.gh-pill:hover{border-color:var(--line-2);color:var(--ink);background:rgba(255,255,255,.04)}
.gh-mark{width:16px;height:16px;fill:currentColor;flex:0 0 auto}
.gh-count{font-family:var(--mono);font-size:.76rem;font-weight:600;color:var(--ink)}
.gh-star{width:14px;height:14px;fill:#FBBF24;flex:0 0 auto}
.ghpill{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line-2);border-radius:20px;
  padding:5px 12px;color:var(--ink-2);font-size:.82rem}
.soon{color:var(--ink-3);font-size:.8rem;border:1px solid var(--line);border-radius:20px;padding:3px 11px}

main{flex:1;width:100%}
.wrap{max-width:1340px;margin:0 auto;padding:clamp(22px,4vw,44px) clamp(16px,4vw,44px)}

/* ---------- buttons ---------- */
.btn{font-family:var(--sans);font-weight:600;font-size:.92rem;border:1px solid transparent;
  border-radius:999px;padding:11px 20px;cursor:pointer;display:inline-flex;align-items:center;gap:8px;
  transition:transform .12s ease, box-shadow .12s ease, background .12s ease}
.btn.grad{background:var(--cyan-2);color:#0f172a;box-shadow:none}
.btn.grad:hover{background:#bae6fd;color:#0f172a;transform:none;box-shadow:none}
.btn.outline{background:rgba(255,255,255,.02);border-color:var(--line-2);color:var(--ink)}
.btn.outline:hover{border-color:var(--cyan);color:var(--ink)}
.btn.sm{padding:8px 14px;font-size:.85rem}
.btn.danger{background:transparent;border-color:rgba(248,113,113,.5);color:var(--crit)}
.btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
button.icon{background:transparent;border:1px solid var(--line-2);color:var(--ink-2);border-radius:8px;
  padding:6px 12px;font:inherit;font-size:.85rem;cursor:pointer}
button.icon:hover{border-color:var(--cyan);color:var(--ink)}

input,select{font-family:var(--sans);font-size:.92rem;padding:10px 13px;border:1px solid var(--line-2);
  border-radius:var(--radius-sm);background:var(--surface-2);color:var(--ink);min-width:0}
input:focus,select:focus{outline:none;border-color:var(--cyan);box-shadow:0 0 0 3px rgba(56,189,248,.15)}
input::placeholder{color:var(--ink-3)}
label{font-size:.8rem;color:var(--ink-2);display:block;margin-bottom:6px;font-weight:500}

/* ---------- hero ---------- */
.hero{display:grid;grid-template-columns:1fr 1fr;gap:clamp(32px,5vw,64px);align-items:center;padding:clamp(36px,7vw,80px) 0 28px}
.hero-left{display:flex;gap:28px;align-items:center}
.hero-gopher{width:104px;height:auto;flex:0 0 auto;filter:drop-shadow(0 10px 34px rgba(56,189,248,.14))}
.hero-content{min-width:0}
.eyebrow{font-family:var(--mono);font-size:.74rem;letter-spacing:.16em;text-transform:uppercase;color:var(--cyan);font-weight:600}
/* matches gofr.dev: whole heading is an indigo-200 → sky-400 → indigo-200 gradient, tight */
.hero h1{font-size:clamp(2rem,5vw,3rem);line-height:1.12;font-weight:400;letter-spacing:-.025em;
  margin:.3em 0 .4em;text-wrap:balance;
  background:linear-gradient(to right,#C7D2FE,#38BDF8 52%,#C7D2FE);
  -webkit-background-clip:text;background-clip:text;color:transparent}
.hero h1 .accent{color:inherit}
.hero p.sub{color:var(--ink-2);font-size:clamp(1rem,2.2vw,1.15rem);max-width:46ch;margin:0 0 1.5em}
.cta-row{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
.lookup{margin-top:30px;padding-top:22px;border-top:1px solid var(--line)}
.lookup-label{display:block;font-size:.82rem;color:var(--ink-3);margin-bottom:10px}
.view-group{display:flex;gap:10px;max-width:420px}
.view-group input{flex:1;min-width:0}
.view-group .btn{white-space:nowrap;flex:0 0 auto}
.hero .fine{margin-top:14px;color:var(--ink-3);font-size:.85rem}

/* code-block hero card (mirrors gofr.dev) */
.code-card{background:linear-gradient(180deg,#0E1626,#0B1220);border:1px solid var(--line-2);
  border-radius:14px;box-shadow:0 30px 80px -40px rgba(0,0,0,.85), 0 0 60px -26px var(--glow), inset 0 1px 0 rgba(255,255,255,.03);overflow:hidden}
.code-head{display:flex;align-items:center;gap:8px;padding:11px 14px;border-bottom:1px solid var(--line);background:rgba(255,255,255,.015)}
.code-dot{width:12px;height:12px;border-radius:50%;background:transparent;border:1.5px solid #475569}
.code-tab{margin-left:6px;font-family:var(--mono);font-size:.78rem;color:var(--ink-2);cursor:pointer;
  background:transparent;border:1px solid transparent;border-radius:999px;padding:3px 13px;
  transition:color .12s ease,background .12s ease,border-color .12s ease}
.code-tab:hover{color:var(--ink)}
.code-tab.active{color:#eaf6ff;background:linear-gradient(to right,rgba(56,189,248,.28),rgba(56,189,248,.55));
  border-color:rgba(56,189,248,.4)}
.code-body{font-family:var(--mono);font-size:14px;line-height:24px;padding:18px 20px;overflow-x:auto;color:#cbd5e1}
.code-body>div{white-space:nowrap}
.code-body .ln{color:#3b4c66;user-select:none;display:inline-block;width:2.2em;text-align:right;margin-right:1.1em}
.tok-key{color:#f472b6} .tok-str{color:#7dd3fc} .tok-fn{color:#60a5fa} .tok-cm{color:#64748b} .tok-var{color:#e7edf5}

/* ---------- feature cards ---------- */
.section-title{text-align:center;margin:44px 0 8px}
.section-sub{text-align:center;color:var(--ink-3);margin:0 auto 26px;max-width:56ch}
.features{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:16px}
.card{background:transparent;border:1px solid var(--line);border-radius:var(--radius);padding:24px 26px;
  transition:border-color .15s ease}
.card:hover,.step:hover{border-color:var(--line-2)}
.feature .ic{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;margin-bottom:14px;
  background:rgba(56,189,248,.1);border:1px solid rgba(56,189,248,.25);color:var(--cyan);font-size:1.1rem}
.feature h3{font-size:1.06rem;font-weight:600;margin-bottom:.4em}
.feature p{color:var(--ink-2);margin:0;font-size:.92rem}
.feature .later{margin-top:10px;font-family:var(--mono);font-size:.72rem;color:var(--ink-3)}

.pill-note{display:inline-flex;gap:8px;align-items:center;background:var(--warn-bg);border:1px solid rgba(251,191,36,.35);
  color:#fcd34d;border-radius:10px;padding:10px 14px;font-size:.86rem}
.form-err{color:var(--crit);font-size:.84rem;margin:10px 0 0}

/* ---------- app shell (sidebar + content) ---------- */
.shell{display:grid;grid-template-columns:230px 1fr;gap:0;min-height:calc(100vh - 64px)}
.side{border-right:1px solid var(--line);padding:24px 18px;background:transparent;position:sticky;top:64px;align-self:start;height:calc(100vh - 64px)}
.side .svc{display:flex;align-items:center;gap:9px;font-family:var(--display);font-weight:700;font-size:1.05rem;margin-bottom:2px}
.side .meta{font-family:var(--mono);font-size:.72rem;color:var(--ink-3);margin-bottom:20px}
.side nav{display:flex;flex-direction:column;gap:2px}
.side nav a{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:8px;color:var(--ink-2);font-size:.9rem;font-weight:500}
.side nav a:hover{background:var(--surface-3);color:var(--ink)}
.side nav a .nic{width:17px;height:17px;flex:0 0 auto;opacity:.85}
.side nav a.active{background:rgba(56,189,248,.1);color:var(--cyan);box-shadow:inset 2px 0 0 var(--cyan)}
.side .back{margin-top:22px;font-size:.82rem;color:var(--ink-3)}
.content{padding:clamp(20px,3vw,32px);max-width:1000px}
.content h1{font-size:1.5rem;margin-bottom:4px}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex:0 0 auto}
.dot.on{background:var(--good);box-shadow:0 0 10px rgba(52,211,153,.7)}
.dot.off{background:var(--ink-3)}

/* ---------- stat tiles + sparkline (mqtt-dashboard style) ---------- */
.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin:20px 0}
.tile{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px}
.tile .k{font-family:var(--mono);font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3)}
.tile .v{font-family:var(--display);font-weight:700;font-size:2rem;letter-spacing:-.02em;line-height:1.1;margin:6px 0 2px;font-variant-numeric:tabular-nums}
.tile .sub{font-family:var(--mono);font-size:.72rem;color:var(--ink-3)}
.tile.accent .v{color:var(--cyan)}
.tile{display:flex;flex-direction:column}
.tile .sub{margin-bottom:0}
.tile-pill{align-self:flex-start;margin-top:auto;padding-top:14px}
.tile-pill{font-family:var(--mono);font-size:.68rem;letter-spacing:.04em;text-transform:uppercase}
.tile-pill.ok{color:var(--good)}
.tile-pill.warn{color:var(--warn)}
.spark{margin-top:10px;height:38px;width:100%;overflow:visible}
.spark path.line{fill:none;stroke:var(--cyan);stroke-width:1.75;stroke-linejoin:round;stroke-linecap:round;vector-effect:non-scaling-stroke}
.spark path.area{fill:url(#sparkgrad);opacity:.6}
.spark .spark-end{fill:var(--cyan);stroke:var(--bg);stroke-width:1}

/* ---------- log-level severity slider (drag or click a label to set) ---------- */
.level-ctl{max-width:560px;margin-top:2px}
/* whole track is tinted by severity (coloured by default); the brighter solid
   fill runs up to the thumb, so even at DEBUG (fill 0%) the track reads coloured */
.level-range{-webkit-appearance:none;appearance:none;width:100%;height:8px;border-radius:999px;outline:none;cursor:pointer;
  background:linear-gradient(to right, var(--cyan) 0, var(--cyan) var(--pct,0%), rgba(56,189,248,.22) var(--pct,0%), rgba(56,189,248,.22) 100%)}
.level-range[data-sev="mid"]{background:linear-gradient(to right, var(--warn) 0, var(--warn) var(--pct), rgba(251,191,36,.24) var(--pct), rgba(251,191,36,.24) 100%)}
.level-range[data-sev="high"]{background:linear-gradient(to right, var(--crit) 0, var(--crit) var(--pct), rgba(248,113,113,.24) var(--pct), rgba(248,113,113,.24) 100%)}
.level-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:22px;height:22px;border-radius:50%;
  background:var(--cyan-2);border:3px solid var(--bg);box-shadow:0 2px 10px rgba(0,0,0,.55);cursor:grab;margin-top:0}
.level-range[data-sev="mid"]::-webkit-slider-thumb{background:var(--warn)}
.level-range[data-sev="high"]::-webkit-slider-thumb{background:var(--crit)}
.level-range::-webkit-slider-thumb:active{cursor:grabbing}
.level-range::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:var(--cyan-2);border:3px solid var(--bg);cursor:grab}
.level-range[data-sev="mid"]::-moz-range-thumb{background:var(--warn)}
.level-range[data-sev="high"]::-moz-range-thumb{background:var(--crit)}
.level-range:focus-visible{box-shadow:0 0 0 4px rgba(56,189,248,.3)}
.level-labels{display:flex;justify-content:space-between;margin-top:11px}
.level-lab{background:none;border:none;font-family:var(--mono);font-size:.72rem;letter-spacing:.02em;color:var(--ink-3);
  cursor:pointer;padding:2px 0;transition:color .12s ease}
.level-lab:hover{color:var(--ink-2)}
.level-lab.on{color:var(--cyan);font-weight:600}
.level-lab.on[data-sev="mid"]{color:var(--warn)}
.level-lab.on[data-sev="high"]{color:var(--crit)}
.seelink{font-size:.85rem;color:var(--cyan);font-weight:500;white-space:nowrap}
.seelink:hover{color:var(--cyan-2)}

/* ---------- panels + tables ---------- */
.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;margin:16px 0}
.panel h2{font-size:1.05rem;margin-bottom:2px}
.panel .desc{color:var(--ink-3);font-size:.86rem;margin:0 0 14px}
.row{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end}
.wrap.narrow{max-width:760px}
.lead{color:var(--ink-2);font-size:1.05rem;line-height:1.55;margin:0 0 24px;max-width:56ch}
.fineprint{color:var(--ink-3);font-size:.82rem;line-height:1.55;margin:16px 2px 0;max-width:64ch}
.wrap.narrow .panel .row input{flex:1 1 240px;min-width:0}
.between{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}

table{width:100%;border-collapse:collapse;font-size:.88rem}
th{text-align:left;font-family:var(--mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.06em;
  color:var(--ink-3);font-weight:600;padding:9px 12px;border-bottom:1px solid var(--line)}
td{padding:11px 12px;border-bottom:1px solid var(--line);color:var(--ink-2);vertical-align:middle}
tbody tr{cursor:pointer;transition:background .1s}
tbody tr:hover td{background:var(--surface-3)}
tbody tr:last-child td{border-bottom:none}
td.mono,.num{font-family:var(--mono);font-variant-numeric:tabular-nums}
.num{text-align:right}
.op{color:var(--ink)}
.latbar{height:5px;border-radius:3px;background:var(--cyan);opacity:.75;display:inline-block;min-width:3px;vertical-align:middle}
.latbar.err{background:var(--crit);opacity:1}
.pill{display:inline-block;font-family:var(--mono);font-size:.68rem;text-transform:uppercase;letter-spacing:.04em;
  padding:2px 9px;border-radius:20px;border:1px solid var(--line-2);color:var(--ink-2)}
.pill.ok{color:var(--good);border-color:rgba(52,211,153,.4);background:var(--good-bg)}
.pill.err{color:var(--crit);border-color:rgba(248,113,113,.4);background:var(--crit-bg)}

/* waterfall */
/* ---------- trace timeline (Zipkin-style, mirrors gofr-dev/tracing-UI) ---------- */
.wf{--wfname:clamp(280px,36%,470px);--wfgap:14px;margin-top:2px}
.wf-legend{display:flex;gap:14px;flex-wrap:wrap;justify-content:flex-end}
.wf-leg{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:.74rem;color:var(--ink-2)}
.wf-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
/* mini-timeline overview: drag a window to zoom the main timeline */
.mini-head{display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-left:calc(var(--wfname) + var(--wfgap));margin-bottom:7px;min-height:28px}
.mini-hint{font-family:var(--mono);font-size:.7rem;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3)}
.mini-wrap{position:relative;margin-left:calc(var(--wfname) + var(--wfgap));margin-bottom:14px}
.mini{position:relative;height:42px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2);
  overflow:hidden;cursor:col-resize;user-select:none;transition:border-color .12s ease}
.mini:hover{border-color:var(--line-2)}
.mini-bar{position:absolute;height:3px;min-width:2px;border-radius:2px;opacity:.92;transform:translateY(-50%)}
.mini-tick{position:absolute;top:0;bottom:0;width:1px;background:var(--line)}
.mini-shade{position:absolute;top:0;bottom:0;background:rgba(6,10,20,.6);pointer-events:none}
.mini-window{position:absolute;top:0;bottom:0;border-left:2px solid var(--cyan);border-right:2px solid var(--cyan);
  background:rgba(56,189,248,.06);pointer-events:none;box-shadow:0 0 0 1px rgba(56,189,248,.15)}
/* tick-marker time axis, aligned over the timeline column */
.wf-axis{position:relative;height:18px;margin-left:calc(var(--wfname) + var(--wfgap));border-bottom:1px solid var(--line);margin-bottom:6px}
.wf-tick{position:absolute;bottom:3px;font-family:var(--mono);font-size:.68rem;color:var(--ink-3);white-space:nowrap}
.wf-scroll{overflow-x:auto}
.wf-row{display:grid;grid-template-columns:var(--wfname) 1fr;gap:var(--wfgap);align-items:center;padding:4px 0;border-radius:6px}
.wf-row.has-detail{cursor:pointer}
.wf-row.has-detail:hover,.wf-row.open{background:var(--surface-3)}
.wf-name{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:.8rem;white-space:nowrap;overflow:hidden;min-width:0}
.wf-svc{color:var(--ink-3);flex:0 1 auto;min-width:0;max-width:38%;overflow:hidden;text-overflow:ellipsis}
.wf-svc::after{content:":";color:var(--ink-3);margin:0 1px 0 1px}
.wf-op{color:var(--ink);flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
/* vertical gridlines at the tick positions (25/50/75%), continuous down the rows */
.wf-track{position:relative;height:22px;
  background:
    linear-gradient(var(--line),var(--line)) 25% 0/1px 100% no-repeat,
    linear-gradient(var(--line),var(--line)) 50% 0/1px 100% no-repeat,
    linear-gradient(var(--line),var(--line)) 75% 0/1px 100% no-repeat}
.wf-bar{position:absolute;top:50%;transform:translateY(-50%);height:9px;border-radius:3px;min-width:2px}
.wf-bar.err{box-shadow:0 0 0 1px rgba(248,113,113,.55),0 0 10px rgba(248,113,113,.30)}
.wf-err{color:var(--crit);font-size:.8rem;flex:0 0 auto;line-height:1}
.wf-dur{position:absolute;top:50%;transform:translateY(-50%);font-family:var(--mono);font-size:.71rem;color:var(--ink-2);white-space:nowrap;pointer-events:none}
.wf-detail{font-family:var(--mono);font-size:.76rem;color:var(--ink-3);display:grid;gap:2px;
  margin:2px 0 10px calc(var(--wfname) + var(--wfgap));padding-left:12px;border-left:2px solid var(--line-2)}
.wf-detail b{color:var(--ink-2);font-weight:500}
/* meta row: Duration · Services · Spans · Errors + legend */
.trace-meta{display:flex;align-items:center;gap:22px;flex-wrap:wrap;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--line)}
.tm-item{display:inline-flex;gap:7px;align-items:baseline;font-size:.82rem}
.tm-k{font-family:var(--mono);font-size:.68rem;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.tm-v{font-family:var(--display);font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.trace-meta .wf-legend{margin-left:auto}
/* two-pane: timeline + span-detail drawer */
.trace-panes{display:grid;grid-template-columns:1fr 340px;gap:16px;align-items:start}
.trace-drawer{position:sticky;top:80px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px 18px 20px}
.dw-head{display:flex;align-items:center;gap:8px;padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid var(--line)}
.dw-title{font-family:var(--mono);font-size:.86rem;color:var(--ink);word-break:break-word}
.dw-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 14px}
.dw-kv{min-width:0}
.dw-k{font-family:var(--mono);font-size:.66rem;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-3);margin-bottom:3px}
.dw-v{font-size:.8rem;color:var(--ink);word-break:break-word}
.dw-tags{margin-top:16px}
.dw-sec{font-family:var(--display);font-weight:600;font-size:.9rem;margin-bottom:8px;color:var(--ink)}
.dw-tag{display:flex;justify-content:space-between;gap:12px;padding:6px 0;border-bottom:1px solid var(--line);font-size:.76rem}
.dw-tag-k{color:var(--ink-2);flex:0 0 auto}
.dw-tag-v{color:var(--ink);text-align:right;word-break:break-all}
/* collapse/expand child-count badge (sky, like tracing-UI) */
.tl-collapse{flex:0 0 auto;min-width:18px;height:18px;padding:0 5px;border:none;border-radius:5px;
  background:var(--cyan);color:#08121f;font-family:var(--mono);font-size:.68rem;font-weight:700;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;line-height:1}
.tl-collapse:hover{background:var(--cyan-2)}
.tl-collapse::after{content:"–";margin-left:3px;font-weight:700}
.tl-collapse.col::after{content:"+"}
/* row selection */
.wf-row.sel-able{cursor:pointer;padding-left:4px;margin-left:-4px}
.wf-row.sel{background:rgba(56,189,248,.09);box-shadow:inset 2px 0 0 var(--cyan)}
@media(max-width:860px){.trace-panes{grid-template-columns:1fr}.trace-drawer{position:static}}

.codeblock{display:block;background:var(--surface-2);border:1px solid var(--line-2);border-radius:var(--radius-sm);
  padding:12px 14px;white-space:pre-wrap;overflow-wrap:anywhere;font-family:var(--mono);font-size:.82rem;line-height:1.7;color:var(--cyan-2)}

.empty{text-align:center;color:var(--ink-2);padding:40px 20px}
.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%) translateY(70px);
  background:var(--surface-3);border:1px solid var(--line-2);color:var(--ink);padding:11px 18px;border-radius:10px;
  font-size:.9rem;opacity:0;transition:.25s;pointer-events:none;max-width:90vw;box-shadow:0 20px 50px -20px #000}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:4px}
.btn:focus-visible,button.icon:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(56,189,248,.45)}
@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto}}
@media (max-width:820px){
  .hero{grid-template-columns:1fr;gap:24px}
  .hero-left{flex-direction:column;align-items:flex-start;gap:16px}
  .hero-gopher{width:76px}
  .shell{grid-template-columns:1fr}
  .side{position:static;height:auto;border-right:none;border-bottom:1px solid var(--line)}
  .side nav{flex-direction:row;flex-wrap:wrap}
}

/* ---------- QA: overflow + mobile hardening ---------- */
/* grid/flex children default to min-width:auto, which lets wide content (code
   card, traces table) push the page wider than the viewport. Allow them to
   shrink so their own overflow-x:auto containers scroll instead. */
.hero>*, .shell>*, .content, .content>*, .tiles>*{min-width:0}
.content table{width:100%}
img,svg,pre,code{max-width:100%}

@media (max-width:600px){
  .topbar{gap:10px;padding:12px 16px}
  .topbar nav{gap:13px;font-size:.8rem}
  .topbar .ghpill{display:none}
  .topbar .soon{padding:3px 9px}
  .hero{padding-top:20px}
  .view-group{max-width:none}
  .content{padding:18px 14px}
  .tiles{grid-template-columns:1fr 1fr;gap:10px}
  .tile .v{font-size:1.6rem}
  .between{align-items:flex-start}
}
@media (max-width:400px){
  .tiles{grid-template-columns:1fr}
}
/* traces table scrolls inside its own box, never widening the page */
.tscroll{width:100%;max-width:100%;overflow-x:auto;margin-top:10px}
.tscroll table{min-width:520px}

/* live platform stats strip on the landing */
.stats-strip{display:flex;flex-direction:column;align-items:center;gap:20px;margin:64px 0 8px;
  padding-top:38px;border-top:1px solid var(--line)}
.stats-live{display:inline-flex;align-items:center;gap:9px;font-family:var(--mono);font-size:.74rem;
  letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.live-dot{width:7px;height:7px;border-radius:50%;background:var(--good);
  animation:livepulse 2s ease-out infinite}
@keyframes livepulse{0%{box-shadow:0 0 0 0 rgba(52,211,153,.45)}70%{box-shadow:0 0 0 7px rgba(52,211,153,0)}100%{box-shadow:0 0 0 0 rgba(52,211,153,0)}}
.stats-row{display:flex;gap:0;justify-content:center;align-items:stretch;flex-wrap:wrap}
.stat-item{text-align:center;padding:0 clamp(22px,5vw,52px);position:relative}
.stat-item + .stat-item::before{content:"";position:absolute;left:0;top:6%;height:88%;width:1px;background:var(--line)}
.stat-n{font-family:var(--display);font-weight:600;font-size:clamp(1.7rem,4vw,2.2rem);color:var(--cyan);
  font-variant-numeric:tabular-nums;line-height:1}
.stat-l{font-family:var(--mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.09em;color:var(--ink-3);margin-top:7px}
.feature .ic svg{display:block}

/* how it works — developer onboarding steps */
.how{margin:64px 0 10px}
.how-title{font-family:var(--display);font-weight:500;font-size:1.5rem;text-align:center;margin-bottom:6px;letter-spacing:-.02em}
.how-sub{text-align:center;color:var(--ink-3);font-size:.92rem;margin-bottom:30px}
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.step{display:flex;flex-direction:column;gap:14px;align-items:flex-start;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--radius);padding:24px 26px;
  transition:border-color .15s ease,transform .15s ease}
.step:hover{border-color:var(--line-2);transform:translateY(-2px)}
.step-n{flex:0 0 auto;width:30px;height:30px;border-radius:9px;display:grid;place-items:center;font-size:.85rem;
  font-family:var(--mono);font-weight:600;color:var(--cyan);background:rgba(56,189,248,.1);border:1px solid rgba(56,189,248,.25)}
.step-t{font-weight:600;color:var(--ink);margin-bottom:5px;font-size:1.02rem}
.step-d{color:var(--ink-2);font-size:.9rem;line-height:1.55}
@media(max-width:700px){.steps{grid-template-columns:1fr}}

/* multi-column footer (gofr-style, honest links) */
.footer{display:block;border-top:1px solid var(--line);padding:0;margin-top:48px;color:var(--ink-3)}
.foot-top{max-width:1340px;margin:0 auto;padding:40px clamp(16px,4vw,44px) 30px;display:flex;justify-content:space-between;gap:44px;flex-wrap:wrap}
.foot-brand{max-width:340px}
.foot-brand .brand{margin-bottom:12px}
.foot-brand p{color:var(--ink-3);font-size:.86rem;line-height:1.6;margin:0 0 16px}
.foot-star{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;border:1px solid var(--line-2);
  border-radius:999px;color:var(--ink-2);font-size:.82rem;font-weight:500;transition:border-color .12s ease,color .12s ease}
.foot-star:hover{border-color:var(--cyan);color:var(--ink)}
.foot-star .gh-mark{width:15px;height:15px;fill:currentColor}
.foot-cols{display:flex;gap:clamp(44px,8vw,96px)}
.foot-col{display:flex;flex-direction:column;gap:10px}
.foot-col h4{font-family:var(--mono);font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-3);font-weight:600;margin:0 0 3px}
.foot-col a{color:var(--ink-2);font-size:.88rem}
.foot-col a:hover{color:var(--cyan)}
.foot-bottom{border-top:1px solid var(--line);max-width:1340px;margin:0 auto;padding:16px clamp(16px,4vw,44px);display:flex;justify-content:space-between;font-size:.8rem}
@media(max-width:640px){.foot-top{flex-direction:column;gap:26px}}

/* --- trace view: readability + honest colour --- */
.trace-title{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.trace-title h1{overflow-wrap:anywhere}
.btn.sm{font-size:.78rem;padding:5px 11px}
.copy-id{flex:0 0 auto}
/* depth guide: a hairline per nesting level, so hierarchy is visible at a glance */
.wf-guide{position:absolute;left:0;top:0;bottom:0;width:1px;background:var(--line-2);opacity:.7}
.wf-name{position:relative}
/* an errored row is tinted and striped: colour is not the only signal */
.wf-row.row-err{background:rgba(248,113,113,.055)}
.wf-row.row-err .wf-op{color:#FCA5A5}
/* duration label sitting inside a late-finishing bar */
.wf-dur.inside{color:#0B1220;font-weight:600;text-shadow:0 0 3px rgba(255,255,255,.35)}
.dw-err{display:flex;align-items:center;gap:8px;margin:10px 0 2px;padding:8px 11px;border-radius:8px;
  background:var(--crit-bg);border:1px solid rgba(248,113,113,.35);color:#FCA5A5;font-size:.83rem}

/* Narrow screens: the label column must yield, and the waterfall scrolls inside
   its own container — the page body must never scroll sideways. */
@media(max-width:720px){
  .wf{--wfname:clamp(140px,44vw,220px);--wfgap:10px}
  .wf-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
  .trace-title h1{font-size:.85rem!important}
}

/* --- private app shell: sidebar + main, mirrors the public service view --- */
.app-shell{display:grid;grid-template-columns:212px 1fr;gap:26px;max-width:1180px;margin:0 auto;padding:26px 24px 64px}
.app-main{min-width:0}
.side{display:flex;flex-direction:column;gap:2px;padding-top:6px}
.side-org{padding:0 12px 14px;border-bottom:1px solid var(--line);margin-bottom:10px}
.side-org-name{font-weight:600;font-size:.94rem}
.side-org-sub{color:var(--ink-3);font-size:.76rem;margin-top:3px;overflow-wrap:anywhere}
.side-link{display:flex;align-items:center;gap:9px;padding:9px 12px;border-radius:8px;color:var(--ink-2);
  font-size:.9rem;text-decoration:none;border:1px solid transparent;background:none;cursor:pointer;
  font-family:var(--sans);text-align:left;width:100%}
.side-link:hover{background:var(--surface-3);color:var(--ink)}
.side-link.active{background:rgba(56,189,248,.10);border-color:rgba(56,189,248,.28);color:var(--cyan)}
.side-signout{margin-top:auto;color:var(--ink-3)}

/* --- auth screens ---
   A sign-in form is a single column of equal-width controls. The card is sized
   to the form (not the page), so the eye travels straight down one edge instead
   of hopping between a full-width button and a half-width input. */
.auth-wrap{max-width:412px;margin:0 auto;padding:clamp(40px,7vh,84px) 20px 88px}
.auth-h1{font-size:1.75rem;margin:0 0 8px;letter-spacing:-.022em}
.auth-wrap .lead{font-size:.94rem;line-height:1.55;color:var(--ink-2);margin:0}
.auth-panel{margin-top:24px;padding:24px;display:flex;flex-direction:column;gap:0}

/* every control shares one width and one rhythm */
.auth-panel input{width:100%;padding:11px 13px}
.auth-panel label{margin-bottom:7px}
.auth-panel .field + .field{margin-top:16px}
.auth-panel .btn{width:100%;justify-content:center;padding:11px 18px}
.auth-submit{margin-top:20px}

/* label row carries the inline "forgot?" link, so it sits with the field it
   belongs to rather than floating at the far edge of the card */
.lbl-row{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
.lbl-row label{margin-bottom:7px}
.tiny-link{font-size:.79rem;color:var(--ink-3);text-decoration:none;white-space:nowrap}
.tiny-link:hover{color:var(--cyan)}

.auth-alt{margin-top:20px;color:var(--ink-2);font-size:.88rem;text-align:center;line-height:1.6}
.auth-alt a{color:var(--cyan);text-decoration:none}
.auth-alt a:hover{text-decoration:underline}
.auth-foot{margin-top:10px;text-align:center;font-size:.82rem;color:var(--ink-3)}
.auth-foot a{color:var(--cyan-2);text-decoration:none}
.auth-foot a:hover{color:var(--cyan)}

.form-ok{color:var(--good);font-size:.86rem;margin:14px 0 0;line-height:1.5}
.auth-msg{margin:16px 0 0;font-size:.86rem;line-height:1.5}

/* Tile text must wrap wherever it has to. Org ids are opaque 36-char strings
   with no break opportunity, and they live in .sub — a rule that covered only
   .v let one push the whole page sideways on a phone. */
.tile .v,.tile .k{overflow-wrap:anywhere;min-width:0}
/* An org id has no break opportunity, so anywhere-wrapping split it mid-token
   across two lines — unreadable for a value people copy. Shrink to fit and keep
   it on one line instead. */
.tile .sub{min-width:0;overflow-wrap:anywhere}
.tile .sub.mono-id{overflow-wrap:normal;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;font-size:.72rem}
.tile-mono .v,#tile-token .v{font-family:var(--mono);font-size:1.15rem;letter-spacing:-.01em}

/* --- provider sign-in --- */
.oauth-row{display:grid;gap:9px}
.oauth-btn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;
  text-decoration:none;font-size:.9rem;padding:11px 16px}
.oauth-mark{width:17px;height:17px;border-radius:3px;flex:0 0 auto;background-size:contain;background-repeat:no-repeat}
.oauth-google{background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'><path fill='%23FFC107' d='M43.6 20.1H42V20H24v8h11.3C33.7 32.7 29.3 36 24 36c-6.6 0-12-5.4-12-12s5.4-12 12-12c3.1 0 5.8 1.2 7.9 3.1l5.7-5.7C34.1 6.1 29.3 4 24 4 12.9 4 4 12.9 4 24s8.9 20 20 20 20-8.9 20-20c0-1.3-.1-2.6-.4-3.9z'/><path fill='%23FF3D00' d='M6.3 14.7l6.6 4.8C14.7 15.1 19 12 24 12c3.1 0 5.8 1.2 7.9 3.1l5.7-5.7C34.1 6.1 29.3 4 24 4 16.3 4 9.7 8.3 6.3 14.7z'/><path fill='%234CAF50' d='M24 44c5.2 0 9.9-2 13.4-5.2l-6.2-5.2C29.2 35.1 26.7 36 24 36c-5.3 0-9.7-3.3-11.3-8l-6.5 5C9.6 39.6 16.2 44 24 44z'/><path fill='%231976D2' d='M43.6 20.1H42V20H24v8h11.3c-.8 2.2-2.2 4.1-4.1 5.6l6.2 5.2C39.8 36.4 44 31 44 24c0-1.3-.1-2.6-.4-3.9z'/></svg>")}
.oauth-github{background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23E7EDF5'><path d='M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z'/></svg>")}
.oauth-sep{display:flex;align-items:center;gap:12px;margin:20px 0 18px;color:var(--ink-3);font-size:.78rem}
.oauth-sep::before,.oauth-sep::after{content:"";flex:1;height:1px;background:var(--line)}

/* On a phone the app-shell collapses: the 212px sidebar becomes a horizontal
   row above the content, otherwise the fixed column forces the page sideways. */
@media(max-width:760px){
  .app-shell{grid-template-columns:1fr;gap:18px;padding:20px 16px 56px}
  .side{flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px;
    padding-bottom:14px;border-bottom:1px solid var(--line)}
  .side-org{width:100%;padding:0 0 10px;border:0;margin:0}
  .side-link{width:auto;padding:7px 12px;font-size:.86rem}
  .side-signout{margin-top:0;margin-left:auto}
  .tiles{grid-template-columns:repeat(2,minmax(0,1fr))}
  .tile .v{font-size:1.4rem}
}

.panel-sec + .panel-sec{border-top:1px solid var(--line);padding-top:24px}
.panel-sec h2{font-size:1.02rem}

/* Signed-in header actions. Sign out is a button so it can clear state, but it
   must read as the quiet link it sits beside. */
.nav-signout{background:none;border:0;padding:0;cursor:pointer;font-family:var(--sans);
  font-size:inherit;color:var(--ink-3)}
.nav-signout:hover{color:var(--cyan)}
.nav-right{display:flex;align-items:center;gap:14px;min-width:0}

/* A grid item defaults to min-width:auto, so a wide table pushes the whole
   column — and the page — sideways instead of scrolling inside .tscroll. */
.app-shell .app-main{min-width:0}
.app-shell .tscroll{overflow-x:auto}

@media(max-width:760px){
  /* the header must yield before the page does */
  .nav-right{gap:10px;font-size:.88rem}
  .nav-right .gh-pill{padding:4px 8px}
  .nav-right .gh-count{font-size:.72rem}
}
@media(max-width:430px){
  /* below this the GitHub star count is the least useful thing on screen */
  .nav-right .gh-pill{display:none!important}
}

/* The signed-in actions live in one span, so the nav's gap does not fall
   between them — they need their own. */
#nav-auth{display:inline-flex;align-items:center;gap:14px}

/* One row per service credential. */
.tok-list{display:flex;flex-direction:column;gap:2px}
.tok-row{padding:14px 0;border-top:1px solid var(--line)}
.tok-row:first-child{border-top:0}
.tok-head{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap}
.tok-name{font-weight:600;font-size:.95rem}
.tok-sub{color:var(--ink-3);font-size:.78rem;margin-top:3px}
.btn.sm{font-size:.78rem;padding:6px 13px}

/* --- people --- */
.role-pill{display:inline-block;padding:2px 9px;border-radius:20px;font-size:.76rem;
  border:1px solid var(--line-2);color:var(--ink-2);background:rgba(255,255,255,.02)}
.tag-you{margin-left:8px;padding:1px 7px;border-radius:20px;font-size:.7rem;
  background:rgba(56,189,248,.14);color:var(--cyan);border:1px solid rgba(56,189,248,.3)}
.invite-box{margin-top:18px;padding:16px;border:1px solid var(--line-2);border-radius:var(--radius);
  background:var(--surface-2)}
.invite-box h3{margin:0;font-size:1rem}
select{font-family:var(--sans);font-size:.9rem;padding:9px 11px;border:1px solid var(--line-2);
  border-radius:var(--radius-sm);background:var(--surface-2);color:var(--ink)}


/* An operation name can be a full URL. Letting it size the column pushed
   DURATION and SPANS off the right edge — the two columns triage actually uses.
   Truncate here; the full value is on the cell's title. */
td.op{max-width:38ch;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media (max-width: 900px){ td.op{max-width:20ch} }

/* Pager under the traces table. Quiet by design: it is navigation, not content. */
.pager{display:flex;align-items:center;justify-content:center;gap:16px;
  margin-top:14px;font-size:.85rem}
.pager .btn[disabled]{opacity:.35;cursor:default}
