:root{--bg:#f6f7f9;--panel:#fff;--text:#1b1f27;--muted:#5d6675;--border:#d9dde5;--accent:#2f5bea;--on-accent:#fff;--accent-soft:#dfe7fc;--c1:#1f7a4d;--c2:#c25e00;--c3:#5b3fd1;--bad:#c62828;--good:#1f7a4d;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#11141a;--panel:#1a1f29;--text:#e6e9ef;--muted:#9aa4b5;--border:#2d3442;--accent:#7c9cff;--on-accent:#11141a;--accent-soft:#26304f;--c1:#4fd18b;--c2:#ffa94d;--c3:#a995ff;--bad:#ff6b6b;--good:#4fd18b}}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);margin:0;font:14px/1.45 system-ui,-apple-system,Segoe UI,sans-serif}h1{margin:0;font-size:18px}h2{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:0 0 8px;font-size:13px}button,select,input{font:inherit;color:inherit}button{background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:6px 10px}button:hover:not(:disabled){border-color:var(--accent)}button.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent);font-weight:600}button:disabled{opacity:.5;cursor:default}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}select,input[type=number],input[type=search]{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:5px 8px}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.muted{color:var(--muted);margin:6px 0 0;font-size:12px}.app{max-width:1500px;margin:0 auto;padding:12px 16px 24px}.top{flex-wrap:wrap;align-items:center;gap:12px 20px;margin-bottom:12px;display:flex}.top-actions{align-items:center;gap:12px;margin-left:auto;display:flex}.scenario-bar{flex-wrap:wrap;flex:420px;align-items:center;gap:6px 14px;display:flex}.scenario-bar .desc{color:var(--muted);flex:260px;margin:0}.embed-title{margin:0 0 8px;font-weight:600}.inline{align-items:center;gap:6px;display:inline-flex}.check{align-items:center;gap:6px;display:flex}.tabs{gap:4px;margin-bottom:10px;display:none;overflow-x:auto}.tabs button[aria-selected=true]{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.grid{grid-template:"controls run inspect""controls charts log""controls. ."1fr/280px minmax(0,1fr) 360px;align-items:start;gap:12px;display:grid}.area-run{grid-area:run}.area-controls{grid-area:controls}.area-charts{grid-area:charts}.area-inspect{grid-area:inspect}.area-log{grid-area:log}.panel{background:var(--panel);border:1px solid var(--border);border-radius:10px;min-width:0;padding:12px}.transport{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px;display:flex}.transport input[type=number]{width:90px}.progress{border:1px solid var(--border);border-radius:6px;flex:180px;min-width:160px;height:26px;position:relative;overflow:hidden}.progress>div{background:var(--accent-soft);position:absolute;inset:0 auto 0 0}.progress>span{padding:3px 8px;font-size:12px;display:block;position:relative}.topology>svg{width:100%;height:auto;display:block}.node rect{fill:var(--bg);stroke:var(--border);stroke-width:1.5px}.node.outage rect{stroke:var(--bad);stroke-dasharray:5 3}.node text{fill:var(--text);font-size:14px;font-weight:600}.node text.sub{fill:var(--muted);font-size:11px;font-weight:400}.node rect.meter-bg{fill:var(--border);stroke:none}.node rect.meter{fill:var(--c1);stroke:none}.wire{stroke:var(--border);stroke-width:2px;stroke-dasharray:4 4}.dot-hit{fill:var(--c1)}.dot-miss{fill:var(--c2)}.dot-error{fill:var(--bad)}.dot-write{fill:var(--c3)}.key{color:var(--muted);gap:14px;margin:4px 0 0;padding:0;font-size:12px;list-style:none;display:flex}.key svg{vertical-align:middle}[data-reduce-motion=true] .dot{opacity:0;animation:none}@media (prefers-reduced-motion:reduce){.dot{opacity:0;animation:none}}.stats{grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:8px;margin:10px 0 0;display:grid}.stats div{border:1px solid var(--border);border-radius:8px;padding:6px 8px}.stats dt{color:var(--muted);font-size:11px}.stats dd{font-variant-numeric:tabular-nums;margin:0;font-size:18px;font-weight:600}.challenge{border:1px dashed var(--border);border-radius:8px;margin-top:10px;padding:10px}.challenge p{margin:0 0 6px}.status.pass{color:var(--good);font-weight:600}.status.fail{color:var(--bad)}.hint{color:var(--muted)}.controls fieldset{border:1px solid var(--border);border-radius:8px;margin:0 0 10px;padding:8px 10px 10px}.controls legend{padding:0 4px;font-weight:600}.field{margin-bottom:8px;display:block}.field>span{color:var(--muted);justify-content:space-between;font-size:12px;display:flex}.field input[type=range],.field select{width:100%}.btn-row{flex-wrap:wrap;gap:6px;display:flex}.charts{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:10px;display:grid}.chart{margin:0}.chart figcaption{flex-wrap:wrap;justify-content:space-between;gap:4px;font-size:12px;display:flex}.legend{color:var(--muted);gap:10px;display:inline-flex}.legend-item svg{vertical-align:middle;margin-right:3px}.chart svg{width:100%;height:auto;display:block}.chart .grid{stroke:var(--border);stroke-width:1px}.chart .tick{fill:var(--muted);font-size:9px}.scroll{max-height:300px;overflow:auto}.inspector table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:12px}.inspector th,.inspector td{text-align:left;border-bottom:1px solid var(--border);white-space:nowrap;padding:3px 6px}.inspector thead th{background:var(--panel);position:sticky;top:0}.row-stale{background:color-mix(in srgb, var(--bad) 14%, transparent)}.row-expired{opacity:.55}.evicted{color:var(--muted);margin:6px 0 0;font-size:12px}.evicted s{margin-right:4px}.eventlog .lines{max-height:300px;margin:8px 0 0;padding:0;font:11.5px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;list-style:none;overflow:auto}.eventlog li{white-space:nowrap;padding:1px 0}.ev-miss{color:var(--c2)}.ev-error{color:var(--bad);font-weight:600}.ev-stale{-webkit-text-decoration:underline wavy var(--bad);text-decoration:underline wavy var(--bad)}.embed .top,.embed .tabs,.embed .area-log,.embed .area-inspect{display:none}@media (width<=1100px){.grid{grid-template:"controls run""controls charts""controls."1fr"inspect log"/260px minmax(0,1fr)}}@media (width<=760px){.app{padding:10px 12px 20px}.tabs{display:flex}.grid{display:block}.panel{margin-bottom:10px;display:none}.panel[data-active=true]{display:block}.embed .tabs{display:flex}}.seg{display:inline-flex}.seg button{border-radius:0}.seg button:first-child{border-radius:6px 0 0 6px}.seg button:last-child{border-radius:0 6px 6px 0;margin-left:-1px}button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.field small{color:var(--muted);margin-top:1px;font-size:11px;display:block}.field.check{align-items:flex-start;gap:8px;display:flex}.field.check small{margin-top:0}.field.check>span{color:var(--text);font-size:14px;display:block}.one-chart .chart{max-width:560px}textarea{background:var(--panel);border:1px solid var(--border);border-radius:6px;width:100%;padding:6px 8px;font:12px ui-monospace,Menlo,monospace}.trace-import{margin-top:6px}.trace-import summary{cursor:pointer;color:var(--accent)}.file-btn{background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:6px 10px;display:inline-block}.file-btn input{opacity:0;width:1px;height:1px;position:absolute}.file-btn:focus-within{outline:2px solid var(--accent);outline-offset:2px}.actions-box{border:1px solid var(--border);border-radius:8px;padding:8px 10px}.node text.badge{font-size:9.5px}.node rect.meter-bg{fill:var(--border)}@keyframes travel{0%{transform:translateX(var(--start));opacity:1}50%{transform:translateX(var(--stop));opacity:1}to{transform:translateX(var(--start));opacity:0}}.dot,.dot-hit.dot,.dot-miss.dot,.dot-write.dot,.dot-error.dot{animation:.9s ease-in-out forwards travel}[data-reduce-motion=true] .dot.dot-hit,[data-reduce-motion=true] .dot.dot-miss,[data-reduce-motion=true] .dot.dot-write,[data-reduce-motion=true] .dot.dot-error{opacity:0;animation:none}@media (prefers-reduced-motion:reduce){.dot.dot-hit,.dot.dot-miss,.dot.dot-write,.dot.dot-error{opacity:0;animation:none}}.docs{grid-template-columns:220px minmax(0,1fr);align-items:start;gap:24px;display:grid}.doc-toc{background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:8px;position:sticky;top:12px}.doc-toc ul{margin:0;padding:0;list-style:none}.toc-link{text-align:left;background:0 0;border:0;border-radius:6px;width:100%;padding:6px 10px;display:block}.toc-link[aria-current=true]{background:var(--accent-soft);font-weight:600}.doc-body{background:var(--panel);border:1px solid var(--border);border-radius:10px;max-width:860px;padding:20px 28px 28px;font-size:15px;line-height:1.6}.doc-body h1{margin-bottom:6px;font-size:26px}.doc-body h2{text-transform:none;letter-spacing:0;color:var(--text);border-bottom:2px solid var(--accent-soft);margin:28px 0 10px;padding-bottom:4px;scroll-margin-top:12px;font-size:20px}.doc-body h3{margin:16px 0 4px;font-size:15px}.doc-body .lede{color:var(--muted);font-size:17px}.doc-body a{color:var(--accent)}.doc-body code,.doc-body kbd{background:var(--accent-soft);border-radius:4px;padding:1px 5px;font:13px ui-monospace,Menlo,monospace}.doc-body kbd{border:1px solid var(--border)}.doc-table-wrap{margin:8px 0;overflow-x:auto}.doc-table{border-collapse:collapse;width:100%;font-size:14px}.doc-table th,.doc-table td{text-align:left;vertical-align:top;border-bottom:1px solid var(--border);padding:6px 10px}.doc-table thead th{background:var(--accent-soft)}.doc-table tbody th{white-space:nowrap;font-weight:600}.scenario-cards{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:12px;display:grid}.scenario-card{border:1px solid var(--border);background:var(--bg);border-radius:10px;padding:12px 14px}.scenario-card h3{margin-top:0}.scenario-card p{margin:6px 0}.embed .docs{display:none}@media (width<=860px){.docs{grid-template-columns:1fr}.doc-toc{position:static}.doc-toc ul{flex-wrap:wrap;gap:2px;display:flex}.toc-link{width:auto}.doc-body{padding:14px 14px 20px}}.top>*,.docs>*,.scenario-bar>*{min-width:0}.scenario-bar .inline{flex-wrap:wrap;max-width:100%}.scenario-bar select{min-width:0;max-width:100%}@media (width<=860px){.docs{grid-template-columns:minmax(0,1fr)}}
