:root{--bd:#d7dce5;--bg:#f5f7fb;--pri:#2563eb;--ok:#00b34a;--good:#0fb5c9;--fine:#6b7280;--bad:#ef4444}*{box-sizing:border-box}body{font-family:-apple-system,Hiragino Sans,Segoe UI,sans-serif;margin:0;background:var(--bg);color:#1f2937}.wrap{max-width:760px;margin:0 auto;padding:20px 18px 80px}.site-header{position:-webkit-sticky;position:sticky;top:0;z-index:50;background:rgba(255,255,255,.9);-webkit-backdrop-filter:saturate(180%) blur(8px);backdrop-filter:saturate(180%) blur(8px);border-bottom:1px solid var(--bd)}.site-header-inner{display:flex;align-items:center;padding:7px 18px}.site-logo{display:inline-flex;align-items:center;gap:8px;color:var(--pri);text-decoration:none;font-weight:800;font-size:15px;letter-spacing:.01em}.site-logo span{color:#1f2937}.site-logo:hover{opacity:.72}.site-logo svg{display:block;flex:none}main.wide{width:100vw;margin-left:calc(50% - 50vw);padding:0 24px;box-sizing:border-box}h1{font-size:22px;margin:0 0 6px}.sub{color:#6b7280;font-size:13px;margin:0 0 20px}.card{border:1px solid var(--bd);border-radius:12px;padding:20px;margin-bottom:16px}.card,button{background:#fff}button{font:inherit;cursor:pointer;border-radius:8px;border:1px solid var(--bd);padding:10px 18px}button.primary{background:var(--pri);color:#fff;border-color:var(--pri);font-weight:600}button.rec{background:var(--bad);color:#fff;border-color:var(--bad);font-weight:700}button:disabled{opacity:.45;cursor:not-allowed}input:not([type=checkbox]):not([type=radio]),select,textarea{font:inherit;border:1px solid var(--bd);border-radius:8px;padding:9px 11px;background:#fff;color:#1f2937;max-width:100%}textarea{resize:vertical;line-height:1.6;width:100%}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--pri);box-shadow:0 0 0 3px rgba(37,99,235,.12)}input::placeholder,textarea::placeholder{color:#9ca3af}a{color:var(--pri)}a.btnlink{display:inline-block;background:var(--pri);color:#fff;padding:9px 16px;border-radius:8px;font-weight:600;text-decoration:none}.muted{color:#6b7280;font-size:13px}.q-content{font-size:28px;line-height:2.1;margin:14px 0}.q-content rt{font-size:.45em;color:#6b7280;font-weight:400}ruby{ruby-position:over}.progress{font-size:13px;color:#6b7280}.meter-track{height:10px;background:#eef0f4;border-radius:6px;overflow:hidden;margin:10px 0}.meter-bar{height:100%;width:0;background:var(--ok);transition:width .08s linear}.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}button i.fa-brands,button i.fa-regular,button i.fa-solid{margin-right:7px}.devinfo{font-size:13px;margin:8px 0}.devinfo td{padding:3px 12px 3px 0;border:none}.devinfo td:first-child{color:#6b7280;white-space:nowrap}.warn{color:var(--bad)}.good,.warn{font-weight:600}.good{color:var(--ok)}.rawjson{background:#0f172a;color:#d1e0ff;padding:12px;border-radius:8px;overflow:auto;font-size:11px;max-height:320px;margin:6px 0;white-space:pre}.analysis{margin:8px 0}.metrics{display:flex;flex-wrap:wrap;gap:10px;margin:8px 0 10px}.metric{flex:1 1;min-width:84px;background:#f8fafc;border:1px solid var(--bd);border-radius:10px;padding:8px 10px;text-align:center}.metric b{display:block;font-size:22px;line-height:1.1}.metric span{font-size:11px;color:#6b7280}.hypbox{background:#f8fafc;border:1px solid var(--bd);border-radius:8px;padding:8px 10px;margin:8px 0;font-size:14px;line-height:1.6}.lbl{display:inline-block;min-width:116px;font-size:11px;color:#6b7280}.infoline{font-size:13px;margin:8px 0}.warnpill{background:var(--bad)}.okpill,.warnpill{color:#fff;padding:1px 8px;border-radius:99px;font-size:11px}.okpill{background:var(--ok)}.chgrid{display:flex;flex-wrap:wrap;gap:8px}.ch{border:1px solid var(--bd);border-radius:10px;padding:8px 10px;min-width:116px;background:#fff}.ch.t-delete{border-color:var(--bad);background:#fff5f5}.ch.t-insert,.ch.t-repeat,.ch.t-replace{border-color:#f5a623;background:#fffaf0}.ch.t-oov{background:#f8fafc}.chtop{font-size:18px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}.chref{font-weight:700}.chhyp{font-size:12px;color:var(--bad)}.chsc{margin:4px 0 6px}.badge{font-size:10px;padding:1px 6px;border-radius:4px;color:#fff}.badge.bad{background:var(--bad)}.badge.warn{background:#f5a623}.badge.oov{background:#9ca3af}.pitchsvg{display:block;margin-top:4px}.sent{margin-bottom:14px}.sent-head{font-size:14px;font-weight:600;margin-bottom:6px}.legend{font-size:12px;color:#6b7280}label{display:inline-flex;align-items:center;gap:5px}label input[type=number]{padding:4px 6px;border:1px solid var(--bd);border-radius:6px}table{border-collapse:collapse;width:100%;font-size:14px}td,th{border:1px solid var(--bd);padding:6px 10px;text-align:left}.conv-stage{position:-webkit-sticky;position:sticky;top:41px;z-index:5;display:flex;justify-content:center;padding:8px 12px 0;background:#e8edf5;overflow:hidden}.talk-avatar{flex:none}.av{width:100%;height:100%;display:block;overflow:hidden}.av .skin{fill:#f2d2bc}.av .skin-sh{fill:#e5b99d}.av .hair{fill:#2b2624}.av .jacket{fill:#34466b}.av .lapel{fill:none;stroke:#27365a;stroke-width:3;stroke-linecap:round}.av .shirt{fill:#f7f8fb}.av .collar{fill:#fff;stroke:#cfd5e0;stroke-width:1.2;stroke-linejoin:round}.av .tie{fill:#4d6fc4}.av .tie-k{fill:#3f5eab}.av .ink{fill:#2a211e}.av .hl{fill:#fff}.av .lid{fill:none;stroke:#2a211e;stroke-width:2.3;stroke-linecap:round}.av .stroke{fill:none;stroke:#2a211e;stroke-width:3;stroke-linecap:round}.av .brow{fill:none;stroke:#2b2624;stroke-width:3.6;stroke-linecap:round}.av .nose{fill:none;stroke:#d39f84;stroke-width:2;stroke-linecap:round}.av .lip{fill:none;stroke:#9a5550;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round}.av .mouth{fill:#7a3036}.av .teeth{fill:#fff}.av .tongue{fill:#e48a8a}.av .blush{fill:#f2a0a0}.av .think{fill:#fff;stroke:#9aa3b5;stroke-width:1.6;animation:av-tdot 1.5s ease-in-out infinite}.av .av-anim{transform-box:view-box;transform-origin:120px 240px}.av[data-anim=breathe] .av-anim{animation:av-breathe 3.6s ease-in-out infinite}.av[data-anim=bob] .av-anim{animation:av-bob 2s ease-in-out infinite}.av[data-anim=lift] .av-anim{animation:av-lift 1.1s ease-in-out infinite}.av[data-anim=shake] .av-anim{animation:av-shake .34s ease-in-out infinite alternate}.av[data-anim=sway] .av-anim{animation:av-sway 3.4s ease-in-out infinite alternate}.av[data-anim=jump] .av-anim{animation:av-jump .55s ease-out 1}.av[data-anim=sink] .av-anim{animation:av-sink 3s ease-in-out infinite}.av[data-anim=fidget] .av-anim{animation:av-fidget 2.4s ease-in-out infinite alternate}@keyframes av-breathe{50%{transform:scale(1.006,.994)}}@keyframes av-bob{50%{transform:translateY(-1.5px)}}@keyframes av-lift{0%,to{transform:translateY(0)}40%{transform:translateY(-3px)}}@keyframes av-shake{0%{transform:rotate(-.9deg) translateY(-.5px)}to{transform:rotate(.9deg) translateY(.5px)}}@keyframes av-sway{0%{transform:rotate(-1deg)}to{transform:rotate(1deg)}}@keyframes av-jump{0%{transform:none}35%{transform:translateY(-5px) scale(1.015)}to{transform:none}}@keyframes av-sink{50%{transform:translateY(2px)}}@keyframes av-fidget{0%{transform:rotate(-.6deg) translateX(-.5px)}to{transform:rotate(.6deg) translateX(.5px)}}@keyframes av-tdot{0%,to{opacity:.2}40%{opacity:1}}@media (prefers-reduced-motion:reduce){.av .av-anim,.av .think{animation:none!important}}