:root{--bg: #0e1014;--panel: #161922;--line: #262c3a;--text: #e7eaf1;--muted: #8a93a6;--ok: #4ade80;--warn: #fbbf24;--bad: #f87171;--accent: #7aa2f7;color-scheme:dark}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font:13px/1.45 ui-sans-serif,-apple-system,SF Pro Text,Inter,system-ui,sans-serif;overflow:hidden}#app{display:grid;grid-template-columns:344px 1fr;height:100%}#controls{background:var(--panel);border-right:1px solid var(--line);overflow-y:auto;overscroll-behavior:contain;padding:10px}.tp-dfwv{width:100%;position:static}#stage{position:relative;min-width:0}#viewport{position:absolute;inset:0;touch-action:none;cursor:grab}#flatview{position:absolute;inset:0;touch-action:none;background:var(--bg)}#flatview[hidden],#viewport[hidden]{display:none}#viewport:active{cursor:grabbing}#viewport canvas{display:block}.floating{position:absolute;z-index:5;background:#12151cdb;backdrop-filter:blur(12px);border:1px solid var(--line);border-radius:9px;transition:opacity .25s}#viewmodes{top:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:2px;padding:4px}#viewmodes button{background:transparent;border:0;color:var(--muted);padding:5px 12px;border-radius:6px;cursor:pointer;font:inherit;font-size:12px}#viewmodes button:hover{color:var(--text);background:#1c202b}#viewmodes button.active{color:#0e1014;background:var(--accent);font-weight:600}#viewmodes .sep{width:1px;height:18px;background:var(--line);margin:0 4px}#hint{top:12px;left:12px;padding:9px 13px;max-width:260px;display:flex;flex-direction:column;gap:3px}#hint strong{font-size:15px;font-variant-numeric:tabular-nums}#hint span{color:var(--muted);font-size:11px;line-height:1.4}#readout{bottom:12px;left:12px;padding:10px 13px;font-variant-numeric:tabular-nums;font-size:12px;max-width:320px}#readout dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:2px 14px}#readout dt{color:var(--muted)}#readout dd{margin:0;text-align:right}#readout .hero{font-size:14px;font-weight:650;margin-bottom:7px;padding-bottom:7px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:16px}.ok{color:var(--ok)}.warn{color:var(--warn)}.bad{color:var(--bad)}#flash{bottom:12px;left:50%;transform:translate(-50%);padding:8px 14px;font-size:12px;z-index:9}.tuning{margin-top:12px;font-variant-numeric:tabular-nums}.tuning h3{margin:0 0 7px;font-size:11px;letter-spacing:.07em;text-transform:uppercase;color:var(--muted)}.tuning table{width:100%;border-collapse:collapse}.tuning th{text-align:right;font-weight:500;color:var(--muted);font-size:10px;padding:0 0 4px}.tuning th:first-child,.tuning td:first-child{text-align:left}.tuning td{padding:2px 0;font-size:12px;text-align:right}.tuning tr.ok td:last-child{color:var(--ok)}.tuning tr.warn td:last-child{color:var(--warn)}.tuning tr.bad td:last-child{color:var(--bad)}.warn-list{margin:8px 0 0;padding-left:15px;color:var(--warn);font-size:11px;line-height:1.5}#hint{top:62px}#air-legend{right:12px;bottom:12px;display:flex;gap:14px;padding:8px 12px;font-size:11px}#air-legend span:before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;background:currentColor}.breath{color:#6cdbce}.resonator{color:#ffb454}.cap{color:#bda3ee}#fipple-detail{top:62px;right:12px;width:min(400px,calc(100% - 24px));padding:15px;max-height:calc(100% - 114px);overflow:auto}#fipple-detail[hidden]{display:none}#fipple-detail svg{width:100%;display:block;background:#10151e;border-radius:8px;margin:12px 0}#fipple-detail p{color:var(--muted);font-size:11px}#fipple-detail dl{display:grid;grid-template-columns:1fr auto;font-size:12px;gap:5px 12px}#fipple-detail dt{color:var(--muted)}#fipple-detail dd{margin:0;font-variant-numeric:tabular-nums}#fipple-detail details{color:var(--warn);font-size:11px}.detail-heading{display:flex;justify-content:space-between;align-items:center;font-size:15px}.detail-heading button{background:transparent;color:var(--text);border:0;font-size:22px;cursor:pointer}.detail-legend{display:flex;gap:12px;font-size:11px}button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}@media (max-width: 1050px){#air-legend{inset:110px auto auto 12px}}@media (max-width: 760px){#app{grid-template-columns:1fr;grid-template-rows:60% 40%;height:100dvh}#stage{grid-row:1}#controls{grid-row:2;border-top:1px solid var(--line);border-right:0}#viewmodes{width:max-content;max-width:calc(100% - 12px);overflow-x:auto}#viewmodes button{padding:7px 8px}#hint{top:58px;padding:6px 9px;max-width:190px;pointer-events:none}#hint span{display:none}#air-legend{top:auto;bottom:8px;left:8px;padding:5px 8px;gap:10px;pointer-events:none}#readout{bottom:42px;left:8px;max-width:230px;padding:6px 9px;font-size:10px;pointer-events:none}#readout .hero{font-size:11px;margin-bottom:3px;padding-bottom:3px}#fipple-detail{top:56px;max-height:calc(100% - 98px)}}.flat-root{position:relative;width:100%;height:100%;overflow:hidden;touch-action:none;cursor:pointer}.flat-svg{display:block;width:100%;height:100%;user-select:none;-webkit-user-select:none}.flat-box{fill:#12151d;stroke:#3a4258;stroke-width:1.25px;vector-effect:non-scaling-stroke}.flat-air-fill{fill:#ffb454;stroke:none;opacity:.26}.flat-air-edge{fill:none;stroke:#ffb454;stroke-width:2.4px;stroke-opacity:.75;stroke-linejoin:round;vector-effect:non-scaling-stroke}.flat-centreline{fill:none;stroke:#fff3d6;stroke-width:1.1px;stroke-opacity:.5;stroke-dasharray:6 4;vector-effect:non-scaling-stroke}.flat-window{fill:#7aa2f7;fill-opacity:.16;stroke:#7aa2f7;stroke-width:1px;vector-effect:non-scaling-stroke}.flat-labium{stroke:#7aa2f7;stroke-width:1.8px;vector-effect:non-scaling-stroke}.flat-hole .flat-bore{fill:#0b0d12}.flat-hole .flat-ring{fill:none;stroke:#5ac8fa;stroke-width:1.6px;vector-effect:non-scaling-stroke}.flat-hole .flat-halo{fill:none;stroke:#5ac8fa;stroke-width:1.4px;stroke-opacity:0;vector-effect:non-scaling-stroke;transition:stroke-opacity .12s}.flat-hole .flat-pad{fill:#e8b48a;stroke:#b98457;stroke-width:1px;vector-effect:non-scaling-stroke}.flat-hole.is-open .flat-pad{display:none}.flat-hole.is-open .flat-ring{stroke:#8affc1;stroke-width:2px}.flat-hole.is-hovered .flat-halo{stroke-opacity:.55}.flat-svg text{font:500 11px/1 ui-sans-serif,-apple-system,SF Pro Text,Inter,system-ui,sans-serif;font-variant-numeric:tabular-nums}.flat-holelabel{fill:#2a1a0d;text-anchor:middle;dominant-baseline:central;pointer-events:none}.flat-holelabel.is-open{fill:#8affc1}.flat-passlabel{fill:#8a93a6;text-anchor:middle;font-size:10px}.flat-caption{fill:#8a93a6;font-size:10px}.flat-rule{stroke:#8a93a6;stroke-width:1px;stroke-opacity:.8}.flat-inlet{fill:#6cdbce;fill-opacity:.3;stroke:#6cdbce;stroke-width:.4}.flat-beak{fill:#12151d;stroke:#3a4258;stroke-width:.4}
