:root{
    /* Typografie: precies vier maten. xs = kickers/hints/badges,
       s = secundaire tekst en labels, m = de basistekst, l = koppen en
       kerngetallen. Iconen (.ms) en het logo hebben hun eigen maten. */
    --tekst-xs: 11px;
    --tekst-s: 12.5px;
    --tekst-m: 14px;
    --tekst-l: 18px;

    /* Het lettertype van de hele app op één plek.

       De referentie is Sofia Pro (het lettertype van plenda.nl, via een
       Adobe-kit). Dat is een commerciele licentie die domeingebonden is en
       niet meegeleverd mag worden. Figtree komt er van de vrije letters het
       dichtst bij -- geometrisch-humanistisch, dubbelverdiepings-a,
       enkelverdiepings-g, vergelijkbare x-hoogte -- en staat onder de Open
       Font License, dus we hosten hem zelf.

       Zelf hosten is hier geen smaakkwestie: een lettertype van een CDN stuurt
       het IP-adres van een (minderjarige) leerling naar een derde partij. Dat
       mag niet onder de AVG en het Normenkader IBP, en het houdt de CSP dicht.

       Koopt iemand later een Adobe-licentie op het eigen domein, dan is dit de
       enige regel die verandert. */
    --lettertype: 'Figtree', 'Segoe UI', system-ui, -apple-system, sans-serif;

    /* Basiskleuren van het standaardschema. */
    /* De kleuren van het standaardschema Ninja. Ze worden bij elk verzoek
       overschreven door ShareAppearance, die ze als inline stijl op <html> zet
       -- maar niet overal: op een scherm zonder sessie (het aanvraagformulier)
       is er niets om over te schrijven, en dan geldt dit.

       Hier stond nog het oude marineblauw, en daardoor was het aanvraagscherm
       donkerblauw terwijl het inlogscherm violet was. Twee schermen naast
       elkaar in een andere huisstijl. */
    --primary: #4B3FA8;
    --primary-light: #6355C1;
    --primary-dark: #3A3182;
    --accent: #DAD7F2;
    --accent-green: #22D3EE;
    /* ---------- Maatvoering ----------

       Twee rondingen en één hoogte, en daar houdt de hele app zich aan. Er
       waren er elf: 3, 6, 7, 8, 9, 10, 11, 12, 14, 20 pixels en 50 procent,
       zonder dat iemand nog wist waarom precies daar.

       --radius       wat je bedient: knop, veld, keuzelijst, chip
       --radius-vlak  waar iets in staat: kaart, tegel, tabel, venster
       --hoogte-veld  de hoogte van elk bedieningselement

       Een rondje blijft 50% en een pil blijft een pil; die vormen betekenen
       iets. De rest volgt deze drie. */
    --radius: 8px;
    --radius-vlak: 12px;
    --hoogte-veld: 34px;

    /* De ondergrond waar het paneel op zweeft. Het grijs van de huisstijl,
       niet blauwgrijs: naast het geel en het antraciet moet dit vlak zich
       gedeisd houden. */
    --bg: #F1F2F3;
    --bg-card: #FFFFFF;
    --text: #323A45;
    --text-light: #5A6570;
    --border: #DDE4E8;
    --success: #00ACD0;
    --warning: #F59E0B;
    --danger: #DC3545;
    /* 264 en niet 250: op 250 werd "Gemeente Vallis" afgekapt -- het label
       heeft 102px nodig en kreeg er 98 naast het icoon, het pijltje en de
       teller. */
    /* ---------- De planagenda ----------

       De twee vlakken van de agenda liggen vast en draaien niet mee met het
       kleurenschema: boven is geel, onder is donker. Dat onderscheid is de
       methode zelf -- huiswerk boven, taken onder -- en niet een smaakje.

       De waarden komen uit het gele vlak en het donkere vlak zoals ze in
       beeld staan; het zuivere #FAE800 van het merk is als paginavulling te
       fel, dus het vlak staat een tint zachter en het merkgeel blijft voor
       accenten (badges, markeerstift, het logo).

       Contrast (WCAG 2.2 AA, tekst >= 4,5:1):
         inkt op geel-vlak        16,2:1
         inkt op wit              17,8:1
         inkt op ingepland-blauw  13,9:1
         wit op planning-vlak      12,1:1
         planning-zacht op vlak     4,8:1  (datums en minuten)
       Kleur draagt hier nooit alleen de betekenis: "ingepland" is blauw
       *en* een vinkje, "markering" is geel *en* vetgedrukt. */
    --geel: #FAE800;
    --geel-vlak: #F7E44F;
    --markering: #FCEE7A;
    --agenda-kaart: #FFFFFF;
    --agenda-weekend: #F1F1F3;
    --agenda-leeg: #E9E9EC;
    --ingepland: #CFE4FA;
    --inkt: #1F2430;
    --inkt-zacht: #7C8398;
    --planning-vlak: #262A38;
    --planning-kaart: #2E3342;
    --planning-rij: #3A4052;
    --planning-leeg: #313648;
    --planning-zacht: #8B93A8;
    --vandaag: #E8394A;

    --sidebar-width: 264px;
    --rail-width: 0px;

    /* Hoever de kop in de balk inspringt: de padding van de balk (16) plus de
       hamburger (42) plus de tussenruimte (10). De kop van het onderste vlak
       gebruikt hetzelfde getal, zodat "Huiswerk" en "Takenlijst" onder elkaar
       staan. Verandert de hamburger van maat, dan verandert dit getal mee --
       op één plek.

       Het stond op 58, gerekend met een knop van 32. De hamburger is 42, en de
       twee koppen stonden dus tien pixels uit elkaar. */
    --kop-inspring: 68px;

    /* De breedte die de twee koppen krijgen, zodat het pijltje erachter in
       allebei op dezelfde x uitkomt. "Takenlijst & Planning" is de langste van
       de twee (162 px); 176 geeft lucht voor de Engelse vertaling. */
    --kop-breedte: 176px;
}
*{ margin: 0; padding: 0; box-sizing: border-box; }

/* Elke klik is een echte paginawissel (de app rendert op de server), en die
   knip zag eruit als geflikker. Met een documentovergang vloeit de oude pagina
   in de nieuwe; een browser die dit niet kent doet gewoon wat hij deed. Bij
   minder-beweging geen overgang -- dan is de knip juist rustiger. */
@view-transition { navigation: auto; }

/* Zachte paginawissel: alleen het paneel wisselt, het menu, de gloed en het
   zoomvlak blijven gewoon staan. De wortel wisselt zonder animatie (daar
   verandert toch niets zichtbaars), het paneel vervaagt kort uit en komt met
   een klein tikje omhoog weer binnen.

   Hier stond een prefers-reduced-motion-blok dat alle wissels uitzette. Op
   verzoek weg -- dezelfde bewuste uitzondering als bij het sunburst-ornament:
   de Windows-instelling staat op dit systeem aan zonder dat daarom is
   gevraagd, en juist de zachte wissel was de hele wens. */
.main > .paneel{ view-transition-name: paneel; }
::view-transition-old(root),
::view-transition-new(root){ animation: none; }
/* De groep springt meteen naar de nieuwe plek en maat: standaard animeert
   hij de geometrie mee, en tussen een korte en een lange pagina (de
   Instellingen-tabbladen) zag je het hele middenvlak daardoor bewegen.
   Alleen de inhoud vervaagt. */
::view-transition-group(paneel){ animation-duration: 0s; }
::view-transition-image-pair(paneel){ isolation: isolate; }
::view-transition-old(paneel){ animation: bp-paneel-uit .14s ease both; }
::view-transition-new(paneel){ animation: bp-paneel-in .26s cubic-bezier(.3, .7, .3, 1) both; }
@keyframes bp-paneel-uit { to{ opacity: 0; } }
@keyframes bp-paneel-in { from{ opacity: 0; transform: translateY(5px); } to{ opacity: 1; transform: none; } }
body{
    /* De uitklaplijst van een <select>, de schuifbalken en de datumkiezer
       tekent de browser zelf; daar komt geen CSS van ons aan te pas. Het enige
       dat je kunt zeggen is welk schema er geldt, en dan kiest hij zijn eigen
       kleuren daarbij. Zonder dit stond er een witte lijst met een felblauwe
       balk open op een bijna zwarte pagina.

       Expliciet `light` op de lichte variant, want anders volgt hij de
       instelling van het besturingssysteem en krijgt iemand met een donkere
       Windows-instelling toch een donkere lijst op een lichte app. */
    color-scheme: light;
    /* De basismaat voor alles wat geen eigen maat heeft (dd's, losse
       alinea's); zonder deze regel erft dat de 16px van de browser en blijft
       het als enige groot terwijl de rest een tikje kleiner is. */
    font-size: var(--tekst-m);
    /* Altijd via --lettertype, nooit een naam hier. Er stond ooit Aptos
       vooraan; die zit op vrijwel geen enkele machine, dus viel de hele app
       terug op Segoe UI terwijl het echte lettertype gewoon zelf gehost werd
       en alleen op de knoppen stond. */
    font-family: var(--lettertype);
    background: var(--bg); color: var(--text);
    /* De zoomknopjes in de balk (A-/A+) zetten --app-zoom; css `zoom` schaalt
       dan alles tegelijk. De hoogte deelt door dezelfde factor, anders is
       100vh op 120% hoger dan het venster en verdwijnt de accountregel. */
    zoom: var(--app-zoom, 1);
    display: flex; height: calc(100vh / var(--app-zoom, 1)); overflow: hidden;
}
/* Uitgeklapt schuift de sidebar niet meer OVER de inhoud heen: .main krijgt
   dezelfde marge, zodat het venster meekrimpt. Sidebar en .main zijn broers in
   layouts/app.blade.php, vandaar de ~-combinator. De overgang duurt even lang
   als die van de breedte, anders lopen ze uit de pas. */
/* De inhoud schuift niet meer op: de lade ligt erover. */
.main{ margin-left: 0; }
.side-acct-av{ font-size: var(--tekst-xs); }
/* ---------- Main ---------- */
.main{ flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; margin-left: var(--rail-width); }
/* ---------- De indeling van Notula ----------

   Het werkvlak is één paneel dat op de achtergrond zweeft: rondom een marge,
   afgeronde hoeken, een eigen ondergrond. Daarbinnen staat de paginatitel
   bovenaan en daaronder de inhoud.

   Het was een volvlak met een witte balk erboven en een streep ertussen. Dat
   leest als twee schermen boven elkaar; zo is het één ding, en de zijbalk
   ernaast is de rand van datzelfde ding.

   De titelbalk zit ín het paneel en heeft dus geen eigen achtergrond of streep
   meer nodig. `flex-shrink: 0` blijft: hij mag niet meekrimpen als de inhoud
   groeit.
*/
/* Het vlak begint direct onder de merkstrook, net als de agenda. Het stond
   68 pixels lager omdat die ruimte ooit voor de kop van de zijbalk was; die
   zijbalk is er niet meer, en het gat maakte van elke bladzijde een ander
   scherm dan de agenda. */
.main{ padding: 0 0 10px; }
.main > .paneel{
    flex: 1; min-height: 0;
    display: flex; flex-direction: column;
    margin: 0 var(--blad-marge);
    /* Antraciet, zoals de onderste helft van de agenda. Losse tekst op dit
       vlak is wit; wat op een kaart staat krijgt zijn inktkleur terug. */
    background: var(--planning-vlak);
    color: #FFFFFF;
    border-radius: 18px;
    overflow: hidden;
}
/* De titelbalk is dezelfde gele balk als in de agenda: dezelfde hoogte,
   dezelfde binnenmarge, dezelfde tussenruimte. Zo staat de titel van elke
   bladzijde op precies dezelfde plek als "Huiswerk & Agenda". */
.topbar{
    background: var(--geel-vlak); border-bottom: none;
    height: var(--balk-hoogte); padding: 0 var(--pa-marge);
    display: flex; align-items: center; justify-content: space-between; flex-shrink: 0; gap: 10px;
}
.topbar h1{
    font-size: var(--tekst-l); font-weight: 700; letter-spacing: -.2px;
    white-space: nowrap;
    display: flex; align-items: center; gap: 9px;
    overflow: hidden; text-overflow: ellipsis; min-width: 0;
    color: var(--inkt);
}

/* Het pagina-icoon draagt de schemakleur, net als de actieve menuregel:
   primair in het licht, de accentkleur in het donker. */
.topbar h1 .ms{ font-size: 20px !important; color: var(--inkt); }
/* De telling naast de kop ("19 items"): hoort bij de titel, niet boven de
   tabel -- daar duwde hij de inhoud een regel omlaag. */
.topbar-sub{ font-size: var(--tekst-s); color: var(--inkt-zacht); white-space: nowrap; }
/* Titel + onderregel: op een groot scherm naast elkaar, op een telefoon
   onder elkaar (zie het mobiele eindblok). */
.topbar-tekst{ display: flex; align-items: center; gap: 10px; min-width: 0; }
.topbar-subs{ display: flex; align-items: center; gap: 10px; min-width: 0; }

/* De zoomknopjes: A-, de stand, A+. Tekst en geen iconen -- zo doet Notula
   het ook, en de letter A is precies waar het over gaat. Een eigen afgerond
   vlakje in de strook boven het paneel, rechts, verticaal gecentreerd in de
   64px van die strook. Op een telefoon is de strook er niet (en knijp je om
   te zoomen), dus daar is het vlakje weg. */
.main{ position: relative; }
.zoom-groep{
    position: absolute; top: 16px; right: 14px; z-index: 5;
    display: flex; align-items: center; gap: 6px;
}
/* De klantnaam van de actieve omgeving, linksboven in dezelfde strook
   als de weergavepillen — het beheerportaal kan meerdere klanten
   bedienen en dit zegt in welke je kijkt. */
.omgeving-naam{
    position: absolute; top: 16px; left: 14px; z-index: 5;
    display: inline-flex; align-items: center; gap: 6px;
    height: 30px; padding: 0 12px; border-radius: 11px;
    background: color-mix(in srgb, var(--text) 6%, var(--bg-card));
    color: var(--text-light); font-size: var(--tekst-s); font-weight: 600;
}
.omgeving-naam .ms{ font-size: 15px !important; }

/* Elke groep zijn eigen pil: taal, thema en tekstgrootte los van elkaar. */
.balk-vlak{
    display: flex; align-items: center; gap: 2px;
    padding: 3px 5px; border-radius: 11px;
    background: color-mix(in srgb, var(--text) 6%, var(--bg-card));
}
/* Op een telefoon vervallen de tekstgrootte-knoppen (de browser zoomt zelf
   prima), maar het maantje moet juist daar blijven: dark mode zit nergens
   anders. De groep komt in de gewone tekststroom boven het paneel, rechts. */
@media (max-width: 640px) {
    .zoom-knop[data-zoom]{ display: none; }
    /* Zonder zoomknoppen blijft er een lege pil over — die gaat mee weg. */
    .balk-vlak:has(> [data-zoom]){ display: none; }
    /* Onder de statusbalk van de telefoon blijven (wifi en batterij):
       viewport-fit=cover trekt de pagina daar anders onderdoor. Het logo
       staat klein links in deze strook, de knoppen rechts. */
    .zoom-groep{ position: static; width: auto; margin: calc(6px + env(safe-area-inset-top, 0px)) 10px 0 10px; }
    .balk-vlak{ padding: 2px 4px; }
    /* Op een telefoon staat de klantnaam klein naast het logo; de losse
       chip van het grote scherm is daar overbodig. */
    .omgeving-naam{ display: none; }
    /* De sectiekoppen (batches op Uploads, secties in de bibliotheek) dragen
       knoppen; op een telefoon vouwen die onder de kop in plaats van uit
       het scherm te steken. */
}
.zoom-knop{
    background: none; border: none; cursor: pointer;
    color: var(--text-light); font-family: inherit;
    font-size: var(--tekst-s); font-weight: 600; height: 24px; padding: 0 7px; border-radius: 8px;
    display: inline-flex; align-items: center;
    transition: background .15s, color .15s;
}
.zoom-knop:hover{ background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text); }
.zoom-stand{ min-width: 40px; text-align: center; font-variant-numeric: tabular-nums; }
/* De actieve taal licht op in de schemakleur; de andere blijft gedempt. */
.taal-knop[aria-pressed="true"]{ color: var(--primary); background: color-mix(in srgb, var(--primary) 12%, transparent); }
/* De installatie-uitnodiging (PWA): kaartje rechtsonder; op een smal
   scherm de volle breedte onderaan, boven de veilige rand. */
.install-uitnodiging{
    position: fixed; right: 18px; bottom: 18px; z-index: 60;
    display: flex; align-items: center; gap: 10px; max-width: 420px;
    padding: 12px 14px; border-radius: 12px;
    background: var(--bg-card); border: 1px solid var(--border);
    box-shadow: 0 10px 30px rgba(0,0,0,.18);
    font-size: var(--tekst-s);
}
.install-uitnodiging > .ms{ font-size: 20px; color: var(--primary); }
/* Staan de versie-melding en de installatie-uitnodiging er allebei, dan
   stapelt de uitnodiging erboven. */
#versie-melding:not([hidden]) ~ #install-uitnodiging:not([hidden]){ bottom: 84px; }
.install-uitnodiging .install-tekst{ flex: 1; line-height: 1.5; }
@media (max-width: 640px) {
    .install-uitnodiging{
        left: 10px; right: 10px; max-width: none;
        bottom: calc(10px + env(safe-area-inset-bottom, 0px));
    }
}

/* De voortgangsbalk van de stille navigatie: een dun lijntje bovenlangs
   dat alleen verschijnt als een pagina echt even op zich laat wachten. */
.stil-balk{
    position: fixed; top: 0; left: 0; height: 2px; width: 0; z-index: 900;
    background: linear-gradient(90deg, var(--primary), var(--accent-green));
    transition: width .4s ease;
    pointer-events: none;
}
.stil-balk.bezig{ width: 70%; }
.stil-balk.klaar{ width: 100%; opacity: 0; transition: width .15s ease, opacity .3s ease .15s; }
.topbar .controls{ display: flex; align-items: center; gap: 10px; flex-wrap: wrap; justify-content: flex-end; }
/* Rondom dezelfde marge als in de agenda, en onderaan de volle band, zodat
   er onder de inhoud net zoveel antraciet zit als erboven. */
.content{
    flex: 1; overflow-y: auto;
    padding: var(--pa-marge) var(--pa-marge) var(--pa-band);
}
/* Een kaart op het antraciete vlak is licht -- dezelfde kaart als een dagkolom
   in de agenda. Alles wat erin staat (tabellen, formulieren, tekst) houdt
   daardoor gewoon zijn inktkleur en blijft leesbaar. */
.content .card{ background: var(--agenda-kaart); color: var(--inkt); }
.page{ display: none; }
.page.active{ display: block; }
/* ---------- Role switcher / account chip ---------- */
/* ---------- Cards & stats ---------- */
.card{ background: var(--bg-card); border-radius: 12px; border: 1px solid var(--border); padding: 20px 24px; margin-bottom: 20px; }
.card-header{ display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; gap: 10px; flex-wrap: wrap; }
.card-header h3{ font-size: var(--tekst-m); font-weight: 600; display:flex; align-items:center; gap:8px; }
.card-header h3 svg{ width:16px; height:16px; color: var(--primary); }
/* ---------- Responsive ---------- */
@media (max-width: 980px) {
    .grid-2,
.form-row,
.form-row-3{ grid-template-columns: 1fr; }
}
@media (max-width: 820px) {
    .main{ margin-left: 0; }
    .content{ padding: 16px; }
    .topbar{ padding: 10px 16px; }
}

/* ---------- Telefoon ----------

   De layout hierboven doet het zware werk (zijbalk wordt een lade). Dit blok
   gaat over de dingen die je pas merkt op een echt toestel: de inkeping van een
   iPhone, duimformaat, en het inzoomen dat iOS doet bij een te klein lettertje.
*/
@media (max-width: 640px) {
    /* Op een telefoon geen zwevend paneel: elke pixel marge is er een die de
       inhoud niet krijgt. */
    .main{ padding: 0; }
    .main > .paneel{ border: none; border-radius: 0; }
    .topbar{ padding: 12px 16px 4px; }
    .content{ padding: 6px 16px 20px; }

    /* Een telefoon zoomt in zodra een veld kleiner is dan 16px, en zoomt daarna
       niet meer uit. Vandaar precies 16px - kleiner mag niet, groter hoeft niet
       (bewuste vaste maat, geen token: dit is de iOS-ondergrens). */
    input,
select,
textarea{ font-size: 16px; }
    .login-card .form-group input{ font-size: 16px; }

    /* Duimformaat. 44px is wat Apple en Google allebei aanhouden als kleinste
       doel dat je betrouwbaar raakt; met een muis mag alles kleiner, met een
       duim niet. Geldt ook voor keuzelijsten en invoervelden - die zijn even
       vaak het doel als een knop. */
    .btn,
.icon-btn,
input,
select,
textarea,
.icon-btn{ min-width: 44px; justify-content: center; }
    select{ padding-top: 0; padding-bottom: 0; }
    textarea{ min-height: 88px; }

    .content{ padding: 14px 12px; }
    .topbar{ padding: 8px 12px; }
    .topbar h1{ font-size: var(--tekst-l); }

    .card{ padding: 16px 14px; }
    .modal-actions:not(.in-kop){ flex-direction: column-reverse; }
    .modal-actions:not(.in-kop) .btn{ width: 100%; }

    /* De zoomknoppen zijn hier verborgen, dus een ooit bewaarde zoomstand
       mag hier ook niet meer meedoen: die versmalt de layoutbreedte en
       drukt de filterrasters in één kolom. !important wint van de inline
       variabele die de JS op <html> zet. */
    :root{ --app-zoom: 1 !important; }
}

/* ---------- Veilige zones ----------

   De layout gebruikt viewport-fit=cover, zodat de achtergrond onder de inkeping
   en de home-balk doorloopt. Dat betekent wel dat we zelf ruimte moeten
   vrijhouden, anders staat de bovenste knop onder de klok van het toestel.

   env() valt terug op 0px als de browser het niet kent, dus dit is veilig voor
   elk ander apparaat.
*/
/* De taal-/themapillen staan tegenwoordig als eigen regel bóven het paneel
   en vangen de inkeping al op; de topbar hoeft dat niet nog een keer te
   doen (dubbel = een dode strook boven de titel). */
.topbar{ padding-top: 0; }
.topbar,
.content{ padding-left: max(var(--pa-marge), env(safe-area-inset-left)); padding-right: max(var(--pa-marge), env(safe-area-inset-right)); }
.content{ padding-bottom: max(var(--pa-band), env(safe-area-inset-bottom)); }
.login-wrap{ padding-top: max(32px, env(safe-area-inset-top)); padding-bottom: max(32px, env(safe-area-inset-bottom)); }
/* ---------- Loginpagina (Laravel) ----------

   Twee panelen naast elkaar: links het merk op het donkere verloop, rechts het
   formulier op wit. Dat is niet alleen opmaak - het merkteken is een lichte
   lijntekening die voor de donkere sidebar is gemaakt, en op wit valt het
   gewoon weg. In het donkere paneel staat het waar het voor bedoeld is, en
   groot genoeg om te zien.

   Onder 860px vallen de panelen onder elkaar en krimpt het merkpaneel tot een
   band boven het formulier, zodat het op een telefoon geen halve schermhoogte
   opsnoept.
*/
body.login-page{ display: block; overflow-y: auto; background: var(--primary-dark); }
.login-wrap{
    flex: 1; min-height: 100vh; width: 100%; padding: 32px 20px; overflow-y: auto;
    display: flex; align-items: center; justify-content: center;
    background: radial-gradient(1200px 600px at 50% -10%, var(--primary-light) 0%, var(--primary) 45%, var(--primary-dark) 100%);
}
.login-card{
    display: grid; grid-template-columns: 300px 1fr; width: 100%; max-width: 760px;
    background: var(--bg-card); border-radius: 20px; overflow: hidden;
    box-shadow: 0 26px 70px rgba(0,0,0,.38); border: 1px solid rgba(255,255,255,.06);
}
/* Links: het volledige logo met de claim eronder. */
.login-brand{
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 14px; padding: 44px 30px; text-align: center;
    /* Nacht-donker met een gloed in de schemakleuren, zoals het menu van de
       app: daar is het logo (wit-lavendel-lichtblauw) voor ontworpen. Op het
       lichtviolette vlak van eerst verdween "Pilot" in de achtergrond. De
       gloed pakt --primary/--accent-green en kleurt dus mee met het schema
       uit het bp_schema-cookie. */
    background:
        radial-gradient(70% 60% at 28% 22%, color-mix(in srgb, var(--primary) 46%, transparent), transparent 72%),
        radial-gradient(52% 46% at 80% 84%, color-mix(in srgb, var(--accent-green) 20%, transparent), transparent 74%),
        var(--ninja-nacht);
}
/* Het logo moet binnen de kolom blijven; krimp gaat via de maat in _brand. */
.login-brand .bp-logo{ max-width: 100%; }
.login-brand .login-claim{
    font-size: var(--tekst-s); line-height: 1.65; color: rgba(255,255,255,.72);
    max-width: 210px; margin: 0;
}
/* Rechts: het formulier. */
.login-form{ padding: 40px 40px 32px; display: flex; flex-direction: column; justify-content: center; }
.login-card h1{ font-size: var(--tekst-l); font-weight: 700; margin-bottom: 5px; color: var(--text); }
.login-card .login-sub{ font-size: var(--tekst-s); color: var(--text-light); margin-bottom: 22px; line-height: 1.55; }
.login-card .form-group input{ padding: 10px 12px; font-size: var(--tekst-m); }
.login-card .btn{ width: 100%; height: auto; justify-content: center; padding: 10px 14px; font-size: var(--tekst-m); margin-top: 6px; }
.login-foot{ margin-top: 20px; padding-top: 14px; border-top: 1px solid var(--border); font-size: var(--tekst-xs); color: var(--text-light); line-height: 1.6; }
/* Secundaire link onder het formulier: een account aanvragen. */
.login-alt{ margin-top: 16px; font-size: var(--tekst-s); }
.login-alt a{ color: var(--text-light); text-decoration: none; border-bottom: 1px solid transparent; }
.login-alt a:hover{ color: var(--primary); border-bottom-color: var(--primary); }
/* Scheiding tussen de manieren om binnen te komen: een lijn met "of". */
.login-divider{ display: flex; align-items: center; gap: 12px; margin: 18px 0 14px; color: var(--text-light); font-size: var(--tekst-xs); text-transform: uppercase; letter-spacing: .06em; }
.login-divider::before,
.login-divider::after{ content: ""; flex: 1; height: 1px; background: var(--border); }
@media (max-width: 860px) {
    .login-wrap{ padding: 20px 16px; align-items: flex-start; }
    .login-card{ grid-template-columns: 1fr; max-width: 420px; }
    .login-brand{ padding: 24px 26px; gap: 8px; }
    .login-brand .login-claim{ font-size: var(--tekst-s); max-width: none; }
    .login-form{ padding: 26px 22px 22px; }
}
/* ---------- Validatiefouten & meldingen (Laravel) ---------- */
.field-error{ display: block; font-size: var(--tekst-xs); color: var(--danger); margin-top: 4px; font-weight: 500; }
.form-group.has-error input,
.form-group.has-error select,
.form-group.has-error textarea{ border-color: var(--danger); }
.form-group.has-error input:focus,
.form-group.has-error select:focus,
.form-group.has-error textarea:focus{ box-shadow: 0 0 0 3px rgba(220,53,69,.14); border-color: var(--danger); }
/* Het attribuut `hidden` moet altijd winnen. De browser zet er zelf
   `display:none` op, maar dat staat in de UA-stylesheet en élke regel hiernaast
   verslaat die - `.alert { display:flex }` liet een lege rode balk staan op het
   inlogscherm. Vandaar !important: dit is precies waar het voor bedoeld is. */
[hidden]{ display: none !important; }
.alert{ border-radius: 10px; padding: 11px 16px; font-size: var(--tekst-s); margin-bottom: 16px; border: 1px solid transparent; display: flex; align-items: flex-start; gap: 9px; line-height: 1.5; }
.alert svg{ width: 16px; height: 16px; flex-shrink: 0; margin-top: 1px; }
.alert ul{ margin: 0; padding-left: 18px; }
.alert-success{ background: #ECF3D2; color: #55611B; border-color: #D6E4A6; }
.alert-error{ background: #FEE2E2; color: #991B1B; border-color: #FCA5A5; }
.alert-warning{ background: #FEF3C7; color: #92400E; border-color: #FDE68A; }

/* ==========================================================================
   Hersteld blok
   ==========================================================================

   Deze 250 regels -- knoppen, badges, tabellen, formulieren, modaalvensters,
   meldingen, de assetkaarten, de intake-onderdelen en een deel van de donkere
   variant -- zijn een keer per ongeluk weggevallen. Bij het restylen van de
   KPI-tegels knipte een patchscript van de eerste tegelregel tot de laatste
   dark-regel van diezelfde tegel, en alles wat daartussen stond ging mee.

   Het gevolg was niet meteen zichtbaar: knoppen en badges vielen terug op de
   standaardopmaak van de browser en zagen er alleen maar saai uit, niet kapot.
   Vandaar deze kop -- als er ooit weer iets ontbreekt, is dit de plek waar het
   hoorde te staan.
   ========================================================================== */

/* ---------- Buttons ---------- */
/* Elke knop heeft dezelfde hoogte als een invoerveld en een keuzelijst. Ze
   staan zo vaak op één regel naast elkaar dat een verschil van twee pixels
   meteen opvalt. */
/* Eén knopmaat voor de hele app: 30px hoog, dezelfde hoogte als het
   zoomvlak. Er waren twee maten (veldhoogte en small) en overal waar ze
   naast elkaar stonden was dat een trapje. */
/* Eén knopmaat voor de hele app: vaste hoogte én vaste breedte, overal.
   Korte teksten zijn daardoor allemaal exact even groot; alleen een écht
   langere tekst groeit mee in plaats van af te kappen. .btn en .btn-sm
   zijn bewust identiek. */
.btn{
    padding: 0; height: 32px; width: 32px;
    min-width: 32px; white-space: nowrap;
    border: 1px solid transparent; border-radius: var(--radius);
    cursor: pointer; font-size: var(--tekst-s); font-weight: 500;
    transition: background .15s, border-color .15s, color .15s;
    display: inline-flex; align-items: center; justify-content: center;
    gap: 6px; font-family: inherit;
}
.btn .ms{ font-size: 17px; }
/* De dialoogknoppen houden hun tekst: daar is de tekst de keuze. */
.confirm-box .btn{ width: auto; min-width: 110px; padding: 0 14px; }
.btn svg{ width: 14px; height: 14px; }
/* De knopregel van miGenda, en hij geldt overal: antraciet op geel, geel op
   antraciet. Twee kleuren die elkaar dragen; wit ertussen zou een derde kleur
   zijn die niets betekent. Op het antraciet keert de knop om -- zie het blok
   van de planagenda onderaan. */
.btn-primary{ background: var(--primary); color: var(--geel); }
.btn-primary:hover{ background: var(--primary-light); color: var(--geel); }
/* Vast groen voor bewaren (Opslaan/Plaatsen/Goedkeuren/Inlezen): de
   kleurregel is groen = opslaan, rood = verwijderen, schemakleur = rest. */
.btn-success{ background: #2FBF71; color: #06210F; }
.btn-success:hover{ background: #27A862; }
.btn-danger{ background: var(--danger); color: white; }
.btn-danger:hover{ background: #DC2626; }
.btn-outline{ background: var(--bg-card); border: 1px solid var(--border); color: var(--text); }
.btn-outline:hover{ background: var(--bg); }
/* Klein is korter, niet lager: hij staat naast een gewone knop en dan hoort de
   onderkant gelijk te liggen. */
/* Zelfde maat als .btn; de klasse blijft bestaan waar hij al staat. */
.btn-sm{ padding: 0 14px; font-size: var(--tekst-s); height: 32px; }

/* De knop van een bestandsveld tekent de browser zelf; in dezelfde
   kleurstelling en maat als de andere knoppen. */
input[type="file"]::file-selector-button{
    height: 32px; padding: 0 14px; margin-right: 10px;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--bg-card); color: var(--text);
    font-family: inherit; font-size: var(--tekst-s); font-weight: 500;
    cursor: pointer;
    transition: background .15s;
}
input[type="file"]::file-selector-button:hover{ background: var(--bg); }
.btn[disabled]{ opacity: .45; cursor: not-allowed; }
.icon-btn{
    background: none; border: 1px solid transparent; cursor: pointer;
    color: var(--text-light); padding: 0; border-radius: var(--radius);
    width: 30px; height: 30px;
    display: inline-flex; align-items: center; justify-content: center;
}
.icon-btn:hover{ background: var(--bg); color: var(--primary); }
.icon-btn svg{ width:16px; height:16px; }
/* ---------- Tables ---------- */
.table-wrap{ overflow-x: auto; }
table{ width: 100%; border-collapse: collapse; }
/* Geen rasterlijnen, wel afwisselende tinten: dat leest rustiger in een lange
   lijst dan een raster van hokjes. */
th,
td{ padding: 9px 12px; text-align: left; border-bottom: none; font-size: var(--tekst-s); vertical-align: middle; }
tbody tr:nth-child(even) > td{ background: color-mix(in srgb, var(--text) 3%, transparent); }
th{ font-weight: 600; color: var(--text-light); font-size: var(--tekst-xs); text-transform: uppercase; letter-spacing: .5px; white-space: nowrap; }
/* ---------- Forms ---------- */
.form-group{ margin-bottom: 14px; }
.form-group label{ display: block; font-size: var(--tekst-s); font-weight: 500; margin-bottom: 4px; color: var(--text); }
/* Bulk-bewerken in de bibliotheek: vinkje op de miniatuur, actiebalk
   erboven zodra er iets is aangevinkt. */
.bulk-teller{ color: var(--primary); font-weight: 700; }

/* Accountfoto: dezelfde cirkel als de initialen, maar dan gevuld. */
.acct-av{
    width: 52px; height: 52px; border-radius: 50%;
    background: var(--primary); color: #FFFFFF;
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: var(--tekst-l);
    overflow: hidden; flex: 0 0 auto;
}
.acct-av img,
.side-acct-av img{ width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
.side-acct-av{ overflow: hidden; }

/* Elke keuzelijst draagt de huisstijl, ook buiten een formulier of
   filterbalk (Mijn account, tabblad-keuze) — nooit de browser-standaard. */
select{
    min-height: var(--hoogte-veld); padding: 6px 10px;
    border: 1px solid var(--border); border-radius: var(--radius);
    font-size: var(--tekst-s); font-family: inherit;
    background: var(--bg-card); color: var(--text);
}

.form-group input,
.form-group select,
.form-group textarea{
    width: 100%; padding: 6px 12px; min-height: var(--hoogte-veld);
    border: 1px solid var(--border); border-radius: var(--radius);
    font-size: var(--tekst-m); font-family: inherit; transition: border-color .15s;
    background: var(--bg-card); color: var(--text);
}
.form-group textarea{ resize: vertical; min-height: 64px; }
.form-group input:focus,
.form-group select:focus,
.form-group textarea:focus{
    outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(74,110,124,.12);
}
input[type="file"]::file-selector-button,
input[type="file"]::-webkit-file-upload-button{
    background: var(--primary); color: #FFFFFF; border: none; border-radius: var(--radius);
    padding: 6px 14px; font-family: inherit; font-size: var(--tekst-s); font-weight: 500;
    margin-right: 12px; cursor: pointer; transition: background .15s;
}
input[type="file"]::file-selector-button:hover,
input[type="file"]::-webkit-file-upload-button:hover{ background: var(--primary-light); }
.form-row{ display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.form-row-3{ display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 14px; }
/* Meerkeuze (organisaties, projecten, rechtenlijsten): tik-chips in
   plaats van kale vinkjes. Het vinkje zelf is onzichtbaar; de hele chip
   is het tikvlak en kleurt in de schemakleur wanneer hij aanstaat. */
.checkbox-group{ display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; }
.checkbox-group label{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 6px 14px; border: 1.5px solid var(--border); border-radius: 15px;
    background: var(--bg-card); font-size: var(--tekst-s); font-weight: 500;
    cursor: pointer; transition: border-color .15s, background .15s, color .15s;
}
.checkbox-group input[type="checkbox"]{ position: absolute; opacity: 0; width: 0; height: 0; }
.checkbox-group label:hover{ border-color: var(--primary); }
.checkbox-group label:has(input:checked){
    border-color: var(--primary);
    background: color-mix(in srgb, var(--primary) 14%, var(--bg-card));
    color: var(--primary); font-weight: 600;
}
.checkbox-group label:has(input:focus-visible){ outline: 2px solid var(--primary); outline-offset: 2px; }
/* De tagkiezer: lijst en vrij veld naast elkaar; op een smal formulier mag
   de lijst boven het veld klappen. */
/* ---------- Modal ---------- */
.modal-overlay{ display: none; position: fixed; inset: 0; background: rgba(0,0,0,.5); z-index: 1000; align-items: center; justify-content: center; padding: 16px; }
.modal-overlay.active{ display: flex; }
.modal{ background: var(--bg-card); border-radius: 12px; padding: 24px 28px; max-width: 640px; width: 100%; max-height: 88vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0,0,0,.3); }
.modal.modal-lg{ max-width: 900px; }
.modal.modal-xl{ max-width: 1150px; }
.modal h3{ font-size: var(--tekst-l); margin-bottom: 16px; display:flex; align-items:center; gap:8px; }
.modal h3 svg{ width:18px; height:18px; color:var(--primary); }
/* De ruimte voor de schuifbalk staat altijd gereserveerd: bij het wisselen
   tussen een lange en een korte pagina (de Instellingen-tabbladen) schoof
   het middenvlak anders een schuifbalk-breedte heen en weer. */
html{ scrollbar-gutter: stable; }

.modal-actions{ display: flex; justify-content: flex-end; gap: 8px; margin-top: 20px; flex-wrap: wrap; }
.modal-actions .left{ margin-right: auto; display:flex; gap:8px; }

/* De knoppen van een venster staan bovenin: één kopregel met de titel links
   en de knoppenbalk rechts (migenda.js verplaatst .modal-actions erheen).
   De regel plakt aan de bovenrand, zodat de knoppen ook bij een lang
   formulier in beeld blijven. */
.modal-kop{
    display: flex; flex-wrap: wrap; align-items: center;
    justify-content: space-between; gap: 8px 12px;
    position: sticky; top: -24px; z-index: 5;
    background: var(--bg-card);
    margin: -24px -28px 16px; padding: 20px 28px 12px;
    border-bottom: 1px solid var(--border);
    border-radius: 12px 12px 0 0;
}
.modal-kop h3{ margin-bottom: 0; }
.modal-kop .modal-actions{ margin-top: 0; flex-wrap: nowrap; margin-left: auto; }
.modal-kop .modal-actions .left{ margin-right: 0; }
/* ---------- Meldingen (Mijn account) ---------- */

/* De stand van dit apparaat: aan, uit, of geweigerd door de browser. Eén
   regel tekst boven de knoppen -- geen uitleg, alleen wat er nu geldt. */
.meld-stand{ font-size: var(--tekst-s); color: var(--text-light); margin-bottom: 10px; }

/* De apparaten waarop het aanstaat. Kort: je hoeft alleen te herkennen wélke
   je uitzet. */
.meld-apparaten{ list-style: none; margin: 10px 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 6px; }
.meld-apparaten li{
    font-size: var(--tekst-xs); color: var(--text-light);
    background: var(--bg); border: 1px solid var(--border);
    border-radius: 999px; padding: 2px 10px;
}

/* Een afgevinkte eigen dag, in dezelfde vorm als een afgevinkte agendaregel.
   De rij droeg de klasse al, maar er bestond geen regel voor: het vinkje was
   alleen te zien aan het icoon in de knop, en dat staat helemaal rechts.
   Doorhalen op het tekstveld en niet op de hele rij, want de datum moet
   leesbaar blijven -- en de knoppen mogen niet vervagen, je moet hem juist
   weer open kunnen zetten. */
.veldrij.is-af input[type="text"]{ text-decoration: line-through; opacity: .6; }

/* ---------- Badges ---------- */
.badge{ display: inline-block; padding: 2px 9px; border-radius: 12px; font-size: var(--tekst-xs); font-weight: 600; white-space: nowrap; }

.table-wrap td .badge{ min-width: 88px; text-align: center; }
/* Drie kleuren, en niet meer dan de app draagt: groen voor actief, grijs voor
   inactief, de schemakleur voor een naam of een gebeurtenis. Rood en amber
   hoorden bij statussen (In review, Verlopen) die miGenda niet kent. */
.badge-green{ background: #ECF3D2; color: #55611B; }
.badge-blue{ background: var(--accent); color: var(--primary); }
.badge-gray{ background: #E5E7EB; color: #4B5563; }
/* ---------- Toast ---------- */
/* Rechtsonder, uit de buurt van de kop en de knoppen; op een telefoon
   boven de home-balk (safe-area). */
.toast-container{ position: fixed; bottom: calc(20px + env(safe-area-inset-bottom, 0px)); right: 20px; z-index: 9999; max-width: min(380px, calc(100vw - 32px)); }
/* Vaste donkere chip met witte tekst: var(--text) als achtergrond werd in
   het donkere thema wit-op-wit. */
.toast{ background: #16202B; color: #FFFFFF; border: 1px solid rgba(255,255,255,.14); padding: 11px 18px; border-radius: 8px; margin-bottom: 8px; font-size: var(--tekst-m); animation: slideIn .3s ease; box-shadow: 0 4px 12px rgba(0,0,0,.15); }
/* Bewust zonder gekleurde linkerrand: de chip is rustig en de tekst zegt
   zelf al wat er gebeurd is. */
@keyframes slideIn { from{ transform: translateX(100%); opacity: 0; } to{ transform: translateX(0); opacity: 1; } }
/* ---------- Confirm ---------- */
.confirm-overlay{ display: none; position: fixed; inset: 0; background: rgba(0,0,0,.5); z-index: 2000; align-items: center; justify-content: center; padding:16px; }
.confirm-overlay.active{ display: flex; }
.confirm-box{ background: var(--bg-card); border-radius: 12px; padding: 24px; max-width: 440px; width: 100%; text-align: center; }
.confirm-box p{ margin-bottom: 18px; font-size: var(--tekst-m); }
.confirm-box .btn-group{ display: flex; gap: 8px; justify-content: center; }
/* sectiekoppen per assettype */
mark.ai{ background:#EDE9FE; color:#5B21B6; padding:0 2px; border-radius:3px; }
mark.warn{ background:#FEE2E2; color:#991B1B; padding:0 2px; border-radius:3px; font-weight:600; }
/* ---------- Tabs ---------- */
.tabs{ display:flex; gap:2px; border-bottom:2px solid var(--border); margin-bottom:16px; flex-wrap:wrap; }

/* Op een telefoon zijn de tabbladen een keuzelijst; de chips verdwijnen. */
.tab-keuze{ display: none; }
@media (max-width: 640px) {
    .tabs{ display: none; }
    .tab-keuze{ display: block; margin-bottom: 16px; }
    .tab-keuze select{ width: 100%; }
}
.tab{ padding:8px 16px; border:none; background:none; cursor:pointer; font-size: var(--tekst-s); font-family:inherit; color:var(--text-light); border-bottom:3px solid transparent; margin-bottom:-2px; }
.tab.active{ color:var(--primary); font-weight:600; border-bottom-color:var(--accent-green); }
/* ---------- Rollenmatrix ---------- */
/* ---------- Empty state ---------- */
.empty-state{ text-align:center; padding:40px 20px; color:var(--text-light); }
.empty-state svg{ width:38px; height:38px; margin-bottom:10px; opacity:.5; }
.empty-state p{ font-size: var(--tekst-m); }
/* ---------- Audit ---------- */
.audit-row{ display:flex; gap:12px; padding:8px 0; border-bottom:1px solid var(--border); font-size: var(--tekst-s); }
.audit-row .ts{ color:var(--text-light); white-space:nowrap; font-size: var(--tekst-xs); width:120px; flex-shrink:0; }
/* ---------- Voorbeeldviewer (lightbox) ---------- */
.preview-overlay{ display: none; position: fixed; inset: 0; background: rgba(0,0,0,.65); z-index: 3000; align-items: center; justify-content: center; padding: 20px; }
.preview-overlay.active{ display: flex; }
.preview-lightbox{ background: var(--bg-card); border-radius: 14px; max-width: 940px; width: 100%; max-height: 90vh; display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 24px 80px rgba(0,0,0,.4); }
.pl-head{ display: flex; align-items: center; gap: 10px; padding: 12px 18px; border-bottom: 1px solid var(--border); font-size: var(--tekst-m); flex-wrap: wrap; }
.pl-head .muted{ font-size: var(--tekst-s); font-family: Consolas, monospace; }
.pl-body{ flex: 1; background: var(--bg); padding: 18px; overflow: auto; display: flex; align-items: center; justify-content: center; min-height: 320px; }
.pl-body svg.preview{ width: 100%; height: auto; max-height: 62vh; }
/* ---------- Utilities ---------- */
.hidden{ display: none !important; }
.text-right{ text-align: right; }
.mt-2{ margin-top: 8px; }
.mb-2{ margin-bottom: 8px; }
.flex-between{ display: flex; justify-content: space-between; align-items: center; gap:10px; flex-wrap:wrap; }
.muted{ color: var(--text-light); font-size: var(--tekst-s); }
.grid-2{ display:grid; grid-template-columns:1fr 1fr; gap:20px; }
/* ---------- Personalisatie (instellingen) ---------- */
.set-section-label{ font-size: var(--tekst-xs); font-weight: 700; letter-spacing: 1.6px; text-transform: uppercase; color: var(--text-light); margin: 18px 0 10px; }
.topbar select{ background: var(--bg-card); color: var(--text); }
.pl-body img.preview{ max-width: 100%; max-height: 62vh; display: block; }

/* ==========================================================================
   Sunburst-ornament
   ==========================================================================

   Letterlijk overgenomen uit de skill `sunburst-ornament`. Hier stond een eigen
   variant die alleen de lege staat van de bibliotheek vulde; deze kent de vier
   plaatsingen, spiegelt de vallende sterren naar het zichtbare kwadrant en
   schaalt mee met de ruimte in plaats van afgesneden te worden.

   De kleurketen hieronder eindigt op --primary. Dat klopt voor deze app: het
   ornament staat op een lichte werkvlak en in een donker menu, en op allebei is
   de primaire kleur de zichtbare. Waar het anders moet, staat --orn-color op de
   container.
   ========================================================================== */

/* ==========================================================================
   Sunburst-ornament -- basis-CSS en plaatsingspresets.

   De animatie zelf zit in de SVG (SMIL), niet hier. Deze CSS doet drie dingen:
   kleur geven, het ornament op de juiste plek aansnijden, en het laten meeschalen
   met de ruimte die het krijgt.
   ========================================================================== */

/* -- Kleur ----------------------------------------------------------------
   Het ornament pakt de accentkleur van de app waarin het staat. De keten hieronder
   loopt langs de tokennamen die in de huisstijlen voorkomen; de eerste die bestaat
   wint. Zet --orn-color als je het expliciet wilt sturen.

   Omdat CSS-variabelen pas bij het tekenen worden opgelost, verkleurt het ornament
   vanzelf mee zodra de app zijn accenttoken wijzigt -- bij een kleurschema-wissel,
   een dark-mode-toggle of een live preview. Daar is geen JavaScript voor nodig.

   --accent zit bewust NIET in de keten: in deze app is dat een lichte tint
   (de primaire kleur voor 90% naar wit, zie ShareAppearance), geen accentkleur.
   Die zou een onzichtbaar ornament opleveren. */
.orn-host{
  --orn-fill: var(--orn-color,
              var(--accent-green,
              var(--grn,
              var(--vitaly-cyan,
              var(--primary,
              var(--pri, currentColor))))));

  /* Tweede kleur voor de accenten: fel pulserende bolletjes, vallende sterren en de
     kern. Valt terug op de hoofdkleur, dus zonder --orn-accent is alles eenkleurig.
     Definieer hem alleen als je app echt een tweede accent heeft -- meer dan twee
     kleuren maakt er een kerstboom van, en het ornament hoort achtergrond te zijn. */
  --orn-fill-hi: var(--orn-accent, var(--orn-fill));
}

.orn-host .orn-dot{ fill: var(--orn-fill); }
.orn-host .orn-hi,
.orn-host .orn-star,
.orn-host .orn-core{ fill: var(--orn-fill-hi); }
.orn-host .orn-streak{ fill: none; stroke: var(--orn-fill-hi);
                        stroke-linecap: round; vector-effect: non-scaling-stroke; }

/* -- Host ------------------------------------------------------------------
   Nooit klikbaar, nooit in de tabvolgorde, altijd achter de content. */
.orn-host{ position: absolute; overflow: hidden; pointer-events: none; z-index: 0; }
.orn-host svg{ position: absolute; display: block; overflow: visible; }

/* Kwart rechtsboven -- paginakop of kaartkop.
   Het hart ligt op de rechterbovenhoek, dus je ziet het linkeronderkwadrant.
   mountOrnaments spiegelt de vallende sterren hier vanzelf mee (flip 'xy') en laat
   ze weg, omdat ze in een strook van ~96 px half afgekapt worden en dan als een
   storing lezen. */
.orn-hero{ right: 0; top: 0; bottom: 0; width: 220px; opacity: .5; }
.orn-hero svg{ right: 0; top: 0; width: 320px; height: 320px;
                    transform: translate(50%, -50%); }

/* Kwart rechtsonder -- lege staat, 404, of een startpagina met de kaart linksboven.
   Zichtbaar is het linkerbovenkwadrant; de sterren worden vanzelf gespiegeld (flip 'x'). */
.orn-empty{ right: 0; bottom: 0; width: 280px; height: 280px; opacity: .45; }
.orn-empty svg{ right: 0; bottom: 0; width: 560px; height: 560px;
                    transform: translate(50%, 50%); }

/* Hele cirkel, gecentreerd -- achter een inlogkaart of op een leeg scherm. */
.orn-landing{ inset: 0; opacity: .5; }
.orn-landing svg{ left: 50%; top: 50%; width: 440px; height: 440px;
                    transform: translate(-50%, -50%); }

/* ==========================================================================
   Meeschalen

   Een ornament met een vaste maat wordt afgekapt zodra de ruimte krimpt -- door een
   langer menu, een smaller scherm, een kortere paginakop. Dat ziet er kapot uit.
   Met container-units koppelen we de maat aan de host: 1cqmin is 1% van de kortste
   zijde van de host, dus de cirkel past per definitie altijd. Wordt de ruimte kleiner,
   dan wordt het ornament kleiner -- het wordt nooit afgesneden.

   Voor een kwart in een hoek is de straal gelijk aan de kortste zijde, dus de
   diameter is 200cqmin. Voor de hele cirkel is dat 100cqmin.

   Het @supports-blok houdt oudere browsers op de vaste pixelmaten hierboven.
   ========================================================================== */
@supports (width: 1cqmin) {
  .orn-host{ container-type: size; }

  .orn-hero svg,
.orn-empty svg{ width: 200cqmin; height: 200cqmin; }

  .orn-landing svg{ width: 100cqmin; height: 100cqmin; }
}

/* -- Toegankelijkheid ------------------------------------------------------
   prefers-reduced-motion wordt in JS afgehandeld met pauseAnimations(), omdat
   SMIL zich niets aantrekt van een CSS-mediaquery. Zie ornSync() in ornament.js.
   Deze regel is de vangnet-variant voor als je toch CSS-animaties gebruikt. */
@media (prefers-reduced-motion: reduce) {
  .orn-host *{ animation: none !important; }
}


.login-wrap .orn-host{ --orn-color: var(--primary); opacity: .45; }

/* Achter de kaart, niet erover.

   Het ornament is een broer van de inlogkaart in dezelfde container, en zonder
   stapelvolgorde wint het laatste element -- dus lagen de stippen over het
   formulier heen. Een z-index op de host alleen helpt niet: de kaart heeft er
   dan nog steeds geen, en `auto` verliest van elk getal. Beide dus. */
.login-wrap .orn-host{ z-index: 0; }
.login-wrap .login-card{ position: relative; z-index: 1; }

/* In het inlogscherm mag hij wat sterker: daar is het het enige beeld op de
   pagina, en achter een ondoorzichtige kaart zie je er toch maar de helft van. */
/* Wit veld met het schema-accent als tweede kleur: zo kleurt ook dit
   scherm mee met het cookie-schema van de vorige gebruiker. */
.login-wrap .orn-host{ --orn-color: #FFFFFF; --orn-accent: var(--accent-green, var(--ninja-cyaan)); opacity: .3; }

/* ==========================================================================
   Thema's — overgenomen uit Notula
   ==========================================================================

   Een thema zet alleen tokens om; de indeling blijft precies gelijk. Dat is de
   les uit Notula: vier herkenbare werelden zonder vier keer een layout te
   onderhouden.

   | Thema    | Stand   | Karakter                                        |
   |----------|---------|-------------------------------------------------|
   | notula   | donker  | antraciet-blauw met lavendel                    |
   | azzurro  | licht   | diepblauw kader met witte kaarten               |
   | midnight | donker  | navy, kaarten net lichter dan de grond          |
   | luxury   | donker  | zwart met goud als enige accent                 |

   Zet `data-thema` op <html>. Zonder dat attribuut blijft miGenda zoals hij
   was — de thema's zijn een keuze, geen vervanging.
*/

/* Hier stonden vier volledige themapaletten op html[data-thema="..."] --
   notula, azzurro, midnight en luxury. Het attribuut wordt nergens gezet: niet
   in een view, niet in PHP, niet in JavaScript. Vijfenvijftig regels die nooit
   iets deden. De keuze die er wél is loopt via data-theme (licht of donker) op
   de body en via de vier kleurenschema's. */

/* ==========================================================================
   Werkbank — drie kolommen: menu · lijst · het item zelf
   ==========================================================================

   Naar het voorbeeld van Notula: één scherm, geen tabbladen, en het openen van
   een item laat de lijst staan. Dat is de kern van "makkelijk doorklikken" —
   je verliest je plek niet.

   De eerste kolom is de bestaande zijbalk; deze regels gaan over kolom 2 en 3.
*/
@media (max-width: 1100px) {
}

/* ==========================================================================
   Lettertypen en iconen — zelf gehost, net als in Notula
   ==========================================================================

   Niets van Google: de bestanden staan in public/fonts/. Dat is geen
   principekwestie maar volgt uit de audit (sec-1) en uit de CSP, die
   `font-src 'self'` afdwingt — een verwijzing naar fonts.gstatic.com zou daar
   simpelweg op stuklopen.

   Figtree vervangt Aptos. Aptos is een Microsoft-licentie die we niet mogen
   inbedden; Figtree staat onder de Open Font License. Zie --lettertype.

   De unicode-ranges zijn die van Google zelf: zo haalt een browser alleen het
   latin-bestand op tenzij er echt een teken uit latin-ext op de pagina staat.
*/
@font-face {
    font-family: 'Figtree'; font-style: normal; font-weight: 400; font-display: swap;
    src: url('/fonts/figtree-400-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: 'Figtree'; font-style: normal; font-weight: 400; font-display: swap;
    src: url('/fonts/figtree-400-latinext.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;
}
@font-face {
    font-family: 'Figtree'; font-style: normal; font-weight: 500; font-display: swap;
    src: url('/fonts/figtree-500-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: 'Figtree'; font-style: normal; font-weight: 500; font-display: swap;
    src: url('/fonts/figtree-500-latinext.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;
}
@font-face {
    font-family: 'Figtree'; font-style: normal; font-weight: 600; font-display: swap;
    src: url('/fonts/figtree-600-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: 'Figtree'; font-style: normal; font-weight: 600; font-display: swap;
    src: url('/fonts/figtree-600-latinext.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;
}
@font-face {
    font-family: 'Figtree'; font-style: normal; font-weight: 700; font-display: swap;
    src: url('/fonts/figtree-700-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: 'Figtree'; font-style: normal; font-weight: 700; font-display: swap;
    src: url('/fonts/figtree-700-latinext.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;
}

@font-face {
    font-family: 'Material Symbols'; font-style: normal; font-weight: 400;
    /* `block` en niet `swap`: een icoon dat eerst als woord verschijnt en dan
       omklapt is erger dan een korte lege plek. */
    font-display: block;
    src: url('/fonts/material-symbols.woff2?v=09cdf5c9') format('woff2');
}

/* Het lettertype over de hele applicatie. Staat hier onderaan en overschrijft daarmee
   de regel bovenin — die blijft staan als vangnet mocht dit blok ooit weg gaan. */
body,
input,
select,
textarea,
button{
    font-family: var(--lettertype);
}

/*
   Een icoon is tekst: de naam staat in het element, het lettertype maakt er een
   tekening van. Grootte via font-size, kleur volgt de tekst eromheen.

       <span class="ms">check_box</span>

   Breedte en hoogte staan vast op 1em omdat de inhoud tot het lettertype er is
   de ligatuurnaam is ("check_box"). Zonder die grens duwt dat de layout opzij en
   klapt alles terug zodra het lettertype binnen is.
*/
.ms{
    font-family: 'Material Symbols';
    font-weight: 400;
    font-style: normal;
    line-height: 1;
    display: inline-block;
    flex-shrink: 0;
    vertical-align: -.18em;
    width: 1em;
    height: 1em;
    overflow: hidden;
    letter-spacing: normal;
    text-transform: none;
    white-space: nowrap;
    word-wrap: normal;
    direction: ltr;
    -webkit-font-feature-settings: 'liga';
    -webkit-font-smoothing: antialiased;
    font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
}
.side-acct{ flex: 1 1 100%; min-width: 0; }
.side-acct > summary{ background: rgba(255,255,255,.04); }
.side-acct > summary{ width: 100%; border-radius: 8px; padding-right: 86px !important; }
.side-acct[open] > summary{ background: rgba(255,255,255,.08); }


.side-acct > summary{
    display: flex; align-items: center; gap: 10px;
    padding: 10px 16px; cursor: pointer; list-style: none;
    color: #fff; font-size: var(--tekst-s);
}
.side-acct > summary::-webkit-details-marker{ display: none; }
.side-acct > summary:hover{ background: rgba(255,255,255,.08); }
.side-acct-av{
    width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
    background: var(--accent-green); color: var(--primary-dark);
    display: flex; align-items: center; justify-content: center;
    font-size: var(--tekst-xs); font-weight: 700;
}
.side-acct-naam{ flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.25; }
.side-acct-naam b{ font-weight: 600; font-size: var(--tekst-s); }
.side-acct-naam small{ font-size: var(--tekst-xs); opacity: .6; }

.side-acct-menu{
    /* Zelfde zijmarges als de nav-vlakken erboven. */
    position: absolute; left: 8px; right: 8px; bottom: 100%; margin-bottom: 6px;
    padding: 6px 0; background: var(--ninja-nacht);
    border: 1px solid rgba(255,255,255,.1); border-radius: 10px;
    box-shadow: 0 -8px 26px rgba(0,0,0,.35); z-index: 30;
}
.side-acct-menu a,
.side-acct-menu .side-acct-uit{
    display: flex; align-items: center; gap: 10px; width: 100%;
    padding: 8px 16px 8px 20px; font-size: var(--tekst-s); font-family: inherit;
    color: rgba(255,255,255,.82); text-decoration: none;
    background: none; border: none; cursor: pointer; text-align: left;
}
.side-acct-menu a:hover,
.side-acct-menu .side-acct-uit:hover{ background: rgba(255,255,255,.1); color: #fff; }
.side-acct-menu .side-acct-uit{ color: #FCA5A5; }
.side-acct-menu .ms{ font-size: 15px; opacity: .85; }

@media (max-width: 900px) {
    .side-acct-menu a,
.side-acct-menu .side-acct-uit{ min-height: 44px; }
}
.side-acct-versie{
    /* Zelfde raster als de menuregels erboven: 20px links en 10px tussen
       icoon en tekst, zodat de B in de icoonkolom valt. */
    display: flex; align-items: center; gap: 10px;
    padding: 9px 16px 2px 20px; margin: 0;
    font-size: var(--tekst-xs); color: rgba(255,255,255,.42);
}
.side-acct-versie .bp-merk{ flex-shrink: 0; opacity: .55; }

/* De oude losse voetregel is vervangen door het blok hierboven. */

/* ---------- Het merkteken: een gepixelde B ----------

   Zie resources/views/partials/merk.blade.php. De SVG gebruikt currentColor,
   dus de kleur komt van de tekst eromheen — daarmee klopt hij in elk thema
   zonder dat er per thema iets bij hoeft.
*/
.bp-merk{ display: block; flex-shrink: 0; }

.form-group select option{
    background: var(--bg-card); color: var(--text);
}

/* Telefoon: geen zijwaarts scrollen — de tabel houdt miniatuur, titel en
   status; type, review, opmerkingen en acties zie je na het openen. */

/* Toetsenbordfocus hoort te zien te zijn: klikbare tegels krijgen dezelfde
   ring als knoppen. */
[role="button"]:focus-visible{
    outline: 2px solid var(--primary); outline-offset: -2px;
}

/* ---------- Staafdiagram ----------

   De horizontale broer van het taartdiagram: de langste balk vol, de rest
   naar rato, en ze tekenen zich na elkaar in. */
.st{ display: block; }
@keyframes bp-staaf-in {
    from{ transform: scaleX(0); }
    to{ transform: scaleX(1); }
}
@keyframes bp-donut-in {
    from{ stroke-width: 0; opacity: 0; }
    to{ stroke-width: 3.6; opacity: 1; }
}

/* ---------- Dezelfde strakke vorm voor de vlakken eromheen ----------

   De kaarten hadden een grotere hoek en een schaduw; naast de tegels en de
   filterbalk stak dat af. Eén hoek, één rand, één achtergrond -- dan valt op
   wat er ín de vlakken staat en niet de vlakken zelf.
*/
/* Kaarten en vlakken zonder lijn eromheen. Een vlak dat een tint van zijn
   ondergrond verschilt scheidt zichzelf al; een streep er nog omheen maakt van
   een rustig scherm een raster van hokjes. Zo doet Notula het ook.

   Waar de vulling gelijk is aan de ondergrond -- een tabel op een kaart -- komt
   er wel een lijn, maar dan als scheiding tussen de rijen en niet als kader. */
/* Elk vlak licht een klein beetje op van de bladzijde. De schaduw is zacht en
   laag: hij hoort te zeggen "dit is een los vlak", niet "kijk mij eens
   zweven". Eén variabele voor de hele app, zodat een kaart op de agenda,
   een kolom en een venster hetzelfde gewicht krijgen. */
:root{ --vlakschaduw: 0 1px 2px rgba(38, 50, 56, .06), 0 6px 16px rgba(38, 50, 56, .10); }

.card{
    border-radius: var(--radius-vlak);
    border: none;
    background: var(--bg-soft, color-mix(in srgb, var(--text) 4%, var(--bg-card)));
    box-shadow: var(--vlakschaduw);
}
.modal,
.confirm-box{
    border-radius: var(--radius-vlak);
}

/* ==========================================================================
   Beeldtaal van eager.ninja
   ==========================================================================

   De zijbalk was een vlak van de primaire schemakleur. Dat is rustig, maar ook
   plat, en de kleur vocht met de accenten die er zelf in staan -- een gekleurd
   bolletje van een klant op een gekleurde ondergrond.

   Nu heeft hij de achtergrond van eager.ninja: bijna zwart, met een gloed
   erachter. Dat geeft diepte zonder kleur, dus de klantkleuren, de rode tellers
   en het groene accent hebben het vlak weer voor zichzelf.

   Ingetogener dan de site: daar staat de violette laag op 28% en ligt er een
   roze derde laag overheen. Een landingspagina mag schreeuwen; een menu waar je
   acht uur per dag langs kijkt niet.
*/

:root{
    /* De twee accenten van eager.ninja. Ze staan los van het kleurenschema van
       de gebruiker: dit is de huisstijl van de app zelf, niet van de klant. */
    --ninja-violet: #7C5CFF;
    --ninja-cyaan: #22D3EE;
    --ninja-nacht: #0B0C12;

    /* Het verloop door de letters van het woordmerk. Zelfde hoek en zelfde
       stops als op de site, zodat het als hetzelfde merk leest. */
    --ninja-verloop: linear-gradient(100deg, #FFFFFF 6%, #CFC6FF 46%, #8FE6F5 96%);
}

/* Op mobiel is het menu een lade die óver de inhoud schuift; het
   doorzichtige donker-vlak (één gloed onder menu en pagina, zie de
   dark-regel hierboven) liet daar de pagina doorschijnen. De lade is
   gewoon dicht. */

/* Het woordmerk in de kleurstelling van "EAGER NINJA": een verloop dwars door
   de letters. `background-clip: text` met een doorzichtige tekstkleur.

   De terugval staat er los boven: kan een browser het niet, dan blijft het
   gewoon witte tekst in plaats van onzichtbare.

   Dit is de opmaak van het volledige logo (partials/logo.blade.php): de
   maten staan in em zodat de lockup op elk formaat klopt -- de zijbalk
   gebruikt hem op 28px, het inlogscherm op 42. De -0,149em zet de tekstbasis
   op de voet van de B (bij line-height 1 hoort negatieve halve leading bij
   de som); de 37/28-verhouding zit in het partial. */
.bp-logo{ display: inline-flex; align-items: flex-end; gap: .11em; font-size: var(--logo-maat, 37px); }

/* Het korte merkteken en het woordmerk sluiten elkaar uit: in de smalle balk
   staat de G, zodra het menu openklapt het hele woord. Ze staan allebei in de
   HTML omdat de balk op hover openklapt -- dat mag geen serverronde kosten. */
.bp-logo .logo-kort{ display: none; line-height: 0; }
/* Op een smal scherm schaalt de lockup mee in plaats van uit zijn kolom te
   lopen -- de maat is een variabele, dus een factor eroverheen kan gewoon. */
@media (max-width: 480px) { .login-brand .bp-logo{ font-size: calc(var(--logo-maat, 37px) * .8); } }
.bp-logo .logo-text{
    font-size: 1em; font-weight: 700; letter-spacing: .027em;
    line-height: 1; margin-bottom: -.149em;
    color: #FFFFFF;
    /* Nooit afbreken. Het woordmerk bestaat uit drie stukken waarvan er twee
       een eigen vlakje dragen; op een smal scherm sprong ".app" naar de
       volgende regel en landde het blokje boven op de titel van de bladzijde. */
    white-space: nowrap;
}

@supports (-webkit-background-clip: text) or (background-clip: text) {
    /* De lichtstreep is een extra achtergrondlaag bóven het verloop; door
       de tekst-clip glanst hij alleen ín de letters, nooit erachter. De
       laag is drie keer zo breed als de tekst en parkeert buiten beeld
       (positie 100% = streep links buiten, 0% = rechts buiten), zodat de
       veeg van links naar rechts loopt en daarna stilstaat. */
    .bp-logo .logo-text{
        background:
            linear-gradient(105deg, transparent 44%, rgba(255,255,255,.85) 50%, transparent 56%) no-repeat,
            var(--ninja-verloop);
        background-size: 300% 100%, 100% 100%;
        background-position: 100% 0, 0 0;
        -webkit-background-clip: text;
        background-clip: text;
        color: transparent;
        animation: bp-logo-glans 4.8s ease-in-out infinite;
    }
}
@keyframes bp-logo-glans {
    0%,
8%{ background-position: 100% 0, 0 0; }
    32%{ background-position: 0% 0, 0 0; }
    32.1%,
100%{ background-position: 100% 0, 0 0; }
}
@media (prefers-reduced-motion: reduce) {
    .bp-logo .logo-text{ animation: none; }
}

/* De twee delen van het woordmerk.

   "mi" is het dunne deel: gewoon gewicht, iets ruimer gespatieerd. Het
   contrast komt van het vet op "Genda", niet van iets wat we van "mi"
   afhalen.

   Zet hier nooit `opacity` op. De letters worden gevuld met een verloop via
   background-clip: text, en opacity op een kind maakt daar een eigen
   stacking context van -- dan valt de clip weg en verdwijnt "mi" volledig.
   Dat is in miCura precies gebeurd toen het dunner moest. */
/* "mi" draagt hetzelfde vlakje als het label achteraan: geel op antraciet.
   Zo staat de naam tussen twee blokjes in dezelfde kleuren, en dragen die
   blokjes de merkkleur -- niet een losse letter middenin het woord. */
.bp-logo .logo-dun{
    display: inline-flex; align-items: center; justify-content: center;
    height: 1.24em; padding: 0 .18em; border-radius: .16em;
    font-weight: 700; letter-spacing: .03em;
    margin-right: .12em; vertical-align: middle;
    background: var(--geel); color: var(--inkt);
}

/* ".app" hoort bij de naam maar niet in dezelfde maat: klein, op de basislijn
   van de hoofdletters (anders zakt hij onder het woord uit) en met een kleine
   negatieve marge ervoor, want de punt brengt zelf al lucht mee. */
/* ".app" is een label en geen staartje: een klein vlakje met de naam erin.
   Daar zit de merkkleur, want een vlakje neemt zijn eigen ondergrond mee en
   valt dus nooit weg tegen de bladzijde eronder. Op donker geel op antraciet,
   op de gele balk andersom. */
.bp-logo .logo-tld{
    display: inline-flex; align-items: center; justify-content: center;
    /* Even hoog als het blokje "mi" ervoor: 1,24em van het woordmerk, en dat
       is 1,24 / 0,44 = 2,82em van zijn eigen kleinere letter. Zo lezen de twee
       blokjes als een paar en niet als een groot en een klein ding. */
    font-size: .44em; height: 2.82em;
    padding: 0 .34em; border-radius: .36em;
    font-weight: 700; letter-spacing: .04em;
    margin-left: .26em; vertical-align: middle;
    background: var(--geel); color: var(--inkt);
}


/* In hoog contrast en bij geforceerde kleuren wint leesbaarheid van sfeer: geen
   verloop, geen gloed, geen raster. */
@keyframes bp-hart {
    0%{ transform: scale(.7); }
    60%{ transform: scale(1.18); }
    100%{ transform: scale(1); }
}
/* De rechterkolom van het menu is een lijn: elke teller, badge en elk plusje
   eindigt op 20px van de menurand. De hoofdregels halen dat met hun eigen
   padding (20px); wat in een vlak staat, staat al 8px ingesprongen en krijgt
   dus 12px -- nagemeten, want hier stonden vier verschillende rechterkanten
   naast elkaar. */

/* ---------- De achtergrond waar het paneel op zweeft ----------

   Sinds het werkvlak een paneel met een marge eromheen is, kijk je langs de
   randen naar de pagina zelf. Een egaal grijs vlak leest daar als een gat.
   Dezelfde gloed als in het menu vult dat op: de twee schemakleuren, zwaar
   geblurd en zo flauw dat je het pas ziet als je erop let. Bewust de
   variabelen en niet vaste kleuren: wie een ander schema kiest, ziet ook de
   achtergrond meekleuren. Let op: --accent is hier de verkeerde variabele --
   dat is een bijna-witte tint van primary, en in donker staat hij vast op
   grafiet. De echte tweede schemakleur heet --accent-green.

   Op `body` en niet op `.main`, zodat hij achter het menu doorloopt en het
   scherm één ondergrond heeft.
*/
body::before{
    content: '';
    position: fixed; inset: -20% -10% auto -10%;
    height: 70%;
    z-index: -1;
    pointer-events: none;
    background:
        radial-gradient(42% 46% at 22% 40%, color-mix(in srgb, var(--primary) 16%, transparent), transparent 70%),
        radial-gradient(34% 40% at 76% 34%, color-mix(in srgb, var(--accent-green) 11%, transparent), transparent 72%);
    filter: blur(34px);
}

@media (prefers-contrast: more), (forced-colors: active) {
    body::before{ display: none; }
}

/* ================================================================
   De planagenda — het hoofdscherm

   Twee vlakken onder elkaar, precies zoals de papieren spread: boven geel
   (huiswerk noteren), onder donker (taken plannen). Die twee kleuren draaien
   níét mee met het kleurenschema. Het onderscheid tussen "wat moet er" en
   "wanneer doe ik het" is de methode zelf; als dat een smaakje werd, was het
   geen methode meer.

   Rechts loopt de stappenrail over de volle hoogte mee, want de zes stappen
   gaan over allebei de vlakken.

   Maatvoering: een dagkolom is minimaal 168px breed. Daaronder past
   "Aardrijkskunde" niet meer naast het lesuur en het lokaal, en dan gaat de
   regel afbreken -- wat in een rij van zeven kolommen meteen rommelig oogt.
   Zeven kolommen van 168 + gaten = 1246px; daarboven rekken ze mee, daaronder
   schuift het vlak horizontaal.
   ================================================================ */

/* De breedte van één dagkolom.

   Acht even brede sporen naast elkaar: zeven dagen en de boekenlegger. Met
   16 px marge links en rechts en 8 px tussen elk spoor is dat
   (100% - 2*16 - 7*8) / 8 = (100% - 88px) / 8.

   De legger gebruikt hetzelfde getal, dus hij is per definitie even breed als
   een dag en de tussenruimte is overal gelijk. */
.pa{
    /* Acht even brede sporen: zeven dagen en de boekenlegger, met de marge
       links, rechts en zeven keer ertussen. */
    --dagbreedte: calc((100% - 9 * var(--pa-marge)) / 8);

    position: relative;
    display: grid;
    grid-template-columns: 1fr;
    /* Vier rijen: gele balk, gele kolommen, donkere balk, donkere kolommen.
       De twee kolomrijen delen de ruimte die overblijft; de agenda krijgt er
       meer van, want een lesdag heeft acht uren en een avond vier taken.

       De balken staan als eigen rij in het raster en niet als kop bínnen een
       vlak: zo is er geen enkele plek waar een marge of een paneel tussen de
       kleuren kan komen. */
    /* Twee gelijke helften. Ze staan allebei standaard op tien regels -- tien
       lesblokken boven, tien taken onder -- en dan hoort de ruimte ook eerlijk
       verdeeld te zijn; met 1,15 tegen 1 paste de takenlijst er niet in en
       kreeg elke dagkolom een schuifbalk. */
    grid-template-rows: auto 1fr auto 1fr;
    flex: 1;
    min-height: 0;
    background: var(--planning-vlak);
}

.pa-agenda,
.pa-planning{
    display: flex;
    flex-direction: column;
    min-height: 0;
    min-width: 0;
    grid-column: 1;
}

.pa-balk{ grid-row: 1; grid-column: 1; }
.pa-agenda{ grid-row: 2; grid-column: 1; background: var(--geel-vlak); }
.pa-balk-donker{ grid-row: 3; grid-column: 1; }
.pa-planning{ grid-row: 4; grid-column: 1; background: var(--planning-vlak); }

/* ---------- De twee koppen ---------- */

/* ---------- De twee balken ----------

   Rij 1 is geel en draagt de hamburger, de kop en de weeknavigatie. Rij 3 is
   antraciet en draagt alleen de kop. Ze hebben dezelfde binnenmarge, dezelfde
   kopbreedte en dezelfde tussenruimte, zodat "Huiswerk" en "Takenlijst" onder
   elkaar staan en de twee inklap-pijltjes op dezelfde x. */
.pa-balk{
    display: flex; align-items: center; gap: 10px;
    /* Geen verticale binnenmarge: de hoogte ligt vast en de inhoud staat in
       het midden. Zo is de afstand tussen de balk en de kolommen precies
       --pa-marge, net als overal elders. */
    height: var(--balk-hoogte);
    padding: 0 var(--pa-marge);
    background: var(--geel-vlak);

    /* Binnen de balk is 100% al twee marges smaller dan het vlak eromheen, en
       --dagbreedte rekent met 100%. Zonder deze correctie is alles wat hier
       "even breed als een dagkolom" wil zijn drie pixels te smal. */
    --dagbreedte: calc((100% - 7 * var(--pa-marge)) / 8);
}
.pa-balk-donker{ background: var(--planning-vlak); }
/* De hamburger stond in de gele balk, en de donkere balk zette er een leeg
   blokje van dezelfde breedte naast zodat de twee koppen onder elkaar stonden.
   Die hamburger is naar de strook boven het vlak verhuisd; met dat blokje stond
   "Taken" juist scheef, dus het is weg.

   Wit, want deze balk is antraciet. Dit stond op .pa-titel, en die klasse
   bestaat hier niet meer sinds de kop een knop werd -- "Taken" was daardoor
   antraciet op antraciet en dus onzichtbaar. */
.pa-balk-donker .pa-vlaknaam{ color: #FFFFFF; }
.pa-balk-donker .pa-vlaknaam:hover{ background: rgba(255, 255, 255, .12); }

/* De weeknavigatie staat helemaal rechts, boven de boekenlegger. */
.pa-weeknav{
    display: flex; align-items: center; gap: 6px;
    /* Helemaal rechts en precies zo breed als de boekenlegger eronder: de balk
       heeft dezelfde binnenmarge als waar de legger op staat, dus hun
       rechterranden vallen samen en de groep dekt zijn kolom. */
    margin-left: auto;
    width: var(--dagbreedte);
}
/* Het weeknummer staat tussen de twee pijlen -- dat is waar je het leest, en
   dan zegt de pijl ernaast meteen wat hij verandert. Het zat in een grijs
   vlakje ernaast; die achtergrond is weg, want op geel is een tweede tint
   grijs een vlek en geen vlakje. */
.wk-nummer{
    flex: 1; min-width: 0; text-align: center;
    font-size: var(--tekst-xs); font-weight: 600; color: var(--inkt);
    font-variant-numeric: tabular-nums;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Ingeklapt: alleen de kop blijft staan. grid-template-rows op de ouder
   verandert mee via de klasse, zodat het andere vlak de ruimte krijgt. */
/* Ingeklapt: de kolommen verdwijnen en die rij krimpt naar niets, waarna de
   andere de ruimte krijgt. De balken blijven staan -- dat is de knop waarmee
   je het weer opendoet. */
.pa.agenda-dicht{ grid-template-rows: auto 0 auto 1fr; }
.pa.planning-dicht{ grid-template-rows: auto 1fr auto 0; }
.pa.agenda-dicht .pa-agenda,
.pa.planning-dicht .pa-planning{ display: none; }

/* ---------- De rij dagkolommen ---------- */

.pa-kolommen{
    display: flex; gap: var(--pa-marge);
    /* Rondom dezelfde marge. Rechts komt de boekenlegger erbij: die ligt óp het
       vlak en mag geen kolom afdekken, dus we houden zijn breedte plus nog een
       marge vrij. Het vlak zelf loopt wél door tot de rand.

       De bovenmarge doet nog iets: de kolom van vandaag draagt een ring van
       2 px, en omdat dit vlak horizontaal schuift wordt alles wat er verticaal
       buiten valt afgekapt. Zonder die ruimte stond de bovenkant van die ring
       er afgesneden bij. */
    padding: var(--pa-marge) calc(var(--dagbreedte) + 2 * var(--pa-marge)) var(--pa-band) var(--pa-marge);
    flex: 1; min-height: 0;
    overflow-x: auto; overflow-y: hidden;
    scrollbar-width: thin;
}
/* Onder deze breedte houdt krimpen op en gaat het vlak schuiven.

   Twee klassen in de selector, niet `> *`: .pa-dag zet zelf min-width op 0 (om
   te mogen krimpen binnen de flexregel) en dat won van een selector met
   dezelfde zwaarte die er later in het blad stond. Op een smal venster werden
   de kolommen daardoor 55 pixels breed en las er niets meer. */
.pa-kolommen > .pa-dag,
.pa-kolommen > .pa-plandag{ min-width: 132px; }
/* De boekenlegger hoort niet bij de kolommen maar ligt erover; hij mag die
   ondergrens dus niet erven. */
.pa-kolommen > .pa-stappen{ min-width: 0; }

/* ---------- Agendakolom ---------- */

.pa-dag{
    /* Krimpen mag: zeven kolommen van 168 passen niet in elk venster, en een
       kolom van 150 leest nog prima -- er staat een afkorting in het bolletje,
       geen vaknaam. Pas onder 132px gaat de tekst afbreken; dan schuift het
       vlak horizontaal (min-width op .pa-kolommen). */
    flex: 1 1 150px; min-width: 0;
    display: flex; flex-direction: column; min-height: 0;
    background: var(--agenda-kaart);
    border-radius: var(--radius-vlak);
    box-shadow: var(--vlakschaduw);
    overflow: hidden;
}
/* Het weekend is geen lesdag: dezelfde kolom, een tint stiller. */
.pa-dag.is-weekend{ background: var(--agenda-weekend); }
.pa-dag.is-vakantie{ box-shadow: inset 0 3px 0 var(--geel); }
/* Vandaag krijgt een randje in de merkkleur -- naast het rode badge, want
   kleur alleen mag de dag niet aanwijzen. */
/* Vandaag: een ring om de kolom, en verder niets. Geen schaduw eronder --
   dat leest op geel als een lijn, en lijnen wil dit scherm nergens. */
/* Vandaag draagt een ring én de schaduw: box-shadow overschrijft zichzelf, dus
   zonder de tweede helft zou juist de kolom van vandaag plat op de bladzijde
   liggen. */
.pa-dag.is-vandaag{ box-shadow: 0 0 0 2px var(--inkt), var(--vlakschaduw); }

.pa-dag-kop{
    flex: 0 0 var(--dagkop-hoogte);
    display: flex; flex-direction: column; justify-content: center;
    padding: 0 10px;
}
.pa-dag-naam{
    display: flex; align-items: center; gap: 6px;
    font-size: var(--tekst-s); font-weight: 700; color: var(--inkt);
    text-transform: capitalize;
}
.pa-dag-datum{
    display: flex; align-items: baseline; gap: 6px;
    font-size: var(--tekst-xs); color: var(--inkt-zacht); margin-top: 1px;
}
.pa-feest{
    margin-left: auto; font-weight: 600; color: #B45309;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 96px;
}
.pa-vandaag{
    background: var(--vandaag); color: #FFFFFF;
    font-size: 9.5px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase;
    padding: 1px 6px; border-radius: 999px;
}

/* ---------- De regels ---------- */

/* De tien regels verdelen de hoogte onder elkaar: geen schuifbalk als ze net
   niet passen, en geen gat onderin als ze ruim passen. Onder de 26px houdt
   groeien op -- dan schuift de lijst alsnog. */
.pa-regels{
    list-style: none; margin: 0; padding: 0 8px;
    flex: 1; min-height: 0; overflow-y: auto;
    display: flex; flex-direction: column; gap: 2px;
}
.pa-regel{ flex: 1 1 0; min-height: 22px; display: flex; }

/* De regel die zegt dat er meer is. Geen knop: er valt niets te openen. */
.pa-regel.is-meer, .pa-planregel.is-meer{
    align-items: center; justify-content: center;
    background: none; cursor: default;
}
.pa-meer{ font-size: var(--tekst-xs); font-weight: 700; opacity: .75; }
.pa-regel-knop{
    display: flex; align-items: center; gap: 6px; width: 100%;
    /* De regel krijgt zijn hoogte van de kolom: tien stuks die samen precies
       passen. 24px is de bodem -- het bolletje is 22 en heeft een pixel lucht
       nodig -- maar in de praktijk staan ze ruimer. */
    min-height: 22px; height: 100%; padding: 2px 6px;
    background: var(--agenda-kaart); border: 0; border-radius: var(--radius);
    font-family: inherit; font-size: var(--tekst-xs); color: var(--inkt);
    text-align: left; cursor: pointer;
}
.pa-regel-knop:hover{ background: color-mix(in srgb, var(--geel) 22%, #FFFFFF); }
.pa-regel-knop:focus-visible{ outline: 2px solid var(--inkt); outline-offset: 1px; }

/* Leeg lesuur: het grijze streepje uit het boek. Dat het leeg is, is de
   boodschap -- daar heb je niets genoteerd. */
.pa-regel.is-leeg > .pa-regel-knop{ background: var(--agenda-leeg); }
.pa-regel.is-leeg > .pa-regel-knop:hover{ background: #DFE0E5; }

/* Ingepland: er staat een taak voor op de takenlijst (stap 3 en 4 gedaan).
   Het vinkje rechts zegt hetzelfde, zodat kleur nooit de enige drager is. */
.pa-regel.is-ingepland > .pa-regel-knop{ background: var(--ingepland); }
.pa-regel.is-ingepland > .pa-regel-knop:hover{ background: #BBDCF8; }

.pa-regel.is-af .pa-tekst{ text-decoration: line-through; opacity: .55; }

.pa-bol{
    flex: 0 0 auto;
    width: 22px; height: 22px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: 9px; font-weight: 700; text-transform: lowercase; letter-spacing: -.2px;
    background: #94A3B8; color: #FFFFFF;
}
/* Gevuld en niet omlijnd. Een rand van 0,8 px op eenentwintig lege bolletjes
   leest niet als eenentwintig cirkels maar als lijnen door de kolom heen --
   en dit scherm hoort er geen te hebben. Een iets donkerder vlak zegt
   hetzelfde: hier hoort een vak, er staat niets. */
.pa-bol.is-leeg{ background: #DDDFE4; border: 0; color: #8C93A0; }
.pa-bol .ms{ font-size: 13px; }

.pa-ml{ flex: 0 0 auto; font-weight: 700; opacity: .75; width: 12px; }

.pa-tekst{
    flex: 1; min-width: 0;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* De markeerstift: werk waar een cijfer voor komt. Vet erbij, want een
   markering die alleen kleur is verdwijnt voor wie kleuren slecht ziet. */
.pa-tekst.is-markering{
    background: var(--markering); font-weight: 700;
    padding: 0 3px; border-radius: 3px;
    box-decoration-break: clone;
}

.pa-clip{ flex: 0 0 auto; font-size: 13px !important; color: var(--inkt-zacht); }

.pa-meta{ flex: 0 0 auto; text-align: right; line-height: 1.05; }
.pa-meta b{ display: block; font-size: 9.5px; font-weight: 700; color: var(--inkt-zacht); }
.pa-meta i{ display: block; font-size: 8.5px; font-style: normal; color: #A2A8B4; }

.pa-vink{ flex: 0 0 auto; font-size: 14px !important; color: #1E73BE; }

/* ---------- De balk onder een agendakolom ---------- */

.pa-dag-voet{
    flex: 0 0 var(--dagvoet-hoogte);
    display: flex; align-items: center; gap: 4px;
    padding: 0 8px;
    /* Een tweede activiteit duwde de plus de kolom uit; nu krimpen de
       chips en houdt de plus zijn plek rechts. */
    overflow: hidden;
}
.pa-notitie{
    display: inline-flex; align-items: center; gap: 4px;
    flex: 0 1 auto; min-width: 34px;
    background: var(--agenda-leeg); border-radius: 999px;
    padding: 2px 4px 2px 8px; font-size: 9.5px; color: var(--inkt);
}
.pa-notitie-tekst{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.pa-notitie b{ font-weight: 700; white-space: nowrap; }
.pa-notitie form{ display: inline-flex; }
.pa-notitie-weg,
.pa-notitie-plus{
    background: none; border: 0; cursor: pointer; padding: 0; line-height: 0;
    color: var(--inkt-zacht); border-radius: 50%;
}
.pa-notitie-weg .ms{ font-size: 13px; }
.pa-notitie-plus{
    width: 20px; height: 20px; display: inline-flex; align-items: center; justify-content: center;
    background: var(--agenda-leeg);
    /* Altijd rechts, ook als er geen activiteit staat. De plus hoort op een
       vaste plek: dan hoef je hem niet te zoeken en verspringt hij niet zodra
       je er iets bij zet. Nooit meekrimpen: hij is de knop. */
    flex: 0 0 20px; margin-left: auto;
}
.pa-notitie-plus:hover{ background: var(--geel); color: var(--inkt); }
.pa-notitie-plus .ms{ font-size: 14px; }

/* ---------- Planningkolom (donker) ---------- */

.pa-plandag{
    flex: 1 1 150px; min-width: 0;
    display: flex; flex-direction: column; min-height: 0;
    /* Onderaan dezelfde ruimte als de balk met activiteiten in een
       agendakolom. Er staat niets in -- het is er zodat de acht taken evenveel
       hoogte krijgen als de acht lesuren erboven. */
    padding-bottom: var(--dagvoet-hoogte);
    background: var(--planning-kaart);
    border-radius: var(--radius-vlak);
    /* Op het antraciete vlak moet de schaduw dieper zijn: een lichte schaduw
       op een donkere ondergrond zie je niet. */
    box-shadow: 0 1px 2px rgba(0, 0, 0, .22), 0 8px 20px rgba(0, 0, 0, .28);
    overflow: hidden;
}
.pa-plandag.is-weekend{ background: #2A2F3D; }
.pa-plandag.is-vandaag{ box-shadow: 0 0 0 2px var(--geel), 0 1px 2px rgba(0, 0, 0, .22), 0 8px 20px rgba(0, 0, 0, .28); }

.pa-plandag-kop{
    flex: 0 0 var(--dagkop-hoogte);
    display: grid; grid-template-columns: 1fr auto; align-content: center;
    gap: 2px 6px; padding: 0 10px;
}
.pa-plandag-naam{
    display: flex; align-items: center; gap: 6px;
    font-size: var(--tekst-s); font-weight: 700; color: #FFFFFF; text-transform: capitalize;
}
.pa-plandag-datum{ font-size: var(--tekst-xs); color: var(--planning-zacht); }
.pa-start{
    grid-row: 1 / span 2; grid-column: 2;
    background: none; border: 0; cursor: pointer; padding: 0;
    color: var(--planning-zacht); line-height: 0; align-self: start;
}
.pa-start:hover:not(:disabled){ color: var(--geel); }
.pa-start:disabled{ opacity: .3; cursor: default; }
.pa-start .ms{ font-size: 22px; }
.pa-teller{ grid-column: 2; grid-row: 1 / span 2; text-align: right; }
.pa-teller b{ display: block; font-size: var(--tekst-s); font-weight: 700; color: #FFFFFF; }
.pa-teller i{ display: block; font-size: 9.5px; font-style: normal; color: var(--planning-zacht); }

/* De kop heeft drie dingen rechts van de naam (start, teller) en twee regels
   links; een klein raster is hier eerlijker dan drie geneste flexboxen. */
.pa-plandag-kop{ grid-template-columns: 1fr auto auto; }
.pa-plandag-naam{ grid-column: 1; grid-row: 1; }
.pa-plandag-datum{ grid-column: 1; grid-row: 2; }
.pa-start{ grid-column: 2; grid-row: 1 / span 2; align-self: center; }
.pa-teller{ grid-column: 3; grid-row: 1 / span 2; }

.pa-planregels{
    list-style: none; margin: 0; padding: 0 8px;
    flex: 1; min-height: 0; overflow-y: auto;
    display: flex; flex-direction: column; gap: 2px;
}
.pa-planregel{
    display: flex; align-items: center; gap: 4px;
    flex: 1 1 0; min-height: 22px;
    background: var(--planning-rij); border-radius: var(--radius);
    padding: 2px 4px;
}
.pa-planregel.is-leeg{ background: var(--planning-leeg); }
.pa-planregel.is-af{ opacity: .55; }
.pa-planregel.is-af .pa-tekst{ text-decoration: line-through; }
.pa-planregel.is-door{ opacity: .45; }
.pa-planregel.is-activiteit{ background: #3F4557; }
.pa-planregel.is-pauze{ background: #333A4B; }
.pa-planregel.sleept{ opacity: .4; }
.pa-planregel.doelwit{ box-shadow: inset 0 2px 0 var(--geel); }

.pa-vinkvorm,
.pa-doorvorm{ display: flex; flex: 0 0 auto; }
.pa-bol-knop{
    position: relative; background: none; border: 0; padding: 0; cursor: pointer; line-height: 0;
    border-radius: 50%;
}
.pa-bol-vink{
    position: absolute; inset: 0;
    display: flex; align-items: center; justify-content: center;
    font-size: 15px !important; color: #FFFFFF;
    background: rgba(20,24,34,.55); border-radius: 50%;
}
.pa-planregel .pa-bol.is-activiteit{ background: var(--geel); color: var(--inkt); }
.pa-planregel .pa-bol.is-pauze{ background: #55607A; color: #FFFFFF; }

.pa-planregel-knop{
    display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0;
    background: none; border: 0; padding: 2px 2px;
    font-family: inherit; font-size: var(--tekst-xs); color: #D6DAE4;
    text-align: left; cursor: pointer;
}
.pa-planregel-knop:focus-visible{ outline: 2px solid var(--geel); outline-offset: 1px; }
.pa-planregel .pa-ml{ color: var(--planning-zacht); }
.pa-planregel .pa-tekst.is-markering{
    background: transparent; color: var(--geel); padding: 0;
}
.pa-prio{
    flex: 0 0 auto; width: 15px; height: 15px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: 8.5px; font-weight: 700;
    background: rgba(255,255,255,.10); color: var(--planning-zacht);
}
/* De tijd staat in een kolom van vaste breedte, rechts uitgelijnd en met
   cijfers van gelijke breedte. Anders bepaalt "1 u 30" of "20 min" waar het
   nummertje ervoor terechtkomt, en dan staat geen enkele regel onder de
   andere. */
.pa-min{
    flex: 0 0 42px; text-align: right;
    font-size: 9.5px; color: var(--planning-zacht); white-space: nowrap;
    font-variant-numeric: tabular-nums;
}
.pa-door{
    background: none; border: 0; cursor: pointer; padding: 0; line-height: 0;
    color: var(--planning-zacht); opacity: 0; transition: opacity .12s;
}
.pa-planregel:hover .pa-door,
.pa-door:focus-visible{ opacity: 1; }
.pa-door .ms{ font-size: 14px; }

/* ---------- De stappenrail ---------- */

/* De boekenlegger ligt óp de twee vlakken en is er geen kolom naast.

   In het boek is dit letterlijk een kaartje dat in de agenda ligt; in het
   instructiefilmpje staat hij naast de spread. Een eigen kolom zou het geel en
   het antraciet doorsnijden, en dan lees je twee smalle vlakken in plaats van
   twee grote. Nu loopt de kleur eronderdoor en ligt de legger erop -- met een
   schaduw, want dat is wat een kaartje op papier doet.

   De kolommen houden rechts precies zijn breedte vrij (.pa-kolommen), zodat hij
   niets afdekt. */
.pa-stappen{
    /* Boven begint hij waar de kolommen beginnen: onder de balk, plus dezelfde
       marge. Rechts en onder dezelfde marge als overal. */
    position: absolute;
    top: var(--pa-band);
    right: var(--pa-marge);
    bottom: var(--pa-band);
    width: var(--dagbreedte); z-index: 2;
    display: flex; flex-direction: column;
    background: #FFFFFF;
    border-radius: var(--radius-vlak);
    overflow: hidden;
}
/* Geen schaduw. Hij zat er om de legger op het vlak te laten liggen, maar het
   vlak eromheen wordt afgekapt (.content en het paneel staan op overflow
   hidden), dus bovenaan bleef er een afgesneden rand over -- precies de lijn
   die dit scherm nergens hoort te hebben. Vlak wit is genoeg: de kleur
   eromheen doet het werk al. */
/* De kop van de boekenlegger draagt het antraciet met het geel erop -- dezelfde
   regel als de knoppen: antraciet op geel, geel op antraciet. Hij was geel, en
   dan liep hij over in het gele vlak eronder en las de legger niet als een
   eigen kaartje. */
.pa-stappen-kop{
    background: var(--planning-vlak); color: var(--geel);
    font-size: var(--tekst-s); font-weight: 700; text-align: center;
    padding: 7px 6px;
}
.pa-stappen ol{ list-style: none; margin: 0; padding: 0; flex: 1; }
.pa-stap{
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
    padding: 8px; text-align: center; min-height: 0;
}
/* Om en om wit en grijs, zoals de boekenlegger: het maakt de zes stappen in
   drie paren leesbaar zonder er lijnen tussen te zetten. */
/* Om en om: wit, grijs, wit, grijs. Zes vlakken die je zo in één oogopslag
   uit elkaar houdt zonder dat er een lijn tussen hoeft. */
.pa-stap:nth-child(even){ background: #F3F3F5; }
.pa-stap-nr{
    width: 17px; height: 17px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--geel); color: var(--inkt);
    font-size: 9.5px; font-weight: 700;
}
.pa-stap b{ font-size: var(--tekst-xs); font-weight: 700; color: var(--inkt); }
.pa-stap small{ font-size: 9.5px; color: var(--inkt-zacht); line-height: 1.2; }
.pa-stap-tussen{
    display: block; margin-top: 4px;
    font-size: 9px; font-style: normal; color: var(--inkt-zacht);
}

/* De rail licht op welk vlak bij de stap hoort zodra je erover zweeft. */
.pa-stap[data-deel="agenda"]:hover{ box-shadow: inset 3px 0 0 var(--geel); }
.pa-stap[data-deel="planning"]:hover{ box-shadow: inset 3px 0 0 var(--planning-vlak); }
.wk-nummer{ font-size: var(--tekst-xs); color: var(--text-light); white-space: nowrap; }

/* ---------- De vensters ---------- */

.pa-vorm{ display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; }
.pa-vink-veld{ display: flex; align-items: center; gap: 8px; margin: 10px 0; font-size: var(--tekst-s); }
.pa-stukken{ list-style: none; margin: 12px 0 0; padding: 0; display: grid; gap: 6px; }
.pa-stukken li{ display: flex; align-items: center; gap: 8px; font-size: var(--tekst-s); }
.pa-stukken .pa-stuk-dag{ flex: 0 0 116px; color: var(--text-light); }
.pa-stukken input{ flex: 1; }

/* Het scherm is één vlak zonder marge: de planagenda vult het paneel volledig,
   anders zweeft er een witte rand omheen die de twee kleurvlakken uit elkaar
   trekt. */


/* ----------------------------------------------------------------------
   Telefoon, laatste woord: dit blok staat bewust onderaan het bestand.
   iOS zoomt in (en nooit meer uit) zodra een veld kleiner is dan 16px;
   specifiekere regels wonnen eerder van de generieke 16px-bescherming.
   En 44px is pas een duimdoel als hij ook 44 hóóg is.
   ---------------------------------------------------------------------- */
@media (max-width: 640px) {
    /* Precies de iOS-ondergrens: kleiner zoomt de telefoon in bij focus
       (en zoomt nooit meer uit), groter hoeft niet. Bewuste vaste maat,
       geen token — en mét de .form-group-varianten, want die specifiekere
       basisregel (tekst-m) won anders alsnog. */
    input,
select,
textarea,
.form-group input,
.form-group select,
.form-group textarea,

    .btn,
.icon-btn{ min-height: 44px; }

    .gebruikers-tabel th:nth-child(2),
.gebruikers-tabel td:nth-child(2),
.gebruikers-tabel th:nth-child(4),
.gebruikers-tabel td:nth-child(4),
.gebruikers-tabel th:nth-child(5),
.gebruikers-tabel td:nth-child(5){ display: none; }

    /* Paginaknoppen blijven naast elkaar rechts (dat spaart hoogte); de
       onderregel hangt absoluut ónder de titel. Zo telt alleen de kop
       mee voor de uitlijning: de hamburger staat er precies naast, en de
       koptekst staat op élk scherm op dezelfde plek — mét of zónder
       onderregel (de vaste padding eronder reserveert die regel altijd). */
    .topbar .controls{ flex-wrap: nowrap; flex-shrink: 0; }
    .topbar{ padding-bottom: 26px; }
    .topbar-tekst{ position: relative; min-width: 0; }
    .topbar-subs{ position: absolute; top: 100%; left: 0; max-width: 72vw; }
    .topbar h1,
.topbar-sub{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

    /* Vinkjes en rondjes zijn geen tekstvelden: de 44px-duimregel blies
       ze op tot zwarte knoppen. De tikzone zit op het label. */
    input[type="checkbox"],
input[type="radio"]{ min-width: 0; min-height: 0; }

    /* Formulier-rijen stapelen op een telefoon. De regel hierboven in het
       bestand verliest het van de basisregel (die staat later); hier in
       het eindblok wint hij wél. */
    .form-row,
.form-row-3,
.grid-2{ grid-template-columns: 1fr; }

    /* De bovenstrook (logo · klantnaam · knoppen) netjes op één lijn,
       met een witregel eronder vóór de paginakop begint. */
    .zoom-groep{ align-items: center; margin-bottom: 12px; }
}


/* De boekenlegger begint op de hoogte van de kolommen en is zo hoog als zijn
   inhoud. Hij liep eerst tot onderaan het scherm; dan staat er onder de zesde
   stap een halve meter wit, en dat leest als een fout in plaats van als rust. */
/* De boekenlegger loopt over de volle hoogte: van de bovenkant van de kolommen
   tot de onderrand van het paneel. Hij was even zo hoog als zijn inhoud, maar
   dan hangt hij halverwege in de lucht -- een legger ligt over de hele bladzij.

   De zes stappen verdelen zich over die hoogte in plaats van bovenaan te
   klonteren; dan is de lege ruimte eronder geen restje maar rust. */
/* Boven en onder op dezelfde lijn als de kolommen (zie .pa-kolommen). */
.pa-stappen{ overflow-y: auto; }
/* Zes gelijke vlakken over de volle hoogte. Een raster en geen flexrij: dan
   zijn ze gegarandeerd even hoog, ook als de ene stap een langere ondertitel
   heeft dan de andere. */
.pa-stappen ol{ flex: 1; display: grid; grid-template-rows: repeat(6, 1fr); }

/* ---------- De knoppen in de twee vlakken ----------

   Antraciet op geel, geel op antraciet. Eén regel, en hij geldt voor elke knop
   die in een van de twee vlakken staat -- de weeknavigatie in de balk, het
   plusje onder een dagkolom, de startknop van een dag.

   Het is geen versiering: op geel haalt antraciet 14,7:1 en op antraciet haalt
   geel 13,4:1. Wit op geel haalt 1,1 en was onleesbaar. */


.pa-planning .btn-primary{ background: var(--geel); color: var(--inkt); }
.pa-planning .btn-primary:hover{ background: #FFF06B; color: var(--inkt); }

/* Het plusje onder een agendakolom volgt dezelfde regel. */
.pa-notitie-plus{ background: var(--planning-vlak); color: var(--geel); }
.pa-notitie-plus:hover{ background: var(--inkt); color: var(--geel); }

/* En de startknop van een dag in het donkere vlak. */
.pa-start{ color: var(--geel); opacity: .75; }
.pa-start:hover:not(:disabled){ color: var(--geel); opacity: 1; }


/* ---------- Eén geel vlak en één antraciet vlak ----------

   Geen naad tussen de balk en de kolommen: het paneel draagt zelf het geel, dus
   ook als er door afronding een halve pixel tussen valt is die geel en niet
   wit. Een haarlijn op die plek leest als een rand, en dit scherm heeft er geen.

   Het antraciet komt van .pa zelf en loopt van de onderkant van het gele vlak
   tot de onderrand van het paneel. */

/* De twee kopteksten onder elkaar. "Huiswerk" is het richtpunt: die staat na de
   hamburger, dus springt "Takenlijst" even ver in. */


/* ---------- De strook boven het paneel ---------- */

/* Het logo staat op dezelfde regel als het account rechts: allebei in de
   strook boven het paneel, allebei op dezelfde hoogte. Het stond eerst in de
   normale stroom en zakte daardoor onder de knoppen. */
.balk-merk{
    position: absolute; top: 14px; left: 16px; z-index: 5;
    display: inline-flex; align-items: center; text-decoration: none;
}

/* De weeknavigatie schuift links van de boekenlegger, anders staat "Vandaag"
   er precies bovenop. Dezelfde breedte als de vrijgehouden ruimte in
   .pa-kolommen -- die twee horen bij elkaar. */


/* ---------- De strook boven het paneel ----------

   Links het logo, rechts de taal, de tekstgrootte en het account. Die strook
   is lichtgrijs; alles wat erin staat kwam uit de donkere zijbalk en was dus
   in wit getekend -- daar was het onzichtbaar. Hier draagt alles het
   antraciet.

   Het logo verliest hier zijn verloop. Dat verloop is gemaakt om op donker te
   liggen (wit -> lavendel -> lichtblauw); op lichtgrijs verdwijnt het. Op het
   inlogscherm, waar de achtergrond wél donker is, blijft het staan. */
/* Het woordmerk in de strook: "mi" zwart, de G in het merkgeel, "enda" zwart
   en ".app" grijs. Het verloop dat het logo op donker draagt is hier weg -- dat
   is gemaakt om op het donkere inlogscherm te liggen en verdwijnt op lichtgrijs.

   Het onderscheid tussen "mi" en "enda" komt hier dus van het gewicht en niet
   van de kleur; de G is het enige gekleurde teken, en dat is dezelfde letter
   als de favicon. */
.balk-merk .logo-text{
    background: none;
    -webkit-text-fill-color: currentColor;
    color: #000000;
    animation: none;
}
.balk-merk .logo-dun{ background: var(--inkt); color: var(--geel); }
/* Op geel keert het label om: antraciet vlakje, gele letters. */
.balk-merk .logo-tld{ background: var(--inkt); color: var(--geel); -webkit-text-stroke: 0; }
.balk-merk .logo-kort{ display: none; }

/* Het account rechtsboven: dezelfde bouwstenen als in de zijbalk, maar dan op
   licht. De naam mag hier weg zodra het krap wordt -- de foto of de initialen
   zeggen genoeg, en de rol staat in het menu eronder. */
.zoom-groep .side-acct{ flex: 0 0 auto; position: relative; }
/* Het account krijgt exact de vorm en de maat van het zoomvlakje ernaast:
   dezelfde ondergrond, dezelfde ronding (11), dezelfde binnenmarge (3/5) en een
   regelhoogte van 24 -- de maat van .zoom-knop. Drie pilletjes op één rij horen
   niet elk hun eigen vorm te hebben. */
.zoom-groep .side-acct > summary{
    background: color-mix(in srgb, var(--text) 6%, var(--bg-card));
    color: var(--inkt);
    width: auto; padding: 3px 5px !important; border-radius: 11px;
    display: flex; align-items: center; gap: 6px; cursor: pointer;
}
.zoom-groep .side-acct > summary:hover{ background: color-mix(in srgb, var(--text) 12%, var(--bg-card)); }
.zoom-groep .side-acct-av{ width: 24px; height: 24px; background: var(--planning-vlak); color: var(--geel); }
.zoom-groep .side-acct-naam{ padding-right: 4px; }
.zoom-groep .side-acct-naam b{ font-size: var(--tekst-s); font-weight: 600; line-height: 24px; }
.zoom-groep .side-acct-naam b{ color: var(--inkt); }
.zoom-groep .side-acct-naam small{ color: var(--inkt-zacht); opacity: 1; }
/* Naar beneden, niet naar boven. In de zijbalk zat dit blok onderin, dus
   klapte het omhoog; in de strook bóven het paneel is dat precies verkeerd om.
   `bottom: auto` moet erbij: de regel uit de zijbalk zet bottom op 100% en die
   blijft anders staan. */
.zoom-groep .side-acct-menu{
    position: absolute; right: 0; left: auto; bottom: auto; top: calc(100% + 6px);
    margin-bottom: 0;
    border: 1px solid var(--border);
    box-shadow: 0 12px 34px rgba(0,0,0,.22);
    min-width: 220px; z-index: 60;
    background: var(--bg-card); color: var(--text);
    border-radius: var(--radius-vlak);
    box-shadow: 0 12px 34px rgba(0,0,0,.22);
    padding: 6px;
}
.zoom-groep .side-acct-menu a,
.zoom-groep .side-acct-menu .side-acct-uit{ color: var(--text); }

@media (max-width: 900px) {
    .zoom-groep .side-acct-naam{ display: none; }
    .zoom-groep .side-acct > summary{ padding-right: 4px !important; }
}

/* De G van miGenda in het merkgeel: dezelfde letter als de favicon en de
   app-iconen. Hij had een antracieten omlijning voor het contrast, maar die
   las als een omtrek om de letter heen in plaats van als een letter.

   Wat ervoor in de plaats komt geldt voor het hele woordmerk: een dunne
   omlijning in de eigen kleur. Dat maakt de letters zwaarder dan 700 zonder
   een extra lettertypebestand -- Figtree houdt bij 700 op -- en het zet geen
   rand om de G, want de omlijning heeft de kleur van de letter zelf. */
.balk-merk .logo-text{ -webkit-text-stroke: .55px currentColor; }
.balk-merk .logo-dun{ -webkit-text-stroke: 0; }
/* Het verloop en de glans van het inlogscherm mogen niet over de twee
   vlakjes heen: die hebben hun eigen ondergrond. */
.bp-logo .logo-dun,
.bp-logo .logo-tld{ -webkit-text-fill-color: currentColor; }

/* De twee kopteksten krijgen dezelfde breedte, zodat het inklap-pijltje
   erachter in allebei precies onder elkaar staat. Zonder dit hangt het pijltje
   aan de tekst, en die twee zijn niet even lang. */


/* De strook boven het paneel als één rij: logo links, de rest rechts.

   Het waren twee absoluut gepositioneerde blokjes die elk hun eigen bovenmarge
   hadden en dus niet op dezelfde regel uitkwamen. Een flexrij kan dat niet
   verkeerd doen. */
/* ==========================================================================
   Het vlak van een bladzijde
   ==========================================================================

   Deze vier maten golden eerst alleen in de agenda. Nu heeft elke bladzijde
   hetzelfde vlak -- gele balk boven, antraciet eronder -- en horen ze dus
   overal te gelden, anders lopen de balken en de marges uit elkaar. */
:root{
    /* De enige afstand: rondom de inhoud, tussen de kolommen en rondom de
       boekenlegger. Er stonden er zeven door elkaar (3, 8, 12, 14, 16, 24,
       172), en daardoor was het geel boven de kolommen smaller dan eronder. */
    --pa-marge: 12px;

    /* De hoogte van een balk. Staat vast, zodat de boekenlegger in de agenda
       weet waar de kolommen beginnen -- hij ligt los over het raster heen en
       kan de rijhoogte niet uitrekenen. */
    --balk-hoogte: 40px;

    /* De breedte van de hamburger. De donkere balk zet er een leeg blokje van
       dezelfde maat neer, zodat de twee kopteksten onder elkaar staan. */
    --ham-breedte: 42px;

    /* De band tussen een balk en de inhoud eronder: de balk zelf plus de
       marge. Onder de inhoud staat dezelfde band, zodat er boven de
       dagkolommen net zoveel geel zit als eronder -- en net zoveel antraciet
       boven de takenlijst als eronder. */
    --pa-band: calc(var(--balk-hoogte) + var(--pa-marge));

    /* De marge tussen het vlak en de rand van het venster. */
    --blad-marge: 14px;

    /* De kop van een dagkolom en de balk eronder. Ze staan vast omdat de
       agendakolom een balk onderaan heeft (de activiteiten) en de plankolom
       niet: zonder vaste maten houdt de een ruimte over die de ander niet
       heeft, en dan zijn de regels boven en beneden niet even hoog. De
       plankolom houdt dezelfde ruimte onderaan vrij. */
    --dagkop-hoogte: 44px;
    --dagvoet-hoogte: 34px;
}

.app-balk{
    display: flex; align-items: center; justify-content: space-between; gap: 12px;
    /* Het logo staat op dezelfde x als de hamburger in de gele balk eronder:
       de marge van het vlak plus de binnenmarge van de balk. Het stond op een
       vast getal (30) en liep dus scheef zodra een van die twee veranderde. */
    padding: 0 calc(var(--blad-marge) + var(--pa-marge)); height: 44px; flex: 0 0 auto;
}
.app-balk .balk-merk{ position: static; }
.app-balk .zoom-groep{ position: static; margin-left: auto; }

/* ---------- De agendapagina vult het scherm ----------

   Deze pagina brengt zijn eigen vlak mee (@section('eigenvlak') in de view),
   dus er is geen paneel en geen titelbalk van de layout. Wat overblijft is de
   strook met het logo en het account, en daaronder het vlak zelf -- van rand
   tot rand.

   De marge onder .main blijft, zodat het vlak niet tegen de onderkant van het
   venster plakt; links en rechts is hij nul omdat de kleuren tot de rand
   moeten lopen. */
body.op-planagenda .pa{
    margin: 0 var(--blad-marge);
    border-radius: 18px;
    overflow: hidden;
}

/* ---------- Het rondje op de naad ----------

   Eén knop op de grens tussen het gele en het antraciete vlak, in plaats van
   twee losse pijltjes in de twee balken. Die zeiden allebei "klap in" en je
   moest raden wát; hier wijst de bovenste pijl naar het vlak dat wegschuift en
   de onderste naar het andere.

   Hij hangt aan de bovenrand van de donkere balk, dus hij schuift vanzelf mee
   als een van de twee vlakken dichtklapt. */
.pa-balk-donker{ position: relative; }
/* Een staande pil en geen rondje, want er zitten twee knoppen in. In een
   rondje van 34 werd elke knop 34 bij 17, en dan raak je bij het mikken de
   helft die je niet bedoelde -- de naad ging dan de verkeerde kant op. Twee
   keer 30 hoog is de ondergrens die de rest van de app ook aanhoudt. */
.pa-splitter{
    position: absolute; left: 50%; top: 0; transform: translate(-50%, -50%);
    z-index: 3;
    display: flex; flex-direction: column;
    width: 34px; height: 60px; border-radius: 999px; overflow: hidden;
    background: var(--planning-vlak);
    box-shadow: 0 0 0 2px var(--geel-vlak);
}
.pa-splitter button{
    flex: 1 0 30px; display: flex; align-items: center; justify-content: center;
    background: none; border: 0; cursor: pointer; padding: 0;
    color: var(--geel); line-height: 0;
}
/* Een streepje tussen de twee helften: dan zie je dat het er twee zijn. */
.pa-splitter button + button{ box-shadow: inset 0 1px 0 rgba(250, 232, 0, .22); }
.pa-splitter button:hover{ background: rgba(255,255,255,.12); }
.pa-splitter button:focus-visible{ outline: 2px solid var(--geel); outline-offset: -2px; }
.pa-splitter .ms{ font-size: 16px; }

/* De pijlen draaien niet om. Omhoog wijst altijd omhoog: het is een schuif
   met drie standen, geen tuimelschakelaar. Met het gele vlak dicht stonden er
   anders twee pijlen omlaag naast elkaar. */
.pa-splitter button[disabled]{ opacity: .32; cursor: default; }
.pa-splitter button[disabled]:hover{ background: none; }

/* Klapt het gele vlak dicht, dan raakt de ring eromheen het antraciet -- dan
   moet die ring meekleuren, anders staat er een geel randje in het donker. */
.pa.agenda-dicht .pa-splitter{ box-shadow: 0 0 0 2px var(--planning-vlak); }

/* ---------- Mijn account ---------- */

.acct-kop{ display: flex; align-items: center; gap: 14px; margin-bottom: 16px; }
.acct-kop-tekst{ flex: 1; min-width: 0; display: flex; flex-direction: column; }
.acct-kop-tekst b{ font-size: var(--tekst-m); }

/* De keuze tussen de drie miGenda's: drie kaartjes naast elkaar in plaats van
   een keuzelijst. Het is een keuze die je één keer maakt en die het hele
   scherm verandert; dan hoort hij niet weggestopt in een dropdown. */
.variant-keuze{ border: 0; padding: 0; margin: 0 0 16px; }
.variant-keuze legend{
    padding: 0 0 6px; font-size: var(--tekst-s); font-weight: 600; color: var(--text-light);
}
.variant-keuze{ display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; }
.variant-keuze legend{ grid-column: 1 / -1; }

.variant-kaart{
    display: flex; flex-direction: column; gap: 2px;
    padding: 12px 14px; cursor: pointer;
    border: 2px solid var(--border); border-radius: var(--radius-vlak);
    background: var(--bg-card);
}
.variant-kaart:hover{ border-color: var(--text-light); }
/* De gekozen kaart draagt het antraciet en het geel: dezelfde regel als de
   knoppen. Het bolletje zelf staat uit -- de rand en de kleur zeggen het al,
   en een radio in de hoek van een kaart is een tweede klikdoel voor hetzelfde. */
.variant-kaart input{ position: absolute; opacity: 0; width: 0; height: 0; }
.variant-kaart:has(input:checked){ border-color: var(--planning-vlak); background: var(--planning-vlak); }
.variant-kaart:has(input:checked) .variant-naam{ color: var(--geel); }
.variant-kaart:has(input:checked) .variant-voor{ color: rgba(255,255,255,.72); }
.variant-kaart:has(input:focus-visible){ outline: 2px solid var(--planning-vlak); outline-offset: 2px; }

.variant-naam{ font-size: var(--tekst-m); font-weight: 700; }
.variant-voor{ font-size: var(--tekst-xs); color: var(--text-light); }

.vorm-acties{ display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }

/* ==========================================================================
   Het hoofdmenu
   ==========================================================================

   De inhoudsopgave van het boek, uitklappend onder de hamburger -- precies
   zoals het account rechtsboven uitklapt. Hier stond een zijbalk die bij hover
   uitschoof; die kwam uit een andere app en had ook de menu-items van die app.

   Het is een <details>, dus het openklappen kost geen JavaScript en Esc sluit
   het vanzelf. */

.hoofdmenu{ position: relative; flex: 0 0 auto; }

.hoofdmenu > summary{
    display: inline-flex; align-items: center; justify-content: center;
    width: var(--ham-breedte); height: 32px;
    border-radius: var(--radius);
    color: var(--inkt); cursor: pointer;
    /* Het driehoekje van <details> weg: de hamburger is het teken. */
    list-style: none;
}
.hoofdmenu > summary::-webkit-details-marker{ display: none; }
.hoofdmenu > summary:hover,
.hoofdmenu[open] > summary{ background: rgba(31, 36, 48, .12); }
.hoofdmenu > summary:focus-visible{ outline: 2px solid var(--inkt); outline-offset: 2px; }
.hoofdmenu > summary .ms{ font-size: 26px; }

.hoofdmenu-lijst{
    position: absolute; left: 0; top: calc(100% + 6px); z-index: 60;
    min-width: 220px; padding: 6px;
    display: flex; flex-direction: column; gap: 2px;
    background: var(--bg-card); color: var(--text);
    border: 1px solid var(--border);
    border-radius: var(--radius-vlak);
    box-shadow: 0 12px 34px rgba(0, 0, 0, .22);
}
.hoofdmenu-lijst a{
    display: flex; align-items: center; gap: 10px;
    padding: 8px 10px; border-radius: var(--radius);
    font-size: var(--tekst-s); color: var(--text); text-decoration: none;
}
.hoofdmenu-lijst a:hover{ background: color-mix(in srgb, var(--text) 8%, var(--bg-card)); }
/* De bladzijde waar je nu bent draagt de kleuren van de knoppen: antraciet
   met geel. */
.hoofdmenu-lijst a.is-hier{ background: var(--planning-vlak); color: var(--geel); }
.hoofdmenu-lijst .ms{ font-size: 20px; }

/* Op een telefoon is dit het meest aangetikte lijstje van de app; 44 pixels is
   wat een duim raakt zonder te mikken. */
@media (max-width: 900px) {
    .hoofdmenu-lijst a{ min-height: 44px; padding: 10px 12px; }
    .hoofdmenu-lijst{ min-width: 240px; }
}

/* ==========================================================================
   De uitleg
   ========================================================================== */

/* Zes kaarten naast elkaar in plaats van zes regels over de volle breedte. Op
   een breed scherm bleef daar tweederde van leeg. */
.uitleg-stappen{
    list-style: none; margin: 12px 0 0; padding: 0;
    display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 8px;
}
.uitleg-stap{
    display: flex; flex-direction: column; gap: 8px;
    padding: 14px; border-radius: var(--radius-vlak);
    background: var(--agenda-leeg);
}
.uitleg-kop{ display: flex; align-items: center; gap: 10px; }
/* Antraciet rondje, geel cijfer -- dezelfde regel als de knoppen. Het was een
   geel rondje op een grijze kaart, en dan draagt het nummer meer gewicht dan de
   stap waar het bij hoort. */
.uitleg-nr{
    flex: 0 0 auto;
    width: 28px; height: 28px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--planning-vlak); color: var(--geel);
    font-size: var(--tekst-s); font-weight: 700;
}
.uitleg-tekst{ flex: 1; display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.uitleg-tekst b{ font-size: var(--tekst-m); }
.uitleg-stap > p{ margin: 0; font-size: var(--tekst-s); }

/* De chip draagt de kleur van het vlak waar de stap gebeurt: geel voor boven,
   antraciet voor beneden. Zo hoef je de woorden niet te lezen om te weten waar
   je moet zijn. */
.uitleg-waar{
    flex: 0 0 auto;
    padding: 2px 10px; border-radius: 999px;
    font-size: 9.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .4px;
    white-space: nowrap;
}
.uitleg-waar[data-deel="agenda"]{ background: var(--geel); color: var(--inkt); }
.uitleg-waar[data-deel="planning"]{ background: var(--planning-vlak); color: var(--geel); }

.uitleg-teken{
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 26px; height: 22px; padding: 0 6px;
    border-radius: var(--radius);
    background: var(--planning-vlak); color: var(--geel);
    font-size: var(--tekst-xs); font-weight: 700;
}
.uitleg-teken-ms{ font-size: 20px; color: var(--primary); }

.feest-maand{
    margin: 16px 0 6px;
    font-size: var(--tekst-s); font-weight: 700;
    color: var(--text-light); text-transform: uppercase; letter-spacing: .4px;
}
.feest-maand:first-of-type{ margin-top: 4px; }

.feest-lijst{
    display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: 6px;
}
.feest-regel{
    /* In het midden, niet op de basislijn: een naam die over twee regels loopt
       trok de datum anders naar boven. */
    display: flex; align-items: center; gap: 10px;
    min-height: 40px; padding: 6px 12px; border-radius: var(--radius);
    background: var(--agenda-leeg);
}
.feest-datum{ flex: 0 0 108px; display: flex; align-items: baseline; gap: 5px; }
.feest-datum b{ font-size: var(--tekst-s); font-weight: 700; }
.feest-datum i{ font-size: var(--tekst-xs); font-style: normal; color: var(--text-light); }
.feest-naam{ font-size: var(--tekst-s); min-width: 0; }

/* ==========================================================================
   De maandkalender
   ==========================================================================

   Achter de knop in de gele balk. Het weeknummer staat voor elke rij, zoals op
   het rooster; vandaag draagt een gele ring en de week die je bekijkt is
   gemarkeerd. Klik een dag of een weeknummer aan en je springt erheen. */

.maandkiezer{ position: relative; flex: 0 0 auto; }
.maandkiezer > summary{ list-style: none; }
.maandkiezer > summary::-webkit-details-marker{ display: none; }

.maandkiezer-blad{
    position: absolute; right: 0; top: calc(100% + 6px); z-index: 60;
    width: 268px; padding: 10px;
    background: var(--bg-card); color: var(--text);
    border-radius: var(--radius-vlak);
    box-shadow: 0 12px 34px rgba(0, 0, 0, .26);
}

.mk-kop{
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    margin-bottom: 8px;
}
.mk-kop b{ font-size: var(--tekst-m); font-weight: 700; text-transform: capitalize; }

.mk-raster{ display: grid; grid-template-columns: repeat(8, 1fr); gap: 2px; }
.mk-kolomkop{
    display: flex; align-items: center; justify-content: center;
    height: 22px;
    font-size: 9.5px; font-weight: 700; text-transform: uppercase;
    color: var(--text-light);
}

.mk-week,
.mk-dag{
    display: flex; align-items: center; justify-content: center;
    height: 28px; padding: 0;
    background: none; border: 0; border-radius: 50%;
    font-family: inherit; font-size: var(--tekst-xs); color: var(--text);
    cursor: pointer;
}
.mk-dag:hover{ background: var(--agenda-leeg); }
.mk-dag:focus-visible,
.mk-week:focus-visible{ outline: 2px solid var(--inkt); outline-offset: -2px; }

/* Het weeknummer staat er stiller bij dan de dagen: het wijst de rij aan, het
   is niet zelf de kalender. */
.mk-week{
    border-radius: var(--radius);
    font-size: 9.5px; font-weight: 700; color: var(--text-light);
}
.mk-week:hover{ background: var(--agenda-leeg); }

/* Een dag van de vorige of de volgende maand staat er wel, maar stil: zonder
   die dagen zou de eerste rij half leeg zijn en de weeknummers klopten dan
   ook niet meer. */
.mk-dag.is-buiten{ color: #B9BEC9; }

/* De week die je nu in de agenda hebt staan. */
.mk-week.is-venster,
.mk-dag.is-venster{ background: var(--agenda-leeg); }
.mk-week.is-venster{ background: var(--planning-vlak); color: var(--geel); }

/* Vandaag: een gele ring, niet een gele vulling -- dan blijft het cijfer
   leesbaar en blijft de dag ook herkenbaar als hij tegelijk in de week staat
   die je bekijkt. */
.mk-dag.is-vandaag{
    box-shadow: inset 0 0 0 2px var(--geel);
    font-weight: 700;
}

.mk-voet{ display: flex; justify-content: center; margin-top: 8px; }
.mk-voet .btn{ width: auto; padding: 0 14px; }

/* Het schooljaar achter een kopje: hoort erbij, maar mag er niet even hard
   staan als de kop zelf. */
.kop-jaar{ font-weight: 400; color: var(--text-light); }

/* ==========================================================================
   De tracker
   ==========================================================================

   De klok ligt onderaan over het antraciete vlak heen. Hij is er alleen als er
   een sessie loopt, en dan draagt hij precies drie dingen: waar je aan werkt,
   hoeveel tijd je nog hebt van wat je had ingepland, en een balk die volloopt.
   Is de tijd om, dan wordt de klok rood en telt hij door. */

.tracker{
    position: fixed; left: 50%; transform: translateX(-50%);
    bottom: calc(10px + var(--pa-marge)); z-index: 70;
    display: flex; align-items: center; gap: 12px;
    max-width: min(680px, calc(100vw - 2 * var(--blad-marge)));
    padding: 10px 12px;
    background: var(--inkt); color: #FFFFFF;
    border-radius: 999px;
    box-shadow: 0 14px 40px rgba(0, 0, 0, .4);
}

.tracker-bol{
    flex: 0 0 auto;
    width: 30px; height: 30px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    font-size: var(--tekst-xs); font-weight: 700;
}

.tracker-wat{ display: flex; flex-direction: column; min-width: 0; max-width: 220px; }
.tracker-wat b{
    font-size: var(--tekst-s); font-weight: 700;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.tracker-wat i{ font-size: var(--tekst-xs); font-style: normal; color: rgba(255,255,255,.6); }

/* Cijfers van gelijke breedte: anders springt de klok bij elke seconde. */
.tracker-klok{
    flex: 0 0 auto;
    font-size: 22px; font-weight: 700; letter-spacing: -.5px;
    font-variant-numeric: tabular-nums;
    color: var(--geel);
}
.tracker.is-over .tracker-klok{ color: var(--vandaag); }
.tracker.is-pauze .tracker-klok{ color: rgba(255,255,255,.45); }

.tracker-balk{
    flex: 1 1 90px; min-width: 60px; height: 6px;
    background: rgba(255,255,255,.16); border-radius: 999px; overflow: hidden;
}
.tracker-balk i{
    display: block; height: 100%; width: 0;
    background: var(--geel); border-radius: 999px;
    transition: width .3s linear;
}
.tracker.is-over .tracker-balk i{ background: var(--vandaag); }

.tracker-knoppen{ display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }

@media (max-width: 640px) {
    /* Op een telefoon past de naam van de taak er niet meer naast; de klok en
       de knoppen zijn wat je nodig hebt. */
    .tracker-wat{ display: none; }
    .tracker{ gap: 8px; }
}

/* ==========================================================================
   De agenda op een telefoon
   ==========================================================================

   Geen ingekrompen raster maar een andere compositie: één dag in beeld, de
   twee vlakken onder elkaar, en een strip bovenin om van dag te wisselen.
   Boven blijft boven en geel, beneden blijft beneden en antraciet -- dat is
   de methode, en die verandert niet met de schermbreedte.

   De boekenlegger met de zes stappen gaat weg: hij neemt een achtste van de
   breedte in en de stappen staan uitgeschreven onder Uitleg. */

/* De strip staat er altijd in de opbouw, maar alleen een telefoon toont hem. */
.pa-dagstrip{ display: none; }

/* Tussen de telefoon en een breed scherm: de zeven dagen passen nog wel, maar
   alleen zonder de boekenlegger ernaast. Die neemt een achtste van de breedte
   en de zes stappen staan uitgeschreven onder Uitleg; de week zelf is hier het
   belangrijkst. Zonder deze band werden de kolommen honderdtien pixels breed
   en kreeg elke kolom een eigen schuifbalk. */
@media (max-width: 1150px) {
    .pa-stappen{ display: none; }
    .pa-kolommen{ padding-right: var(--pa-marge); }

    /* De weeknavigatie hoort niet meer even breed te zijn als een kolom die er
       niet is; zo breed als zijn eigen inhoud volstaat. */
    .pa-weeknav{ width: auto; }
    .wk-nummer{ flex: 0 0 auto; }

    .pa-kolommen > .pa-dag,
.pa-kolommen > .pa-plandag{ min-width: 116px; }
}

/* De grens ligt op 900 en niet op 600: zeven kolommen van 132 plus hun marges
   en de boekenlegger vragen ruim 1150 pixels. Daaronder gaat het vlak schuiven,
   en vanaf 900 wordt dat schuiven zo veel werk dat een dag per scherm beter
   leest dan zeven half zichtbare stroken. */
@media (max-width: 900px) {

    /* Het vlak vult het scherm van rand tot rand: op een telefoon is een marge
       eromheen verspilde breedte, en een afgeronde hoek op een scherm dat zelf
       al afgerond is voegt niets toe. */
    body.op-planagenda .main{ padding: 0; }
    body.op-planagenda .pa{ margin: 0; border-radius: 0; }

    /* Van raster naar kolom: de vier rijen komen gewoon onder elkaar en de
       bladzijde schuift als geheel. */
    .pa{
        display: flex; flex-direction: column;
        overflow-y: auto; overflow-x: hidden;
    }

    .pa-stappen,
.pa-splitter{ display: none; }

    .pa-dagstrip{
        display: flex; gap: 4px;
        padding: 8px var(--pa-marge);
        background: var(--geel-vlak);
        flex: 0 0 auto;
    }
    .pa-dagknop{
        flex: 1 1 0; min-width: 0;
        display: flex; flex-direction: column; align-items: center; gap: 1px;
        /* 44 hoog: dit is het enige dat je in de les met een duim aantikt. */
        min-height: 44px; padding: 4px 0;
        background: none; border: 0; border-radius: var(--radius);
        font-family: inherit; color: var(--inkt); cursor: pointer;
    }
    .pa-dagknop b{ font-size: 9.5px; font-weight: 700; letter-spacing: .4px; opacity: .65; }
    .pa-dagknop i{ font-size: var(--tekst-s); font-style: normal; font-weight: 700; }
    /* Vandaag draagt de rode stip van de kolomkop; de gekozen dag draagt het
       antraciet van de knoppen. Ze kunnen tegelijk waar zijn. */
    .pa-dagknop.is-vandaag i{ color: var(--vandaag); }
    .pa-dagknop.is-gekozen{ background: var(--planning-vlak); }
    .pa-dagknop.is-gekozen b,
.pa-dagknop.is-gekozen i{ color: var(--geel); opacity: 1; }

    /* De twee vlakken groeien met hun inhoud in plaats van de hoogte te delen. */
    .pa-agenda,
.pa-planning{ flex: 0 0 auto; }

    .pa-kolommen{
        display: block; overflow: visible;
        padding: var(--pa-marge);
    }
    /* Onderaan lucht voor de klok van de tracker: die ligt over het vlak heen
       en zou anders de laatste taak afdekken. */
    .pa-planning .pa-kolommen{ padding-bottom: 84px; }

    /* Eén dag in beeld. */
    .pa-dag,
.pa-plandag{ display: none; }
    .pa-dag.is-actief{ display: flex; }
    .pa-plandag.is-actief{ display: flex; }

    .pa-kolommen > .pa-dag,
.pa-kolommen > .pa-plandag{ min-width: 0; }

    /* De kolom vult de breedte en groeit met wat erin staat; de vaste maten
       die boven en beneden gelijk moesten houden gelden hier niet, want ze
       staan niet meer naast elkaar. */
    .pa-dag,
.pa-plandag{ width: 100%; min-height: 0; }
    .pa-plandag{ padding-bottom: 8px; }

    .pa-regels,
.pa-planregels{ overflow: visible; flex: 0 0 auto; }

    /* Raakvlakken van 44 pixels: dit is het scherm waarop je met een duim in
       een volle klas een regel aantikt. */
    .pa-regel,
.pa-planregel{ flex: 0 0 auto; min-height: 44px; }
    .pa-regel-knop{ min-height: 44px; }
    .pa-regel-knop,
.pa-planregel-knop{ font-size: var(--tekst-s); }
    .pa-bol{ width: 26px; height: 26px; }

    .pa-dag-voet{ flex: 0 0 auto; min-height: 44px; }
    /* Ook de flex-basis mee omhoog: die staat op 20px en wint van `width`,
       dus zonder deze regel wordt de knop 20 breed en 32 hoog -- een ovaal. */
    .pa-notitie-plus{ width: 32px; height: 32px; flex: 0 0 32px; }
    .pa-notitie-plus .ms{ font-size: 20px; }

    /* De balken: de kop mag krimpen, want er staat geen kolom meer onder om
       mee uit te lijnen. */
    .pa-balk-donker::before{ display: none; }

    /* De weeknavigatie is zo breed als zijn inhoud; het weeknummer valt weg,
       want de dagstrip eronder zegt al welke week je bekijkt. */
    .pa-weeknav{ width: auto; }
    .wk-nummer{ display: none; }
    .maandkiezer-blad{ right: 0; width: min(268px, calc(100vw - 24px)); }
}

/* ---------- Het menu naast het logo ----------

   De hamburger stond in de titelbalk van het paneel én in de gele balk van de
   agenda: twee plekken, dus per scherm een andere x. Nu staat hij in de strook
   boven, links van het merk, op elke pagina hetzelfde. */
.balk-links{ display: flex; align-items: center; gap: 10px; min-width: 0; }

/* ---------- De twee vlaknamen als schakelaar ----------

   Ze staan waar de hamburger stond en doen wat de pijltjes op de naad ook doen:
   het andere vlak wegschuiven. De naam van iets aanwijzen om ernaartoe te gaan
   is wat een mens sowieso probeert.

   Het vlak dat weg is, herken je aan de knop die dof wordt -- niet aan een
   tekst erbij, want daar is in een balk geen ruimte voor en het is af te lezen
   aan het scherm zelf. */
/* De naam van een vlak staat ín dat vlak: "Agenda" in de gele balk, "Taken" in
   de antraciete. Ze stonden allebei bovenin naast elkaar, en dan leest het als
   twee tabbladen van hetzelfde vlak in plaats van als twee vlakken onder
   elkaar.

   Ze zijn wel allebei een knop gebleven: op de naam van een vlak tikken schuift
   het andere weg. */
/* De kop van een balk: dezelfde maat en dezelfde inspringing als voorheen, en
   in allebei de balken dezelfde, zodat "Agenda" en "Taken" onder elkaar
   staan. */
.pa-balk h1,
.pa-balk h2{ display: flex; min-width: var(--kop-breedte); }

.pa-vlaknaam{
    display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 11px;
    background: transparent; border: 0; border-radius: 999px;
    font: inherit; font-size: var(--tekst-m); font-weight: 700;
    color: inherit; cursor: pointer;
}
.pa-vlaknaam .ms{ font-size: 20px; }
.pa-vlaknaam:hover{ background: rgba(0, 0, 0, .08); }
.pa-vlaknaam[aria-expanded="false"]{ opacity: .45; font-weight: 500; }
.pa-vlaknaam:focus-visible{ outline: 2px solid currentColor; outline-offset: 2px; }


/* De kleur en de afkorting van een nieuw vak staan naast elkaar in een cel:
   samen zijn ze het merkteken van dat vak in de agenda, en dan hoort de
   kleurkiezer ook naast de letters te staan en niet erboven.

   Deze opmaak ontbrak; het markup stond er wel. In een tabelcel zonder
   uitlijning zakte de kleurkiezer onder de tekst weg. */
.vak-nieuw-kleur{ display: inline-flex; align-items: center; gap: 6px; }
.vak-nieuw-kleur input[type=color]{ width: 28px; height: 28px; padding: 0; border: 0; background: none; cursor: pointer; }
.vak-nieuw-kleur input[type=text]{ width: 5ch; text-align: center; text-transform: uppercase; }

/* Een nieuw vak: de kleurkiezer en de afkorting horen bij elkaar -- de kleur
   is de ondergrond van het bolletje waar die afkorting in komt te staan, dus
   zie je meteen wat je straks in je week terugziet. */
.vak-nieuw-kleur{ display: inline-flex; align-items: center; gap: 6px; }
.vak-nieuw-kleur input[type="color"]{
    width: 30px; height: 30px; padding: 0; flex: 0 0 auto;
    border: 0; border-radius: 50%; background: none; cursor: pointer;
}
.vak-nieuw-kleur input[type="text"]{ width: 62px; text-align: center; }

/* ==========================================================================
   Notities en chat
   ==========================================================================

   Allebei hetzelfde tweeluik: links een smalle kolom met waar je uit kiest,
   rechts wat je hebt gekozen. Dat is dezelfde beweging als in de agenda --
   eerst waar, dan wat -- en het scheelt een tweede opbouw om te leren. */

.nt-tweeluik{
    display: grid; grid-template-columns: 280px 1fr; gap: var(--pa-marge);
    align-items: start;
}
.nt-tweeluik > .card{ margin-bottom: 0; }
.nt-blokken{ position: sticky; top: 0; }

.nt-bloklijst{ display: flex; flex-direction: column; gap: 4px; }
.nt-blok{
    display: flex; align-items: center; gap: 9px;
    min-height: 40px; padding: 6px 10px; border-radius: var(--radius);
    color: var(--text); text-decoration: none;
}
.nt-blok:hover{ background: var(--agenda-leeg); }
/* Het geopende blok draagt het antraciet met geel: dezelfde regel als de
   knoppen en als de bladzijde waar je nu op staat in het menu. */
.nt-blok.is-open{ background: var(--planning-vlak); color: var(--geel); }
.nt-blok-stip{ flex: 0 0 auto; width: 12px; height: 12px; border-radius: 50%; }
.nt-blok-naam{ flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--tekst-s); }
.nt-blok-aantal{ flex: 0 0 auto; font-size: var(--tekst-xs); opacity: .65; }

.nt-nieuw-blok{ display: flex; gap: 6px; margin-top: 10px; }
.nt-nieuw-blok select{ flex: 0 0 96px; min-width: 0; }
.nt-nieuw-blok input{ flex: 1; min-width: 0; }

.nt-lijst{ display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 8px; }
.nt-kaart{
    display: flex; flex-direction: column; gap: 4px; text-align: left;
    padding: 12px 14px; border: 0; border-radius: var(--radius-vlak);
    background: var(--agenda-leeg); color: var(--inkt);
    font-family: inherit; cursor: pointer;
}
.nt-kaart:hover{ background: #DFE0E5; }
.nt-kaart b{ font-size: var(--tekst-s); }
.nt-kaart i{ font-size: var(--tekst-xs); font-style: normal; color: var(--inkt-zacht); }
.nt-tekst{ font-size: var(--tekst-xs); color: var(--inkt-zacht); }
/* De koppeling met de agenda: dit is waar dit onderdeel om draait, dus draagt
   hij de merkkleur. */
.nt-koppel{
    display: inline-flex; align-items: center; gap: 4px;
    align-self: flex-start; max-width: 100%;
    padding: 2px 8px; border-radius: 999px;
    background: var(--geel-vlak); color: var(--inkt);
    font-size: 9.5px; font-weight: 600;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nt-koppel .ms{ font-size: 13px; }

/* ---------- Chat ---------- */

.ch-av{
    flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%;
    display: inline-flex; align-items: center; justify-content: center;
    background: var(--planning-vlak); color: var(--geel);
    font-size: 9.5px; font-weight: 700;
}
.nt-blok.is-open .ch-av{ background: var(--geel); color: var(--inkt); }

.ch-venster{ display: flex; flex-direction: column; min-height: 420px; }

/* Iemand erbij vragen: een knop in de kop met de namen eronder. Een <details>
   en geen venster -- je kiest een naam en dat is de hele handeling. */
.ch-uitnodigen{ position: relative; }
.ch-uitnodigen > summary{ list-style: none; cursor: pointer; }
.ch-uitnodigen > summary::-webkit-details-marker{ display: none; }
.ch-uitnodigen-blad{
    position: absolute; right: 0; top: calc(100% + 6px); z-index: 60;
    min-width: 240px; max-height: 300px; overflow-y: auto; padding: 6px;
    display: flex; flex-direction: column; gap: 4px;
    background: var(--bg-card); color: var(--text);
    border: 1px solid var(--border); border-radius: var(--radius-vlak);
    box-shadow: 0 12px 34px rgba(0, 0, 0, .22);
}
.ch-uitnodigen-rij{ display: flex; align-items: center; gap: 6px; }
.ch-uitnodigen-rij input{ flex: 1; min-width: 0; }

.ch-contact{
    display: flex; align-items: center; gap: 9px;
    padding: 6px 8px; border: 0; border-radius: var(--radius);
    background: none; color: var(--text);
    font-family: inherit; font-size: var(--tekst-s); text-align: left;
    cursor: pointer;
}
.ch-contact:hover{ background: var(--agenda-leeg); }

/* Een uitnodiging die op je wacht. Hij staat bovenaan de gesprekkenlijst en
   ziet er anders uit dan een gesprek: dit is iets wat je moet beantwoorden,
   geen plek waar je heen kunt. */
.ch-uitnodiging{
    display: flex; align-items: center; gap: 9px;
    padding: 8px 10px; margin-bottom: 6px;
    border: 1px dashed var(--border); border-radius: var(--radius-vlak);
    background: var(--bg);
}
.ch-uitnodiging-naam{ flex: 1; min-width: 0; font-size: var(--tekst-s); font-weight: 600; }

/* De adressen die je hebt uitgenodigd en die nog niets hebben gezegd. Klein en
   gedempt: het is een geheugensteun, met alleen de knop om hem in te trekken. */
.ch-verstuurd{
    display: flex; align-items: center; gap: 6px;
    padding: 2px 4px 2px 8px;
}
.ch-verstuurd-adres{
    flex: 1; min-width: 0;
    font-size: var(--tekst-xs); color: var(--text-light);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ch-stroom{
    flex: 1; min-height: 0; overflow-y: auto;
    display: flex; flex-direction: column; gap: 6px;
    padding: 4px 2px;
}
.ch-bericht{
    align-self: flex-start; max-width: 78%;
    display: flex; align-items: baseline; gap: 8px;
    padding: 7px 12px; border-radius: 14px 14px 14px 4px;
    background: var(--agenda-leeg); color: var(--inkt);
}
/* Wat jij zei staat rechts en draagt het antraciet: zo hoef je geen naam te
   lezen om te weten wie wat zei. */
.ch-bericht.is-van-mij{
    align-self: flex-end;
    border-radius: 14px 14px 4px 14px;
    background: var(--planning-vlak); color: #FFFFFF;
}
.ch-tekst{ font-size: var(--tekst-s); white-space: pre-wrap; word-break: break-word; }
.ch-tijd{ flex: 0 0 auto; font-size: 9.5px; opacity: .55; }

.ch-vorm{ display: flex; gap: 8px; margin-top: 10px; }
.ch-vorm input{ flex: 1; min-width: 0; }

@media (max-width: 900px) {
    /* Onder elkaar: de keuzelijst boven, waar je gekozen hebt eronder. */
    .nt-tweeluik{ grid-template-columns: 1fr; }
    .nt-blokken{ position: static; }
    .nt-bloklijst{ flex-direction: row; overflow-x: auto; }
    .nt-blok{ flex: 0 0 auto; }
    .ch-bericht{ max-width: 88%; }
}

/* ==========================================================================
   Losse invoervelden
   ==========================================================================

   De app stijlt velden alleen binnen een .form-group. Buiten zo'n groep -- de
   regel onderaan een tabel, het berichtveld van de chat, de naam van een nieuw
   blok -- bleef de kale rechthoek van de browser staan, en dan lijkt het alsof
   er twee apps door elkaar lopen.

   Deze regel geeft die velden dezelfde vorm. Ze staan bewust apart en niet bij
   .form-group: daar staat een label boven en hier niet, en de hoogte volgt de
   knop ernaast. */

.veldrij input[type="text"],
.veldrij input[type="time"],
.veldrij input[type="number"],
.veldrij select,
.nt-nieuw-blok input,
.nt-nieuw-blok select,
.ch-vorm input{
    padding: 6px 12px; min-height: 32px;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--bg-card); color: var(--text);
    font-family: inherit; font-size: var(--tekst-s);
    transition: border-color .15s;
}
.veldrij input:focus,
.veldrij select:focus,
.nt-nieuw-blok input:focus,
.nt-nieuw-blok select:focus,
.ch-vorm input:focus{
    outline: none; border-color: var(--planning-vlak);
    box-shadow: 0 0 0 3px rgba(38, 42, 56, .12);
}

/* De kleurkiezer als rondje: het is de kleur van het bolletje dat straks in de
   agenda staat, dus heeft hij ook die vorm. Zonder appearance:none tekent de
   browser er zijn eigen vierkante knop overheen. */
.vak-nieuw-kleur input[type="color"]{ -webkit-appearance: none; appearance: none; }
.vak-nieuw-kleur input[type="color"]::-webkit-color-swatch-wrapper{ padding: 0; }
.vak-nieuw-kleur input[type="color"]::-webkit-color-swatch{ border: 0; border-radius: 50%; }
.vak-nieuw-kleur input[type="color"]::-moz-color-swatch{ border: 0; border-radius: 50%; }

/* De regel waarmee je er een bij zet, staat onderaan de tabel en hoort daar
   ook als een eigen regel uit te zien. */
.veldrij > td{ background: color-mix(in srgb, var(--planning-vlak) 6%, transparent); }
.veldrij > td:first-child{ border-radius: var(--radius) 0 0 var(--radius); }
.veldrij > td:last-child{ border-radius: 0 var(--radius) var(--radius) 0; }

/* De twee knoppen achter een regel: opslaan en verwijderen, naast elkaar. */
.rij-acties{ display: inline-flex; align-items: center; gap: 6px; }

/* De lesduur staat in de kop van de kaart, naast de titel. */
.lesduur{ display: flex; align-items: center; gap: 8px; }
.lesduur label{ font-size: var(--tekst-s); color: var(--text-light); }
.lesduur input{
    width: 68px; text-align: center;
    padding: 6px 8px; min-height: 32px;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--bg-card); color: var(--text);
    font-family: inherit; font-size: var(--tekst-s);
}

/* De regiokeuze op de feestdagen: drie schakelaars naast elkaar. De aanstaande
   draagt het antraciet met geel, zoals elke keuze in deze app. */
.regiokeuze{ display: inline-flex; gap: 4px; padding: 3px; margin-bottom: 12px;
    background: var(--agenda-leeg); border-radius: 999px; }
.regioknop{
    padding: 5px 16px; border-radius: 999px;
    font-size: var(--tekst-s); color: var(--text); text-decoration: none;
}
.regioknop:hover{ background: rgba(31, 36, 48, .08); }
.regioknop.is-aan{ background: var(--planning-vlak); color: var(--geel); font-weight: 600; }

/* Op de bladzijden met een tweeluik vult het vlak de hoogte. De kaarten stonden
   als twee kleine blokjes in een groot leeg antraciet vlak, en dan lijkt het
   alsof de bladzijde niet af is. */
body.op-tweeluik .content{ display: flex; flex-direction: column; }
body.op-tweeluik .nt-tweeluik{ flex: 1; min-height: 0; align-items: stretch; }
body.op-tweeluik .nt-tweeluik > .card{ display: flex; flex-direction: column; min-height: 0; }
body.op-tweeluik .nt-bloklijst,
body.op-tweeluik .nt-lijst{ overflow-y: auto; }
body.op-tweeluik .nt-blokken{ position: static; }

/* De kop van een notitiekaart: de titel links, de datum rechts. */
.nt-kop{ display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.nt-kop b{ font-size: var(--tekst-s); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nt-kop i{ flex: 0 0 auto; font-size: var(--tekst-xs); font-style: normal; color: var(--inkt-zacht); }
.nt-les{ font-size: var(--tekst-xs); font-weight: 600; color: var(--inkt); }

/* Met wie een aantekening gedeeld is. */
.nt-gedeeld{
    display: inline-flex; align-items: center; gap: 4px;
    font-size: 9.5px; color: var(--inkt-zacht);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.nt-gedeeld .ms{ font-size: 13px; }

/* De deelregel onder het notitievenster. */
.nt-delen{
    display: flex; align-items: center; gap: 8px;
    margin-top: 14px; padding-top: 14px;
    border-top: 1px solid var(--border);
}
.nt-delen select{
    flex: 1; min-width: 0;
    padding: 6px 12px; min-height: 32px;
    border: 1px solid var(--border); border-radius: var(--radius);
    background: var(--bg-card); color: var(--text);
    font-family: inherit; font-size: var(--tekst-s);
}

/* ==========================================================================
   Het weekrooster
   ==========================================================================

   Het derde blok op de bladzijde Lessen, en het blok waar de agenda op draait:
   elk lesuur dat hier staat wordt een regel in de gele helft, ook zonder
   huiswerk. Rijen zijn de lesuren, kolommen de dagen.

   De maat is uitgerekend voor een telefoon van 375 pixels, want daar is het
   krap en nergens anders:

       375  het scherm
       -28  de marge van het vlak (2 x --blad-marge)
       -24  de binnenmarge van .content (2 x --pa-marge)
       -30  de kaart: rand plus binnenmarge (2 x 1 + 2 x 14)
       ----
       293  voor de tabel
       -28  de kolom met het lesuur
       ----
       265  voor vijf dagen, dus 53 per dag

   Van die 53 blijft er na de celmarge 49 over. Een afkorting is maximaal vier
   tekens en meet op --tekst-xs ongeveer 25 pixels, dus die past met ruimte
   over; het lokaal eronder krijgt wat er is en kapt af met een beletselteken.
   Vandaar table-layout: fixed -- zonder dat verdeelt de browser de breedte naar
   de inhoud, en dan duwt één lang lokaal de hele week scheef.

   De tabel staat in .table-wrap, dus wie zijn tekst groter zet schuift binnen
   het raster en niet met de hele bladzijde mee. */

.rooster-tabel{ table-layout: fixed; }

/* De algemene tabelmarge is 12 links en rechts; zes kolommen maakt dat 144
   pixels marge op 293 beschikbare. Hier telt elke pixel voor de inhoud. */
.rooster-tabel th,
.rooster-tabel td{ padding: 2px; vertical-align: top; }

.rooster-tabel thead th{ text-align: center; padding-bottom: 6px; }
.rooster-tabel thead th:first-child{ width: 28px; }

/* De dagnaam voluit zolang hij past, daaronder de afkorting. Allebei staan ze
   in de HTML: welke je ziet is opmaak, en dan hoeft er geen tweede opbouw voor
   een smal scherm te bestaan. */
.rooster-dag-kort{ display: none; }

/* Het lesuur voor de rij. Geen hoofdletters en niet lichtgrijs zoals een
   gewone kolomkop: dit is een getal dat je afleest, geen etiket. */
.rooster-uur{
    text-align: center; text-transform: none; letter-spacing: 0;
    font-size: var(--tekst-s); color: var(--inkt-zacht);
}

/* De cel: de lessen onder elkaar, en daaronder het vlak waarmee je er een bij
   zet. In een lege cel is dat vlak de hele cel. */
.rooster-cel{
    display: flex; flex-direction: column; gap: 2px;
    min-height: 48px; height: 100%;
}

.rooster-les{
    display: flex; flex-direction: column; align-items: flex-start; gap: 1px;
    width: 100%; min-height: 34px; padding: 3px 5px;
    border: 0; border-radius: var(--radius);
    background: var(--agenda-leeg); color: var(--inkt);
    font-family: inherit; text-align: left; cursor: pointer;
    overflow: hidden;
}
.rooster-les:hover{ filter: brightness(.94); }
.rooster-les:focus-visible{ outline: 2px solid var(--inkt); outline-offset: 1px; }

/* Drie regels die elk op één regel moeten blijven: de afkorting, het lokaal en
   -- alleen bij een A/B-week -- de herhaling. Zonder de beletseltekens duwt een
   lokaal als "B1.24" de kolom uit elkaar. */
.rooster-les b,
.rooster-les i,
.rooster-les em{
    display: block; max-width: 100%;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-style: normal; line-height: 1.15;
}
.rooster-les b{ font-size: var(--tekst-xs); font-weight: 700; }
.rooster-les i,
.rooster-les em{ font-size: 9.5px; opacity: .8; }

/* Het vlak waarmee je er een les bij zet. Het plusje staat er flauwtjes bij en
   licht op zodra je erheen gaat: zestig volle plusjes in een leeg rooster
   zouden harder roepen dan de lessen zelf. */
.rooster-plus{
    display: flex; align-items: center; justify-content: center;
    flex: 1 1 auto; width: 100%; min-height: 16px;
    border: 1px dashed transparent; border-radius: var(--radius);
    background: none; color: var(--inkt-zacht);
    font-family: inherit; cursor: pointer;
}
.rooster-plus::before{ content: '+'; font-size: var(--tekst-s); opacity: .3; }
.rooster-plus:hover{ border-color: var(--border); background: rgba(31, 36, 48, .04); }
.rooster-plus:hover::before{ opacity: 1; }
.rooster-plus:focus-visible{ outline: 2px solid var(--inkt); outline-offset: 1px; }
.rooster-plus:focus-visible::before{ opacity: 1; }

@media (max-width: 760px) {
    /* "Maandag" past niet meer naast vier andere dagen; "ma" wel. */
    .rooster-dag-lang{ display: none; }
    .rooster-dag-kort{ display: inline; }
}

@media (max-width: 640px) {
    /* Duimformaat, ook hier. Een cel met een les wordt daarmee twee keer 44
       hoog -- de les en het vlak eronder -- en dat is de prijs voor een tweede
       les op hetzelfde uur die je met een duim kunt raken. */
    .rooster-les,
    .rooster-plus{ min-height: 44px; }
    .rooster-cel{ min-height: 44px; }
}

/* ==========================================================================
   De velden in een lijstrij op een telefoon

   Deze regels staan met opzet HELEMAAL ONDERAAN. Ze hebben dezelfde
   specificiteit als de basisregels van .veldrij verderop in dit bestand, en
   bij gelijke specificiteit wint de laatste regel. Stonden ze bij de andere
   mobiele regels (rond de 640px-blokken), dan deden ze niets -- en dat is
   precies wat er gebeurde: de velden op Lessen, Notities en in de chat bleven
   12,5 pixels, waarna een iPhone bij elke tik inzoomt en niet meer uitzoomt.
   ========================================================================== */

@media (max-width: 900px) {
    .veldrij input[type="text"],
    .veldrij input[type="time"],
    .veldrij input[type="number"],
    .veldrij input[type="date"],
    .veldrij select,
    .nt-nieuw-blok input,
    .nt-nieuw-blok select,
    .ch-vorm input,
    .lesduur input{ font-size: 16px; min-height: 44px; }
}

/* Op een telefoon is de bovenbalk 44 pixels en moet het hele woordmerk daar
   binnen passen -- inclusief de twee blokjes, die het merk hoger maken dan
   losse letters. */
@media (max-width: 640px) {
    .app-balk .bp-logo{ font-size: calc(var(--logo-maat, 37px) * .72); }
}
