/* ============================================================
   Spotty Design System — общая дизайн-система Mini Apps
   ------------------------------------------------------------
   Палитра: Spotty Brand (navy/gold/burgundy/sage)
     light = navy/gold на кремовом
     dark  = Oxford Blue + Spotty gold
   Источник палитры: app/templates/site/spotty_design_system.html
     (брендборк дизайнера — канонический источник цветов/шрифтов)

   Это общий слой для ВСЕХ мини-аппов (Grammar/Listening/Reading/Writing/
   Speaking/личный кабинет ученика) — токены + переиспользуемые MD3-компоненты
   (Top App Bar, кнопки, табы, чипы, карточки, snackbar, bottom sheet и т.д.).
   Секция-специфичные стили (компоновка экранов) держите в своём файле рядом,
   подключаемом ПОСЛЕ этого.

   Подключение:
     <link rel="stylesheet" href="/static/css/design-system/tokens.css">
   В HTML-файле также подключите шрифты — со своего домена, не с CDN:
     <link rel="stylesheet" href="/static/css/design-system/fonts.css">
   Иконки пока приходят из Google (своего woff2 у Material Symbols нет):
     <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" rel="stylesheet">

   Тема переключается атрибутом на <html>:
     <html data-theme="dark"> ... </html>
   Из JS — синхронизация с Telegram:
     document.documentElement.setAttribute('data-theme',
       Telegram.WebApp.colorScheme === 'dark' ? 'dark' : 'light');
   ============================================================ */

/* ============================================================
   1. SYSTEM TOKENS (M3 spec)
   ============================================================ */
:root {
  /* --- Color (Light) — Spotty navy/gold/burgundy/sage --- */
  --md-sys-color-primary: #1B2B4B;
  --md-sys-color-on-primary: #FDF8EF;
  --md-sys-color-primary-container: #F5EDD5;
  --md-sys-color-on-primary-container: #1B2B4B;

  --md-sys-color-secondary: #8B3A5A;
  --md-sys-color-on-secondary: #FFFFFF;
  --md-sys-color-secondary-container: #F5D6E2;
  --md-sys-color-on-secondary-container: #3A1424;

  --md-sys-color-tertiary: #4A7C59;
  --md-sys-color-on-tertiary: #FFFFFF;
  --md-sys-color-tertiary-container: #D4E8CF;
  --md-sys-color-on-tertiary-container: #16281B;

  --md-sys-color-error: #BA1A1A;
  --md-sys-color-on-error: #FFFFFF;
  --md-sys-color-error-container: #FFDAD6;
  --md-sys-color-on-error-container: #410E0B;

  /* Доменные семантические цвета (вне MD3 spec, но удобны) */
  --md-sys-color-success: #3B6B3B;
  --md-sys-color-on-success: #FFFFFF;
  --md-sys-color-success-container: #BCEEBB;
  --md-sys-color-on-success-container: #002106;

  --md-sys-color-warning: #7D5800;
  --md-sys-color-on-warning: #FFFFFF;
  --md-sys-color-warning-container: #FFDEAB;
  --md-sys-color-on-warning-container: #261A00;

  /* Surfaces — tonal hierarchy (cream).
     Шаги ramp специально заметные: тёплый крем-фон -> ощутимо более
     насыщенные tan-уровни для карточек/кнопок, иначе в светлой теме
     поверхности сливаются (крем-на-креме = нет глубины). */
  --md-sys-color-surface: #FAF8F3;
  --md-sys-color-on-surface: #1B2B4B;
  --md-sys-color-on-surface-variant: #4A5568;
  --md-sys-color-surface-dim: #E4DECF;
  --md-sys-color-surface-bright: #FDFCF9;
  --md-sys-color-surface-container-lowest: #FFFFFF;
  --md-sys-color-surface-container-low: #F3EFE5;
  --md-sys-color-surface-container: #ECE6D8;
  --md-sys-color-surface-container-high: #E3DCC9;
  --md-sys-color-surface-container-highest: #D9D1BB;

  /* Surface tint (для elevation overlay поверх поверхности) */
  --md-sys-color-surface-tint: var(--md-sys-color-primary);

  /* Outlines — variant заметно темнее фона, чтобы рамки читались */
  --md-sys-color-outline: #8A8676;
  --md-sys-color-outline-variant: #D2CBB7;

  /* Кольцо фокуса. Рисуется через outline с отступом, поэтому лежит НА фоне
     страницы, а не на заливке элемента: тёмно-синее кольцо остаётся видимым
     и вокруг синей залитой кнопки. На креме даёт 13:1. */
  --md-sys-color-focus-ring: #1B2B4B;

  /* Золото достижения — тело медали, её кромка и текст на ней.
     Первая версия была тёмной охрой с белым текстом: контраст держался, но
     на кремовом это читалось коричневым, а не золотом. Яркое золото на белой
     карточке само по себе даёт 2.13 — но границу медали держит не заливка,
     а кромка (5.37), и тогда тело может быть настоящим золотом, а текст на
     нём тёмно-коричневым: 6.19 на теле, 8.94 на блике. */
  --md-sys-color-achievement: #D8AC2B;
  --md-sys-color-achievement-deep: #8A6410;
  --md-sys-color-on-achievement: #402D00;

  /* Inverse (для snackbar) */
  --md-sys-color-inverse-surface: #0F1B32;
  --md-sys-color-inverse-on-surface: #FAFAF7;
  --md-sys-color-inverse-primary: #E4C87A;

  --md-sys-color-scrim: rgba(0, 0, 0, .32);

  /* --- Typography ---
     Заголовки и логотип теперь на одном шрифте (Nunito, реальный ассет из
     брендборка дизайнера — тот же, что и в wordmark "Spotty") — весь
     текстовый стек собран из шрифтов, которые реально предоставил дизайнер
     (data/Брендборд/материалы/Шрифты), без внешних допущений. */
  --md-ref-typeface-head: 'Nunito', system-ui, -apple-system, sans-serif;
  --md-ref-typeface-body: 'Golos Text', system-ui, -apple-system, sans-serif;
  --md-ref-typeface-mono: 'JetBrains Mono', ui-monospace, monospace;
  /* Шрифт логотипа — алиас на head, оставлен отдельным токеном для
     смысловой ясности мест использования (только там, где "Spotty" — текст). */
  --md-ref-typeface-logo: var(--md-ref-typeface-head);
  /* Alias — большинство существующих компонентов ссылаются на этот токен */
  --md-ref-typeface: var(--md-ref-typeface-body);

  /* --- Type scale (минимальный набор: headline/title/body/label) --- */
  --md-sys-typescale-headline-font: var(--md-ref-typeface-head);
  --md-sys-typescale-headline-size: 24px;
  --md-sys-typescale-headline-line-height: 32px;
  --md-sys-typescale-headline-weight: 700;

  --md-sys-typescale-title-font: var(--md-ref-typeface-head);
  --md-sys-typescale-title-size: 18px;
  --md-sys-typescale-title-line-height: 24px;
  --md-sys-typescale-title-weight: 600;

  --md-sys-typescale-body-font: var(--md-ref-typeface-body);
  --md-sys-typescale-body-size: 14px;
  --md-sys-typescale-body-line-height: 20px;
  --md-sys-typescale-body-weight: 400;

  --md-sys-typescale-label-font: var(--md-ref-typeface-body);
  --md-sys-typescale-label-size: 12px;
  --md-sys-typescale-label-line-height: 16px;
  --md-sys-typescale-label-weight: 500;

  /* --- Spacing scale (кратно 4px) --- */
  --md-sys-spacing-1: 4px;
  --md-sys-spacing-2: 8px;
  --md-sys-spacing-3: 12px;
  --md-sys-spacing-4: 16px;
  --md-sys-spacing-5: 20px;
  --md-sys-spacing-6: 24px;
  --md-sys-spacing-7: 32px;
  --md-sys-spacing-8: 40px;

  /* --- Shape (M3 corner scale) --- */
  --md-sys-shape-corner-none: 0;
  --md-sys-shape-corner-xs: 4px;
  --md-sys-shape-corner-s: 8px;
  --md-sys-shape-corner-m: 12px;
  --md-sys-shape-corner-l: 16px;
  --md-sys-shape-corner-xl: 28px;
  --md-sys-shape-corner-full: 9999px;

  /* --- Elevation (tonal + shadow) --- */
  --md-sys-elevation-1: 0 1px 2px rgba(0, 0, 0, .1), 0 1px 3px 1px rgba(0, 0, 0, .08);
  --md-sys-elevation-2: 0 1px 2px rgba(0, 0, 0, .1), 0 2px 6px 2px rgba(0, 0, 0, .08);
  --md-sys-elevation-3: 0 4px 8px rgba(0, 0, 0, .12), 0 1px 3px rgba(0, 0, 0, .14);
  --md-sys-elevation-4: 0 6px 10px rgba(0, 0, 0, .14), 0 2px 4px rgba(0, 0, 0, .12);

  /* --- Disabled --- */
  --md-sys-state-disabled-opacity: .38;
  --md-sys-state-disabled-container-opacity: .12;

  /* --- Motion (M3 spec) --- */
  --md-sys-motion-easing-emphasized: cubic-bezier(0.2, 0, 0, 1);
  --md-sys-motion-easing-emphasized-decelerate: cubic-bezier(0.05, 0.7, 0.1, 1);
  --md-sys-motion-easing-emphasized-accelerate: cubic-bezier(0.3, 0, 0.8, 0.15);
  --md-sys-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
}

[data-theme="dark"] {
  --md-sys-color-primary: #E4C87A;
  --md-sys-color-on-primary: #1B2B4B;
  --md-sys-color-primary-container: #243660;
  --md-sys-color-on-primary-container: #F5EDD5;

  --md-sys-color-secondary: #4FA3E8;
  --md-sys-color-on-secondary: #0F1B32;
  /* Фикс #1: secondary-container смещён, чтобы не совпадал с surface-container (#1B2B4B) */
  --md-sys-color-secondary-container: #2A3A5C;
  --md-sys-color-on-secondary-container: #C8E6FF;

  --md-sys-color-tertiary: #C48BA0;
  --md-sys-color-on-tertiary: #0F1B32;
  --md-sys-color-tertiary-container: #8B3A5A;
  --md-sys-color-on-tertiary-container: #FFD8E4;

  --md-sys-color-error: #FFB4AB;
  --md-sys-color-on-error: #690005;
  --md-sys-color-error-container: #93000A;
  --md-sys-color-on-error-container: #FFDAD6;

  --md-sys-color-success: #6BBF7B;
  --md-sys-color-on-success: #0F1B32;
  --md-sys-color-success-container: #1B3A1B;
  --md-sys-color-on-success-container: #BCEEBB;

  --md-sys-color-warning: #E4C87A;
  --md-sys-color-on-warning: #1B2B4B;
  --md-sys-color-warning-container: #5C4200;
  --md-sys-color-on-warning-container: #FFDEAB;

  /* Лестница переписана 2026-09-13. Прежняя давала первый шаг в 1.5 единицы
     светлоты (surface -> container-low) — карточка на нём не отделялась
     вовсе, — а потолок уходил на L*=27.9, из-за чего навий «высветлялся» и
     терял контраст с текстом.
     Мерить тёмные плоскости коэффициентом контраста бесполезно: на тёмном
     конце он сжимается, и заметно разные поверхности дают 1.1. Меряем
     светлотой. Ориентир — плеер чтения: карточка отрывается от фона на
     +8.4 L*. Здесь +8.2, при этом потолок 21.5 вместо 27.9. */
  --md-sys-color-surface: #0B1120;
  --md-sys-color-on-surface: #F2F0EA;
  /* Был #8A96A8 — на приподнятых поверхностях давал 3.96 и 3.36 при норме 4.5
     (аудит 2026-09-12). Осветлён до 5.13 на самой светлой из них; вторичным
     текст остаётся: основной на том же фоне даёт 13.5. */
  --md-sys-color-on-surface-variant: #B4C0D4;
  --md-sys-color-surface-dim: #070C18;
  --md-sys-color-surface-bright: #243354;
  --md-sys-color-surface-container-lowest: #070C18;
  --md-sys-color-surface-container-low: #111A2B;
  --md-sys-color-surface-container: #17223A;
  --md-sys-color-surface-container-high: #1D2A46;
  --md-sys-color-surface-container-highest: #243354;

  --md-sys-color-surface-tint: var(--md-sys-color-primary);

  --md-sys-color-outline: #6B7B96;
  /* Волосяная линия между ступенями. Границу карточки в тёмной теме несёт
     не она, а outline: разделять плоскости на тёмном должна граница, тон
     этого не вытягивает. */
  --md-sys-color-outline-variant: #2E3C5C;

  /* Кольцо фокуса — золото: на ночном синем даёт 8.6:1 */
  --md-sys-color-focus-ring: #E4C87A;

  /* На тёмном светлое золото наконец на своём месте: 8.6 против карточки. */
  /* На тёмном золото светлое, кромка — прежняя охра. */
  --md-sys-color-achievement: #E4C87A;
  --md-sys-color-achievement-deep: #C9A84C;
  --md-sys-color-on-achievement: #402D00;

  --md-sys-color-inverse-surface: #E8E4DC;
  --md-sys-color-inverse-on-surface: #1B2B4B;
  --md-sys-color-inverse-primary: #C9A84C;

  --md-sys-color-scrim: rgba(0, 0, 0, .55);
}

/* ============================================================
   2. BASE
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; }

html, body {
  margin: 0;
  padding: 0;
  font-family: var(--md-ref-typeface);
  background: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

a { color: var(--md-sys-color-primary); text-decoration: none; }

button { font-family: inherit; }

.material-symbols-outlined {
  font-family: 'Material Symbols Outlined';
  font-weight: 400;
  font-style: normal;
  font-size: 24px;
  line-height: 1;
  vertical-align: middle;
  user-select: none;
}

/* ============================================================
   3. COMPONENTS — Top App Bar
   ============================================================ */
.spotty-top-app-bar {
  height: 64px;
  padding: 0 4px;
  display: flex;
  align-items: center;
  gap: 4px;
  background: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
  flex: 0 0 auto;
}
.spotty-top-app-bar__title {
  font-family: var(--md-ref-typeface-head);
  font-size: 22px;
  line-height: 28px;
  font-weight: 600;
  margin-left: 4px;
  flex: 1;
}
.spotty-top-app-bar__subtitle {
  font-size: 12px;
  line-height: 16px;
  color: var(--md-sys-color-on-surface-variant);
  margin-left: 4px;
  margin-top: 2px;
}

/* Scrolled state — поднимается на elevation 2 (tonal + shadow) */
.spotty-top-app-bar--scrolled {
  background: var(--md-sys-color-surface-container);
  box-shadow: var(--md-sys-elevation-2);
}

/* ============================================================
   4. COMPONENTS — Icon Button (с поддержкой badge)
   ============================================================ */
.spotty-icon-button {
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface);
  background: transparent;
  border: 0;
  cursor: pointer;
  position: relative;
  transition: background-color .15s var(--md-sys-motion-easing-standard);
}
.spotty-icon-button:hover {
  background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);
}
.spotty-icon-button:active {
  background: color-mix(in srgb, var(--md-sys-color-on-surface) 12%, transparent);
}
.spotty-icon-button:disabled {
  color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
  cursor: not-allowed;
}

.spotty-badge {
  position: absolute;
  top: 8px;
  right: 10px;
  min-width: 16px;
  height: 16px;
  background: var(--md-sys-color-error);
  color: var(--md-sys-color-on-error);
  border-radius: var(--md-sys-shape-corner-full);
  font-size: 10px;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 4px;
  border: 2px solid var(--md-sys-color-surface);
}

/* ============================================================
   5. COMPONENTS — Buttons (filled / outlined / text)
   ============================================================ */
.spotty-button {
  height: 40px;
  padding: 0 24px;
  border-radius: var(--md-sys-shape-corner-full);
  border: 0;
  cursor: pointer;
  font-family: var(--md-ref-typeface);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .1px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  transition: background-color .15s var(--md-sys-motion-easing-standard);
}
.spotty-button:disabled {
  opacity: var(--md-sys-state-disabled-opacity);
  cursor: not-allowed;
}
.spotty-button .material-symbols-outlined { font-size: 18px; }

.spotty-button--filled {
  background: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.spotty-button--filled:hover:not(:disabled) {
  background: color-mix(in srgb, var(--md-sys-color-primary) 92%, var(--md-sys-color-on-primary));
}

.spotty-button--tonal {
  background: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}

.spotty-button--outlined {
  background: transparent;
  color: var(--md-sys-color-primary);
  border: 1px solid var(--md-sys-color-outline);
}
.spotty-button--outlined:hover:not(:disabled) {
  background: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
}

.spotty-button--text {
  background: transparent;
  color: var(--md-sys-color-primary);
  height: 36px;
  padding: 0 12px;
  font-size: 13px;
}
.spotty-button--text:hover:not(:disabled) {
  background: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
}

/* ============================================================
   6. COMPONENTS — Tabs (primary)
   ============================================================ */
.spotty-tabs {
  display: flex;
  background: var(--md-sys-color-surface);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  height: 48px;
  flex: 0 0 auto;
}
.spotty-tab {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  cursor: pointer;
  position: relative;
  color: var(--md-sys-color-on-surface-variant);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .1px;
  background: transparent;
  border: 0;
  padding: 0;
  font-family: inherit;
}
.spotty-tab--active { color: var(--md-sys-color-primary); }
.spotty-tab--active::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 64px;
  height: 3px;
  background: var(--md-sys-color-primary);
  border-radius: 3px 3px 0 0;
}

/* ============================================================
   7. COMPONENTS — Filter Chips
   ============================================================ */
.spotty-chip-row {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}

.spotty-chip {
  height: 32px;
  padding: 0 12px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  border-radius: var(--md-sys-shape-corner-s);
  border: 1px solid var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface-variant);
  background: transparent;
  font-family: var(--md-ref-typeface);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .1px;
  cursor: pointer;
  transition: background-color .12s var(--md-sys-motion-easing-standard);
}
.spotty-chip:hover:not(:disabled) {
  background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);
}
.spotty-chip--selected {
  background: var(--md-sys-color-secondary-container);
  border-color: transparent;
  color: var(--md-sys-color-on-secondary-container);
}
.spotty-chip .material-symbols-outlined { font-size: 18px; }
.spotty-chip:disabled { opacity: var(--md-sys-state-disabled-opacity); cursor: not-allowed; }

/* ============================================================
   8. COMPONENTS — Section Label
   ============================================================ */
.spotty-section-label {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .5px;
  text-transform: uppercase;
  margin: 8px 4px;
  color: var(--md-sys-color-on-surface-variant);
}

/* ============================================================
   9. COMPONENTS — Cards / List items
   ============================================================ */
/* Outlined card — основной паттерн для строк-вариантов и ДЗ */
.spotty-list-item {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  padding: 12px 16px;
  background: var(--md-sys-color-surface);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-m);
  margin-bottom: 8px;
  cursor: pointer;
  transition: background-color .12s var(--md-sys-motion-easing-standard);
}
.spotty-list-item:hover {
  background: var(--md-sys-color-surface-container-low);
}
.spotty-list-item__lead {
  width: 40px;
  height: 40px;
  flex: 0 0 40px;
  border-radius: var(--md-sys-shape-corner-full);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.spotty-list-item__lead--success { background: var(--md-sys-color-success-container); color: var(--md-sys-color-on-success-container); }
.spotty-list-item__lead--warning { background: var(--md-sys-color-warning-container); color: var(--md-sys-color-on-warning-container); }
.spotty-list-item__lead--error   { background: var(--md-sys-color-error-container);   color: var(--md-sys-color-on-error-container); }
.spotty-list-item__lead--accent  { background: var(--md-sys-color-tertiary-container); color: var(--md-sys-color-on-tertiary-container); }
.spotty-list-item__lead .material-symbols-outlined { font-size: 22px; }

.spotty-list-item__body { flex: 1; min-width: 0; }
.spotty-list-item__title {
  font-size: 16px;
  font-weight: 500;
  line-height: 24px;
  color: var(--md-sys-color-on-surface);
}
.spotty-list-item__supporting {
  font-size: 14px;
  line-height: 20px;
  color: var(--md-sys-color-on-surface-variant);
  margin-top: 2px;
}
.spotty-list-item__trailing {
  color: var(--md-sys-color-on-surface-variant);
  padding-top: 8px;
}

/* Filled tonal card — для акцентных блоков (ДЗ-баннер) */
.spotty-card-tonal {
  background: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
  border-radius: var(--md-sys-shape-corner-m);
  padding: 16px;
  display: flex;
  align-items: center;
  gap: 16px;
  cursor: pointer;
}
.spotty-card-tonal--primary {
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}

/* Filled card — surface-container-low с скруглением */
.spotty-card-filled {
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-l);
  padding: 16px;
}

/* ============================================================
   10. COMPONENTS — Linear Progress
   ============================================================ */
.spotty-progress {
  height: 4px;
  border-radius: 2px;
  background: var(--md-sys-color-surface-container-highest);
  overflow: hidden;
}
.spotty-progress__bar {
  height: 100%;
  background: var(--md-sys-color-primary);
  border-radius: 2px;
  transition: width .25s var(--md-sys-motion-easing-emphasized);
}

/* ============================================================
   11. COMPONENTS — Extended FAB
   ============================================================ */
.spotty-fab-extended {
  height: 56px;
  padding: 0 20px;
  border-radius: var(--md-sys-shape-corner-l);
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  display: inline-flex;
  align-items: center;
  gap: 12px;
  box-shadow: var(--md-sys-elevation-3);
  font-family: var(--md-ref-typeface);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .1px;
  border: 0;
  cursor: pointer;
}
.spotty-fab-extended .material-symbols-outlined { font-size: 24px; }

/* ============================================================
   12. COMPONENTS — Modal Navigation Drawer
   ============================================================ */
.spotty-scrim {
  position: absolute;
  inset: 0;
  background: var(--md-sys-color-scrim);
  /* Высокий z-index намеренно: drawer/bottom-sheet — модальные оверлеи и должны
     перекрывать любую хром-панель приложения (в т.ч. sticky-хедеры с
     собственным z-index), иначе клики по скриму/закрытию могут "проваливаться"
     под хедер и модалка визуально не будет закрываться. */
  z-index: 40;
  animation: spotty-scrim-fade-in .2s var(--md-sys-motion-easing-emphasized);
}

.spotty-drawer {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  width: 80%;
  max-width: 320px;
  background: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
  border-radius: 0 var(--md-sys-shape-corner-l) var(--md-sys-shape-corner-l) 0;
  z-index: 41;
  box-shadow: var(--md-sys-elevation-4);
  display: flex;
  flex-direction: column;
  animation: spotty-drawer-slide-in .3s var(--md-sys-motion-easing-emphasized-decelerate);
}
.spotty-drawer[hidden] { display: none; }

.spotty-drawer__header {
  padding: 16px;
  display: flex;
  align-items: center;
  gap: 12px;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}

.spotty-drawer__group-label {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: .5px;
  text-transform: uppercase;
  color: var(--md-sys-color-on-surface-variant);
  padding: 16px 28px 4px;
}

.spotty-drawer-item {
  display: flex;
  align-items: center;
  gap: 12px;
  height: 56px;
  padding: 0 16px;
  margin: 0 12px;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .1px;
  background: transparent;
  border: 0;
  width: calc(100% - 24px);
  text-align: left;
  font-family: inherit;
}
.spotty-drawer-item--active {
  background: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.spotty-drawer-item:hover:not(.spotty-drawer-item--active) {
  background: color-mix(in srgb, var(--md-sys-color-on-surface) 8%, transparent);
}
.spotty-drawer-item .material-symbols-outlined { font-size: 22px; }

.spotty-drawer__divider {
  height: 1px;
  background: var(--md-sys-color-outline-variant);
  margin: 8px 16px;
}

@keyframes spotty-scrim-fade-in {
  from { opacity: 0; } to { opacity: 1; }
}
@keyframes spotty-drawer-slide-in {
  from { transform: translateX(-100%); }
  to   { transform: translateX(0); }
}

/* ============================================================
   13. COMPONENTS — Snackbar (одиночные уведомления)
   ============================================================ */
.spotty-snackbar {
  position: fixed;
  left: 16px;
  right: 16px;
  bottom: calc(16px + env(safe-area-inset-bottom, 0px));
  margin: 0 auto;
  max-width: 480px;
  background: var(--md-sys-color-inverse-surface);
  color: var(--md-sys-color-inverse-on-surface);
  padding: 12px 8px 12px 16px;
  border-radius: var(--md-sys-shape-corner-xs);
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14px;
  line-height: 20px;
  box-shadow: var(--md-sys-elevation-3);
  z-index: 100;
  /* Анимация появления/исчезновения — JS тогглит .is-shown (см. shared/components/snackbar.js) */
  opacity: 0;
  transform: translateY(16px);
  transition: opacity .2s var(--md-sys-motion-easing-emphasized),
              transform .25s var(--md-sys-motion-easing-emphasized-decelerate);
}
.spotty-snackbar.is-shown {
  opacity: 1;
  transform: translateY(0);
}
.spotty-snackbar__text {
  flex: 1;
  min-width: 0;
}
.spotty-snackbar__action {
  color: var(--md-sys-color-inverse-primary);
  background: transparent;
  border: 0;
  font-weight: 600;
  cursor: pointer;
  padding: 6px 10px;
  height: 36px;
  border-radius: var(--md-sys-shape-corner-full);
  text-transform: uppercase;
  letter-spacing: .04em;
}
.spotty-snackbar__action:hover {
  background: color-mix(in srgb, var(--md-sys-color-inverse-on-surface) 10%, transparent);
}
.spotty-snackbar__close {
  background: transparent;
  border: 0;
  color: var(--md-sys-color-inverse-on-surface);
  width: 32px;
  height: 32px;
  border-radius: var(--md-sys-shape-corner-full);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  opacity: .8;
}
.spotty-snackbar__close:hover {
  opacity: 1;
  background: color-mix(in srgb, var(--md-sys-color-inverse-on-surface) 10%, transparent);
}
.spotty-snackbar__close .material-symbols-outlined { font-size: 18px; }

/* Семантические варианты */
.spotty-snackbar--error   { background: var(--md-sys-color-error);   color: var(--md-sys-color-on-error); }
.spotty-snackbar--success { background: var(--md-sys-color-success); color: var(--md-sys-color-on-success); }
.spotty-snackbar--error .spotty-snackbar__action,
.spotty-snackbar--error .spotty-snackbar__close,
.spotty-snackbar--success .spotty-snackbar__action,
.spotty-snackbar--success .spotty-snackbar__close { color: currentColor; }

/* ============================================================
   14. COMPONENTS — Bottom Sheet (Modal)
   ============================================================ */
.spotty-bottom-sheet {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  max-height: 80%;
  background: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
  border-radius: var(--md-sys-shape-corner-xl) var(--md-sys-shape-corner-xl) 0 0;
  z-index: 41;
  box-shadow: var(--md-sys-elevation-3);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  animation: spotty-bottom-sheet-slide-up .3s var(--md-sys-motion-easing-emphasized-decelerate);
}
.spotty-bottom-sheet[hidden] { display: none; }
.spotty-bottom-sheet__handle {
  width: 32px;
  height: 4px;
  background: var(--md-sys-color-on-surface-variant);
  border-radius: 2px;
  margin: 12px auto;
  opacity: .4;
}
.spotty-bottom-sheet__body {
  padding: 0 16px 24px;
  overflow-y: auto;
}

@keyframes spotty-bottom-sheet-slide-up {
  from { transform: translateY(100%); }
  to   { transform: translateY(0); }
}

/* ============================================================
   15. UTILITIES
   ============================================================ */
.spotty-disabled {
  opacity: var(--md-sys-state-disabled-opacity);
  pointer-events: none;
}

.spotty-divider {
  height: 1px;
  background: var(--md-sys-color-outline-variant);
  margin: 8px 0;
  border: 0;
}

/* Scrollbar — приглушённый, под поверхность */
.spotty-scroll {
  overflow-y: auto;
  scrollbar-width: thin;
  scrollbar-color: var(--md-sys-color-outline-variant) transparent;
}
.spotty-scroll::-webkit-scrollbar { width: 6px; }
.spotty-scroll::-webkit-scrollbar-thumb {
  background: var(--md-sys-color-outline-variant);
  border-radius: 3px;
}
.spotty-scroll::-webkit-scrollbar-track { background: transparent; }

/* ============================================================
   16. FOCUS — клавиатурная навигация
   ------------------------------------------------------------
   :focus-visible, а не :focus — кольцо появляется при навигации с
   клавиатуры и не мешает тапу и клику мышью.

   Кольцо рисуется outline'ом, а не box-shadow: outline не обрезается
   родителем с overflow: hidden, а таких у нас хватает (шторка, нижний
   лист, прокручиваемые списки). Отступ в 2px открывает полоску фона
   страницы между элементом и кольцом — благодаря ей кольцо читается
   и на залитой кнопке того же цвета.
   ============================================================ */
.spotty-icon-button:focus-visible,
.spotty-button:focus-visible,
.spotty-tab:focus-visible,
.spotty-chip:focus-visible,
.spotty-list-item:focus-visible,
.spotty-fab-extended:focus-visible,
.spotty-drawer-item:focus-visible,
.spotty-snackbar__action:focus-visible,
.spotty-snackbar__close:focus-visible {
  outline: 3px solid var(--md-sys-color-focus-ring);
  outline-offset: 2px;
}

/* Снэкбар лежит на инвертированной поверхности: там тёмное кольцо
   пропадает, поэтому берём инвертированный текстовый цвет. */
.spotty-snackbar__action:focus-visible,
.spotty-snackbar__close:focus-visible {
  outline-color: var(--md-sys-color-inverse-on-surface);
}

/* Выделение текста и каретка — тоже часть системы, а не браузера. */
::selection {
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
:root { caret-color: var(--md-sys-color-primary); }

/* ============================================================
   17. REDUCED MOTION
   ------------------------------------------------------------
   Переходы не выключаются в ноль: мгновенная смена состояния тоже
   информативна, а вот съедающее внимание движение — нет. Оставляем
   изменение цвета почти мгновенным, а сдвиги и въезды убираем.
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  .spotty-icon-button,
  .spotty-button,
  .spotty-tab,
  .spotty-chip,
  .spotty-list-item,
  .spotty-fab-extended,
  .spotty-drawer-item,
  .spotty-top-app-bar,
  .spotty-progress__bar {
    transition-duration: .01ms;
  }
  .spotty-drawer,
  .spotty-bottom-sheet,
  .spotty-snackbar {
    animation: none;
    transition: none;
  }
}
