:root { --bg: #f4f5f7; --card: #ffffff; --text: #1c1e21; --muted: #5f646b; --border: #dfe2e6; --accent: #1f5fa8; --ok: #1a7f37; --bad: #b42318; --warn-bg: #fff4e0; --warn: #8a5a00; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; color: var(--text); background: var(--bg); line-height: 1.45; } * { box-sizing: border-box; } body { margin: 0; } .app { max-width: 1100px; margin: 0 auto; padding: 16px 16px 48px; } .app-header h1 { margin: 8px 0 4px; font-size: 1.7rem; } .app-header p, .hint { color: var(--muted); margin: 0 0 14px; max-width: 75em; } .app-footer { color: var(--muted); font-size: 0.85rem; margin-top: 16px; } .card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px 16px; margin-bottom: 16px; } .card h2 { margin: 0 0 10px; font-size: 1.15rem; } .card.status { color: var(--muted); } .plot { display: block; width: 100%; background: #fff; } .line-plot { height: 170px; } .waveform-plot { height: 130px; margin-top: 6px; } .spectrogram-plot { height: 240px; } .spectrograms { display: grid; grid-template-columns: repeat(auto-fit, minmax(420px, 1fr)); gap: 8px; } .response-plots { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 8px 16px; margin-top: 8px; } .plot-label { font-size: 0.8rem; color: var(--muted); margin: 10px 0 2px; } .button-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .divider { width: 1px; height: 22px; background: var(--border); margin: 0 4px; } button { font: inherit; font-size: 0.9rem; padding: 6px 12px; border-radius: 6px; border: 1px solid var(--border); background: #fff; color: var(--text); cursor: pointer; } button:hover:not(:disabled) { background: #f0f2f5; } button:disabled { opacity: 0.5; cursor: default; } button.primary { background: var(--accent); border-color: var(--accent); color: #fff; } button.primary:hover:not(:disabled) { background: #184c87; } button.selected { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); font-weight: 600; } .playing-indicator { color: var(--muted); font-size: 0.9rem; min-width: 8em; } .view-controls { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; margin: 10px 0 2px; } .spacer { flex: 1; } button.small { font-size: 0.8rem; padding: 4px 10px; } .global-controls, .zoom-controls { display: flex; flex-wrap: wrap; gap: 10px 24px; align-items: center; margin: 6px 0; } .global-controls label, .zoom-controls label, .scrub { display: flex; align-items: center; gap: 8px; font-size: 0.9rem; } .global-controls label > span:first-child, .zoom-controls label > span:first-child, .scrub > span:first-child { white-space: nowrap; } .zoom-controls .grow { flex: 1; min-width: 260px; } .scrub { margin: 10px 0 4px; } .scrub input[type='range'] { flex: 1; max-width: 480px; } .wide-range { width: 220px; } .info { color: var(--muted); font-size: 0.85rem; white-space: nowrap; } select { font: inherit; font-size: 0.9rem; padding: 4px 6px; border-radius: 6px; border: 1px solid var(--border); background: #fff; } input[type='range'] { min-width: 80px; accent-color: var(--accent); } .slider-value { font: inherit; font-size: 0.85rem; width: 5.5em; padding: 2px 4px; border: 1px solid var(--border); border-radius: 4px; } .slider-unit { color: var(--muted); font-size: 0.85rem; white-space: nowrap; } .source-info { margin-top: 10px; font-size: 0.9rem; color: var(--muted); } .error { color: var(--bad); margin-top: 8px; font-size: 0.9rem; } .warning { background: var(--warn-bg); color: var(--warn); border-radius: 6px; padding: 8px 10px; margin: 8px 0; font-size: 0.9rem; }