@import "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=IBM+Plex+Sans:wght@400;500;600;700&family=Syne:wght@500;700;800&display=swap";:root{--bg:#f6f0e6;--surface:rgba(255,252,247,.94);--surface-strong:rgba(255,255,255,.98);--line:rgba(20,34,41,.1);--line-strong:rgba(20,34,41,.17);--text:#15232b;--muted:#627077;--blue:#205e8c;--rust:#dea584;--green:#38755a;--red:#9d4133;--shadow:0 18px 48px rgba(27,44,54,.08)}*{box-sizing:border-box}body{min-height:100vh;color:var(--text);background:#fbf8f2;margin:0;font-family:IBM Plex Sans,Avenir Next,sans-serif}.page{width:min(1180px,100vw - 2rem);margin:0 auto;padding:1.5rem 0 3rem}.page.landing{flex-direction:column;justify-content:center;min-height:100vh;display:flex}.hero{margin-bottom:1.25rem}.eyebrow{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;margin:0;font-family:IBM Plex Mono,monospace;font-size:.75rem}.hero h1{margin:.35rem 0 0;font-family:Syne,IBM Plex Sans,sans-serif;font-size:clamp(2.4rem,6vw,4rem);line-height:.96}.hero-rust-suffix{color:var(--rust)}.hero-copy{color:var(--muted);text-align:justify;text-justify:inter-word;overflow-wrap:break-word;hyphens:auto;margin:.7rem 0 0;line-height:1.7}.hero-copy a{color:var(--blue);text-underline-offset:2px;text-decoration:underline;text-decoration-thickness:1px}.hero-copy a:hover{color:#184f78}.hero-title-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.6rem 1rem;display:flex}.github-badge{border:1px solid var(--line-strong);background:var(--surface);color:var(--text);border-radius:999px;flex-shrink:0;align-items:center;gap:.45rem;padding:.4rem .85rem;font-size:.85rem;font-weight:600;text-decoration:none;transition:border-color .14s,color .14s;display:inline-flex}.github-badge:hover{border-color:var(--blue);color:var(--blue)}.panel{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);border-radius:1.2rem;margin-bottom:1.25rem;padding:1.25rem}.loader-wrap{justify-content:center;margin-top:.5rem;display:flex}.drop-panel{width:min(34rem,100%);margin-bottom:0}.drop-zone{text-align:center;border:2px dashed var(--line-strong);background:var(--surface-strong);border-radius:1rem;padding:2rem;transition:border-color .15s,background .15s}.drop-zone.hovering{border-color:var(--blue);background:rgba(32,94,140,.06)}.drop-zone p{color:var(--muted);margin:0 0 .85rem}.file-button{color:#fff;background:var(--blue);cursor:pointer;border:1px solid rgba(32,94,140,.24);border-radius:999px;justify-content:center;align-items:center;gap:.5rem;min-height:2.35rem;padding:.45rem 1rem;transition:background .14s,transform .14s;display:inline-flex;position:relative;overflow:hidden}.file-button:hover{background:#184f78;transform:translateY(-1px)}.file-input{opacity:0;cursor:pointer;position:absolute;inset:0}.drop-actions{flex-wrap:wrap;justify-content:center;gap:.75rem;display:flex}.button-green{color:#fff;background:var(--green);min-height:2.35rem;font:inherit;cursor:pointer;border:1px solid rgba(56,117,90,.3);border-radius:999px;justify-content:center;align-items:center;gap:.5rem;padding:.45rem 1rem;transition:background .14s,transform .14s;display:inline-flex}.button-green:hover{background:#2b6048;transform:translateY(-1px)}.reset-button{width:1.9rem;height:1.9rem;color:var(--muted);background:var(--surface-strong);border:1px solid var(--line-strong);cursor:pointer;border-radius:999px;justify-content:center;align-items:center;transition:color .14s,border-color .14s;display:inline-flex}.reset-button:hover{color:var(--red);border-color:var(--red)}.dataset-bar{flex-wrap:wrap;align-items:center;gap:.6rem;margin-bottom:1rem;display:flex}.dataset-name{align-items:center;gap:.5rem;font-size:1.1rem;font-weight:700;display:inline-flex}.dataset-bar .reset-button{margin-left:auto}.meta-pill{border:1px solid var(--line-strong);background:var(--surface);color:var(--muted);border-radius:999px;align-items:baseline;gap:.3rem;padding:.35rem .7rem;font-family:IBM Plex Mono,monospace;font-size:.8rem;display:inline-flex}.meta-pill strong{color:var(--text);font-weight:700}.meta-pill.warn{color:#6b4a00;background:rgba(214,143,0,.12);border-color:rgba(214,143,0,.28)}.meta-pill.warn strong{color:#6b4a00}.controls-title{align-items:center;gap:.5rem;margin:0 0 1rem;font-size:1.25rem;font-weight:700;display:flex}.view-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.6rem;margin-bottom:1rem;display:flex}.view-head .controls-title{margin:0}.graph-stats-inline{flex-wrap:wrap;gap:.5rem;display:flex}.controls{grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));align-items:end;gap:1rem;display:grid}.field{gap:.35rem;display:grid}.field label{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;font-family:IBM Plex Mono,monospace;font-size:.72rem}.field select,.field input{width:100%;color:var(--text);background:var(--surface-strong);border:1px solid var(--line-strong);font:inherit;border-radius:.7rem;outline:none;padding:.5rem .65rem}.field select:focus,.field input:focus{border-color:rgba(23,112,168,.4);box-shadow:0 0 0 4px rgba(23,112,168,.08)}.field-wide{grid-column:1/-1}.segmented{flex-wrap:wrap;gap:.4rem;display:flex}.segment{color:var(--text);background:var(--surface-strong);border:1px solid var(--line-strong);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:.4rem;padding:.4rem .85rem;transition:background .14s,color .14s,border-color .14s;display:inline-flex}.segment:hover{color:var(--accent,var(--blue));border-color:var(--accent,var(--blue))}.segment.active{color:#fff;background:var(--accent,var(--blue));border-color:var(--accent,var(--blue))}.segment.active:hover{color:#fff}.view-hint{color:var(--muted);margin:0 0 .75rem;font-size:.9rem}.legend{flex-wrap:wrap;gap:.5rem .9rem;margin-top:.85rem;display:flex}.legend-item{color:var(--muted);align-items:center;gap:.4rem;font-size:.82rem;display:inline-flex}.legend-marker{flex-shrink:0;display:block}.legend-label{font-family:IBM Plex Mono,monospace}.legend-continuous{align-items:center;gap:.6rem}.legend-bar{border:1px solid rgba(20,34,41,.2);border-radius:999px;width:12rem;max-width:50vw;height:.7rem;display:inline-block}.node-panel{background:var(--surface-strong);border-left:1px solid var(--line);z-index:60;width:360px;max-width:92vw;height:100vh;padding:1.25rem;position:fixed;top:0;right:0;overflow-y:auto;box-shadow:-16px 0 48px rgba(27,44,54,.14)}.edge-panel{width:420px}.mirror-legend{flex-wrap:wrap;gap:.4rem .9rem;margin-top:.6rem;display:flex}.mirror-legend-item{color:var(--muted);align-items:center;gap:.4rem;font-size:.82rem;display:inline-flex}.mirror-swatch{border-radius:2px;flex-shrink:0;width:.7rem;height:.7rem;display:inline-block}.edge-similarities{margin:1rem 0 .25rem}.edge-sim-title{margin:0 0 .4rem;font-size:.9rem;font-weight:700}.edge-sim-row{border-radius:.55rem;justify-content:space-between;align-items:center;gap:.6rem;padding:.32rem .55rem;font-size:.88rem;display:flex}.edge-sim-row.active{background:rgba(32,94,140,.09)}.edge-sim-name{color:var(--muted);align-items:center;gap:.45rem;display:inline-flex}.edge-sim-row.active .edge-sim-name{color:var(--text);font-weight:600}.edge-sim-value{color:var(--text);font-family:IBM Plex Mono,monospace}.export-grid{flex-wrap:wrap;gap:.4rem .9rem;display:flex}.export-check{color:var(--text);cursor:pointer;align-items:center;gap:.4rem;font-size:.85rem;display:inline-flex}.export-check input{width:1rem;height:1rem;accent-color:var(--blue);cursor:pointer}.export-check input:disabled{cursor:default}.export-actions{flex-wrap:wrap;gap:.75rem;margin-top:1.25rem;display:flex}.button-green:disabled{opacity:.5;cursor:not-allowed;transform:none}.view-head-right{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:.5rem .75rem;display:flex}.export-open{color:#fff;background:var(--blue);min-height:2.1rem;font:inherit;cursor:pointer;border:1px solid rgba(32,94,140,.24);border-radius:999px;align-items:center;gap:.45rem;padding:.4rem .9rem;font-weight:600;transition:background .14s,transform .14s;display:inline-flex}.export-open:hover{background:#184f78;transform:translateY(-1px)}.modal-overlay{z-index:100;backdrop-filter:blur(2px);background:rgba(20,34,41,.45);justify-content:center;align-items:center;padding:1.25rem;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--line);background:var(--surface-strong);border-radius:1.1rem;width:min(40rem,100%);max-height:88vh;padding:1.25rem 1.4rem 1.4rem;overflow-y:auto;box-shadow:0 24px 64px rgba(20,34,41,.3)}.modal-head{justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.25rem;display:flex}.modal-head h3{margin:0;font-size:1.2rem}.export-note{color:var(--muted);margin:0 0 1rem;font-size:.82rem}.export-tabs{border-bottom:1px solid var(--line);gap:.25rem;margin-bottom:1rem;display:flex}.export-tab{color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;padding:.5rem .9rem;font-weight:600}.export-tab:hover{color:var(--text)}.export-tab.active{color:var(--blue);border-bottom-color:var(--blue)}.export-tab-body{min-height:9rem}.node-panel-head{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.node-panel-head h3{overflow-wrap:anywhere;margin:0;font-size:1.05rem}.node-panel-close{border:1px solid var(--line-strong);background:var(--surface);width:1.9rem;height:1.9rem;color:var(--text);font:inherit;cursor:pointer;border-radius:999px;justify-content:center;align-items:center;display:inline-flex}.node-panel-close:hover{color:var(--red);border-color:var(--red)}.node-panel-hint{color:var(--muted);margin:.35rem 0 0;font-size:.82rem}.spectrum-wrap{border:1px solid var(--line);background:#fbf8f2;border-radius:.75rem;margin:.9rem 0;padding:.4rem}.spectrum{width:100%;height:auto;display:block}.spectrum-readout{min-height:1.1rem;margin-top:.4rem;font-family:IBM Plex Mono,monospace;font-size:.8rem}.spectrum-value{color:var(--text)}.kv{grid-template-columns:auto 1fr;gap:.3rem .8rem;margin:0;font-size:.88rem;display:grid}.kv dt{color:var(--muted);font-family:IBM Plex Mono,monospace}.kv dd{overflow-wrap:anywhere;margin:0}.graph-canvas-wrap{position:relative}.edge-tooltip{background:var(--text);color:#fff;white-space:nowrap;pointer-events:none;z-index:5;border-radius:.4rem;padding:.2rem .5rem;font-family:IBM Plex Mono,monospace;font-size:.72rem;position:absolute;transform:translate(-50%,-150%)}.graph-canvas{border:1px solid var(--line);cursor:grab;touch-action:none;background:#fbf8f2;border-radius:1rem;width:100%;height:540px;display:block}.graph-canvas:active{cursor:grabbing}.error{color:var(--red)}