/* Shared Standard / Test design system. All capture and model logic lives in modules. */
:root{font-family:Inter,-apple-system,BlinkMacSystemFont,"Hiragino Sans","Microsoft YaHei",sans-serif;font-synthesis:none;color-scheme:dark;--bg:#0c1523;--surface:#142132;--raised:#1b2d41;--ink:#eef5fb;--muted:#9aafc5;--line:#30465c;--accent:#a5e8d9;--accent-ink:#102e30;--red:#ff8795;--radius:16px;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased}
html[data-theme=light]{color-scheme:light;--bg:#f1f5f8;--surface:#fff;--raised:#eaf1f5;--ink:#193048;--muted:#52697d;--line:#cfdee7;--accent:#177e75;--accent-ink:#fff;--red:#b5233b}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);min-width:0;min-height:100dvh}button,input,select{font:inherit}button,select,a,input{touch-action:manipulation;-webkit-tap-highlight-color:transparent}button,select{min-height:44px;border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--raised);color:var(--ink);font-size:13px;cursor:pointer;max-width:100%;min-width:0}button{white-space:normal;overflow-wrap:anywhere}select{width:100%;text-overflow:ellipsis}a{color:var(--accent);text-underline-offset:3px}button:disabled{opacity:.6;cursor:wait}:focus-visible{outline:3px solid var(--accent);outline-offset:3px}[hidden]{display:none!important}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}h1,h2,h3,p{margin-top:0;overflow-wrap:anywhere}h2{font-size:14px;line-height:1.5;font-weight:650;margin-bottom:14px}h3{font-size:12px;margin:18px 0 10px}.muted{color:var(--muted);font-size:11px;line-height:1.6}output,dd{font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.app{max-width:740px;margin:0 auto;padding:calc(26px + env(safe-area-inset-top)) 24px calc(24px + env(safe-area-inset-bottom))}.brand{display:flex;align-items:center;gap:12px;min-width:0}.brand-mark{color:var(--accent);width:30px;flex:none}.brand-mark svg{width:100%;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round}.wordmark{color:var(--muted);font-size:9px;font-weight:650;letter-spacing:2px}.wordmark span{display:block;color:var(--ink);font-size:25px;letter-spacing:-.7px;line-height:1.2}.version{margin-left:auto;color:var(--muted);font-size:10px;white-space:nowrap;border:1px solid var(--line);border-radius:7px;padding:6px 8px}.toolbar{display:flex;justify-content:flex-end;margin-top:16px;position:relative;z-index:10}.settings-menu>summary{list-style:none;display:flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;min-height:44px;border:1px solid var(--line);border-radius:10px;padding:10px 14px;background:var(--surface)}summary::-webkit-details-marker{display:none}.settings-content{position:absolute;right:0;top:52px;width:min(400px,calc(100vw - 48px));max-height:calc(100dvh - 140px);overflow:auto;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:20px;box-shadow:0 16px 50px #0004;overscroll-behavior:contain}.settings-group{display:grid;grid-template-columns:1fr 1fr;gap:12px}.language-switch,.theme-picker{display:flex;min-width:0;flex-direction:column;gap:7px;font-size:12px}.field-label,.theme-picker-label{color:var(--muted);font-size:12px}.setting-row,.overall-control{margin:16px 0 0;padding:0;border:0;width:100%}.setting-row>label,.version-switch>span{display:block;color:var(--muted);font-size:12px;margin-bottom:7px}.alert-tone-line{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:13px;min-height:44px}input[type=checkbox]{width:44px;height:44px;flex:none;accent-color:var(--accent);margin:0}input[type=range]{width:100%;height:44px;margin:0;accent-color:var(--accent);cursor:pointer;display:block}.alert-preview{display:flex;flex-direction:column;gap:7px}.alert-preview button{width:100%}#alert-preview-note{font-size:11px;line-height:1.55;color:var(--muted);margin:0}#alert-preview-status,#mic-select-status{font-size:11px;line-height:1.55;color:var(--muted);display:block;margin-top:6px}#alert-preview-status:empty{display:none}.version-options{display:grid;grid-template-columns:1fr 1fr;gap:8px}.version-options a{display:flex;align-items:center;justify-content:center;min-height:44px;padding:8px;font-size:12px;text-decoration:none;border:1px solid var(--line);border-radius:10px;overflow-wrap:anywhere}.version-options a[aria-current=page]{border-color:var(--accent);background:var(--raised)}.settings-links{display:flex;flex-direction:column;border-top:1px solid var(--line);margin-top:18px;padding-top:10px}.settings-links a{font-size:11px;min-height:44px;display:flex;align-items:center}.settings-links [aria-disabled=true]{opacity:.65}.standard-main{display:flex;flex-direction:column;align-items:center;padding:22px 0 0}.status{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px;letter-spacing:.5px}.status-dot{height:6px;width:6px;background:currentColor;border-radius:50%}.visual{--audio-level:0;width:100%;display:flex;justify-content:center;margin:22px 0}.icon-disc{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:68px;border-radius:14px;background:var(--accent);color:var(--accent-ink);border-color:transparent;font-size:15px;font-weight:650}.mic-icon{height:26px;width:26px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}.warning-icon{display:none}.loader{display:none;height:22px;width:22px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}body[data-state=loading] .loader,body[data-state=priming] .loader{display:block}body[data-state=loading] .mic-icon,body[data-state=priming] .mic-icon{display:none}body[data-state=listening] .status{color:var(--accent)}body[data-state=warning] .status,body[data-state=warning] #sound-type,body[data-state=warning] h1{color:var(--red)}body[data-state=warning] #mic-control{background:var(--raised);border-color:var(--red);color:var(--ink)}.message{text-align:center;width:100%}.message h1{font-size:20px;line-height:1.45;margin:0 0 8px;letter-spacing:-.4px}#description{font-size:12px;line-height:1.7;color:var(--muted);white-space:pre-line;margin-bottom:14px}#sound-type{font-size:19px;font-weight:650;margin:8px 0}.score{font-size:11px;color:var(--muted)}body[data-mode=standard] .score{display:none}#waveform{display:none!important}.current-result{width:100%;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);padding:20px 16px;margin-top:10px}.rolling-current{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;text-align:center;min-width:0}.rolling-current-label{font-size:11px;color:var(--muted)}.rolling-current-value{font-size:22px;line-height:1.4;font-weight:650;max-width:100%;overflow-wrap:anywhere}.rolling-current-value[data-warning=true]{color:var(--red)}.rolling-panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:18px;width:100%;margin:16px 0}.rolling-header{display:flex;align-items:center;justify-content:space-between;gap:10px}.rolling-header h2{margin:0}.rolling-state{font:10px ui-monospace,monospace;color:var(--accent);white-space:nowrap}#rolling-waveform{display:block;width:100%;height:130px;margin:12px 0 0}#rolling-events{color:var(--red);font-size:12px;line-height:1.5;margin:8px 0 0;min-height:18px}#rolling-note{font-size:10px;color:var(--muted);line-height:1.5;margin:8px 0 0}body[data-mode=standard] #rolling-note{display:none}.mic-source-panel{width:100%;color:var(--muted);font-size:11px;line-height:1.6;display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:0 0 18px}.mic-source-panel svg{flex:none}#mic-source-value{flex:1;min-width:0}.mic-source-note{font-size:10px;line-height:1.5;color:var(--muted);flex-basis:100%}footer{width:100%;text-align:center;padding:8px 0}footer p{color:var(--muted);font-size:10px;line-height:1.7;margin:4px 0}#cancel{min-height:44px;margin:0 0 8px}.sensitivity-line{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:12px;line-height:1.5}.sensitivity-line label{min-width:0;overflow-wrap:anywhere}.sensitivity-line output{font:12px ui-monospace,monospace;white-space:nowrap}.overall-control{padding-bottom:8px;border-bottom:1px solid var(--line)}.sensitivity-item{border-bottom:1px solid var(--line);padding:12px 0}.sensitivity-item:last-child{border:0}.effective-line{display:flex;align-items:center;justify-content:space-between;gap:10px;color:var(--muted);font:11px ui-monospace,monospace;margin-top:-6px}.reset-one{padding:4px;min-width:44px;min-height:44px;border:0;background:transparent;color:var(--accent);font-size:20px}.sensitivity-footer{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--line);padding-top:12px}.sensitivity-footer span{font-size:11px;color:var(--muted)}.sensitivity-footer button{width:100%}.debug-switch{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted)}.debug-panel>summary{font-size:14px;min-height:44px;padding:12px 0;cursor:pointer;font-weight:650}.debug-note{font-size:10px;line-height:1.6;color:var(--muted);margin:8px 0}.debug-status{display:grid;grid-template-columns:1fr 1fr;gap:7px;font-size:11px;line-height:1.5}.debug-status dt{color:var(--muted)}.debug-status dd{margin:0;min-width:0}table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:11px}th,td{padding:8px 4px;vertical-align:top;text-align:left;border-bottom:1px solid var(--line);overflow-wrap:anywhere}th{font-size:10px;font-weight:500;color:var(--muted)}td:last-child,th:last-child{width:39%;font-variant-numeric:tabular-nums}td small{display:block;color:var(--muted);font-size:9px;margin-top:3px}.debug-score{font:10px ui-monospace,monospace}.research-panel{margin-top:20px;border-top:1px solid var(--line);padding-top:18px}.research-metrics{display:grid;grid-template-columns:1fr 1fr;gap:0;margin:0}.metric{border-bottom:1px solid var(--line);padding:9px 6px;min-width:0}.metric dt{font-size:10px;color:var(--muted);line-height:1.5}.metric dd{margin:4px 0 0;font-size:12px;line-height:1.5}.warning-counts{display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:10px;line-height:1.5}.warning-counts span{display:flex;justify-content:space-between;gap:6px}.research-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px}.research-toolbar h3{margin:14px 0}.log-scroll{max-height:240px;overflow:auto}.log-scroll td:last-child{width:50%}.research-toolbar button{min-width:66px}noscript{font-size:12px;color:var(--red)}
@media(max-width:440px){.app{padding:20px 18px}.wordmark span{font-size:23px}.settings-content{width:calc(100vw - 36px);padding:16px}.rolling-panel{padding:14px}.current-result{padding:18px 12px}.rolling-current-value{font-size:19px}.message h1{font-size:19px}.brand{gap:10px}#rolling-waveform{height:104px}}
@media(prefers-reduced-motion:reduce){*{animation:none!important;scroll-behavior:auto!important}}
/* A 44px hit target around a compact switch. */
input[type=checkbox]{appearance:none;-webkit-appearance:none;position:relative;border:0;background:transparent;cursor:pointer}input[type=checkbox]::before{content:"";position:absolute;inset:11px 2px;background:var(--line);border-radius:20px}input[type=checkbox]::after{content:"";position:absolute;top:14px;left:5px;width:16px;height:16px;background:var(--surface);border-radius:50%}input[type=checkbox]:checked::before{background:var(--accent)}input[type=checkbox]:checked::after{left:23px;background:var(--accent-ink)}
#debug-target td:last-child,#debug-target th:last-child{width:22%;font:10px ui-monospace,monospace}
.last-warning-card{width:100%;padding:15px 18px;border-left:2px solid var(--line);margin:2px 0 18px;font-size:12px;color:var(--muted)}.last-warning-card h2{font-size:11px;font-weight:500;margin-bottom:7px}.last-warning-card output{color:var(--ink);line-height:1.6}
.mic-selection-name{display:block;overflow-wrap:anywhere;white-space:normal;font-size:11px;line-height:1.5;color:var(--muted);padding-top:6px}.research-toolbar h3{flex:1}.research-toolbar select{width:auto;max-width:45%;font-size:11px}.research-toolbar{flex-wrap:wrap}
/* V1.7.1: Restore the Standard microphone disc without changing the Test control. */
body[data-mode=standard] .visual{position:relative;isolation:isolate;display:grid;place-items:center;width:192px;height:192px;margin:22px auto;--audio-level:0}
body[data-mode=standard] .visual::before,body[data-mode=standard] .visual::after{content:"";position:absolute;pointer-events:none;border:1px solid var(--accent);border-radius:50%;z-index:0;transition:transform 100ms ease-out,opacity 100ms ease-out}
body[data-mode=standard] .visual::before{inset:0;opacity:.20;transform:scale(calc(1 + var(--audio-level,0) * .23))}
body[data-mode=standard] .visual::after{inset:25px;opacity:.38;transform:scale(calc(1 + var(--audio-level,0) * .34))}
body[data-mode=standard] .visual .icon-disc{position:relative;z-index:1;flex:none;width:132px;height:132px;min-height:132px;aspect-ratio:1;border-radius:50%;padding:0;gap:0;background:linear-gradient(145deg,var(--raised),var(--surface));border:1px solid var(--line);color:var(--accent);box-shadow:0 0 calc(24px + var(--audio-level,0) * 36px) color-mix(in srgb,var(--accent) 12%,transparent);transition:box-shadow 100ms ease-out}
body[data-mode=standard] .visual .mic-icon{width:48px;height:52px;stroke-width:1.8}
body[data-mode=standard] .visual .warning-icon{width:62px;height:62px;fill:none;stroke:var(--red);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
body[data-mode=standard][data-state=warning] .visual .mic-icon{display:none}
body[data-mode=standard][data-state=warning] .visual .warning-icon{display:block}
body[data-mode=standard][data-state=warning] .visual .icon-disc{color:var(--red);border-color:var(--red);background:var(--raised);box-shadow:none}
body[data-mode=standard][data-state=warning] .visual::before,body[data-mode=standard][data-state=warning] .visual::after{border-color:var(--red)}
body[data-mode=standard] #action-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
/* Both modes: restore the red recording-status pulse beside the status text. */
.status-dot{flex:none;background:var(--muted)}
body[data-state=listening] .status-dot{background:#e54855;animation:tsg-status-pulse 1.2s ease-in-out infinite}
body[data-state=warning] .status-dot{background:var(--red);animation:none}
@keyframes tsg-status-pulse{0%,100%{opacity:1;box-shadow:0 0 0 0 rgb(229 72 85 / .25)}50%{opacity:.45;box-shadow:0 0 0 5px rgb(229 72 85 / 0)}}
@media(max-height:740px){body[data-mode=standard] .visual{width:160px;height:160px;margin:12px auto}body[data-mode=standard] .visual::after{inset:20px}body[data-mode=standard] .visual .icon-disc{width:114px;height:114px;min-height:114px}}
@media(prefers-reduced-motion:reduce){body[data-state=listening] .status-dot{animation:none;opacity:1;box-shadow:none}body[data-mode=standard] .visual::before,body[data-mode=standard] .visual::after,body[data-mode=standard] .visual .icon-disc{transform:none;transition:none}}
