/*
 * Drž Hubu — jeden stylesheet, žádný framework.
 *
 * Pravidla z design-specu, která se tu drží doslova:
 *   · rádius 0 všude, žádné stíny, žádné gradienty kromě šraf,
 *   · nikdy víc než dvě barvy naráz — žlutá a červená patří výhradně stupni 2 a 3,
 *   · barvu celé appky mění JEDINÝ atribut data-level na <body>, ne duplikované selektory.
 *     Komponenty čtou --bg / --fg / --dim a je jim jedno, na jakém stupni zrovna jsou.
 */

:root {
  --paper: #faf8f3;
  --ink: #111111;
  --level2: #ffd400;
  --level3: #d8261c;
  --fill: #ddd8ce;
  --muted: #55504a;
  --muted-line: #b8b2a6;

  --pad: 22px;
  --frame: 3px;
  /* Výšku lišty potřebuje i výpočet výšky .app na desktopu — proto proměnná. */
  --hazard-h: 16px;
}

/* ------------------------------------------------------------ stavové barvy */

body {
  --bg: var(--paper);
  --fg: var(--ink);
  --dim: var(--muted);
  --hazard-1: var(--ink);
  --hazard-2: var(--bg);
  --mez-color: var(--level3);
  --chart-bg: #ffffff;
  --chart-line: var(--ink);
  --chart-fill: rgba(17, 17, 17, 0.1);
}

body[data-level='2'] {
  --bg: var(--level2);
  /* Na žluté je i sekundární text plná černá — šedá by na ní byla špinavá. */
  --dim: var(--ink);
  --chart-bg: rgba(255, 255, 255, 0.55);
}

body[data-level='3'] {
  --bg: var(--level3);
  --fg: #ffffff;
  --dim: #ffffff;
  --hazard-2: var(--level2);
  --mez-color: var(--level2);
  --chart-bg: rgba(0, 0, 0, 0.12);
  --chart-line: #ffffff;
  --chart-fill: rgba(255, 255, 255, 0.25);
}

body[data-screen='paused'] {
  --bg: var(--fill);
  --hazard-2: var(--fill);
}

body[data-screen='denied'] {
  --hazard-1: var(--level3);
}

/* ------------------------------------------------------------------- základ */

*,
*::before,
*::after {
  box-sizing: border-box;
  border-radius: 0;
}

html {
  height: 100%;
}

body {
  margin: 0;
  height: 100dvh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: var(--bg);
  color: var(--fg);
  font-family: 'Archivo', system-ui, sans-serif;
  font-weight: 400;
  -webkit-text-size-adjust: 100%;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color 150ms ease-out,
    color 150ms ease-out;
}

h1,
h2,
p {
  margin: 0;
}

button {
  font: inherit;
  color: inherit;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
}

/*
 * Rám kolem šrafy i obsahu. Na mobilu vyplní displej a rámeček lemuje celou obrazovku;
 * na desktopu se z něj stane vystředěná cedule (viz responzivita).
 */
.frame {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  border: var(--frame) solid var(--fg);
  overflow: hidden;
}

/* Šrafovaná lišta — vždycky nejvýš uvnitř rámu, přes celou jeho šířku. */
.hazard {
  flex: none;
  height: var(--hazard-h);
  background: repeating-linear-gradient(45deg, var(--hazard-1) 0 12px, var(--hazard-2) 12px 24px);
}

.app {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  padding: 20px var(--pad) var(--pad);
  padding-bottom: max(var(--pad), env(safe-area-inset-bottom));
}

/* Třesení jen na stupni 3 a jen když si o ně uživatel neřekl opačně. */
@keyframes shake {
  0%,
  100% {
    transform: translateX(0);
  }
  25% {
    transform: translateX(-3px) rotate(-0.5deg);
  }
  75% {
    transform: translateX(3px) rotate(0.5deg);
  }
}

body[data-level='3'][data-screen='monitor'] .app {
  animation: shake 0.4s ease-in-out infinite;
}

@media (prefers-reduced-motion: reduce) {
  body[data-level='3'][data-screen='monitor'] .app {
    animation: none;
  }
  body {
    transition: none;
  }
}

/* -------------------------------------------------------------- typografie */

.display {
  /* Strop pro ui/fit-text.js. Šířku si dopočítá sám měřením nejdelšího slova, ale
     jak vysoký text ještě dává smysl, ví jen layout — proto to je tady. */
  --fit-max: 96px;
  font-weight: 900;
  line-height: 0.84;
  letter-spacing: -0.045em;
  /* Než fit doběhne. Ostrou hodnotu nastaví JS jako inline styl. */
  font-size: clamp(32px, 13vw, 74px);
  overflow-wrap: normal;
}

.kicker,
.row,
.steps-label,
.head-status,
.badge span:last-child {
  font-weight: 700;
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--dim);
}

.kicker--alert {
  color: var(--level3);
}

.prose {
  font-weight: 400;
  font-size: 14px;
  line-height: 1.55;
  color: var(--dim);
  text-wrap: pretty;
}

.note {
  font-weight: 700;
  font-size: 13px;
  line-height: 1.5;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--dim);
}

.footnote {
  text-align: center;
  font-size: 12px;
  color: var(--dim);
}

.mono {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  line-height: 1.6;
}

.mono--big {
  font-weight: 700;
  font-size: 22px;
}

.hint {
  font-size: 12px;
  line-height: 1.5;
  color: var(--muted);
}

.hint--warn {
  color: var(--level3);
  font-weight: 700;
}

/* ---------------------------------------------------------------- hlavička */

.head {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  border-bottom: 2px solid var(--fg);
  padding-bottom: 12px;
}

.wordmark {
  font-weight: 900;
  font-size: 15px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

.head-meta {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* „Dozor: prudič" se vejde do hlavičky až na širokém displeji; na mobilu tuhle
   informaci nese popisek u indikátoru stupňů. */
.head-status {
  display: none;
}

.chip {
  font-weight: 900;
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  border: 2px solid var(--fg);
  padding: 5px 10px;
  /* Hitbox nikdy pod 44 px — vizuálně zůstává malý, sahá přes ::after. */
  position: relative;
}

.chip::after {
  content: '';
  position: absolute;
  inset: -11px -4px;
}

.chip:hover,
.chip:focus-visible {
  background: var(--fg);
  color: var(--bg);
}

/* Před povolením mikrofonu není co nastavovat a žádný dozor ještě neběží. */
body[data-screen='boot'] .chip,
body[data-screen='permit'] .chip,
body[data-screen='denied'] .chip,
body[data-screen='boot'] .head-status,
body[data-screen='permit'] .head-status,
body[data-screen='denied'] .head-status {
  display: none;
}

/* ----------------------------------------------------------------- panely */

.panel {
  display: none;
  flex: 1;
  min-height: 0;
}

body[data-screen='permit'] .panel[data-for='permit'],
body[data-screen='denied'] .panel[data-for='denied'],
body[data-screen='monitor'] .panel[data-for='monitor'],
body[data-screen='paused'] .panel[data-for='paused'] {
  display: flex;
}

.panel--single {
  flex-direction: column;
  justify-content: space-between;
  gap: 20px;
  padding-top: 20px;
}

.stack {
  display: flex;
  flex-direction: column;
  gap: 20px;
  justify-content: center;
  flex: 1;
}

.stack--tight {
  flex: none;
  gap: 8px;
}

/* ------------------------------------------------------------------- boxy */

.box {
  border: 3px solid var(--fg);
  padding: 20px 18px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

body[data-level='3'] .box {
  border-width: 4px;
}

.box--alert {
  border-color: var(--level3);
}

.box--thin {
  border-width: 2px;
  padding: 14px;
  gap: 8px;
}

.box--hatched {
  background: repeating-linear-gradient(
    45deg,
    rgba(17, 17, 17, 0.06) 0 10px,
    transparent 10px 20px
  );
}

.box--row {
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  border-width: 2px;
  padding: 14px;
}

.badge {
  display: flex;
  align-items: center;
  gap: 10px;
  border: 2px solid var(--fg);
  padding: 12px;
}

.badge-mark {
  width: 14px;
  height: 20px;
  background: var(--fg);
  flex: none;
}

/* --------------------------------------------------------------- tlačítka */

.btn {
  display: block;
  width: 100%;
  text-align: center;
  font-weight: 900;
  font-size: 15px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 17px 8px;
  border: 2px solid var(--ink);
  color: var(--fg);
}

.btn--primary {
  background: var(--level3);
  color: #ffffff;
}

.btn--ink {
  background: var(--ink);
  color: var(--paper);
}

.btn:active {
  transform: translateY(1px);
}

/* ------------------------------------------------------- segmentový přepínač */

.segment {
  display: flex;
  border: 2px solid var(--fg);
}

.segment button {
  flex: 1;
  text-align: center;
  font-weight: 900;
  font-size: 13px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 13px 2px;
  color: var(--dim);
  min-height: 44px;
}

.segment button + button {
  border-left: 2px solid var(--fg);
}

.segment button[aria-checked='true'] {
  background: var(--fg);
  color: var(--bg);
}

/* --------------------------------------------------------- přepínač zap/vyp */

.toggle {
  width: 46px;
  height: 24px;
  border: 2px solid var(--ink);
  position: relative;
  flex: none;
}

.toggle::before {
  content: '';
  position: absolute;
  top: 2px;
  left: 2px;
  width: 18px;
  height: 16px;
  background: var(--fill);
}

.toggle[aria-checked='true']::before {
  left: auto;
  right: 2px;
  background: var(--ink);
}

.toggle::after {
  content: '';
  position: absolute;
  inset: -10px;
}

.toggle:disabled {
  opacity: 0.4;
  cursor: not-allowed;
}

/* ------------------------------------------------------------------ dozor */

/* padding-top: indikátor stupňů se nesmí lepit na čáru pod hlavičkou. */
.panel--monitor {
  flex-direction: column;
  gap: 14px;
  padding-top: 12px;
}

/*
 * Volné místo se dělí napůl mezi stavový box a graf. Obě krajní varianty byly horší:
 * když všechno dostal box, zůstala v něm kolem slova prázdná plocha; když všechno
 * dostal graf, byl z něj velký bílý obdélník. Půl na půl nevypadá prázdně ani jedno.
 */
.stage {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

/*
 * Stavový box vyplní všechno volné místo mezi indikátorem stupňů a grafem. Dřív se
 * jen vystředil kolem svého textu a nad ním i pod ním zůstala prázdná plocha —
 * tohle je jediné pravidlo, které tu díru zavírá, na mobilu i na desktopu.
 *
 * min-height: 0 je povinné: bez něj se box odmítne zmenšit pod svůj obsah a na
 * nízkém okně přeteče ven.
 */
/* min-height: 0 je povinné: bez něj se box odmítne zmenšit pod svůj obsah a na
   nízkém okně přeteče ven z rámu. */
.stage .box {
  flex: 1;
  min-height: 0;
}

/* Popisek zůstává nahoře u kraje jako na ceduli, samotné slovo se vystředí ve zbytku
   boxu. Kdyby se centrovala celá dvojice, vznikla by nad popiskem díra. */
.stage .display {
  margin-block: auto;
}

.steps {
  display: flex;
  align-items: center;
  gap: 6px;
}

.step {
  width: 26px;
  height: 8px;
  background: var(--fill);
}

body[data-level='2'] .step,
body[data-level='3'] .step {
  background: rgba(17, 17, 17, 0.25);
}

body[data-level='3'] .step {
  background: rgba(255, 255, 255, 0.35);
}

body[data-level='1'] .step[data-step='1'],
body[data-level='2'] .step[data-step='1'],
body[data-level='2'] .step[data-step='2'],
body[data-level='3'] .step {
  background: var(--fg);
}

.steps-label {
  padding-left: 6px;
  font-size: 10px;
}

/* -------------------------------------------------- dozor: graf a trpělivost */

.readout {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.patience,
.controls {
  flex: none;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

/* Ovládání ve spodní třetině: citlivost a pauza pod sebou, na dosah palce. */
.controls .btn {
  font-size: 14px;
  padding: 15px 8px;
}

.row {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  font-size: 11px;
  letter-spacing: 0.16em;
}

.row-value {
  color: var(--mez-color);
}

body[data-level='2'] .row-value {
  color: var(--ink);
}

.chart {
  position: relative;
  border: 2px solid var(--fg);
  background: var(--chart-bg);
  flex: 1;
  min-height: 130px;
  touch-action: none;
  cursor: ns-resize;
}

.chart canvas {
  display: block;
  width: 100%;
  height: 100%;
}

/* Mez: vodorovná čára přes celý graf, pozice z --mez (0 dole, 100 nahoře). */
.mez {
  position: absolute;
  left: 0;
  right: 0;
  top: calc((100 - var(--mez)) * 1%);
  height: 0;
  border-top: 3px solid var(--mez-color);
  transform: translateY(-1.5px);
  pointer-events: none;
}

.mez-tag {
  position: absolute;
  left: 6px;
  bottom: 4px;
  font-weight: 900;
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--mez-color);
  opacity: 0;
  transition: opacity 120ms;
}

.chart[data-dragging] .mez-tag {
  opacity: 1;
}

.grip {
  position: absolute;
  right: -2px;
  top: calc((100 - var(--mez)) * 1%);
  transform: translateY(-50%);
  width: 22px;
  height: 24px;
  background: var(--mez-color);
  border: 2px solid var(--ink);
}

/* Vizuálně 22×24, na dotek 44×44. */
.grip::after {
  content: '';
  position: absolute;
  inset: -10px -11px;
}

.grip:focus-visible {
  outline: 3px solid var(--fg);
  outline-offset: 3px;
}

/*
 * Trpělivost je to jediné, co dopředu říká, že se něco chystá — proto je výrazně
 * větší než ostatní ukazatele: tlustší rámeček, hrubší šrafa a čitelné procento.
 */
.patience .row {
  font-size: 12px;
}

/* Červená je vyhrazená mezi a stupni 3 — procento trpělivosti ji nesmí brát. */
.patience .row-value {
  color: var(--dim);
  font-weight: 900;
  font-size: 14px;
}

.gauge {
  height: 28px;
  border: 3px solid var(--fg);
  padding: 3px;
}

.gauge-fill {
  height: 100%;
  width: 0%;
  background: repeating-linear-gradient(45deg, var(--fg) 0 8px, transparent 8px 16px);
  transition: width 120ms linear;
}

/* --------------------------------------------------------------- responzivita */

/*
 * Jeden layout, dvě velikosti. Appka je na všech šířkách ten samý sloupec — hlavička,
 * stav, graf, trpělivost, pauza — jen se na větším okně zvětší a přestane se roztahovat.
 *
 * Předtím tu byly tři různé layouty (dva sloupce, plakát, mobil) a nic z toho na
 * desktopu nesedělo: graf se roztáhl do půlmetrového prázdna a stav se scvrkl na
 * proužek. Zvětšený mobil ve vystředěném rámu je věrnější tomu, co appka dělá —
 * je to cedule pověšená na zdi, ne dashboard.
 *
 * Pozadí zůstává přes celou plochu okna, aby stupeň 2 a 3 zalily celou obrazovku;
 * rámeček je jen kolem obsahu.
 */

@media (min-width: 720px) {
  :root {
    --pad: 30px;
    --hazard-h: 18px;
  }

  /*
   * Vyplnit výšku, šířku omezit. Rám roste s oknem do výšky (`flex: 1`), ale na šířku
   * se zastaví — přes celý monitor roztažený sloupec se nedá číst a graf by v něm byl
   * jen prázdná plocha. Šířka se přitom neustálí na jedné hodnotě: mezi 620 a 880 px
   * se škáluje s oknem, aby na 1280px displeji nezůstaly zbytečně široké okraje.
   */
  body {
    align-items: center;
    padding: clamp(14px, 2.5vh, 36px);
  }

  .frame {
    flex: 1;
    height: auto;
    width: clamp(620px, 62vw, 880px);
    max-width: 100%;
  }

  .app {
    padding-top: 24px;
  }

  .head {
    padding-bottom: 14px;
  }

  .wordmark {
    font-size: 17px;
  }

  .head-status {
    display: inline;
  }

  .display {
    --fit-max: 160px;
  }

  .box {
    padding: 24px 22px;
  }

  .prose,
  .note {
    font-size: 15px;
  }

  .btn {
    font-size: 16px;
    padding: 19px 8px;
  }

  .step {
    width: 32px;
    height: 9px;
  }

  .panel--monitor {
    padding-top: 16px;
    gap: 18px;
  }

  .gauge {
    height: 36px;
  }

  .patience .row {
    font-size: 13px;
  }

  .patience .row-value {
    font-size: 16px;
  }

  .segment button {
    font-size: 15px;
    padding: 16px 2px;
  }
}

/*
 * Nízké okno (laptop s malým oknem, tablet na šířku). Rám vyplní výšku a všechno se
 * stáhne, ať se sloupec vejde bez rolování — obrazovka se nikdy neroluje.
 */
/*
 * Nízké okno (rozdělená obrazovka, laptop na šířku, telefon naležato). Sloupec se
 * nikdy neroluje, takže se všechno musí vejít — a protože ovládání dole je to
 * poslední, co smí zmizet, škáluje se tady plynule s výškou okna přes clamp().
 * Pořadí obětí: nejdřív graf, pak vysvětlivka pod stavem, teprve nakonec velikost
 * slova. Rámeček a tlačítka zůstávají čitelné až dolů.
 */
@media (max-height: 700px) {
  .frame {
    flex: 1;
    height: auto;
    width: clamp(620px, 62vw, 880px);
    max-width: 100%;
  }

  .app {
    padding-top: clamp(10px, 1.8vh, 20px);
  }

  .head {
    padding-bottom: clamp(8px, 1.4vh, 14px);
  }

  .panel--monitor {
    padding-top: clamp(4px, 1vh, 14px);
    gap: clamp(8px, 1.4vh, 16px);
  }

  .stage,
  .readout {
    gap: clamp(8px, 1.2vh, 14px);
  }

  .box {
    padding: clamp(10px, 2vh, 22px) clamp(12px, 2vw, 22px);
  }

  /* Graf přestane růst a bere na sebe většinu úspory. */
  .readout {
    flex: none;
  }

  .chart {
    flex: none;
    height: clamp(56px, 16vh, 160px);
    min-height: 0;
  }

  .display {
    --fit-max: clamp(40px, 9vh, 96px);
  }

  .gauge {
    height: clamp(18px, 3.4vh, 30px);
  }

  .segment button {
    min-height: clamp(38px, 6vh, 46px);
    padding: clamp(8px, 1.6vh, 14px) 2px;
    font-size: 13px;
  }

  .btn {
    padding: clamp(10px, 2vh, 18px) 8px;
    font-size: 14px;
  }
}

/* Pod 560 px výšky už není na vysvětlivku pod stavem místo. */
@media (max-height: 560px) {
  #statusNote {
    display: none;
  }
}

/* ------------------------------------------------------------------- modaly */

/*
 * Nastavení i nahrávky jsou vystředěná cedule, ne panel vysunutý od kraje. Výška se
 * řídí obsahem a strop je výška okna — na telefonu to vyjde skoro na celou obrazovku,
 * na desktopu je to karta uprostřed.
 */
/*
 * `inset: 0` + `fit-content` + `margin: auto` je jediný způsob, jak dostat modální
 * dialog doprostřed a zároveň mu nechat výšku podle obsahu. Prohlížeče totiž modálnímu
 * dialogu ve svém UA stylu nastavují inset na 0 shora i zdola — s `height: auto` se
 * pak natáhne přes celé okno a pod obsahem zůstane prázdná plocha.
 */
.sheet {
  position: fixed;
  inset: 0;
  padding: 0;
  width: min(520px, calc(100% - 24px));
  max-width: 100%;
  max-height: calc(100dvh - 24px);
  height: fit-content;
  margin: auto;
  border: var(--frame) solid var(--ink);
  background: var(--paper);
  color: var(--ink);
  font-family: inherit;
  flex-direction: column;
}

.sheet[open] {
  display: flex;
}

.sheet::backdrop {
  background: rgba(17, 17, 17, 0.55);
}

.sheet-head {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 20px var(--pad) 12px;
  border-bottom: 2px solid var(--ink);
}

.sheet-head h2 {
  font-weight: 900;
  font-size: 26px;
  letter-spacing: -0.02em;
  text-transform: uppercase;
}

.sheet-close {
  font-weight: 900;
  font-size: 24px;
  line-height: 1;
  width: 44px;
  height: 44px;
}

.sheet-body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: 18px var(--pad);
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.sheet-foot {
  flex: none;
  display: flex;
  gap: 8px;
  padding: 12px var(--pad);
  padding-bottom: max(12px, env(safe-area-inset-bottom));
  border-top: 2px solid var(--ink);
}

.sheet-foot--info {
  justify-content: space-between;
  align-items: center;
}

/* „Zkouška zvuku" se na 360px musí vejít na jeden řádek. */
.sheet-foot .btn {
  font-size: 13px;
  padding: 16px 6px;
}

.field {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.rows {
  display: flex;
  flex-direction: column;
}

.opt {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px 0;
  border-top: 2px solid var(--ink);
}

.opt:last-child {
  border-bottom: 2px solid var(--ink);
}

.opt-name {
  font-weight: 700;
  font-size: 14px;
}

.opt--off .opt-name {
  color: var(--muted);
}

.tag {
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: var(--muted);
  color: var(--paper);
  padding: 3px 6px;
  margin-left: 6px;
  white-space: nowrap;
}

/* Tři stupně v nastavení */
.level-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  width: 100%;
  border: 2px solid var(--ink);
  padding: 10px 12px;
  min-height: 44px;
  text-align: left;
}

.level-row[data-level-row='2'] {
  background: var(--level2);
}

.level-row[data-level-row='3'] {
  background: var(--level3);
  color: #ffffff;
}

.level-name {
  display: flex;
  align-items: center;
  gap: 10px;
  font-weight: 900;
  font-size: 14px;
  text-transform: uppercase;
}

.level-num {
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  background: var(--ink);
  color: var(--paper);
  flex: none;
}

.level-row[data-level-row='2'] .level-num {
  color: var(--level2);
}

.level-row[data-level-row='3'] .level-num {
  background: #ffffff;
  color: var(--level3);
}

.level-action {
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  white-space: nowrap;
}

.level-row[data-level-row='1'] .level-action {
  color: var(--muted);
}

/* ------------------------------------------------------------- S9 nahrávky */

.sound {
  border: 2px solid var(--ink);
  padding: 12px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.sound[data-state='default'] {
  border-style: dashed;
  border-color: var(--muted-line);
}

.sound-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

.sound-name {
  font-weight: 900;
  font-size: 14px;
  text-transform: uppercase;
}

.sound-meta {
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--muted);
}

.wave {
  display: flex;
  align-items: flex-end;
  gap: 3px;
  height: 34px;
}

.wave span {
  flex: 1;
  background: var(--ink);
  min-height: 2px;
}

.sound[data-state='default'] .wave {
  display: none;
}

.sound-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.sound-actions button {
  flex: 1 1 0;
  min-width: 84px;
  min-height: 44px;
  text-align: center;
  font-weight: 900;
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  border: 2px solid var(--ink);
  padding: 9px 4px;
}

.sound-actions button.danger {
  color: var(--level3);
}

.sound-actions button[data-recording] {
  background: var(--level3);
  color: #ffffff;
}

.sound[data-state='default'] [data-act='play'],
.sound[data-state='default'] [data-act='delete'] {
  display: none;
}

.sound-hint {
  font-size: 12px;
  color: var(--muted);
}

.sound[data-state='own'] .sound-hint {
  display: none;
}

/* -------------------------------------------------------------------- toast */

.toast {
  position: fixed;
  left: 50%;
  bottom: 24px;
  transform: translateX(-50%);
  max-width: min(420px, calc(100% - 32px));
  background: var(--ink);
  color: var(--paper);
  border: 2px solid var(--ink);
  padding: 12px 16px;
  font-weight: 700;
  font-size: 13px;
  text-align: center;
  z-index: 10;
}

.toast[hidden] {
  display: none;
}
