:root {
  --bg: #f7f6f3;
  --panel: #ffffff;
  --text: #1f2328;
  --muted: #646b73;
  --line: #dcdad4;
  --accent: #8a3b12;
  --accent-soft: #f3e3d8;
  --sel: #1f6feb;
  --radius: 8px;
  --player-h: 230px;
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg: #16181b; --panel: #1f2226; --text: #e6e6e3; --muted: #9aa0a6;
    --line: #34383d; --accent: #e08a5a; --accent-soft: #3a2a20; --sel: #58a6ff;
  }
}
* { box-sizing: border-box; }
[hidden] { display: none !important; }
html, body { margin: 0; height: 100%; }
body { background: var(--bg); color: var(--text);
  font: 14px/1.45 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
a { color: var(--accent); }
button, select, input { font: inherit; color: inherit; }
button, select, input[type=text], input[type=number], input[type=search] {
  background: var(--panel); border: 1px solid var(--line); border-radius: 6px; padding: 4px 8px; }
button { cursor: pointer; }
button:hover { border-color: var(--accent); }
button.primary { background: var(--accent); color: #fff; border-color: var(--accent); }

.topbar { display: flex; align-items: baseline; gap: 12px; padding: 10px 16px;
  border-bottom: 1px solid var(--line); background: var(--panel); flex-wrap: wrap; }
.brand { font-weight: 700; font-size: 18px; text-decoration: none; letter-spacing: .04em; }
.brand-sub { color: var(--muted); font-size: 12px; }
.archive-name { font-weight: 600; }
.topnav { margin-left: auto; }

/* Archive picker */
.picker { max-width: 1100px; margin: 0 auto; padding: 24px 16px; }
.picker h1 { margin: 0 0 4px; }
.lead { color: var(--muted); margin-top: 0; }
.cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; }
.card { display: block; background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 16px; text-decoration: none; color: var(--text); }
.card:hover { border-color: var(--accent); }
.card h2 { font-size: 16px; margin: 0 0 4px; }
.card .meta { color: var(--muted); margin: 0 0 8px; font-size: 13px; }
.card .desc { margin: 0; font-size: 13px; }

/* Analysis page: SOM top left, player bottom left, list right */
.analysis-page { display: flex; flex-direction: column; height: 100vh; overflow: hidden; }
.tabs { display: none; }
.analysis { flex: 1; min-height: 0; display: grid; gap: 12px; padding: 12px;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  grid-template-rows: minmax(0, 1fr) var(--player-h);
  grid-template-areas: "som list" "player list"; }
.pane { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  min-height: 0; min-width: 0; }
.pane-som { grid-area: som; display: flex; flex-direction: column; padding: 8px; }
.pane-player { grid-area: player; padding: 10px 12px; overflow: auto; }
.pane-list { grid-area: list; display: flex; flex-direction: column; }

.toolbar { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; font-size: 13px; }
.toolbar label { display: inline-flex; gap: 4px; align-items: center; color: var(--muted); }
.toolbar select { max-width: 220px; color: var(--text); }
.msg { color: var(--muted); font-size: 12px; min-height: 0; }
#cv-msg:not(:empty) { margin-top: 4px; }
#cv-msg { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

.train-panel { border: 1px solid var(--line); border-radius: 6px; padding: 8px; margin-top: 6px;
  font-size: 13px; max-height: 45%; overflow: auto; }
.train-row { display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: center; }
.quick button { padding: 2px 6px; font-size: 12px; }
.train-features { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
  gap: 2px 12px; margin: 8px 0; }
.train-features .feat { display: flex; gap: 6px; align-items: center; white-space: nowrap; }
.train-features .feat span { overflow: hidden; text-overflow: ellipsis; flex: 1; }

.som-wrap { position: relative; flex: 1; min-height: 0; margin-top: 6px; }
#som { width: 100%; height: 100%; display: block; touch-action: none; user-select: none; }
#som .cell { stroke: var(--line); stroke-width: .5; }
#som .cell.unit-sel { stroke: var(--sel); stroke-width: 2.5; }
#som .dot { stroke: rgba(0,0,0,.55); cursor: pointer; }
#som .dot.sel { stroke: var(--sel); stroke-width: 3; }
#som .dot.dim { opacity: .15; }
#som .pie { cursor: pointer; }
#som .pie path { stroke: var(--panel); }
#som .pie-count { font-size: 10px; text-anchor: middle; dominant-baseline: central;
  pointer-events: none; fill: #111; font-weight: 600; paint-order: stroke; stroke: #fff; stroke-width: 2.5px; }
.tooltip { position: absolute; pointer-events: none; z-index: 5; background: var(--panel);
  border: 1px solid var(--line); border-radius: 6px; padding: 6px 8px; font-size: 12px;
  max-width: 320px; box-shadow: 0 4px 14px rgba(0,0,0,.15); }
.tooltip ul { margin: 4px 0 0; padding-left: 16px; }
.legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 12px; padding-top: 6px; }
.legend .sw { display: inline-block; width: 10px; height: 10px; border-radius: 50%;
  margin-right: 4px; vertical-align: -1px; border: 1px solid rgba(0,0,0,.3); }
.legend .bar { display: inline-block; width: 120px; height: 10px; vertical-align: -1px;
  margin: 0 4px; border: 1px solid var(--line); }

.list-head { display: flex; gap: 8px; align-items: center; padding: 8px; border-bottom: 1px solid var(--line);
  flex-wrap: wrap; }
#search { flex: 1; min-width: 160px; }
.count { color: var(--muted); font-size: 12px; white-space: nowrap; }
.chip { background: var(--accent-soft); border-color: var(--accent); font-size: 12px; }
.table-wrap { flex: 1; overflow: auto; }
table { border-collapse: collapse; width: 100%; font-size: 13px; }
thead th { position: sticky; top: 0; background: var(--panel); text-align: left; font-weight: 600;
  padding: 6px 8px; border-bottom: 1px solid var(--line); cursor: pointer; white-space: nowrap; }
tbody td.nowrap { white-space: nowrap; }
tbody td { padding: 5px 8px; border-bottom: 1px solid var(--line); vertical-align: top; }
tbody tr { cursor: pointer; }
tbody tr:hover { background: var(--accent-soft); }
tbody tr.noaudio td { color: var(--muted); }
tbody tr.sel { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
td .sw { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; }

.player-empty { color: var(--muted); }
.player h3 { margin: 0 0 2px; font-size: 15px; }
.player .sub { color: var(--muted); font-size: 12px; margin-bottom: 8px; }
.player audio, .player video { width: 100%; }
.player video, .player iframe { max-height: calc(var(--player-h) - 80px); }
.player iframe { width: 100%; aspect-ratio: 16 / 9; border: 0; }
.player .meta-grid { display: grid; grid-template-columns: max-content 1fr; gap: 0 10px;
  font-size: 12px; margin-top: 8px; }
.player .meta-grid dt { color: var(--muted); }
.player .meta-grid dd { margin: 0; }
.player .nomedia { color: var(--muted); font-size: 12px; font-style: italic; }

.mini { position: fixed; z-index: 20; width: 300px; max-width: calc(100vw - 16px);
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 8px 10px; box-shadow: 0 8px 28px rgba(0,0,0,.25); font-size: 13px; }
.mini .mini-head { display: flex; gap: 8px; align-items: start; }
.mini .mini-head strong { flex: 1; }
.mini audio { width: 100%; margin-top: 6px; }
.mini .close { border: 0; padding: 0 4px; font-size: 16px; line-height: 1; }

/* Phones and narrow tablets: tabs for map and list, player as a bar at the bottom */
@media (max-width: 900px) {
  :root { --player-h: auto; }
  .brand-sub { display: none; }
  .tabs { display: flex; gap: 4px; padding: 6px 12px 0; }
  .tab { flex: 1; border-radius: 6px 6px 0 0; }
  .tab.active { background: var(--accent); color: #fff; border-color: var(--accent); }
  .analysis { display: flex; flex-direction: column; padding: 0 8px 8px; gap: 8px; }
  .pane-som, .pane-list { display: none; flex: 1; }
  .pane-som.active, .pane-list.active { display: flex; }
  .pane-player { flex: 0 0 auto; max-height: 40vh; }
  .player .meta-grid { display: none; }
  .toolbar select { max-width: 150px; }
  .train-panel { max-height: 55%; }
}

/* Accounts and private collections */
.muted { color: var(--muted); }
form.inline { display: inline; }
button.link { background: none; border: 0; padding: 0; color: var(--accent); cursor: pointer; }
.topnav { display: flex; gap: 12px; align-items: baseline; }
.picker h1.section { margin-top: 32px; }
.card.mine { border-style: dashed; }
.card.new-collection { display: flex; flex-direction: column; gap: 8px; }
.card.new-collection label { display: flex; flex-direction: column; gap: 2px; font-size: 13px; color: var(--muted); }
.form-page { max-width: 460px; margin: 0 auto; padding: 24px 16px; }
.form-page form { display: flex; flex-direction: column; gap: 10px; }
.form-page label { display: flex; flex-direction: column; gap: 2px; font-size: 13px; color: var(--muted); }
.form-page label.check { flex-direction: row; gap: 8px; align-items: flex-start; color: var(--text); }
.form-page input[type=text], .form-page input[type=password], .form-page input[type=email] {
  background: var(--panel); border: 1px solid var(--line); border-radius: 6px; padding: 6px 8px; color: var(--text); }
.form-page .helptext, .form-page ul { font-size: 12px; color: var(--muted); }
.form-errors { color: #b42318; font-size: 13px; }
.prose li { margin-bottom: 8px; }
th.check, td.check { width: 28px; padding-right: 0; cursor: default; }
.selection-bar { display: flex; flex-wrap: wrap; gap: 6px 10px; align-items: center; padding: 6px 8px;
  border-bottom: 1px solid var(--line); background: var(--accent-soft); font-size: 13px; }
.selection-bar select { max-width: 220px; }

/* Analysis panel and expert menu */
.an-status { display: flex; flex-direction: column; gap: 4px; margin-bottom: 6px; }
.an-row { display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: center; }
.an-row strong { min-width: 90px; }
.progress { display: inline-block; width: 140px; height: 8px; border: 1px solid var(--line); border-radius: 4px; overflow: hidden; }
.progress span { display: block; height: 100%; background: var(--accent); }
.expert { margin-top: 6px; }
.expert summary { cursor: pointer; color: var(--muted); }
.an-params fieldset { border: 1px solid var(--line); border-radius: 6px; margin: 6px 0; padding: 6px 8px; }
.an-params legend { font-weight: 600; padding: 0 4px; }
.param-group { font-size: 12px; color: var(--muted); margin: 6px 0 2px; }
.param-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 12px; }
.param-grid label { display: flex; justify-content: space-between; gap: 8px; align-items: center; font-size: 12px; }
.param-grid label.changed span { color: var(--accent); font-weight: 600; }
.param-grid input[type=number] { width: 90px; }
.search-row { margin-top: 6px; }
.search-result { border-left: 3px solid var(--accent); padding: 4px 8px; margin: 6px 0; font-size: 12px; }
.search-result ol { margin: 4px 0; padding-left: 18px; }
.mini-table td { padding: 1px 8px 1px 0; border: 0; }

/* Timbre and pitch players */
.analysis.viz-on { --player-h: 470px; }
.viz-toggles { display: flex; gap: 14px; margin-top: 8px; font-size: 13px; }
.viz { margin-top: 8px; }
.viz-head { font-size: 13px; margin-bottom: 2px; }
.viz-plot { position: relative; cursor: crosshair; border: 1px solid var(--line); border-radius: 4px; background: var(--bg); }
.viz-plot canvas { display: block; width: 100%; }
.viz-cursor { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--text); opacity: .5; pointer-events: none; }
.viz-legend { display: flex; flex-wrap: wrap; gap: 4px 10px; margin: 4px 0; font-size: 12px; align-items: center; }
.viz-legend .sw { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 3px; vertical-align: -1px; }
.viz-legend .sw.dash { background: repeating-linear-gradient(90deg, var(--muted) 0 3px, transparent 3px 6px); height: 2px; }
.viz-chip { font-size: 11px; padding: 1px 6px; }
.viz-chip.off { opacity: .45; }
.viz-values { min-height: 1.2em; }
@media (max-width: 900px) {
  .analysis.viz-on .pane-player { max-height: 45vh; }
  .pane-som.active { min-height: 240px; }
}

/* Full-screen map */
body.som-max .pane-som { position: fixed; inset: 0; z-index: 15; display: flex; margin: 0;
  border-radius: 0; border: 0; padding: 10px 14px; background: var(--panel); }
body.som-max #btn-cv, body.som-max #btn-analysis, body.som-max #btn-train,
body.som-max #analysis-panel, body.som-max #train-panel, body.som-max #cv-msg { display: none !important; }
body.som-max #btn-max { font-weight: 600; }
.mini.hovercard { width: 380px; max-height: min(80vh, 640px); overflow: auto; }
.mini.hovercard video, .mini.hovercard iframe { width: 100%; margin-top: 6px; border: 0; }
.mini.hovercard iframe { aspect-ratio: 16 / 9; height: auto; }
.mini.hovercard .meta-grid { display: grid; grid-template-columns: max-content 1fr; gap: 0 10px;
  margin: 8px 0 0; font-size: 13px; }
.mini.hovercard .meta-grid dt { color: var(--muted); }
.mini.hovercard .meta-grid dd { margin: 0; overflow-wrap: anywhere; }
.mini .pin { display: none; font-size: 12px; }
.mini.hovercard.pinned .pin { display: inline; }
@media (max-width: 900px) {
  body.som-max .pane-som { padding: 6px 8px; }
  .mini.hovercard { left: 8px !important; right: 8px; top: auto !important; bottom: 8px; width: auto; max-height: 55vh; }
}

/* Archive picker in the top bar */
.archive-switch select { font-weight: 600; max-width: min(46vw, 360px); }
.visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* Overview: map top left plus component planes, all tiles the same size */
body.som-planes #som { position: absolute; left: 0; top: 18px; }
body.som-planes #btn-planes { font-weight: 600; }
.planes { position: absolute; inset: 0; pointer-events: none; }
.planes .plane { position: absolute; pointer-events: auto; }
.planes canvas { display: block; cursor: crosshair; border: 1px solid var(--line); box-sizing: content-box; }
.plane-head { display: flex; gap: 6px; align-items: baseline; height: 18px; font-size: 12px; overflow: hidden; }
.plane-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.plane-range { color: var(--muted); white-space: nowrap; }
.plane-x { border: 0; padding: 0 3px; font-size: 14px; line-height: 1; background: none; }
.plane-note { position: absolute; right: 0; top: 0; max-width: 40%; pointer-events: auto; }
#som .cell.unit-hover { stroke: var(--sel); stroke-width: 2.5; }
.plane-picker { max-height: 50vh; }
.plane-picker input[type=search] { width: 100%; max-width: 320px; margin: 6px 0; }
.plane-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 2px 12px; }
.plane-picker .close { margin-left: auto; border: 0; font-size: 16px; padding: 0 4px; }
body.som-planes .plane-picker { position: absolute; z-index: 8; top: 52px; right: 14px; width: min(640px, calc(100% - 28px));
  margin: 0; background: var(--panel); box-shadow: 0 8px 28px rgba(0,0,0,.25); }
#cv-msg.long { white-space: normal; }
/* Language switch, far right in the top bar */
.lang-switch label { display: inline-flex; gap: 4px; align-items: center; }
.lang-switch select { max-width: 9.5em; font-size: 13px; padding: 2px 4px; }
@media (max-width: 900px) { .lang-switch select { max-width: 5.5em; } }
/* Ten best-matching tonal systems (player) */
.scales-pop { position: relative; }
.scales-list { position: fixed; z-index: 25; width: min(860px, calc(100vw - 16px)); max-height: 70vh; overflow: auto;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 8px 10px;
  box-shadow: 0 8px 28px rgba(0,0,0,.25); font-size: 12px; }
.scales-list th { text-align: left; font-weight: 600; padding-right: 8px; }
.scales-list td { padding: 1px 8px 1px 0; vertical-align: top; }
.scales-list .close { margin-left: auto; border: 0; padding: 0 4px; font-size: 16px; background: none; }
.scales-list td.msg { white-space: nowrap; font-size: 11px; }
.train-kind { border: 0; padding: 0; margin: 0; display: flex; flex-wrap: wrap; gap: 4px 14px; align-items: center; }
.train-kind legend { float: left; padding: 0; margin-right: 6px; }
.train-kind label { display: inline-flex; gap: 4px; align-items: center; white-space: nowrap; }
.cb-zoom { margin-left: auto; display: inline-flex; gap: 2px; }
.cb-zoom button { padding: 0 6px; font-size: 12px; line-height: 18px; min-width: 22px; }
.cb-canvas { cursor: grab; touch-action: none; }
.cb-canvas:active { cursor: grabbing; }
.page-dialog { border: 1px solid var(--line); border-radius: 8px; padding: 16px 18px; max-width: min(460px, calc(100vw - 32px)); background: var(--panel); color: var(--text); box-shadow: 0 8px 30px rgba(0,0,0,.25); }
.page-dialog::backdrop { background: rgba(0,0,0,.3); }
.page-dialog p { margin: 0 0 14px; white-space: pre-line; line-height: 1.4; }
.page-dialog-btns { display: flex; justify-content: flex-end; gap: 8px; }
.viz-toggles { align-items: center; }
.viz-full-btn { margin-left: auto; font-size: 12px; padding: 1px 8px; }
.viz-full { position: fixed; inset: 0; z-index: 60; background: var(--panel); color: var(--text); display: flex; flex-direction: column; padding: 10px 16px 12px; overflow: auto; }
.viz-full-head { display: flex; gap: 10px; align-items: baseline; }
.viz-full-head .msg { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.viz-full-head .close { font-size: 20px; line-height: 1; padding: 0 8px; }
.viz-full-audio audio { width: 100%; margin: 6px 0 2px; }
.viz-full .viz-head { font-size: 14px; }
.viz-full .viz-legend { font-size: 13px; }
body.viz-full-open { overflow: hidden; }
@media (max-width: 700px) { .viz-full { padding: 8px; } }
.kultur-switch { font-size: 12px; white-space: nowrap; display: inline-flex; gap: 4px; align-items: center; }

/* Documentation (/doku/) */
.doku-index { max-width: 900px; margin: 0 auto; padding: 24px 16px; }
.doku-index .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; }
.doku-index .card strong { display: block; margin-top: 4px; }
.doku-num { color: var(--accent); font-weight: 600; }
.doku { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 24px; max-width: 1180px; margin: 0 auto; padding: 16px; }
.doku-nav { position: sticky; top: 12px; align-self: start; max-height: calc(100vh - 24px); overflow: auto; font-size: 14px; }
.doku-nav ol { list-style: none; padding-left: 0; margin: 8px 0; }
.doku-nav ol ol { padding-left: 14px; font-size: 13px; }
.doku-nav li { margin: 4px 0; }
.doku-nav li.active > a { font-weight: 600; }
.doku-nav a { text-decoration: none; }
.doku-home { font-weight: 600; color: var(--text); }
.doku-body { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 20px 28px; line-height: 1.6; min-width: 0; }
.doku-body h1 { margin-top: 0; }
.doku-body h2 { margin-top: 32px; border-bottom: 1px solid var(--line); padding-bottom: 4px; scroll-margin-top: 12px; }
.doku-body h3 { margin-top: 22px; }
.doku-body img { max-width: 100%; height: auto; border: 1px solid var(--line); border-radius: 6px; }
.doku-body figure { margin: 16px 0; }
.doku-body figcaption { font-size: 13px; color: var(--muted); }
.doku-body table { border-collapse: collapse; margin: 12px 0; font-size: 14px; display: block; overflow-x: auto; }
.doku-body th, .doku-body td { border: 1px solid var(--line); padding: 4px 8px; text-align: left; vertical-align: top; }
.doku-body code { font-size: 13px; background: var(--bg); padding: 1px 4px; border-radius: 4px; }
.doku-body .katex-display { overflow-x: auto; overflow-y: hidden; padding: 4px 0; }
.doku-body .refs li { margin-bottom: 6px; padding-left: 2em; text-indent: -2em; list-style: none; }
.doku-body .refs { padding-left: 0; }
.doku-note { background: var(--accent-soft); padding: 8px 12px; border-radius: 6px; }
.doku-body .hinweis { background: var(--bg); border-left: 3px solid var(--accent); padding: 8px 12px; }
.doku-stand { margin-top: 32px; font-size: 13px; }
.doku-pager { display: flex; justify-content: space-between; gap: 12px; margin-top: 12px; flex-wrap: wrap; }
@media (max-width: 800px) {
  .doku { grid-template-columns: 1fr; padding: 8px 16px; }
  .doku-nav { position: static; max-height: none; }
  .doku-body { padding: 16px; }
}
@media (max-width: 600px) { .topnav { flex-wrap: wrap; gap: 6px 12px; } }
