:root{--bg:#f4f6fa;--fg:#1a1a22;--card:#fff;--border:#00000014;--muted:#717182;--muted-bg:#f3f3f5;--primary:#030213;--accent:#2563eb;--accent-soft:#eef2ff;--ok:#1a9850;--err:#d4183d;--radius:10px;--shadow:0 1px 3px #0000000f, 0 1px 2px #0000000a;color:var(--fg);font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif}*{box-sizing:border-box}body{background:linear-gradient(135deg,#f8fafc 0%,#eef1f6 100%);min-height:100vh;margin:0}.app{max-width:1100px;margin:0 auto;padding:0 0 28px}.tabbar{z-index:800;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--border);background:#ffffffb3;align-items:stretch;gap:4px;margin-bottom:16px;padding:6px 8px;display:flex;position:sticky;top:0}.tabbar button{height:44px;color:var(--muted);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:1;justify-content:center;align-items:center;gap:6px;margin:0;padding:0 8px;font-size:.9rem;line-height:1;transition:background .12s,color .12s;display:flex}.tabbar button .ico{font-size:1.05rem}.tabbar button:hover:not(:disabled){background:#0000000a}.tabbar button.active,.tabbar button.active:hover{color:var(--accent);box-shadow:0 1px 4px #0000001f, inset 0 0 0 1px var(--border);background:#fff;font-weight:600}.tab-page{padding:0 16px}.ios-banner{border-radius:var(--radius);color:#9a3412;background:#fff7ed;border:1px solid #fdba74;align-items:flex-start;gap:10px;margin:0 16px 12px;padding:10px 12px;font-size:.85rem;display:flex}.ios-banner button{color:#9a3412;background:0 0;border:none;flex-shrink:0;padding:0 4px;font-size:1rem}.play-layout,.play-side{flex-direction:column;gap:12px;display:flex}.play-main{flex:1;min-width:0}@media (width>=900px){.play-layout{flex-direction:row;align-items:flex-start}.play-side{flex-shrink:0;width:280px;position:sticky;top:70px}.play-side .panel,.play-main .panel{margin-bottom:0}}.ex-layout{flex-direction:column;gap:12px;display:flex}.ex-main{flex:1;min-width:0}@media (width>=900px){.ex-layout{flex-direction:row;align-items:flex-start}.ex-side{flex-shrink:0;width:300px;position:sticky;top:70px}.tab-page>.panel{max-width:720px;margin-left:auto;margin-right:auto}}header h1{margin:0 0 4px;font-size:1.4rem}.sub{color:#6b6b80;margin:0 0 16px;font-size:.9rem}.panel{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:12px;padding:14px}.panel h2{margin:0 0 12px;font-size:1rem}.sheet{border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);background:#fff;padding:10px;overflow-x:auto}.sheet svg{max-width:none;display:block}.controls{margin-top:12px}.controls label{margin-bottom:10px;font-size:.9rem;display:block}.controls input[type=range]{width:100%}.buttons{flex-wrap:wrap;gap:8px;display:flex}button{border:1px solid var(--border);color:var(--fg);cursor:pointer;background:#fff;border-radius:8px;padding:9px 14px;font-size:.9rem;transition:background .12s,border-color .12s}button:hover:not(:disabled):not(.fab-btn){background:var(--muted-bg)}button:active{transform:translateY(1px)}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--primary);color:#fff;border-color:var(--primary);font-weight:600}button.primary:hover:not(:disabled){background:#1a1a2e}.status{border-radius:8px;margin-top:12px;padding:10px 12px;font-weight:600}.status-ready{color:#137a43;background:#e6f7ed}.status-insecure,.status-denied,.status-unsupported{color:#b42318;background:#fdecec}.status .detail{margin-top:4px;font-size:.85rem;font-weight:400}.devices,.active{margin-top:12px;font-size:.9rem}.midilog{margin-top:12px}.midilog ul{max-height:220px;margin:6px 0 0;padding:0;font-family:ui-monospace,Cascadia Code,monospace;font-size:.85rem;list-style:none;overflow-y:auto}.midilog li{padding:2px 0}.midilog li.noteon{color:#1d4ed8}.midilog li.empty{color:#999;font-style:italic}footer{text-align:center;color:#8a8a9a;padding:8px;font-size:.8rem}.grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:12px;display:grid}.grid label{color:#555;flex-direction:column;gap:4px;font-size:.85rem;display:flex}.grid select,.grid input{border:1px solid #c9c9dc;border-radius:8px;padding:8px;font-size:.95rem}.modes{gap:16px;margin:12px 0;font-size:.9rem;display:flex}.modes label{cursor:pointer;align-items:center;gap:6px;display:flex}.feedback{background:#f6f7fb;border-radius:10px;padding:14px;transition:background .15s}.feedback.ok{background:#e6f7ed}.feedback.err{background:#fdecec}.target{margin-bottom:8px;font-size:1.2rem}.target b{color:#4f46e5;font-size:1.5rem}.done{color:#137a43;margin-bottom:8px;font-size:1.1rem;font-weight:700}.stats{flex-wrap:wrap;gap:16px;font-size:.95rem;display:flex}.stats .ok{color:#137a43;font-weight:600}.stats .err{color:#b42318;font-weight:600}.stats .hint{color:#8a8a9a;font-style:italic}.checks{flex-direction:column;gap:10px;font-size:.92rem;display:flex}.checks label{cursor:pointer;align-items:center;gap:8px;display:flex}.summary{border-top:1px solid #e3e3ee;margin-top:12px;padding-top:12px}.summary .stats{margin-top:6px}.summary .hard{color:#b42318;margin-top:8px;font-size:.9rem}.offset{flex-direction:column;gap:8px;margin-top:14px;display:flex}.offset label{font-size:.9rem}.offset input[type=range]{width:100%}.offset button{align-self:flex-start;padding:6px 12px}.note-hint{color:#8a8a9a;margin:0;font-size:.82rem}.save-form,.lib-filters{flex-wrap:wrap;gap:8px;margin-bottom:12px;display:flex}.save-form input,.lib-filters input,.lib-filters select{border:1px solid #c9c9dc;border-radius:8px;flex:140px;padding:8px;font-size:.9rem}.lib-list{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.lib-list li{border:1px solid #eee;border-radius:8px;align-items:center;gap:8px;padding:8px;display:flex}.lib-list li.current{background:#f5f4ff;border-color:#4f46e5}.lib-list li.empty{color:#999;border:none;font-style:italic}.lib-info{cursor:pointer;flex:1;min-width:0}.lib-title{font-size:.95rem;font-weight:600}.lib-meta{color:#8a8a9a;font-size:.8rem}.lib-list .fav{color:#f59e0b;background:0 0;border:none;padding:2px 6px;font-size:1.2rem}.lib-list .del{background:0 0;border:none;font-size:1rem}.import-row{flex-wrap:wrap;align-items:center;gap:12px;margin-top:10px;display:flex}.import-btn{color:#4f46e5;cursor:pointer;border:1px dashed #4f46e5;border-radius:8px;padding:10px 14px;font-size:.95rem;display:inline-block}.import-ok{color:#137a43;font-size:.85rem}.import-err{color:#b42318;margin:8px 0 0;font-size:.85rem}.kbd-overlay{z-index:900;background:#20202c;padding:6px 8px 10px;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -4px 16px #0000004d}.kbd-head{color:#d8d8e6;justify-content:space-between;align-items:center;padding:2px 4px 6px;font-size:.85rem;display:flex}.kbd-head button{color:#d8d8e6;background:0 0;border:none;padding:2px 8px;font-size:1.1rem}.kbd{-webkit-user-select:none;user-select:none;height:96px;display:flex;position:relative}.wk{box-sizing:border-box;background:#fafafa;border:1px solid #555;border-radius:0 0 4px 4px}.wk.expected{background:#bff0cf}.wk.pressed{background:#4f8cff}.bk{box-sizing:border-box;z-index:2;background:#1b1b22;border:1px solid #000;border-radius:0 0 3px 3px;height:60%;position:absolute;top:0}.bk.expected{background:#2e9e57}.bk.pressed{background:#2f6fe0}.transport label{margin-bottom:8px;font-size:.9rem;display:block}.transport label b,.offset label b,.range-label b{color:var(--accent);font-size:1.05rem}.transport label input[type=range]{width:100%;margin-top:4px}.fab-transport{z-index:1000;gap:10px;display:flex;position:fixed;bottom:16px;right:16px}.fab-transport.above-kbd{bottom:170px}.fab-btn{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:50%;justify-content:center;align-items:center;width:52px;height:52px;padding:0;font-size:1.4rem;line-height:1;display:flex;box-shadow:0 4px 12px #00000040}.fab-btn:hover,.fab-btn:focus{background:var(--accent)}.fab-btn:active{transform:translateY(1px)}.fab-btn.play{background:var(--accent)}.fab-btn.stop,.fab-btn.stop:hover,.fab-btn.stop:focus{background:#d73027}.fab-btn.on,.fab-btn.on:hover,.fab-btn.on:focus{background:#137a43}.lbl{align-items:center;gap:2px;display:inline-flex}.info-hint{cursor:help;align-items:center;margin-left:4px;display:inline-flex;position:relative}.info-ico{background:var(--accent);color:#fff;border-radius:50%;justify-content:center;align-items:center;width:16px;height:16px;font-family:Georgia,Times New Roman,serif;font-size:.7rem;font-style:italic;font-weight:700;line-height:1;display:inline-flex}.info-bubble{z-index:1100;color:#fff;white-space:normal;background:#20202c;border-radius:8px;width:max-content;max-width:220px;padding:7px 10px;font-size:.78rem;font-weight:400;line-height:1.35;position:absolute;bottom:130%;left:50%;transform:translate(-50%);box-shadow:0 4px 12px #00000040}.h2-row{align-items:center;margin:0 0 12px;display:flex}.h2-row h2{margin:0}.progress-head{justify-content:space-between;align-items:center;margin-bottom:6px;font-size:.85rem;display:flex}.progress-head .ph-left{align-items:center;gap:2px;font-weight:600;display:flex}.progress-bar{background:var(--muted-bg);border-radius:4px;height:8px;overflow:hidden}.progress-bar>div{background:var(--accent);border-radius:4px;height:100%;transition:width .15s}.feedback-wrap{margin-bottom:12px}.title-card{text-align:center}.title-card .tc-title{font-size:1.05rem;font-weight:700}.title-card .tc-sub{color:var(--muted);margin:2px 0;font-size:.8rem}.sheet-hint{text-align:center;color:#8a8a9a;padding:12px;font-size:.88rem}.range-row{margin-bottom:10px;font-size:.9rem;display:block}.range-row input[type=range]{width:100%;margin-top:4px}.preset-group{margin-bottom:14px}.preset-group-name{color:#6b6b80;margin-bottom:6px;font-size:.85rem;font-weight:700}.preset-list{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;display:grid}.preset{text-align:left;border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);cursor:pointer;background:#fff;flex-direction:column;align-items:flex-start;gap:3px;padding:12px 14px;transition:border-color .12s,box-shadow .12s,background .12s;display:flex}.preset:hover:not(:disabled){border-color:var(--accent);background:var(--accent-soft)}.preset b{color:var(--fg);font-size:.9rem}.preset span{color:var(--muted);font-size:.78rem}.range-label{color:#555;font-size:.9rem}input[type=range]:not(.range-slider input){appearance:none;cursor:pointer;background:0 0;height:22px}input[type=range]:not(.range-slider input)::-webkit-slider-runnable-track{background:#c9c9dc;border-radius:2px;height:4px}input[type=range]:not(.range-slider input)::-moz-range-track{background:#c9c9dc;border-radius:2px;height:4px}input[type=range]:not(.range-slider input)::-webkit-slider-thumb{appearance:none;border:2px solid var(--accent);background:#fff;border-radius:50%;width:22px;height:22px;margin-top:-9px;box-shadow:0 1px 3px #0000004d}input[type=range]:not(.range-slider input)::-moz-range-thumb{border:2px solid var(--accent);background:#fff;border-radius:50%;width:22px;height:22px;box-shadow:0 1px 3px #0000004d}.range-slider{height:36px;margin:6px 6px 4px;position:relative}.range-slider .rs-track{background:#c9c9dc;border-radius:2px;height:4px;position:absolute;top:50%;left:0;right:0;transform:translateY(-50%)}.range-slider .rs-fill{background:var(--accent);border-radius:2px;height:4px;position:absolute;top:50%;transform:translateY(-50%)}.range-slider input[type=range]{pointer-events:none;appearance:none;background:0 0;width:100%;height:36px;margin:0;position:absolute;top:0;left:0}.range-slider input[type=range]::-webkit-slider-thumb{appearance:none;pointer-events:auto;border:2px solid var(--accent);cursor:pointer;background:#fff;border-radius:50%;width:22px;height:22px;box-shadow:0 1px 3px #0000004d}.range-slider input[type=range]::-moz-range-thumb{pointer-events:auto;border:2px solid var(--accent);cursor:pointer;background:#fff;border-radius:50%;width:22px;height:22px}.range-slider.disabled{opacity:.5}.tracks{flex-direction:column;gap:8px;display:flex}.tracks label{cursor:pointer;align-items:center;gap:8px;font-size:.95rem;display:flex}.tracks label.off{color:#9a9aac}.history{flex-direction:column;gap:4px;margin:0;padding:0;font-size:.88rem;list-style:none;display:flex}.history li{border-bottom:1px solid #f0f0f5;align-items:center;gap:12px;padding:4px 0;display:flex}.history .date{color:#8a8a9a;flex:1}.history .acc{color:#137a43;font-weight:700}
