.violin-bow-app{--ink:#2a2320;--ink-soft:#7a6d58;--paper:#f5f1e8;--card:rgba(253,250,243,0.97);--card-2:#fffdf8;--line:rgba(60,45,30,0.14);--gold:#f2c14e;--red:#d6402e;--good:#3f9a5a;--warn:#c7811b;--wood:#c8641d;--safe-t:env(safe-area-inset-top,0px);--safe-b:env(safe-area-inset-bottom,0px);--safe-l:env(safe-area-inset-left,0px);--safe-r:env(safe-area-inset-right,0px);--score-top:54px;--score-h:260px;--pad-top:314px;--pad-h:400px;position:fixed;inset:0;height:100dvh;overflow:hidden;background:var(--paper);color:var(--ink);font-family:M PLUS Rounded\ 1c,Avenir Next,Hiragino Maru Gothic ProN,Noto Sans,PingFang SC,Apple SD Gothic Neo,system-ui,sans-serif;-webkit-tap-highlight-color:transparent;-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:none}.violin-bow-app button{cursor:pointer;font:inherit;color:inherit}.violin-bow-app [hidden]{display:none!important}.violin-bow-app .vb-paper{position:absolute;z-index:0;inset:0;background:var(--paper) url(/images/violin-bow/tex-paper.jpg) 0 0 /512px repeat}.violin-bow-app .vb-pad-bg{position:absolute;z-index:1;left:0;right:0;top:var(--pad-top);bottom:0;background:#ebe4d6 url(/images/violin-bow/tex-cloth.jpg) 0 0/420px repeat;border-top:1px solid rgba(60,45,30,.16)}.violin-bow-app .vb-scene{position:absolute;inset:0;width:100%;height:100%;display:block;z-index:2;pointer-events:none}.violin-bow-app .vb-score{top:var(--score-top);height:var(--score-h);width:100%}.violin-bow-app .vb-score,.violin-bow-app .vb-topcover{position:absolute;z-index:4;left:0;right:0;pointer-events:none}.violin-bow-app .vb-topcover{top:0;height:var(--score-top);background:var(--paper) url(/images/violin-bow/tex-paper.jpg) 0 0 /512px repeat}.violin-bow-app .vb-bands{position:absolute;z-index:3;left:0;right:0;top:var(--pad-top);height:var(--pad-h);display:grid;grid-template-rows:repeat(4,1fr);pointer-events:none}.violin-bow-app .vb-band{position:relative;border-top:1px dashed rgba(60,45,30,.12)}.violin-bow-app .vb-band:first-child{border-top:0}.violin-bow-app .vb-band b{position:absolute;right:calc(var(--safe-r) + 12px);top:50%;transform:translateY(-50%);font-size:14px;font-weight:900;color:#a89a82}.violin-bow-app .vb-surface{position:absolute;z-index:5;left:0;right:0;top:var(--score-top);bottom:0;touch-action:none;outline:none}.violin-bow-app:not([data-phase=play]) .vb-bands,.violin-bow-app:not([data-phase=play]) .vb-pad-bg,.violin-bow-app:not([data-phase=play]) .vb-score,.violin-bow-app:not([data-phase=play]) .vb-surface,.violin-bow-app:not([data-phase=play]) .vb-topcover{display:none}.violin-bow-app .vb-topbar{position:absolute;z-index:30;top:calc(var(--safe-t) + 5px);left:calc(var(--safe-l) + 10px);right:calc(var(--safe-r) + 10px);height:44px;display:flex;justify-content:space-between;align-items:center;gap:8px;pointer-events:none}.violin-bow-app .vb-topbar>*{pointer-events:auto}.violin-bow-app .vb-brand{display:flex;align-items:center;gap:6px;border:0;background:none;padding:0;min-height:44px;font-weight:900;font-size:18px;color:var(--ink)}.violin-bow-app .vb-brand img{width:40px;height:40px}.violin-bow-app .vb-hudtop{display:none;align-items:baseline;gap:14px;min-width:0;flex:1 1;justify-content:center;white-space:nowrap}.violin-bow-app[data-phase=play] .vb-hudtop{display:flex}.violin-bow-app .vb-tag{font-size:13px;color:var(--ink-soft);font-weight:700;overflow:hidden;text-overflow:ellipsis}.violin-bow-app .vb-tag b{color:var(--ink);font-weight:900}.violin-bow-app .vb-live small{font-size:13px;font-weight:800;color:var(--ink-soft)}.violin-bow-app .vb-live output{font-size:28px;font-weight:900;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;letter-spacing:-.5px}.violin-bow-app.free .vb-live{display:none}.violin-bow-app .vb-topbtns{display:flex;gap:6px}.violin-bow-app .vb-round{width:44px;height:44px;border-radius:50%;border:1.5px solid var(--ink);display:inline-grid;place-items:center;background:var(--card-2);color:var(--ink)}.violin-bow-app .vb-round .off,.violin-bow-app .vb-round.muted .on{display:none}.violin-bow-app .vb-round.muted .off{display:inline}.violin-bow-app .vb-menu-only,.violin-bow-app .vb-play-only{display:none}.violin-bow-app[data-phase=menu] .vb-menu-only,.violin-bow-app[data-phase=play] .vb-play-only{display:inline-grid}.violin-bow-app .vb-coach,.violin-bow-app .vb-fingers,.violin-bow-app .vb-gauge,.violin-bow-app .vb-keyhint{z-index:6}.violin-bow-app:not([data-phase=play]) :is(.vb-coach,.vb-gauge,.vb-keyhint,.vb-fingers){display:none}.violin-bow-app .vb-coach{position:absolute;left:50%;top:calc(var(--pad-top) + 10px);transform:translateX(-50%);margin:0;pointer-events:none;white-space:nowrap;padding:5px 14px;border-radius:999px;background:var(--ink);color:#fffaf0;font-size:15px;font-weight:900}.violin-bow-app .vb-coach:empty{display:none}.violin-bow-app .vb-coach[data-kind=gii]{background:#8a4b1c}.violin-bow-app .vb-coach[data-kind=suka]{background:#6e889d}.violin-bow-app .vb-coach[data-kind=click],.violin-bow-app .vb-coach[data-kind=wrong]{background:var(--red)}.violin-bow-app .vb-gauge{position:absolute;left:50%;bottom:calc(var(--safe-b) + 12px);transform:translateX(-50%);width:min(340px,calc(100% - 120px));display:flex;align-items:center;gap:8px;pointer-events:none;font-size:11px;font-weight:800;color:var(--ink-soft);--s:0;--a:0;--b:0}.violin-bow-app.free .vb-gauge{bottom:calc(var(--safe-b) + 72px)}.violin-bow-app .vb-gauge-track{position:relative;flex:1 1;height:12px;border-radius:6px;background:rgba(255,252,244,.85);border:1.5px solid rgba(60,45,30,.35)}.violin-bow-app .vb-gauge-plan{position:absolute;top:2px;bottom:2px;left:calc(var(--a) * 100%);width:calc((var(--b) - var(--a)) * 100%);border-radius:4px;background:rgba(242,193,78,.75);display:none}.violin-bow-app .vb-gauge.plan .vb-gauge-plan{display:block}.violin-bow-app .vb-gauge-dot{position:absolute;top:50%;left:calc(var(--s) * 100%);width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;background:var(--ink);box-shadow:0 0 0 2px #fffaf0}.violin-bow-app .vb-gauge.end .vb-gauge-dot{background:var(--red)}.violin-bow-app .vb-keyhint{position:absolute;left:calc(var(--safe-l) + 12px);bottom:calc(var(--safe-b) + 8px);margin:0;max-width:30%;font-size:12px;font-weight:700;color:var(--ink-soft);pointer-events:none}.violin-bow-app .vb-fingers{position:absolute;left:50%;bottom:calc(var(--safe-b) + 10px);transform:translateX(-50%);display:none;gap:6px;align-items:center}.violin-bow-app.free .vb-fingers{display:flex}.violin-bow-app .vb-fingers [data-finger]{min-width:48px;min-height:48px;border-radius:12px;border:1.5px solid var(--ink);background:var(--card-2);font-weight:900;font-size:16px;display:grid;place-items:center;padding:2px 6px;touch-action:none}.violin-bow-app .vb-fingers [data-finger] kbd{font-size:10px;opacity:.6}.violin-bow-app .vb-fingers [aria-pressed=true]{background:var(--ink);color:#fffaf0}.violin-bow-app .vb-done{min-height:48px;padding:0 16px;border-radius:12px;border:0;background:var(--red);color:#fff;font-weight:900}.violin-bow-app kbd{font-family:inherit;font-weight:800}@media (hover:none),(pointer:coarse){.violin-bow-app .vb-keyhint,.violin-bow-app kbd{display:none!important}}.violin-bow-app .vb-hand{position:absolute;z-index:7;left:-34px;top:-6px;width:68px;height:68px;pointer-events:none;opacity:0;transition:opacity .25s;filter:drop-shadow(0 4px 5px rgba(60,40,20,.35))}.violin-bow-app .vb-hand.show{opacity:.95}.violin-bow-app:not([data-phase=play]) .vb-hand{display:none}.violin-bow-app .vb-banner{position:absolute;z-index:26;left:50%;top:calc(var(--pad-top) + var(--pad-h) * .25);transform:translate(-50%,-50%) scale(.6);opacity:0;pointer-events:none;font-size:clamp(20px,5vw,38px);line-height:1.15;font-weight:900;width:max-content;max-width:90vw;text-align:center;color:var(--ink);-webkit-text-stroke:5px #fffaf0;paint-order:stroke fill}.violin-bow-app .vb-banner.show{animation:vb-pop 1.1s ease-out forwards}@keyframes vb-pop{0%{opacity:0;transform:translate(-50%,-50%) scale(.6)}16%{opacity:1;transform:translate(-50%,-50%) scale(1.06)}30%{transform:translate(-50%,-50%) scale(1)}80%{opacity:1}to{opacity:0;transform:translate(-50%,-60%) scale(1)}}.violin-bow-app .vb-sheet{position:absolute;z-index:40;top:calc(var(--safe-t) + 60px);left:calc(var(--safe-l) + 20px);max-height:calc(100dvh - var(--safe-t) - var(--safe-b) - 80px);width:min(440px,42vw);overflow-y:auto;overscroll-behavior:contain;padding:20px 20px 18px;touch-action:pan-y;background:var(--card);border:1.5px solid var(--line);border-radius:18px;box-shadow:0 14px 40px rgba(60,40,20,.18);display:flex;flex-direction:column;align-items:stretch;gap:10px;opacity:0;transform:translateX(-16px);transition:opacity .2s,transform .2s}.violin-bow-app .vb-sheet.show{opacity:1;transform:none}.violin-bow-app .vb-dialog{z-index:45}.violin-bow-app .vb-sheet h2{margin:0 0 4px;font-size:22px;font-weight:900}.violin-bow-app .vb-sheet p{margin:0;line-height:1.45}.violin-bow-app .vb-x{position:absolute;top:8px;right:8px;width:44px;height:44px;border:0;border-radius:50%;background:transparent;display:grid;place-items:center}.violin-bow-app .vb-primary,.violin-bow-app .vb-secondary{min-height:52px;font-size:17px;font-weight:900;padding:10px 18px;border-radius:4px}.violin-bow-app .vb-primary{border:0;background:var(--ink);color:#fffaf0}.violin-bow-app .vb-primary:active{transform:translateY(2px)}.violin-bow-app .vb-primary:disabled{opacity:.45;cursor:default}.violin-bow-app .vb-secondary{border:2px solid var(--ink);background:var(--card-2);color:var(--ink)}.violin-bow-app .vb-link{border:0;background:none;text-decoration:underline;text-underline-offset:3px;font-size:15px;min-height:44px;color:var(--ink-soft)}.violin-bow-app .vb-chip{min-height:44px;padding:6px 14px;border-radius:999px;border:1.5px solid var(--ink);background:var(--card-2);font-size:13px;font-weight:800}.violin-bow-app .vb-chip[aria-pressed=false]{opacity:.5;text-decoration:line-through}.violin-bow-app :is(button,[role=radio]):focus-visible{outline:3px solid var(--gold);outline-offset:2px}.violin-bow-app .vb-menu-title{margin:0;font-size:clamp(32px,4vw,44px);line-height:1.05;font-weight:900;letter-spacing:-.5px}.violin-bow-app .vb-menu-sub{font-size:14px;color:var(--ink-soft);margin-top:6px!important;font-weight:700}.violin-bow-app .vb-stages-head{display:flex;justify-content:space-between;align-items:baseline;font-size:12px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:var(--ink-soft);margin-top:2px}.violin-bow-app .vb-total{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;text-transform:none;letter-spacing:0;font-size:13px;color:var(--ink)}.violin-bow-app .vb-stages{display:grid;grid-template-columns:repeat(6,1fr);grid-gap:6px;gap:6px}.violin-bow-app .vb-st{position:relative;aspect-ratio:1;min-height:46px;border-radius:50%;border:2px solid transparent;background:none;padding:0}.violin-bow-app .vb-st img{width:100%;height:100%;object-fit:contain;display:block}.violin-bow-app .vb-st-num{position:absolute;left:-2px;top:-2px;min-width:20px;height:20px;border-radius:10px;background:var(--ink);color:#fffaf0;font-size:12px;font-weight:900;display:grid;place-items:center;padding:0 4px}.violin-bow-app .vb-st-best{position:absolute;right:-4px;bottom:-4px;font-size:11px;font-weight:900;padding:1px 5px;border-radius:8px;background:#fffaf0;border:1px solid var(--line);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.violin-bow-app .vb-st-best:empty{display:none}.violin-bow-app .vb-st-lock{display:none;position:absolute;inset:0;place-items:center;color:#fffaf0}.violin-bow-app .vb-st.locked img{filter:grayscale(1) brightness(.65);opacity:.6}.violin-bow-app .vb-st.locked{cursor:not-allowed}.violin-bow-app .vb-st.locked .vb-st-lock{display:grid}.violin-bow-app .vb-st.cleared .vb-st-best{background:var(--good);color:#fff;border-color:var(--good)}.violin-bow-app .vb-st[aria-checked=true]{border-color:var(--ink);box-shadow:0 0 0 3px var(--gold)}.violin-bow-app .vb-stage-card{display:flex;gap:12px;align-items:center;padding:10px 12px;border-radius:12px;background:#fffdf8;border:1.5px solid var(--line)}.violin-bow-app .vb-stage-img{width:72px;height:72px;flex:none;object-fit:contain}.violin-bow-app .vb-stage-kicker{font-size:12px;font-weight:800;color:var(--ink-soft)}.violin-bow-app .vb-stage-name{font-size:19px!important;margin:1px 0 3px!important;line-height:1.15}.violin-bow-app .vb-stage-note{font-size:13.5px}.violin-bow-app .vb-stage-meta{font-size:13px;font-weight:900;color:var(--wood);margin-top:4px!important;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.violin-bow-app .vb-settings{display:flex;flex-wrap:wrap;gap:6px;justify-content:center}.violin-bow-app .vb-menu-foot{font-size:13px;text-align:center}.violin-bow-app .vb-menu-foot a{color:var(--ink-soft)}.violin-bow-app .vb-steps{margin:4px 0 8px;padding-left:22px;display:grid;grid-gap:8px;gap:8px;line-height:1.45;font-size:15px}.violin-bow-app .vb-results{gap:8px}.violin-bow-app .vb-r-kicker{font-size:12px;font-weight:800;letter-spacing:.4px;color:var(--ink-soft)}.violin-bow-app .vb-r-top{position:relative;display:flex;align-items:center;gap:10px}.violin-bow-app .vb-r-top:has(.vb-r-stamp:not([hidden])){padding-right:72px}.violin-bow-app .vb-r-img{width:96px;height:96px;object-fit:contain;flex:none}.violin-bow-app .vb-r-name{font-size:28px!important;line-height:1.1;letter-spacing:-.3px}.violin-bow-app .vb-r-grade{font-weight:800;color:var(--ink-soft)}.violin-bow-app .vb-r-stamp{position:absolute;right:0;top:-6px;width:74px;height:74px;border-radius:50%;border:3px solid var(--red);color:var(--red);display:grid;place-items:center;font-weight:900;font-size:16px;transform:rotate(-12deg)}.violin-bow-app .vb-r-sheet{width:100%;height:150px;border-radius:10px;background:#fffdf8;border:1px solid var(--line)}.violin-bow-app .vb-r-scores{display:grid;grid-template-columns:1.7fr 1fr 1fr 1fr;grid-gap:6px;gap:6px}.violin-bow-app .vb-r-scores>div{padding:6px 8px;border-radius:10px;background:#fffdf8;border:1px solid var(--line);min-width:0}.violin-bow-app .vb-label{display:block;font-size:10px;font-weight:800;letter-spacing:.6px;text-transform:uppercase;color:var(--ink-soft);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.violin-bow-app .vb-r-scores output{display:block;font-size:20px;font-weight:900;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.violin-bow-app #vb-r-pct{font-size:27px;line-height:1.05;letter-spacing:-.5px}.violin-bow-app .vb-r-verdict{font-size:17px;font-weight:900}.violin-bow-app .vb-results[data-passed=true] .vb-r-verdict{color:var(--good)}.violin-bow-app .vb-results[data-passed=false] .vb-r-verdict{color:var(--warn)}.violin-bow-app .vb-r-best{font-size:13px;color:var(--ink-soft);font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.violin-bow-app .vb-new{color:var(--red);margin-left:6px}.violin-bow-app .vb-r-unlock{font-size:14px;font-weight:900;color:var(--wood)}.violin-bow-app .vb-r-tips{margin:0;padding:8px 12px 8px 28px;border-radius:10px;background:rgba(242,193,78,.16);border:1px solid rgba(199,129,27,.35);font-size:13.5px;line-height:1.45;display:grid;grid-gap:4px;gap:4px}.violin-bow-app .vb-r-tips:empty{display:none}.violin-bow-app .vb-r-actions{display:grid;grid-template-columns:1fr 1fr;grid-gap:8px;gap:8px;margin-top:2px}.violin-bow-app .vb-r-actions .vb-link,.violin-bow-app .vb-r-actions .vb-primary{grid-column:1/-1}.violin-bow-app .vb-results>*{order:3}.violin-bow-app .vb-results>:is(.vb-r-kicker,.vb-r-top,.vb-r-sheet,.vb-r-scores){order:0}.violin-bow-app .vb-results>.vb-r-verdict{order:1}.violin-bow-app .vb-results>.vb-r-actions{order:2}.violin-bow-app .vb-share-note{font-size:13px;color:var(--ink-soft);min-height:1em;text-align:center}.violin-bow-app #violin-bow-leaderboard{width:100%}.violin-bow-app .vb-toast{position:absolute;z-index:60;left:50%;bottom:calc(var(--safe-b) + 120px);transform:translate(-50%,10px);padding:8px 14px;border-radius:8px;background:var(--ink);color:#fffaf0;font-size:14px;font-weight:800;opacity:0;transition:opacity .2s,transform .2s;pointer-events:none}.violin-bow-app .vb-toast.show{opacity:1;transform:translate(-50%)}.violin-bow-app .vb-webgl-error{position:absolute;inset:auto 20px 40% 20px;z-index:80;text-align:center;font-weight:800}.violin-bow-app .vb-loading{position:absolute;inset:0;z-index:70;display:none;place-items:center;background:var(--paper);padding:20px}.violin-bow-app .vb-loading.show{display:grid}@media (max-aspect-ratio:4/5),(max-width:700px){.violin-bow-app .vb-sheet{top:auto;left:0;right:0;bottom:0;width:auto;max-height:min(60dvh,640px);border-radius:20px 20px 0 0;border-bottom:0;padding:16px 16px calc(var(--safe-b) + 14px);transform:translateY(24px)}.violin-bow-app .vb-dialog{max-height:86dvh}.violin-bow-app .vb-menu-title{font-size:28px}.violin-bow-app .vb-menu-sub{font-size:13px}.violin-bow-app .vb-brand span{display:none}.violin-bow-app .vb-r-img{width:72px;height:72px}.violin-bow-app .vb-r-name{font-size:22px!important}.violin-bow-app .vb-r-sheet{height:120px}.violin-bow-app .vb-r-scores{grid-template-columns:repeat(3,1fr)}.violin-bow-app #vb-r-pct{font-size:32px}.violin-bow-app .vb-r-scores .vb-r-main{grid-column:1/-1;display:flex;align-items:baseline;gap:10px}.violin-bow-app .vb-tag{display:none}.violin-bow-app .vb-stage-img{width:56px;height:56px}}@media (max-height:500px){.violin-bow-app .vb-sheet{top:calc(var(--safe-t) + 54px);bottom:calc(var(--safe-b) + 6px);max-height:none;padding:12px 14px;gap:7px;width:min(420px,52vw)}.violin-bow-app .vb-menu-title{font-size:24px}.violin-bow-app .vb-menu-sub,.violin-bow-app .vb-stage-note{display:none}.violin-bow-app .vb-stages{grid-template-columns:repeat(11,1fr);gap:3px}.violin-bow-app .vb-st{min-height:30px}.violin-bow-app .vb-st-num{min-width:16px;height:16px;font-size:10px}.violin-bow-app .vb-st-best{display:none}.violin-bow-app .vb-r-img{width:52px;height:52px}.violin-bow-app .vb-r-name{font-size:20px!important}.violin-bow-app .vb-r-sheet{height:96px}.violin-bow-app .vb-r-stamp{width:56px;height:56px;font-size:13px}.violin-bow-app .vb-primary,.violin-bow-app .vb-secondary{min-height:46px}.violin-bow-app .vb-live output{font-size:22px}.violin-bow-app .vb-coach{font-size:13px;padding:3px 10px;top:calc(var(--pad-top) + 4px)}.violin-bow-app .vb-gauge{width:min(260px,40vw);bottom:calc(var(--safe-b) + 6px)}.violin-bow-app .vb-keyhint{display:none}.violin-bow-app .vb-fingers [data-finger]{min-width:44px;min-height:44px}}@media (max-height:500px) and (max-width:700px){.violin-bow-app .vb-sheet{top:auto}}@media (prefers-reduced-motion:reduce){.violin-bow-app .vb-sheet{transition:none}.violin-bow-app .vb-banner.show{animation-duration:.01s}}