/*
 * Aventus-huisstijl. De kleuren en vormen komen uit het live thema van
 * aventus.nl (custom properties --color-*, pill-knoppen, Bebas voor koppen);
 * ze staan hier als één tokenlaag zodat de componenten eronder er alleen naar
 * verwijzen.
 *
 * Bebas Neue (Google Fonts, OFL — zie fonts/OFL.txt) staat in voor de
 * Bebas Neue Pro van hun Adobe-kit: die is domeingebonden en mogen we hier
 * niet serveren. Bebas is alleen hoofdletters; daarom uitsluitend voor koppen
 * en knoppen, nooit voor lopende tekst.
 */

@font-face {
  font-family: "Bebas Neue";
  font-style: normal;
  font-weight: 400;
  /*
   * block, niet swap: swap tóónt eerst de fallback en wisselt daarna om — dat
   * is precies de flikkering die je bij elke paginawissel ziet. Met block blijft
   * de tekst heel even onzichtbaar in plaats van verkeerd. Dat kan hier veilig,
   * want het font staat op onze eigen server (14 kB) en wordt via een preload in
   * de <head> al opgehaald terwijl de CSS nog geparseerd wordt.
   */
  font-display: block;
  src: url("/static/fonts/bebas-neue-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Bebas Neue";
  font-style: normal;
  font-weight: 400;
  font-display: block;
  src: url("/static/fonts/bebas-neue-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF,
    U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/*
 * Lichte modus is de basis; de dark-modeblok hieronder herdefinieert alléén de
 * kleurtokens. Geen kleur krijgt zijn enige definitie in het media-blok, zodat
 * er nooit een halve modus kan ontstaan.
 */
:root {
  color-scheme: light dark;

  /* Kleuren, letterlijk uit het Aventus-thema */
  --av-primary: #52bcce;
  --av-primary-donker: #267987; /* --color-focus-dark: het cyaan haalt op wit de contrasteis niet */
  --av-link: #267987;
  --av-tekst: #3a3a39;
  --av-zwart: #111111;
  --av-groen: #b8d836;
  --av-groen-hover: #93ad2b;

  /* De drie onderdelen van de app, elk met een eigen kleur. Focus en support
     hadden die al in het check-informulier (blok 1 turquoise, blok 2 groen);
     sidequest niet, en het dashboard helemaal niet. Dezelfde kleur op beide
     schermen maakt dat je zonder lezen weet waar je kijkt. */
  --av-thema-focus: #52bcce;
  --av-thema-support: #b8d836;
  --av-thema-sidequest: #a05bd6;

  /* "Wacht al" had een hardgecodeerd licht vlak; in het donkere thema stond de
     lichte tekst daar bovenop en was hij onleesbaar. Als tokenpaar, net als de
     andere statussen. */
  --av-wacht: #c9760a;
  --av-wacht-vlak: #fdf1e0;
  --av-wacht-tekst: #7a4705;
  --av-succes: #178744;
  --av-gevaar: #e2476c;
  --av-vlak-1: #ffffff;
  --av-vlak-2: #f4f4f4;
  --av-vlak-3: #e2e2e2;
  --av-vlak-4: #c6c6c5;
  --av-blauw-45: #b1e1e9;
  --av-rand: #e2e2e2;
  --av-gedempt: #7f7f7e; /* --color-grey-65 */

  /* Afgeleiden voor tekst op gekleurde vlakken — allemaal ≥ 4.5:1 */
  --av-primary-tekst: #17505a;
  --av-op-accent: #ffffff; /* tekst op een primary-donker vlak */
  --av-op-groen: #111111; /* het groen is in beide modi gelijk, dus deze tekst ook */
  --av-succes-vlak: #dcf0e3;
  --av-succes-tekst: #12602f;
  --av-gevaar-vlak: #fbe3ea;
  --av-gevaar-tekst: #8e2340;
  --av-attentie-vlak: #eef5cf;
  --av-attentie-tekst: #4f5c12;

  /* Letters van het woordlogo; de stip houdt het cyaan uit het SVG-bestand. */
  --av-logo: #323232;
  --av-schaduw-kleur: rgba(17, 17, 17, 0.16);
  --av-schaduw: 0 1px 3px rgba(17, 17, 17, 0.1);

  --av-radius: 0.625rem; /* --rounded-sm */
  --av-radius-klein: 0.3125rem; /* --rounded-xs */
  --av-pill: 9999px; /* --rounded-full */
  --av-kop: "Bebas Neue", "Arial Narrow", Arial, sans-serif;
  --av-tekst-font: Arial, helvetica, system-ui, sans-serif;
}

/*
 * Donkere modus. Drie standen: de gebruiker kiest licht, donker, of systeem
 * (geen data-theme, dan beslist prefers-color-scheme). De server stempelt de
 * keuze als data-theme op <html>, dus er is geen flits van het verkeerde thema.
 *
 * De tokenlijst staat hieronder twee keer: één keer voor de systeemvoorkeur en
 * één keer voor de expliciete keuze. CSS kent geen manier om één blok op beide
 * condities toe te passen. Ze horen identiek te zijn — een test bewaakt dat.
 */
@media (prefers-color-scheme: dark) {
  /* Systeem staat op donker — tenzij de gebruiker expliciet licht koos. */
  :root:not([data-theme="light"]) {
    --av-primary: #52bcce;
    --av-primary-donker: #7dcdda;
    --av-link: #8fd3df;
    --av-tekst: #e4e4e1;
    --av-zwart: #f4f4f2;
    --av-vlak-1: #26262a;
    --av-vlak-2: #1b1b1e;
    --av-vlak-3: #34343a;
    --av-vlak-4: #4a4a52;
    --av-blauw-45: #1f4a53;
    --av-rand: #3a3a41;
    --av-gedempt: #9a9a97;
    --av-thema-focus: #52bcce;
    --av-thema-support: #b8d836;
    --av-thema-sidequest: #c08ee6;
    --av-wacht: #e09a3c;
    --av-wacht-vlak: #3a2a12;
    --av-wacht-tekst: #f0c384;

    --av-primary-tekst: #b1e1e9;
    --av-op-accent: #10262b;
    --av-succes-vlak: #13351f;
    --av-succes-tekst: #86d3a1;
    --av-gevaar-vlak: #3d1b26;
    --av-gevaar-tekst: #f2a8bb;
    --av-attentie-vlak: #2f3315;
    --av-attentie-tekst: #cfe07a;

    --av-logo: #f2f2f0;
    --av-schaduw-kleur: rgba(0, 0, 0, 0.55);
    --av-schaduw: 0 1px 3px rgba(0, 0, 0, 0.45);
  }
}

:root[data-theme="light"] {
  color-scheme: light;
}

/* Expliciete keuze wint, ook op een systeem dat op licht staat. */
:root[data-theme="dark"] {
  color-scheme: dark;
  --av-primary: #52bcce;
  --av-primary-donker: #7dcdda;
  --av-link: #8fd3df;
  --av-tekst: #e4e4e1;
  --av-zwart: #f4f4f2;
  --av-vlak-1: #26262a;
  --av-vlak-2: #1b1b1e;
  --av-vlak-3: #34343a;
  --av-vlak-4: #4a4a52;
  --av-blauw-45: #1f4a53;
  --av-rand: #3a3a41;
  --av-gedempt: #9a9a97;
  --av-thema-focus: #52bcce;
  --av-thema-support: #b8d836;
  --av-thema-sidequest: #c08ee6;
  --av-wacht: #e09a3c;
  --av-wacht-vlak: #3a2a12;
  --av-wacht-tekst: #f0c384;

  --av-primary-tekst: #b1e1e9;
  --av-op-accent: #10262b;
  --av-succes-vlak: #13351f;
  --av-succes-tekst: #86d3a1;
  --av-gevaar-vlak: #3d1b26;
  --av-gevaar-tekst: #f2a8bb;
  --av-attentie-vlak: #2f3315;
  --av-attentie-tekst: #cfe07a;

  --av-logo: #f2f2f0;
  --av-schaduw-kleur: rgba(0, 0, 0, 0.55);
  --av-schaduw: 0 1px 3px rgba(0, 0, 0, 0.45);
  }

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  font: 15px/1.55 var(--av-tekst-font);
  color: var(--av-tekst);
  background: var(--av-vlak-2);
}

a {
  color: var(--av-link);
}

h2,
h3,
h4 {
  font-family: var(--av-kop);
  font-weight: 400;
  letter-spacing: 0.02em;
  color: var(--av-zwart);
}
h2 {
  font-size: 2rem;
  margin: 0 0 0.8rem;
}

/* -- Header ---------------------------------------------------------------- */

header {
  display: flex;
  gap: 1.2rem;
  align-items: center;
  padding: 0.6rem 1.2rem;
  background: var(--av-vlak-1);
  border-bottom: 3px solid var(--av-primary);
}
header .woordmerk {
  display: flex;
  align-items: center;
  gap: 0.7rem;
  text-decoration: none;
}
header .woordmerk .woordlogo {
  height: 1.7rem;
  width: auto;
  /* De letters volgen deze kleur; de stip houdt het cyaan uit het bestand. */
  color: var(--av-logo);
}
header h1 {
  font-family: var(--av-kop);
  font-weight: 400;
  font-size: 1.35rem;
  letter-spacing: 0.04em;
  margin: 0;
  color: var(--av-tekst);
  /* Streepje scheidt de tool van het merk: het logo is Aventus, dit is de tool. */
  border-left: 2px solid var(--av-vlak-4);
  padding-left: 0.7rem;
}
header .org {
  color: var(--av-tekst);
  opacity: 0.6;
  font-size: 0.85rem;
  white-space: nowrap;
}
/* Onder deze breedte wint de navigatie het van het org-label. */
@media (max-width: 78rem) {
  header .org {
    display: none;
  }
}
header nav {
  display: flex;
  gap: 0.9rem;
  align-items: center;
  font-size: 0.88rem;
  margin-left: 0.4rem;
}
header nav a,
.menu-trigger {
  /* Navigatie-items breken nooit af: liever de balk laten scrollen. */
  white-space: nowrap;
}
header nav a {
  color: var(--av-tekst);
  text-decoration: none;
}
header nav a:hover,
header nav a:focus-visible {
  color: var(--av-primary-donker);
  text-decoration: underline;
}
/* Rechterkant van de balk: instellingen en wie er is ingelogd. */
header .rechts {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin-left: auto;
}
header .who {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 0.85rem;
  color: var(--av-tekst);
  text-decoration: none;
}
header .who:hover .naam {
  text-decoration: underline;
}
header .avatar {
  width: 24px;
  height: 24px;
  border-radius: 50%;
  background: var(--av-vlak-3);
}
.menu-trigger.tandwiel {
  display: flex;
  align-items: center;
  padding: 0.3rem;
  color: var(--av-gedempt);
}
.menu-trigger.tandwiel:hover,
.instellingen:focus-within .tandwiel {
  color: var(--av-tekst);
}
/* Uitlijnen op de rechterrand, anders valt het paneel buiten het scherm. */
.menu-items.rechts-uitgelijnd {
  left: auto;
  right: 0;
}
.menu-kop {
  margin: 0.15rem 0 0.35rem;
  padding: 0 0.9rem;
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--av-gedempt);
}
.menu-items .uitloggen {
  border-top: 1px solid var(--av-rand);
  margin-top: 0.35rem;
  padding-top: 0.55rem;
}

/* Hamburger: alleen op smalle schermen zichtbaar (zie de media query onderaan). */
.nav-schakelaar {
  display: none;
}
.hamburger {
  display: none;
  align-items: center;
  padding: 0.35rem;
  margin-left: auto;
  color: var(--av-tekst);
  cursor: pointer;
  border-radius: var(--av-radius-klein);
}
.hamburger svg {
  width: 1.35rem;
  height: 1.35rem;
}
.nav-schakelaar:focus-visible + .hamburger {
  outline: 2px solid var(--av-primary-donker);
  outline-offset: 2px;
}

/* Themaschakelaar: drie submits als één segmented control. */
form.thema {
  display: flex;
  margin: 0 0.9rem 0.2rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-pill);
  overflow: hidden;
}
form.thema button {
  display: flex;
  align-items: center;
  padding: 0.25rem 0.55rem;
  border: 0;
  border-radius: 0;
  background: none;
  color: var(--av-gedempt);
  cursor: pointer;
}
form.thema button:hover {
  background: var(--av-vlak-2);
  color: var(--av-tekst);
}
form.thema button.aan {
  background: var(--av-primary-donker);
  color: var(--av-op-accent);
}
form.thema button:focus-visible {
  outline: 2px solid var(--av-primary-donker);
  outline-offset: -2px;
}
.thema-icoon {
  width: 1rem;
  height: 1rem;
}
/* Visueel verborgen, wel voorleesbaar: de knoppen zijn alleen iconen. */
.vpb {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Dropdown zonder JavaScript: hover én focus-within, dus ook met Tab. */
.menu {
  position: relative;
}
/* Geen link: dit menu-item hoort nergens heen te gaan. */
.menu-trigger {
  padding: 0;
  background: none;
  border: 0;
  border-radius: 0;
  color: var(--av-tekst);
  font: inherit;
  cursor: pointer;
}
.menu-trigger:hover,
.menu:focus-within .menu-trigger {
  color: var(--av-link);
  background: none;
}
.menu-items {
  display: none;
  position: absolute;
  left: 0;
  top: 100%;
  margin-top: 0.55rem;
  z-index: 10;
  min-width: 12.5rem;
  padding: 0.3rem 0;
  background: var(--av-vlak-1);
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  box-shadow: 0 6px 18px var(--av-schaduw-kleur);
}
/*
 * Onzichtbare brug over het gat tussen knop en paneel. Zonder dit valt de
 * muis onderweg naar beneden even buiten .menu en klapt het menu dicht —
 * merkbaar zodra je langzaam beweegt.
 */
.menu-items::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -0.65rem;
  height: 0.65rem;
}
.menu:hover .menu-items,
.menu:focus-within .menu-items {
  display: block;
}
.menu-items a {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  padding: 0.45rem 0.9rem;
  white-space: nowrap;
  text-decoration: none;
  color: var(--av-tekst);
}
.menu-items a:hover,
.menu-items a:focus-visible {
  background: var(--av-vlak-2);
  color: var(--av-link);
}
.menu-icoon {
  width: 1.1rem;
  height: 1.1rem;
  flex: none;
  color: var(--av-primary-donker);
}

main {
  max-width: 1100px;
  margin: 1.4rem auto;
  padding: 0 1rem;
}

/* -- Formulieren ----------------------------------------------------------- */

form.filters {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: end;
  margin-bottom: 1rem;
}
form.filters label,
form.provision label {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  font-size: 0.78rem;
  color: var(--av-tekst);
}
textarea {
  padding: 0.5rem 0.6rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  color: var(--av-tekst);
  font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
  resize: vertical;
  width: 100%;
}
textarea:focus-visible {
  outline: 2px solid var(--av-primary);
  outline-offset: 1px;
}

select,
input[type="text"],
input[type="file"] {
  /* Gelijke hoogte, anders staan de filters op verschillende basislijnen. */
  height: 2.2rem;
  padding: 0.4rem 0.55rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  font: inherit;
  color: var(--av-tekst);
}
select:focus-visible,
input:focus-visible {
  outline: 2px solid var(--av-primary);
  outline-offset: 1px;
}

/* Aventus-knop: pill, licht groen, zwarte tekst, kop-lettertype. */
/*
 * Aventus-knop, ingetogener dan de pill van hun website: die is daar een
 * call-to-action op een marketingpagina, hier staat er soms een rij van in een
 * tabel. Zelfde groen en zelfde koplettertype, kleiner en met een normale
 * radius.
 */
button {
  padding: 0.35rem 0.85rem;
  border: 0;
  border-radius: var(--av-radius-klein);
  background: var(--av-groen);
  color: var(--av-op-groen);
  font-family: var(--av-kop);
  font-size: 0.95rem;
  letter-spacing: 0.03em;
  line-height: 1.4;
  cursor: pointer;
  transition: background-color 0.2s ease-out;
}
button:hover {
  background: var(--av-groen-hover);
}
button:focus-visible {
  outline: 2px solid var(--av-primary-donker);
  outline-offset: 2px;
}
/*
 * Rij-actie naast een badge: omlijnd in plaats van gevuld. Een groene pill
 * naast een statuslabel leest als nóg een label; een omlijnde knop leest als
 * iets wat je kunt indrukken.
 */
/* Een link die als knop moet lezen — <button> in een <a> is ongeldige HTML. */
a.knop {
  display: inline-block;
  padding: 0.35rem 0.85rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-groen);
  color: var(--av-op-groen);
  font-family: var(--av-kop);
  font-size: 0.95rem;
  letter-spacing: 0.03em;
  line-height: 1.4;
  text-decoration: none;
  transition: background-color 0.2s ease-out;
}
a.knop:hover {
  background: var(--av-groen-hover);
}

button.mini {
  padding: 0.12rem 0.7rem;
  background: var(--av-vlak-1);
  border: 1px solid var(--av-primary-donker);
  color: var(--av-primary-donker);
  font-family: var(--av-tekst-font);
  font-size: 0.78rem;
  letter-spacing: 0;
}
button.mini:hover {
  background: var(--av-primary-donker);
  color: var(--av-op-accent);
}

form.provision {
  display: grid;
  gap: 0.8rem;
  max-width: 32rem;
  padding: 1.2rem;
  background: var(--av-vlak-1);
  border-radius: var(--av-radius);
  box-shadow: var(--av-schaduw);
}
form.provision label.rij {
  flex-direction: row;
  align-items: center;
  gap: 0.5rem;
}
/* Knop op zijn eigen breedte; over de volle grid-kolom wordt hij een balk. */
form.provision button {
  justify-self: start;
}
form.acties {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  margin: 0 0 1rem;
}
form.rij-actie {
  display: inline-block;
  margin-left: 0.4rem;
  vertical-align: middle;
}

/* -- Tabellen -------------------------------------------------------------- */

table {
  width: 100%;
  border-collapse: collapse;
  background: var(--av-vlak-1);
  border-radius: var(--av-radius);
  overflow: hidden;
  box-shadow: var(--av-schaduw);
}
th,
td {
  text-align: left;
  padding: 0.55rem 0.7rem;
  border-bottom: 1px solid var(--av-vlak-2);
  font-size: 0.88rem;
}
th {
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
tr:last-child td {
  border-bottom: 0;
}
/* Vinkkolom in het planscherm: smal, en het vinkje netjes gecentreerd. */
th.vink,
td.vink {
  width: 2.5rem;
  text-align: center;
}
td.vink input {
  width: 1.05rem;
  height: 1.05rem;
  accent-color: var(--av-primary-donker);
}
td label {
  cursor: pointer;
}

/* -- Open- en dichtvouwbare groepen ---------------------------------------- */

details.groep {
  margin: 0 0 1rem;
  padding: 0.6rem 0.9rem;
  background: var(--av-vlak-1);
  border-radius: var(--av-radius);
  box-shadow: var(--av-schaduw);
}
details.groep > summary {
  font-family: var(--av-kop);
  font-size: 1.25rem;
  letter-spacing: 0.02em;
  color: var(--av-zwart);
  cursor: pointer;
}
details.subgroep {
  margin: 0.7rem 0 0 0.2rem;
}
details.subgroep > summary {
  font-size: 0.88rem;
  font-weight: bold;
  cursor: pointer;
  padding: 0.2rem 0;
}
details.subgroep > table {
  margin-top: 0.4rem;
  box-shadow: none;
  border: 1px solid var(--av-rand);
}
summary:focus-visible {
  outline: 2px solid var(--av-primary-donker);
  outline-offset: 2px;
  border-radius: var(--av-radius-klein);
}
/* Het standaard-driehoekje staat te ver van de tekst in Bebas. */
summary::marker {
  color: var(--av-primary-donker);
}

/* -- Statuslabels ---------------------------------------------------------- */

.badge {
  display: inline-block;
  padding: 0.08rem 0.6rem;
  border-radius: var(--av-pill);
  font-size: 0.75rem;
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.badge.uit {
  background: var(--av-vlak-3);
  color: var(--av-tekst);
}
.badge.ok {
  background: var(--av-succes-vlak);
  color: var(--av-succes-tekst);
}
.badge.fail {
  background: var(--av-gevaar-vlak);
  color: var(--av-gevaar-tekst);
}
.badge.warn {
  background: var(--av-attentie-vlak);
  color: var(--av-attentie-tekst);
}

.muted {
  color: var(--av-gedempt);
}
.count {
  margin: 0.4rem 0 0.9rem;
  font-size: 0.85rem;
}
.warntekst {
  color: var(--av-attentie-tekst);
}
.foutdetail {
  color: var(--av-gevaar-tekst);
  font-size: 0.82rem;
}

.fouten,
.waarschuwingen {
  padding: 0.7rem 1rem;
  margin-bottom: 1rem;
  border-radius: var(--av-radius);
}
.fouten {
  background: var(--av-gevaar-vlak);
  border: 1px solid var(--av-gevaar);
  color: var(--av-gevaar-tekst);
}
.waarschuwingen {
  background: var(--av-attentie-vlak);
  border: 1px solid var(--av-groen);
  color: var(--av-attentie-tekst);
}
.fouten ul,
.waarschuwingen ul {
  margin: 0.3rem 0 0;
  padding-left: 1.2rem;
}

/* -- Overzicht: schooljaar → leerlijn → module-runs ------------------------ */

section.jaar {
  margin: 1.8rem 0;
}
section.jaar > h3 {
  font-size: 1.5rem;
  margin: 0 0 0.7rem;
  padding-bottom: 0.35rem;
  border-bottom: 2px solid var(--av-primary);
}
.leerlijn {
  margin: 0 0 1.3rem;
}
.leerlijn h4 {
  font-size: 1.2rem;
  margin: 0 0 0.55rem;
}
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr));
  gap: 1rem;
}
.card {
  padding: 1rem 1.2rem;
  background: var(--av-vlak-1);
  border-radius: var(--av-radius);
  box-shadow: var(--av-schaduw);
}
.card h3 {
  margin: 0 0 0.1rem;
  font-size: 1.2rem;
}
.card .stats {
  display: flex;
  gap: 1.4rem;
  margin: 0.8rem 0 0.5rem;
}
.card .stat {
  display: flex;
  flex-direction: column;
}
.card .stat strong {
  font-family: var(--av-kop);
  font-weight: 400;
  font-size: 1.5rem;
  color: var(--av-zwart);
}
.card .stat span {
  font-size: 0.72rem;
  color: var(--av-gedempt);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.card .stat.warn strong {
  color: var(--av-attentie-tekst);
}
.cardlinks {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin: 0.5rem 0 0;
  font-size: 0.85rem;
}
.cardlinks form.rij-actie {
  margin-left: auto;
}

/* Vierkante icoonlink naar de laatste commit — leest als knop, niet als badge. */
a.iconlink {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.35rem;
  height: 1.35rem;
  margin-left: 0.4rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-primary-donker);
  color: var(--av-op-accent);
  vertical-align: middle;
}
a.iconlink:hover {
  background: var(--av-link);
}
a.iconlink:focus-visible {
  outline: 2px solid var(--av-primary-donker);
  outline-offset: 1px;
}

progress {
  width: 100%;
  height: 0.8rem;
}

/* -- Smalle schermen ------------------------------------------------------- */

/*
 * Onder deze breedte klapt de balk om naar een telefoon-layout: logo,
 * hamburger, tandwiel en avatar blijven staan; de navigatie schuift eronder
 * open. Zonder JavaScript — de checkbox in de <header> stuurt de nav aan.
 *
 * Een CSV importeren doet niemand op een telefoon, maar één student toevoegen
 * terwijl je naast hem staat wél; dat pad moet dus gewoon werken.
 */
@media (max-width: 52rem) {
  header {
    flex-wrap: wrap;
    gap: 0.5rem 0.8rem;
    padding: 0.5rem 0.8rem;
  }
  header .org {
    display: none;
  }
  .hamburger {
    display: flex;
    order: 2;
  }
  header .rechts {
    order: 3;
    margin-left: 0;
  }

  /* De nav valt op een eigen regel en blijft dicht tot de hamburger aanstaat. */
  header nav {
    order: 4;
    display: none;
    width: 100%;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    margin: 0.3rem 0 0.2rem;
    border-top: 1px solid var(--av-rand);
    padding-top: 0.4rem;
    font-size: 1rem;
  }
  .nav-schakelaar:checked ~ nav {
    display: flex;
  }
  header nav > a,
  nav .menu-trigger {
    padding: 0.6rem 0.2rem;
  }

  /*
   * Geen menu-in-een-menu op touch: de drie studentenlinks staan uitgeklapt
   * onder hun kopje. Hover bestaat hier niet, en een popup die over de rest van
   * de lijst heen klapt is alleen maar lastiger.
   */
  nav .menu {
    display: flex;
    flex-direction: column;
  }
  nav .menu .menu-trigger {
    /* Op mobiel is dit een kopje boven een lijst, geen knop. */
    pointer-events: none;
    text-align: left;
    color: var(--av-gedempt);
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding-bottom: 0.15rem;
  }
  nav .menu .menu-items,
  nav .menu:hover .menu-items,
  nav .menu:focus-within .menu-items {
    display: block;
    position: static;
    min-width: 0;
    margin: 0;
    padding: 0;
    background: none;
    border: 0;
    box-shadow: none;
  }
  nav .menu .menu-items::before {
    content: none;
  }
  nav .menu .pijl {
    display: none;
  }
  nav .menu .menu-items a {
    padding: 0.55rem 0.2rem 0.55rem 0.6rem;
  }

  main {
    margin: 1rem auto;
    overflow-x: hidden;
  }
  h2 {
    font-size: 1.6rem;
  }
  form.filters label,
  form.provision label {
    flex: 1 1 10rem;
  }
  form.provision {
    padding: 0.9rem;
  }
  /* Tabellen mogen scrollen, de pagina zelf nooit. */
  table {
    display: block;
    overflow-x: auto;
  }
  details.groep {
    padding: 0.5rem 0.6rem;
  }
  .cards {
    grid-template-columns: 1fr;
  }
}

/* Nog smaller: de naam naast de avatar kost te veel van de balk. */
@media (max-width: 26rem) {
  header .who .naam {
    display: none;
  }
  header h1 {
    font-size: 1.15rem;
  }
}

/* ===========================================================================
 * Focuslab
 *
 * Alles hierboven komt uit ClassHub (huisstijl, header, knoppen, tabellen).
 * Hieronder staat wat Focuslab er zelf bij heeft: het check-informulier, de
 * doelkaart en de overzichten. Mobiel-first: de studentschermen worden op een
 * telefoon ingevuld, dus die zijn één kolom met grote raakvlakken.
 * ========================================================================= */

/* De studentschermen zijn leeswerk, geen dashboard: smalle kolom. */
.smal {
  max-width: 34rem;
  margin: 0 auto;
}

header .who {
  font-size: 0.8rem;
  color: var(--av-gedempt);
  white-space: nowrap;
}

.uitlogform {
  margin: 0.3rem 0.9rem 0.6rem;
}
button.plat {
  margin: 0;
  padding: 0.2rem 0;
  background: none;
  color: var(--av-link);
  font-family: var(--av-tekst-font);
  font-size: 0.85rem;
  text-decoration: underline;
}
button.plat:hover {
  background: none;
}

footer {
  max-width: 1100px;
  margin: 2.5rem auto 1.5rem;
  padding: 0 1rem;
  color: var(--av-gedempt);
  font-size: 0.75rem;
}

h2 {
  font-family: var(--av-kop);
  font-size: 1.9rem;
  letter-spacing: 0.02em;
  margin: 0.2rem 0 0.3rem;
}
h3 {
  font-family: var(--av-kop);
  font-size: 1.25rem;
  letter-spacing: 0.02em;
  margin: 1.6rem 0 0.5rem;
}

.klein {
  font-size: 0.78rem;
}
.links {
  margin-top: 1.4rem;
  font-size: 0.85rem;
}

/* -- Check-informulier ----------------------------------------------------- */

.focusform {
  margin-top: 1rem;
}
fieldset.vraag {
  border: 0;
  border-top: 1px solid var(--av-rand);
  margin: 0;
  padding: 1rem 0 1.2rem;
}
fieldset.vraag:first-of-type {
  border-top: 0;
}
fieldset.vraag legend {
  font-family: var(--av-kop);
  font-size: 1.15rem;
  letter-spacing: 0.02em;
  padding: 0;
}
fieldset.vraag legend .nr {
  display: inline-block;
  width: 1.35rem;
  height: 1.35rem;
  margin-right: 0.35rem;
  border-radius: var(--av-pill);
  background: var(--av-primary);
  color: var(--av-op-accent);
  font-size: 0.85rem;
  line-height: 1.35rem;
  text-align: center;
}
.hint {
  margin: 0.3rem 0 0.6rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
/* Op een telefoon is een volle regel invoer prettiger dan een vast vak. */
.focusform input[type="text"],
.focusform select,
.focusform textarea {
  width: 100%;
  height: auto;
  min-height: 2.4rem;
  font-size: 1rem;
}
.focusform textarea {
  font-family: var(--av-tekst-font);
  font-size: 0.95rem;
}
.focusform button[type="submit"] {
  margin: 0.5rem 0 0;
  padding: 0.6rem 1.6rem;
  font-size: 1.05rem;
}

/* Vertrouwensschaal: vijf grote raakvlakken, geen slider (die is op touch
   onnauwkeurig en geeft geen duidelijke waarde). */
.schaal {
  display: flex;
  gap: 0.5rem;
}
.schaal label {
  flex: 1;
}
.schaal input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}
.schaal span {
  display: block;
  padding: 0.7rem 0;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  font-family: var(--av-kop);
  font-size: 1.2rem;
  text-align: center;
  cursor: pointer;
}
.schaal input:checked + span {
  border-color: var(--av-primary-donker);
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.schaal input:focus-visible + span {
  outline: 2px solid var(--av-primary);
  outline-offset: 1px;
}
.schaaluitleg {
  display: flex;
  justify-content: space-between;
  margin: 0.35rem 0 0;
  color: var(--av-gedempt);
  font-size: 0.75rem;
}

.keuzes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: 0.4rem;
}
.keuzes label {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.45rem 0.8rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-pill);
  background: var(--av-vlak-1);
  cursor: pointer;
}
.keuzes.groot label {
  flex: 1;
  justify-content: center;
  /* Niet afbreken: "Niet gelukt" over twee regels maakt de drie knoppen
     ongelijk hoog en dat leest als een fout. */
  white-space: nowrap;
  padding: 0.55rem 0.6rem;
}
.keuzes input {
  accent-color: var(--av-primary-donker);
}

.veld {
  display: block;
  margin: 0.7rem 0;
  font-size: 0.82rem;
  color: var(--av-tekst);
}
.veld input[type="text"],
.veld select,
.veld textarea {
  display: block;
  width: 100%;
  margin-top: 0.2rem;
  font-size: 0.95rem;
}
.veld.klein {
  display: inline-block;
  width: auto;
  margin: 0 0.5rem 0 0;
}
.veld.klein input[type="time"] {
  height: 2.2rem;
  padding: 0.4rem 0.55rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  color: var(--av-tekst);
  font: inherit;
}

fieldset.inhaal {
  padding: 0.8rem 1rem;
  border: 1px solid var(--av-groen);
  border-radius: var(--av-radius);
  background: var(--av-attentie-vlak);
}
fieldset.inhaal legend {
  color: var(--av-attentie-tekst);
}
fieldset.sidequest {
  padding: 1rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}

/* -- Terugblik en doelkaart ------------------------------------------------ */

.terugblik {
  padding: 0.7rem 1rem;
  margin: 1rem 0;
  border-left: 3px solid var(--av-primary);
  background: var(--av-vlak-1);
  border-radius: var(--av-radius-klein);
}
.terugblik .kop,
.doelkaart .kop,
.uitkomst .kop {
  margin: 0;
  color: var(--av-gedempt);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.terugblik .doel {
  margin: 0.2rem 0 0;
  font-weight: bold;
}
.uitslag.ja {
  color: var(--av-succes-tekst);
}
.uitslag.nee,
.uitslag.deels {
  color: var(--av-gedempt);
}

.doelkaart {
  padding: 1.2rem;
  margin: 1rem 0;
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  box-shadow: var(--av-schaduw);
}
.doel-groot {
  margin: 0.3rem 0 0.6rem;
  font-family: var(--av-kop);
  font-size: 1.6rem;
  line-height: 1.15;
  letter-spacing: 0.01em;
}
.doelkaart .meta {
  margin: 0;
  color: var(--av-gedempt);
  font-size: 0.85rem;
}
.doelkaart .plan {
  margin: 0.7rem 0 0;
  font-size: 0.9rem;
}
.doelkaart .plan span {
  color: var(--av-gedempt);
}
.doelkaart .resterend {
  margin: 0.8rem 0 0;
  font-family: var(--av-kop);
  font-size: 1.05rem;
  color: var(--av-primary-tekst);
}

.checkout,
.uitkomst {
  padding: 1.1rem;
  margin: 1.2rem 0;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.checkout h3 {
  margin-top: 0;
}
.uitkomst.ja {
  border-color: var(--av-succes);
}
.checkoutform button {
  margin: 0.6rem 0 0;
}
.reflectie {
  margin: 0.4rem 0 0;
  font-style: italic;
  color: var(--av-gedempt);
}

.leeg {
  padding: 1.5rem;
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  text-align: center;
}

/* -- Historie en verdeling ------------------------------------------------- */

.historie {
  list-style: none;
  margin: 0;
  padding: 0;
}
.historie li {
  padding: 0.6rem 0;
  border-bottom: 1px solid var(--av-rand);
}
.historie li:last-child {
  border-bottom: 0;
}
.historie .datum {
  color: var(--av-gedempt);
  font-size: 0.78rem;
}
.historie .doel {
  margin: 0.15rem 0;
}
.historie .plan {
  margin: 0.15rem 0;
  color: var(--av-gedempt);
  font-size: 0.85rem;
}
.historie.uitgebreid p {
  margin: 0.15rem 0;
}

.badge.ja {
  background: var(--av-succes-vlak);
  color: var(--av-succes-tekst);
}
.badge.deels {
  background: var(--av-attentie-vlak);
  color: var(--av-attentie-tekst);
}
.badge.nee,
.badge.open {
  background: var(--av-vlak-3);
  color: var(--av-tekst);
}

.balken {
  list-style: none;
  margin: 0;
  padding: 0;
}
.balken li {
  display: grid;
  grid-template-columns: 10rem 1fr 2.5rem;
  gap: 0.6rem;
  align-items: center;
  margin-bottom: 0.3rem;
  font-size: 0.85rem;
}
.balken .balk {
  height: 0.6rem;
  border-radius: var(--av-pill);
  background: var(--av-vlak-3);
  overflow: hidden;
}
.balken .balk span {
  display: block;
  height: 100%;
  background: var(--av-primary);
}
.balken .count {
  margin: 0;
  text-align: right;
  color: var(--av-gedempt);
}

/* -- Docent: lesoverzicht -------------------------------------------------- */

.telling {
  margin: 0.6rem 0;
}
/* Het raster met de ingecheckte studenten staat onderaan bij de rest van het
   lesdashboard. */
.checkins .score {
  font-family: var(--av-kop);
}
.checkins .plan {
  margin: 0.15rem 0 0;
  color: var(--av-gedempt);
  font-size: 0.85rem;
}
.namen {
  columns: 2;
  margin: 0.4rem 0 0;
  padding-left: 1.2rem;
  font-size: 0.9rem;
}

.signalen {
  list-style: none;
  margin: 0;
  padding: 0;
}
.signalen li {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: baseline;
  padding: 0.6rem 0.9rem;
  margin-bottom: 0.4rem;
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
}
.signalen li.soort-vertrouwen {
  border-left-color: var(--av-gevaar);
}
.signalen li.soort-leerlijn {
  border-left-color: var(--av-primary);
}
.signalen li.soort-niet-behaald {
  border-left-color: var(--av-groen);
}
.signalen .wat {
  color: var(--av-tekst);
}

.stand {
  margin: 0;
  padding-left: 1.4rem;
}
.stand li {
  padding: 0.35rem 0;
}
.stand .titel {
  font-weight: bold;
}
.stand .punten {
  margin-left: 0.5rem;
  font-family: var(--av-kop);
}
.stand .count {
  margin: 0 0 0 0.5rem;
  color: var(--av-gedempt);
  font-size: 0.8rem;
}

/* -- Beheerformulieren ----------------------------------------------------- */

.regelform {
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem;
  align-items: end;
  padding: 1rem;
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.regelform.breed {
  display: block;
}
.regelform .veld {
  margin: 0;
}
.openform {
  display: flex;
  align-items: end;
  gap: 0.4rem;
}
tr.uit td {
  opacity: 0.6;
}

section.gevaar {
  padding: 1rem;
  margin-top: 2rem;
  border: 1px solid var(--av-gevaar);
  border-radius: var(--av-radius);
  background: var(--av-gevaar-vlak);
}
section.gevaar h3 {
  margin-top: 0;
  color: var(--av-gevaar-tekst);
}
button.gevaarknop {
  background: var(--av-gevaar);
  color: #ffffff;
}

.login .intro {
  font-size: 1.05rem;
}
.privacy {
  padding: 1rem;
  margin-top: 2rem;
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  font-size: 0.85rem;
}
.privacy h3 {
  margin-top: 0;
}

@media (max-width: 34rem) {
  .balken li {
    grid-template-columns: 7rem 1fr 2.2rem;
  }
  .namen {
    columns: 1;
  }
}

/* -- Sidequest: wachtrij en inzendingsstatus ------------------------------- */

.wachtrij {
  padding: 1rem;
  margin: 1rem 0 1.5rem;
  border: 1px solid var(--av-groen);
  border-radius: var(--av-radius);
  background: var(--av-attentie-vlak);
}
.wachtrij h3 {
  margin-top: 0;
  color: var(--av-attentie-tekst);
}
.inzendingen {
  list-style: none;
  margin: 0.6rem 0 0;
  padding: 0;
}
.inzendingen li {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
  padding: 0.6rem 0.8rem;
  margin-bottom: 0.4rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
}
.inzendingen .titel {
  font-weight: bold;
}
.inzendingen .acties {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-left: auto;
  align-items: center;
}

/* De terugkoppeling aan de student over zijn eigen inzending. */
.inzending {
  padding: 0.8rem 1rem;
  margin: 1.2rem 0;
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
}
.inzending.nieuw {
  border-left-color: var(--av-groen);
}
.inzending.goedgekeurd {
  border-left-color: var(--av-succes);
}
.inzending .titel {
  margin: 0.2rem 0 0;
  font-weight: bold;
}
.inzending .hint {
  margin: 0.3rem 0 0;
}

/* -- Vraag 3: kaartjes, minuten en de kookwekker --------------------------- */

.vastlopen .stap {
  margin: 0.9rem 0 0.4rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.vastlopen .stap:first-of-type {
  margin-top: 0.6rem;
}

/* Kaartjes: twee kolommen op een telefoon, vier op een breed scherm. Een radio
   die je als kaart aantikt — dezelfde beweging als een kaartje pakken. */
.kaartjes {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.5rem;
}
.kaartjes label {
  position: relative;
  display: block;
  cursor: pointer;
}
.kaartjes input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}
.kaartjes span {
  display: flex;
  align-items: center;
  min-height: 3.4rem;
  height: 100%;
  padding: 0.55rem 0.7rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  font-size: 0.88rem;
  line-height: 1.25;
}
.kaartjes input:checked + span {
  border-color: var(--av-primary-donker);
  border-width: 2px;
  padding: calc(0.55rem - 1px) calc(0.7rem - 1px);
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
  font-weight: bold;
}
.kaartjes input:focus-visible + span {
  outline: 2px solid var(--av-primary);
  outline-offset: 1px;
}
.kaartjes.hulplijnen span {
  min-height: 2.8rem;
}

.schaal.minuten span small {
  display: block;
  font-family: var(--av-tekst-font);
  font-size: 0.65rem;
  font-weight: normal;
  opacity: 0.75;
}

/* -- Plannen: stappen met een tijdschatting -------------------------------- */

/* Het plan hoort bij het doel en staat daarom in dezelfde vraag; dit tussenkopje
   werkt hetzelfde als dat bij "als je vastloopt". */
.doelplan .stap {
  margin: 1rem 0 0.5rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}

.stappen {
  display: grid;
  gap: 0.5rem;
}
/* Op een breed scherm staat de tijdschatting náást de stap: dat leest als één
   regel ("dit ga ik doen, zo lang duurt het") in plaats van als twee vragen. */
.stapregel {
  display: grid;
  gap: 0.35rem;
}
@media (min-width: 40rem) {
  .stapregel {
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: 0.6rem;
  }
}
.stapregel .schaal.minuten {
  gap: 0.3rem;
}
.stapregel .schaal.minuten span {
  min-width: 3.1rem;
  padding: 0.35rem 0.4rem;
  font-size: 0.95rem;
}

.meer-stappen > summary {
  color: var(--av-link);
  font-size: 0.85rem;
  cursor: pointer;
}
.meer-stappen[open] > summary {
  margin-bottom: 0.5rem;
}
.meer-stappen .stapregel + .stapregel {
  margin-top: 0.5rem;
}

/* De optelsom terwijl je hem maakt (zie /static/plan.js). Rood is hier geen
   fout maar informatie: je plan past niet in het uur dat je hebt. */
.stapsom {
  margin: 0.2rem 0 0;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.stapsom.teveel {
  color: var(--av-gevaar);
}

/* Het plan alleen-lezen: op het dashboard, in je historie en bij de docent. */
.plan-stappen {
  list-style: none;
  margin: 0.4rem 0;
  padding: 0;
  display: grid;
  gap: 0.15rem;
}
.plan-stappen li {
  display: flex;
  justify-content: space-between;
  gap: 0.8rem;
  padding: 0.15rem 0;
  font-size: 0.88rem;
}
.plan-stappen li + li {
  border-top: 1px solid var(--av-rand);
}
.plan-stappen .hoelang {
  flex: none;
  color: var(--av-gedempt);
  font-size: 0.8rem;
}
/* Doorgestreept is hier positief: dit is af. */
.plan-stappen li.af .wat {
  color: var(--av-gedempt);
  text-decoration: line-through;
}
.planuitkomst {
  margin: 0.15rem 0;
  color: var(--av-gedempt);
  font-size: 0.8rem;
}

/* Afvinken bij de check-out. */
.stappen-af {
  margin: 0 0 0.8rem;
  padding: 0;
  border: 0;
}
.stappen-af legend {
  padding: 0;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.stappen-af label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.3rem 0;
  cursor: pointer;
}
.stappen-af .wat {
  flex: 1;
}
.stappen-af .hoelang {
  color: var(--av-gedempt);
  font-size: 0.8rem;
}

/* -- Hoofddoel: de boog boven de losse lessen ------------------------------ */

/* In het check-informulier: waar je naartoe werkt, en of dit uur daarbij hoort.
   Twee keuzes naast elkaar; "iets anders" is even groot als "hier werk ik aan",
   want het is een even geldig antwoord. */
.bijhoofddoel {
  margin: 0.9rem 0 0;
  padding: 0.6rem 0.75rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-2);
}
.bijhoofddoel .stap {
  margin: 0 0 0.4rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.bijhoofddoel .stap strong {
  color: var(--av-tekst);
}
.bijhoofddoel .keuzes {
  display: flex;
  flex-wrap: wrap;
  gap: 0.8rem;
  font-size: 0.9rem;
}

/* "hoort bij: …" onder een doel, op het dashboard en in de historie. */
.hoortbij {
  margin: 0.15rem 0;
  color: var(--av-gedempt);
  font-size: 0.8rem;
}

.vak.hoofddoel .titel {
  margin: 0.2rem 0;
  font-family: var(--av-kop);
  font-size: 1.15rem;
}
.vak.hoofddoel .voortgang {
  margin: 0.5rem 0;
}
.hoofddoel-afronden > summary {
  color: var(--av-link);
  font-size: 0.85rem;
  cursor: pointer;
}
.hoofddoelform button {
  margin-top: 0.5rem;
}

.eerdere-doelen {
  list-style: none;
  margin: 0.8rem 0 0;
  padding: 0.6rem 0 0;
  border-top: 1px solid var(--av-rand);
}
.eerdere-doelen li {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.5rem;
  padding: 0.25rem 0;
  font-size: 0.88rem;
}
.eerdere-doelen .titel {
  flex: 1;
  min-width: 0;
}
/* Losgelaten krijgt geen rood: opruimen is geen mislukking. */
.eerdere-doelen li.losgelaten .titel {
  color: var(--av-gedempt);
}

/* -- Attributie: "hoe kwam dat?" ------------------------------------------- */

/* Verschijnt pas bij "deels" of "niet gelukt" (zie /static/checkout.js). Geen
   rood, geen uitroepteken: dit is een verklaring, geen schuldvraag. */
fieldset.attributie {
  margin: 0.8rem 0 0;
  padding: 0;
  border: 0;
}
fieldset.attributie legend {
  padding: 0 0 0.4rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
fieldset.attributie .kaartjes span {
  min-height: 2.8rem;
  font-size: 0.82rem;
}

.verklaring {
  margin: 0.15rem 0;
  color: var(--av-gedempt);
  font-size: 0.85rem;
  font-style: italic;
}

/* Het vak op /mij. Eén groot getal, want dat is het hele punt; de rest is
   toelichting en staat er bewust klein onder. */
.vak.schatting .factor {
  margin: 0.2rem 0;
  font-family: var(--av-kop);
  font-size: 2.6rem;
  line-height: 1;
  color: var(--av-primary-tekst);
}
.vak.schatting .uitleg {
  margin: 0.3rem 0;
}
.vak.schatting .duiding {
  margin: 0.3rem 0 0.6rem;
  font-weight: bold;
}

/* De kookwekker op het bevestigingsscherm. */
/* `display` wint van het `hidden`-attribuut, dus dat expliciet terugzetten —
   anders staat de wekker er tóch terwijl het script hem heeft weggezet. Dit
   geldt voor elk blok in deze stylesheet dat een eigen display krijgt én met
   `hidden` wordt gestuurd. */
[hidden] {
  display: none !important;
}

.wekker {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  padding: 0.9rem 1.1rem;
  margin: 1.2rem 0;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.wekker .klok {
  margin: 0;
  font-family: var(--av-kop);
  font-size: 2rem;
  line-height: 1;
  color: var(--av-primary-tekst);
  font-variant-numeric: tabular-nums;
}
.wekker .wat {
  display: flex;
  align-items: baseline;
  gap: 0.35rem;
  flex-wrap: wrap;
  margin: 0;
  font-size: 0.9rem;
  color: var(--av-gedempt);
}
.wekker.af {
  border-color: var(--av-groen);
  background: var(--av-attentie-vlak);
}
.wekker.af .wat {
  color: var(--av-attentie-tekst);
  font-weight: bold;
}

@media (min-width: 40rem) {
  .kaartjes {
    grid-template-columns: repeat(3, 1fr);
  }
}
.signalen li.soort-geen-hulp {
  border-left-color: var(--av-primary-donker);
}
.signalen li.soort-extern {
  border-left-color: var(--av-vlak-4);
}

/* ---------------------------------------------------------------------------
 * Ticketbak en support-level.
 *
 * De drie urgentietrappen zijn bewust ongelijk zwaar. "Eén keer teruggekomen"
 * is een randje: een gebumpte ticket mag geen publieke aantekening worden dat
 * het iemand niet lukte, want dan pakt niemand nog iets moeilijks op. "Twee
 * keer" en "Mart erbij gevraagd" mogen wel schreeuwen.
 * ------------------------------------------------------------------------ */

.hulpteaser {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 0.8rem;
  padding: 0.9rem 1.1rem;
  margin: 1.2rem 0;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-2);
}
.hulpteaser p {
  margin: 0;
  font-size: 0.95rem;
}

.ticketform {
  margin: 1.4rem 0;
}
.ticketform .hint {
  margin-top: -0.3rem;
  color: var(--av-gedempt);
  font-size: 0.85rem;
}

.ticketmelding {
  padding: 0.6rem 0.9rem;
  margin: 0 0 1rem;
  border-radius: var(--av-radius);
  background: var(--av-attentie-vlak);
  color: var(--av-attentie-tekst);
  font-size: 0.9rem;
}

.ticketbak {
  list-style: none;
  margin: 0.6rem 0 1.4rem;
  padding: 0;
  display: grid;
  gap: 0.7rem;
}
.ticketbak > li {
  padding: 0.8rem 1rem;
  border: 1px solid var(--av-rand);
  border-left: 4px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.ticketbak > li.zacht {
  border-left-color: var(--av-primary);
}
.ticketbak > li.hard {
  border-left-color: var(--av-gevaar);
  background: var(--av-gevaar-vlak);
}
.ticketbak > li.docent,
.ticketbak > li.lang {
  border-left-color: var(--av-primary-donker);
  background: var(--av-attentie-vlak);
}
.ticketbak > li.eigen {
  opacity: 0.7;
}
.ticketbak .regel {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.4rem 0.6rem;
  margin: 0 0 0.3rem;
  font-size: 0.85rem;
}
.ticketbak .obstakel {
  font-weight: bold;
}
.ticketbak .omschrijving {
  margin: 0;
}
.ticketbak .wie-komt {
  margin: 0.4rem 0 0;
  font-size: 0.9rem;
}
.ticketbak .hint {
  margin: 0.4rem 0 0;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}
.ticketbak .acties,
.mijn-ticket .acties {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  margin-top: 0.6rem;
}
.ticketbak .acties form,
.mijn-ticket .acties form {
  margin: 0;
}

.vlag {
  padding: 0.1rem 0.45rem;
  border-radius: 999px;
  font-size: 0.72rem;
  font-weight: bold;
  text-transform: uppercase;
  letter-spacing: 0.02em;
}
.vlag.zacht {
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.vlag.hard {
  background: var(--av-gevaar);
  color: #ffffff;
}
.vlag.docent,
.vlag.lang {
  background: var(--av-primary-donker);
  color: var(--av-op-accent);
}

/* De docentknop is nadrukkelijk geen noodrem: hem indrukken kost je je halve
   punt niet, en dat mag te zien zijn. */
button.docentknop {
  background: var(--av-primary-donker);
  color: var(--av-op-accent);
  border-color: var(--av-primary-donker);
}

.mijn-ticket {
  padding: 0.9rem 1.1rem;
  margin: 1.2rem 0;
  border: 1px solid var(--av-rand);
  border-left: 4px solid var(--av-primary);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.mijn-ticket.hard {
  border-left-color: var(--av-gevaar);
}
.mijn-ticket.docent {
  border-left-color: var(--av-primary-donker);
  background: var(--av-attentie-vlak);
}
.mijn-ticket .kop {
  margin: 0 0 0.3rem;
  font-family: var(--av-kop);
  letter-spacing: 0.02em;
}
.mijn-ticket .obstakel {
  margin: 0;
  font-weight: bold;
}
.mijn-ticket .omschrijving,
.mijn-ticket .wie-komt {
  margin: 0.2rem 0 0;
}
.mijn-ticket .hint {
  margin: 0.5rem 0 0;
  font-size: 0.82rem;
  color: var(--av-gedempt);
}
.mijn-ticket .hint.sterk {
  color: var(--av-attentie-tekst);
  font-weight: bold;
}


.docent-tickets {
  margin-bottom: 1.6rem;
}
.supportstand {
  margin-top: 2rem;
}

/* De rem op een import die een groot deel van een klas zou buitensluiten. */
.bevestigen {
  padding: 1rem 1.1rem;
  margin: 1.2rem 0;
  border: 1px solid var(--av-gevaar);
  border-left: 4px solid var(--av-gevaar);
  border-radius: var(--av-radius);
  background: var(--av-gevaar-vlak);
}
.bevestigen h3 {
  margin-top: 0;
  color: var(--av-gevaar-tekst);
}
.bevestigen .hint {
  font-size: 0.85rem;
  color: var(--av-gevaar-tekst);
}
.klaslijst .filters {
  margin-bottom: 0.6rem;
}

/* ---------------------------------------------------------------------------
 * Het in-sessie dashboard: links wat je doet, rechts wie je nodig heeft.
 * Onder 60rem klapt het naar één kolom en staat de hulpbak onder je focus —
 * op een telefoon is je eigen doel het eerste wat je wilt zien.
 * ------------------------------------------------------------------------ */

.lesdashboard {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.2rem;
  align-items: start;
}
@media (min-width: 60rem) {
  .lesdashboard {
    grid-template-columns: minmax(0, 3fr) minmax(16rem, 2fr);
  }
  /* Staat support uit, dan is er geen tweede kolom om ruimte voor vrij te
     houden: alles wordt één brede baan. */
  .lesdashboard.zonder-support {
    grid-template-columns: minmax(0, 1fr);
  }
  .lesdashboard .kolom-onder {
    grid-column: 1 / -1;
  }
}

.klokregel {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin-bottom: 0.6rem;
}
.klokregel .klok {
  font-family: var(--av-kop);
  font-size: 1.6rem;
  line-height: 1;
  color: var(--av-primary-tekst);
  font-variant-numeric: tabular-nums;
}
.klokregel .klok strong {
  font-weight: inherit;
}
.klokregel .klok-wat {
  font-size: 0.85rem;
  color: var(--av-gedempt);
}
.klokregel .groepnaam {
  margin-left: auto;
}

.doelkaart.groot .doel-groot {
  font-size: 1.5rem;
  line-height: 1.25;
}

.hulplijn-bijstellen {
  margin: 0.8rem 0 1.2rem;
}
.hulplijn-bijstellen summary {
  cursor: pointer;
  font-size: 0.9rem;
  color: var(--av-link);
}
.hulplijn-bijstellen .hint {
  font-size: 0.85rem;
  color: var(--av-gedempt);
}

.eerdere-blokken ul {
  list-style: none;
  padding: 0;
  margin: 0.4rem 0 0;
  display: grid;
  gap: 0.35rem;
}
.eerdere-blokken li {
  font-size: 0.9rem;
}

/* De hulpbak als kaarten. De kleur is de urgentie; de legenda staat eronder
   zodat niemand hoeft te raden wat oranje betekent. */
.bakkop {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
}
.bakkop h3 {
  margin: 0;
}
.bakkaarten {
  list-style: none;
  padding: 0;
  margin: 0.6rem 0 0.5rem;
  display: grid;
  gap: 0.5rem;
}
.bakkaarten .kaart {
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--av-rand);
  border-left: 4px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  font-size: 0.9rem;
}
.bakkaarten .kaart .regel {
  display: flex;
  justify-content: space-between;
  gap: 0.5rem;
  margin: 0 0 0.2rem;
  font-size: 0.8rem;
}
.bakkaarten .kaart .obstakel {
  font-weight: bold;
}
.bakkaarten .kaart .omschrijving {
  margin: 0 0 0.4rem;
}
.bakkaarten .kaart p:last-child {
  margin-bottom: 0;
}
.bakkaarten .kaart.vers {
  border-left-color: var(--av-succes);
}
/* De docent is erbij geroepen: geen gewone verse vraag meer. Deze stond hier
   niet, waardoor de kaart groen "nieuw" bleef terwijl de vlag erboven iets
   anders zei. */
.bakkaarten .kaart.docent {
  /* Alleen de rand, geen vlak: een hardgecodeerde lichte achtergrond zou in het
     donkere thema een witte pleister zijn. */
  border-left-color: #7b4fb8;
}
.bakkaarten .kaart.wacht {
  border-left-color: var(--av-wacht);
  background: var(--av-wacht-vlak);
  color: var(--av-wacht-tekst);
}
/* Alles ín zo'n kaart erft de statuskleur: `muted` en `klein` hebben hun eigen
   kleur, en die kwam in het donkere thema uit op grijs-op-donkerbruin. */
.bakkaarten .kaart.wacht .muted,
.bakkaarten .kaart.wacht .obstakel,
.bakkaarten .kaart.wacht .hint,
.bakkaarten .kaart.wacht summary {
  color: inherit;
}
.bakkaarten .kaart.vast {
  border-left-color: var(--av-gevaar);
  background: var(--av-gevaar-vlak);
  color: var(--av-gevaar-tekst);
}
.bakkaarten .kaart.vast .muted,
.bakkaarten .kaart.vast .obstakel,
.bakkaarten .kaart.vast .hint,
.bakkaarten .kaart.vast summary {
  color: inherit;
}
.bakkaarten .kaart.eigen {
  border-left-color: var(--av-primary-donker);
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.bakkaarten .kaart.eigen .muted,
.bakkaarten .kaart.eigen .obstakel,
.bakkaarten .kaart.eigen .hint,
.bakkaarten .kaart.eigen summary {
  color: inherit;
}

.baklegenda {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.15rem 0.8rem;
  font-size: 0.75rem;
  color: var(--av-gedempt);
}
.baklegenda li {
  display: flex;
  align-items: center;
  gap: 0.3rem;
}
.baklegenda .stip {
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 2px;
  display: inline-block;
}
.baklegenda .stip.vers { background: var(--av-succes); }
.baklegenda .stip.wacht { background: var(--av-wacht); }
.baklegenda .stip.vast { background: var(--av-gevaar); }
.baklegenda .stip.eigen { background: var(--av-primary-donker); }
.baklegenda .stip.docent { background: #7b4fb8; }

/* Afronden zit achter een knop: het is het laatste wat je deze les doet en
   hoort niet het hele uur in beeld te staan. */
.afronden {
  margin-top: 0.5rem;
  padding: 0.7rem 1rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-2);
}
.afronden summary {
  cursor: pointer;
  font-family: var(--av-kop);
  font-size: 1.1rem;
  letter-spacing: 0.02em;
}
.afrondkeuze {
  display: grid;
  gap: 1rem;
  margin-top: 0.8rem;
}
@media (min-width: 45rem) {
  .afrondkeuze {
    grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  }
}
.afrondkeuze .keuzeblok h4 {
  margin: 0 0 0.2rem;
}
.afrondkeuze .hint {
  margin: 0 0 0.5rem;
  font-size: 0.85rem;
  color: var(--av-gedempt);
}
.nieuwe-focus summary {
  cursor: pointer;
  color: var(--av-link);
}

/* ---------------------------------------------------------------------------
 * Mijn stats: vier vakken, en het support-embleem.
 * ------------------------------------------------------------------------ */

.statsdashboard {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.2rem;
  align-items: start;
}
@media (min-width: 55rem) {
  .statsdashboard {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.statsdashboard .vak {
  padding: 1rem 1.1rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  min-width: 0;
}
.statsdashboard .vak h3 {
  margin-top: 0;
}
.statsdashboard .historie {
  max-height: 32rem;
  overflow-y: auto;
}

/* Het embleem. Alle kleur zit in variabelen per rang, zodat de vorm in
   _crest.njk geen enkele kleur hoeft te kennen.
   Deze kleuren zijn bewust vaste waarden en geen thematokens: een embleem is
   als een logo, het hoort er in beide modi hetzelfde uit te zien. Het schild
   vult zijn eigen vlak, dus het leest op licht en donker even goed. */
.supportkaart {
  text-align: center;
}
.crest {
  width: 100%;
  max-width: 9rem;
  height: auto;
  /* Tier 0 is blanco: alleen een omtrek, verder niets om te laten zien. */
  --crest-rand: var(--av-vlak-4);
  --crest-top: var(--av-vlak-2);
  --crest-onder: var(--av-vlak-3);
  --crest-band: var(--av-vlak-4);
  --crest-inkt: var(--av-gedempt);
  --crest-laurier: transparent;
}
.crest .schild {
  fill: url(#crestveld);
  stroke: var(--crest-rand);
  stroke-width: 4;
  stroke-linejoin: round;
}
.crest .veld-top { stop-color: var(--crest-top); }
.crest .veld-onder { stop-color: var(--crest-onder); }
.crest .band {
  fill: var(--crest-band);
}
.crest .punten {
  font-family: var(--av-kop);
  font-size: 15px;
  fill: var(--crest-inkt);
  letter-spacing: 0.03em;
}
.crest .laurier path {
  fill: none;
  stroke: var(--crest-laurier);
  stroke-width: 5;
  stroke-linecap: round;
}

.crest.rang-1, .crest.rang-3 {
  --crest-rand: #a97142; --crest-top: #e8cdb2; --crest-onder: #c99b6e;
  --crest-band: #8c5c34; --crest-inkt: #ffffff;
}
.crest.rang-6, .crest.rang-10 {
  --crest-rand: #8d9298; --crest-top: #eceef0; --crest-onder: #c2c7cc;
  --crest-band: #6f757c; --crest-inkt: #ffffff;
}
.crest.rang-15, .crest.rang-25 {
  --crest-rand: var(--av-primary-donker); --crest-top: #d3eef4; --crest-onder: #8ccedb;
  --crest-band: var(--av-primary-donker); --crest-inkt: #ffffff;
  --crest-laurier: var(--av-primary);
}
.crest.rang-40, .crest.rang-60 {
  --crest-rand: #6f8419; --crest-top: #eef6d0; --crest-onder: var(--av-groen);
  --crest-band: #6f8419; --crest-inkt: #ffffff;
  --crest-laurier: var(--av-groen);
}
.crest.rang-80 {
  --crest-rand: #b8860b; --crest-top: #fdf3d2; --crest-onder: #e8c25a;
  --crest-band: #8a6508; --crest-inkt: #fff8e1;
  --crest-laurier: #d4a017;
}

/* De rangbalk zit strak onder het embleem: naam eerst, dan hoe ver je bent. */
.rangbalk {
  margin: 0.4rem 0 0;
  padding: 0.25rem 0.6rem;
  border-radius: var(--av-radius);
  font-family: var(--av-kop);
  font-size: 1.15rem;
  letter-spacing: 0.03em;
  background: var(--av-vlak-3);
  color: var(--av-tekst);
}
.rangbalk.rang-1, .rangbalk.rang-3 { background: #8c5c34; color: #fff; }
.rangbalk.rang-6, .rangbalk.rang-10 { background: #6f757c; color: #fff; }
.rangbalk.rang-15, .rangbalk.rang-25 { background: var(--av-primary-donker); color: var(--av-op-accent); }
.rangbalk.rang-40, .rangbalk.rang-60 { background: #6f8419; color: #fff; }
.rangbalk.rang-80 { background: #8a6508; color: #fff8e1; }

.xpbalk {
  display: block;
  height: 0.55rem;
  margin: 0.45rem 0 0.25rem;
  border-radius: 999px;
  background: var(--av-vlak-3);
  overflow: hidden;
}
.xpbalk span {
  display: block;
  height: 100%;
  background: var(--av-primary);
}
.xptekst {
  margin: 0;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}
.motivatie {
  margin: 0.6rem 0 0;
  font-size: 0.9rem;
  font-style: italic;
  color: var(--av-tekst);
}

.supporthistorie {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 0.5rem;
  max-height: 32rem;
  overflow-y: auto;
}
.supporthistorie li {
  padding: 0.55rem 0.7rem;
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  background: var(--av-vlak-2);
  font-size: 0.9rem;
}
.supporthistorie li.opgelost { border-left-color: var(--av-succes); }
.supporthistorie li.docent_erbij { border-left-color: var(--av-primary-donker); }
.supporthistorie li.niet_opgelost { border-left-color: #c9760a; }
.supporthistorie .regel {
  display: flex;
  justify-content: space-between;
  gap: 0.5rem;
  margin: 0 0 0.2rem;
  font-size: 0.8rem;
}
.supporthistorie .obstakel { font-weight: bold; }
.supporthistorie .omschrijving { margin: 0 0 0.25rem; }
.supporthistorie .opbrengst {
  margin: 0;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}

/* "Wat heb je gedaan?" staat achter de knop en niet ervoor: geholpen melden
   moet één tik blijven, want die tik houdt het puntensysteem draaiend. */
.geholpenform .toelichting {
  margin-top: 0.35rem;
}
.geholpenform .toelichting summary {
  cursor: pointer;
  font-size: 0.78rem;
  color: var(--av-link);
}
.geholpenform .toelichting input {
  display: block;
  width: 100%;
  margin-top: 0.3rem;
}
.geholpenform .toelichting .hint {
  display: block;
  font-size: 0.72rem;
  color: var(--av-gedempt);
}
.supporthistorie .watgedaan {
  margin: 0.3rem 0 0;
  padding-left: 0.6rem;
  border-left: 2px solid var(--av-vlak-4);
  font-size: 0.85rem;
  font-style: italic;
}

/* De sidequest-log: wat je koos en hoeveel van de klas hetzelfde wilde. */
.statsdashboard .questlog {
  grid-column: 1 / -1;
}
.quests {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 0.7rem;
}
.quests > li .datum {
  margin: 0 0 0.2rem;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}
.quests .keuzes {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 0.25rem;
}
.quests .keuzes li {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  font-size: 0.9rem;
}
.quests .rang {
  flex: 0 0 auto;
  font-family: var(--av-kop);
  color: var(--av-gedempt);
}
.quests .titel {
  flex: 1 1 10rem;
  min-width: 0;
}
/* In je eentje gekozen is geen mislukking maar een eigen smaak; daarom een
   subtiel merkteken en geen waarschuwing. */
.quests .keuzes li.alleen .titel {
  font-style: italic;
}
.quests .deel {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  flex: 0 0 auto;
  font-size: 0.78rem;
  color: var(--av-gedempt);
  font-variant-numeric: tabular-nums;
}
.quests .deelbalk {
  display: block;
  width: 4rem;
  height: 0.4rem;
  border-radius: 999px;
  background: var(--av-vlak-3);
  overflow: hidden;
}
.quests .deelbalk span {
  display: block;
  height: 100%;
  background: var(--av-primary);
}

/* De check-in in twee kolommen op een breed scherm. De vragen blijven allemaal
   staan — ze zijn het instrument — maar acht blokken onder elkaar is een rit
   waar je doorheen scrollt in plaats van over nadenkt. Links wat je gaat doen,
   rechts wat je doet als het misgaat. Onder 62rem gewoon onder elkaar. */
.breed {
  max-width: 62rem;
  margin: 0 auto;
}
@media (min-width: 62rem) {
  .focusform.tweekoloms {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 1.2rem 1.6rem;
    align-items: start;
  }
  /* De inhaalvraag, de sidequest en de knop lopen over de volle breedte: de
     eerste hoort bovenaan bij beide kolommen, de laatste sluit het formulier af.
     Links waar je voor gaat, rechts wat je doet als het misgaat. */
  .focusform.tweekoloms .vraag.inhaal,
  .focusform.tweekoloms .vraag.sidequest,
  .focusform.tweekoloms > button {
    grid-column: 1 / -1;
  }
}

/* -- De blokken van het check-informulier ---------------------------------- *
 * Elk onderwerp een eigen zachte omlijning. Dat is niet alleen versiering: de
 * vragen horen per twee of drie bij elkaar, en een streep bovenlangs (wat het
 * was) laat dat niet zien. De kleuren zijn bewust flauw — het formulier mag
 * geen stoplicht worden. */
.focusform .vraag.doelplan,
.focusform .vraag.vastlopen,
.focusform .vraag.sidequest {
  border: 1px solid var(--av-rand);
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  padding: 0.9rem 1.1rem 1.2rem;
  background: var(--av-vlak-1);
}
.focusform .vraag.doelplan {
  border-left-color: var(--av-thema-focus);
}
.focusform .vraag.vastlopen {
  border-left-color: var(--av-thema-support);
}
.focusform .vraag.sidequest {
  border-left-color: var(--av-thema-sidequest);
}
.focusform .vraag legend {
  padding-inline: 0.2rem;
}
/* Zonder JS staan de tussenkopjes te dicht op het veld ervoor. */
.focusform .vraag .stap {
  margin: 1rem 0 0.4rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.focusform .vraag .stap:first-of-type {
  margin-top: 0.5rem;
}
.focusform .vraag .hint + input,
.focusform .vraag .hint + select {
  margin-top: 0.15rem;
}

/* Het blok waar je nog iets vergeten bent (zie /static/formcheck.js). De rand
   is de melding: de browser zet zijn eigen tekstballon bij het veldje, en in
   twee kolommen staat dat regelmatig buiten beeld.

   Niet aan .focusform hangen en wél specifiek genoeg om te winnen: de regel
   stond eerst als `.focusform fieldset.mist` en verloor van
   `.focusform .vraag.doelplan`, waardoor er zichtbaar níets veranderde — en
   buiten het check-informulier bestond hij helemaal niet. */
fieldset.mist,
.focusform fieldset.mist,
.focusform .vraag.mist,
.checkoutform .mist,
.stapform .mist {
  border: 1px solid var(--av-gevaar);
  border-left: 4px solid var(--av-gevaar);
  background: var(--av-gevaar-vlak);
}

/* "Anders, namelijk…" — alleen in beeld als dat kaartje aanstaat. Kent een
   browser :has() niet, dan staat het veld er gewoon: overbodig, nooit stuk. */
.vastlopen:has(.kaartjes input[value="anders"]) .anders-tekst {
  display: none;
}
.vastlopen:has(.kaartjes input[value="anders"]:checked) .anders-tekst {
  display: block;
  margin-top: 0.6rem;
}

/* -- Zetkaarten: wat je doet als je vastloopt ------------------------------ *
 * Grotere kaarten dan de obstakel-kaartjes, want er staat les op. De uitleg
 * staat er altijd; de tips verschijnen pas als je de kaart kiest. Vier kaarten
 * met alle tips open is een muur tekst, één kaart met drie tips is onderwijs. */
.zetkaarten {
  display: grid;
  gap: 0.5rem;
  border: 0;
  margin: 0;
  padding: 0;
}
.zetkaarten legend {
  padding: 0;
  color: var(--av-gedempt);
  font-size: 0.82rem;
}
.zetkaart {
  position: relative;
  display: block;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
  cursor: pointer;
}
.zetkaart input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}
.zetkaart .kop {
  display: block;
  font-weight: bold;
  font-size: 0.92rem;
}
.zetkaart .uitleg {
  display: block;
  margin-top: 0.15rem;
  color: var(--av-gedempt);
  font-size: 0.82rem;
  line-height: 1.35;
}
.zetkaart .tips {
  display: none;
  margin: 0.5rem 0 0;
  padding-left: 1.1rem;
  font-size: 0.82rem;
  line-height: 1.4;
}
.zetkaart .tips li {
  margin: 0.2rem 0;
}
.zetkaart:has(input:checked) {
  border-color: var(--av-primary-donker);
  border-width: 2px;
  padding: calc(0.6rem - 1px) calc(0.75rem - 1px);
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.zetkaart:has(input:checked) .uitleg {
  color: var(--av-primary-tekst);
}
.zetkaart:has(input:checked) .tips {
  display: block;
}
.zetkaart:has(input:focus-visible) {
  outline: 2px solid var(--av-primary);
  outline-offset: 1px;
}

/* Plusje en minnetje onder het plan. Verborgen tot plan.js ze aanzet. */
.stapknoppen {
  display: flex;
  gap: 0.4rem;
  margin-top: 0.2rem;
}
.stapknoppen button[disabled] {
  opacity: 0.4;
  cursor: default;
}

/* -- Op het dashboard ------------------------------------------------------ */

/* Stap erbij zetten tijdens de les; waar "nu opsplitsen" op uitkomt. */
.plan-bijwerken > summary {
  color: var(--av-link);
  font-size: 0.85rem;
  cursor: pointer;
}
.plan-bijwerken .stapregel {
  display: grid;
  gap: 0.35rem;
  margin: 0.4rem 0;
}
@media (min-width: 40rem) {
  .plan-bijwerken .stapregel {
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    gap: 0.6rem;
  }
}


.sidequestkaart {
  margin-top: 1.2rem;
  padding: 0.9rem 1rem;
  border: 1px solid var(--av-rand);
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.sidequestkaart h3 {
  margin-top: 0;
}
.sidequestkaart .veld {
  display: block;
  margin-bottom: 0.5rem;
  font-size: 0.85rem;
}
.sidequestkaart .inzending {
  margin-top: 0.6rem;
  font-size: 0.82rem;
  color: var(--av-gedempt);
}

/* -- "Wat is het volgende op je planning?" --------------------------------- *
 * Hier stond "klaar voor vandaag": een deur die dichtvalt terwijl er nog een
 * half uur les is. Dezelfde indeling als het focusdashboard, inclusief de
 * tickets ernaast — klaar zijn is precies het moment om iemand te helpen. */
.watnu {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.2rem;
  align-items: start;
}
@media (min-width: 60rem) {
  .watnu {
    grid-template-columns: minmax(0, 3fr) minmax(16rem, 2fr);
  }
}
.watnu .acties {
  margin: 0.8rem 0 0.4rem;
}

/* -- Support --------------------------------------------------------------- *
 * Linksboven wie je bent als helper, rechtsboven de tickets, en daaronder de
 * knop om zelf iets in te brengen. Wat jij hebt opgepakt staat bovenaan de
 * lijst: dit is het scherm waar je op landt ná het oppakken. */
.supportdashboard {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.2rem;
  align-items: start;
}
@media (min-width: 60rem) {
  .supportdashboard {
    grid-template-columns: minmax(14rem, 1fr) minmax(0, 2fr);
  }
  .supportdashboard .kolom-onder {
    grid-column: 1 / -1;
  }
}
.supportdashboard .kolom-onder .ticketform {
  max-width: 42rem;
  margin: 0 auto;
}
.anderslijst > summary {
  color: var(--av-link);
  font-size: 0.85rem;
  cursor: pointer;
}
.anderslijst .regels {
  margin: 0.4rem 0 0.8rem;
  padding-left: 1.2rem;
  font-size: 0.88rem;
}

.ikhelp-lijst {
  margin-bottom: 1.2rem;
}
.ticketbak li.ikhelp {
  border-left: 3px solid var(--av-primary-donker);
}



/* ---------------------------------------------------------------------------
 * Bevestigingen. De app kon dit al (`ticketmelding`) en gebruikte het bijna
 * nergens: je klikte, de pagina laadde opnieuw, en je moest zelf gaan zoeken of
 * het gelukt was. Eén klasse, overal dezelfde vorm.
 * ------------------------------------------------------------------------ */

.melding {
  padding: 0.6rem 0.9rem;
  margin: 0 0 1rem;
  border-radius: var(--av-radius);
  background: var(--av-attentie-vlak);
  color: var(--av-attentie-tekst);
  font-size: 0.9rem;
}

/* Wat je zojuist afrondde, boven de pagina waar je daarna landt. */
.netafgerond {
  padding: 0.9rem 1.1rem;
  margin: 0 0 1.2rem;
  border: 1px solid var(--av-succes);
  border-left: 4px solid var(--av-succes);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.netafgerond.nee {
  border-color: var(--av-rand);
  border-left-color: var(--av-gedempt);
}
.netafgerond .kop {
  margin: 0;
  font-weight: bold;
}
.netafgerond .doel {
  margin: 0.2rem 0 0.4rem;
}
.netafgerond p.klein {
  margin: 0.2rem 0 0;
  color: var(--av-gedempt);
}

/* "mag je overslaan" achter een legend: dat een blok optioneel is, is nergens
   uit af te leiden als alles er even verplicht uitziet. */
.optioneel {
  margin-left: 0.4rem;
  padding: 0.1rem 0.4rem;
  border-radius: 999px;
  background: var(--av-vlak-2);
  color: var(--av-gedempt);
  font-size: 0.7rem;
  font-weight: normal;
  text-transform: none;
  letter-spacing: 0;
  vertical-align: middle;
}

/* Het vangnet-blok op de beheerschermen: bewust rustig, want ClassHub blijft de
   hoofdweg. Wel altijd bereikbaar — anders is een storing in de koppeling het
   einde van de app. */
.handmatig {
  margin: 1.4rem 0 0;
  padding: 0.8rem 1rem;
  border: 1px dashed var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.handmatig > summary {
  cursor: pointer;
  font-weight: bold;
  font-size: 0.9rem;
}
.handmatig .hint {
  margin: 0.5rem 0 0.8rem;
  font-size: 0.85rem;
  color: var(--av-gedempt);
}
.handmatig textarea {
  width: 100%;
  min-height: 4.5rem;
  font-family: inherit;
}

/* De foutenlijst die formcheck.js schrijft als de browser het versturen
   tegenhoudt. Zelfde vorm als de lijst die de server teruggeeft: het is
   dezelfde soort mededeling, en het hoort niet als een tweede app te lezen.
   In een tweekoloms formulier moet hij over de volle breedte. */
.fouten.vanbrowser {
  grid-column: 1 / -1;
}
.fouten.vanbrowser p {
  margin: 0;
  font-weight: bold;
}

/* "Waar je hulp bij kreeg" op /mij — de tegenhanger van "waar je mee hebt
   geholpen". Bewust zonder puntenteller: hulp vrágen levert nooit punten op. */
.vak.gekregen .opbrengst {
  margin: 0.3rem 0 0;
  font-size: 0.85rem;
  color: var(--av-gedempt);
}

/* De uitkomst van je eigen hulpvraag, op je werkscherm. */
.hulp-afgerond {
  padding: 0.8rem 1rem;
  margin: 0 0 1rem;
  border: 1px solid var(--av-succes);
  border-left: 4px solid var(--av-succes);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.hulp-afgerond .kop {
  margin: 0;
  font-weight: bold;
}
.hulp-afgerond .reflectie {
  margin: 0.3rem 0 0;
}

/* "Je plan is 1u en de les heeft er nog 46 min." */
.hint.teveel {
  color: var(--av-gevaar-tekst);
}

/* Het lesdashboard compacter: het plan en de afspraak staan een klik verderop.
   Bij 25 studenten is dit scherm anders tien regels per focusblok, en dan zoek
   je de student die achterloopt met scrollen. */
.checkins .plan-kort > summary,
.checkins .afspraak > summary {
  cursor: pointer;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}
.checkins .plan-kort,
.checkins .afspraak {
  margin: 0.2rem 0;
}

/* Een legend die alleen voor schermlezers bestaat. De keuze Gelukt/Deels/Niet
   gelukt zit sinds kort in een fieldset (zodat formcheck.js het blok kan
   markeren), maar een zichtbare kop erboven zou het afrondblok onnodig zwaar
   maken. */
.visueel-verborgen {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* De stapregel is nu een fieldset in plaats van een div, om dezelfde reden.
   Fieldsets komen met een eigen rand en marge; die horen hier niet. */
fieldset.stapregel {
  border: 0;
  padding: 0;
  margin: 0;
  min-inline-size: 0;
}
fieldset.stapregel.mist {
  border: 1px solid var(--av-gevaar);
  border-left: 4px solid var(--av-gevaar);
  padding: 0.5rem;
}

/* ---------------------------------------------------------------------------
 * De 1e keuze van de sidequest: uit het lijstje, of zelf iets bedenken.
 *
 * Het invoerveld voor een eigen onderwerp stond eerst als derde veld onderaan,
 * met een regel eronder die uitlegde dat het je 1e keuze werd. Als schakelaar
 * ís het die keuze, en hoef je die zin niet te lezen. Alles met :has(), net als
 * "Anders, namelijk…" hierboven — kent een browser dat niet, dan staan beide
 * velden er gewoon: hooguit overbodig, nooit stuk.
 * ------------------------------------------------------------------------ */

.eerstekeuze {
  display: grid;
  gap: 0.4rem;
  margin-bottom: 0.8rem;
}
.eerstekeuze .keuzekop {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  flex-wrap: wrap;
}
.eerstekeuze .keuzekop .wat {
  font-weight: bold;
  font-size: 0.9rem;
}

/* De schakelaar zelf: tekst met een pil erachter. De pil is de knop; het bolletje
   staat links als hij uit is en rechts als hij aan is. */
.schakelaar {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  cursor: pointer;
  font-size: 0.85rem;
  color: var(--av-gedempt);
  user-select: none;
}
.schakelaar input {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
}
.schakelaar .pil {
  position: relative;
  flex: none;
  width: 2.6rem;
  height: 1.4rem;
  border: 1px solid var(--av-vlak-4);
  border-radius: 999px;
  background: var(--av-vlak-2);
  transition: background-color 0.12s ease, border-color 0.12s ease;
}
.schakelaar .pil::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: calc(1.4rem - 6px);
  height: calc(1.4rem - 6px);
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 1px 2px rgb(0 0 0 / 0.25);
  transition: transform 0.12s ease;
}
.schakelaar input:checked + .schakeltekst {
  color: var(--av-tekst);
  font-weight: bold;
}
.schakelaar input:checked ~ .pil {
  border-color: var(--av-succes);
  background: var(--av-succes);
}
.schakelaar input:checked ~ .pil::after {
  transform: translateX(1.2rem);
}
.schakelaar input:focus-visible ~ .pil {
  outline: 2px solid var(--av-primary);
  outline-offset: 2px;
}

/* Wat je ziet hangt aan de stand van de schakelaar. */
.eerstekeuze:has(.schakelaar input) .eigenveld {
  display: none;
}
.eerstekeuze:has(.schakelaar input:checked) .uitlijst {
  display: none;
}
.eerstekeuze:has(.schakelaar input:checked) .eigenveld {
  display: block;
}
.eerstekeuze .eigenveld.hint {
  margin: 0;
  font-size: 0.8rem;
}

/* De vertrouwensschaal als gezichten. Groter dan de cijfers waren, want een
   emoji op 1,2rem is een vlekje. */
.schaal.vertrouwen .gezicht {
  padding: 0.35rem 0;
  font-size: 1.7rem;
  line-height: 1.2;
  font-family:
    "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", sans-serif;
}

/* ---------------------------------------------------------------------------
 * De afsluiting van de lés — groen en bovenaan, los van "verder met iets
 * anders". Die twee stonden in hetzelfde blok onderaan, en dan is niet meer te
 * zien of je een taak afrondt of je uur afsluit. Dit is het moment waarop de
 * reflectie het meeste oplevert en waarop de meeste studenten hun tas pakken,
 * dus het staat waar je het niet kunt missen.
 * ------------------------------------------------------------------------ */

.lesafsluiting {
  padding: 1rem 1.2rem;
  margin: 0 0 1.4rem;
  border: 1px solid var(--av-succes);
  border-left: 5px solid var(--av-succes);
  border-radius: var(--av-radius);
  background: var(--av-succes-vlak);
}
.lesafsluiting .kop {
  margin: 0;
  font-family: var(--av-kop);
  font-size: 1.25rem;
  color: var(--av-succes-tekst);
}
.lesafsluiting .hint {
  margin: 0.3rem 0 0.8rem;
  color: var(--av-succes-tekst);
}

/* Dít doel afronden, onderaan de kaart van dat doel. */
.focus-afronden {
  margin: 1rem 0 0;
  padding-top: 0.8rem;
  border-top: 1px solid var(--av-rand);
}
.focus-afronden > summary {
  cursor: pointer;
  font-weight: bold;
  font-size: 0.9rem;
}
.focus-afronden .hint {
  margin: 0.4rem 0 0.6rem;
}

/* De lege ticketbak als kaart in plaats van een kale zin. */
.leegkaart {
  padding: 0.9rem 1rem;
  margin: 0;
  border: 1px dashed var(--av-rand);
  border-radius: var(--av-radius);
  color: var(--av-gedempt);
  font-size: 0.85rem;
}

/* Je eigen vraag beheren, in de kaart zelf. */
.ticketbeheer {
  margin-top: 0.5rem;
}
.ticketbeheer > summary {
  cursor: pointer;
  font-size: 0.8rem;
  color: var(--av-primary-tekst);
}
.ticketbeheer .acties {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin-top: 0.5rem;
}
.ticketbeheer .veld {
  margin-top: 0.5rem;
}

/* Een vraag in de bak zetten zonder de pagina te verlaten. */
.ticketdialoog {
  width: min(34rem, calc(100vw - 2rem));
  padding: 1.2rem 1.4rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  color: var(--av-tekst);
}
.ticketdialoog::backdrop {
  background: rgb(0 0 0 / 0.45);
}
.ticketdialoog h3 {
  margin: 0;
}
.ticketdialoog .sluitrij {
  float: right;
  margin: -0.4rem -0.4rem 0 0;
}
.ticketdialoog .sluit {
  border: 0;
  background: none;
  color: var(--av-gedempt);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
}

/* Het infoknopje bij "tot je volgende zet". De uitleg en de tips staan bij het
   kiezen op het scherm en verdwijnen daarna — terwijl je ze juist nodig hebt op
   het moment dat de klok afloopt. */
.zetinfo {
  display: inline-block;
  vertical-align: middle;
}
.zetinfo > summary {
  display: inline-grid;
  place-items: center;
  width: 1.25rem;
  height: 1.25rem;
  margin-left: 0.35rem;
  border: 1px solid currentColor;
  border-radius: 50%;
  font-family: var(--av-kop);
  font-size: 0.75rem;
  line-height: 1;
  cursor: pointer;
  list-style: none;
  opacity: 0.75;
}
.zetinfo > summary::-webkit-details-marker {
  display: none;
}
.zetinfo > summary:hover {
  opacity: 1;
}
.zetinfo .zetuitleg {
  margin-top: 0.5rem;
  padding: 0.6rem 0.8rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-2);
  font-size: 0.82rem;
  font-weight: normal;
  text-align: left;
}
.zetinfo .zetuitleg p {
  margin: 0 0 0.4rem;
}
.zetinfo .zetuitleg .tips {
  margin: 0;
  padding-left: 1.1rem;
}
.zetinfo .zetuitleg .tips li {
  margin: 0.2rem 0;
}

/* Twee keer hetzelfde onderwerp — gezegd op het moment dat je het doet. */
.dubbelmelding {
  display: block;
  margin-top: 0.3rem;
  color: var(--av-gevaar-tekst);
  font-size: 0.8rem;
}

/* Je al ingediende eigen onderwerp, achter de schakelaar. */
.eigen-ingediend {
  margin: 0;
  padding: 0.45rem 0.6rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-1);
}

/* Onderdelen aan of uit, op het instellingenscherm. */
.modulelijst {
  list-style: none;
  margin: 0.6rem 0 0;
  padding: 0;
  display: grid;
  gap: 0.5rem;
}
.modulelijst li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
}
.modulelijst .naam {
  margin: 0;
  font-weight: bold;
}
.modulelijst .muted.klein {
  margin: 0.2rem 0 0;
}

/* ---------------------------------------------------------------------------
 * Dezelfde drie kleuren op het dashboard als in het check-informulier.
 *
 * Het formulier waarmee je je uur begint kleurt zijn blokken al — blok 1 is
 * focus, blok 2 is wat je doet als je vastloopt. Het dashboard erna was één
 * grijze vlakte, dus die herkenning was na het versturen weg. Nu draagt elk
 * onderdeel zijn eigen kleur mee: focus turquoise, support groen, sidequest
 * violet. Alleen als accent — een rand en een kop — want het scherm moet een
 * werkscherm blijven en geen kleurenkaart.
 * ------------------------------------------------------------------------ */

.lesdashboard .doelkaart.groot,
.lesdashboard #ticketbak,
.lesdashboard .sidequestkaart {
  border: 1px solid var(--av-rand);
  border-left: 4px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  padding: 0.9rem 1.1rem 1.1rem;
  background: var(--av-vlak-1);
}
.lesdashboard .doelkaart.groot {
  border-left-color: var(--av-thema-focus);
}
.lesdashboard #ticketbak {
  border-left-color: var(--av-thema-support);
}
.lesdashboard .sidequestkaart {
  border-left-color: var(--av-thema-sidequest);
}

/* De kop van elk blok draagt dezelfde kleur, zodat je hem ook ziet als het
   blok buiten beeld begint. */
.lesdashboard .doelkaart.groot .kop {
  color: var(--av-primary-donker);
}
.lesdashboard .bakkop h3 {
  color: var(--av-groen-hover);
}
.lesdashboard .sidequestkaart h3 {
  color: var(--av-thema-sidequest);
}

/* De klok en de wekker horen bij je focus. */
.lesdashboard .wekker {
  border-left: 4px solid var(--av-thema-focus);
}

/* Waar de vrager mee bezig is, op een ticket. Zonder dit is oppakken een gok. */
.vragercontext {
  margin: 0.2rem 0 0.4rem;
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.35rem;
}
.vragercontext .muted {
  font-style: italic;
}

/* De klok rechtsboven in de focuskaart, in plaats van als losse regel erboven. */
.doelkaart.groot .kaartkop {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
}
.doelkaart.groot .kaartkop .klok {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  font-family: var(--av-kop);
  line-height: 1.1;
  color: var(--av-primary-donker);
  font-variant-numeric: tabular-nums;
}
.doelkaart.groot .kaartkop .klok strong {
  font-size: 1.4rem;
  font-weight: inherit;
}
.doelkaart.groot .kaartkop .klok small {
  font-family: var(--av-tekst-font);
  font-size: 0.72rem;
  color: var(--av-gedempt);
}

/* Het plan tijdens je blok: waar je volgens je eigen schatting zou zitten.
   Beschrijvend, dus geen rood en geen uitroeptekens — een streepje voor de stap
   die loopt en een rustige markering voor wat over tijd is. */
.plan-stappen.lopend {
  list-style: none;
  margin: 0.6rem 0;
  padding: 0;
  display: grid;
  gap: 0.25rem;
}
.plan-stappen.lopend > li {
  border-left: 3px solid var(--av-vlak-4);
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-2);
}
.plan-stappen.lopend > li.stand-nu {
  border-left-color: var(--av-thema-focus);
  background: var(--av-blauw-45);
  color: var(--av-primary-tekst);
}
.plan-stappen.lopend > li.stand-voorbij {
  border-left-color: var(--av-wacht);
  background: var(--av-wacht-vlak);
  color: var(--av-wacht-tekst);
}
.plan-stappen.lopend > li.stand-gehad {
  opacity: 0.65;
}
.plan-stappen.lopend > li.af {
  opacity: 0.7;
}
.plan-stappen.lopend > li.af .wat {
  text-decoration: line-through;
}
/* Drie kolommen: stand, tekst, tijd. Als flexregel schoof het play-teken bij een
   lange staptekst mee de zin in.
   De eerste kolom is `auto` en niet een vaste 1rem: het driehoekje is in de
   terugvalletters breder dan een rem, en dan liep het uit zijn eigen kolom de
   tekst weer in. `auto` neemt precies de breedte die het teken nodig heeft. */
.stapregel-nu > summary {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: baseline;
  gap: 0.5rem;
  padding: 0.4rem 0.6rem;
  cursor: pointer;
  font-size: 0.88rem;
  list-style: none;
}
.stapregel-nu > summary::-webkit-details-marker {
  display: none;
}
/* `stapmerk` en niet `stand`: `.stand` is de ranglijst op het sidequestscherm,
   en die heeft een `padding-left` voor zijn nummering. Die padding duwde het
   driehoekje hier uit zijn eigen kolom de staptekst in — dezelfde klassenaam,
   twee heel verschillende dingen. */
.stapregel-nu .stapmerk {
  width: 1.1rem;
  text-align: center;
  font-size: 0.8rem;
  line-height: 1.4;
  font-weight: bold;
}
.stapregel-nu .hoelang {
  font-size: 0.78rem;
  opacity: 0.85;
  white-space: nowrap;
}
.stapnuform {
  padding: 0 0.6rem 0.6rem;
}
.stapnuform .hint {
  margin: 0 0 0.4rem;
}

/* "Nu inzetten" onder je afspraak met jezelf. */
.zet-inzetten {
  margin: 0.5rem 0 0;
}
.zet-inzetten > summary {
  display: inline-block;
  padding: 0.25rem 0.7rem;
  border: 1px solid var(--av-primary-donker);
  border-radius: 999px;
  color: var(--av-primary-donker);
  font-size: 0.82rem;
  font-weight: bold;
  cursor: pointer;
  list-style: none;
}
.zet-inzetten > summary::-webkit-details-marker {
  display: none;
}
.zet-inzetten .zetuitleg {
  margin-top: 0.5rem;
  padding: 0.6rem 0.8rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-2);
  font-size: 0.85rem;
}
.zet-inzetten .zetuitleg p {
  margin: 0 0 0.4rem;
}
.zet-inzetten .zetuitleg .tips {
  margin: 0 0 0.5rem;
  padding-left: 1.1rem;
}

/* ---------------------------------------------------------------------------
 * De afspraak met jezelf als eigen blok.
 *
 * Hij stond als zachte regel onder het plan en las als een bijschrift, terwijl
 * dit het instrument ís: een implementatie-intentie is de sterkste voorspeller
 * van doorzetten. Nu omsloten, met de zin groot, wat je ermee doet eronder, en
 * rechtsonder de klok die er stilletjes voor loopt.
 * ------------------------------------------------------------------------ */

.afspraakblok {
  margin: 1rem 0 0;
  padding: 0.8rem 1rem 0.6rem;
  border: 1px solid var(--av-primary-donker);
  border-radius: var(--av-radius);
  background: var(--av-vlak-2);
}
.afspraakblok .kop {
  margin: 0;
  color: var(--av-gedempt);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
.afspraakblok .belofte {
  margin: 0.25rem 0 0;
  font-size: 1rem;
  line-height: 1.4;
}
.afspraakblok .zet-inzetten {
  margin-top: 0.6rem;
}
/* De disclaimer hoort rechtsonder in het blok: het is een terzijde, geen
   opdracht. */
.afspraakblok .timerhint {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin: 0.6rem 0 0;
  color: var(--av-gedempt);
  font-size: 0.78rem;
  text-align: right;
}

/* Knoppen die iets in de supportbak zetten dragen de kleur van die bak. Je ziet
   dan wat er gaat gebeuren voordat je de tekst leest. */
.knop.support,
button.support {
  border: 0;
  background: var(--av-thema-support);
  /* Het lime vlak is in beide thema's even licht, dus de tekst erop is dat
     nooit. `--av-zwart` draait in het donkere thema om en werd daar onleesbaar;
     `--av-op-groen` is precies voor deze combinatie bedoeld. */
  color: var(--av-op-groen);
  font-family: var(--av-kop);
}
.knop.support:hover,
button.support:hover {
  background: var(--av-groen-hover);
}

/* De twee kolommen beginnen op dezelfde hoogte. `.doelkaart` draagt een eigen
   marge van boven, en die duwde de focuskaart zestien pixels onder de
   ticketbak — naast elkaar zie je dat meteen. */
.lesdashboard .kolom-links > :first-child,
.lesdashboard .kolom-rechts > :first-child,
.lesdashboard .kolom-onder > :first-child {
  margin-top: 0;
}

/* De titel van je focus in de kopletter, net als de andere koppen op het
   scherm. Hij stond als enige in de tekstletter. */
.lesdashboard .doelkaart.groot .kaartkop .kop {
  font-family: var(--av-kop);
  font-size: 1rem;
  letter-spacing: 0.04em;
  color: var(--av-primary-donker);
}

/* De stand van een vraag als pill. "Nog niemand opgepakt" is geen bijschrift
   maar een toestand die verandert — en dan hoort hij er ook als iets
   afgebakends uit te zien, net als de vlaggen erboven. */
.bakkaarten .stand-pil {
  display: inline-block;
  margin: 0.1rem 0 0.4rem;
  padding: 0.15rem 0.6rem;
  border: 1px solid currentColor;
  border-radius: 999px;
  font-size: 0.75rem;
  opacity: 0.9;
}
.bakkaarten .stand-pil.komt {
  border-color: var(--av-succes);
  color: var(--av-succes-tekst);
  background: var(--av-succes-vlak);
}
.bakkaarten .stand-pil.docent {
  border-color: #7b4fb8;
  background: var(--av-vlak-2);
}

/* Waar de vrager mee bezig is: rechtsonder in de kaart. Het is context bij het
   besluit om op te pakken, niet de vraag zelf. */
.bakkaarten .vragercontext,
.ticketbak .vragercontext {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: 0.35rem;
  margin: 0.5rem 0 0;
  padding-top: 0.4rem;
  border-top: 1px solid var(--av-rand);
  text-align: right;
}

/* ---------------------------------------------------------------------------
 * De uitnodiging: het venster dat op de beamer komt.
 *
 * Bijna schermvullend en verticaal, want de QR moet vanaf de achterste rij te
 * scannen zijn. Alles eromheen is zo klein mogelijk gehouden: de klasnaam zodat
 * je ziet dat je de goede code toont, de code als tekst voor wie hem overtypt,
 * en hoe lang hij nog leeft.
 * ------------------------------------------------------------------------ */

.uitnodigingvenster {
  width: min(38rem, calc(100vw - 2rem));
  max-height: calc(100vh - 2rem);
  padding: 1.2rem 1.4rem 1.6rem;
  border: 1px solid var(--av-rand);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  color: var(--av-tekst);
  text-align: center;
}
.uitnodigingvenster::backdrop {
  background: rgb(0 0 0 / 0.65);
}
.uitnodigingvenster .sluitrij {
  float: right;
  margin: -0.4rem -0.4rem 0 0;
}
.uitnodigingvenster .sluit {
  border: 0;
  background: none;
  color: var(--av-gedempt);
  font-size: 1.4rem;
  line-height: 1;
  cursor: pointer;
}
.uitnodigingvenster .klas {
  margin: 0 0 0.6rem;
  font-family: var(--av-kop);
  font-size: 1.6rem;
  letter-spacing: 0.04em;
}
/* De code zelf altijd op wit, ook in het donkere thema: een scanner verwacht
   donkere blokjes op een licht vlak, en omkeren maakt hem onbetrouwbaar. */
.uitnodigingvenster .qrvak {
  padding: 0.6rem;
  border-radius: var(--av-radius);
  background: #ffffff;
}
.uitnodigingvenster .qr {
  display: block;
  width: 100%;
  height: auto;
  max-height: 55vh;
  margin: 0 auto;
}
.uitnodigingvenster .uitleg {
  margin: 0.9rem 0 0.2rem;
  color: var(--av-gedempt);
  font-size: 0.9rem;
}
.uitnodigingvenster .korte-link {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  margin: 0.2rem 0 0.8rem;
}
.uitnodigingvenster .korte-link code {
  padding: 0.3rem 0.7rem;
  border-radius: var(--av-radius-klein);
  background: var(--av-vlak-2);
  font-size: 1.15rem;
  letter-spacing: 0.02em;
}
.uitnodigingvenster .vervalt {
  margin: 0 0 0.8rem;
  color: var(--av-gedempt);
  font-size: 0.85rem;
}
.uitnodigingvenster .vervalt.op {
  color: var(--av-gevaar-tekst);
}
.uitnodigingvenster .acties {
  display: flex;
  justify-content: center;
}

/* Een klas hernoemen, in de rij zelf. */
.hernoem > summary {
  cursor: pointer;
}
.hernoem form {
  margin-top: 0.5rem;
}

/* ---------------------------------------------------------------------------
 * De ingecheckte studenten als raster.
 *
 * Het was één kolom van hoge kaarten: bij dertig studenten scrol je dan een
 * halve meter om te zien wie er vastzit. Naast elkaar passen er op een
 * lesscherm drie, en op een laptop twee — vandaar `auto-fill` met een
 * minimumbreedte in plaats van een vast aantal kolommen.
 *
 * Het plan en de afspraak zitten al achter een uitklap; wat overblijft is naam,
 * vertrouwen, hoe lang hij bezig is en zijn doel. Dat is wat je lopend leest.
 * ------------------------------------------------------------------------ */

.checkins {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 19rem), 1fr));
  gap: 0.6rem;
  align-items: start;
  list-style: none;
  margin: 0.6rem 0 1.2rem;
  padding: 0;
}
.checkins > li {
  margin: 0;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--av-rand);
  border-left: 4px solid var(--av-vlak-4);
  border-radius: var(--av-radius);
  background: var(--av-vlak-1);
  font-size: 0.9rem;
}
/* Laag vertrouwen valt op zonder dat de kaart rood wordt: het is een signaal om
   even langs te lopen, geen alarm. */
.checkins > li.vertrouwen-1 { border-left-color: var(--av-gevaar); }
.checkins > li.vertrouwen-2 { border-left-color: var(--av-wacht); }
.checkins > li.vertrouwen-3 { border-left-color: var(--av-vlak-4); }
.checkins > li.vertrouwen-4,
.checkins > li.vertrouwen-5 { border-left-color: var(--av-succes); }
.checkins .wie {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin: 0 0 0.3rem;
  font-size: 0.82rem;
}
.checkins .doel {
  margin: 0 0 0.4rem;
  font-weight: bold;
}
.checkins .planuitkomst,
.checkins .verklaring {
  margin: 0.2rem 0 0;
  font-size: 0.8rem;
  color: var(--av-gedempt);
}

/* Wie er nog niet is, staat bovenaan en blijft daar staan. De kop mag daar
   kleiner dan de gewone Bebas-groepskop: het is een terzijde boven het raster,
   geen sectietitel. */
#sessielijst details.groep {
  margin: 0.6rem 0 1rem;
  padding: 0.5rem 0.8rem;
}
#sessielijst details.groep > summary {
  font-family: inherit;
  font-size: 0.9rem;
  letter-spacing: normal;
  color: var(--av-gedempt);
}
#sessielijst .groep .namen {
  columns: auto;
  display: flex;
  flex-wrap: wrap;
  gap: 0.3rem 0.9rem;
  margin: 0.5rem 0 0;
  font-size: 0.88rem;
}
