/* ============================================================
   Huisstijl Villa Oldenhoff (villaoldenhoff.nl)
   Afgelezen van de site: petrol #004B65 als inkt én primair vlak,
   duifblauw #91BFCD als accent, koel bijna-wit #F6FAFD als papier,
   witte kaarten, rechte hoeken en licht-gezette, ruim gespatieerde
   koppen. De site gebruikt nergens een schreefletter.

   Twee bewuste afwijkingen van de site, omdat dit een werkscherm is
   en geen etalage:
   1. Primaire knop = petrol met wit, niet duifblauw met wit. Dat
      laatste haalt ~1.9:1 contrast; onleesbaar voor een balie die er
      de hele dag op kijkt. Duifblauw is hier accent/actief-vlak.
   2. Statuskleuren (aankomst/vertrek/alarm) blijven semantisch
      onderscheidend. Alles petrol maken leest mooi en werkt niet.
   ============================================================ */
:root {
  --bg: #f6fafd;
  --surface: #ffffff;
  --surface-2: #eaf1f6;
  --ink: #004b65;
  --ink-soft: #5e7f8d;
  --line: #d6e3ea;
  --accent: #004b65;
  --accent-ink: #ffffff;
  --accent-soft: #91bfcd;
  --gold: #a17a4b;
  --arrival: #1f7a6a;
  /* Eigen token voor "bron is vers", bewust NIET --accent hergebruikt. Het lampje stond
     op --accent en verkleurde daardoor stilzwijgend mee met de huisstijl-omzetting
     (de64be1): van groen #3f6b52 naar petrol. De regel veranderde niet, de betekenis
     wel — een groene stip zegt "in orde", een petrol stip zegt niets, want dat is de
     kleur van álles in deze app. Zie ook de kop van dit bestand: statuskleuren blijven
     semantisch. Zelfde tint als --arrival vandaag; los token omdat het losse begrippen
     zijn en een volgende herstijling ze niet weer aan elkaar mag knopen. */
  --ok: #1f7a6a;
  --inhouse: #7a93a0;
  --departure: #c1743a;
  --danger: #b03a45;
  /* Rechte hoek is het sterkste merksignaal van de site (radius 0 op
     alles). Containers volgen dat; statusbadges blijven pil-vormig —
     die lezen als etiket, niet als vlak. */
  --radius: 0px;
  --shadow: 0 1px 2px rgba(0, 43, 60, 0.05), 0 8px 24px rgba(0, 43, 60, 0.06);
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #00232f;
    --surface: #013647;
    --surface-2: #054b60;
    --ink: #e8f1f5;
    --ink-soft: #9dbcc9;
    --line: #0b4e63;
    /* In het donker draait het duo om: duifblauw is dan het leesbare
       accent op petrol, precies andersom dan bij daglicht. */
    --accent: #91bfcd;
    --accent-ink: #00293a;
    --accent-soft: #91bfcd;
    --gold: #c9a26a;
    --arrival: #4fae99;
    --ok: #4fae99;
    --inhouse: #8ba7b4;
    --departure: #dd9a63;
    --danger: #e07681;
    --shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 10px 30px rgba(0, 0, 0, 0.35);
  }
}

* { box-sizing: border-box; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  -webkit-font-smoothing: antialiased;
  /* De standaard-tikflits is een grijsblauw blok dat niets met de huisstijl te maken
     heeft. Wél getint laten en niet wéghalen: op een touchscreen ís die flits de enige
     bevestiging dat je raak tikte, en een app die daar niet op reageert voelt stuk. */
  -webkit-tap-highlight-color: color-mix(in srgb, var(--accent) 14%, transparent);
  /* Geen pull-to-refresh in standalone-modus: dat herlaadt de hele app terwijl je alleen
     naar boven wilde vegen in een lijst met aankomsten. */
  overscroll-behavior-y: contain;
}
.hidden { display: none !important; }

/* Zichtbaar voor een schermlezer, weg voor het oog.
   Nodig sinds de profielschakelaar de <h1> van Mijn dag en Instellingen visueel vervangt:
   de tab zégt al waar je bent, maar zonder kop begint zo'n scherm in de documentstructuur
   bij een h2 en weet een schermlezer niet welke pagina dit is. Geen display:none — dat
   haalt 'm ook uit de voorleesvolgorde, en dan lost het niets op. */
.alleen-voorlezer {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; margin: -1px; padding: 0; border: 0;
}
button { font: inherit; cursor: pointer; }
input { font: inherit; }

/* --- Brand ---
   De site zet koppen in scala-sans, gewicht 400, met 3-4px spatiëring
   op 30-40px (≈0.1em). Let op de truc daar: de CSS zet
   `text-transform: lowercase`, maar scala-sans is een kapitalenvariant
   die die kleine letters als hoofdletters tekent — het netto beeld is
   dus égale kapitalen, niet onderkast. Met een systeemletter reproduceer
   je dat met `uppercase`; met `lowercase` zou hier letterlijk
   "oldenhoff" komen te staan.

   Bewust geen webfont: dit hangt aan de balie en op een muur-TV en moet
   niet op een externe request wachten. Het karakter zit in de spatiëring
   en het lichte gewicht, niet in de letter zelf. */
.brand-mark {
  font-family: inherit;
  font-weight: 400;
  font-size: 1em;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}

/* --- Login --- */
.login {
  /* 100dvh en niet 100vh: op mobiel rekent 100vh de weggeschoven URL-balk mee, dus de
     kaart viel deels buiten beeld en de pagina scrollde zonder dat er iets te scrollen
     was. De vh-regel blijft als terugval voor browsers zonder dvh. */
  min-height: 100vh;
  min-height: 100dvh;
  display: grid;
  place-items: center;
  padding: calc(24px + env(safe-area-inset-top, 0px)) calc(24px + env(safe-area-inset-right, 0px))
           calc(24px + env(safe-area-inset-bottom, 0px)) calc(24px + env(safe-area-inset-left, 0px));
}
.login-card {
  width: 100%;
  max-width: 360px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 32px 28px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.login-card .brand { text-align: center; margin-bottom: 4px; }
.login-card .brand-mark { display: block; font-size: 30px; color: var(--accent); }
.login-card .brand-sub { display: block; font-size: 12px; letter-spacing: 0.22em; text-transform: uppercase; color: var(--ink-soft); margin-top: 4px; }
.login-hint { text-align: center; color: var(--ink-soft); font-size: 14px; margin: 0 0 4px; }
#login-form input,
#login-form button {
  height: 46px;
  border-radius: 0;
  border: 1px solid var(--line);
  padding: 0 14px;
}
#login-form input { background: var(--surface-2); color: var(--ink); }
#login-form input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
#login-form button {
  border: none;
  background: var(--accent);
  color: var(--accent-ink);
  font-weight: 600;
}
#login-form button:hover { filter: brightness(1.05); }
/* De bezig-staat moet je op een zonnig terras nog kunnen zien: alleen de cursor
   veranderen is geen signaal op een tablet, want daar is geen cursor. Vandaar het
   dimmen én het gewisselde label in app.js. */
#login-form button:disabled {
  opacity: 0.6;
  cursor: progress;
  filter: none;
}

/* --- Topbar --- */
.topbar {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 20px;
  /* De insets horen op de PADDING en niet op een marge: de balk moet zelf tot in de hoek
     doorlopen (hij is de achtergrond onder de statusbalk), alleen z'n inhoud schuift naar
     binnen. Rechts/links tellen mee voor landschapsstand, waar de notch aan de zijkant zit. */
  padding: calc(12px + env(safe-area-inset-top, 0px)) calc(20px + env(safe-area-inset-right, 0px))
           12px calc(20px + env(safe-area-inset-left, 0px));
  background: var(--surface);
  border-bottom: 1px solid var(--line);
}
.topbar-brand { display: flex; flex-direction: column; line-height: 1.1; }
.topbar-brand .brand-mark { font-size: 20px; color: var(--accent); }
.property { font-size: 11px; color: var(--ink-soft); letter-spacing: 0.04em; }
.tabs {
  display: flex; gap: 2px; margin-left: 8px; flex: 1;
  overflow-x: auto;
  scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch;
  /* Een scrollbalk onder de tabs is op een desktop lelijk en op iOS toch onzichtbaar;
     de rand-vervaging hieronder doet het werk. */
  scrollbar-width: none;
}
.tabs::-webkit-scrollbar { display: none; }

/* Zes tabs passen op geen enkele telefoon: "VANDAAG" alleen is al ~94px, samen ruim
   480px tegen ~335px beschikbaar. Ze scrollen dus — maar zonder aanwijzing dát er meer
   is, bestaan Agenda en Admin simpelweg niet voor wie het niet weet. Vandaar een
   vervaging aan de kant waar nog iets zit. De klassen komen uit syncTabFade() in app.js
   (op scroll + resize), zodat de vervaging weg is zodra je het einde bereikt en de
   laatste tab niet permanent half-doorzichtig staat. */
.tabs {
  --fade-r: linear-gradient(to right, #000 calc(100% - 26px), transparent 100%);
  --fade-l: linear-gradient(to right, transparent 0, #000 26px);
  --fade-lr: linear-gradient(to right, transparent 0, #000 26px, #000 calc(100% - 26px), transparent 100%);
}
.tabs.can-right:not(.can-left) { -webkit-mask-image: var(--fade-r); mask-image: var(--fade-r); }
.tabs.can-left:not(.can-right) { -webkit-mask-image: var(--fade-l); mask-image: var(--fade-l); }
.tabs.can-left.can-right { -webkit-mask-image: var(--fade-lr); mask-image: var(--fade-lr); }
/* De sitenavigatie is vlak: gespatieerde kapitalen, geen gevulde blokjes.
   Actief markeren we met een streep onder het woord in plaats van een
   vlak — dat past bij de rechte, rustige opzet en scheelt visuele ruis
   in een balk die al zeven items telt. */
.tab {
  /* inline-flex + min-height i.p.v. meer padding: de tab was 33px hoog (8px padding om
     12.5px tekst) en dat is onder de 44px die je met een duim betrouwbaar raakt. Via de
     hoogte van de doos i.p.v. de padding blijft de actief-streep onderaan het vlak staan. */
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  border: none;
  background: transparent;
  color: var(--ink-soft);
  /* 11px i.p.v. 12: vier tabs kwamen op 336px uit in een rij van 335 — één pixel.
     Liever hier een pixel af dan een tabbalk die "bijna" past en dus scrollt. */
  padding: 8px 11px;
  border-radius: 0;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  white-space: nowrap;
  border-bottom: 2px solid transparent;
  scroll-snap-align: start;
}
.tab:hover { color: var(--ink); }
.tab.active {
  color: var(--ink);
  font-weight: 600;
  border-bottom-color: var(--accent);
}
.tab.disabled { opacity: 0.4; cursor: not-allowed; }
.tab.disabled:hover { color: var(--ink-soft); }
.logout {
  border: 1px solid var(--line);
  background: transparent;
  color: var(--ink-soft);
  border-radius: 0;
  padding: 8px 12px;
}
.logout:hover { color: var(--ink); }

/* --- Logo vs. wordmerk ---
   Logo bij daglicht, het gespatieerde tekst-wordmerk in het donker.

   ⚠️ DE REDEN DAARVOOR IS NIET (MEER) DE WITTE ACHTERGROND. Hier stond dat
   het logo een dichte witte achtergrond had en in het donker een wit blok
   zou worden. Dat klopte, en is op 21-07-2026 verholpen: het bestand is nu
   950x375 met een alfakanaal, gesleuteld uit een bron van 1574px.

   Het blijft tóch tekst in het donker, en dat is de les: transparantie was
   het probleem niet. Het logo is DONKERBLAUW OP WIT ONTWORPEN. Gemeten op
   de bordkleur #001923 is het mét perfecte transparantie nog steeds
   vrijwel onzichtbaar — de aquarel wordt een vlek, het woordmerk verdwijnt
   in de achtergrond. Contrast, niet transparantie.

   Wil je het logo óók in het donker en op de TV, vraag Oldenhoff dan om een
   NEGATIEF/LICHTE variant, bij voorkeur SVG. Een transparante versie van
   dit bestand is daarvoor niet genoeg; die is er nu en het helpt niet.

   Wat de transparantie wél oplost: het logo hing eraan dat het vlak eronder
   exact #ffffff was. De dagstand van het TV-bord is #fbfdfe — net niet — en
   daar zou de oude versie een randje hebben getoond.

   De selectoren hieronder staan bewust op dezelfde specificiteit (0,2,0)
   als de bestaande .login-card/.topbar-brand-regels en komen er later in
   het bestand achter — anders wint de oude display-waarde. */
.login-card .brand-logo,
.topbar-brand .brand-logo { display: block; width: auto; }
.login-card .brand-mark,
.topbar-brand .brand-mark { display: none; }

/* Het logo is een breed liggend lockup waarin de golf veel ruimte pakt. In de
   oude uitsnede (317x111) waren de letters maar ~40% van de hoogte en werd
   "Villa Oldenhoff" op 30px onleesbaar; 44px was het minimum. De nieuwe
   uitsnede (950x375) zit strakker om het merk, dus de letters zijn er bij
   dezelfde hoogte fors groter. 44px blijft staan omdat het past in de topbar
   van 67px — er is nu alleen ruimte naar beneden als dat ooit nodig is. */
.topbar-brand .brand-logo { height: 44px; }
.login-card .brand-logo { height: 64px; margin: 0 auto 2px; }

/* Staat het logo er, dan is de property-regel eronder dubbelop: het logo
   zégt al "Villa Oldenhoff". In het donker (tekst-wordmerk) blijft hij. */
.topbar-brand .brand-logo ~ .property { display: none; }

@media (prefers-color-scheme: dark) {
  .login-card .brand-logo,
  .topbar-brand .brand-logo { display: none; }
  .login-card .brand-mark { display: block; }
  .topbar-brand .brand-mark { display: inline; }
}

/* --- Content --- */
/* De onderste inset houdt de laatste kaart vrij van de home-indicator; zonder dat ligt
   die streep op een telefoon precies over de onderste regel. */
.content {
  max-width: 960px;
  margin: 0 auto;
  padding: 24px calc(20px + env(safe-area-inset-right, 0px))
           calc(64px + env(safe-area-inset-bottom, 0px)) calc(20px + env(safe-area-inset-left, 0px));
}
.view-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 18px;
}
/* Schermtitel krijgt de merkbehandeling (kapitalen, 0.11em ≈ de 4px-op-40px
   van de site, gewicht 400); de data eronder juist niet — zulke spatiëring
   leest prettig op één woord ("VANDAAG") en beroerd op een tabel vol namen
   en tijden. */
.view-head h1 {
  font-weight: 400;
  font-size: 25px;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0;
}
.date-nav { display: flex; align-items: center; gap: 6px; }
.date-nav button {
  width: 38px; height: 38px;
  border: 1px solid var(--line);
  background: var(--surface);
  border-radius: 0;
  color: var(--ink);
  font-size: 18px;
}
/* De 38px hierboven is bedoeld voor de ‹ ›-pijltjes. Knoppen mét een woord erin moeten
   die breedte juist NIET erven: de CSV-knop op Admin → Team draagt .ghost-btn (niet
   .ghost) en stond daardoor als vierkantje van 38px met "↓" en "CSV" onder elkaar. */
.date-nav .ghost,
.date-nav .ghost-btn { width: auto; padding: 0 12px; font-size: 14px; color: var(--ink-soft); }
.date-nav .ghost-btn { white-space: nowrap; }
.date-nav input {
  height: 38px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  border-radius: 0;
  padding: 0 10px;
}

/* --- Weergaveschakelaar op Vandaag ---
   Bewust een segmented control en geen tweede rij tabbladen: dit kiest niet
   een ander onderwerp maar een andere snit door hetzelfde onderwerp. */
.view-modes {
  display: flex; gap: 2px; margin: -6px 0 16px;
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: 0; padding: 3px; width: fit-content;
  max-width: 100%; overflow-x: auto;
}
.vm {
  border: none; background: transparent; color: var(--ink-soft);
  padding: 7px 14px; border-radius: 0; font-size: 13.5px; font-weight: 500;
  white-space: nowrap;
}
.vm:hover { color: var(--ink); }
/* Hier komt duifblauw wél als vlak terug: petrol-op-duifblauw haalt ruim
   4.5:1, en dit is de plek waar de site-kleur het meest herkenbaar is. */
.vm.active { background: var(--accent-soft); color: #004b65; font-weight: 600; }

/* Weergaveknoppen links, vouwknop rechts: twee soorten keuze op één regel, maar niet
   in dezelfde groep — de ene kiest wát je ziet, de andere hoevéél. */
.today-controls {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 16px;
}
.today-controls .view-modes { margin: 0; }
/* Rechts uitgelijnd, vlak boven de lijst die hij bedient. Eigen rij zonder eigen hoogte:
   de negatieve ondermarge laat 'm tegen de eerste kaart aan zitten. */
/* Briefing links, compact-schakelaar rechts, één rij. De rand staat op de RIJ en niet op
   de briefing: die kan verborgen zijn, en dan moet de lijn er nog steeds onder staan. */
.dagregel {
  display: flex; align-items: flex-start; gap: 12px;
  border-bottom: 1px solid var(--line); margin-bottom: 12px;
}
.dagregel #daily-note { flex: 1; min-width: 0; border-bottom: none; margin-bottom: 0; }
/* Zonder briefing schuift de knop vanzelf naar rechts. */
.dagregel .fold-btn { margin-left: auto; flex: none; }
/* Geen pil meer. Dit is een voorkeur die je één keer zet, geen actie die om aandacht
   vraagt — met een rand en een gevuld vlak concurreerde hij met de weergaveknoppen. */
.fold-btn {
  border: none; background: transparent; color: var(--ink-soft);
  border-radius: 0; padding: 4px 2px; font-size: 12.5px; font-weight: 500;
  white-space: nowrap;
}
.fold-btn:hover { color: var(--accent); }

/* Compacte boekingen: alleen kamer, gast en tijd. Eén kaart-template, de velden die
   in deze stand niets toevoegen vallen hier weg — twee losse templates zouden een keer
   uit elkaar lopen en dan mist de compacte weergave stilletjes een waarschuwing.
   De kamer-waarschuwing (.alert-tag) blijft daarom bewust wél staan. */
.rows.compact .card, .groups.compact .card { padding: 9px 14px; }
/* `:not(.unfolded)` i.p.v. losse regels om alles terug te zetten: één kaart open
   klikken hoeft dan geen enkele display-waarde te herstellen, en er kan er ook geen
   één vergeten worden. Zie de klikhandler in bindArrivalCards(). */
.rows.compact .card:not(.unfolded) .meta,
.rows.compact .card:not(.unfolded) .notes,
.rows.compact .card:not(.unfolded) .eta-field,
.rows.compact .card:not(.unfolded) .tag.diet,
.rows.compact .card:not(.unfolded) .guest-details,
.groups.compact .card:not(.unfolded) .meta,
.groups.compact .card:not(.unfolded) .notes,
.groups.compact .card:not(.unfolded) .eta-field,
.groups.compact .card:not(.unfolded) .tag.diet,
.groups.compact .card:not(.unfolded) .guest-details { display: none; }
.rows.compact .card:not(.unfolded) .guest,
.groups.compact .card:not(.unfolded) .guest { font-size: 14.5px; }
/* Aanwijzen dat er iets te openen valt. Alleen in compacte stand: uitgeklapt is een
   klik alleen zinvol op een kaart mét gastdetails, en die heeft z'n eigen caret. */
.rows.compact .card, .groups.compact .card { cursor: pointer; }
.rows.compact .card.unfolded, .groups.compact .card.unfolded {
  padding: 14px;
  box-shadow: var(--shadow);
}

/* --- Gegroepeerde weergaven (Schoonmaak, Balie) --- */
.groups { display: flex; flex-direction: column; gap: 22px; }
.group-head {
  display: flex; align-items: center; gap: 9px;
  font-size: 15px; font-weight: 600;
  letter-spacing: 0.09em; text-transform: uppercase;
  color: var(--ink);
  margin: 0 0 2px;
}
.group-count {
  font-family: -apple-system, "Segoe UI", sans-serif;
  font-size: 11px; font-weight: 700; color: var(--ink-soft);
  background: var(--surface-2); border-radius: 999px; padding: 2px 8px;
}
.group-hint { font-size: 12.5px; color: var(--ink-soft); margin: 0 0 10px; }

/* Schoonmaakkaarten: het venster is de kop, niet de gastnaam. */
.card.hk .hk-window { font-size: 14.5px; }
.card.hk .hk-window b { font-variant-numeric: tabular-nums; }
.card.hk.hk-turn .stripe { background: var(--departure); }
.card.hk.hk-out .stripe { background: var(--inhouse); }
.card.hk.hk-in .stripe { background: var(--arrival); }
.card.hk.hk-stay .stripe { background: var(--line); }

/* --- Summary chips --- */
.summary { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 18px; }
.chip {
  display: inline-flex; align-items: baseline; gap: 7px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 999px;
  padding: 7px 14px;
  font-size: 13px;
  color: var(--ink-soft);
}
.chip b { font-size: 15px; color: var(--ink); }
.chip .dot { width: 8px; height: 8px; border-radius: 50%; align-self: center; }

/* --- Rows --- */
.rows { display: flex; flex-direction: column; gap: 10px; }
.card {
  display: grid;
  grid-template-columns: 4px 84px 1fr auto;
  align-items: center;
  gap: 14px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 14px 16px 14px 0;
  overflow: hidden;
}
.card .stripe { grid-column: 1; align-self: stretch; background: var(--inhouse); }
.card.kind-arrival .stripe { background: var(--arrival); }
.card.kind-departure .stripe { background: var(--departure); }
/* Kamernummer is data, geen kop: strak, tabellarisch, geen spatiëring.
   De cel is niet altijd een nummer — Mews levert "Niet toegewezen" als
   er geen kamer hangt, en dat woord past bij geen enkel leesbaar corps
   in deze kolom van 84px. Daarom hier afbreken i.p.v. over de gastnaam
   heen lopen. Zie de notitie in README/commit: de nettere oplossing is
   dat label in app.js een eigen (kleinere) klasse geven. */
.card .room {
  text-align: center;
  font-size: 21px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--ink);
  min-width: 0;
  line-height: 1.15;
  /* hyphens werkt hier omdat <html lang="nl"> gezet is: "Niet toege-wezen"
     leest als een bewuste afbreking, waar een kale breuk als een bug leest.
     overflow-wrap blijft als vangnet staan voor een label zonder afbreekpunt. */
  hyphens: auto;
  overflow-wrap: anywhere;
}
.card .room small { display: block; font-family: inherit; font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-soft); font-weight: 500; }
.card .main .guest { font-weight: 600; font-size: 15px; }
.card .main .meta { font-size: 13px; color: var(--ink-soft); margin-top: 2px; }
.card .main .notes { font-size: 12.5px; color: var(--gold); margin-top: 4px; }
.card .side { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; padding-right: 4px; }
.badge {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.03em;
  padding: 3px 9px;
  border-radius: 999px;
  text-transform: uppercase;
}
.badge.arrival { background: color-mix(in srgb, var(--arrival) 16%, transparent); color: var(--arrival); }
.badge.inhouse { background: color-mix(in srgb, var(--inhouse) 18%, transparent); color: var(--inhouse); }
.badge.departure { background: color-mix(in srgb, var(--departure) 16%, transparent); color: var(--departure); }
.badge.checkedin { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); }
.time { font-size: 13px; color: var(--ink-soft); }
.time b { color: var(--ink); }

.empty { text-align: center; color: var(--ink-soft); padding: 40px 0; }
.error { color: var(--danger); font-size: 14px; }

/* --- Vergaderingen-mini op Vandaag --- */
.today-meetings {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 12px 16px; margin-bottom: 18px;
}
.mini-title {
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--ink-soft); font-weight: 600; margin-bottom: 8px;
}
.mini-row {
  display: flex; gap: 12px; align-items: baseline;
  padding: 5px 0; border-top: 1px solid var(--line); font-size: 14px;
}
.mini-row:first-of-type { border-top: none; }
.mini-time { font-weight: 600; color: var(--accent); white-space: nowrap; }
.mini-space { font-weight: 600; }
.mini-org { color: var(--ink-soft); margin-left: auto; white-space: nowrap; }

/* --- Aanvragen van gasten op Vandaag ---
   Zelfde kaartvorm als de vergaderingen-mini hierboven: het is dezelfde soort mededeling
   op hetzelfde scherm. Alleen tokens, geen kale hex — dit scherm heeft dark mode. */
.aanvraag-blok {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
  padding: 12px 16px; margin-bottom: 18px;
}
.aanvraag-teller {
  color: var(--gold); font-weight: 700; letter-spacing: 0;
  text-transform: none; margin-left: 6px;
}
.aanvraag-item {
  padding: 10px 0; border-top: 1px solid var(--line); font-size: 14px;
}
.aanvraag-item:first-of-type { border-top: none; }
/* Afgehandelde regels dimmen: ze staan er voor de historie, niet voor het werk. */
.aanvraag-item.is-bevestigd,
.aanvraag-item.is-afgewezen { opacity: 0.62; }
.aanvraag-kop { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.aanvraag-wat { font-weight: 600; }
.aanvraag-prijs { color: var(--gold); font-size: 13px; }
.aanvraag-stand {
  margin-left: auto; font-size: 11px; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--ink-soft);
}
.aanvraag-item.is-nieuw .aanvraag-stand { color: var(--gold); font-weight: 700; }
.aanvraag-gast { margin: 3px 0 0; color: var(--ink-soft); font-size: 13px; }
/* De letterlijke woorden van de gast. Cursief + inspringing zodat je in één oogopslag
   ziet wat van hem is en wat van ons — dit is het enige veld dat hij zelf typte. */
.aanvraag-wens {
  margin: 6px 0 0; padding-left: 10px;
  border-left: 2px solid var(--accent-soft);
  font-style: italic;
}
.aanvraag-voet {
  display: flex; gap: 10px; margin-top: 6px;
  font-size: 12px; color: var(--ink-soft);
}
.aanvraag-door::before { content: "· "; }
.aanvraag-acties { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.aanvraag-btn {
  padding: 5px 10px; font-size: 13px;
  background: transparent; color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius); cursor: pointer;
}
.aanvraag-btn:hover { background: var(--bg); }
.aanvraag-btn[disabled] { opacity: 0.5; cursor: default; }

/* --- VIP + dieet --- */
.badge.vip { background: color-mix(in srgb, var(--gold) 20%, transparent); color: var(--gold); }
.tag.diet {
  display: inline-block; margin-top: 4px;
  font-size: 12.5px; color: var(--departure);
  background: color-mix(in srgb, var(--departure) 12%, transparent);
  border-radius: 0; padding: 2px 8px;
}

/* --- Uitklapbare gastkaart --- */
.card.expandable { cursor: pointer; }
.card.expandable .guest { display: flex; align-items: center; gap: 6px; }
.expand-caret { font-size: 11px; color: var(--ink-soft); transition: transform 0.15s; }
.card.open .expand-caret { transform: rotate(180deg); }
.guest-details {
  margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--line);
  display: flex; flex-direction: column; gap: 4px;
  font-size: 13px; color: var(--ink-soft);
}
.guest-details a { color: var(--accent); }

/* Doorklik naar de proefdruk van de kamersite. Goud en gestippeld onderstreept,
   omdat het géén werkende functie is maar een voorbeeld — een gewone accent-link
   ernaast (het mailadres) zou suggereren dat je hier de pagina van déze gast
   opent. Weghalen zodra de gastpagina echt per boeking rendert. */
.guest-details a.proefdruk-link {
  color: var(--gold);
  text-decoration-style: dotted;
  text-underline-offset: 2px;
}

/* --- Ratio in de chips (zelfde vorm als de TV) --- */
.chip .den { color: var(--ink-soft); font-weight: 600; margin-right: 2px; }

/* --- Kamer niet toegewezen: het enige harde alarm --- */
.tag.alert-tag {
  display: inline-block; margin-top: 4px;
  font-size: 12.5px; font-weight: 600; color: var(--danger);
  background: color-mix(in srgb, var(--danger) 12%, transparent);
  border-radius: 0; padding: 2px 8px;
}
.card.alert .stripe { background: var(--danger); }

/* --- Gewijzigd sinds de vorige export ---
   Duifblauw en niet rood: dit is NIEUWS, geen alarm. Het rode "kamer toewijzen" moet
   het enige harde signaal blijven — zodra er twee kleuren om aandacht vragen, wint er
   geen van beide. */
.tag.wijz-tag {
  display: inline-block; margin-top: 4px;
  font-size: 12.5px; font-weight: 600;
  color: var(--accent);
  background: color-mix(in srgb, var(--accent-soft) 30%, transparent);
  border-radius: 0; padding: 2px 8px;
}
.brief-wijz {
  margin-top: 4px; font-weight: 600; color: var(--accent);
}

/* --- Verwachte aankomst (eigen data) --- */
.eta-field {
  display: inline-flex; align-items: center; gap: 6px; margin-top: 6px;
  font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-soft);
}
.eta-input {
  height: 30px; border: 1px solid var(--line); background: var(--surface-2);
  color: var(--ink); border-radius: 0; padding: 0 8px; font-size: 13px;
  text-transform: none; letter-spacing: normal;
}
.eta-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.eta-input.saved { border-color: var(--accent); }

/* --- Ontbijt-rijen --- */
.card.bf { align-items: stretch; }
.card.bf.on .stripe { background: var(--accent); }
.card.bf .main { padding: 2px 0; }
.bf-fields {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 10px 16px;
  margin-top: 8px;
}
.field {
  display: flex;
  flex-direction: column;
  gap: 3px;
  font-size: 11px;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.field.grow { flex: 1; min-width: 160px; }
.field input {
  height: 36px;
  border: 1px solid var(--line);
  background: var(--surface-2);
  color: var(--ink);
  border-radius: 0;
  padding: 0 10px;
  font-size: 14px;
  text-transform: none;
  letter-spacing: normal;
}
.field input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.bf-persons { width: 74px; }
.bf-time { width: 110px; }

/* Velden pas tonen als de kamer ontbijt neemt. De klasse .on staat al op de
   kaart en wordt bij het omzetten van de schakelaar bijgewerkt, dus dit volgt
   vanzelf — geen extra JS. */
.bf-detail { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px 16px; flex: 1; }
.card.bf:not(.on) .bf-detail { display: none; }

/* --- Serviceschema ontbijt ---
   Staat boven de regels omdat dit de vraag is waar de keuken mee begint
   ("hoeveel om acht uur"), niet de kamer-voor-kamer-administratie eronder. */
.bf-slots {
  display: flex; flex-wrap: wrap; gap: 8px;
  margin: -6px 0 18px;
}
.bf-slot {
  display: inline-flex; align-items: baseline; gap: 7px;
  /* Wrap zodat de dieetregel eronder valt in plaats van de rij op te rekken. */
  flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--line);
  border-left: 3px solid var(--gold);
  border-radius: 0; padding: 8px 13px;
}
.bf-slot-time {
  font-weight: 700; font-size: 14px; font-variant-numeric: tabular-nums;
}
.bf-slot-n { font-size: 17px; font-weight: 700; color: var(--gold); }
.bf-slot-lbl { font-size: 12px; color: var(--ink-soft); }
.bf-slot-rooms {
  font-size: 12px; color: var(--ink-soft);
  padding-left: 9px; margin-left: 2px; border-left: 1px solid var(--line);
}
/* De dieetwens die de GAST zelf doorgaf, bij het slot waarop die kamer aanschuift.
   Eigen regel (flex-basis 100%) en niet achter de kamers: dit is de zin die je bij het
   uitserveren leest, en die hoort niet weg te vallen achter een opsomming kamernummers.
   Geen alarmkleur — het is informatie om rekening mee te houden, geen storing. */
.bf-slot-diet {
  flex-basis: 100%;
  margin-top: 4px;
  font-size: 12px;
  color: var(--ink);
}

/* Ontbijt aan, maar nog geen tijd: een openstaande vraag, geen tijdslot. */
.bf-slot-open { border-left-color: var(--danger); }
.bf-slot-open .bf-slot-n { color: var(--danger); }

/* Toggle switch */
.switch { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; }
.switch input { position: absolute; opacity: 0; width: 0; height: 0; }
.switch .slider {
  width: 42px; height: 24px;
  background: var(--surface-2);
  border: 1px solid var(--line);
  border-radius: 999px;
  position: relative;
  transition: background 0.15s;
}
.switch .slider::before {
  content: "";
  position: absolute;
  width: 18px; height: 18px;
  left: 2px; top: 2px;
  background: var(--ink-soft);
  border-radius: 50%;
  transition: transform 0.15s, background 0.15s;
}
.switch input:checked + .slider { background: color-mix(in srgb, var(--accent) 40%, transparent); border-color: var(--accent); }
.switch input:checked + .slider::before { transform: translateX(18px); background: var(--accent); }
.switch input:focus-visible + .slider { outline: 2px solid var(--accent); outline-offset: 2px; }
.switch-label { font-size: 13px; font-weight: 600; color: var(--ink); }

.save-state { font-size: 11px; color: var(--ink-soft); min-height: 14px; }
.save-state.saving { color: var(--ink-soft); }
.save-state.saved { color: var(--accent); }
.save-state.err { color: var(--danger); }

@media (max-width: 560px) {
  .card.bf .side { grid-column: 2 / -1; }
}

/* --- Klokken --- */
.clockin { display: flex; gap: 10px; margin-bottom: 18px; }
.clockin input {
  flex: 1;
  max-width: 320px;
  height: 44px;
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--ink);
  border-radius: 0;
  padding: 0 14px;
}
.clockin input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.clockin button {
  height: 44px;
  padding: 0 20px;
  border: none;
  background: var(--accent);
  color: var(--accent-ink);
  border-radius: 0;
  font-weight: 600;
}
.clockin button:hover { filter: brightness(1.05); }

.card.shift.on .stripe { background: var(--accent); }
.shift-icon { font-size: 18px; color: var(--inhouse); }
.card.shift.on .shift-icon { color: var(--accent); }
.clock-out-btn {
  border: 1px solid var(--accent);
  background: transparent;
  color: var(--accent);
  border-radius: 0;
  padding: 8px 14px;
  font-weight: 600;
}
.clock-out-btn:hover { background: color-mix(in srgb, var(--accent) 12%, transparent); }

/* --- Zalen/MICE --- */
.card .mi-time { font-family: -apple-system, "Segoe UI", sans-serif; font-size: 17px; font-weight: 600; }
.card .mi-time small { text-transform: uppercase; }

/* --- Identiteit --- */
/* Eén kolom, niet een wolk van pillen.
   Dit was flex-wrap met gecentreerde pillen, en dan volgt de knopbreedte de naamlengte:
   "Jan" ~60px, "Alexander" ~115px. In de 304px die de kaart binnen z'n padding overhoudt
   passen er zo 2 a 3 per rij, dus bij 6-7 medewerkers kreeg je drie ragged rijen met een
   gecentreerde laatste -- een kerstboom waarin je je eigen naam moet ZOEKEN. Onder elkaar
   en links uitgelijnd staat elke naam op dezelfde x-positie en scan je de lijst in een
   rechte lijn naar beneden. De lijst komt al alfabetisch binnen (db.ts, ORDER BY name
   COLLATE NOCASE), dus die volgorde hoeft hier niets meer te doen.
   De max-height is een vangnet voor als het team doorgroeit: liever een half afgesneden
   knop onderaan -- dat leest als "er is meer" -- dan een kaart die buiten beeld valt. */
.identity-list {
  display: grid;
  gap: 8px;
  max-height: 52dvh;
  overflow-y: auto;
}
.identity-btn {
  border: 1px solid var(--line);
  background: var(--surface-2);
  color: var(--ink);
  border-radius: 0;
  padding: 13px 16px;
  font-size: 15px;
  font-weight: 600;
  width: 100%;
  text-align: left;
}
.identity-btn:hover { border-color: var(--accent); color: var(--accent); }
.ghost-btn {
  border: none; background: transparent; color: var(--ink-soft);
  font-size: 13px; padding: 4px; align-self: center;
}
.ghost-btn:hover { color: var(--accent); }
.identity-add { display: flex; gap: 8px; }
.identity-add input {
  flex: 1; height: 42px; border: 1px solid var(--line);
  background: var(--surface-2); color: var(--ink); border-radius: 0; padding: 0 12px;
}
.identity-add button {
  height: 42px; padding: 0 16px; border: none; background: var(--accent);
  color: var(--accent-ink); border-radius: 0; font-weight: 600;
}

/* --- Statuslampje bron (header) ---
   Groen is de rusttoestand en mag wegvallen; rood moet je zien. Daarom krijgt
   alleen "loopt achter" een achtergrond en vet — een altijd-opvallend lampje
   leert je het te negeren, en dan werkt het niet meer op de dag dat het telt. */
.source-light-wrap { position: relative; }
.source-light {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12px; color: var(--ink-soft); white-space: nowrap;
  padding: 5px 10px; border-radius: 999px; cursor: pointer;
  border: 1px solid transparent; background: transparent;
  max-width: 260px; overflow: hidden; text-overflow: ellipsis;
}
.source-light:hover { border-color: var(--line); }
.source-light .sl-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: var(--ink-soft); flex: none;
}
.source-light .sl-text { overflow: hidden; text-overflow: ellipsis; }
.source-light.ok .sl-dot { background: var(--ok); }
.source-light.off .sl-dot { background: var(--ink-soft); }
.source-light.warn {
  background: color-mix(in srgb, var(--gold) 14%, transparent);
  color: var(--gold); font-weight: 600;
}
.source-light.warn .sl-dot { background: var(--gold); }
.source-light.down {
  background: color-mix(in srgb, var(--danger) 12%, transparent);
  color: var(--danger); font-weight: 600;
}
.source-light.down .sl-dot { background: var(--danger); }

/* Uitklappaneel: één lampje, maar wél alle bronnen op te vragen. Hoveren toont het,
   klikken zet het vast — de balie heeft een muis, het wandtablet niet. */
.source-panel {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 40;
  width: min(340px, calc(100vw - 32px));
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 0; box-shadow: var(--shadow); padding: 12px;
  display: flex; flex-direction: column; gap: 12px;
  font-size: 12.5px; color: var(--ink); white-space: normal; text-align: left;
}
.sp-row { display: grid; grid-template-columns: 1fr auto; gap: 2px 10px; }
.sp-label { font-weight: 600; }
.sp-status { color: var(--ink-soft); justify-self: end; }
.sp-detail { grid-column: 1 / -1; color: var(--ink-soft); line-height: 1.45; }
.sp-row.sp-down .sp-status { color: var(--danger); font-weight: 600; }
.sp-row.sp-warn .sp-status { color: var(--gold); font-weight: 600; }

/* Op smalle schermen telt alleen de kleur — de tekst kost te veel breedte
   naast de tabs, en het lampje mag de navigatie niet wegdrukken. */
/* ===== De navigatie mag NOOIT wegvallen =====
   Gemeten op 21-07: de header vraagt 539px aan logo, lampje, naam, uitloggen, marges en
   gaps. Op een telefoon van 375px is dat 164px te veel — en omdat `.tabs` door
   `overflow-x: auto` tot nul mag krimpen, was de tabbalk daar volledig onzichtbaar. Geen
   afgekapte tabs, geen scrollbalk: niets. Je kon simpelweg niet van scherm wisselen.

   Daarom krijgen de tabs onder 720px hun eigen regel: `flex-basis: 100%` dwingt een
   omslag, `order` zet ze onder de merkregel. Zo is de breedte van de tabbalk niet meer
   afhankelijk van wat er verder in de header staat — precies de koppeling die dit kapot
   maakte. Wat er niet past scrollt, mét de rand-vervaging die dat aankondigt. */
/* DE TABS KRIJGEN HUN EIGEN REGEL ZODRA ZE NIET MEER PASSEN — en dat is veel eerder dan
   720px. Deze regels stonden in het blok hieronder en vuurden dus pas op telefoonbreedte,
   terwijl het probleem al bij een tablet begint.

   GEMETEN op 22-07-2026, in een iframe met een echte viewport (het browservenster
   verkleinen liegt hier: `innerWidth` blijft dan op de desktopwaarde staan):

     viewport   nav heeft nodig   nav krijgt   tekort
     1280            456             733         —
     1024            456             477         —
      900            456             353       103px
      834            456             287       169px   ← iPad Pro 11" staand
      768            456             221       235px   ← iPad staand
      720 en lager    —               —          —     (viel al onder het oude blok)

   De nav krijgt steeds `viewport − 547`, dus hij past pas vanaf ~1003px. Er zat een dode
   zone van 768 tot ~1000px waarin de laatste tab half buiten beeld viel — en dat is precies
   het formaat waarop de balie werkt. Het is ook exact de fout die het comment bij de nav in
   index.html beschrijft ("wat je niet ziet gebruik je niet"): die stond er sinds er een
   vijfde tab bij kwam zonder hermeting.

   1100 en niet 1003: een grens die precies op de meting ligt breekt bij het eerste tabje
   dat er ooit bij komt of één langer label. Hierboven houdt hij ~98px speling. */
@media (max-width: 1100px) {
  .topbar { flex-wrap: wrap; row-gap: 4px; column-gap: 12px; }
  .tabs {
    flex: 0 0 100%;
    order: 10;
    margin-left: 0;
    /* Onder de merkregel hoort geen dubbele lucht; de tabs dragen hun eigen hoogte. */
    margin-top: 2px;
  }
  /* De merkregel duwt de rest naar rechts, zodat lampje en naam op één lijn eindigen. */
  .topbar-brand { margin-right: auto; }
}

@media (max-width: 720px) {

  /* Tekst weg in de RUSTTOESTAND — daar is de stip genoeg en de ruimte schaars.
     Maar bij warn/down komt hij terug: een kale rode stip zonder woord laat je raden wát
     er stuk is, en dat is uitgerekend het moment waarop je het moet weten. Hier stond
     `display: none` zonder uitzondering, dus een storing was op een telefoon een
     naamloos bolletje. */
  .source-light.ok .sl-text,
  .source-light.off .sl-text { display: none; }
  .source-light.warn .sl-text,
  .source-light.down .sl-text { max-width: 42vw; }

  .source-light {
    padding: 5px;
    min-width: 44px;
    min-height: 44px;
    justify-content: center;
  }
  /* Mét tekst mag hij weer als een label lezen in plaats van als een knop-vlak. */
  .source-light.warn,
  .source-light.down { padding: 5px 10px; justify-content: flex-start; }

  /* Het uitklappaneel viel buiten beeld.
     Het hangt met `right: 0` aan .source-light-wrap, dus een paneel van 340px groeit naar
     LINKS vanaf de rechterrand van dat lampje. Op een desktop staat het lampje vlak bij de
     schermrand en gaat dat goed; op een telefoon staat de naamknop er nog rechts van, dus
     begon het paneel rond -90px — half buiten het scherm.

     Oplossing zonder JavaScript: de wrap wordt hier `static`, waardoor het dichtstbijzijnde
     gepositioneerde element de sticky .topbar is. Het paneel hangt dan aan de HEADER in
     plaats van aan het lampje, en spant met marges de volle breedte. Het kan daarmee per
     constructie niet meer buiten beeld vallen, ongeacht waar het lampje staat. */
  .source-light-wrap { position: static; }
  .source-panel {
    top: calc(100% + 4px);
    left: 12px;
    right: 12px;
    width: auto;
  }
}

/* --- Whoami-chip --- */
.whoami {
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  border-radius: 999px; padding: 6px 12px; font-weight: 600; font-size: 13px; white-space: nowrap;
}
.whoami:hover { border-color: var(--accent); color: var(--accent); }
/* Mijn dag heeft geen tab; zonder deze markering lijkt er geen enkel scherm actief. */
.whoami.actief { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }

/* --- Mijn dag --- */
.me-acties { display: flex; align-items: center; gap: 10px; }

/* Ingangen naar Klokken en Admin. Als kaarten en niet als knoppenrij: het zijn
   bestemmingen, geen acties, en de ondertitel zegt wat je er vindt — anders moet je
   het onthouden nu ze niet meer in de tabbalk staan. */
.me-links { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
.me-link {
  display: flex; flex-direction: column; gap: 2px; text-align: left; width: 100%;
  background: var(--surface); border: 1px solid var(--line); border-left: 3px solid var(--accent);
  border-radius: 0; padding: 12px 14px; min-height: 44px;
}
.me-link:hover { border-color: var(--accent); }
/* De TV-ingang is een <a> en geen <button> (eigen pagina, nieuw tabblad); zonder dit
   staat die ene regel onderstreept tussen twee knoppen die dat niet zijn. */
.me-link { text-decoration: none; }
.me-link-titel { font-weight: 600; font-size: 15px; color: var(--ink); }
.me-link-sub { font-size: 12.5px; color: var(--ink-soft); }

/* Je eigen weektotaal. Het getal mag groot: dit is waar de pagina voor bestaat. */
.me-total-cijfer { display: flex; align-items: baseline; gap: 10px; }
.me-total-cijfer b {
  font-family: var(--serif, inherit); font-size: 30px; font-weight: 600; line-height: 1;
}
.me-total-cijfer span { font-size: 13px; color: var(--ink-soft); }
.me-total-open { font-size: 12.5px; color: var(--ink-soft); margin: 10px 0 0; }
/* Het weekrooster zit sinds 21-07 in dezelfde kaart als het weektotaal — het is dezelfde
   week. Deze lijn scheidt het getal van de zeven dagen; .me-dag:first-child houdt zelf
   geen rand, dus het blijft bij één streep. */
.me-weekrooster { margin-top: 14px; border-top: 1px solid var(--line); padding-top: 2px; }
/* Een knop die als tekstlink leest — voor een doorverwijzing binnen een zin. */
.linkje {
  border: none; background: none; padding: 0; font: inherit;
  color: var(--accent); text-decoration: underline; font-weight: 600;
}

.me-dag {
  display: flex; align-items: baseline; gap: 12px;
  padding: 9px 0; border-top: 1px solid var(--line); font-size: 14px;
}
.me-dag:first-child { border-top: none; }
.me-dag-naam { min-width: 8.5rem; color: var(--ink-soft); font-variant-numeric: tabular-nums; }
.me-dag-wat { font-weight: 600; }
/* Vandaag springt eruit, een lege of vrije dag valt juist weg — je zoekt je werkdagen. */
.me-dag.me-vandaag .me-dag-naam { color: var(--accent); font-weight: 600; }
.me-dag.me-leeg .me-dag-wat { color: var(--ink-soft); font-weight: 400; }

.me-taak {
  display: flex; align-items: baseline; gap: 12px;
  padding: 8px 0; border-top: 1px solid var(--line); font-size: 14px;
}
.me-taak:first-child { border-top: none; }
.me-taak-tijd { font-weight: 600; color: var(--accent); font-variant-numeric: tabular-nums; min-width: 3.5rem; }
.me-taak-wat { font-weight: 500; }

/* --- Dagbriefing ---
   Vuistregel voor warm vs. koel: grote vlakken blijven in de huisstijl,
   warm (--gold) is alleen voor kléine semantische markeringen (VIP,
   dieet, notitieregel). Dit blok is breed en staat bovenaan; in oker
   vocht het zichtbaar met het koele palet eronder. */
.daily-note {
  background: color-mix(in srgb, var(--accent-soft) 18%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent-soft) 55%, var(--line));
  border-left: 4px solid var(--accent);
  border-radius: 0;
  padding: 12px 16px;
  margin-bottom: 18px;
  color: var(--ink);
  white-space: pre-wrap;
  font-size: 14px;
}

/* Hier stond .source-note: het zinnetje "Gegevens uit Mews van 21:45" boven het
   dagoverzicht. Weg op 21-07 — het statuslampje in de header zegt hetzelfde, staat op
   élk scherm en is uitklapbaar. */

/* --- Klokken persoonlijk paneel --- */
/* `wrap` sinds het invulformulier erbij kwam: dat klapt open ONDER de knoppen en heeft de
   volle breedte nodig. Zonder wrap perst flexbox 'm naast de knoppen tot een kolom van
   niks. Zolang er geen formulier staat is .clock-form-plek leeg en kost hij geen ruimte. */
.clock-me {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  flex-wrap: wrap;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 16px 18px; margin-bottom: 18px;
}
.clock-me-name { font-size: 16px; }
.clock-me-kop { display: flex; flex-direction: column; gap: 2px; }
/* De status is de eerste vraag op Mijn dag: sta ik ingeklokt, en sinds wanneer. */
.clock-me-status { font-size: 13px; color: var(--ink-soft); }
.clock-me-status.on { color: var(--accent); font-weight: 600; }
.clock-me-acties { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
/* Tijden invullen is de uitzondering zolang de klok óók openstaat; hij mag er dus niet
   even hard uitzien als de knop die je elke dag gebruikt. Staat de klok uit, dan krijgt
   deze knop in app.js de klasse .clock-big en is hij vanzelf de hoofdknop. */
.clock-tweede {
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  border-radius: 0; padding: 11px 16px; font-weight: 600; font-size: 14px;
}
.clock-tweede:hover { border-color: var(--accent); color: var(--accent); }
.clock-form-plek:empty { display: none; }
.clock-form-plek { flex-basis: 100%; }

.clock-form { border-top: 1px solid var(--line); padding-top: 14px; margin-top: 4px; }
.clock-form-rij { display: flex; gap: 12px; align-items: flex-end; flex-wrap: wrap; }
.clock-form-rij + .clock-form-rij { margin-top: 12px; }
.clock-form label {
  display: flex; flex-direction: column; gap: 4px;
  font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase;
  color: var(--ink-soft); font-weight: 600;
}
.clock-form input {
  font: inherit; height: 40px; padding: 0 10px; border-radius: 0;
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
}
.clock-form input:disabled { opacity: 0.6; }
.clock-form-bij { font-size: 12.5px; color: var(--ink-soft); margin: 10px 0 0; }
.clock-form .cf-ok {
  height: 42px; padding: 0 18px; border: none; background: var(--accent);
  color: var(--accent-ink); border-radius: 0; font-weight: 600;
}
.clock-form .cf-fout { font-size: 13px; }

/* Merkteken op een dienst die niet zuiver geklokt is. Klein en grijs: het hoort op te
   vallen als je ernaar kijkt, niet als je erlangs scant. */
.shift-merk { color: var(--ink-soft); font-size: 12px; margin-left: 6px; cursor: help; }
.shift-fix {
  border: 1px solid var(--line); background: transparent; color: var(--ink-soft);
  border-radius: 0; padding: 6px 10px; font-size: 12.5px; font-weight: 600;
}
.shift-fix:hover { border-color: var(--accent); color: var(--accent); }
.clock-big {
  border: none; background: var(--accent); color: var(--accent-ink);
  border-radius: 0; padding: 12px 24px; font-weight: 700; font-size: 15px;
}
.clock-big.out { background: var(--departure); }
.clock-big[disabled], .clock-out-btn[disabled] { opacity: 0.6; cursor: progress; }
/* Een mislukte klok moet blijven staan: denken dat je ingeklokt bent terwijl het niet
   lukte is hier de duurste fout. */
.knop-fout { background: var(--danger) !important; color: #fff !important; border-color: var(--danger) !important; }
.clock-big:hover { filter: brightness(1.05); }
.clock-me-hint { font-size: 13px; color: var(--ink-soft); }

/* --- Admin --- */
.admin-card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  box-shadow: var(--shadow); padding: 18px 20px; margin-bottom: 16px;
}
.admin-card h2 { font-size: 15px; font-weight: 600; letter-spacing: 0.09em; text-transform: uppercase; margin: 0 0 4px; }
.admin-hint { color: var(--ink-soft); font-size: 13px; margin: 0 0 12px; }
.admin-staff { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.staff-pill {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: 999px; padding: 6px 8px 6px 14px; font-size: 14px;
}
.staff-del {
  border: none; background: transparent; color: var(--ink-soft);
  font-size: 18px; line-height: 1; padding: 0 4px; border-radius: 50%;
}
.staff-del:hover { color: var(--danger); }
/* De naam zelf is de knop om 'm te wijzigen — hernoemen kon eerder helemaal niet. */
.staff-naam {
  border: none; background: transparent; color: inherit; font: inherit;
  padding: 0; border-bottom: 1px dotted var(--ink-soft);
}
.staff-naam:hover { color: var(--accent); border-bottom-color: var(--accent); }
/* Hernoemen gebeurt ín het chipje. Erft font en kleur van de pil, zodat het veld
   op z'n plek staat en de rij niet verspringt zodra je gaat typen. */
.staff-naam-veld {
  font: inherit; color: var(--ink); background: var(--surface);
  border: 1px solid var(--accent); border-radius: 0;
  padding: 0 4px; min-width: 60px;
}
.staff-naam-veld:focus { outline: none; }
/* Admin-vlag: wie de ingang ziet. Aan is een gevulde stip, uit is een uitnodiging —
   niet twee even harde standen, want de meeste mensen zijn géén admin. */
.staff-adm {
  border: 1px solid var(--line); background: transparent; color: var(--ink-soft);
  border-radius: 999px; padding: 1px 8px; font-size: 11px; font-weight: 700;
  letter-spacing: 0.04em; text-transform: uppercase;
}
.staff-adm:hover { border-color: var(--accent); color: var(--accent); }
.staff-pill.is-admin { border-color: var(--accent); }
.staff-pill.is-admin .staff-adm {
  background: var(--accent); color: var(--accent-ink); border-color: var(--accent);
}
.admin-add-vink {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  font-size: 12px; color: var(--ink-soft); font-weight: 600;
}
.admin-add-vink input { width: 18px; height: 18px; accent-color: var(--accent); }

/* --- Admin-subtabs ---
   Hier stonden groepskoppen (.admin-groep) boven één doorlopende scroll, met als
   motivering "vijf kaarten passen op twee schermen". Bij negen kaarten gold dat niet
   meer — zie de toelichting bij <nav class="admin-tabs"> in index.html.

   ONDERSTREEPTE TABS EN GEEN SEGMENTED CONTROL. De .view-modes-pil hierboven kiest een
   andere snit door hetzelfde onderwerp (Vandaag: alles/tijdlijn/schoonmaak); deze kiest
   een ánder onderwerp. Zelfde vorm zou dat verschil wegpoetsen, en dan is de vorm geen
   informatie meer. */
.admin-tabs,
.profiel-tabs {
  display: flex; gap: 2px; margin: 0 0 18px;
  border-bottom: 1px solid var(--line);
  overflow-x: auto; scrollbar-width: none;
}
.admin-tabs::-webkit-scrollbar,
.profiel-tabs::-webkit-scrollbar { display: none; }
/* De profielschakelaar zit IN de .view-head (naast Wissel/Uitloggen) en niet eronder zoals
   op Admin. Daarom geen ondermarge, en `flex: 1` zodat de knoppen rechts blijven staan. */
.profiel-tabs { margin: 0; flex: 1; }
.at {
  border: none; background: transparent; color: var(--ink-soft);
  padding: 10px 16px; border-radius: 0; font-size: 14px; font-weight: 500;
  white-space: nowrap;
  /* De streep valt samen met de rand van .admin-tabs in plaats van eronder. */
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.at:hover { color: var(--ink); }
.at.active { color: var(--accent); font-weight: 600; border-bottom-color: var(--accent); }
/* Vier labels vragen op een smalle telefoon net iets meer dan er is; de balk mag dan
   schuiven in plaats van de labels af te knijpen. */
@media (max-width: 560px) {
  .at { padding: 10px 11px; font-size: 13.5px; }
}

/* Slotstand naast de kop. "Geen pincode ingesteld" moet je kunnen zien: stil openstaan
   is hoe je over een half jaar denkt dat er een slot op zit dat er nooit was. */
.admin-slotstand { font-size: 12px; font-weight: 600; letter-spacing: 0.04em; }
.admin-slotstand.open { color: var(--departure); }
.admin-slotstand.dicht { color: var(--ink-soft); }
.admin-slotstand.los { color: var(--accent); }
.admin-lockscherm .admin-row { flex-wrap: wrap; }
.admin-lockscherm input { width: 120px; letter-spacing: 0.3em; }
.admin-add { display: flex; gap: 8px; }
.admin-add input, .admin-row input, #admin-note {
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  border-radius: 0; padding: 10px 12px; font-size: 14px;
}
.admin-add input { flex: 1; height: 42px; padding: 0 12px; }
#admin-note { width: 100%; resize: vertical; font-family: inherit; }
.admin-row { display: flex; align-items: center; gap: 10px; margin-top: 10px; }
.admin-briefdag { flex-wrap: wrap; margin-bottom: 10px; }
.admin-lbl { font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; color: var(--ink-soft); font-weight: 600; }
/* Toelichting die NAAST een veld staat in plaats van erboven; de gewone .admin-hint
   houdt z'n ondermarge en zou de rij uit het lood trekken. */
.admin-hint--bij { margin: 0; }
/* Een selectievakje mag niet uitgerekt worden door de veldregels hierboven. */
.admin-row input[type="checkbox"] { width: 18px; height: 18px; flex: none; accent-color: var(--accent); }
.admin-briefdag input { height: 38px; }
/* Selects erven niets van de app; zonder dit blijft het een systeemwidget die botst met
   de rechte hoeken van de rest. */
select {
  font: inherit; height: 40px; padding: 0 10px;
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  border-radius: 0;
}
select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.admin-add button, .admin-row button {
  height: 42px; padding: 0 18px; border: none; background: var(--accent);
  color: var(--accent-ink); border-radius: 0; font-weight: 600;
}

/* Een SCHAKELAAR in een voorkeurenrij, geen hoofdactie.
   De regel hierboven maakt elke knop in zo'n rij een gevulde accentknop. Dat klopt voor
   "Opslaan", "Versturen" en "Toevoegen" — je komt op dat scherm om ze in te drukken.
   Maar "Meldingen aanzetten" erfde 'm ook, en daarmee was een instelling die je één keer
   omzet het luidste element op Mijn dag: harder dan je eigen klok erboven, die de reden
   is dat je de pagina opent.

   Zelfde vorm als .clock-tweede (de omlijnde tweede knop in het klokpaneel): nog steeds
   een echte knop met een zichtbare stand, alleen niet de hoofdknop. Bewust géén
   .ghost-btn zoals de rij erboven — dat is een tekstlink van 13px, en de ingang naar
   meldingen mag je niet moeten zóeken. Hoogte erft van .admin-row button, zodat hij op
   één lijn blijft met de velden ernaast. */
.admin-row .knop-tweede {
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  padding: 0 16px; font-size: 14px;
}
.admin-row .knop-tweede:hover { border-color: var(--accent); color: var(--accent); }
/* Push kan technisch onmogelijk zijn (geen sleutels, verkeerde browser, niet
   geïnstalleerd); dan zet laadPush() de knop uit met een uitleg eronder. */
.admin-row .knop-tweede[disabled] { opacity: 0.55; }
.admin-row .knop-tweede[disabled]:hover { border-color: var(--line); color: var(--ink); }

/* En dezelfde botsing één laag lager: `.admin-row button` ((0,1,1)) wint óók van
   .ghost-btn ((0,1,0)). Twee knoppen die in de HTML als tekstlink zijn AANGEMERKT
   stonden er daardoor als gevulde hoofdknop — "↻ Opnieuw genereren" (Admin → Dag) en
   "Opnieuw tonen" (Mijn dag → Voorkeuren). Niemand had dat zo bedoeld; er staat
   class="ghost-btn" op allebei. Deze regel laat die bedoeling weer winnen.

   Les voor de volgende knop hier: een klasse op een element binnen .admin-row heeft
   minstens twee klassen in de selector nodig, anders doet hij niets. */
.admin-row .ghost-btn {
  height: auto; border: none; background: transparent; color: var(--ink-soft);
  font-size: 13px; padding: 4px; font-weight: 400;
}
.admin-row .ghost-btn:hover { color: var(--accent); }

@media (max-width: 560px) {
  .card { grid-template-columns: 4px 64px 1fr; }
  .card .side { grid-column: 2 / -1; flex-direction: row; align-items: center; padding: 0 0 0 12px; }
  .topbar { flex-wrap: wrap; }
}

/* ===== Dag-tijdlijn =====
   De as is proportioneel: een gat van drie uur is drie keer zo hoog als een gat
   van een uur. Dat is het hele punt — je moet rust kunnen ZIEN, niet uitrekenen. */
.timeline { margin-bottom: 18px; }
.tl-canvas {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}

.tl-hour {
  position: absolute; left: 0; right: 0; height: 0;
  border-top: 1px solid var(--line);
}
.tl-hour-label {
  position: absolute; left: 10px; top: -8px;
  font-size: 11px; font-variant-numeric: tabular-nums;
  color: var(--ink-soft); background: var(--surface); padding-right: 6px;
}

/* Nu-lijn: het enige accent dat dwars over de hele breedte loopt. */
.tl-now {
  position: absolute; left: 52px; right: 8px; height: 0;
  border-top: 2px solid var(--danger); z-index: 3;
}
.tl-now span {
  position: absolute; left: -34px; top: -9px;
  font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--danger); background: var(--surface); padding: 0 4px;
}

/* Een gat krijgt geen rand en geen vulling — het IS de leegte. Alleen een
   label in het midden, zodat je de uren niet hoeft te tellen. */
.tl-gap {
  position: absolute; left: 62px; right: 8px;
  display: flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.tl-gap span {
  font-size: 11.5px; color: var(--ink-soft); opacity: 0.75;
  letter-spacing: 0.04em;
  border-top: 1px dashed var(--line); border-bottom: 1px dashed var(--line);
  padding: 3px 12px;
}

.tl-block {
  position: absolute;
  box-sizing: border-box;
  padding: 6px 10px 7px 11px;
  margin-right: 8px;
  border-radius: 0;
  border: 1px solid var(--line);
  border-left: 3px solid var(--inhouse);
  background: var(--surface-2);
  overflow: hidden;
  z-index: 2;
}
.tl-time {
  font-size: 11px; font-weight: 700; font-variant-numeric: tabular-nums;
  letter-spacing: 0.03em; color: var(--ink-soft);
}
.tl-title { font-size: 13.5px; font-weight: 600; margin-top: 1px; }
.tl-sub { font-size: 12px; color: var(--ink-soft); margin-top: 1px; }
.tl-note { font-size: 11px; color: var(--ink-soft); opacity: 0.8; margin-top: 3px; font-style: italic; }

.tl-arrival { border-left-color: var(--arrival); }
.tl-departure { border-left-color: var(--departure); }
.tl-breakfast { border-left-color: var(--gold); }
.tl-event { border-left-color: var(--accent); }
.tl-agenda { border-left-color: var(--inhouse); }

/* Beleidstijd i.p.v. echte tijd: gestippeld, want we weten het niet. */
.tl-policy { border-style: dashed; border-left-style: solid; background: transparent; }

.tl-alert {
  border-color: color-mix(in srgb, var(--danger) 45%, var(--line));
  border-left-color: var(--danger);
  background: color-mix(in srgb, var(--danger) 8%, var(--surface));
}

@media (max-width: 560px) {
  .tl-sub, .tl-note { display: none; }
  .tl-block { padding: 5px 8px; }
}

/* ===== Agenda (Google Calendar) =====
   Soort-herkenning is best effort (laag 2). Het onderscheid is daarom bewust rustig:
   een kleurstreep + label, nooit iets dat de letterlijke titel verdringt. Onherkende
   items (kind "other") krijgen geen streepkleur en vallen terug op de neutrale kaart. */
.card.ag-shift .stripe { background: var(--accent); }
.card.ag-breakfast .stripe { background: var(--gold); }
.card.ag-housekeeping .stripe { background: var(--inhouse); }
.card.ag-appointment .stripe { background: var(--departure); }
.card.ag-absence .stripe { background: var(--line); }

.badge.ag-shift { background: color-mix(in srgb, var(--accent) 18%, transparent); color: var(--accent); }
.badge.ag-breakfast { background: color-mix(in srgb, var(--gold) 20%, transparent); color: var(--gold); }
.badge.ag-housekeeping { background: color-mix(in srgb, var(--inhouse) 20%, transparent); color: var(--inhouse); }
.badge.ag-appointment { background: color-mix(in srgb, var(--departure) 16%, transparent); color: var(--departure); }
.badge.ag-absence { background: var(--surface-2); color: var(--ink-soft); }

/* Afwezigheid mag visueel wegvallen — het is bedoeld als achtergrondinformatie. */
.card.ag-absence .guest { color: var(--ink-soft); }

.ag-people { font-size: 12.5px; color: var(--ink-soft); margin-top: 3px; }

/* ===== "Vandaag in huis" — dagbeeld uit de agenda =====
   Rustig gehouden: dit is context bij het dagoverzicht, geen actie. Daarom geen
   kaartranden en geen felle kleuren — één band met labels, zodat het oog eroverheen
   glijdt tenzij je het zoekt. */
.today-team {
  display: flex; flex-wrap: wrap; gap: 0.25rem 1.5rem;
  padding: 0.7rem 0.9rem; margin-bottom: 0.75rem;
  background: var(--surface-2); border-radius: var(--radius);
  font-size: 13.5px;
}
.today-team .tt-part { display: flex; gap: 0.45rem; align-items: baseline; }
.today-team .tt-label {
  font-size: 11px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase;
  color: var(--ink-soft);
}
.today-team .tt-val { color: var(--ink); }
.today-team .tt-bf .tt-val { color: var(--gold); }
/* Afwezig is achtergrondinformatie: mag visueel wegvallen. */
.today-team .tt-away .tt-val { color: var(--ink-soft); }
.today-team .tt-tasks { flex-basis: 100%; }

.mi-grid:not(:empty) { margin-bottom: 18px; }

/* ===== Kolommen x uren-raster =====
   Gedeeld door de agenda-weekweergave (kolom = dag) en het zalenrooster
   (kolom = zaal). Zelfde vorm, dus het team hoeft maar één ding te lezen.
   Op smalle schermen horizontaal scrollen in plaats van omklappen naar een lijst:
   het raster IS de boodschap, en een week die je moet scrollen blijft een week. */
.agw-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
/* min-width wordt inline gezet door de renderer (52px + 90px per dagkolom); deze waarde
   is alleen de terugval als die ontbreekt. */
.agw {
  min-width: 322px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.agw-row { display: grid; grid-template-columns: 52px repeat(7, 1fr); }
.agw-gutter {
  font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em;
  color: var(--ink-soft); padding: 6px 6px 0 8px; text-align: right;
}
.agw-cell { border-left: 1px solid var(--line); min-width: 0; }

.agw-head .agw-cell {
  padding: 8px 6px; font-size: 12px; font-weight: 600;
  text-transform: capitalize; color: var(--ink-soft);
  border-bottom: 1px solid var(--line);
}
.agw-head .agw-cell.agw-today { color: var(--accent); }
.agw-head .agw-gutter { border-bottom: 1px solid var(--line); }

/* Hele-dag-strook: één grid waarin balken over kolommen mogen lopen. De
   kolomlijnen liggen als eigen laag eronder (grid-row: 1/-1), zodat een
   meerdaagse balk er dwars overheen kan zonder ze te wissen. */
.agw-allday {
  display: grid;
  grid-template-columns: 52px repeat(7, 1fr);
  gap: 3px 0;
  padding-bottom: 4px;
  border-bottom: 1px solid var(--line);
  align-items: start;
}
.agw-allday-gutter { grid-column: 1; grid-row: 1 / -1; padding-top: 7px; }
.agw-colline { grid-row: 1 / -1; border-left: 1px solid var(--line); min-height: 26px; }
.agw-colline.agw-today { background: color-mix(in srgb, var(--accent) 5%, transparent); }
.agw-bar {
  font-size: 11px; line-height: 1.25;
  padding: 3px 6px; margin: 0 2px; border-radius: 0;
  background: var(--surface-2); border-left: 3px solid var(--inhouse);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  z-index: 1;
}

/* Vandaag krijgt een heel lichte kolomkleur — genoeg om 'm te vinden, te weinig
   om de blokken erin te overstemmen. */
.agw-cell.agw-today { background: color-mix(in srgb, var(--accent) 5%, transparent); }

/* Het laatste uurlabel staat op de onderrand en wordt half omhoog geschoven —
   zonder deze ruimte valt de onderste helft buiten de kaart. */
.agw-row.agw-grid { padding-bottom: 10px; }
.agw-hours { position: relative; }
.agw-hour-label {
  position: absolute; right: 6px; transform: translateY(-50%);
  font-size: 10px; font-variant-numeric: tabular-nums; color: var(--ink-soft);
}
.agw-daycol { position: relative; }
.agw-line { position: absolute; left: 0; right: 0; border-top: 1px solid var(--line); }
.agw-block {
  position: absolute;
  font-size: 11px; line-height: 1.25;
  padding: 2px 5px; border-radius: 0;
  background: color-mix(in srgb, var(--accent) 14%, var(--surface));
  border-left: 3px solid var(--accent);
  overflow: hidden;
}
.agw-block b { font-variant-numeric: tabular-nums; }

/* Soortkleuren, gelijk aan de dagweergave zodat je niet hoeft te herleren. */
.agw-bar.ag-shift, .agw-block.ag-shift { border-left-color: var(--accent); }
.agw-bar.ag-breakfast, .agw-block.ag-breakfast { border-left-color: var(--gold); }
.agw-bar.ag-housekeeping, .agw-block.ag-housekeeping { border-left-color: var(--inhouse); }
.agw-bar.ag-appointment, .agw-block.ag-appointment { border-left-color: var(--departure); }
.agw-bar.ag-absence {
  border-left-color: var(--line); color: var(--ink-soft); background: transparent;
}

/* Dagmelding boven het zaalrooster: feestdag of afwezigheid. Geen boeking, dus ook
   niet de vorm van een kaart — een strook die je leest voor je naar het rooster kijkt. */
.daynotice {
  margin: 0 0 10px; padding: 8px 12px;
  border-left: 3px solid var(--gold);
  background: color-mix(in srgb, var(--gold) 12%, var(--surface));
  font-size: 14px;
}
.daynotice + .daynotice { margin-top: -4px; }

/* Vastgehouden optie: de zaal is geclaimd maar nog niet geboekt. Bewust een gestreepte
   rand en geen andere kleur — kleur is in dit raster al bezet door het SOORT item, en
   een tweede betekenis op dezelfde as maakt beide onleesbaar. Het blok blijft even
   groot: de zaal is niet half bezet. */
.agw-block.agw-optie {
  border-left-style: dashed;
  background: color-mix(in srgb, var(--accent) 6%, var(--surface));
  color: var(--ink-soft);
}

/* --- Weekweergave als lijst (telefoon) ---
   Zelfde vorm als "Mijn diensten" op Mijn dag: het team hoeft maar één patroon te lezen.
   Zeven dagen onder elkaar in plaats van drie-van-zeven naast elkaar. */
.agl {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); box-shadow: var(--shadow);
}
.agl-dag {
  display: flex; align-items: baseline; gap: 12px;
  padding: 9px 12px; border-top: 1px solid var(--line);
}
.agl-dag:first-child { border-top: none; }
.agl-kop {
  min-width: 6.6rem; font-size: 13px; color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}
/* Vandaag springt eruit; een lege dag valt juist weg — je zoekt de dagen waarop iets is. */
.agl-vandaag .agl-kop { color: var(--accent); font-weight: 600; }
.agl-items { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.agl-item {
  display: flex; gap: 7px; align-items: baseline; font-size: 13.5px;
  border-left: 3px solid var(--inhouse); padding-left: 8px;
}
.agl-tijd { font-weight: 600; color: var(--accent); font-variant-numeric: tabular-nums; }
.agl-wat { font-weight: 500; }
.agl-leeg { color: var(--ink-soft); font-size: 13.5px; }
/* Soortkleuren gelijk aan de dagweergave, zodat je niets hoeft te herleren. */
.agl-item.ag-shift { border-left-color: var(--accent); }
.agl-item.ag-breakfast { border-left-color: var(--gold); }
.agl-item.ag-housekeeping { border-left-color: var(--inhouse); }
.agl-item.ag-appointment { border-left-color: var(--departure); }
.agl-item.ag-absence { border-left-color: var(--line); }
.agl-item.ag-absence .agl-wat { color: var(--ink-soft); font-weight: 400; }

/* Weekweergave op de Agenda-tab: dagkoppen tussen de kaarten. */
.ag-day {
  font-size: 13px; font-weight: 600; letter-spacing: 0.03em;
  color: var(--ink-soft); text-transform: capitalize;
  margin: 1.1rem 0 0.4rem; padding-bottom: 0.3rem;
  border-bottom: 1px solid var(--line);
}
.ag-day:first-child { margin-top: 0; }
.ag-day.ag-today { color: var(--accent); border-bottom-color: var(--accent); }
.ag-day-empty { margin: 0 0 0.2rem; opacity: 0.5; }
.date-nav button.active { background: var(--accent); color: var(--accent-ink); }

/* --- Ontbijt: afwijking t.o.v. Mews + wie het noteerde --- */
/* Een boeking kan na jouw invoer nog wijzigen. Dat is geen fout, maar je moet het
   wél zien — daarom een knop en geen stille correctie: soms zijn 2 couverts
   afgesproken terwijl er 4 slapen, en dat mag een import niet overschrijven. */
.bf-sync {
  border: 1px solid var(--gold); background: color-mix(in srgb, var(--gold) 10%, transparent);
  color: var(--gold); border-radius: 999px; padding: 4px 11px;
  font-size: 12px; font-weight: 600; white-space: nowrap; align-self: flex-start;
}
.bf-sync:hover { background: color-mix(in srgb, var(--gold) 20%, transparent); }
.bf-author { font-size: 11.5px; color: var(--ink-soft); flex-basis: 100%; }

/* --- Urenoverzicht (Klokken "Mijn uren" + Admin) --- */
.hours { display: flex; flex-direction: column; gap: 14px; }
.hours-period { font-size: 12.5px; color: var(--ink-soft); margin-bottom: 2px; }
.hours-person {
  background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px 14px;
}
.hours-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 10px; margin-bottom: 8px; padding-bottom: 8px;
  border-bottom: 1px solid var(--line);
}
.hours-name { font-weight: 600; font-size: 15px; }
.hours-total { font-size: 17px; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--accent); }
.hours-row {
  display: grid; grid-template-columns: 7.5rem 1fr auto;
  gap: 10px; padding: 4px 0; font-size: 13.5px;
}
.hours-day { color: var(--ink-soft); }
.hours-times { font-variant-numeric: tabular-nums; }
.hours-dur { font-variant-numeric: tabular-nums; color: var(--ink-soft); }
/* Een vergeten uitklok telt niet mee in het totaal — dus moet hij opvallen, anders
   verdwijnt een dienst stilletjes uit iemands week. */
.hours-open { color: var(--departure); font-weight: 600; }
/* Dezelfde regel, maar nu als knop: "niet uitgeklokt" was een doodlopende mededeling en
   is de ingang naar de reparatie geworden. Erft de kleur, want het is nog steeds dezelfde
   waarschuwing — alleen kun je er nu iets mee. */
button.hours-open {
  border: 1px dashed currentColor; background: transparent;
  border-radius: 0; padding: 2px 8px; font: inherit; font-weight: 600;
  color: var(--departure);
}
button.hours-open:hover { background: color-mix(in srgb, var(--departure) 12%, transparent); }
/* Corrigeren en historie zitten IN de tijdenkolom, naast het ✎-merkteken: het gaat
   allebei over de herkomst van deze regel. Stil van kleur, want op Admin staat dit bij
   élke dienst en een week uren mag geen knoppenveld worden. */
.hours-fix, .hours-hist {
  border: none; background: transparent; padding: 2px 6px; margin-left: 4px;
  font: inherit; font-size: 12px; color: var(--ink-soft); border-radius: 0;
}
.hours-fix:hover, .hours-hist:hover { color: var(--accent); text-decoration: underline; }
.hours-fix, .hours-hist, .hours-weg { text-decoration: underline dotted; }
/* Verwijderen draagt de vertrek-kleur: het is de enige knop in deze rij die iets weghaalt,
   en hij staat naast twee die dat niet doen. */
.hours-weg {
  border: none; background: transparent; padding: 2px 6px; margin-left: 4px;
  font: inherit; font-size: 12px; color: var(--departure); border-radius: 0;
}
.hours-weg:hover { text-decoration: underline; }
/* Over de volle breedte op een eigen regel: de historie is een uitweiding onder de
   dienst, geen vierde kolom die het raster van "Mijn uren" zou breken. */
.hours-histbox {
  grid-column: 1 / -1; margin: 4px 0 8px; padding: 8px 10px;
  background: color-mix(in srgb, var(--ink) 4%, transparent);
  border-left: 2px solid var(--line); font-size: 12.5px;
}
.hist-rij {
  display: flex; flex-wrap: wrap; gap: 4px 10px; padding: 3px 0;
  font-variant-numeric: tabular-nums;
}
.hist-rij + .hist-rij { border-top: 1px solid var(--line); }
.hist-wanneer { color: var(--ink-soft); min-width: 9.5rem; }
.hist-wie { font-weight: 600; }
/* Geverifieerd, in tegenstelling tot de naam ernaast (die is een keuze in localStorage).
   Daarom mag dit label kleur hebben en de naam niet. */
.hist-rol { font-weight: 500; color: var(--accent); font-size: 11.5px; }
/* De oude waarde doorgestreept: "hier stond iets anders" is de hele vraag die dit
   blokje beantwoordt, en dat lees je sneller dan je twee tijdvakken vergelijkt. */
.hist-van { color: var(--ink-soft); text-decoration: line-through; }
/* Een verhuizing tussen twee mensen is de ingrijpendste regel in dit blokje — er
   verschuiven uren — dus krijgt hij z'n eigen regel over de volle breedte. */
.hist-verhuis { flex-basis: 100%; color: var(--departure); }
.hours-note {
  margin-top: 8px; font-size: 12px; color: var(--departure);
  background: color-mix(in srgb, var(--departure) 10%, transparent);
  border-radius: 0; padding: 6px 9px;
}
@media (max-width: 560px) {
  .hours-row { grid-template-columns: 1fr auto; }
  .hours-day { grid-column: 1 / -1; }
}

/* --- Admin: weeknavigatie boven het urenoverzicht --- */
.admin-weeknav { margin-bottom: 14px; }
.admin-week-label {
  font-size: 14px; font-weight: 600; min-width: 9rem; text-align: center;
}

/* --- Indicatorbalk ---
   Twee getallen die tijdens een dienst veranderen, vastgezet onderaan. Vier pasten niet
   op 375px, en dat bleek geen ruimteprobleem: "gasten vannacht" en "couverts" liggen
   's ochtends al vast en horen in de briefing. Alleen wat verandert verdient een vaste
   plek in beeld.

   De onderste inset houdt de balk vrij van de home-indicator; `.app.met-daybar .content`
   reserveert de hoogte, zodat de laatste kaart er niet achter verdwijnt. */
.daybar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 20;
  display: flex; align-items: center; justify-content: center; gap: 22px;
  background: var(--surface);
  border-top: 1px solid var(--line);
  box-shadow: 0 -2px 12px rgba(0, 43, 60, 0.09);
  padding: 11px calc(16px + env(safe-area-inset-right, 0px))
           calc(11px + env(safe-area-inset-bottom, 0px)) calc(16px + env(safe-area-inset-left, 0px));
}
.app.met-daybar .content { padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)); }
.db-item { display: inline-flex; align-items: baseline; gap: 6px; font-size: 13px; color: var(--ink-soft); white-space: nowrap; }
.db-item b { font-size: 15px; color: var(--ink); font-variant-numeric: tabular-nums; }
.db-den { color: var(--ink-soft); font-size: 12px; margin-left: -4px; }
.db-dot { width: 7px; height: 7px; border-radius: 50%; align-self: center; flex: none; }
/* Klaar is klaar: geen kleurstip meer, alleen de bevestiging. */
.db-item.db-klaar { color: var(--ok); font-weight: 600; }
.db-item.db-klaar .db-dot { background: var(--ok); }

@media (prefers-color-scheme: dark) {
  .daybar { box-shadow: 0 -2px 14px rgba(0, 0, 0, 0.4); }
}

/* --- Automatische dagbriefing ---
   Zelfde vlak als de getypte briefing (.daily-note), maar inklapbaar: 's ochtends lees je
   hem, daarna moet het scherm van de aankomsten zijn. De cijferregel blijft altijd staan —
   dat is de kop én de samenvatting, dus ingeklapt verlies je niets wezenlijks. */
/* Subtieler dan de handgetypte briefing: dit is context, geen mededeling. Geen gevuld
   vlak en geen dikke accentrand meer — die trokken de aandacht van een blok dat je na
   één keer lezen dichtklapt. Alleen een lijn eronder, zoals de andere rustige banden. */
.daily-note.brief-auto {
  padding: 0;
  white-space: normal;
  background: transparent;
  border: none;
}
.brief-head {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: transparent; border: none; border-radius: 0;
  padding: 7px 2px; text-align: left; color: var(--ink-soft);
  font-size: 13px; font-weight: 500; min-height: 40px;
}
.brief-head .brief-lead { color: var(--ink); font-weight: 600; }
.brief-caret { color: var(--ink-soft); font-size: 14px; line-height: 1; transition: transform 0.15s; }
.daily-note.brief-open .brief-caret { transform: rotate(180deg); }
.brief-lead { flex: 1; }
/* Dicht is de rusttoestand: zonder .brief-open is er niets te zien behalve de kop. */
.brief-body { display: none; padding: 0 2px 10px; font-size: 13px; }
.daily-note.brief-open .brief-body { display: block; }
/* Valt er niets uit te klappen, dan is de kop geen knop: geen cursor, geen caret. */
.brief-head.brief-static { padding: 7px 2px; font-weight: 600; font-size: 13px; cursor: default; color: var(--ink); }
.brief-team { color: var(--ink); }
/* De WERKT/ONTBIJT/TAKEN-band binnen de uitklap. Geen eigen vlak meer — hij zit al in een
   blok, en een kader in een kader leest als twee dingen. */
.brief-team-band {
  display: flex; flex-wrap: wrap; gap: 0.2rem 1.4rem;
  margin-bottom: 5px; font-size: 13px;
}
.brief-team-band .tt-part { display: flex; gap: 0.4rem; align-items: baseline; }
.brief-team-band .tt-tasks { flex-basis: 100%; }
/* Handgetypt: pre-wrap zodat regeleindes blijven staan zoals de balie ze typte. */
.brief-note { color: var(--ink); white-space: pre-wrap; }
/* De attentieregel is de enige die om een handeling vraagt, dus die krijgt kleur —
   en hij staat er meestal niet, waardoor hij opvalt op de dag dat het telt. */
.brief-let { margin-top: 4px; color: var(--departure); font-weight: 600; }
/* Wie de briefing typte en wanneer. Klein en grijs: het is context bij het bericht,
   niet het bericht zelf — maar het moet er staan, want dezelfde zin van vanochtend en
   van vier dagen geleden vragen om een ander oordeel. */
.brief-af { margin-top: 6px; font-size: 12px; color: var(--ink-soft); font-style: italic; }

/* --- Admin: de dagenstrook van de briefing ---
   Waarom dit bestaat: met de briefing als losse settings-sleutel was "welke dagen hebben
   een eigen briefing" geen vraag die je kón stellen — je moest dag voor dag klikken, en
   omdat het invoerveld zichzelf vult met de gegenereerde tekst zag élke dag er gevuld
   uit. De stip is dus het hele punt van dit element, niet een versiering. */
.brief-dagen {
  display: flex; gap: 4px; overflow-x: auto; padding-bottom: 6px; margin-bottom: 12px;
  scrollbar-width: thin;
}
.brief-dag {
  flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 1px;
  min-width: 3rem; padding: 6px 4px 4px; border: 1px solid var(--line); border-radius: 0;
  background: var(--surface); color: var(--ink-soft); font: inherit; font-size: 12px;
}
.brief-dag:hover { border-color: var(--accent); color: var(--ink); }
.brief-dag-naam { text-transform: lowercase; }
.brief-dag-num { font-weight: 600; font-size: 14px; color: var(--ink); }
/* Vaste hoogte, ook zonder stip: anders springt de hele strook een paar pixels zodra er
   ergens een briefing bij komt, en dat leest als een layoutfout. */
.brief-dag-stip { height: 10px; line-height: 10px; font-size: 10px; color: var(--accent); }
.brief-dag.heeft { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
.brief-dag.actief {
  border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--surface));
}
.brief-dag.actief .brief-dag-num { color: var(--accent); }

/* --- Admin: eerdere versies van een briefing --- */
.brief-hist { margin-top: 12px; font-size: 13px; }
.brief-hist > summary { cursor: pointer; color: var(--ink-soft); padding: 4px 0; }
.brief-hist > summary:hover { color: var(--accent); }
.brief-versie { padding: 8px 0; border-top: 1px solid var(--line); }
.brief-versie-kop {
  display: flex; gap: 10px; justify-content: space-between;
  font-size: 12px; color: var(--ink-soft); margin-bottom: 3px;
}
.brief-versie-wie { font-weight: 600; }
.brief-versie-tekst { white-space: pre-wrap; color: var(--ink); font-size: 12.5px; }
/* Een wissing is óók een versie, en juist degene die je komt opzoeken ("hier stond
   iets — wie heeft dat weggehaald?"). Zonder deze regel is het een lege rij. */
.brief-versie-leeg { color: var(--ink-soft); font-style: italic; }

/* De updatebalk leent de vorm van de installatiehint maar niet z'n rust: die laatste mag
   je negeren, deze betekent dat je naar verouderde gegevens kijkt. */
.update-hint {
  background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
}

/* --- Installatiehint ---
   Zelfde vorm als de dagbriefing: dit is een mededeling boven het scherm, geen alarm.
   Verdwijnt zodra de app standalone draait of je 'm wegklikt. */
.install-hint {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  background: color-mix(in srgb, var(--accent-soft) 18%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent-soft) 55%, var(--line));
  border-left: 4px solid var(--accent);
  border-radius: 0;
  padding: 10px 12px;
  margin-bottom: 18px;
  font-size: 13.5px;
  color: var(--ink);
}
.ih-text { flex: 1; min-width: 180px; }
.ih-do {
  border: none; background: var(--accent); color: var(--accent-ink);
  border-radius: 0; padding: 9px 15px; font-weight: 600; font-size: 13px;
  white-space: nowrap; min-height: 40px;
}
.ih-do:hover { filter: brightness(1.05); }
.ih-close {
  border: none; background: transparent; color: var(--ink-soft);
  font-size: 20px; line-height: 1; padding: 0 6px;
  min-width: 40px; min-height: 40px;
}
.ih-close:hover { color: var(--ink); }

/* ===== Aanraakbediening =====
   Twee dingen die uitsluitend op een touchscreen misgaan en die je op een balie-desktop
   dus nooit tegenkomt:

   1. iOS zoomt de héle pagina in zodra je een veld met font-size < 16px aantikt, en
      zoomt daarna niet vanzelf terug. Op het ontbijtscherm was dat: één tijd invullen,
      en de rest van je dienst tegen een ingezoomd scherm aankijken.
   2. Alles onder ~44px is met een duim niet betrouwbaar te raken (Apple HIG).

   Bewust achter `pointer: coarse` en niet achter een breedte-breakpoint: het gaat om
   het invoerapparaat, niet om de schermmaat. Een balie-desktop op 1280px en een tablet
   op 1280px hebben hier tegengestelde behoeften. Zo houdt de muis-kant z'n compacte
   maatvoering — dit dagbord toont twintig regels tegelijk en dat moet zo blijven.

   Staat aan het eind van het bestand omdat de meeste regels hieronder dezelfde
   specificiteit hebben als wat ze overschrijven; volgorde beslist dan. */
@media (pointer: coarse) {
  /* Precies de velden die onder 16px zaten. De rest (login, klokken, identiteit,
     datumvelden) erft `font: inherit` en stond al goed. */
  .eta-input,
  .field input,
  .admin-add input,
  .admin-row input,
  #admin-note,
  /* Zat op de browserstandaard van 13,3px en ontbrak hier daardoor: onder 16px zoomt
     Safari op iOS in zodra je het veld aanraakt, en zoomt daarna niet terug. */
  #push-tekst {
    font-size: 16px;
  }

  .eta-input { height: 44px; }
  .field input { height: 44px; }

  .date-nav button { width: 44px; height: 44px; }
  .date-nav .ghost { width: auto; min-height: 44px; }
  .date-nav input { height: 44px; }

  .vm, .at, .fold-btn, .clock-out-btn, .bf-sync, .switch { min-height: 44px; }
  .ghost-btn { min-height: 44px; padding: 4px 12px; }
  .identity-btn { min-height: 44px; }
  .admin-add input, .admin-add button, .admin-row button,
  .identity-add input, .identity-add button { height: 44px; }

  /* Het kruisje in een medewerkerspil was ~26x18px. De pil groeit mee; op Admin is
     dichtheid geen eis. */
  .staff-del {
    min-width: 44px; min-height: 44px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  .staff-pill { padding: 2px 2px 2px 14px; }
}

/* --- Meldingen (Admin) --- */
.push-verstuur { margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--line); }
.push-verstuur h3 { font-size: 15px; margin: 0 0 4px; }
/* Het enige tekstvak in de app dat nooit opmaak kreeg: zonder deze regels valt het terug
   op de browserstandaard (monospace, 13,3px) terwijl de dagbriefing ernaast en het
   meldvenster de systeemfont op 14px gebruiken. Zelfde set als #admin-note. */
.push-verstuur textarea {
  width: 100%; margin-bottom: 8px; resize: vertical;
  font-family: inherit; font-size: 14px;
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink);
  border-radius: 0; padding: 10px 12px;
}
.push-devices { margin-top: 16px; }
.push-lijst { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.push-lijst li {
  display: flex; justify-content: space-between; align-items: baseline; gap: 12px;
  background: var(--surface-2); border: 1px solid var(--line);
  border-radius: 8px; padding: 8px 12px; font-size: 14px;
}
/* Laatst ontvangen is de enige manier om "er viel niets te melden" te onderscheiden
   van "dit toestel is stuk" — web push valt stil zonder foutmelding. Zacht gezet,
   want het is context en geen kop. */
.push-laatst { color: var(--ink-soft); font-size: 12px; white-space: nowrap; }

/* ============================================================
   Iets melden — zwevende knop + venster

   GEEN ronde FAB. De site draait op rechte hoeken (--radius: 0) en dat is
   volgens de kop van dit bestand het sterkste merksignaal; een cirkel
   rechtsonder is precies het soort component dat je uit een ander project
   meeneemt en waarmee de huisstijl stilletjes verwatert.
   ============================================================ */
.fb-open {
  position: fixed; z-index: 30;
  right: calc(16px + env(safe-area-inset-right, 0px));
  bottom: calc(16px + env(safe-area-inset-bottom, 0px));
  display: inline-flex; align-items: center; gap: 8px;
  min-height: 44px; padding: 0 16px;
  border: 1px solid var(--line); border-radius: 0;
  background: var(--surface); color: var(--ink);
  font-size: 14px; font-weight: 600;
  /* Zachter dan var(--shadow): dit ding zweeft de hele dag over elk scherm. Een knop
     die permanent in beeld staat mag opvallen als je 'm zoekt en verder wegvallen. */
  box-shadow: 0 1px 2px rgba(0, 43, 60, 0.06), 0 6px 18px rgba(0, 43, 60, 0.10);
  transition: transform 120ms ease, box-shadow 120ms ease, border-color 120ms ease;
}
.fb-open:hover {
  border-color: var(--accent);
  transform: translateY(-1px);
  box-shadow: 0 2px 4px rgba(0, 43, 60, 0.08), 0 10px 26px rgba(0, 43, 60, 0.14);
}
.fb-open:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.fb-open-icoon { font-size: 16px; line-height: 1; }
/* Wie 'reduce motion' aan heeft, krijgt de kleurwissel zonder het opkomen. */
@media (prefers-reduced-motion: reduce) {
  .fb-open { transition: border-color 120ms ease; }
  .fb-open:hover { transform: none; }
}

/* De daybar staat fixed onderaan (alleen op Vandaag) en is ~50px hoog. Zonder deze
   regel legt de knop zich daar bovenop en dekt hij de twee getallen af die er juist
   toe doen tijdens een dienst. */
.app.met-daybar .fb-open { bottom: calc(78px + env(safe-area-inset-bottom, 0px)); }

/* Op een smal scherm alleen het icoon: het label kost breedte die de laatste
   kaartkolom nodig heeft, en 💬 in een petrol vlak is op zichzelf duidelijk genoeg. */
@media (max-width: 560px) {
  .fb-open { padding: 0 14px; }
  .fb-open-label { display: none; }
  .fb-open-icoon { font-size: 18px; }
}

.fb-back {
  position: fixed; inset: 0; z-index: 40;
  display: flex; align-items: center; justify-content: center;
  padding: 16px;
  background: rgba(0, 43, 60, 0.45);
}
.fb-card {
  width: 100%; max-width: 460px;
  max-height: calc(100vh - 32px); overflow-y: auto;
  background: var(--surface); border: 1px solid var(--line);
  border-radius: 0; box-shadow: var(--shadow);
  padding: 20px;
}
.fb-titel { margin: 0 0 6px; font-size: 17px; font-weight: 600; color: var(--ink); }
.fb-hint { margin: 0 0 14px; font-size: 14px; line-height: 1.45; color: var(--ink-soft); }

.fb-kinds { display: flex; gap: 8px; margin-bottom: 12px; flex-wrap: wrap; }
.fb-kind {
  flex: 1 1 0; min-height: 40px; padding: 0 10px;
  border: 1px solid var(--line); border-radius: 0;
  background: var(--surface-2); color: var(--ink);
  font-size: 14px; font-weight: 600;
}
.fb-kind:hover { border-color: var(--accent); }
/* Actief = gevuld vlak, niet alleen een randje: op een zonnig terras is een
   randkleur geen signaal. Zelfde redenering als bij de bezig-staat van de login. */
.fb-kind.actief { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
.fb-kind:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

.fb-text {
  width: 100%; box-sizing: border-box;
  min-height: 110px; resize: vertical;
  border: 1px solid var(--line); border-radius: 0;
  background: var(--surface-2); color: var(--ink);
  font: inherit; font-size: 15px; line-height: 1.45;
  padding: 10px 12px;
}
.fb-text:focus { outline: 2px solid var(--accent); outline-offset: 1px; }

.fb-error { margin: 10px 0 0; font-size: 14px; color: var(--danger); }

.fb-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
.fb-ghost {
  min-height: 42px; padding: 0 16px;
  border: 1px solid var(--line); border-radius: 0;
  background: transparent; color: var(--ink-soft); font-weight: 600;
}
.fb-ghost:hover { color: var(--accent); border-color: var(--accent); }
.fb-send {
  min-height: 42px; padding: 0 20px;
  border: none; border-radius: 0;
  background: var(--accent); color: var(--accent-ink); font-weight: 600;
}
.fb-send:hover { filter: brightness(1.05); }
.fb-send[disabled] { opacity: 0.6; }
.fb-ghost:focus-visible, .fb-send:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.fb-dank-kop { margin: 0 0 6px; font-size: 16px; font-weight: 600; color: var(--ink); }

@media (pointer: coarse) {
  /* Onder 16px zoomt iOS de pagina in bij focus en niet meer terug — zelfde reden
     als bij de andere velden hierboven. */
  .fb-text { font-size: 16px; }
  .fb-kind, .fb-ghost, .fb-send { min-height: 44px; }
}

/* Meldingen teruglezen op Admin. */
/* Ruimte om de "toon oudere"-knop, die onder de laatste melding hangt. */
.fb-meer { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line); }

.admin-feedback { display: flex; flex-direction: column; gap: 10px; }
.fb-item { border: 1px solid var(--line); background: var(--surface-2); padding: 12px 14px; }
.fb-item-kop { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
/* Pil-vorm: dit is een etiket, geen vlak — zie de kop van dit bestand. */
.fb-soort {
  border-radius: 999px; padding: 2px 10px;
  font-size: 12px; font-weight: 600;
  background: var(--accent); color: var(--accent-ink);
}
.fb-soort-probleem { background: var(--departure); }
.fb-soort-idee { background: var(--arrival); }
.fb-soort-anders { background: var(--inhouse); }
.fb-item-wie { font-size: 13px; font-weight: 600; color: var(--ink); }
.fb-item-tijd { font-size: 12px; color: var(--ink-soft); margin-left: auto; }
.fb-item-tekst { margin: 0; font-size: 15px; line-height: 1.45; color: var(--ink); white-space: pre-wrap; }
.fb-item-waar { margin: 6px 0 0; font-size: 12px; color: var(--ink-soft); }

/* Schermafdruk kiezen in het meldvenster. */
.fb-beeld { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }
.fb-kies { min-height: 38px; }
.fb-beeld-hint { font-size: 13px; color: var(--ink-soft); }
.fb-voorbeeld { position: relative; margin-top: 10px; }
/* Bewust GEEN max-height met object-fit: contain. Dat geeft letterboxing — de <img> is
   dan groter dan de zichtbare afbeelding — en precies dat maakt het omrekenen van een
   sleepgebaar naar beeldpixels onbetrouwbaar: je kader landt naast wat je aanwees.
   Vandaar op ware breedte; een lange afdruk laat de kaart gewoon scrollen. */
.fb-beeld-weg {
  position: absolute; top: 6px; right: 6px;
  width: 32px; height: 32px; line-height: 1;
  border: 1px solid var(--line); border-radius: 0;
  background: var(--surface); color: var(--ink); font-size: 18px; font-weight: 600;
}
.fb-beeld-weg:hover { border-color: var(--danger); color: var(--danger); }

/* Schermafdruk en afhandeling in de lijst op Admin. */
.fb-item-beeld { display: block; margin-top: 10px; }
.fb-item-beeld img {
  display: block; width: 100%; max-height: 260px; object-fit: contain;
  border: 1px solid var(--line); background: var(--surface);
}
.fb-item-acties { display: flex; justify-content: flex-end; margin-top: 10px; }
.fb-status-btn {
  min-height: 32px; padding: 0 12px;
  border: 1px solid var(--line); border-radius: 999px;
  background: var(--surface); color: var(--ink-soft);
  font-size: 12px; font-weight: 600;
}
.fb-status-btn:hover { border-color: var(--accent); color: var(--accent); }
.fb-status-btn[disabled] { opacity: 0.5; }
/* Afgedaan zakt naar de achtergrond: de lijst moet laten zien wat er nog ligt. Niet
   verbergen — "waar is mijn melding gebleven" is erger dan een grijze regel. */
.fb-item.fb-is-afgedaan { opacity: 0.55; }
.fb-item.fb-is-afgedaan .fb-status-btn { border-color: var(--ok); color: var(--ok); }
.fb-item.fb-is-opgepakt { border-left: 3px solid var(--accent-soft); }

@media (pointer: coarse) {
  .fb-kies, .fb-status-btn { min-height: 44px; }
  .fb-beeld-weg { width: 44px; height: 44px; }
}

/* Aanwijzen op de schermafdruk: sleeplaag + kader. */
.fb-doek { position: relative; line-height: 0; }
.fb-doek img { width: 100%; height: auto; display: block; border: 1px solid var(--line); }
.fb-sleep {
  position: absolute; inset: 0; cursor: crosshair;
  /* Zonder dit scrollt een veeg op een tablet de pagina in plaats van een kader te tekenen. */
  touch-action: none;
}
.fb-kader {
  position: absolute; pointer-events: none;
  border: 2px solid #c0392b;
  background: rgba(192, 57, 43, 0.10);
}
.fb-beeld-acties { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.fb-mini { min-height: 34px; padding: 0 12px; font-size: 13px; }
@media (pointer: coarse) { .fb-mini { min-height: 44px; } }

/* --- Admin → Offertes ------------------------------------------------------------
   Zelfde bouwstenen als de meldingenlijst hierboven: rechte hoeken, --surface-2 als
   vlak, een pil voor het etiket. Het enige eigen idee is de dagenteller, want dát is
   waar je oog naartoe moet — niet naar de bedrijfsnaam. */
.off-lijst { display: grid; gap: 10px; }
.off-item { border: 1px solid var(--line); background: var(--surface-2); padding: 12px 14px; }

/* Al achteraan gezeten: zichtbaar afgezwakt, maar NIET verborgen — na twee weken stilte wil je
   'm opnieuw zien staan. Opacity en niet display:none. */
.off-item--gedaan { opacity: 0.62; }
.off-item--stil { background: transparent; }

.off-kop { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 6px; }
.off-naam { font-size: 15px; font-weight: 600; color: var(--ink); }
.off-nr {
  border-radius: 999px; padding: 2px 10px;
  font-size: 12px; font-weight: 600;
  background: var(--inhouse); color: var(--accent-ink);
}
/* De teller staat rechts en is de enige plek met kleurverloop in betekenis: vanaf vijf
   dagen wordt 'ie waarschuwend. Vijf omdat dat de afspraak uit de meeting is
   ("automatische mail na 5 dagen"), niet omdat het mooi uitkomt. */
.off-dagen { margin-left: auto; font-size: 12px; font-weight: 600; color: var(--ink-soft); }
.off-dagen--lang { color: var(--accent-ink); background: var(--departure);
  border-radius: 999px; padding: 2px 10px; }

.off-regel { font-size: 13px; color: var(--ink-soft); margin: 2px 0; }
.off-contact { color: var(--ink); }
.off-chase { font-size: 12px; color: var(--ok); margin: 6px 0 0; font-weight: 600; }

.off-acties { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; align-items: center; }
.off-btn {
  font-size: 13px; padding: 6px 12px; border: 1px solid var(--line);
  background: var(--surface); color: var(--ink); border-radius: 0;
  text-decoration: none; cursor: pointer;
}
/* Eén hoofdknop per kaart — dezelfde regel als op Mijn dag en Admin (commit ec24fb7).
   Mailen is de handeling; aanvinken en 'In MICE' zijn ondersteunend. */
.off-btn--mail { background: var(--accent); color: var(--accent-ink); border-color: var(--accent);
  font-weight: 600; }
.off-btn:hover { border-color: var(--accent); }
.off-chase-btn { color: var(--ok); border-color: var(--ok); }
.off-btn:disabled { opacity: 0.5; cursor: default; }
/* --- Gastpagina's in de admin ---------------------------------------- */
/* Bewust dezelfde bouwstenen als de rest van de admin (.admin-card, .save-state,
   .ghost-btn). Dit is een beheerscherm, geen plek voor een eigen vormtaal.
   De twee markeringen (geel/blauw) zijn wél overgenomen uit de gastpagina, want
   ze betekenen daar precies hetzelfde — dat is de hele koppeling die dit scherm
   bruikbaar maakt als invullijst. */

.gp-kop {
  font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--ink-soft); margin: 18px 0 8px;
}

.gp-lijst { display: flex; flex-direction: column; gap: 6px; }

.gp-rij {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius);
}

.gp-gast { font-weight: 600; }
.gp-bij { color: var(--ink-soft); font-size: 12px; }

/* De kamerkiezer staat tussen de losse feiten op de kaart en hoort daar niet bovenuit te
   springen: hij draagt dezelfde maat als .gp-bij en wordt pas een echt bedienbaar element
   als je 'm aanwijst. Zonder die ingetogenheid trekt een keuzelijst per boeking de hele
   lijst uit balans, en dit is informatie die je meestal alleen leest. */
.gp-kamer-kies {
  font-size: 12px; color: var(--ink-soft);
  padding: 2px 6px; border: 1px solid var(--line); border-radius: var(--radius);
  background: transparent; max-width: 160px;
}
.gp-kamer-kies:hover:not(:disabled) { border-color: var(--accent); color: var(--ink); }
.gp-kamer-kies:disabled { opacity: 0.45; cursor: not-allowed; }

.gp-st {
  font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase;
  padding: 2px 8px; border-radius: 999px; border: 1px solid var(--line);
}
.gp-st--concept { color: var(--ink-soft); }
.gp-st--goed { color: var(--accent); border-color: var(--accent); }
.gp-st--in { color: var(--danger); border-color: var(--danger); }

/* Een actieve link is de enige stand waarin er iets buiten de deur werkt. Die hoort
   op te vallen — niet als waarschuwing, wel als feit dat je ziet zonder te zoeken. */
.gp-link-aan { color: var(--accent); font-weight: 600; }

/* --- Actief & reacties, Analytics ------------------------------------- */

/* Filterknoppen. Dezelfde vorm als de weergavekiezers elders (view-modes), want het is
   dezelfde handeling: hetzelfde lijstje, een andere snede. */
.gp-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 12px;
}

.gp-filter {
  font: inherit;
  font-size: 0.85rem;
  padding: 6px 12px;
  /* 36px raakvlak: dit is een balietablet, geen muisscherm. */
  min-height: 36px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: transparent;
  color: inherit;
  cursor: pointer;
}

.gp-filter:hover { border-color: var(--accent); }

.gp-filter.active {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-ink);
}

/* De reacties van één gast, onder z'n regel. Volle breedte, want ze horen bij de rij
   erboven en niet in de kolommenrij ernaast. */
.gp-reacties {
  flex-basis: 100%;
  margin: 6px 0 0;
  padding-left: 1.1rem;
  font-size: 0.9rem;
}

.gp-reactie { margin: 2px 0; }

/* Alleen wat nog ANTWOORD nodig heeft valt op. Zou elke reactie oplichten, dan is een
   afgehandelde sauna net zo luid als een gast die nog wacht — en dan kijkt niemand meer. */
.gp-reactie--open { font-weight: 600; }

.gp-open-reacties {
  font-size: 0.8rem;
  font-weight: 600;
  padding: 2px 8px;
  border-radius: 999px;
  background: var(--danger);
  color: #fff;
}

.gp-views { font-size: 0.85rem; color: var(--ink-soft); font-variant-numeric: tabular-nums; }

/* "Nog niet geopend" bij een aankomst die eraan komt. Dít is het hele signaal van het
   analytics-paneel, dus het mag de kleur van een probleem hebben — maar alleen zolang
   de aankomst nog moet komen; daarna is het een constatering. Zie renderGastAnalytics(). */
.gp-ongeopend {
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--danger);
}
/* Een verlengde pagina wijkt af van de regel; dat hoort te zien te zijn zonder
   dat je de datum met de vertrekdatum hoeft te vergelijken. */
.gp-verlengd { color: var(--accent); font-weight: 600; }

.gp-acties { margin-left: auto; display: flex; gap: 6px; flex-wrap: wrap; }
.gp-act {
  font-size: 12px; padding: 4px 10px; border-radius: var(--radius);
  border: 1px solid var(--line); background: var(--surface); color: inherit; cursor: pointer;
}
.gp-act:hover { border-color: var(--accent); }
.gp-act--weg:hover { border-color: var(--danger); color: var(--danger); }

/* De Openen-link draagt .gp-act voor de vorm, maar is een <a>: die erft geen knop-opmaak. */
a.gp-act {
  display: inline-flex;
  align-items: center;
  text-decoration: none;
  color: inherit;
}

/* Uitgezet omdat de admin-pincode nog op slot zit. Een <a> kent geen `disabled`, dus de
   staat is hier zichtbaar én de klik wordt in app.js tegengehouden — allebei nodig. */
.gp-open.is-uit {
  opacity: 0.45;
  cursor: not-allowed;
}

/* De teller met open punten. Staat bovenaan de Inhoud-tab en verdwijnt zodra alles is
   ingevuld — een teller op nul die blijft staan is ruis. */
.gp-openpunten {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  margin: 10px 0 4px; padding: 8px 10px;
  border: 1px solid var(--open, #d9a441); border-radius: var(--radius);
  background: color-mix(in srgb, var(--open, #d9a441) 10%, transparent);
  font-size: 13px;
}
.gp-openpunten .ghost-btn { margin-left: auto; }
.gp-openpunten .ghost-btn.is-aan {
  border-color: var(--accent); color: var(--ink); font-weight: 600;
}

/* De kop van een kamerkaart: altijd zichtbaar, want dit is waar je de kamer aan herkent. */
.gp-kamerkop {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  padding: 8px 10px 0;
}
.gp-kamernaam { font-weight: 600; }

/* De invulvelden klappen uit; de kaart eromheen niet. Zie de kop van renderGastInhoud:
   wat je moet kunnen openen staat open, wat je soms bijwerkt klapt uit. */
.gp-kamer-velden > summary {
  cursor: pointer; padding: 6px 10px;
  font-size: 12px; color: var(--ink-soft);
}
.gp-kamer-velden > summary:hover { color: var(--ink); }

/* De ingangen op een kamerkaart: eerst het template, daarna de boekingen die op die kamer
   staan. Op één regel met wikkeling, want het zijn nevengeschikte bestemmingen en geen
   lijst met een volgorde die iets betekent. */
.gp-kamer-ingangen {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  padding: 6px 10px 0;
}

.gp-kamer-ingang {
  font-size: 12px; text-decoration: none; color: var(--ink-soft);
  padding: 3px 8px; border: 1px solid var(--line); border-radius: var(--radius);
}
.gp-kamer-ingang:hover { border-color: var(--accent); color: var(--ink); }

/* Het template is de hoofdbestemming van de twee en mag dat laten zien — de boekingen
   eronder zijn er soms wel en soms niet, deze knop staat er altijd. */
.gp-kamer-template { color: var(--ink); border-color: var(--ink-soft); }

/* Uitgezet omdat de admin-pincode nog op slot zit; alleen de boekingslinks kunnen dit
   krijgen. Zelfde behandeling als .gp-open elders: een <a> kent geen `disabled`, dus de
   staat is hier zichtbaar en de klik wordt in app.js tegengehouden. */
.gp-kamer-ingang.is-uit { opacity: 0.45; cursor: not-allowed; }

/* De volgordepijltjes staan rechts in de kop van een blok. Rustig, want je gebruikt ze
   zelden — maar wél altijd zichtbaar, want volgorde beoordeel je door de lijst te
   overzien en niet door blokken open te klappen. */
.gp-volgorde { margin-left: auto; display: inline-flex; gap: 2px; }

.gp-op, .gp-neer {
  font-size: 12px; line-height: 1;
  padding: 2px 6px; border: 1px solid var(--line); border-radius: var(--radius);
  background: transparent; color: var(--ink-soft); cursor: pointer;
}
.gp-op:hover:not(:disabled), .gp-neer:hover:not(:disabled) {
  border-color: var(--accent); color: var(--ink);
}
.gp-op:disabled, .gp-neer:disabled { opacity: 0.45; cursor: not-allowed; }

.gp-inhoud { display: flex; flex-direction: column; }

.gp-item { border: 1px solid var(--line); border-radius: var(--radius); margin-bottom: 6px; }
.gp-item > summary {
  cursor: pointer; padding: 8px 10px; display: flex; align-items: center;
  gap: 8px; flex-wrap: wrap;
}
/* Wat nog aandacht vraagt, staat standaard open. Anders is de invullijst een rij
   dichtgeklapte driehoekjes en moet je zoeken naar wat er nog moet. */
.gp-item--open > summary { background: color-mix(in srgb, var(--accent) 6%, transparent); }

.gp-velden { display: flex; flex-direction: column; gap: 8px; padding: 10px; }
.gp-velden label { display: flex; flex-direction: column; gap: 3px; font-size: 12px; color: var(--ink-soft); }
.gp-velden input[type="text"], .gp-velden input:not([type]), .gp-velden textarea, .gp-velden select {
  font: inherit; padding: 6px 8px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--bg); color: inherit;
}
.gp-velden textarea { resize: vertical; }
.gp-vink { flex-direction: row !important; align-items: center; gap: 6px !important; }
.gp-opslaan { display: flex; align-items: center; gap: 8px; margin-top: 4px; }

/* Dezelfde twee markeringen als op de gastpagina — zie public/kamer.css. */
.gp-item mark.open, .admin-hint mark.open {
  background: #fdf3d3; color: #6b5310; padding: 1px 6px; border-radius: 3px; font-size: 11px;
}
.gp-item mark.bron, .admin-hint mark.bron {
  background: #dbeaf3; color: #1d4d63; padding: 1px 6px; border-radius: 3px; font-size: 11px;
}

/* Het briefje bij "Ik heb gechased". Verving een prompt(): niet te stylen, ziet er op
   Windows uit als een systeemfout, en blokkeert de pagina voor iets dat optioneel is. */
.off-briefje { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; align-items: center; }
.off-briefje-tekst {
  flex: 1; min-width: 220px; height: 34px; padding: 0 10px;
  border: 1px solid var(--line); background: var(--surface);
  color: var(--ink); border-radius: 0; font-size: 13px;
}
.off-briefje-tekst:focus { outline: none; border-color: var(--accent); }
/* Op een balietablet is 34px te krap om te raken; dezelfde regel als .fb-mini. */
@media (pointer: coarse) {
  .off-briefje-tekst { height: 44px; }
  .off-briefje .off-btn { min-height: 44px; }
}
.off-melding { font-size: 13px; color: var(--departure); margin: 8px 0 0; }

/* --- Dialoogvenster (vervangt confirm/prompt) -------------------------------------
   Zelfde bouwstenen als de login-kaart: rechte hoeken, --surface als vlak, één
   gevulde hoofdknop. Geen eigen vormtaal — dit venster hoort niet op te vallen,
   het hoort te stoppen. */
.dialoog-laag {
  position: fixed; inset: 0; z-index: 100;
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
  background: rgba(0, 35, 47, 0.55);
}
.dialoog-kaart {
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: var(--shadow); padding: 22px 24px;
  width: 100%; max-width: 460px; max-height: 90vh; overflow-y: auto;
}
.dialoog-kaart h2 { font-size: 17px; margin: 0 0 8px; color: var(--ink); }
#dialoog-tekst {
  font-size: 14px; color: var(--ink-soft); margin: 0 0 16px;
  /* De tekst kan een citaat met regelovergangen bevatten (het pushbericht). */
  white-space: pre-wrap;
}
.dialoog-veldrij { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 16px; }
.dialoog-veldrij label { font-size: 13px; color: var(--ink-soft); width: 100%; }
#dialoog-veld {
  flex: 1; min-width: 200px; height: 40px; padding: 0 12px;
  border: 1px solid var(--line); background: var(--surface-2);
  color: var(--ink); border-radius: 0; font-size: 14px;
}
#dialoog-veld:focus { outline: none; border-color: var(--accent); }
.dialoog-acties { display: flex; gap: 10px; justify-content: flex-end; align-items: center; }
.dialoog-acties button {
  min-height: 40px; padding: 0 18px; border-radius: 0; font-size: 14px;
  border: 1px solid var(--accent); background: var(--accent); color: var(--accent-ink);
  font-weight: 600;
}
.dialoog-acties .ghost-btn {
  border: 1px solid var(--line); background: transparent; color: var(--ink-soft);
  font-weight: 400;
}
.dialoog-acties .ghost-btn:hover { color: var(--accent); border-color: var(--accent); }
/* Onomkeerbaar: rood, en de focus ligt op Annuleren — zie dialoogOpen() in app.js. */
.dialoog-acties .gevaarlijk { background: var(--danger); border-color: var(--danger); }
@media (pointer: coarse) {
  .dialoog-acties button, #dialoog-veld { min-height: 44px; }
}

/* --- Admin: de prullenbak ---
   Verwijderde diensten staan ONDER het overzicht, niet ertussen: ze tellen nergens in mee
   en zouden een weektotaal onleesbaar maken — precies het bezwaar waarom ze weg zijn. */
.ah-prullenbak {
  display: flex; align-items: center; gap: 6px;
  margin: 8px 0 0; font-size: 12.5px; color: var(--ink-soft);
}
.prullenbak { margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--line); }
.prul-kop { margin: 0 0 8px; font-size: 13px; font-weight: 600; color: var(--ink-soft); }
.prul-rij {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px;
  padding: 6px 0; font-size: 13px; color: var(--ink-soft);
}
.prul-rij + .prul-rij { border-top: 1px solid var(--line); }
/* Doorgestreept: dit ís de mededeling — deze regel telt niet meer. */
.prul-naam { font-weight: 600; text-decoration: line-through; }
.prul-tijden { font-variant-numeric: tabular-nums; text-decoration: line-through; }
.prul-door { font-size: 12px; }
/* Sjabloonbeheer onder de offertelijst. */
.off-houders { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
.off-houder {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px;
  border: 1px solid var(--line); background: var(--surface-2); color: var(--ink-soft);
  border-radius: 0; padding: 3px 8px; cursor: pointer;
}
.off-houder:hover { border-color: var(--accent); color: var(--accent); }
.off-voorbeeld { border: 1px solid var(--line); background: var(--surface-2); padding: 12px 14px; }
.off-vb-ond { margin: 0 0 8px; font-size: 14px; color: var(--ink); }
.off-vb-body {
  margin: 0; font: inherit; font-size: 13px; color: var(--ink);
  white-space: pre-wrap; word-break: break-word;
}
.off-vb-fout { margin: 10px 0 0; font-size: 12px; color: var(--departure); font-weight: 600; }
#off-sjab-body { width: 100%; }
.off-sjab-lbl {
  display: block; font-size: 13px; font-weight: 600; color: var(--ink-soft);
  margin: 12px 0 4px;
}
#off-sjab-onderwerp {
  width: 100%; height: 40px; padding: 0 12px;
  border: 1px solid var(--line); background: var(--surface-2);
  color: var(--ink); border-radius: 0; font-size: 14px;
}
#off-sjab-onderwerp:focus, #off-sjab-body:focus { outline: none; border-color: var(--accent); }

/* De dag staat UIT: een open ringetje in plaats van een gevulde stip, en gedempt. Het
   verschil met "automatisch" (geen teken) moet zichtbaar zijn — anders lijkt uitzetten
   niet gewerkt te hebben. */
.brief-dag.uit { border-style: dashed; }
.brief-dag.uit .brief-dag-num { color: var(--ink-soft); }
.brief-dag.uit .brief-dag-stip { color: var(--ink-soft); }
/* De knop die aangeeft dat deze dag nú uit staat — hij heet dan "Weer aanzetten". */
#admin-note-uit.aan { border-color: var(--accent); color: var(--accent); }

/* "per kamer: 2" op een blok — er ligt een kameruitzondering overheen. Eigen kleur, want
   dit is geen open punt maar een stand: iets is hier bewust anders. Zelfde tint als de
   kamermarkering in de bewerker, zodat de twee schermen hetzelfde signaal geven. */
.gp-perkamer {
  font-size: 11px; color: var(--zee, #3f7d8c);
  border: 1px solid currentColor; border-radius: 999px; padding: 1px 7px;
}
