/* ════════════════════════════════════════════════════════════════════
   LEVEL SELECTION — the one content/level picker, used everywhere the
   student chooses what to play: the Πίνακας Παιχνιδιών, the γραμματική
   ασκήσεις (αρχαία + λατινικά), the PvP / Live arena content step.

   Four layers live here:

     1. THEME     — the component names its own semantic tokens and then
                    resolves every one of them from the site's existing
                    theme tokens (--bg, --card, --fg, --muted, --line,
                    --sink, --ca …). There is not a single literal colour
                    below, so the screen wears whichever of the ~40
                    palettes the app is in — the light alabaster shell and
                    the dark game overlays alike — with nothing to
                    re-render on a theme change.

     2. COMPONENT — the .ls-* styles themselves (js/level-select.js):
                    view 1 (hero · κατηγορίες rail · επίπεδα) and view 2
                    (τρόπος παιχνιδιού · χρόνος · ζωές · έναρξη).

     3 + 4        — the two older selection surfaces (.gpx-* game pickers,
                    and the .ls-scope screens: Live setup + the «Διάλεξε
                    ύλη» mix picker) re-skinned into the same language, so
                    a student crossing between them sees one screen.

   GREEK TYPOGRAPHY: no text-transform:uppercase on Greek anywhere below.
   Greek uppercased by CSS keeps its tonos («ΟΡΙΣΤΙΚΉ», «ΧΡΌΝΟΣ»), so every
   label renders in its authored case and earns its emphasis from weight,
   size and letter-spacing instead. The one uppercase left is «+ MIX», a
   fixed Latin string with nothing to lose.
   ════════════════════════════════════════════════════════════════════ */

/* ─── 1 · THEME ────────────────────────────────────────────────────────
   Declared on the component roots, NOT on :root — the site's tokens live
   on the .theme-* class the app puts on #sym-home and <body>, which is
   BELOW :root. Aliasing up there would resolve every var() to a fallback
   and the picker would stay alabaster-coloured in every palette.

   Derived tones use color-mix against --fg rather than a literal, so "one
   step quieter" resolves correctly on light AND dark palettes: on
   alabaster it darkens toward the ink, on hearth it lifts toward cream.
   That is also what keeps the small meta text at AA in both directions —
   the raw --muted alone is ~3.9:1 on white. */
.ls-root,
.ls-scope,
.gpx-pick {
  --ls-bg:          var(--bg);
  --ls-surface:     var(--card);
  --ls-surface-2:   var(--raise);
  --ls-sink:        var(--sink);
  --ls-line:        var(--line);
  --ls-line-soft:   var(--line-soft);
  --ls-line-bold:   var(--line-bold);
  --ls-ink:         var(--fg);
  --ls-mut:         color-mix(in srgb, var(--muted) 60%, var(--fg));
  --ls-mut-2:       color-mix(in srgb, var(--muted) 70%, var(--fg));
  /* --ca is the per-screen accent the shell already sets (.has-accent);
     with none set the picker falls back to the theme's own terracotta. */
  --ls-accent:      var(--ca, var(--terra));
  --ls-accent-2:    color-mix(in srgb, var(--ca, var(--terra)) 62%, var(--fg));
  /* The accent as a BACKGROUND that carries text. The raw accent is a
     mid-tone: cream on it lands around 3:1, which is fine behind an icon
     and not fine behind «Έναρξη» or a 12px pill. Deepening it toward
     --sym-ink — the one token every palette, light or dark, keeps dark —
     puts the pairing at ~4.6-4.9:1 without inventing a colour. */
  --ls-accent-solid: color-mix(in srgb, var(--ca, var(--terra)) 72%, var(--sym-ink));
  --ls-on-accent:   var(--sym-cream);
  --ls-gold:        var(--gold);
  /* gold is a heading colour: legible at 21px+, thin at 12px, and the raw
     token lands at 2.7:1 behind a 36px title on alabaster. This is the same
     hue with enough ink in it to clear AA at 12.5px — measured, not guessed. */
  --ls-gold-ink:    color-mix(in srgb, var(--gold) 74%, var(--fg));
  --ls-ok:          var(--sage);
  --ls-danger:      var(--terra-dk);
  --ls-font-display: var(--serif);
  --ls-font-ui:      var(--sans);
}

/* ─── 2 · COMPONENT ──────────────────────────────────────────────────── */
.ls-root { font-family: var(--ls-font-ui); color: var(--ls-ink); line-height: 1.5; -webkit-font-smoothing: antialiased; }
.ls-root *, .ls-root *::before, .ls-root *::after { box-sizing: border-box; }
/* :where() so this contributes ZERO specificity — a plain `.ls-root button`
   selector is (0,2,0) and quietly beat every single-class rule below it,
   which is how «Έναρξη» ended up with body ink instead of its own on-accent
   colour. */
:where(.ls-root) button { font-family: inherit; color: inherit; }
.ls-fade { animation: ls-f .28s ease; }
@keyframes ls-f { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  .ls-fade { animation: none; }
  .ls-root * { transition: none !important; }
}

/* Keyboard focus is never invisible here: every control is a real
   <button>, and every one of them shows the same ring. */
.ls-root :focus-visible {
  outline: 2px solid var(--ls-accent);
  outline-offset: 2px;
  border-radius: 12px;
}

/* ── top bar ────────────────────────────────────────────────────────
   View 1 embedded in a screen has none (the page header already carries
   the back pill). View 2 always draws one, because it is a state and not
   a route: the browser's own back would leave the screen entirely. */
.ls-bar { display: flex; align-items: center; gap: 14px; margin-bottom: 16px; flex-wrap: wrap; }
.ls-bar__t {
  font-family: var(--ls-font-display); font-weight: 700; font-size: 16.5px;
  color: var(--ls-gold-ink); min-width: 0; overflow-wrap: anywhere;
}
.ls-back {
  display: inline-flex; align-items: center; gap: 7px; min-height: 44px;
  border: 1px solid var(--ls-line); background: var(--ls-sink); color: var(--ls-mut);
  border-radius: 999px; padding: 8px 16px; font-size: 13.5px; font-weight: 700;
  letter-spacing: .02em; cursor: pointer; transition: .14s;
}
.ls-back:hover { color: var(--ls-ink); border-color: var(--ls-line-bold); }
.ls-back__ic { display: inline-flex; width: 16px; height: 16px; }
.ls-back__ic svg { width: 16px; height: 16px; }

.ls-wrap { max-width: 980px; margin: 0 auto; padding: 4px 0 24px; }

/* ── hero ───────────────────────────────────────────────────────────── */
.ls-hero { text-align: center; margin-bottom: 18px; }
.ls-badge {
  width: 56px; height: 56px; border-radius: 16px; margin: 0 auto 12px;
  display: grid; place-items: center;
  background: var(--ls-accent-solid); color: var(--ls-on-accent);
}
.ls-badge svg { width: 28px; height: 28px; }
.ls-hero__t {
  font-family: var(--ls-font-display); font-weight: 700; line-height: 1.1;
  font-size: clamp(24px, 4vw, 36px); color: var(--ls-gold-ink); margin: 0;
  overflow-wrap: anywhere;
}
.ls-hero__s { color: var(--ls-mut); font-size: 15px; font-style: italic; margin: 2px 0 0; }
.ls-hero__b { color: var(--ls-mut); font-size: 14px; max-width: 560px; margin: 8px auto 0; line-height: 1.55; }
.ls-share {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: 44px; margin-top: 14px; border: 1px solid var(--ls-line);
  background: var(--ls-sink); color: var(--ls-ink); border-radius: 999px;
  padding: 9px 18px; font-size: 13.5px; font-weight: 700; cursor: pointer; transition: .14s;
}
.ls-share:hover { border-color: var(--ls-accent); color: var(--ls-accent-2); }
.ls-ic { display: inline-flex; align-items: center; }
.ls-ic svg { width: 16px; height: 16px; }
.ls-prog { display: flex; align-items: center; gap: 12px; max-width: 520px; margin: 16px auto 0; }
.ls-track { flex: 1; height: 6px; border-radius: 6px; background: color-mix(in srgb, var(--ls-ink) 12%, transparent); overflow: hidden; }
.ls-track b { display: block; height: 100%; border-radius: 6px; background: linear-gradient(90deg, var(--ls-accent-2), var(--ls-accent-solid)); }
.ls-prog small { font-size: 12.5px; font-weight: 700; color: var(--ls-mut-2); white-space: nowrap; }

/* ── two columns ─────────────────────────────────────────────────────
   minmax(0,1fr) on the panel, not 1fr: a 43-row Λατινικά list with long
   Greek titles would otherwise widen the track and push the page into a
   horizontal scroll on a phone. */
.ls-cols { display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 18px; margin-top: 22px; align-items: start; }
@media (max-width: 720px) { .ls-cols { grid-template-columns: minmax(0, 1fr); } }

.ls-side {
  align-self: start; border: 1px solid var(--ls-line-soft);
  background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface));
  border-radius: 16px; padding: 12px; min-width: 0;
}
.ls-lbl {
  font-size: 11px; letter-spacing: .1em; color: var(--ls-mut-2);
  font-weight: 800; padding: 6px 8px 10px;
}
/* The rail can be the whole shared content catalog (56 packs today, more
   next term), so it scrolls inside itself instead of running the page. */
.ls-catlist { max-height: min(62vh, 560px); overflow-y: auto; overflow-x: hidden; padding-right: 2px; }
@media (max-width: 720px) { .ls-catlist { max-height: 300px; } }
.ls-grp {
  font-size: 10.5px; letter-spacing: .1em; font-weight: 800; color: var(--ls-mut-2);
  padding: 12px 8px 5px; position: sticky; top: 0; z-index: 1;
  background: var(--ls-surface); overflow-wrap: anywhere;
}
.ls-grp:first-child { padding-top: 2px; }
.ls-cat {
  width: 100%; text-align: left; border: none; background: none; border-radius: 12px;
  padding: 9px 11px; min-height: 48px; cursor: pointer; transition: .14s;
  display: flex; align-items: center; gap: 10px; margin-bottom: 2px;
}
.ls-cat:hover { background: color-mix(in srgb, var(--ls-ink) 5%, transparent); }
.ls-cat.on { background: color-mix(in srgb, var(--ls-accent) 14%, transparent); }
.ls-cat__ic { flex: none; font-size: 17px; line-height: 1; width: 22px; text-align: center; }
.ls-cat__m { flex: 1; min-width: 0; }
.ls-cat__m b {
  font-family: var(--ls-font-display); font-size: 15.5px; font-weight: 700;
  color: var(--ls-ink); display: block; line-height: 1.2; overflow-wrap: anywhere;
}
.ls-cat.on .ls-cat__m b { color: var(--ls-accent-2); }
.ls-cat__m small { font-size: 11.5px; color: var(--ls-mut-2); font-weight: 600; display: block; overflow-wrap: anywhere; }
.ls-cat__lock { flex: none; display: inline-flex; color: var(--ls-mut-2); }
.ls-cat__lock svg { width: 16px; height: 16px; }
.ls-ring {
  width: 26px; height: 26px; flex: none; border-radius: 50%; display: grid; place-items: center;
  background: conic-gradient(var(--ls-accent) calc(var(--p) * 3.6deg), color-mix(in srgb, var(--ls-ink) 10%, transparent) 0);
}
.ls-ring b {
  width: 20px; height: 20px; border-radius: 50%; background: var(--ls-surface);
  display: grid; place-items: center; font-size: 9.5px; font-weight: 800; color: var(--ls-mut-2);
}
.ls-cat.done .ls-ring b { color: var(--ls-ok); }
.ls-cat--custom { border: 1.5px dashed var(--ls-line); margin-top: 10px; }
.ls-cat--custom .ls-cat__m b { color: var(--ls-accent-2); }
.ls-cat--custom .ls-cat__ic { display: inline-flex; color: var(--ls-accent-2); }
.ls-cat--custom .ls-cat__ic svg { width: 17px; height: 17px; }

/* ── numbered level rows ─────────────────────────────────────────────
   Authored case throughout — see the Greek note at the top of the file. */
.ls-panel { min-width: 0; }
.ls-phead { display: flex; align-items: baseline; gap: 10px; margin-bottom: 13px; padding: 0 2px; flex-wrap: wrap; }
.ls-phead h2 { font-family: var(--ls-font-display); font-weight: 700; font-size: 21px; margin: 0; overflow-wrap: anywhere; }
.ls-phead small { color: var(--ls-mut-2); font-size: 13px; font-weight: 700; white-space: nowrap; }
.ls-empty { color: var(--ls-mut-2); font-size: 13.5px; padding: 8px 2px; }
.ls-levels { display: flex; flex-direction: column; gap: 9px; }
.ls-lv {
  width: 100%; text-align: left; display: flex; align-items: center; gap: 14px;
  border: 1px solid var(--ls-line-soft);
  background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface));
  border-radius: 13px; padding: 11px 14px; min-height: 62px; cursor: pointer; transition: .15s;
}
.ls-lv:hover:not(:disabled) { border-color: var(--ls-accent); transform: translateY(-2px); }
.ls-lv:disabled, .ls-lv.lock { opacity: .55; cursor: not-allowed; }
.ls-lv__n {
  width: 38px; height: 38px; flex: none; border-radius: 11px;
  background: color-mix(in srgb, var(--ls-ink) 6%, transparent); color: var(--ls-mut);
  display: grid; place-items: center; font-family: var(--ls-font-display);
  font-weight: 700; font-size: 16px; font-variant-numeric: tabular-nums;
}
.ls-lv.done .ls-lv__n { background: color-mix(in srgb, var(--ls-ok) 20%, transparent); color: var(--ls-ok); }
.ls-lv.cur  .ls-lv__n { background: var(--ls-accent-solid); color: var(--ls-on-accent); }
/* the «όλη η ύλη» shortcut: a glyph where a number would be, and a dashed
   edge so it reads as an action on the whole list rather than one item */
.ls-lv.whole { border-style: dashed; border-color: var(--ls-line); }
.ls-lv.whole .ls-lv__n { background: color-mix(in srgb, var(--ls-accent) 14%, transparent); color: var(--ls-accent-2); }
.ls-lv__n .ls-ic svg { width: 19px; height: 19px; }
.ls-lv__m { flex: 1; min-width: 0; }
.ls-lv__t { display: block; font-size: 15px; font-weight: 600; line-height: 1.3; overflow-wrap: anywhere; }
.ls-lv__m small { display: block; color: var(--ls-mut-2); font-size: 12px; overflow-wrap: anywhere; }
.ls-lv__cta {
  font-size: 12.5px; font-weight: 800; color: var(--ls-accent-2);
  display: flex; align-items: center; gap: 6px; white-space: nowrap; flex: none;
}
.ls-lv.cur  .ls-lv__cta { color: var(--ls-gold-ink); }
.ls-lv.lock .ls-lv__cta { color: var(--ls-mut-2); }
.ls-lv__cta svg { width: 15px; height: 15px; }
/* On a phone the row keeps its state glyph but drops the word, so the
   title gets the width instead of being squeezed into three lines. */
@media (max-width: 600px) {
  .ls-lv__cta { font-size: 0; gap: 0; }
  .ls-lv__cta .ls-ic { font-size: 12.5px; }
}

/* ── view 2 · τρόπος παιχνιδιού ──────────────────────────────────────── */
.ls-msel { max-width: 760px; margin: 0 auto; }
.ls-lvtag { font-family: var(--ls-font-display); font-weight: 700; font-size: 21px; color: var(--ls-gold-ink); overflow-wrap: anywhere; }
.ls-lvname { color: var(--ls-mut); font-size: 15px; margin-bottom: 18px; overflow-wrap: anywhere; }
.ls-slab { font-size: 11.5px; letter-spacing: .08em; color: var(--ls-mut-2); font-weight: 800; margin-bottom: 10px; }
.ls-modes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 11px; margin-bottom: 20px; }
@media (max-width: 720px) { .ls-modes { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.ls-mode {
  position: relative; text-align: center; display: flex; flex-direction: column; align-items: center;
  border: 1px solid var(--ls-line-soft);
  background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface));
  border-radius: 14px; padding: 17px 12px; min-height: 128px; cursor: pointer; transition: .15s;
  color: var(--ls-ink); overflow: hidden;
}
.ls-mode:hover { transform: translateY(-3px); border-color: var(--ls-accent); }
.ls-mode.on { border-color: var(--ls-accent); box-shadow: inset 0 0 0 1px var(--ls-accent); }
.ls-mode__ic {
  width: 42px; height: 42px; margin: 0 auto 9px; border-radius: 12px; display: grid; place-items: center;
  background: color-mix(in srgb, var(--ls-accent) 14%, transparent); color: var(--ls-accent-2);
}
.ls-mode__ic svg { width: 22px; height: 22px; }
.ls-mode__t { font-family: var(--ls-font-display); font-size: 16px; font-weight: 700; line-height: 1.15; overflow-wrap: anywhere; }
.ls-mode__p { color: var(--ls-mut-2); font-size: 11.5px; margin-top: 4px; font-style: italic; line-height: 1.3; overflow-wrap: anywhere; }
.ls-mode.feat {
  background: linear-gradient(120deg, color-mix(in srgb, var(--ls-accent) 15%, var(--ls-surface)), color-mix(in srgb, var(--ls-gold) 10%, var(--ls-surface)));
  border-color: color-mix(in srgb, var(--ls-accent) 40%, transparent);
}
.ls-mode.feat .ls-mode__ic { background: var(--ls-accent-solid); color: var(--ls-on-accent); }
.ls-mode__tag {
  position: absolute; top: 0; right: 0; background: var(--ls-accent-solid); color: var(--ls-on-accent);
  font-size: 9.5px; font-weight: 800; letter-spacing: .04em; padding: 4px 9px; border-bottom-left-radius: 11px;
}
.ls-mode.feat .ls-mode__t { padding-top: 2px; }

.ls-setwrap { display: flex; gap: 24px; flex-wrap: wrap; margin-bottom: 18px; }
.ls-setg { flex: 1; min-width: 200px; }
.ls-opts { display: flex; gap: 7px; flex-wrap: wrap; }
.ls-opt {
  border: 1px solid var(--ls-line-soft); background: var(--ls-sink); color: var(--ls-mut);
  border-radius: 999px; padding: 8px 16px; min-height: 44px; min-width: 52px;
  font-size: 14px; font-weight: 700; cursor: pointer; transition: .14s; text-align: center;
}
.ls-opt:hover { color: var(--ls-ink); border-color: var(--ls-line-bold); }
.ls-opt.on { background: var(--ls-accent-solid); color: var(--ls-on-accent); border-color: transparent; }
.ls-sharecfg {
  width: 100%; display: flex; align-items: center; justify-content: center; gap: 9px;
  border: 1px dashed var(--ls-line); background: none; color: var(--ls-mut);
  border-radius: 12px; padding: 12px; min-height: 46px; font-size: 13.5px; font-weight: 700;
  cursor: pointer; margin-bottom: 16px; transition: .14s;
}
.ls-sharecfg:hover { border-color: var(--ls-accent); color: var(--ls-accent-2); }
.ls-startrow { display: flex; justify-content: flex-end; }
.ls-start {
  border: none; border-radius: 999px; background: var(--ls-accent-solid); color: var(--ls-on-accent);
  font-family: var(--ls-font-display); font-weight: 700; font-size: 16px;
  padding: 12px 30px; min-height: 48px; cursor: pointer; transition: .16s;
  display: inline-flex; align-items: center; gap: 8px;
}
.ls-start:hover { transform: translateY(-2px); filter: brightness(1.06); }
.ls-start svg { width: 17px; height: 17px; }
@media (max-width: 600px) { .ls-startrow { justify-content: stretch; } .ls-start { width: 100%; justify-content: center; } }

/* Embedded in a screen that already has its own header (the shell's
   .sc-page), or mounted full-screen in a game overlay. */
.ls-embed .ls-wrap { max-width: none; padding: 0 0 24px; }
.ls-host { flex: 1; overflow-y: auto; overflow-x: hidden; min-height: 0; }


/* ─── 3 · The older two-pane picker (.gpx-*), same visual language ─────
   16 standalone grammar games render this markup. Rather than rewrite each
   one, re-skin it: rounder rows, the same rail treatment, the same accent
   behaviour. Structure and behaviour are untouched. */
.gpx-pick .gpx-body { border-color: var(--ls-line-soft); border-radius: 16px; }
.gpx-pick .gpx-rail { background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface)); border-right-color: var(--ls-line-soft); }
.gpx-pick .gpx-rail-lbl { font-size: 10.5px; letter-spacing: .14em; font-weight: 800; }
.gpx-pick .gpx-railitem { border-radius: 11px; }
.gpx-pick .gpx-railitem.on { background: color-mix(in srgb, var(--ls-accent) 14%, transparent); }
.gpx-pick .gpx-railitem .nm { font-family: var(--ls-font-display); font-size: 15.5px; }
.gpx-pick .gpx-row { border-radius: 13px; background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface)); border-color: var(--ls-line-soft); }
.gpx-pick .gpx-row:hover { border-color: var(--ls-accent); }
.gpx-pick .gpx-num { border-radius: 11px; width: 38px; height: 38px; font-family: var(--ls-font-display); }
.gpx-pick .gpx-detail-hd h3 { font-family: var(--ls-font-display); font-size: 21px; }

/* ─── 4 · The other two selection surfaces, same language ──────────────
   The Live Arena host setup and the universal «Διάλεξε ύλη» mix picker
   predate this component and each had invented its own controls. Both now
   carry .ls-scope, so the tokens above resolve inside them and the shared
   .ls-slab / .ls-opts / .ls-opt controls can be used directly. What is left
   here re-skins the markup those screens still own. */

/* Live setup: section labels and option pills match the picker exactly. */
.ls-scope .sc-cfg__l {
  font-size: 11.5px;
  letter-spacing: .08em;
  /* authored case: uppercasing Greek in CSS keeps the tonos («ΧΡΌΝΟΣ») */
  text-transform: none;
  color: var(--ls-mut-2);
  font-weight: 800;
  margin-bottom: 10px;
}
.ls-scope .sc-cfg__hint { font-weight: 600; letter-spacing: 0; text-transform: none; opacity: .8; }
.ls-scope .sc-cfg__opts { display: flex; gap: 7px; flex-wrap: wrap; align-items: center; }
.ls-scope .sc-cfg__o {
  border: 1px solid var(--ls-line-soft);
  background: color-mix(in srgb, var(--ls-ink) 3%, transparent);
  color: var(--ls-mut);
  border-radius: 999px;
  padding: 8px 15px;
  font: 700 14px var(--ls-font-ui);
  cursor: pointer;
  transition: .14s;
  min-width: 46px;
  text-align: center;
}
.ls-scope .sc-cfg__o:hover { color: var(--ls-ink); border-color: var(--ls-line); }
.ls-scope .sc-cfg__o.active {
  background: linear-gradient(180deg, var(--ls-accent-2), var(--ls-accent));
  color: var(--ls-on-accent);
  border-color: transparent;
}

/* The «Διάλεξε ύλη» filter chips were pinned to a literal #2e9e4f, so the
   one green thing on the page fought every palette. Follow the accent. */
.ls-scope .syn-tagchip { border-radius: 999px; font-family: var(--ls-font-ui); }
.ls-scope .syn-tagchip.on {
  background: linear-gradient(180deg, var(--ls-accent-2), var(--ls-accent));
  border-color: transparent;
  color: var(--ls-on-accent);
}
.ls-scope .syn-mix__lbl {
  font-family: var(--ls-font-ui);
  font-size: 10.5px;
  letter-spacing: .14em;
  font-weight: 800;
  color: var(--ls-mut-2);
}
.ls-scope .syn-mix__search { border-radius: 999px; font-family: var(--ls-font-ui); }
.ls-scope .syn-mix__start { border-radius: 999px; font-family: var(--ls-font-display); text-transform: none; }
.ls-scope .syn-mix__bar { border-radius: 999px; }

/* ── The «Διάλεξε ύλη» surface, in full ──────────────────────────────
   The chips alone were not the problem: the whole screen was a second
   design language sitting one click away from the picker — square cards,
   its own label scale, its own button silhouettes. Everything below maps
   that markup onto the same tokens and shapes the picker uses, so the two
   screens read as one flow. Structure and behaviour are untouched; this
   is presentation only. */

/* section headings (Γραμματική / Ομηρική Ποίηση / Λατινικά) — the picker's
   .ls-lbl treatment. Authored case, deliberately: screens.css uppercases
   these, which turns «Γραμματική» into «ΓΡΑΜΜΑΤΙΚΉ» — Greek uppercased by
   CSS keeps its tonos. Scoped to .ls-scope, so the PvP/Live curriculum
   picker, which does not carry that class, is untouched. */
.ls-scope .syn-ds-cat {
  font-family: var(--ls-font-ui);
  font-size: 11px;
  letter-spacing: .08em;
  text-transform: none;
  font-weight: 800;
  color: var(--ls-mut-2);
}

/* a source card is a level row: same radius, same gradient, same lift */
.ls-scope .syn-ds {
  border-radius: 13px;
  border: 1px solid var(--ls-line-soft);
  background: linear-gradient(180deg, var(--ls-surface-2), var(--ls-surface));
  transition: .15s;
}
.ls-scope .syn-ds:hover { border-color: var(--ls-accent); transform: translateY(-2px); }
.ls-scope .syn-ds.on {
  border-color: var(--ls-accent);
  box-shadow: 0 0 0 1px var(--ls-accent);
}
.ls-scope .syn-ds.locked:hover { transform: none; border-color: var(--ls-line-soft); }
.ls-scope .syn-ds__ic {
  border-radius: 11px;
  background: color-mix(in srgb, var(--ls-ink) 5%, transparent);
}
.ls-scope .syn-ds.on .syn-ds__ic {
  background: color-mix(in srgb, var(--ls-accent) 18%, transparent);
}
.ls-scope .syn-ds__name {
  font-family: var(--ls-font-display);
  font-size: 15px;
  font-weight: 600;
  color: var(--ls-ink);
}
.ls-scope .syn-ds__meta { font-size: 12px; color: var(--ls-mut-2); }

/* "+ MIX" is the row's call to action — the picker's .cta, as a pill */
.ls-scope .syn-ds__mix {
  border-radius: 999px;
  border: 1px solid var(--ls-line-soft);
  background: color-mix(in srgb, var(--ls-ink) 3%, transparent);
  color: var(--ls-accent-2);
  font: 800 12.5px var(--ls-font-ui);
  padding: 8px 15px;
  transition: .14s;
}
.ls-scope .syn-ds__mix:hover { border-color: var(--ls-accent); }
.ls-scope .syn-ds__mix.on {
  background: linear-gradient(180deg, var(--ls-accent-2), var(--ls-accent));
  color: var(--ls-on-accent);
  border-color: transparent;
}
.ls-scope .syn-ds__flag {
  border-radius: 999px;
  font: 700 11px var(--ls-font-ui);
  color: var(--ls-mut-2);
}

/* the teacher upload card — same card language, dashed like .ls-cat.custom */
.ls-scope .syn-ds-upload {
  border-radius: 16px;
  border: 1.5px dashed var(--ls-line);
  background: color-mix(in srgb, var(--ls-ink) 2%, transparent);
  transition: .15s;
}
.ls-scope .syn-ds-upload:not(.locked):hover { border-color: var(--ls-accent); }
.ls-scope .syn-ds-upload__name { font-family: var(--ls-font-display); font-size: 15.5px; font-weight: 700; color: var(--ls-ink); }
.ls-scope .syn-ds-upload__meta { font-size: 12px; color: var(--ls-mut-2); }
.ls-scope .syn-ds-upload__ic { border-radius: 11px; background: color-mix(in srgb, var(--ls-ink) 5%, transparent); }
.ls-scope .syn-ds-upload__pill {
  border-radius: 999px;
  border: 1px solid var(--ls-line-soft);
  background: transparent;
  color: var(--ls-mut-2);
  font: 800 10px var(--ls-font-ui);
  letter-spacing: .06em;
}
.ls-scope .syn-ds-upload__cta {
  border-radius: 999px;
  border: 1px solid var(--ls-line);
  background: color-mix(in srgb, var(--ls-ink) 4%, transparent);
  color: var(--ls-ink);
  font: 700 12.5px var(--ls-font-ui);
  padding: 9px 17px;
}
.ls-scope .syn-ds-upload:not(.locked) .syn-ds-upload__cta:hover {
  background: var(--ls-accent); color: var(--ls-on-accent); border-color: transparent;
}

/* per-source level pills — the picker's level rows, compressed */
.ls-scope .syn-ds-levels { border-radius: 14px; border-color: var(--ls-line); background: color-mix(in srgb, var(--ls-accent) 6%, var(--ls-surface)); }
.ls-scope .syn-lvrowpill, .ls-scope .syn-lvpill--all { border-radius: 11px; border-color: var(--ls-line-soft); font-family: var(--ls-font-ui); }
.ls-scope .syn-lvrowpill:hover { border-color: var(--ls-accent); }
.ls-scope .syn-lvrowpill.on, .ls-scope .syn-lvpill--all.on {
  border-color: var(--ls-accent);
  background: color-mix(in srgb, var(--ls-accent) 12%, transparent);
}
.ls-scope .syn-lvgrp { font-family: var(--ls-font-ui); font-size: 10.5px; letter-spacing: .14em; font-weight: 800; color: var(--ls-mut-2); }
.ls-scope .syn-lv-fold, .ls-scope .syn-lvgrp-all, .ls-scope .syn-lvgrp-fold { border-radius: 999px; font-family: var(--ls-font-ui); }

/* Long Greek source names were being cut ("Συνηρημένα Ρ…", "Λατινικά Ουσι…"):
   the pill CTA is wider than the dashed chip it replaced, and the name is
   nowrap+ellipsis by design. Give the names two lines and hand the cards a
   little more width instead of trimming the words. */
.ls-scope .syn-ds-grid { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }
.ls-scope .syn-ds__name {
  white-space: normal;
  overflow: hidden;
  text-overflow: clip;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  line-height: 1.2;
}
.ls-scope .syn-ds__mix {
  font-size: 11px;
  letter-spacing: .05em;
  padding: 7px 13px;
}
