
/* ============================================================
   SELF-HOSTED FONTS (GDPR, no requests to Google's CDN)
   Inter only. Orbitron was removed 2026-08, its zero glyph (a squared
   shape with a diagonal slash) rendered as a broken-looking box at
   dashboard sizes, most visibly in "€0" / "0%" / "0 leads" empty states.
   On a dashboard where the numbers ARE the product, that read as the app
   being broken. Inter's numerals are excellent and already loaded, so
   every former Orbitron use now sets font-variant-numeric: tabular-nums
   instead, same "confident data" register, correct zero, columns that
   don't jitter as figures update.
   ============================================================ */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/fonts/inter-var.woff2') format('woff2');
}
@font-face {
  /* Space Grotesk, self-hosted for the same GDPR reason as Inter. This is the
     brand's heading face, the marketing site loads it from Google, which is
     the leak we already closed here. Variable, so 500/600/700 all come from
     one 22 KB file. */
  font-family: 'Space Grotesk';
  font-style: normal;
  font-weight: 300 700;
  font-display: swap;
  src: url('/fonts/space-grotesk-var.woff2') format('woff2');
}
/* ============================================================
   CSS CUSTOM PROPERTIES
   ============================================================ */
:root {
  /* ── Sand Black, the brand, restored ──────────────────────────────────
     An earlier pass moved the accent off var(--zand-200) to a brighter gold and
     recoloured the neutrals cool-blue. The diagnosis behind that was right
     (the surfaces read flat and the warm wash over grey went muddy) but the
     remedy overwrote the brand. These are the real values, from the brand
     guide and from helvaro.pro's own tokens. The flatness is fixed the way
     the marketing site fixes it, with a genuine soft shadow and honest
     borders, not by changing the colours.

     THE CONTRAST RULE, which is the whole reason there are two accent
     tokens: sand is a FILL, never type. var(--zand-200) as text on white is about
     1.7:1, invisible. So --accent-c fills (always with dark text on it) and
     --accent-ink is what you set type in. */
  /* ══ TONALE RAMPS ═══════════════════════════════════════════════════
     Vier families van elf stops, gerekend in OKLCH en niet met de hand
     gekozen. Dat verschil is zichtbaar: in HSL lijkt een reeks gelijkmatig
     terwijl het oog hem als sprongen leest -- geel op 50%% helderheid leest
     veel lichter dan blauw op 50%%. OKLCH-lightness loopt wel gelijk op met
     wat je waarneemt, dus deze trappen staan er als echte trappen.

     Chroma volgt een boog in plaats van een rechte lijn: aan de uiteinden
     minder verzadiging, want een bijna-witte tint op volle chroma wordt
     roze en een bijna-zwarte wordt modderig. Het midden houdt de kleur op
     sterkte.

     ZAND is het merk. KLEI, OLIJF en STEEN zijn aardse begeleiders in
     dezelfde warme hoek van het spectrum -- geen regenboog, en nadrukkelijk
     geen blauw of paars, want die sluit de huisstijl uit.

     Achter elke stop staat waar hij als TEKST mag staan. Dat is geen
     versiering: een kleur die als vulling klopt is niet automatisch
     leesbaar als letter, en dat is precies waar dit bestand al een keer
     op is misgegaan (zand op wit = 1,7:1). */

  --zand-50: #FCF6E9;
  --zand-100: #F5ECD7;
  --zand-200: #E8D7B1;
  --zand-300: #D1C3A2;
  --zand-400: #B9A986;
  --zand-500: #A0916D;
  --zand-600: #867755;
  --zand-700: #6A5C3D;
  --zand-800: #4E4228;
  --zand-900: #322914;
  --zand-950: #1D1607;

  --klei-50: #FFF2E5;
  --klei-100: #FFE5D0;
  --klei-200: #FED0B5;
  --klei-300: #ECB797;
  --klei-400: #D59C79;
  --klei-500: #BC8360;
  --klei-600: #A06A48;
  --klei-700: #805031;
  --klei-800: #61381D;
  --klei-900: #41210A;
  --klei-950: #271002;

  --olijf-50: #F5F9E9;
  --olijf-100: #EBF0D6;
  --olijf-200: #D8DFBD;
  --olijf-300: #C1C9A1;
  --olijf-400: #A8B085;
  --olijf-500: #8F986B;
  --olijf-600: #767E54;
  --olijf-700: #5B623C;
  --olijf-800: #424727;
  --olijf-900: #292D13;
  --olijf-950: #161906;

  --steen-50: #F9F6F1;
  --steen-100: #F1ECE4;
  --steen-200: #E0DACF;
  --steen-300: #CBC3B7;
  --steen-400: #B2AA9D;
  --steen-500: #999184;
  --steen-600: #7F786B;
  --steen-700: #635D51;
  --steen-800: #494339;
  --steen-900: #2E2922;
  --steen-950: #1A1711;

  --bg:            #17140F;
  --bg-alt:        #120F0B;
  /* Een kaart is nu een VERLOOP en geen vlakke vulling, en dat is het verschil
     tussen 'een vlak met een schaduw eronder' en iets dat licht vangt. Van
     boven iets lichter, naar onder iets donkerder -- precies zoals een plaat
     die onder een lamp ligt.

     Het bereik is 3,5% helderheid. Dat is met opzet nauwelijks te benoemen:
     zie je de overgang als een streep, dan is het te veel. Je moet het merken
     als diepte, niet herkennen als een verloop.

     Dit mag omdat alle 97 gebruiken in dit bestand 'background:' zijn en geen
     enkele 'background-color:' -- nagerekend, niet aangenomen. --card-flat
     blijft bestaan voor het geval er ooit wel een platte kleur nodig is. */
  --card-flat:     #211D16;
  --card:          #211D16;
  --card-elevated: #2A251C;
  /* De rand stond op #262626 terwijl de kaart op #232323 staat: drie punten
     ertussen, en dan IS er geen rand. Een kaart zonder rand leunt volledig op
     zijn schaduw, en op bijna-zwart doet een schaduw bijna niets -- vandaar
     dat alles vlak aanvoelde. Nu is het verschil zichtbaar zonder dat er een
     lijn OM de kaart komt: het leest als een vouw, niet als een omtrek.
     --divider blijft de zachtste, want een scheiding BINNEN een kaart hoort
     minder te doen dan de kaartrand zelf.
     Staat twee keer, en dat hoort: het tweede blok zet de donkere tokens vast
     voor een paneel dat altijd donker is. Uit elkaar laten lopen is precies
     hoe zoiets stilletjes scheef gaat. */
  --border-c:      #3A3327;
  --border-strong: #574B37;
  --divider:       #2C2A26;
  --hover-c:       #26211A;

  /* Het accent hangt nu aan de ramp in plaats van los te staan. --zand-200 IS
     var(--zand-200) -- die stop is met opzet vastgepind op de merkwaarde, zodat de ramp
     het merk BEVAT en niet benadert. Er verandert dus geen pixel; wat er bij
     komt is dat elke tint ernaast nu een naam heeft en op afstand klopt. */
  --accent-c:        var(--zand-200);
  --accent-hover-c:  #DDCAA1;
  --accent-pressed-c:var(--zand-300);
  --accent-deep:     #C9AE7C;   /* tweede stop in verlopen */
  --accent-ink:      var(--zand-100);   /* accent ALS TEKST, alleen op donker */
  --on-accent:       #1A1A1A;   /* always dark type on sand */

  --text-c:        #F1E9DA;   /* never pure #FFF -- VISUAL-DIRECTION.md */
  --text-muted-c:  #A79B85;
  --text-disabled: #6F6554;
  --text-inverse:  #17140F;

  /* Fase 4: dezelfde hues, één stap warmer/desatureerder, per coordinator-
     opgave. Fills blijven de heldere kant (chips, iconen); de *-ink varianten
     verderop zijn waar nodig apart getest tegen de nieuwe kaartkleur. */
  --success-c: #4CAF6E;
  --warning-c: #E8A54A;
  --error-c:   #E4665A;
  --info-c:    var(--accent-ink);   /* "reuse tan, not blue" -- letterlijk het accent als tekstkleur */

  /* Semantic colours AS TEXT. Same story as --accent-c vs --accent-ink: a hue
     picked to read as a fill is not automatically legible as type, and the
     place it breaks is a chip that tints the SAME hue behind it, a green
     score on a 15%-green pill. On dark the fill values already clear 4.5:1
     against both the canvas and their own chip, so these are aliases here and
     dark is unchanged; the light block overrides them with darker values. */
  --success-ink: var(--success-c);   /* 6,12:1 op de nieuwe kaart #211D16 -- opnieuw gemeten na Fase 4 */
  --warning-ink: var(--warning-c);  /* 7,92:1 */
  /* #E4665A (de fill) haalde 5,07:1 -- maar dat was gemeten op de KALE kaart,
     niet op de chip waar de tekst echt op staat (12%-rode tint over de
     kaart, #38261E). Daarop haalt de fill zelf maar 4,33:1. scripts/
     contrast-check.js rekent tegen de echte chip en ving dit; #E7756B is
     dezelfde fill, 10% naar wit, 4,89:1 op de chip. */
  --error-ink:   #E7756B;
  /* Was blauwgrijs (#96A2B6) -- tegen de eigen "geen blauw"-regel in. Zelfde
     helderheid, warme tint: 6,32:1 op de kaart. */
  --neutral-ink: #A79E8C;

  --bubble-incoming: #211D16;

  --accent-rgb:  232,215,177;
  --success-rgb: 76,175,110;
  --warning-rgb: 232,165,74;
  --error-rgb:   228,102,90;
  --info-rgb:    245,236,215;
  --text-rgb:    241,233,218;
  --on-accent-rgb: 26,26,26;

  /* Twee families, zoals de huisstijl voorschrijft: Space Grotesk voor koppen,
     Inter voor alles wat je leest. Space Grotesk valt terug op Inter, dus als
     het woff2-bestand ontbreekt wordt de pagina niet lelijk, alleen minder
     eigen. */
  --font-head: 'Space Grotesk', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  /* 4 / 8 / 12 -- the scale the coordinator set for Fase 4, applied to the
     single definition point that all 51 var(--radius-*) reads in this file
     share. Was 8/14/22 (then 8/14/16 for one pass); this is a visible
     tightening across every button and card in the app, not just the one
     22px outlier. */
  --radius-sm:   4px;
  --radius-btn:  8px;
  --radius-card: 12px;

  /* Fase 4 vervolg: --ease-spring helemaal weg, niet alleen gealiast. De
     detector matcht op TEKST ("spring" in de bron), niet op de opgeloste
     waarde -- een alias naar --ease-out loste de overshoot (1.16) zelf al op
     maar liet de laatste bounce-easing-vondst onterecht staan. De 2 plekken
     die er nog naar verwezen (de toast, en één transform) gebruiken nu
     rechtstreeks --ease-out. */
  --ease-out:    cubic-bezier(0.4, 0, 0.2, 1);
  --dur-fast:    140ms;
  --dur-base:    220ms;
  --dur-enter:   320ms;
  --transition-fast: all 140ms cubic-bezier(0.4, 0, 0.2, 1);
  --transition:      all 220ms cubic-bezier(0.4, 0, 0.2, 1);

  /* Soft and deep, never a hard drop. This is what makes a #232323 card read
     as raised on a #121212 page without changing either colour. */
  --elev-0: none;
  /* Drie lagen in plaats van twee, en de verste waaiert ruimer en lichter
     uit. Een echte schaduw heeft een harde kern vlak onder het object en een
     wolk die ver uitloopt; met twee lagen krijg je de kern wel en de wolk
     niet, en dan lijkt een kaart op de pagina GEPLAKT in plaats van dat hij
     erboven hangt. De totale donkerte blijft ongeveer gelijk -- ze is verdeeld
     over meer afstand, niet opgeschroefd. */
  /* Elevation declared once: a flat fill plus a 1px --border-c edge IS
     the depth cue now (see --raised). elev-1/2 are gone -- no component
     should be lifting off a shadow anymore. elev-3 survives as the one
     real, soft OFFSET shadow, reserved for true overlays: a modal and
     the search overlay -- content that floats fully above the page, not
     a card sitting on it. */
  --elev-1: none;
  --elev-2: none;
  --elev-3: 0 20px 48px rgba(0,0,0,.32);
  --shadow:      0 1px 2px rgba(0,0,0,.34), 0 6px 16px rgba(0,0,0,.24), 0 18px 44px rgba(0,0,0,.18);
  --shadow-card: none;   /* finish-fix 3: elevation is the tan edge, in beide thema's */
  --shadow-glow: none;

  /* De lichtlip bovenop, plus nieuw: een schaduwlip onderaan. Samen maken ze
     van een rechthoek een plaat met dikte -- licht valt op de bovenrand, de
     onderrand ligt in zijn eigen schaduw. Eén lip alleen leest als een streep;
     twee lezen als een rand.
     Van 0.04 naar 0.07: op een verloop dat zelf al oploopt moest de lip mee
     omhoog, anders verdwijnt hij in de bovenste stop. */
  /* DOORZICHTIG en niet 'none'. Dit token wordt in zeven regels samengesteld
     tot een box-shadow van var(--edge-hi) plus iets anders, en 'none' is in
     een schaduwlijst geen waarde maar een verbod: de browser gooit dan de HELE
     declaratie weg, inclusief dat andere.

     Dat kostte het helppaneel zijn schaduw. .hv-help-panel vraagt
     var(--edge-hi), var(--elev-3) -- en --elev-3 is juist bewaard als de ene
     zachte schaduw voor een modaal en de zoekoverlay. Het paneel zweefde dus
     zonder enige diepte over de pagina, gescheiden door niets dan een rand van
     1px. In BEIDE thema's.

     De kaarten blijven wel vlak, en dat is met opzet: die stellen
     var(--edge-hi) samen met var(--shadow-card), en die staat in het lichte
     thema nog steeds op none. Die declaraties blijven dus ongeldig en dus
     zonder schaduw -- precies de vlakke opzet die daar bedoeld is.

     Nagemeten in de browser, per thema: van dertien kaarten verandert er exact
     een, en dat is het helppaneel. */
  --edge-hi: 0 0 0 0 rgba(0,0,0,0);   /* finish-fix 3: geen ingebakken lichtrand -- de rand is de rand */

  --glass-fill:  rgba(18,18,18,0.78);
  --glass-edge:  rgba(255,255,255,0.06);
  --glass-blur:  saturate(140%) blur(18px);

  /* ── One accent, not a rainbow ──────────────────────────────────────────
     There used to be seven per-card hues here (emerald, blue, purple,
     orange, coral, cyan, gold). The brand rules out purple, indigo and blue
     outright, and a dashboard for someone who handles other people's money
     should not look like a colour wheel. Cards are now differentiated by
     sand at varying strength, with real colour reserved for STATUS: green
     when something succeeded, amber when it needs attention, red when it
     failed. That is information, not decoration. */
  --c-sand:    #E8D7B1;  --c-sand-soft:    rgba(232,215,177,0.10);
  --c-deep:    #C9AE7C;  --c-deep-soft:    rgba(201,174,124,0.10);
  --c-emerald: #4CAF6E;  --c-emerald-soft: rgba(76,175,110,0.12);
  --c-amber:   #E8A54A;  --c-amber-soft:   rgba(232,165,74,0.12);
  --c-coral:   #E4665A;  --c-coral-soft:   rgba(228,102,90,0.12);
  /* Legacy aliases so the ~40 existing var(--c-blue) style references keep
     resolving; they now all land on sand instead of off-brand hues. */
  --c-blue:    var(--c-sand);   --c-blue-soft:   var(--c-sand-soft);
  --c-purple:  var(--c-deep);   --c-purple-soft: var(--c-deep-soft);
  --c-cyan:    var(--c-sand);   --c-cyan-soft:   var(--c-sand-soft);
  --c-orange:  var(--c-amber);  --c-orange-soft: var(--c-amber-soft);
  --c-gold:    var(--c-sand);   --c-gold-soft:   var(--c-sand-soft);

  /* ---- legacy token names (kept so every existing var(--x) in this
     18k-line file resolves without a line-by-line rewrite) ---- */
  --bg-primary:    var(--bg);
  --bg-card:       var(--card);
  --bg-card-alt:   var(--bg-alt);
  --bg-card-hover: var(--hover-c);
  --blue-primary:  var(--accent-c);
  --blue-bright:   var(--accent-hover-c);
  --cyan:          var(--accent-c);
  --green:         var(--success-c);
  --red:           var(--error-c);
  --orange:        var(--warning-c);
  --green-ink:     var(--success-ink);
  --red-ink:       var(--error-ink);
  --orange-ink:    var(--warning-ink);
  --accent:        var(--accent-c);
  --accent-bright: var(--accent-hover-c);

  /* Deze zes ontbraken in dit blok, terwijl er 42 keer naar verwezen wordt.
     Een var() zonder fallback naar iets ongedefinieerds maakt de hele
     declaratie ongeldig, dus die 42 regels deden niets en de eigenschap erfde
     van de ouder, zichtbaar op het inlogscherm, waar de foutmelding daardoor
     bijna-wit op lichtroze stond. Aliassen, geen nieuwe kleuren, zodat ze het
     thema volgen net als de rest hierboven. */
  --error:          var(--error-c);
  --warning:        var(--warning-c);
  --success:        var(--success-c);
  --info:           var(--info-c);
  --accent-hover:   var(--accent-hover-c);
  --accent-pressed: var(--accent-deep);
  --text:          var(--text-c);
  --text-primary:  var(--text-c);
  --text-secondary:var(--text-muted-c);
  --text-muted:    var(--text-muted-c);
  --border:        var(--border-c);
  --border-bright: var(--border-strong);
  --scrollbar-bg:  var(--bg);
  --scrollbar-thumb: var(--border-strong);
  /* De focusring. Zie de regel bij :where(...):focus-visible verderop voor het
     waarom; hier alleen de kleur, want die MOET per thema verschillen: zand
     haalt 10-13:1 op de donkere vlakken en 1,3:1 op de lichte. Een enkele
     kleur die het overal haalt bestaat niet -- nagerekend op alle zes vlakken
     waar een ring kan landen. */
  --focus-ring: #E8D7B1;
  --radius:        var(--radius-btn);
  --radius-s:      var(--radius-sm);

  /* Fase 4: "de ene, effen charcoal chip" uit het richtingscontract
     (site-index-html.md, FIRST VIEWPORT). Op donker draait het om: het
     zandaccent is er de solide vulling, charcoal de tekst -- exact zoals
     --accent-c/--on-accent al deden, nu onder de eigen naam voor de knop. */
  --btn-primary-bg:   var(--accent-c);
  --btn-primary-text: var(--on-accent);

  /* Fase 4 (ontwerpsysteem): de drie toonstappen van het showroom-bord
     (site-index-html.md, OWN-WORLD), als ALIAS op wat hier al bestond. Geen
     enkele kleur verandert; dit geeft --bg/--card/--bg-alt een naam die
     matcht met de kaart-wereld: grond, opgetild, en de derde, donkerste stap.
     --edge is dezelfde rand die de kaarten al gebruikten, nu onder de naam
     die de brief gebruikt ("muted-tan edges instead of shadows"). */
  --ground:     var(--bg);
  --raised:     var(--card);
  --ink-surface:var(--bg-alt);
  --edge:       var(--border-c);
}

[data-theme="light"] {
  /* Taken straight from helvaro.pro's own custom properties, so the app and
     the marketing site are the same product rather than two designs that
     happen to share a logo. */
  /* Hier zat de grootste vlakheid van het hele product: pagina wit, kaart
     wit, verhoogde kaart ook wit. Drie lagen met exact dezelfde kleur, dus
     alles moest komen van een randje van 1px -- en dan leest een dashboard
     als een spreadsheet.

     De pagina wordt nu een warme gebroken tint en de kaart blijft zuiver wit.
     Dat is de omkering die het doet: niet de kaart donkerder maken (dan wordt
     hij vies), maar de GROND eronder terugnemen, zodat wit weer iets
     betekent. De verhoogde kaart blijft ook wit en onderscheidt zich met
     hoogte in plaats van met kleur -- daar is --elev-2 voor.

     Warm en niet neutraalgrijs, want het accent is zand. Een koele grijze
     grond onder een zandgeel accent laat dat accent groezelig lijken; dat is
     exact de fout die bovenaan dit bestand al beschreven staat.

     Gemeten, niet gegokt. Wit-op-wit gaf een contrastverhouding van exact
     1,000 -- wiskundig geen verschil, en dat is letterlijk waarom het vlak
     leek. #FAF9F6 bracht dat op 1,053; deze grond zit op 1,108, ruim dubbel
     zoveel scheiding, met een rood-blauwverschil van 10 punten zodat hij
     hoorbaar warm is en niet grijs. Donkerder dan dit wordt beige. */
  --bg:            #F3EDE1;
  --bg-alt:        #EAE2D2;
  /* Op wit kan het verloop maar een kant op: naar beneden. En het krijgt de
     zandhue mee, want zuiver grijs onder een zandaccent leest koud -- dezelfde
     reden als bij de grond hierboven. 1,6% bereik; nog subtieler dan op donker,
     omdat het oog op wit veel gevoeliger is voor banding. */
  /* Was #FFFFFF puur wit -- de brief verbiedt zowel puur wit als hoofdvlak
     EN puur wit als kaartkleur; nu een warm gebroken wit dat nog altijd
     duidelijk lichter is dan de grond eronder. */
  --card-flat:     #FAF6EE;
  --card:          #FAF6EE;
  --card-elevated: #FFFAF2;
  --border-c:      #D9CCB0;
  --border-strong: #B89D73;
  --divider:       #EDE9E0;
  --hover-c:       #EFE7D8;

  --accent-c:        #E8D7B1;   /* sand still fills, even on white */
  --accent-hover-c:  #DDCAA1;
  --accent-pressed-c:#D3BE93;
  --accent-deep:     #D3BE93;
  /* Sand as type on white is ~1.7:1. This deeper bronze is the brand's
     answer, and it is the ONLY accent allowed to carry text here.

     Het was #8A6A33, en dat haalde op WIT 5,01:1 -- daar was op gemeten. Maar
     accenttekst staat bijna nooit op wit: hij staat op de getinte vlakken
     eromheen. Alle 32 stukjes tekst die in het lichte thema onder 4,5:1 zaten
     hadden precies deze kleur, en allemaal op zo'n tint:

       op #FFFFFF (puur wit)     5,01:1  ok
       op #EEE9DE (--bg-card-alt) 4,14:1  te weinig
       op #EDE7D9                 4,07:1  te weinig
       op #F3EDE0 t/m #F5F1E8     4,30 - 4,45:1  te weinig

     Dezelfde tint en verzadiging, alleen donkerder tot het overal boven 4,5
     uitkomt met marge: 4,84 op het donkerste vlak, 5,97 op wit. De zijbalk
     hergebruikt --accent-ink niet (nagekeken: nul accenttekst daarbinnen),
     dus donkerder maken raakt dat permanent donkere paneel niet. */
  /* Fase 4: coordinator-opgave. #6E5320 -- 6,17:1 op de grond (#F3EDE1),
     6,67:1 op de kaart (#FAF6EE), 5,58:1 op het onderste vlak (#EAE2D2). */
  --accent-ink:      #6E5320;
  --on-accent:       #1A1A1A;

  --text-c:        #1F1D19;
  --text-muted-c:  #6B6252;
  --text-disabled: #A2977F;
  --text-inverse:  #FAF6EE;

  /* Fase 4: dezelfde hues, één stap warmer/desatureerder (coordinator-opgave).
     Fills zijn de heldere kant; de *-ink hieronder zijn apart gemeten tegen de
     nieuwe kaartkleur #FAF6EE. */
  --success-c: #2F8F4E;
  --warning-c: #B4661A;
  --error-c:   #C2352B;
  --info-c:    var(--accent-ink);   /* "reuse tan, not blue" */

  /* Deze drie waren gemeten tegen de KALE kaart (#FAF6EE), niet tegen de
     12%-getinte chip waar de tekst echt op staat -- exact de fout die
     CLAUDE.md hierboven al beschrijft. scripts/contrast-check.js rekent
     tegen de echte chip (composite van de fill op de kaart) en ving drie
     mislukkingen: success 4,31:1, error 4,26:1, neutral 3,66:1. Hieronder
     dezelfde tinten, donkerder tot ze op de chip zelf boven 4,5 komen. */
  --success-ink: #226838;   /* was #287A42 (4,31:1 op chip) -- nu 5,48:1 */
  --warning-ink: #995716;   /* 4,54:1 op chip -- haalt het net, ongewijzigd */
  --error-ink:   #A52D25;   /* was fill-alias #C2352B (4,26:1 op chip) -- nu 5,45:1 */
  /* Was blauwgrijs (#45526B) -- tegen de eigen "geen blauw"-regel in.
     #6B5F4A haalde 5,80:1 op de KALE kaart maar 3,66:1 op de eigen chip
     (sand-soft op 30%% alpha, veel zichtbaarder dan de status-chips op
     12%%). Donkerder tot de chip zelf boven 4,5 komt: 5,35:1. */
  --neutral-ink: #504738;

  --bubble-incoming: #FAF6EE;

  --accent-rgb:  232,215,177;
  --success-rgb: 47,143,78;
  --warning-rgb: 180,102,26;
  --error-rgb:   194,53,43;
  --info-rgb:    110,83,32;
  --text-rgb:    31,29,25;
  --on-accent-rgb: 26,26,26;

  /* Same single accent on white. The bronze is what shows up as an icon or a
     hairline; the sand is what fills a button under dark text. */
  --c-sand:    #6E5320;  --c-sand-soft:    rgba(232,215,177,0.30);
  --c-deep:    #6F5427;  --c-deep-soft:    rgba(201,174,124,0.26);
  --c-emerald: #2F8F4E;  --c-emerald-soft: rgba(47,143,78,0.10);
  --c-amber:   #B4661A;  --c-amber-soft:   rgba(180,102,26,0.10);
  --c-coral:   #C2352B;  --c-coral-soft:   rgba(194,53,43,0.10);

  --bg-primary:    var(--bg);
  --bg-card:       var(--card);
  --bg-card-alt:   var(--bg-alt);
  --bg-card-hover: var(--hover-c);
  --accent:        var(--accent-c);
  --accent-bright: var(--accent-hover-c);
  --text:          var(--text-c);
  --text-primary:  var(--text-c);
  --text-secondary:var(--text-muted-c);
  --text-muted:    var(--text-muted-c);
  --border:        var(--border-c);
  --border-bright: var(--border-strong);
  --scrollbar-bg:  var(--bg);
  --scrollbar-thumb: var(--border-strong);
  /* Het lichtste warme goud dat op alle drie de lichte vlakken boven 3:1 komt.
     Herrekend na het Fase-4-palet: grond #F3EDE1 3,72:1, kaart #FAF6EE
     4,03:1, onderste vlak #EAE2D2 3,49:1 -- nog altijd ruim boven de
     3:1-eis voor een niet-tekstelement. */
  --focus-ring: #96742F;

  /* Fase 4: charcoal chip, zoals in :root. Op wit is het andersom: de sand
     accentkleur zelf haalt maar 1,7:1 als tekst, dus de solide primaire knop
     wordt hier de charcoal vulling met zand als tekst -- dezelfde twee
     kleuren als het donkere thema, omgedraaid. */
  --btn-primary-bg:   #1A1A1A;
  --btn-primary-text: #F4E7C8;

  /* The site's own card shadow, verbatim. */
  /* Ook hier drie lagen, en warm getint in plaats van blauwgrijs. Een schaduw
     is licht dat wordt tegengehouden, dus hij hoort de kleur van de grond te
     dragen -- rgba(17,24,39) is koel blauw en dat vecht met een zandaccent op
     een warme grond. De kern is nieuw: op wit was er alleen een verre wolk,
     dus een kaart had geen contactpunt met de pagina en zweefde stuurloos. */
  --shadow:        0 1px 2px rgba(64,52,32,0.06), 0 4px 12px rgba(64,52,32,0.06), 0 16px 40px rgba(64,52,32,0.07);
  --shadow-card:   none;   /* finish-fix 3: de rand is de rand, ook licht */
  --shadow-glow:   none;
  /* Same rule, light ground: elev-1/2 gone, elev-3 is the one soft offset
     shadow reserved for a modal and the search overlay. */
  --elev-1: none;
  --elev-2: none;
  --elev-3: 0 20px 48px rgba(64,52,32,.14);
  /* A white highlight on a white card is nothing. */
  /* Zie de toelichting bij --edge-hi in het donkere blok hierboven: geen
     randlicht, maar doorzichtig in plaats van none. */
  --edge-hi: 0 0 0 0 rgba(0,0,0,0);

  --glass-fill:  rgba(255,255,255,0.80);
  --glass-edge:  rgba(255,255,255,0.90);
  --glass-blur:  saturate(160%) blur(18px);

  /* Zie de toelichting bij :root hierboven -- zelfde alias, lichte waarden. */
  --ground:     var(--bg);
  --raised:     var(--card);
  --ink-surface:var(--bg-alt);
  --edge:       var(--border-c);

  /* Samengevoegd vanuit het losse [data-theme="light"]-blok bij de knop-tokens
     (voorheen na regel 3941) -- Fase 4 consolidatie: precies één
     [data-theme="light"]-blok direct na :root. */
  /* Op wit werkt hetzelfde principe andersom: de bovenrand is niet lichter dan
     wit, dus daar draagt de ONDERrand het verschil. */
  --btn-rim:  inset 0 1px 0 rgba(255,255,255,0.70), inset 0 -1px 0 rgba(64,52,32,0.10);
  --btn-rim-accent: inset 0 1px 0 rgba(255,255,255,0.55), inset 0 -1px 0 rgba(64,52,32,0.14);
  --btn-glow: none;
}

/* ============================================================
   RESET & BASE
   ============================================================ */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

/* ── Waar ben ik? ────────────────────────────────────────────────────────────
   Met een echte Tab-toets gemeten, want programmatische focus telt in Chrome
   niet als :focus-visible en geeft dus een vals beeld. Wat er te zien was:

     .btn-icon            zandring van de app        (goed)
     .nav-item            eigen ring van de app      (goed)
     .ap-chip             Chrome's eigen ring, var(--zand-100)
     .ap-btn / .fm-btn    Chrome's eigen ring, #121212 -- op een donkere kaart
                          1,27:1, oftewel onzichtbaar
     .cal-nav-btn         Chrome's eigen ring, oranje #E59700

   Drie verschillende ringen dus, waarvan een die je op de helft van de app
   niet ziet. Wie met het toetsenbord werkt raakt daar simpelweg kwijt waar hij
   is -- op "Je assistent" zijn dat tien chips, acht knoppen en vijf
   tekstvelden achter elkaar.

   :where() geeft deze regel specificiteit NUL. Dat is met opzet: dit is een
   vloer, geen overheersing. Elke bestaande focusregel wint hier gewoon van, en
   .btn-icon en .nav-item houden dus hun eigen ring. Alleen wie er geen had
   krijgt er een.

   outline en niet box-shadow: box-shadow zou de eigen schaduw van een element
   tijdens focus vervangen, en outline doet niets met de layout. */
:where(button, a[href], input, select, textarea, summary,
       [role="button"], [tabindex]:not([tabindex="-1"])):focus-visible {
  outline: 2px solid var(--focus-ring, #E8D7B1);
  outline-offset: 2px;
}

/* ── Gebeurde er iets toen ik drukte? ────────────────────────────────────────
   Zelfde meting, zelfde uitkomst als bij de focusring: 33 knoppen gaven een
   duwtje terug en 59 niet, en welke je kreeg hing af van of de knop uit het
   ontwerpsysteem kwam of ter plekke was gemaakt. Op een trage verbinding is
   dat het verschil tussen "hij doet het" en nog een keer klikken.

   Ook hier :where(), dus specificiteit nul: de dertien knoppen die al een
   eigen :active hebben houden die gewoon. Een pixel omlaag is precies wat
   .nav-item al deed -- dit maakt er de huisregel van in plaats van een
   uitzondering.

   :not(:disabled) want een knop die niets doet hoort ook niet te bewegen; dat
   zou juist zeggen dat er wel iets gebeurde. */
:where(button, [role="button"], a[class*="btn"]):active:not(:disabled):not([aria-disabled="true"]) {
  transform: translateY(1px);
}

html { font-size: 93.75%; }   /* 15px bij de standaardinstelling; schaalt mee met de tekstgrootte van de gebruiker */

body {
  font-family: 'Inter', sans-serif;
  /* Flat ground, one value per theme. Depth now comes from card elevation
     (--raised + a 1px tan edge), not from a lit backdrop -- no pools, no
     dot grid, no bloom. */
  background: var(--bg-primary);
  color: var(--text-primary);
  min-height: 100vh;
  overflow-x: hidden;
  transition: background 0.3s ease, color 0.3s ease;
}

/* Custom scrollbar */
::-webkit-scrollbar { width: 5px; height: 5px; }
::-webkit-scrollbar-track { background: var(--scrollbar-bg); }
::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: var(--r-sm); }
::-webkit-scrollbar-thumb:hover { background: var(--text-disabled); }

/* ============================================================
   TYPOGRAPHY
   ============================================================ */
/* Koppen in Space Grotesk, 600-700, -0.02em, dat is wat de huisstijl zegt en
   wat helvaro.pro doet. Een eerdere ronde hier draaide alles op één familie
   (Inter op 800) omdat de vorige tweede letter Orbitron was, en die paste
   nergens bij. Dat argument gold Orbitron, niet het idee van een tweede
   letter: Space Grotesk is juist de kop-letter van het merk, dus de app en de
   site lezen nu als hetzelfde product. 800 gaat naar 700 omdat Space Grotesk
   niet zwaarder gaat en op 700 al steviger oogt dan Inter op 800. */
h1, h2, h3, .display-heading, .page-title, .stat-value, .card-title {
  font-family: var(--font-head);
  font-weight: 700;
  letter-spacing: -0.02em;
}

/* Was a gradient-clip effect (indigo → cyan). A single accent colour reads
   calmer and is the "important number / highlight" use case sand is for. */
.gradient-text {
  background: none;
  -webkit-text-fill-color: currentColor;
  background-clip: initial;
  color: var(--accent-ink);
}
/* Fase 4 consolidatie: geen [data-theme="light"]-override meer nodig -- de
   regel hierboven zet background:none en -webkit-text-fill-color al
   thema-onafhankelijk, en color leest via var(--accent-ink) al de juiste
   waarde per thema. De override herhaalde exact dezelfde twee declaraties. */

/* ============================================================
   LAYOUT
   ============================================================ */
#app { position: relative; z-index: 1; }

.app-layout {
  display: flex;
  min-height: 100vh;
}

.main-content {
  flex: 1;
  /* Zonder dit loopt de Pipeline buiten beeld. Een flex-kind heeft standaard
     min-width:auto en kan dus niet kleiner worden dan zijn INHOUD. Het
     kanbanbord is breder dan het scherm, dus in plaats van dat het bord zelf
     schuift (het heeft overflow-x:auto) groeide deze kolom mee: 1420px bij een
     venster van 1440 met 220px zijbalk, oftewel 205px die je met geen enkele
     scrollbeweging kon bereiken. Weg waren de laatste pipelinekolom en, in de
     kopbalk, de bel en de themaschakelaar.
     min-width:0 geeft de kolom toestemming om te krimpen; pas dan doet de
     overflow-x op het bord waar hij voor bedoeld is. */
  min-width: 0;
  margin-left: 220px;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  /* Fase 4: bekeken voor de layout-transition-detector, en bewust gehouden.
     margin-left reserveert hier de ruimte voor de fixed .sidebar; dit
     element is zelf flex:1, dus de zichtbare BREEDTE hangt af van deze
     marge. transform:translateX() zou het vlak laten schuiven zonder zijn
     breedte te herrekenen -- .page-content erin zou dan overlappen met de
     zijbalk in plaats van eromheen te passen. Geen transform-vervanging
     zonder de flex-opzet zelf te herschrijven, en dat is een layoutwijziging,
     geen tokenwerk. */
  transition: margin-left 0.3s ease;
}

.page-content {
  flex: 1;
  /* Zelfde reden als bij .main-content hierboven: ook dit is een flex-kind. */
  min-width: 0;
  padding: 24px 28px;
  overflow-y: auto;
  overflow-x: hidden;
}

/* Een tabel heeft een harde min-content-breedte: kolomkoppen en getallen
   kunnen niet verder krimpen. Op een telefoon liep .source-table daardoor 129px
   buiten beeld, en omdat de pagina zijn overflow verbergt was dat geen
   scrollbalk maar een tabel die stilletjes kolommen kwijtraakte. Eén wrapper
   die zelf scrollt geeft ze terug. */
/* De storingsbalk. display:flex staat op de klasse en niet inline, zodat een
   [hidden] of style.display='none' hem ook echt weg krijgt, een eerdere versie
   van een banner in dit bestand bleef zichtbaar boven een gezonde pagina omdat
   display:flex het van [hidden] won. */
/* Aanraakdoelen. WCAG 2.2 vraagt minimaal 24x24 CSS-pixels voor iets dat je
   moet kunnen raken; deze zaten daaronder, potloodjes en kruisjes van 14 tot
   20 pixels.

   Eerste poging was een onzichtbaar ::after om het raakvlak te vergroten zonder
   de layout te verschuiven. Gemeten met elementFromPoint bleek dat niet te
   werken: op 11px van het midden ving het pseudo-element de klik niet op, want
   een ouder knipt zijn overflow af. Dus gewoon de knop zelf op maat, met het
   icoon gecentreerd zodat hij visueel niet groter oogt. */
#revenue-goal-edit,
.copy-btn,
#dash-checklist-close,
#btn-toggle-apikey,
#panel-copy-phone {
  min-width: 24px;
  min-height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

.crm-error-banner {
  display: none;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
  margin: 0 0 18px;
  padding: 14px 18px;
  border-radius: var(--r-md);
  background: rgba(var(--error-rgb), 0.10);
  border: 1px solid rgba(var(--error-rgb), 0.28);
}
.crm-error-text { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: 2px; }
.crm-error-text strong { font-size: 0.9333rem; color: var(--error-ink); }
.crm-error-text span { font-size: 0.8667rem; color: var(--text-muted); }
.crm-error-retry {
  padding: 8px 14px;
  border-radius: var(--r-sm);
  border: 1px solid rgba(var(--error-rgb), 0.35);
  background: none;
  color: var(--error-ink);
  font-size: 0.8667rem;
  font-weight: 600;
  cursor: pointer;
}
.crm-error-retry:hover:not(:disabled) { background: rgba(var(--error-rgb), 0.12); }
.crm-error-retry:disabled { opacity: 0.6; cursor: default; }
.crm-error-retry:focus-visible { outline: 2px solid var(--error-ink); outline-offset: 2px; }

.table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  max-width: 100%;
}
.table-scroll > table { min-width: 460px; }

/* Op de smalste telefoons is de paginamarge zelf het laatste dat nog wint van
   de inhoud: 2x28px is 56px van een scherm van 320. */
@media (max-width: 400px) {
  .page-content { padding: 18px 14px; }
}
@media (max-width: 360px) {
  .page-content { padding: 16px 10px; }
  /* Vangnet voor de laatste paar kaarten en knoppen die op 320px nog een paar
     pixel buiten beeld staken. Liever één regel die zegt "niets is breder dan
     zijn container" dan vijf losse uitzonderingen die de volgende kaart weer
     mist. */
  .page.active .profile-card,
  .page.active .fm-qr-card,
  .page.active .fm-preview-card,
  .page.active .fm-option-card,
  .page.active .cal-day-num,
  .page.active .stat-icon,
  .page.active #chk-whatsapp-mailto,
  .page.active .cal-book-btn {
    max-width: 100%;
    min-width: 0;
  }
  /* De onboarding-checklist zet een lange mailto-link op één regel; op 320px
     steekt die er 35px uit. Breken mag hier: het is een adres, geen knop. */
  .page.active #chk-whatsapp-mailto {
    overflow-wrap: anywhere;
    word-break: break-word;
  }
  .page.active .cal-book-btn {
    white-space: normal;
    padding-left: 10px;
    padding-right: 10px;
  }
}

/* ============================================================
   KOSTEN (alleen Helvaro)

   Een rekening, geen dashboard. Vandaar: één kolom, uitgelijnde bedragen met
   tabular-nums zodat je ze onder elkaar kan lezen, en de HERKOMST van elk
   bedrag als klein label ernaast. Dat label is het hele punt van de pagina --
   een lijstprijs en een ingevuld bedrag horen er niet hetzelfde uit te zien.
   ============================================================ */
/* Onderaan ruimte voor de Faro-balk, die vast onder in beeld staat. Zonder
   deze marge legt hij zich over de laatste regel van de laatste lijst. */
.kst-wrap { max-width: 940px; padding-bottom: 96px; }

.kst-top {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 14px;
  margin-bottom: 22px;
}
.kst-kaart {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 18px 20px;
}
.kst-lbl {
  font-size: 0.7333rem;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 8px;
}
.kst-groot {
  font-family: var(--font-head);
  font-size: 1.8rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}
.kst-onder { font-size: 0.8rem; color: var(--text-muted); margin-top: 6px; }

.kst-melding {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--bg-card);
  padding: 12px 16px;
  font-size: 0.8667rem;
  line-height: 1.6;
  color: var(--text-muted);
  margin-bottom: 22px;
}

.kst-blok { margin-bottom: 26px; }
.kst-blok-kop { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; }
.kst-blok-titel { font-size: 1rem; font-weight: 700; }
.kst-blok-sub { font-size: 0.8rem; color: var(--text-muted); }

.kst-tabel {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  overflow: hidden;
}
.kst-rij {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 6px 18px;
  align-items: center;
  padding: 13px 18px;
  border-bottom: 1px solid var(--divider);
}
.kst-rij:last-child { border-bottom: none; }
.kst-rij.uit { opacity: .55; }
.kst-naam { font-size: 0.9333rem; font-weight: 600; }
.kst-meta { font-size: 0.8rem; color: var(--text-muted); margin-top: 3px; }
.kst-bedrag {
  font-size: 1rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  text-align: right;
  white-space: nowrap;
}
.kst-bedrag.leeg { color: var(--warning-ink); font-weight: 600; font-size: 0.8667rem; }

/* Wat deze dienst tot nu toe gekost heeft. Eigen regel onder de omschrijving:
   het is een ander soort getal dan het maandbedrag ernaast, en die twee door
   elkaar lezen is precies wat je hier niet wil. */
.kst-sinds {
  font-size: 0.8rem;
  color: var(--accent-ink);
  margin-top: 5px;
  font-variant-numeric: tabular-nums;
}
.kst-sinds.leeg { color: var(--warning-ink); }

/* De herkomst. Klein, maar het verschil tussen een getal dat je kan geloven en
   een getal dat je moet controleren. */
.kst-bron {
  display: inline-block;
  font-size: 0.6667rem;
  letter-spacing: .06em;
  text-transform: uppercase;
  padding: 2px 7px;
  border-radius: var(--r-full);
  border: 1px solid var(--border-strong);
  color: var(--text-muted);
  margin-left: 8px;
  vertical-align: 2px;
}
.kst-bron.ingevuld { color: var(--success-ink); border-color: rgba(var(--success-rgb), .45); }
.kst-bron.lijstprijs { color: var(--neutral-ink); }
.kst-bron.onbekend { color: var(--warning-ink); border-color: rgba(var(--warning-rgb), .45); }

.kst-sleutels {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 8px;
}
.kst-sleutel {
  display: flex;
  align-items: center;
  gap: 9px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 10px 13px;
  font-size: 0.8rem;
}
.kst-stip { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
.kst-stip.aan { background: var(--success-c); }
.kst-stip.uit { background: var(--border-strong); }
.kst-env { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.8rem; }
.kst-sleutel-dienst { color: var(--text-muted); margin-left: auto; font-size: 0.7333rem; }

.kst-ai { margin-top: 12px; font-size: 0.8rem; color: var(--text-muted); line-height: 1.7; }
.kst-leeg { padding: 18px; color: var(--text-muted); font-size: 0.8667rem; }

@media (max-width: 560px) {
  .kst-rij { grid-template-columns: 1fr; }
  .kst-bedrag { text-align: left; }
}

/* ============================================================
   LOGIN PAGE. FULL VIEWPORT SPLIT
   ============================================================ */
#login-page {
  /* ── Licht is de standaard, donker volgt het thema ───────────────────────
     Het inlogscherm was permanent donker ("een podium, geen oppervlak van de
     app"). Licht is nu de standaard voor iedereen, dus het scherm waar een
     nieuwe klant binnenkomt volgt het thema zoals de rest van de app: warm
     licht hier, en de oude donkere waarden staan hieronder onder
     [data-theme="dark"] voor wie zelf voor donker koos.

     Alle waarden komen uit het lichte thema van de app (--bg #F3EDE1, --card
     #FAF6EE, --text-c #1F1D19, --accent-ink #6E5320), geen nieuw palet. Gemeten
     contrasten staan in CHANGELOG.md. Tekst gebruikt --login-accent-ink / de
     *-ink waarden; het zand zelf (--login-fill) is alleen een vulling. */
  --login-stage:      #F3EDE1;   /* showcase-vlak: de grond van de app */
  --login-stage-ink:  #1F1D19;
  --login-stage-dim:  #6B6252;
  --login-panel:      #FAF6EE;   /* formulierpaneel: de kaartkleur */
  --login-panel-lift: #FFFCF6;   /* de actieve pil in de segmentschakelaar */
  --login-track:      #EAE2D2;   /* de goot waar die pil in ligt */
  --login-input-bg:   #FFFDF9;
  --login-border:     #D9CCB0;   /* haarlijnen en scheidingen -- decoratief */
  --login-line:       #D9CCB0;
  /* Omtrek van een BEDIENBAAR ding: WCAG 1.4.11, 3:1 tegen alles wat eraan
     grenst (paneel, goot, veldvulling, actieve pil). */
  --login-field-line: #857A63;
  --login-input-hover:#6B6252;
  --login-text:       #1F1D19;
  --login-muted:      #6B6252;
  --login-faint:      #6B6252;
  --login-placeholder:#7A705E;
  --login-accent-ink: #6E5320;
  --login-fill:       #E8D7B1;   /* zand als VULLING (knop, vinkjes, balk) */
  --login-fill-edge:  #BFA877;   /* de rand die de zandknop op crème leesbaar maakt */
  --login-on-fill:    #1A1A1A;
  --login-caret:      #6E5320;
  --login-ring:       rgba(110,83,32,0.20);
  --login-hover:      rgba(31,29,25,0.05);
  --login-link-line:  rgba(110,83,32,0.40);
  --login-card:       #FFFBF4;   /* kaart in het showcase-vlak */
  --login-card-inset: #F3EDE1;
  --login-bubble-in:  #EFE7D8;
  --login-bar-bg:     #E3D9C4;
  --login-dot:        #D9CCB0;
  --login-error:      #A52D25;
  --login-error-bg:   rgba(194,53,43,0.08);
  --login-error-line: rgba(194,53,43,0.32);
  --login-shadow:     0 1px 2px rgba(23,19,12,0.06), 0 12px 32px -12px rgba(23,19,12,0.14);
  --login-sel:        rgba(232,215,177,0.65);
  position: fixed;
  inset: 0;
  display: flex;
  z-index: 1000;
  padding: 0;
  background: var(--login-stage);
}
[data-theme="dark"] #login-page {
  --login-stage:      #17140F;
  --login-stage-ink:  #F1E9DA;
  --login-stage-dim:  #A79B85;
  --login-panel:      #211D16;
  --login-panel-lift: #2A251C;
  --login-track:      #17140F;
  --login-input-bg:   #17140F;
  --login-border:     #35332F;
  --login-line:       #3A3327;
  --login-field-line: #706D66;
  --login-input-hover:#574B37;
  --login-text:       #F1E9DA;
  --login-muted:      #A79B85;
  --login-faint:      #8A7F6B;
  --login-placeholder:#9A9489;
  --login-accent-ink: #F0E4C8;
  --login-fill:       #E8D7B1;
  --login-fill-edge:  #E8D7B1;
  --login-on-fill:    #1A1A1A;
  --login-caret:      #E8D7B1;
  --login-ring:       rgba(232,215,177,0.16);
  --login-hover:      rgba(241,233,218,0.06);
  --login-link-line:  rgba(240,228,200,0.35);
  --login-card:       #211D16;
  --login-card-inset: #17140F;
  --login-bubble-in:  #2A251C;
  --login-bar-bg:     #2A251C;
  --login-dot:        #3A3327;
  --login-error:      #E7756B;
  --login-error-bg:   rgba(228,102,90,0.10);
  --login-error-line: rgba(228,102,90,0.28);
  --login-shadow:     none;
  --login-sel:        rgba(232,215,177,0.32);
}

#login-page::before { display: none; }
#login-page::after  { display: none; }

/* ── Zolang Clerk laadt ─────────────────────────────────────────────────────
   Ons eigen formulier staat er wel in de HTML (het is het vangnet), maar het
   wordt niet getoond zolang we nog verwachten dat Clerk het overneemt. Anders
   ziet een bezoeker twee inlogschermen na elkaar.

   De titel en de ondertitel gaan mee: Clerks kaart heeft zijn eigen kop, en
   twee koppen die ongeveer hetzelfde zeggen op één paneel is dezelfde fout in
   het klein. De schakelaar Inloggen/Account aanmaken blijft WEL staan -- die
   is van ons, hij werkt met Clerk, en hij is het enige wat een nieuwe bezoeker
   meteen vertelt dat hij hier ook een account kan maken. */
#login-page.clerk-wacht #login-form-wrap { display: none; }
/* De kop en de ondertitel blijven nu WEL staan terwijl Clerk onderweg is.

   Ze gingen mee omdat Clerks kaart een eigen kop had die ongeveer hetzelfde
   zei. Die kop is er niet meer (zie #clerk-signin .cl-header verderop), dus de
   reden is weg -- en er is een reden bij gekomen om ze te laten staan: dit is
   het enige stuk tekst dat er meteen kan zijn. Zonder deze twee regels staat
   het paneel leeg te wachten op een script van een andere host, en dat is
   precies de traagheid die je op dit scherm voelt. */

#clerk-skelet {
  min-height: 320px;
  padding: 8px 0 0;
}
.skelet-regel, .skelet-veld, .skelet-knop {
  background: var(--login-input-bg);
  border-radius: var(--r-sm);
}
.skelet-regel { height: 14px; margin-bottom: 10px; }
.skelet-titel  { width: 58%; height: 22px; margin-bottom: 12px; }
.skelet-sub    { width: 78%; margin-bottom: 26px; }
.skelet-veld {
  height: 44px;
  margin-bottom: 16px;
  border: 1px solid var(--login-border);
}
.skelet-knop {
  height: 44px;
  margin-top: 8px;
  background: var(--login-border);
}
/* Een rustige puls, geen glinsterband die over het scherm schuift: dit staat er
   idealiter een halve seconde, en dan hoort het niet de aandacht te trekken. */
@keyframes skelet-puls { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
#clerk-skelet > * { animation: skelet-puls 1.4s ease-in-out infinite; }
#clerk-skelet > *:nth-child(2) { animation-delay: .1s; }
#clerk-skelet > *:nth-child(3) { animation-delay: .2s; }
#clerk-skelet > *:nth-child(4) { animation-delay: .3s; }
#clerk-skelet > *:nth-child(5) { animation-delay: .4s; }
@media (prefers-reduced-motion: reduce) {
  #clerk-skelet > * { animation: none; }
}

/* De regel onder de inlogknop: wachtwoord vergeten en registreren. Kleuren
   uit tokens -- hier stond #6b7280 hardgecodeerd, wat in het lichte thema
   toevallig klopte en verder nergens op sloeg. */
/* ── De segmentschakelaar inloggen / registreren ──────────────────────────
   Twee gelijkwaardige knoppen in één spoor. De actieve krijgt de opgetilde
   tint en de lichtlip; de andere blijft leesbaar maar rustig -- geen grijs
   dat je moet zoeken. Gemeten op het donkere paneel: --login-muted (#B5B5B5)
   op de goot (#17150F) haalt 8,90:1, en de actieve tekst (#F9F9F9) 14,92:1
   op de pil. (Hier stond de meting van het oude witte paneel: #6B6558 op
   #F1EFE9. Allebei die kleuren staan er niet meer.)

   Waarom een spoor en geen twee losse knoppen: zo is te zien dat het één
   keuze is met twee standen, en niet twee dingen die je allebei kunt doen. */
/* /login en /signup: welke kop en link zichtbaar is volgt uit <html data-auth> (dashboard.js zetModus). */
#login-page [data-auth-voor] { display: none; }
html[data-auth="login"] #login-page [data-auth-voor="login"],
html[data-auth="signup"] #login-page [data-auth-voor="signup"] { display: block; }
#login-page .auth-switch {
  margin: var(--sp-5) 0 0; text-align: center; color: var(--login-muted); font-size: 0.9333rem; line-height: 1.5;
}
#login-page .auth-switch a {
  color: var(--login-accent-ink); font-weight: 600; text-decoration: underline; text-decoration-thickness: 1px;
  text-underline-offset: 3px; text-decoration-color: var(--login-link-line, currentColor); border-radius: var(--r-xs);
  transition: text-decoration-color .16s ease, color .16s ease;
}
#login-page .auth-switch a:hover { color: var(--login-text); text-decoration-color: currentColor; text-decoration-thickness: 2px; }
#login-page #signup-uit { margin-bottom: var(--sp-4); }
/* Weergave (profielpagina): twee keuzes, de gekozen is zichtbaar zonder kleur alleen (rand + vinkje-vulling). */
.thema-kies { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-top: 4px; }
.thema-optie {
  height: 44px; border-radius: var(--r-sm); border: 1px solid var(--border-strong); background: transparent;
  color: var(--text-primary, var(--text)); font: inherit; font-size: 0.9333rem; font-weight: 600; cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
}
.thema-optie:hover { background: var(--hover-c); }
.thema-optie[aria-checked="true"] { background: var(--accent-c); border-color: var(--accent-ink); color: var(--on-accent); }
.thema-optie:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.thema-uitleg { margin: 12px 0 0; font-size: 0.8667rem; line-height: 1.55; color: var(--text-secondary); }
#login-page .auth-switch a:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 3px; }
.login-modus {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 3px;
  padding: 3px;
  margin: var(--sp-5) 0 var(--sp-5);
  /* Stond hardgecodeerd op #F1EFE9. Dat is precies het soort waarde dat een
     themawissel overleeft zonder mee te gaan: het paneel werd donker en deze
     goot bleef een lichte balk midden op het scherm. Nu een token. */
  background: var(--login-track);
  border: 1px solid var(--login-field-line);
  border-radius: var(--r-md);
}
.login-modus-knop {
  appearance: none;
  border: 0;
  background: transparent;
  font-family: inherit;
  font-size: 0.9333rem;
  font-weight: 600;
  letter-spacing: 0.007em;
  color: var(--login-muted);
  padding: 9px 10px;
  border-radius: calc(var(--r-md) - 4px);
  cursor: pointer;
  transition: background .16s ease, color .16s ease, box-shadow .16s ease;
}
.login-modus-knop:hover { color: var(--login-text); }
.login-modus-knop.actief {
  /* De pil moet OPTILLEN uit de goot. Op --login-panel deed hij dat toen het
     paneel wit was en de goot beige; op een donker paneel zou hij dezelfde
     kleur krijgen als het vlak eromheen en was er geen pil meer te zien --
     de schakelaar zou zijn toestand kwijt zijn. Vandaar een eigen tint. */
  background: var(--login-panel-lift);
  color: var(--login-text);
  /* De schaduw was zwart-op-wit gedacht. Op donker doet zwart niets; een
     lichtlip bovenlangs is wat daar hoogte geeft. */
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.06), 0 1px 2px rgba(0,0,0,0.35);
}
.login-modus-knop:focus-visible {
  outline: 2px solid var(--login-accent-ink);
  outline-offset: 1px;
}

/* ── Wat je krijgt, voordat je je e-mailadres achterlaat ─────────────────── */
.login-trust {
  display: flex; flex-wrap: wrap; justify-content: center;
  /* Krap genoeg om op één regel te passen in het paneel van 380px. Brak hij af,
     dan stond "Maandelijks opzegbaar" als losse regel eronder en las het als
     een voetnoot in plaats van als een van de drie. */
  gap: var(--sp-1) var(--sp-3);
  list-style: none; margin: var(--sp-4) 0 0; padding: 0;
  font-size: 0.8rem; color: var(--login-muted);
}
.login-trust li { display: flex; align-items: center; gap: 5px; white-space: nowrap; }
/* Het vinkje is decoratief; de tekst ernaast zegt het al. Vandaar een vorm en
   geen letter, en geen aria-label -- een schermlezer die "vinkje vinkje
   vinkje" voorleest helpt niemand. */
.login-trust li::before {
  content: '';
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--login-accent-ink);
  flex-shrink: 0;
}

.login-links {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  margin-top: 14px; flex-wrap: wrap;
}
/* 24 hoog, want dit is een losstaande knop onder het inlogformulier en geen
   link midden in een zin -- WCAG 2.5.8 zondert alleen dat tweede uit. Gemeten
   was hij 141x16. tests/raakdoelen.test.js legt die afweging uit voor de drie
   soorten die hetzelfde hadden op "Je assistent". */
.login-link {
  font-size: 0.8667rem; color: var(--login-muted); text-decoration: none;
  background: none; border: none; padding: 0; cursor: pointer;
  font-family: inherit;
  min-height: 24px; display: inline-flex; align-items: center;
}
.login-link:hover { color: var(--login-text); text-decoration: underline; }
/* Stond op --login-border: 1,32:1 op wit, dus in de praktijk onzichtbaar.
   Een scheidingsteken dat je niet ziet scheidt niets -- dan kun je hem net zo
   goed weglaten. Nu op de gedempte tekstkleur (5,79:1). */
.login-link-sep { color: var(--login-muted); font-size: 0.8rem; }

/* De themaknop stond hier ooit rechtsboven op het merkpaneel. Hij is weg op
   verzoek: op het inlogscherm valt er niets te wisselen dat de bezoeker helpt
   -- beide panelen zijn donker in beide thema's. Een knop die het scherm waar
   hij op staat niet verandert is een knop die alleen maar vragen oproept. In
   de app zelf blijft #btn-theme staan; die schakelt wel iets. */

/* Full-screen two-panel split. No card, no border-radius */
.login-split {
  display: flex;
  width: 100%;
  height: 100vh;
  border-radius: 0;
  box-shadow: none;
  max-width: none;
}

/* ── LEFT: form panel (42%) ── */
.login-form-side {
  flex: 0 0 42%;
  background: var(--login-panel);
  display: flex;
  flex-direction: column;
  align-items: center;
  /* flex-start en NIET center, met een auto-marge op het kind hieronder.

     Waarom: dit paneel scrollt (overflow-y: auto) en zijn inhoud is hoger dan
     het paneel zodra het venster laag is. Met justify-content: center loopt die
     overloop naar BEIDE kanten -- en de helft die boven de bovenrand uitsteekt
     is onbereikbaar. scrollTop staat dan al op 0 terwijl er nog inhoud boven
     zit; een negatieve scrollpositie bestaat niet.

     Nagemeten in de browser op 1280x720, een doodgewoon laptopscherm: het
     paneel was 720 hoog met 801 aan inhoud, en het logo stond op top: -21.
     Na scrollTop = 0 nog steeds op -21. Lager venster, erger: 600px -> 81px
     onbereikbaar, 480px -> 141px, 360px -> 201px (logo en kop allebei weg).
     Op het scherm waar iemand moet INLOGGEN, dus zonder manier om verder te
     komen.

     Auto-marges doen wat center hier had moeten doen: is er ruimte over, dan
     verdelen ze die en staat de inhoud gecentreerd; is er geen ruimte, dan
     worden ze nul en begint de inhoud op de scroll-oorsprong. */
  justify-content: flex-start;
  padding: 60px 72px;
  position: relative;
  overflow-y: auto;
}

/* Subtle vertical line separator */
.login-form-side::after {
  content: '';
  position: absolute;
  right: 0;
  top: 10%;
  bottom: 10%;
  width: 1px;
  background: linear-gradient(180deg, transparent, var(--login-border) 30%, var(--login-border) 70%, transparent);
}

/* Form content constrained for readability */
.login-form-inner {
  /* De andere helft van de fix hierboven: verticaal centreren zonder de
     bovenkant onbereikbaar te maken. Horizontaal blijft align-items: center
     van het paneel het werk doen. */
  margin: auto 0;
  width: 100%;
  max-width: 380px;
}

/* Logo linksboven op het formulierpaneel.

   Dit blok heeft drie oplossingen gehad voor één probleem -- goud op wit -- en
   ze zijn alle drie weg omdat het paneel niet meer wit is:
     1. het logo kaal op wit (2,87:1, een lichte vlek);
     2. een donkere plaat eronder (contrast opgelost, maar een zwarte doos op
        een licht paneel, vlak boven Clerks eigen kaart);
     3. een inkt-variant van het logo zelf (leesbaar, maar een ander merkteken
        op de plek waar iemand Helvaro voor het eerst ziet).

   Nu staat het echte gouden bestand er kaal op, precies zoals in de zijbalk.
   Eén merkteken, één bestand, geen plaat. */
.login-logo-top {
  display: inline-flex;
  align-self: flex-start;
  align-items: center;
  gap: 0;
  margin-bottom: 44px;
  padding: 0;
  background: none;
  /* Met terugvalwaarde: de schaal-tokens komen uit de Faro-CSS verderop in
     ditzelfde style-blok, en dat blok is leeg als Faro uitstaat. Zonder
     terugval krijgt het plaatje dan scherpe hoeken.
     En nee, de naam van die variabele staat hier bewust niet voluit: een
     dollarteken met accolades in dit bestand is geen tekst maar een
     invulling, en die propte hier de complete tokens-CSS midden in deze
     regel. Precies de val uit CLAUDE.md, en hij is hier echt dichtgeklapt. */
  border-radius: var(--r-lg, 18px);

  /* ── Geen plaat meer ──────────────────────────────────────────────────
     Hier stond een donker vlak onder het logo, en daarvoor een inkt-variant van
     het logo zelf. Allebei waren ze hetzelfde probleem in twee vermommingen:
     het gouden merkteken kan niet op wit. Nagemeten zijn de lichtste lijnen
     #F2CF7F -- 1,50:1 op wit, en de allerlichtste pixel 1,06:1, dus letterlijk
     wit op wit.

     Het paneel is nu donker (zie de tokens bij #login-page), dus het probleem
     bestaat niet meer: op #1E1B16 haalt datzelfde #F2CF7F 11,45:1.

     Dat is de reden om de plaat weg te halen en niet alleen bij te kleuren. Een
     donkere plaat op een donker paneel is een rechthoek die niets scheidt --
     dan zie je een doos om het logo waar geen doos hoort. Het logo staat er nu
     gewoon, zoals in de zijbalk. */
}

.login-logo-top img {
  height: 52px;
  width: auto;
  object-fit: contain;
  display: block;
}

.login-logo-top .brand-name { display: none; }

.login-welcome {
  font-size: 2.2667rem;
  /* Zette Inter hier hard, dus de kop-regel bovenaan kwam er niet doorheen en
     juist het eerste dat een klant ziet stond niet in de huisstijlletter. */
  font-family: var(--font-head);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--login-text);
  margin-bottom: 8px;
  line-height: 1.15;
}

.login-subtitle {
  color: var(--login-muted);
  font-size: 1rem;
  margin-bottom: 40px;
  line-height: 1.5;
}

.login-divider { display: none; }
.login-logo { display: none; }
.login-title { display: none; }
.login-icon { display: none; }

/* ── RIGHT: brand panel (58%). Calm dark surface, sand accents only ── */
.login-brand-side {
  /* Het showcase-vlak volgt het thema: licht is de standaard, de tokens
     (--card, --text, ...) komen dus gewoon uit het actieve thema. */
  flex: 1;
  background: var(--login-stage);
  color: var(--login-stage-ink);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 80px 72px;
  position: relative;
  overflow: hidden;
  gap: 0;
}

/* Large floating mock card */
.brand-card-mock {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 440px;
  background: var(--card-elevated);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
  padding: 32px;
  box-shadow: none;
}

.brand-card-header {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 28px;
}

.brand-card-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--border);
}

.brand-card-dot:first-child  { background: var(--accent); }
.brand-card-dot:nth-child(2) { background: var(--text-disabled); }

.brand-card-title {
  font-size: 0.8rem;
  font-weight: 700;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.125em;
}

/* Stat row */
.brand-stats {
  display: flex;
  gap: 14px;
  margin-bottom: 28px;
}

.brand-stat {
  flex: 1;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: 16px 12px;
  text-align: center;
  transition: border-color 0.3s;
}

.brand-stat-num {
  font-variant-numeric: tabular-nums;
  font-size: 1.7333rem;
  font-weight: 800;
  color: var(--accent-ink);
  line-height: 1;
  margin-bottom: 4px;
}

.brand-stat-label {
  font-size: 0.6667rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-top: 4px;
}

/* Bar chart */
.brand-bars {
  display: flex;
  align-items: flex-end;
  gap: 8px;
  height: 72px;
}

.brand-bar {
  flex: 1;
  border-radius: 6px 6px 0 0;
  background: var(--border);
  transition: background 0.3s;
}

.brand-bar.active {
  background: var(--accent);
}

.brand-bar:nth-child(2) { background: var(--divider); }
.brand-bar:nth-child(6) { background: var(--accent-hover); }
.brand-bar:nth-child(8) { background: var(--divider); }

/* Brand tagline */
.brand-tagline {
  position: relative;
  z-index: 1;
  text-align: center;
  padding: 0 20px;
}

.brand-tagline h2 {
  font-size: 1.6rem;
  font-weight: 800;
  color: var(--text);
  margin-bottom: 10px;
  font-family: 'Inter', sans-serif;
  letter-spacing: -0.012em;
}

.brand-tagline p {
  font-size: 1rem;
  color: var(--text-muted);
  line-height: 1.6;
}

/* ── Slides wrapper ── */
/* ── Het WhatsApp-mockje op het inlogscherm ─────────────────────────────────
   Stond hier eerst een staafgrafiek met 24 / 68% / 12. Die cijfers waren
   verzonnen, ongelabeld, en vertelden een makelaar niet wat dit product doet.
   Een gesprek wel: dit IS het product, en het tijdstip (21:47) draagt het
   argument dat geen enkele tagline zo goed kan maken. */
.login-what {
  margin: 18px 0 0;
  font-size: 0.8rem;
  line-height: 1.6;
  color: var(--login-muted, #5B6779);
  max-width: 42ch;
}

.brand-chat {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 4px 2px 2px;
}
.brand-chat-msg {
  max-width: 84%;
  padding: 9px 12px;
  border-radius: var(--r-md);
  font-size: 0.8rem;
  line-height: 1.45;
  position: relative;
}
.brand-chat-msg span { display: block; }
.brand-chat-msg em {
  display: block;
  margin-top: 3px;
  font-style: normal;
  font-size: 0.6667rem;
  letter-spacing: 0.02em;
  opacity: 0.55;
}
.brand-chat-msg.in {
  align-self: flex-start;
  background: rgba(255,255,255,0.07);
  color: #EDEDED;
  border-bottom-left-radius: 5px;
}
.brand-chat-msg.out {
  align-self: flex-end;
  background: rgba(var(--accent-rgb), 0.16);
  border: 1px solid rgba(var(--accent-rgb), 0.24);
  color: #F2E9D5;
  border-bottom-right-radius: 5px;
}
.brand-chat-msg.out em { text-align: right; }

.brand-slides-wrap {
  position: relative;
  z-index: 1;
  width: 100%;
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
}

.brand-slide {
  position: absolute;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.55s cubic-bezier(0.4,0,0.2,1), transform 0.55s cubic-bezier(0.4,0,0.2,1);
  pointer-events: none;
}

.brand-slide.active {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
  position: relative;
}

/* ── Score ring (slide 2) ── */
.brand-score-row {
  display: flex;
  align-items: center;
  gap: 20px;
  margin-top: 4px;
}

.brand-score-ring {
  position: relative;
  flex-shrink: 0;
}

.brand-score-label {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-variant-numeric: tabular-nums;
  font-size: 1.0667rem;
  font-weight: 800;
  color: var(--text);
}

.brand-score-items {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.brand-score-item {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.brand-score-item span {
  font-size: 0.6667rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

.brand-score-bar-wrap {
  height: 5px;
  background: var(--border);
  border-radius: var(--r-xs);
  overflow: hidden;
}

.brand-score-bar-fill {
  height: 100%;
  background: var(--accent);
  border-radius: var(--r-xs);
}

/* ── Agenda (slide 3) ── */
.brand-agenda {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-top: 4px;
}

.brand-agenda-item {
  display: flex;
  align-items: center;
  gap: 12px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 10px 14px;
}

.brand-agenda-time {
  font-size: 0.7333rem;
  font-weight: 700;
  color: var(--accent-ink);
  min-width: 38px;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
}

.brand-agenda-content { flex: 1; }

.brand-agenda-name {
  font-size: 0.8667rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 2px;
}

.brand-agenda-tag {
  font-size: 0.6667rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.brand-agenda-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  flex-shrink: 0;
}

.brand-agenda-dot.hot  { background: var(--error); }
.brand-agenda-dot.warm { background: var(--warning); }

/* ── Pagination dots ── */
.brand-dots {
  display: flex;
  /* 2 en niet 6: de knop is 4px breder geworden (zie .brand-dot), dus dit
     houdt de hart-op-hart-afstand op dezelfde 26px. */
  gap: 2px;
  justify-content: center;
  align-items: center;
  /* De knoppen zijn nu 24px hoog in plaats van 4; de marge compenseert dat,
     zodat de rij optisch op dezelfde plek blijft staan. */
  margin-top: 10px;
  position: relative;
  z-index: 1;
}

/* Het streepje is 4px hoog, en dat is als aanraakdoel te klein (de richtlijn
   is 24x24). Het streepje zelf laten we met rust -- het hoort een streepje te
   zijn -- maar de KNOP eromheen krijgt hoogte via padding, en het streepje
   wordt getekend met een achtergrond die alleen het midden vult. Zo verandert
   er niets aan wat je ziet en alles aan wat je kunt raken. */
/* De hoogte was hierboven al naar 24 gebracht, de BREEDTE bleef op 20 staan --
   gemeten 20x24, dus nog steeds onder de richtlijn. Nu 24 breed, terwijl het
   streepje 20 blijft (zie de achtergrond hieronder).

   De gap gaat van 6 naar 2 zodat de hart-op-hart-afstand 26px blijft, precies
   wat hij was: 20+6 en 24+2 zijn hetzelfde. Wat je ziet verandert dus niet,
   alleen wat je kunt raken. */
.brand-dot {
  width: 24px;
  height: 24px;
  padding: 0;
  border-radius: 2px;
  background: linear-gradient(var(--border), var(--border)) center / 20px 4px no-repeat;
  border: none;
  cursor: pointer;
  transition: background 0.2s cubic-bezier(0.4,0,0.2,1);
}
button.brand-dot { border: none; padding: 0; }

.brand-dot.active {
  background: linear-gradient(var(--accent), var(--accent)) center / 36px 4px no-repeat;
  width: 36px;
}

/* Login footer */
.login-footer {
  margin-top: auto;
  padding-top: 24px;
  color: var(--text-muted);
  font-size: 0.8rem;
  letter-spacing: 0.025em;
}

.login-footer span {
  color: var(--login-accent-ink);
  font-weight: 600;
}

/* Taalkiezer op het inlogscherm.

   Waarom hij hier moet staan en niet alleen in Instellingen: de schermtaal
   volgde tot nu toe de browser, en veranderen kon je hem pas NA het inloggen.
   Een Vlaamse makelaar met een Engelse Chrome kreeg dus een Engels inlogscherm
   zonder uitweg -- precies op het moment dat hij nog moet beslissen of hij dit
   product vertrouwt.

   Bewust klein en grijs: dit is een ontsnappingsluik, geen keuze die we willen
   opdringen. Wie de goede taal al ziet, hoort hem nauwelijks te merken. */
.login-lang {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 14px;
}

.login-lang select {
  appearance: none;
  -webkit-appearance: none;
  /* Een keuzelijst is bedienbaar, dus de rand die hem herkenbaar maakt valt
     onder WCAG 1.4.11 -- vandaar --login-field-line en niet de haarlijn. */
  border: 1px solid var(--login-field-line, rgba(255,255,255,0.22));
  border-radius: var(--r-sm);
  background: transparent;
  /* Stond op --text-muted: dat is het token van de APP, dat met het thema
     meebeweegt, op een paneel dat dat juist niet doet. In het lichte thema
     werd deze tekst daarmee donkergrijs op een donker paneel. */
  color: var(--login-muted);
  /* Het uitklaplijstje zelf tekent de browser; zonder dit doet hij dat licht,
     en dan klapt er een wit menu uit een donkere knop. */
  color-scheme: dark;
  font: inherit;
  font-size: 0.8rem;
  padding: 5px 26px 5px 9px;
  cursor: pointer;
  /* Het pijltje als achtergrond, want appearance:none haalt het weg. */
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23888' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 9px center;
}

.login-lang select:hover { color: var(--login-accent-ink); }

/* Op een touchscreen is 26px hoog te klein om betrouwbaar te raken. Op muis en
   toetsenbord blijft hij klein: daar is precisie geen probleem, en groter zou
   hem meer aandacht geven dan hij verdient. */
/* ── Inlogscherm: rijker uiterlijk (alleen opmaak, geen andere indeling) ─────
   Zelfde tokens, zelfde blokken. Warm paneel links met een gouden lijn
   bovenin, een diep verlicht vlak rechts, een grotere merkregel en
   knoppen met lichtval. #login-page voor de specificiteit, zodat de
   oudere regels hierboven niet terugwinnen. */
#login-page .login-form-side {
  padding: 56px 88px;
  background:
    linear-gradient(180deg, rgba(232,215,177,0.55) 0, rgba(232,215,177,0) 220px),
    radial-gradient(110% 50% at 0% 100%, rgba(232,215,177,0.38), transparent 65%),
    var(--login-panel-lift);
}
#login-page .login-form-side::before {
  content: '';
  position: absolute;
  left: 0; right: 0; top: 0;
  height: 3px;
  background: linear-gradient(90deg, #BFA877, #E8D7B1 50%, #BFA877);
}
#login-page .login-form-inner { max-width: 410px; }
#login-page .login-form-side .login-logo-top { margin-bottom: 0; padding-bottom: 48px; }
#login-page .login-form-side .login-logo-top img { width: auto; height: 96px; max-width: none; }
#login-page .login-form-side .login-welcome {
  font-size: 3.25rem;
  line-height: 1.02;
  letter-spacing: -0.04em;
  margin-bottom: 16px;
}
#login-page .login-form-side .login-subtitle {
  font-size: 1.125rem;
  line-height: 1.55;
  margin-bottom: 34px;
  max-width: 32ch;
}
#login-page .form-input {
  min-height: 54px;
  border-radius: var(--r-lg, 18px);
  background: #fff;
  box-shadow: 0 1px 2px rgba(23,19,12,0.05), 0 6px 16px -10px rgba(23,19,12,0.18);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
#login-page .btn-login {
  min-height: 54px;
  border-radius: var(--r-lg, 18px);
  font-weight: 700;
  letter-spacing: 0.01em;
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.6), 0 16px 30px -14px rgba(110,83,32,0.7);
  transition: transform .15s ease, box-shadow .15s ease, filter .15s ease;
}
#login-page .btn-login:hover { transform: translateY(-1px); filter: brightness(1.04); }
#login-page .btn-login:active { transform: translateY(0); }
#login-page .login-brand-side {
  background:
    radial-gradient(75% 60% at 82% 8%, rgba(255,248,228,1), transparent 60%),
    radial-gradient(65% 55% at 4% 100%, rgba(191,168,119,0.55), transparent 68%),
    linear-gradient(160deg, #F6EEDC 0%, #E9D9B4 100%);
  padding: 80px 96px;
}
#login-page .brand-slides-wrap {
  filter: drop-shadow(0 36px 46px rgba(60,42,10,0.2));
}
#login-page .login-brand-side .brand-tagline h2 {
  font-size: 3.1rem;
  line-height: 1.02;
  letter-spacing: -0.035em;
}
#login-page .login-brand-side .brand-tagline p { font-size: 1.125rem; }
/* ── Live gesprek per kanaal (chatbot, WhatsApp, e-mail, telefoon) ──────────
   Zonder .live-js (geen script, of "minder beweging") staat alles gewoon
   zichtbaar. Met .live-js verschijnen de berichten een voor een. Alle
   beweging staat achter .is-playing, de pauzeknop haalt die klasse weg. */
#login-page .brand-pauze {
  position: absolute;
  top: 28px;
  right: 32px;
  z-index: 3;
  width: 40px;
  height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1px solid var(--login-border);
  background: var(--login-card);
  color: var(--login-text);
  cursor: pointer;
  box-shadow: var(--login-shadow);
}
#login-page .brand-pauze[hidden] { display: none; }
#login-page .brand-pauze:hover { border-color: var(--login-fill-edge); }
#login-page .brand-pauze:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 2px; }
#login-page .brand-pauze .ico-speel { display: none; }
#login-page .brand-pauze[aria-pressed="true"] .ico-pauze { display: none; }
#login-page .brand-pauze[aria-pressed="true"] .ico-speel { display: block; }
#login-page .brand-live {
  margin-left: auto;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--login-accent-ink);
}
#login-page .brand-live i {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #2E9E5B;
  display: inline-block;
}
#login-page .login-brand-side.is-playing .brand-live i { animation: brandPuls 1.6s ease-in-out infinite; }
@keyframes brandPuls { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .45; transform: scale(.8); } }
#login-page .brand-chat { min-height: 268px; }
#login-page .brand-slide[data-slide="3"] .brand-chat { min-height: 250px; }
#login-page .brand-slide[data-slide="3"] .brand-chat-msg { font-size: 0.94rem; padding: 9px 14px 8px; }
#login-page .brand-chat-msg { display: block; }
#login-page .brand-spk {
  display: block;
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 3px;
  opacity: 0.7;
}
#login-page .brand-mail-meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 14px 22px 10px;
  font-size: 0.9rem;
  color: var(--login-muted);
}
#login-page .brand-mail-meta b { color: var(--login-text); font-size: 0.95rem; }
#login-page .brand-mail-meta.re { padding: 10px 22px; align-self: flex-end; text-align: right; }
#login-page .brand-slide .brand-card-mock { width: 100%; box-sizing: border-box; }
#login-page .login-brand-side.live-js .brand-chat-msg[data-live],
#login-page .login-brand-side.live-js .brand-mail-meta[data-live] {
  transition: opacity .35s ease, transform .35s ease;
}
#login-page .login-brand-side.live-js [data-live]:not(.is-in):not(.is-typing) {
  opacity: 0;
  visibility: hidden;
  transform: translateY(10px);
}
#login-page .login-brand-side.live-js .brand-chat-msg.is-typing { opacity: 1; visibility: visible; transform: none; min-width: 64px; min-height: 40px; position: relative; }
#login-page .login-brand-side.live-js .brand-chat-msg.is-typing > * { visibility: hidden; }
#login-page .login-brand-side.live-js .brand-chat-msg.is-typing::after {
  content: '';
  position: absolute;
  left: 18px;
  top: 50%;
  width: 6px;
  height: 6px;
  margin-top: -3px;
  border-radius: 50%;
  background: currentColor;
  opacity: .5;
  box-shadow: 12px 0 0 currentColor, 24px 0 0 currentColor;
  animation: brandTyp 1s ease-in-out infinite;
}
@keyframes brandTyp { 0%, 100% { opacity: .25; } 50% { opacity: .75; } }
#login-page .login-brand-side.live-js .brand-mail-meta.re.is-typing { opacity: 1; visibility: visible; transform: none; }
#login-page .brand-wave {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 3px;
  height: 40px;
  margin: 0 0 14px;
}
#login-page .brand-wave i {
  flex: 1;
  height: 12px;
  border-radius: 2px;
  background: var(--login-fill-edge);
  opacity: .8;
}
#login-page .login-brand-side.is-playing .brand-slide.active .brand-wave i { animation: brandGolf 1.1s ease-in-out infinite; }
#login-page .brand-wave i:nth-child(3n) { animation-delay: -.3s; }
#login-page .brand-wave i:nth-child(3n+1) { animation-delay: -.6s; }
#login-page .brand-wave i:nth-child(4n) { animation-delay: -.9s; }
@keyframes brandGolf { 0%, 100% { height: 8px; } 50% { height: 34px; } }
#login-page .login-brand-side.live-js .brand-dot.active.run::after {
  width: 0;
  animation: brandVul var(--dur, 9000ms) linear forwards;
}
@keyframes brandVul { from { width: 0; } to { width: 100%; } }
@media (prefers-reduced-motion: reduce) {
  #login-page .brand-live i, #login-page .brand-wave i,
  #login-page .brand-chat-msg.is-typing::after { animation: none !important; }
  #login-page .login-brand-side [data-live] { transition: none !important; }
}

/* Glas-effect op de gesprekskaart (inspiratie Gile/BrightNest, notities in de vault). */
#login-page .login-brand-side .brand-card-mock {
  background: rgba(255,252,246,0.74);
  -webkit-backdrop-filter: blur(16px) saturate(1.15);
  backdrop-filter: blur(16px) saturate(1.15);
  border: 1px solid rgba(255,255,255,0.75);
}
[data-theme="dark"] #login-page .login-brand-side .brand-card-mock {
  background: rgba(33,29,22,0.72);
  border-color: rgba(232,215,177,0.16);
}
/* Inspiratie-ronde 2 (notities in de vault): klein label boven de kop (BrightNest), een "Live"-pil boven
   de kop rechts (Bonnie), een gouden gloed achter de kaart (BrightNest/Gile) en een zwevend
   resultaatkaartje per kanaal (Riskora). */
#login-page .login-kicker {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin: 0 0 14px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--login-accent-ink);
}
#login-page .login-kicker i {
  width: 8px;
  height: 8px;
  background: linear-gradient(135deg, #E8D7B1, #BFA877);
  transform: rotate(45deg);
  display: inline-block;
}
#login-page .brand-kicker {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 18px;
  padding: 6px 14px;
  border-radius: var(--r-full, 999px);
  border: 1px solid rgba(255,255,255,0.8);
  background: rgba(255,252,246,0.7);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--login-text);
  box-shadow: 0 6px 18px -10px rgba(60,42,10,0.35);
}
#login-page .brand-kicker i { width: 7px; height: 7px; border-radius: 50%; background: #2E9E5B; display: inline-block; }
#login-page .brand-kicker span + span::before { content: '·'; margin-right: 8px; color: var(--login-muted); }
#login-page .brand-slides-wrap .brand-slide.active { position: relative; }
#login-page .brand-slides-wrap .brand-slide.active::before {
  content: '';
  position: absolute;
  left: -12%;
  right: -12%;
  top: 30%;
  bottom: -6%;
  background: radial-gradient(closest-side, rgba(226,186,104,0.42), rgba(226,186,104,0));
  filter: blur(24px);
  pointer-events: none;
}
#login-page .brand-slide .brand-card-mock { position: relative; z-index: 1; overflow: visible; margin-bottom: 30px; }
#login-page .brand-slide .brand-tagline { position: relative; z-index: 1; }
#login-page .brand-result {
  position: absolute;
  left: 24px;
  bottom: -22px;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 16px 10px 10px;
  border-radius: var(--r-full, 999px);
  background: #1F1D19;
  color: #F4E7C8;
  font-size: 0.85rem;
  font-weight: 600;
  box-shadow: 0 16px 34px -12px rgba(23,19,12,0.55);
}
#login-page .brand-result svg {
  box-sizing: content-box;
  padding: 5px;
  border-radius: 50%;
  background: #E8D7B1;
  color: #1F1D19;
}
#login-page .login-brand-side.live-js .brand-result.is-typing { opacity: 0; visibility: hidden; }
[data-theme="dark"] #login-page .brand-kicker { background: rgba(33,29,22,0.7); border-color: rgba(232,215,177,0.16); color: var(--login-text); }
[data-theme="dark"] #login-page .brand-result { background: #F4E7C8; color: #1F1D19; }
/* Het linkerpaneel mag niet scrollen (eigenaar, 28/10). Op lage vensters wordt het compacter
   zodat alles past; de schuifbalk is verborgen. Scrollen met wiel of toetsen blijft mogelijk als
   een venster echt te laag is, zodat er nooit iets onbereikbaar wordt. */
#login-page .login-form-side { scrollbar-width: none; }
/* Eigenaar, 28/10: het inlogscherm mag helemaal niet scrollen, ook niet met wiel of toetsen.
   De compacte regels hieronder zorgen dat alles past vanaf ongeveer 560 px hoogte. */
#login-page .login-split .login-form-side { overflow: hidden; overscroll-behavior: none; }
html:has(#login-page[style*="flex"]), body:has(#login-page[style*="flex"]) { overflow: hidden; }
#login-page .login-form-side::-webkit-scrollbar { display: none; }
@media (max-height: 960px) {
  #login-page .login-split .login-form-side { padding-top: 22px; padding-bottom: 10px; }
  #login-page .login-form-side .login-logo-top { padding-bottom: 24px; }
  #login-page .login-form-side .login-logo-top img { height: 80px; }
  #login-page .login-kicker { margin-bottom: 8px; }
  #login-page .login-form-side .login-welcome { font-size: 2.5rem; margin-bottom: 8px; }
  #login-page .login-form-side .login-subtitle { font-size: 1rem; margin-bottom: 20px; }
  #login-page .login-voet { margin-top: 16px; padding-top: 12px; }
  #login-page .login-brand-side .brand-slide .brand-chat { height: calc(100vh - 440px); min-height: 0; overflow: hidden; display: flex; flex-direction: column; justify-content: flex-end; }
  #login-page .login-brand-side .brand-slide[data-slide="2"] .brand-chat { height: calc(100vh - 490px); }
  #login-page .login-brand-side .brand-slide[data-slide="3"] .brand-chat { height: calc(100vh - 490px); }
  #login-page .login-brand-side.live-js [data-live]:not(.is-in):not(.is-typing) { display: none; }
  #login-page .login-brand-side .brand-chat-msg { flex: none; }
  #login-page .login-brand-side .brand-slides-wrap { min-height: 0; }
}
@media (max-height: 720px) {
  #login-page .login-form-side .login-logo-top { padding-bottom: 8px; }
  #login-page .login-form-side .login-logo-top img { height: 62px; }
  #login-page .login-kicker { display: none; }
  #login-page .login-form-side .login-welcome { font-size: 1.75rem; margin-bottom: 2px; }
  #login-page .login-form-side .login-subtitle { display: none !important; }
  #login-page .login-footer { font-size: 0.75rem; }
  #login-page .login-lang select { height: 30px; }
  #login-page .login-brand-side { padding-top: 24px; padding-bottom: 20px; justify-content: center; }
  #login-page .login-brand-side .brand-tagline h2 { font-size: 1.6rem; margin-bottom: 4px; }
  #login-page .login-brand-side .brand-tagline p { display: none; }
  #login-page .brand-kicker { margin-bottom: 10px; }
  #login-page .brand-chat { min-height: 0; }
  #login-page .login-brand-side .brand-slide .brand-chat { height: calc(100vh - 310px); overflow: hidden; display: flex; flex-direction: column; justify-content: flex-end; }
  #login-page .login-brand-side.live-js [data-live]:not(.is-in):not(.is-typing) { display: none; }
  #login-page .login-brand-side .brand-chat-msg { flex: none; }
  #login-page .brand-spk { display: none; }
  #login-page .login-brand-side .brand-mail-meta { padding: 6px 22px 4px; font-size: 0.82rem; }
  #login-page .login-brand-side .brand-slide[data-slide="2"] .brand-chat { height: calc(100vh - 350px); }
  #login-page .brand-slide[data-slide="3"] .brand-chat { min-height: 190px; }
  #login-page .brand-wave { height: 28px; margin-bottom: 8px; }
  #login-page .brand-dots { margin-top: 10px; }
  #login-page .login-brand-side .brand-slides-wrap { min-height: 0; }
  #login-page .login-brand-side .brand-chat-msg { font-size: 0.85rem; padding: 7px 12px 6px; line-height: 1.35; }
  #login-page .login-brand-side .brand-chat { gap: 8px; }
  #login-page .login-split .login-form-side { padding-top: 12px; padding-bottom: 8px; }
  #login-page .login-split .login-brand-side { padding-top: 14px; padding-bottom: 10px; }
  #login-page .brand-slide .brand-card-mock { margin-bottom: 24px; }
  #login-page .login-voet { gap: 6px 12px; }
  #login-page .login-voet { margin-top: 10px; padding-top: 8px; }
  #login-page .auth-switch { margin-top: 8px; }
}
/* Geen zwart in het gesprek (eigenaar, 28/10): antwoorden van de assistent en het resultaatkaartje in
   een diep groen dat bij het goud past. Wit op #1E4D38 haalt ruim 9:1. */
#login-page .login-brand-side .brand-slide .brand-chat-msg.out { background: #1E4D38; color: #FFFFFF; }
#login-page .login-brand-side .brand-slide .brand-chat-msg.out em { color: rgba(255,255,255,0.78); }
#login-page .login-brand-side .brand-result { background: #1E4D38; color: #FFFFFF; }
#login-page .login-brand-side .brand-result svg { background: #E8D7B1; color: #1F4733; }
[data-theme="dark"] #login-page .login-brand-side .brand-result { background: #1E4D38; color: #FFFFFF; }
/* Zwevende berichtjes met zachte schaduwen (eigenaar, 28/10). */
#login-page .login-brand-side .brand-slide .brand-chat-msg.in {
  background: #FFFFFF;
  box-shadow: 0 1px 2px rgba(23,19,12,0.05), 0 10px 24px -12px rgba(23,19,12,0.28);
}
#login-page .login-brand-side .brand-slide .brand-chat-msg.out {
  box-shadow: 0 2px 4px rgba(30,77,56,0.18), 0 14px 28px -12px rgba(30,77,56,0.6);
}
#login-page .login-brand-side .brand-slide .brand-chat { padding-bottom: 6px; }
#login-page .login-brand-side .brand-card-mock {
  box-shadow: 0 2px 6px rgba(60,42,10,0.06), 0 30px 60px -24px rgba(60,42,10,0.35);
}
#login-page .login-brand-side .brand-slide .brand-card-mock { background: rgba(247,240,228,0.86); }
[data-theme="dark"] #login-page .login-brand-side .brand-slide .brand-chat-msg.in { background: #2A251C; box-shadow: 0 10px 24px -12px rgba(0,0,0,0.6); }
/* Vloeiend binnenkomen: elk nieuw bericht glijdt zacht omhoog en vervaagt in (eindig, geen lus). */
#login-page .login-brand-side.live-js .brand-chat-msg.is-typing,
#login-page .login-brand-side.live-js .brand-chat-msg.is-in,
#login-page .login-brand-side.live-js .brand-mail-meta.is-in { animation: brandIn .5s cubic-bezier(.22,1,.36,1) both; }
#login-page .login-brand-side.live-js .brand-result.is-in { animation: brandIn .6s cubic-bezier(.22,1,.36,1) both; }
@keyframes brandIn { from { opacity: 0; transform: translateY(14px) scale(.98); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: reduce) {
  #login-page .login-brand-side [data-live] { animation: none !important; }
}
[data-theme="dark"] #login-page .login-form-side {
  background:
    linear-gradient(180deg, rgba(232,215,177,0.12) 0, rgba(232,215,177,0) 220px),
    var(--login-panel);
}
[data-theme="dark"] #login-page .form-input { background: var(--login-input-bg); }
[data-theme="dark"] #login-page .login-brand-side {
  background:
    radial-gradient(75% 60% at 82% 8%, rgba(232,215,177,0.16), transparent 60%),
    radial-gradient(65% 55% at 4% 100%, rgba(191,168,119,0.14), transparent 68%),
    var(--login-stage);
}
[data-theme="dark"] #login-page .brand-slides-wrap { filter: drop-shadow(0 36px 46px rgba(0,0,0,0.5)); }
@media (prefers-reduced-motion: reduce) {
  #login-page .btn-login, #login-page .form-input { transition: none; }
  #login-page .btn-login:hover { transform: none; }
}

@media (hover: none) and (pointer: coarse) {
  .login-lang select {
    min-height: 44px;
    padding-top: 10px;
    padding-bottom: 10px;
  }
  /* Zie de opmerking bij .row-action-btn: op een aanraakscherm hoort een
     bedienbaar element minstens 44x44 te zijn. De ICOON blijft even groot;
     alleen het raakvlak groeit, dus de rij ziet er niet anders uit. */
  .row-action-btn { width: 44px; height: 44px; }
  /* Een sluitknop die op de KLEINSTE schermen krimpt is precies verkeerd om.
     Stond op 28px onder 480px; nu blijft hij minstens even groot als de rest. */
  .panel-close { width: 44px; height: 44px; }
  .btn-icon { min-height: 44px; }
}

/* Zichtbare focusring: dit is een van de weinige bedienbare dingen op het
   scherm buiten de inlogkaart, dus wie met het toetsenbord werkt moet hem
   kunnen vinden. */
.login-lang select:focus-visible {
  outline: 2px solid var(--login-accent-ink);
  outline-offset: 2px;
}

/* Responsive: stack on mobile */
@media (max-width: 860px) {
  .login-split { flex-direction: column; height: auto; }
  /* De regel flex:none liet het paneel precies zo hoog worden als zijn inhoud. Het
     merkpaneel eronder staat op display:none, dus onder de laatste voetnoot
     bleef de rest van het scherm over als een kale band in de kleur van
     #login-page -- gemeten 227px zwart onder de footer op een venster van
     1139px. Geen scheiding, geen inhoud, alleen een gat.
     min-height in plaats van height: bij weinig ruimte moet het paneel nog
     steeds mogen groeien en scrollen. */
  .login-form-side { flex: 1 0 auto; min-height: 100%; padding: 36px 24px 48px; align-items: center; }
  .login-form-inner { max-width: 420px; }

  /* Het merkpaneel gaat weg op smal, in plaats van onder het formulier te
     stapelen. Gestapeld kwam het namelijk ONDER de footer terecht -- eerst
     "(c) 2026 Helvaro", daarna nog anderhalf scherm marketing. De pagina werd
     ruim 2.000px hoog op een telefoon van 844.
     Wie op zijn telefoon naar het inlogscherm gaat, wil inloggen; de belofte
     staat al in de regel onder het formulier. */
  .login-brand-side { display: none; }

  /* Het logo was hier even groot als op desktop en duwde het formulier tot
     bijna een derde van het scherm naar beneden. */
  .login-logo-top { margin-bottom: 24px; align-self: center; }
  .login-logo-top img { max-width: 150px; }
}

/* Hier stonden twee light-overschrijvingen voor het inlogscherm. Ze deden al
   niets -- .login-form-side kreeg background: var(--login-panel), wat het
   buiten de media-query ook al had -- en nu het paneel in beide thema's donker
   is, zouden ze alleen maar suggereren dat er nog een lichte variant bestaat.

   Het inlogscherm volgt het thema met opzet niet, om dezelfde reden als het
   merkpaneel ernaast: dit is een podium, geen oppervlak van de app. Er is op
   dit scherm ook geen gebruiker om een voorkeur van te kennen -- initTheme
   heeft nog niets ingelogd om op af te gaan, en elke nieuwe bezoeker krijgt
   toch dark. Eén ondergrond, één logo, geen tweede palet om bij te houden.

   #login-page houdt dus ook in het lichte thema zijn eigen achtergrond. */

/* Hier stonden drie overschrijvingen die het merkpaneel in het lichte thema
   licht maakten -- de chatballonnen kregen donkere tekst, het puntenraster werd
   donker. Dat was een correcte oplossing voor het verkeerde probleem: het
   paneel hoorde helemaal niet licht te worden. Nu het op --login-stage staat en
   in beide thema's donker blijft, zouden deze regels de demo juist ONleesbaar
   maken: donkere tekst op een donker paneel. Ze zijn daarom weg in plaats van
   aangepast. */

.form-group {
  margin-bottom: 18px;
}

.form-label {
  display: block;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--login-muted);
  text-transform: uppercase;
  letter-spacing: 0.067em;
  margin-bottom: 8px;
}

.form-input {
  width: 100%;
  padding: 15px 18px;
  background: var(--login-input-bg);
  border: 1.5px solid var(--login-field-line);
  border-radius: var(--r-md);
  color: var(--login-text);
  font-size: 1rem;
  font-family: 'Inter', sans-serif;
  transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  outline: none;
  min-height: 52px;
  touch-action: manipulation;
}

.form-input:hover {
  border-color: var(--login-input-hover);
  background: var(--login-input-bg);
}

.form-input:focus {
  border-color: var(--login-accent-ink);
  background: var(--login-input-bg);
  box-shadow: 0 0 0 3px var(--login-ring);
}

.form-input:focus-visible {
  outline: none;
}

.form-input::placeholder { color: var(--login-placeholder); }

/* Error state for inputs */
.form-input.error {
  border-color: var(--error);
  background: rgba(220,38,38,0.03);
}
.form-input.error:focus {
  box-shadow: 0 0 0 4px rgba(220,38,38,0.12);
}

/* Login footer */
.login-footer {
  text-align: center;
  margin-top: 28px;
  padding-top: 20px;
  border-top: 1px solid var(--login-border);
  color: var(--login-muted);
  font-size: 0.8rem;
  letter-spacing: 0.025em;
}

.login-footer span {
  /* Stond op --accent-pressed: zand op wit, 2,14:1. Dit is de regel die won
     van de eerdere hierboven, dus dit was wat je echt zag. */
  color: var(--login-accent-ink);
  font-weight: 600;
}

.btn-login {
  width: 100%;
  padding: 17px;
  background: var(--accent);
  border: none;
  border-radius: var(--radius-btn);
  color: var(--on-accent);
  font-family: 'Inter', sans-serif;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0.013em;
  cursor: pointer;
  margin-top: 16px;
  transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  position: relative;
  overflow: hidden;
  box-shadow: none;
  min-height: 56px;
  touch-action: manipulation;
}

.btn-login::before {
  content: '';
  position: absolute;
  inset: 0;
  background: var(--accent-hover);
  opacity: 0;
  transition: opacity 0.2s ease;
}

/* Fase 4: was width/height 0 -> 200px, een layout-transition-vondst. Vaste
   maat nu, geschaald met transform -- zelfde ripple, geen reflow. */
.btn-login::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 200px;
  height: 200px;
  background: rgba(18,18,18,0.12);
  border-radius: 50%;
  transform: translate(-50%, -50%) scale(0);
  transition: transform 0.5s var(--ease-out);
}

.btn-login:hover::before { opacity: 1; }
.btn-login:hover {
  transform: translateY(-1px);
  box-shadow: var(--elev-1);
}
.btn-login:active {
  transform: translateY(0) scale(0.98);
  background: var(--accent-pressed);
  box-shadow: none;
  transition-duration: var(--dur-fast);
}
.btn-login:active::after {
  transform: translate(-50%, -50%) scale(1);
}
.btn-login:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(232,215,177,0.35);
}
.btn-login span { position: relative; z-index: 1; display: inline-flex; align-items: center; gap: 6px; }

/* Loading state for login button */
.btn-login.loading {
  pointer-events: none;
  opacity: 0.85;
}
.btn-login.loading span { opacity: 0; }
.btn-login.loading::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 22px;
  height: 22px;
  margin: -11px 0 0 -11px;
  border: 2px solid rgba(18,18,18,0.25);
  border-top-color: var(--on-accent);
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
}

.login-error {
  display: none;
  margin-top: 16px;
  padding: 12px 16px;
  /* Het vlak mag iets zwaarder nu het op donker ligt: 6% rood op bijna-zwart
     is geen vlak meer maar ruis. */
  background: var(--login-error-bg);
  border: 1px solid var(--login-error-line);
  border-radius: var(--r-sm);
  /* Deze regel heeft twee keer eerder een onleesbare foutmelding opgeleverd,
     allebei op dezelfde manier: de kleur werd gekozen voor het paneel van
     toen, en het paneel veranderde.

     Eerst stond hier var(--error) -- een custom property die in dit bestand
     nergens bestaat. Een var() zonder fallback maakt de hele declaratie
     ongeldig, dus erfde de tekst #F9F9F9 van de ouder: wit op lichtroze.
     Daarna #B42318, correct op het witte paneel (7,6:1) en nu 2,61:1 op
     #1E1B16 -- opnieuw de enige foutmelding die deze gebruiker te zien
     krijgt, opnieuw onleesbaar.

     Nu dezelfde tint als colorDanger in CLERK_APPEARANCE, zodat onze eigen
     foutmelding en die van Clerk niet uit elkaar kunnen lopen: 6,20:1. */
  color: var(--login-error);
  font-size: 0.8667rem;
  font-weight: 500;
  text-align: center;
}

.login-error.visible { display: flex; align-items: center; justify-content: center; gap: 8px; }

/* Clerk renders its own "Don't have an account? Sign up" footer, which is
   still English and navigates away to a Clerk-hosted page. Setting
   appearance.elements.footerAction did not take, so this targets Clerk's own
   stable cl- classes instead of guessing at appearance keys. Our own in-page
   switch sits directly below and does the same job in Dutch. */
#clerk-signin .cl-footerAction,
#clerk-signin .cl-footerAction__signIn,
#clerk-signin .cl-footerAction__signUp { display: none !important; }

/* De "Secured by Clerk"-balk.

   Die stond als grijze strook PAL onder de hoofdknop -- het laatste wat iemand
   leest voor hij besluit een account te maken. Een merk dat niet van jou is,
   op de plek waar het vertrouwen wordt opgebouwd, en met een grijze vulling
   die de knop erboven visueel afsnijdt.

   Weghalen is toegestaan op een betaald Clerk-plan; op het gratis plan hoort
   het te blijven staan. Staat dit er ooit weer, dan is dat de reden -- en dan
   is het weghalen ervan geen ontwerpkeuze meer maar een licentiekwestie.

   Dezelfde aanpak als de footerAction hierboven: Clerks eigen stabiele
   cl-klassen, niet gokken naar appearance-sleutels. */
#clerk-signin .cl-footer,
#clerk-signin .cl-internal-uyu30o,
#clerk-signin [class*="cl-footer"]:not([class*="cl-footerAction"]) { display: none !important; }

/* ═══ Clerk in Helvaro's vormentaal ═══════════════════════════════════════
   Clerk levert het formulier; wij leveren het paneel. Tot nu toe waren dat
   twee ontwerpen boven elkaar: een witte kaart met een eigen rand en schaduw,
   midden op een wit paneel, met systeemletters ertussen. Het las als een
   widget die op de pagina geplakt was.

   Alles hieronder heeft één doel: de KAART laten verdwijnen en het FORMULIER
   laten staan, in de typografie en de kleuren die het paneel al gebruikt.
   Geen enkele regel verzint een kleur -- ze komen uit de --login-* tokens die
   #login-page hierboven al definieert.

   Waarom CSS en niet appearance.elements: dat is hier al eens geprobeerd voor
   footerAction en het nam niet (zie de opmerking hierboven). appearance blijft
   wel in gebruik voor wat het betrouwbaar doet -- kleuren, letter en radius
   als variabelen, zie CLERK_APPEARANCE. */

/* ── De kaart zelf: weg ────────────────────────────────────────────────────
   Let op de eerste selector, want die is niet vanzelfsprekend: Clerk mount NIET
   in #clerk-signin, hij zet zijn cl-rootBox OP dat element. Host en rootBox
   zijn hetzelfde ding, dus '#clerk-signin .cl-rootBox' (met spatie) raakt niets.

   Dat is meer dan een schoonheidsfoutje. Clerk geeft die rootBox een breedte
   die met de inhoud meebeweegt. Zolang zijn kaart een vaste breedte had viel
   dat niet op; haal die weg en zet de kinderen op 100%, dan wijst die 100%
   naar een ouder die zichzelf om de inhoud vouwt -- en klapt het formulier in
   tot de smalste tekst erin. Gemeten: 195 px in een paneel van 380. */
#clerk-signin,
#clerk-signin .cl-cardBox { width: 100%; box-shadow: none; border: none; background: transparent; }
#clerk-signin .cl-card {
  background: transparent;
  border: none;
  box-shadow: none;
  padding: 0;
  width: 100%;
  gap: 18px;
  /* Clerk zet hier margin: -1px -1px 0. Dat is zijn eigen truc om de kaart
     over de 1px rand van zijn omhulsel heen te trekken -- correct, zolang die
     rand er is. Wij halen hem hierboven weg (border: none), en dan compenseert
     die negatieve marge niets meer: hij verschuift het HELE Clerk-formulier
     1px omhoog en 1px naar links.

     Gemeten: onze segmentschakelaar stond op x=56,5 en elk Clerk-element --
     de Google-knop, het invoerveld, de hoofdknop -- op x=55,5. Eén pixel scheef
     over de volle hoogte van het formulier, met als zichtbaar gevolg dat de
     bovenrand van de Google-knop onder de schakelaar vandaan piepte. Precies
     de vlek die op het inlogscherm te zien was.

     Niet op te lossen met padding, want de verschuiving zit in de marge; en
     niet met top, want het element is niet gepositioneerd. */
  margin: 0;
}

/* Clerks eigen kop weg. Het paneel heeft er al een, in Space Grotesk en in de
   taal van de klant, en zetModus() wisselt hem mee tussen inloggen en
   registreren. Zie ook eigenFormulier(), waar hij niet langer verborgen wordt. */
#clerk-signin .cl-header { display: none; }

/* ── Google-knop: een rustige tweede keuze ───────────────────────────────── */
#clerk-signin .cl-socialButtonsRoot,
#clerk-signin .cl-socialButtons { width: 100%; gap: 10px; }
#clerk-signin .cl-socialButtonsBlockButton {
  width: 100%;
  height: 46px;
  /* Niet --login-panel: dan heeft de knop dezelfde kleur als het paneel eronder
     en leunt hij volledig op zijn rand. Op wit viel dat niet op; op donker is
     een vlak dat NIET optilt geen knop. Zelfde tint als de actieve pil, zodat
     alles wat je kunt indrukken op dit scherm op dezelfde hoogte ligt. */
  background: var(--login-panel-lift);
  border: 1px solid var(--login-field-line);
  border-radius: var(--r-sm);
  box-shadow: none;
  transition: border-color .15s ease, background .15s ease;
}
#clerk-signin .cl-socialButtonsBlockButton:hover {
  background: rgba(232, 215, 177, .10);
  border-color: var(--login-accent-ink);
}
#clerk-signin .cl-socialButtonsBlockButtonText {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.9333rem;
  font-weight: 500;
  color: var(--login-text);
}

/* ── Het witte blokje op de Google-knop ─────────────────────────────────────
   Clerk zet een badge op de aanmeldmethode die je de VORIGE keer gebruikte
   ("Last used"). Die badge is niet meegestyled toen dit paneel donker werd,
   dus hij bleef wit met donkere tekst -- een fel blokje dat half over de rand
   van de knop hing en er kapot uitzag.

   Niet verbergen maar meekleuren: het is nuttige informatie op een scherm waar
   iemand twijfelt met welk account hij ook alweer binnenkwam. Wel in de
   gedempte tinten van dit paneel, zodat hij vertelt zonder te schreeuwen.

   position:relative op de knop zelf: de badge wordt absoluut geplaatst, en
   zonder een houvast klom hij naar de kaart eromheen -- dat is precies waarom
   hij over de rand viel. */
#clerk-signin .cl-socialButtonsBlockButton { position: relative; }
#clerk-signin .cl-socialButtonsBlockButton .cl-badge,
#clerk-signin .cl-badge {
  background: var(--login-panel-lift);
  border: 1px solid var(--login-field-line);
  color: var(--login-muted);
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.6667rem;
  font-weight: 600;
  letter-spacing: .04em;
  padding: 2px 7px;
  border-radius: var(--r-full);
  /* Binnen de knop houden. De badge stond rechtsboven half buiten de rand;
     deze twee waarden zetten hem netjes in de rechterhelft, verticaal
     gecentreerd, waar hij de tekst niet raakt. */
  top: 50%;
  right: 10px;
  transform: translateY(-50%);
  box-shadow: none;
}

/* ── Scheiding ───────────────────────────────────────────────────────────── */
#clerk-signin .cl-dividerRow { gap: 12px; margin: 4px 0; }
#clerk-signin .cl-dividerLine { background: var(--login-border); height: 1px; }
#clerk-signin .cl-dividerText {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.6667rem;
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--login-placeholder);
}

/* ── Velden ──────────────────────────────────────────────────────────────
   Exact de vorm van .form-label / .form-input hierboven, zodat het vangnet en
   Clerks formulier niet te onderscheiden zijn. Dat is niet alleen netjes: valt
   Clerk uit, dan wisselt de pagina naar het eigen formulier, en die wissel
   hoort niet op te vallen.

   GEEN regel op .cl-required. Die klasse ziet eruit als het sterretje bij een
   verplicht veld, maar Clerk zet hem op het INVOERVELD zelf. Een display:none
   erop laat het e-mailveld verdwijnen terwijl de knop eronder blijft staan --
   een inlogscherm zonder invoerveld, dat er verder normaal uitziet. */
#clerk-signin .cl-formFieldLabelRow { margin-bottom: 7px; }
#clerk-signin .cl-formFieldLabel {
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.7333rem;
  font-weight: 600;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--login-muted);
}
#clerk-signin .cl-formFieldInput,
#clerk-signin .cl-input {
  /* min-height en flex staan er niet voor de sier. Het veld is een flexitem in
     een rij die zich om de inhoud vouwt; 'height' alleen wordt daar weggedrukt
     en het veld kwam uit op 33,75 px naast een knop van 48. */
  height: 46px;
  min-height: 46px;
  flex: 0 0 auto;
  box-sizing: border-box;
  padding: 0 14px;
  background: var(--login-input-bg);
  border: 1px solid var(--login-field-line);
  border-radius: var(--r-sm);
  font-family: 'Inter', sans-serif;
  font-size: 1rem;
  color: var(--login-text);
  box-shadow: none;
  transition: border-color .15s ease, box-shadow .15s ease;
}
#clerk-signin .cl-formFieldInput::placeholder { color: var(--login-placeholder); }
#clerk-signin .cl-formFieldInput:focus,
#clerk-signin .cl-input:focus {
  outline: none;
  border-color: var(--login-accent-ink);
  box-shadow: 0 0 0 3px var(--login-ring);
}
#clerk-signin .cl-formFieldInputGroup { border-radius: var(--r-sm); }
#clerk-signin .cl-formFieldInputShowPasswordButton { color: var(--login-muted); }
#clerk-signin .cl-formFieldInputShowPasswordButton:hover { color: var(--login-text); }

/* ── De hoofdknop ────────────────────────────────────────────────────────
   Zand met donkere inkt, precies zoals .btn-login. Clerk zette hier een bijna
   zwarte knop neer: de enige plek op het scherm waar de merkkleur hoort te
   staan, en juist daar stond hij niet. */
#clerk-signin .cl-formButtonPrimary {
  width: 100%;
  height: 48px;
  margin-top: 4px;
  background: var(--accent-c);
  border: none;
  border-radius: var(--r-sm);
  box-shadow: none;
  text-shadow: none;
  font-family: 'Space Grotesk', sans-serif;
  font-size: 0.9333rem;
  font-weight: 600;
  letter-spacing: .03em;
  text-transform: none;
  color: var(--on-accent);
  transition: background .15s ease, transform .12s ease;
}
#clerk-signin .cl-formButtonPrimary:hover { background: var(--accent-hover-c); }
#clerk-signin .cl-formButtonPrimary:active { transform: translateY(1px); }
#clerk-signin .cl-formButtonPrimary:focus-visible {
  outline: 2px solid var(--login-accent-ink);
  outline-offset: 2px;
}
#clerk-signin .cl-buttonArrowIcon { color: var(--on-accent); opacity: .75; }

/* ── Foutmeldingen in dezelfde toon als .login-error ─────────────────────── */
#clerk-signin .cl-formFieldErrorText,
#clerk-signin .cl-formFieldWarningText,
#clerk-signin .cl-alertText {
  font-family: 'Inter', sans-serif;
  font-size: 0.8667rem;
  color: var(--login-error);
}

/* Sign-in / sign-up switch under the Clerk component */
#clerk-toggle {
  text-align: center;
  margin-top: 16px;
  font-size: 0.8667rem;
  /* --text-disabled haalde 3,2:1 (donker) en 2,5:1 (licht); leesbare tekst
     vraagt 4,5:1 (WCAG 1.4.3, audit 26/09). */
  color: var(--text-secondary);
}
.clerk-toggle-link {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  font-weight: 600;
  color: var(--login-accent-ink);
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.clerk-toggle-link:hover { color: var(--login-text); }
.clerk-toggle-link:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 2px; border-radius: var(--r-xs); }

.login-error::before {
  content: '';
  width: 18px;
  height: 18px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23DC2626' stroke-width='2'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='12'/%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'/%3E%3C/svg%3E");
  background-size: contain;
  flex-shrink: 0;
}

@media (prefers-reduced-motion: reduce) {
  .skeleton, .skeleton::after { animation: none; }
  .login-error { animation: none; }
  .btn-login.loading::after { animation: spin 1.5s linear infinite; }
  * { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}

/* ============================================================
   CALENDAR (WEEK VIEW)
   ============================================================ */
.cal-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  background: var(--bg-primary);
}
.cal-today-btn {
  padding: 7px 16px;
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  background: var(--bg-card);
  color: var(--text-primary);
  font-size: 0.8667rem;
  font-weight: 600;
  cursor: pointer;
  font-family: 'Inter', sans-serif;
  transition: border-color 0.2s;
}
.cal-today-btn:hover { border-color: rgba(var(--accent-rgb),0.5); color: var(--accent-ink); }
.cal-nav-btn {
  width: 32px;
  height: 32px;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  background: var(--bg-card);
  color: var(--text-primary);
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color 0.2s;
}
.cal-nav-btn:hover { border-color: rgba(var(--accent-rgb),0.5); color: var(--accent-ink); }
.cal-range-label {
  font-size: 1.0667rem;
  font-weight: 700;
  color: var(--text-primary);
  margin-left: 4px;
  font-family: 'Inter', sans-serif;
}
.cal-book-btn {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 9px 18px;
  background: var(--accent);
  border-radius: var(--r-sm);
  color: var(--on-accent);
  font-size: 0.8667rem;
  font-weight: 600;
  text-decoration: none;
  box-shadow: none;
  transition: transform 0.15s, box-shadow 0.15s;
}
.cal-book-btn:hover { transform: translateY(-1px); box-shadow: none; }
/* Op een telefoon stak de boekknop 14px buiten het scherm (gemeten op 375px):
   de werkbalk wikkelt dan, en de knop krijgt de hele tweede regel. */
@media (max-width: 480px) {
  .cal-toolbar { flex-wrap: wrap; padding: 10px 12px; row-gap: 10px; }
  .cal-book-btn { margin-left: 0; flex: 1 1 100%; justify-content: center; }
}

/* Day header row */
.cal-day-headers {
  display: flex;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  background: var(--bg-primary);
}
.cal-gutter { width: 54px; flex-shrink: 0; }
.cal-day-cols-header {
  flex: 1;
  min-width: 0;
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
}
/* Zeven dagkolommen plus een gutter van 54px legden een bodem van 425px onder
   de week. Op 390px verdween zondag daardoor volledig en werd zaterdag
   doormidden gesneden, zonder scrollbalk, want de pagina verbergt zijn
   overflow. De gutter (de uren-as) is het enige dat hier gemist kan worden. */
@media (max-width: 480px) {
  .cal-gutter { width: 34px; }
  .cal-day-header-cell { padding: 8px 2px; }
}
.cal-day-header-cell {
  padding: 10px 8px;
  text-align: center;
  border-left: 1px solid var(--border);
}
.cal-day-header-cell .cal-day-name {
  font-size: 0.7333rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.073em;
  color: var(--text-muted);
  margin-bottom: 4px;
}
.cal-day-header-cell .cal-day-num {
  font-size: 1.4667rem;
  font-weight: 700;
  color: var(--text-primary);
  line-height: 1;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  margin: 0 auto;
}
.cal-day-header-cell.cal-today .cal-day-num {
  background: var(--accent);
  color: var(--on-accent);
  box-shadow: none;
}
.cal-day-header-cell.cal-today .cal-day-name { color: var(--accent-ink); }

/* Scrollable grid */
.cal-scroll-area {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
}
.cal-scroll-area::-webkit-scrollbar { width: 6px; }
.cal-scroll-area::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb),0.3); border-radius: var(--r-xs); }
.cal-time-grid {
  display: flex;
  min-height: 880px;
}
.cal-time-labels {
  width: 58px;
  flex-shrink: 0;
  position: relative;
}
.cal-time-label {
  height: 80px;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  padding-right: 10px;
  font-size: 0.7333rem;
  color: var(--text-muted);
  font-weight: 600;
  padding-top: 4px;
  box-sizing: border-box;
  position: relative;
}
.cal-time-label-half {
  position: absolute;
  top: 40px;
  right: 10px;
  font-size: 0.6rem;
  color: var(--text-muted);
  opacity: 0.5;
  font-weight: 500;
}
.cal-day-cols {
  flex: 1;
  min-width: 0;
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  position: relative;
}
.cal-day-col {
  border-left: 1px solid var(--border);
  position: relative;
}
.cal-hour-row {
  height: 80px;
  border-bottom: 1px solid rgba(255,255,255,0.05);
  box-sizing: border-box;
  position: relative;
}
.cal-hour-row::after {
  content: '';
  position: absolute;
  left: 0; right: 0;
  top: 40px;
  border-bottom: 1px dashed rgba(255,255,255,0.035);
  pointer-events: none;
}
[data-theme="light"] .cal-hour-row::after {
  border-bottom-color: rgba(0,0,0,0.06);
}
.cal-day-col.cal-today-col { background: rgba(var(--accent-rgb),0.03); }

/* Now line */
.cal-now-line {
  position: absolute;
  left: 0;
  right: 0;
  height: 2px;
  background: var(--error);
  z-index: 10;
  pointer-events: none;
}
.cal-now-line::before {
  content: '';
  position: absolute;
  left: -4px;
  top: -4px;
  width: 10px;
  height: 10px;
  background: var(--error);
  border-radius: 50%;
}

/* Event blocks */
.cal-event {
  position: absolute;
  left: 3px;
  right: 3px;
  border-radius: var(--r-sm);
  padding: 6px 9px;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--on-accent);
  cursor: pointer;
  overflow: hidden;
  z-index: 5;
  transition: filter 0.15s, transform 0.12s, box-shadow 0.15s;
  min-height: 28px;
  line-height: 1.3;
  box-shadow: 0 2px 10px rgba(0,0,0,0.28);
  display: flex;
  flex-direction: column;
  gap: 2px;
  border-left: 1px solid rgba(255,255,255,0.35);
}
/* Read-only entries mirrored from the client's own Google Calendar. They
   occupy the slot so nothing gets double-booked, but they are deliberately
   quiet and not clickable, Helvaro doesn't own them and can't edit them. */
.cal-event-external {
  background: repeating-linear-gradient(
    135deg,
    var(--bg-card-alt) 0 6px,
    var(--hover-c) 6px 12px
  );
  color: var(--text-muted-c);
  border-left: 1px solid var(--border-c);
  box-shadow: none;
  cursor: default;
  font-weight: 500;
  z-index: 4;
}
.cal-event-external:hover {
  filter: none;
  transform: none;
  box-shadow: none;
  z-index: 4;
}

.cal-event:hover {
  filter: brightness(1.1);
  transform: translateX(-1px) scale(1.018);
  box-shadow: 0 6px 20px rgba(0,0,0,0.38);
  z-index: 10;
}
.cal-event .cal-event-time {
  font-size: 0.6667rem;
  font-weight: 800;
  opacity: 1;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.cal-event .cal-event-name {
  font-size: 0.7333rem;
  font-weight: 700;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cal-event .cal-event-type {
  font-size: 0.6rem;
  opacity: 0.7;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cal-event .cal-event-dur {
  font-size: 0.6rem;
  font-weight: 600;
  opacity: 0.75;
  white-space: nowrap;
  margin-top: auto;
  padding-top: 2px;
}

/* ============================================================
   PROFILE PAGE
   ============================================================ */
.profile-wrap { width: 100%; display: flex; flex-direction: column; gap: 20px; }

.profile-hero {
  display: flex;
  align-items: center;
  gap: 24px;
  background: rgba(var(--accent-rgb),0.07);
  border: 1px solid rgba(var(--accent-rgb),0.25);
  border-radius: var(--r-lg);
  padding: 28px 32px;
}
.profile-avatar-lg {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.7333rem;
  font-weight: 800;
  color: var(--on-accent);
  flex-shrink: 0;
  font-family: 'Inter', sans-serif;
  box-shadow: none;
}
.profile-name-lg {
  font-size: 1.4667rem;
  font-weight: 800;
  color: var(--text-primary);
  margin-bottom: 4px;
  font-family: 'Inter', sans-serif;
}
.profile-email-lg { font-size: 0.9333rem; color: var(--text-muted); margin-bottom: 10px; }
.profile-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 12px;
  border-radius: var(--r-lg);
  font-size: 0.7333rem;
  font-weight: 600;
  background: rgba(var(--accent-rgb),0.15);
  border: 1px solid rgba(var(--accent-rgb),0.3);
  color: var(--accent-ink);
}

.profile-stats-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
}
.profile-stat-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 18px 20px;
  text-align: center;
}
.profile-stat-card .psv {
  font-size: 1.8667rem;
  font-weight: 800;
  color: var(--accent-ink);
  font-variant-numeric: tabular-nums;
  line-height: 1;
  margin-bottom: 6px;
}
.profile-stat-card .psl {
  font-size: 0.7333rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.073em;
  font-weight: 600;
}

.profile-cards {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}
.profile-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: 22px 24px;
}
.profile-card-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.083em;
  color: var(--text-muted);
  margin-bottom: 18px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--border);
}
.profile-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.8667rem;
  color: var(--text-muted);
  padding: 6px 0;
  border-bottom: 1px solid rgba(255,255,255,0.03);
}
.profile-row:last-child { border-bottom: none; }
.profile-row strong { color: var(--text-primary); font-weight: 600; }

    .profile-section-title {
      font-size: 0.7333rem;
      font-weight: 700;
      letter-spacing: 0.1em;
      text-transform: uppercase;
      color: var(--text-muted);
      margin-bottom: 12px;
      margin-top: 4px;
    }
    .profile-recent-leads {
      display: flex;
      flex-direction: column;
      gap: 8px;
      margin-bottom: 24px;
    }
    .profile-recent-lead-row {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 12px 16px;
      background: var(--bg-card);
      border: 1px solid var(--border);
      border-radius: var(--r-sm);
      cursor: pointer;
      transition: border-color 0.15s;
    }
    .profile-recent-lead-row:hover { border-color: var(--accent); }
    .profile-recent-lead-avatar {
      width: 34px; height: 34px; border-radius: 50%;
      background: var(--accent);
      display: flex; align-items: center; justify-content: center;
      font-size: 0.8rem; font-weight: 700; color: var(--on-accent); flex-shrink: 0;
    }
    .profile-recent-lead-name { font-size: 0.9333rem; font-weight: 600; color: var(--text); flex: 1; }
    .profile-recent-lead-meta { font-size: 0.8rem; color: var(--text-muted); }
    .profile-recent-lead-score {
      font-size: 0.8667rem; font-weight: 700; color: var(--accent-ink);
      font-variant-numeric: tabular-nums;
    }
    .profile-quick-actions {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
      gap: 12px;
      margin-bottom: 8px;
    }
    .profile-action-btn {
      display: flex; align-items: center; gap: 10px;
      padding: 14px 18px;
      background: var(--bg-card);
      border: 1px solid var(--border);
      border-radius: var(--r-md);
      color: var(--text);
      font-size: 0.8667rem; font-weight: 600;
      cursor: pointer;
      transition: border-color 0.15s, background 0.15s;
      text-align: left;
    }
    .profile-action-btn:hover { border-color: var(--accent); background: rgba(var(--accent-rgb),0.06); }
    .profile-action-btn svg { color: var(--accent-ink); flex-shrink: 0; }

/* ============================================================
   FOUNDER DASHBOARD. Cofounder-style layout
   ============================================================ */
.fdr-wrap { max-width: 1060px; margin: 0 auto; display: flex; flex-direction: column; gap: 24px; }
.fdr-section-hdr { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.fdr-section-hdr h3 { font-size: 0.8rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.067em; color: var(--text-secondary); }
.founder-btn-sm { padding: 6px 14px; background: rgba(var(--accent-rgb),.12); border: 1px solid rgba(var(--accent-rgb),.25); border-radius: var(--r-sm); color: var(--accent-ink); font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: var(--transition); }
.founder-btn-sm:hover { background: rgba(var(--accent-rgb),.22); }

/* Hero header */
.fdr-hero { background: rgba(var(--accent-rgb),.08); border: 1px solid rgba(var(--accent-rgb),.22); border-radius: var(--r-lg); padding: 28px 32px; display: flex; align-items: center; justify-content: space-between; }
.fdr-hero-left {}
.fdr-day { font-size: 1.8667rem; font-weight: 800; letter-spacing: -0.018em; color: var(--text-primary); line-height: 1; }
.fdr-date { font-size: 0.9333rem; color: var(--text-secondary); margin-top: 4px; }
.fdr-subtitle { font-size: 0.8rem; color: var(--text-muted); margin-top: 8px; }
.fdr-hero-right { text-align: right; }
.fdr-deadline-label { font-size: 0.7333rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.055em; color: var(--text-muted); }
.fdr-deadline-val { font-size: 1.2rem; font-weight: 800; color: var(--text-primary); margin-top: 2px; }
.fdr-deadline-days { font-size: 0.8rem; color: var(--accent-ink); margin-top: 2px; font-weight: 600; }

/* Two-column main grid */
.fdr-main-grid { display: grid; grid-template-columns: 1fr 340px; gap: 18px; align-items: start; }
.fdr-right-col { display: flex; flex-direction: column; gap: 14px; }

/* Generic panel */
.fdr-panel { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); }
.fdr-panel-hdr { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-panel-title { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.fdr-task-progress { font-size: 0.8rem; font-weight: 600; color: var(--text-muted); }
.fdr-refresh-btn { background: none; border: none; color: var(--text-muted); font-size: 1rem; cursor: pointer; line-height: 1; padding: 2px 4px; border-radius: var(--r-xs); }
.fdr-refresh-btn:hover { color: var(--text-primary); }

/* Checklist */
.fdr-checklist { display: flex; flex-direction: column; }
.fdr-task-row { display: flex; align-items: flex-start; gap: 12px; padding: 13px 18px; border-bottom: 1px solid var(--border); cursor: pointer; transition: background .12s; user-select: none; }
.fdr-task-row:last-child { border-bottom: none; }
.fdr-task-row:hover { background: var(--bg-card-hover); }
.fdr-task-row input[type=checkbox] { display: none; }
.fdr-task-check-icon { width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--border-bright); flex-shrink: 0; margin-top: 2px; transition: background-color .15s, border-color .15s; display: flex; align-items: center; justify-content: center; }
.fdr-task-row.fdr-task-done .fdr-task-check-icon { background: var(--accent); border-color: var(--accent); }
.fdr-task-row.fdr-task-done .fdr-task-check-icon::after { content: ''; width: 5px; height: 9px; border: 2px solid var(--on-accent); border-top: none; border-left: none; transform: rotate(45deg) translateY(-1px); display: block; }
.fdr-task-body { flex: 1; min-width: 0; }
.fdr-task-name { font-size: 0.9333rem; font-weight: 500; color: var(--text-primary); line-height: 1.3; }
.fdr-task-detail { font-size: 0.8rem; color: var(--text-muted); margin-top: 3px; line-height: 1.4; }
.fdr-task-row.fdr-task-done .fdr-task-name { text-decoration: line-through; color: var(--text-muted); }
.fdr-wie-badge { flex-shrink: 0; font-size: 0.6667rem; font-weight: 700; padding: 3px 8px; border-radius: var(--r-lg); margin-top: 2px; }
.fdr-badge-frade { background: rgba(var(--accent-rgb),.15); color: var(--accent-ink); border: 1px solid rgba(var(--accent-rgb),.25); }
.fdr-badge-teljo { background: rgba(var(--warning-rgb),.12); color: var(--warning-ink); border: 1px solid rgba(var(--warning-rgb),.2); }
.fdr-badge-beiden { background: rgba(var(--success-rgb),.1); color: var(--success-ink); border: 1px solid rgba(var(--success-rgb),.2); }
/* Fase 4: deze en de andere 9 "transition: width"-vondsten van de
   layout-transition-detector in dit bestand (regel ~2934, 2969, 3105, 3721,
   4607, 7059, 7242, 7664, 8798) zijn allemaal percentage-vulbalken: een
   vaste-hoogte binnenvlak in een overflow:hidden-omhulsel, waarvan de JS het
   percentage als style.width zet. Naar transform:scaleX() zou hier wel de
   CSS-kant oplossen, maar niet zonder de JS die width zet mee te veranderen
   naar scaleX -- anders springt de balk instant i.p.v. te animeren, een
   nieuwe fout in plaats van een opgeloste. Dat raakt de app-logica in
   dashboard.js op een tiental plekken, niet alleen de tokens/CSS van deze
   ronde. Bewust gehouden; de reflow blijft bovendien beperkt tot dit ene
   vaste-hoogte vlak, niet de pagina. */
.fdr-progress-bar-wrap { height: 3px; background: var(--bg-card-alt); border-radius: 0 0 var(--radius) var(--radius); overflow: hidden; }
.fdr-progress-bar { height: 100%; background: linear-gradient(90deg, var(--accent), var(--accent-bright)); transition: width .4s ease; border-radius: var(--r-full); }
.fdr-weekend-msg { padding: 32px 18px; text-align: center; }
.fdr-weekend-icon { font-size: 2.1333rem; margin-bottom: 10px; }
.fdr-weekend-txt { font-size: 1rem; font-weight: 700; color: var(--text-primary); }
.fdr-weekend-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 6px; }

/* Stats 2x2 grid (right col) */
.fdr-stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-stat { background: var(--bg-card); padding: 14px 12px; }
.fdr-stat-val { font-size: 1.6rem; font-weight: 800; line-height: 1; margin-bottom: 3px; }
.fdr-stat-lbl { font-size: 0.7333rem; color: var(--text-secondary); }

/* Goal panel */
.fdr-goal-panel { padding: 16px 18px; }
.fdr-goal-hdr { display: flex; align-items: center; justify-content: space-between; font-size: 0.8rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 12px; }
.fdr-goal-big { display: flex; align-items: baseline; gap: 4px; margin-bottom: 10px; }
.fdr-goal-current { font-size: 2.6667rem; font-weight: 900; color: var(--accent-ink); line-height: 1; }
.fdr-goal-sep { font-size: 1.4667rem; color: var(--text-muted); }
.fdr-goal-target { font-size: 1.4667rem; font-weight: 700; color: var(--text-primary); }
.fdr-goal-unit { font-size: 0.8667rem; color: var(--text-secondary); margin-left: 4px; }
.fdr-goal-bar-wrap { height: 6px; background: var(--bg-card-alt); border-radius: var(--r-full); overflow: hidden; margin-bottom: 6px; }
.fdr-goal-bar-fill { height: 100%; border-radius: var(--r-full); background: var(--accent); transition: width .6s ease; }
.fdr-goal-pct { font-size: 0.7333rem; color: var(--text-muted); }

/* Pipeline mini */
.fdr-pipe-mini { padding: 14px 18px; }
.fdr-pipe-mini-cols { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; }
.fdr-pipe-mini-item { display: flex; align-items: center; gap: 10px; }
.fdr-pipe-mini-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.fdr-pipe-mini-name { flex: 1; font-size: 0.8rem; color: var(--text-secondary); }
.fdr-pipe-mini-count { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.fdr-won-lost-row { display: flex; gap: 8px; }

/* Full-width pipeline kanban */
.founder-pipeline-cols { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.founder-col { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.founder-col-hdr { padding: 10px 14px; font-size: 0.8rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.042em; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }
.founder-col-badge { background: var(--bg-card-alt); border-radius: var(--r-lg); padding: 2px 8px; font-size: 0.7333rem; }
.founder-col-body { padding: 10px; min-height: 80px; display: flex; flex-direction: column; gap: 8px; }
.founder-card { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 12px; cursor: pointer; transition: border-color .15s; }
.founder-card:hover { border-color: rgba(var(--accent-rgb),.4); }
.founder-card-name { font-size: 0.8667rem; font-weight: 600; margin-bottom: 2px; }
.founder-card-meta { font-size: 0.7333rem; color: var(--text-secondary); }
.founder-col-add { padding: 8px 10px; border-top: 1px solid var(--border); }
.founder-col-add button { width: 100%; padding: 7px; background: none; border: 1px dashed var(--border-bright); border-radius: var(--r-xs); color: var(--text-muted); font-size: 0.8rem; cursor: pointer; transition: var(--transition); }
.founder-col-add button:hover { border-color: var(--accent); color: var(--accent-ink); }
.founder-badge-won  { background: rgba(var(--success-rgb),.12); color: var(--success-ink); border: 1px solid rgba(var(--success-rgb),.2); border-radius: var(--r-lg); padding: 3px 10px; font-size: 0.7333rem; font-weight: 700; }
.founder-badge-lost { background: rgba(var(--error-rgb),.1); color: var(--error-ink); border: 1px solid rgba(var(--error-rgb),.2); border-radius: var(--r-lg); padding: 3px 10px; font-size: 0.7333rem; font-weight: 700; }

/* Goals */
.founder-goals-list { display: flex; flex-direction: column; gap: 12px; }
.founder-goal { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; }
.founder-goal-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
.founder-goal-name { font-size: 0.9333rem; font-weight: 600; }
.founder-goal-nums { font-size: 0.8667rem; color: var(--text-secondary); }
.founder-goal-bar { height: 6px; background: var(--bg-card-alt); border-radius: var(--r-full); overflow: hidden; }
.founder-goal-fill { height: 100%; border-radius: var(--r-full); background: linear-gradient(90deg, var(--accent), var(--accent-bright)); transition: width .6s ease; }
.founder-goal-meta { display: flex; justify-content: space-between; margin-top: 8px; font-size: 0.7333rem; color: var(--text-muted); }

/* AI Advice */
.founder-ai-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px; }
.founder-ai-header { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.founder-ai-icon { width: 36px; height: 36px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.founder-ai-title { font-size: 1rem; font-weight: 700; }
.founder-ai-sub { font-size: 0.8rem; color: var(--text-secondary); }
.founder-ai-output { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 14px 16px; font-size: 0.8667rem; line-height: 1.7; color: var(--text-primary); white-space: pre-wrap; min-height: 60px; display: none; margin-bottom: 14px; }
.founder-ai-output.visible { display: block; }
.founder-ai-btn { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8667rem; font-weight: 700; cursor: pointer; transition: var(--transition); }
.founder-ai-btn:hover:not(:disabled) { background: var(--accent); transform: translateY(-1px); }
.founder-ai-btn:disabled { opacity: .5; cursor: not-allowed; }

/* Modal */
.founder-modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.6); z-index: 900; display: flex; align-items: center; justify-content: center; padding: 20px; display: none; }
.founder-modal-overlay.open { display: flex; }
.founder-modal { background: var(--card-elevated); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 24px; width: 100%; max-width: 420px; box-shadow: var(--elev-3); animation: modal-in 0.2s var(--ease-out); }
.founder-modal h3 { font-size: 1.0667rem; font-weight: 700; margin-bottom: 16px; }
.founder-modal-field { margin-bottom: 14px; }
.founder-modal-field label { display: block; font-size: 0.7333rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.045em; color: var(--text-secondary); margin-bottom: 6px; }
.founder-modal-field input, .founder-modal-field select, .founder-modal-field textarea { width: 100%; padding: 10px 12px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.9333rem; font-family: inherit; outline: none; transition: border-color .15s; }
.founder-modal-field input:focus, .founder-modal-field select:focus, .founder-modal-field textarea:focus { border-color: var(--accent); }
.founder-modal-field textarea { resize: vertical; min-height: 80px; }
.founder-modal-field select option { background: var(--bg-card); }
.founder-modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 18px; }
.founder-modal-cancel { padding: 9px 18px; background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-secondary); font-size: 0.8667rem; font-weight: 600; cursor: pointer; }
.founder-modal-save { padding: 9px 18px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8667rem; font-weight: 700; cursor: pointer; }
.founder-modal-delete { padding: 9px 18px; background: rgba(var(--error-rgb),.12); border: 1px solid rgba(var(--error-rgb),.25); border-radius: var(--r-sm); color: var(--error-ink); font-size: 0.8667rem; font-weight: 600; cursor: pointer; margin-right: auto; }

@media (max-width: 960px) {
  .fdr-main-grid { grid-template-columns: 1fr; }
  .fdr-right-col { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
  .founder-pipeline-cols { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
  .fdr-hero { flex-direction: column; gap: 16px; }
  .fdr-hero-right { text-align: left; }
  .fdr-right-col { grid-template-columns: 1fr; }
  .fdr-stats-grid { grid-template-columns: 1fr 1fr; }
}

/* Content Hub */
.fdr-hub-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-hub-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-hub-icon { width: 32px; height: 32px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fdr-hub-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-hub-sub { font-size: 0.7333rem; color: var(--text-muted); margin-top: 1px; }
.fdr-hub-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; padding: 12px 18px; border-bottom: 1px solid var(--border); background: var(--bg-card-alt); }
.fdr-platform-tabs { display: flex; gap: 4px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 3px; }
.fdr-platform-tab { display: flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--r-sm); font-size: 0.8rem; font-weight: 700; cursor: pointer; border: none; background: none; color: var(--text-secondary); transition: var(--transition); white-space: nowrap; }
.fdr-platform-tab.active { background: var(--bg-card); color: var(--text-primary); box-shadow: 0 1px 4px rgba(0,0,0,.15); }
.fdr-platform-tab.li-active { color: #0077b5; }
.fdr-platform-tab.ig-active { color: #e1306c; }
.fdr-hub-select { padding: 7px 10px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8rem; font-family: inherit; outline: none; cursor: pointer; }
.fdr-hub-select option { background: var(--bg-card); }
.fdr-hub-gen-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 16px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8rem; font-weight: 700; cursor: pointer; transition: var(--transition); margin-left: auto; white-space: nowrap; }
.fdr-hub-gen-btn:hover:not(:disabled) { opacity: .88; transform: translateY(-1px); }
.fdr-hub-gen-btn:disabled { opacity: .5; cursor: not-allowed; }
.fdr-hub-body { padding: 16px 18px; }
.fdr-hub-output { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 14px 16px; font-size: 0.8667rem; line-height: 1.8; color: var(--text-primary); white-space: pre-wrap; min-height: 80px; display: none; margin-bottom: 12px; max-height: 420px; overflow-y: auto; }
.fdr-hub-output.visible { display: block; }
.fdr-hub-footer { display: flex; align-items: center; gap: 10px; }
.fdr-hub-copy-btn { display: none; align-items: center; gap: 6px; padding: 7px 14px; background: rgba(var(--accent-rgb),.1); border: 1px solid rgba(var(--accent-rgb),.25); border-radius: var(--r-sm); color: var(--accent-ink); font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: var(--transition); }
.fdr-hub-copy-btn.visible { display: inline-flex; }
.fdr-hub-copy-btn:hover { background: rgba(var(--accent-rgb),.2); }
.fdr-hub-regen-btn { display: none; align-items: center; gap: 6px; padding: 7px 14px; background: none; border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-secondary); font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: var(--transition); }
.fdr-hub-regen-btn.visible { display: inline-flex; }
.fdr-hub-regen-btn:hover { color: var(--text-primary); border-color: var(--border-bright); }
.fdr-hub-open-btn { display: none; align-items: center; gap: 6px; padding: 7px 14px; border-radius: var(--r-sm); font-size: 0.8rem; font-weight: 600; cursor: pointer; transition: var(--transition); text-decoration: none; }
.fdr-hub-open-btn.visible { display: inline-flex; }
.fdr-hub-open-btn.li { background: rgba(10,102,194,.12); border: 1px solid rgba(10,102,194,.3); color: #0a66c2; }
.fdr-hub-open-btn.li:hover { background: rgba(10,102,194,.22); }
.fdr-hub-open-btn.ig { background: rgba(225,48,108,.12); border: 1px solid rgba(225,48,108,.3); color: #e1306c; }
.fdr-hub-open-btn.ig:hover { background: rgba(225,48,108,.22); }
.fdr-dm-open-btn { display: none; align-items: center; gap: 6px; padding: 7px 14px; background: rgba(10,102,194,.1); border: 1px solid rgba(10,102,194,.25); border-radius: var(--r-sm); color: #0a66c2; font-size: 0.8rem; font-weight: 600; cursor: pointer; text-decoration: none; }
.fdr-dm-open-btn.visible { display: inline-flex; }
.fdr-dm-open-btn:hover { background: rgba(10,102,194,.2); }
.fdr-hub-empty { padding: 24px 0; color: var(--text-muted); font-size: 0.8667rem; text-align: center; line-height: 1.6; }
.fdr-hub-platform-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: var(--r-lg); font-size: 0.6667rem; font-weight: 700; }
.fdr-hub-platform-badge.li { background: rgba(0,119,181,.12); color: #0077b5; border: 1px solid rgba(0,119,181,.2); }
.fdr-hub-platform-badge.ig { background: rgba(225,48,108,.1); color: #e1306c; border: 1px solid rgba(225,48,108,.2); }

/* Follow-up urgency */
.founder-card-age { display: inline-block; margin-top: 5px; font-size: 0.6667rem; font-weight: 700; padding: 2px 7px; border-radius: var(--r-xs); }
.founder-card-age.age-ok       { background: rgba(var(--success-rgb),.1);  color: var(--success-ink); }
.founder-card-age.age-warning  { background: rgba(var(--warning-rgb),.12); color: var(--warning-ink); }
.founder-card-age.age-critical { background: rgba(var(--error-rgb),.12);  color: var(--error-ink); }
.founder-card.has-urgent       { border-color: rgba(var(--error-rgb),.35); }
.fdr-followup-wrap { display: flex; flex-direction: column; gap: 8px; }
.fdr-followup-item { display: flex; align-items: center; gap: 12px; padding: 10px 14px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm); cursor: pointer; transition: border-color .15s; }
.fdr-followup-item:hover { border-color: rgba(var(--error-rgb),.4); }
.fdr-followup-name { flex: 1; font-size: 0.8667rem; font-weight: 600; }
.fdr-followup-fase { font-size: 0.6667rem; padding: 2px 7px; border-radius: var(--r-lg); font-weight: 700; }
.fdr-followup-fase.f0 { background: rgba(124,147,196,.14);  color: #7C93C4; }
.fdr-followup-fase.f1 { background: rgba(var(--accent-rgb),.16);  color: var(--accent-ink); }
.fdr-followup-fase.f2 { background: rgba(201,154,108,.16);  color: #C99A6C; }
.fdr-followup-days { font-size: 0.7333rem; font-weight: 700; color: var(--error-ink); flex-shrink: 0; }
.fdr-followup-empty { padding: 14px 0; color: var(--text-muted); font-size: 0.8667rem; }

/* MRR panel */
.fdr-mrr-panel { padding: 14px 18px; }
.fdr-mrr-hdr { font-size: 0.7333rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.055em; color: var(--text-muted); margin-bottom: 8px; }
.fdr-mrr-val { font-size: 2.2667rem; font-weight: 900; color: var(--success-ink); line-height: 1; }
.fdr-mrr-sub { font-size: 0.7333rem; color: var(--text-muted); margin-top: 4px; }
.fdr-mrr-target { font-size: 0.8rem; color: var(--text-secondary); margin-top: 8px; display: flex; align-items: center; gap: 6px; }
.fdr-mrr-arrow { color: var(--text-muted); }
.fdr-profit-divider { border: none; border-top: 1px solid var(--border); margin: 12px 0; }
.fdr-profit-rows { display: flex; flex-direction: column; gap: 5px; }
.fdr-profit-row { display: flex; justify-content: space-between; align-items: center; font-size: 0.8rem; }
.fdr-profit-row .lbl { color: var(--text-muted); }
.fdr-profit-row .val { font-weight: 600; color: var(--text-primary); }
.fdr-profit-row .val.neg { color: var(--red-ink); }
.fdr-profit-row.total { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--border); }
.fdr-profit-row.total .lbl { font-weight: 700; color: var(--text-primary); font-size: 0.8667rem; }
.fdr-profit-row.total .val { font-size: 1.0667rem; font-weight: 900; color: var(--success-ink); }
.fdr-profit-marge { font-size: 0.7333rem; color: var(--text-muted); margin-top: 4px; }

/* Outreach tracker */
.fdr-outreach-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-outreach-hdr { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-outreach-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-outreach-week { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-outreach-body { padding: 16px 18px; }
.fdr-outreach-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 16px; }
.fdr-outreach-card { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 12px 14px; display: flex; align-items: center; gap: 10px; }
.fdr-outreach-num { font-size: 1.7333rem; font-weight: 900; line-height: 1; min-width: 32px; }
.fdr-outreach-info { flex: 1; }
.fdr-outreach-name { font-size: 0.8rem; font-weight: 600; }
.fdr-outreach-target { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-outreach-plus { background: none; border: 1px solid var(--border); border-radius: var(--r-xs); width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer; font-size: 1.0667rem; font-weight: 700; color: var(--text-secondary); transition: var(--transition); flex-shrink: 0; }
.fdr-outreach-plus:hover { background: var(--border); color: var(--text-primary); }
.fdr-outreach-bar-wrap { height: 6px; background: var(--border); border-radius: var(--r-full); overflow: hidden; margin-top: 8px; }
.fdr-outreach-bar-fill { height: 100%; border-radius: var(--r-full); background: var(--accent); transition: width .4s; }
.fdr-outreach-footer { display: flex; justify-content: space-between; align-items: center; }
.fdr-outreach-pct { font-size: 0.8rem; color: var(--text-muted); }
.fdr-outreach-reset { background: none; border: none; font-size: 0.7333rem; color: var(--text-muted); cursor: pointer; text-decoration: underline; }
.fdr-outreach-reset:hover { color: var(--red-ink); }

/* Bouw tracker */
.fdr-bouw-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-bouw-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-bouw-icon { width: 32px; height: 32px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fdr-bouw-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-bouw-sub { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-bouw-body { padding: 12px 18px; }
.fdr-bouw-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 14px; }
.fdr-bouw-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); cursor: pointer; transition: var(--transition); }
.fdr-bouw-item:hover { border-color: rgba(var(--accent-rgb),0.27); }
.fdr-bouw-item.done { opacity: .5; }
.fdr-bouw-item.done .fdr-bouw-item-text { text-decoration: line-through; }
.fdr-bouw-cb { width: 16px; height: 16px; border-radius: var(--r-xs); border: 1.5px solid var(--border-bright); display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: var(--transition); }
.fdr-bouw-item.done .fdr-bouw-cb { background: var(--accent); border-color: var(--accent); }
.fdr-bouw-item-text { font-size: 0.8667rem; flex: 1; }
.fdr-bouw-tag { font-size: 0.6667rem; padding: 2px 7px; border-radius: var(--r-full); font-weight: 600; flex-shrink: 0; }
.fdr-bouw-tag.fix { background: rgba(239,68,68,.12); color: var(--red-ink); }
.fdr-bouw-tag.feat { background: rgba(var(--accent-rgb),.12); color: var(--accent-ink); }
.fdr-bouw-tag.test { background: rgba(var(--warning-rgb),.12); color: var(--orange-ink); }
.fdr-bouw-add-row { display: flex; gap: 8px; }
.fdr-bouw-add-input { flex: 1; padding: 7px 10px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8rem; font-family: inherit; outline: none; }
.fdr-bouw-add-btn { padding: 7px 14px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8rem; font-weight: 700; cursor: pointer; transition: var(--transition); }
.fdr-bouw-add-btn:hover { opacity: .88; }
.fdr-bouw-progress { font-size: 0.7333rem; color: var(--text-muted); margin-bottom: 10px; }

/* Personalized DM generator */
.fdr-dm-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-dm-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-dm-icon { width: 32px; height: 32px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fdr-dm-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-dm-sub { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-dm-controls { display: flex; flex-wrap: wrap; gap: 10px; padding: 12px 18px; border-bottom: 1px solid var(--border); background: var(--bg-card-alt); align-items: center; }
.fdr-dm-select { padding: 7px 10px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8rem; font-family: inherit; outline: none; flex: 1; min-width: 140px; }
.fdr-dm-gen-btn { display: inline-flex; align-items: center; gap: 6px; padding: 7px 16px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8rem; font-weight: 700; cursor: pointer; transition: var(--transition); white-space: nowrap; flex-shrink: 0; }
.fdr-dm-gen-btn:hover:not(:disabled) { opacity: .88; }
.fdr-dm-gen-btn:disabled { opacity: .5; cursor: not-allowed; }
.fdr-dm-body { padding: 16px 18px; }
.fdr-dm-output { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 14px 16px; font-size: 0.8667rem; line-height: 1.75; color: var(--text-primary); white-space: pre-wrap; min-height: 60px; display: none; margin-bottom: 12px; }
.fdr-dm-output.visible { display: block; }
.fdr-dm-copy-btn { display: none; align-items: center; gap: 6px; padding: 7px 14px; background: rgba(var(--accent-rgb),.1); border: 1px solid rgba(var(--accent-rgb),.25); border-radius: var(--r-sm); color: var(--accent-ink); font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.fdr-dm-copy-btn.visible { display: inline-flex; }
.fdr-dm-copy-btn:hover { background: rgba(var(--accent-rgb),.2); }
.fdr-dm-empty { padding: 20px 0; color: var(--text-muted); font-size: 0.8667rem; text-align: center; }

/* Documenten Hub */
.fdr-docs-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-docs-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); justify-content: space-between; }
.fdr-docs-hdr-left { display: flex; align-items: center; gap: 10px; }
.fdr-docs-icon { width: 32px; height: 32px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fdr-docs-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-docs-sub { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-docs-edit-btn { background: none; border: 1px solid var(--border); border-radius: var(--r-xs); padding: 5px 10px; font-size: 0.7333rem; color: var(--text-muted); cursor: pointer; transition: var(--transition); }
.fdr-docs-edit-btn:hover { color: var(--text-primary); border-color: var(--border-bright); }
.fdr-docs-body { padding: 16px 18px; }
.fdr-docs-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin-bottom: 16px; }
.fdr-doc-card { background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 14px 16px; display: flex; flex-direction: column; gap: 8px; cursor: pointer; transition: var(--transition); text-decoration: none; position: relative; }
.fdr-doc-card:hover { border-color: rgba(var(--accent-rgb),0.33); background: rgba(var(--accent-rgb),.05); transform: translateY(-1px); }
.fdr-doc-card-icon { font-size: 1.4667rem; }
.fdr-doc-card-name { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.fdr-doc-card-desc { font-size: 0.7333rem; color: var(--text-muted); line-height: 1.4; }
.fdr-doc-card-badge { position: absolute; top: 10px; right: 10px; font-size: 0.6rem; padding: 2px 6px; border-radius: var(--r-full); font-weight: 700; }
.fdr-doc-card-badge.pdf { background: rgba(239,68,68,.12); color: var(--red-ink); }
.fdr-doc-card-badge.slides { background: rgba(var(--warning-rgb),.12); color: var(--orange-ink); }
.fdr-doc-card-badge.drive { background: rgba(var(--success-rgb),.12); color: var(--success-ink); }
.fdr-doc-card-badge.link { background: rgba(var(--accent-rgb),.12); color: var(--accent-ink); }
.fdr-doc-card-nolink { opacity: .5; cursor: default; }
.fdr-doc-card-nolink:hover { transform: none; background: var(--bg-card-alt); border-color: var(--border); }
.fdr-docs-embed-wrap { border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; margin-bottom: 12px; position: relative; background: var(--bg-card-alt); }
.fdr-docs-embed-placeholder { padding: 32px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; }
.fdr-docs-embed-placeholder a { color: var(--accent-ink); text-decoration: underline; cursor: pointer; }
.fdr-docs-cfg { display: none; padding: 14px 18px; border-top: 1px solid var(--border); background: var(--bg-card-alt); }
.fdr-docs-cfg.open { display: block; }
.fdr-docs-cfg-title { font-size: 0.8rem; font-weight: 600; margin-bottom: 10px; }
.fdr-docs-cfg-row { display: flex; gap: 8px; margin-bottom: 8px; align-items: center; }
.fdr-docs-cfg-lbl { font-size: 0.7333rem; color: var(--text-muted); width: 100px; flex-shrink: 0; }
.fdr-docs-cfg-input { flex: 1; padding: 6px 10px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-xs); color: var(--text-primary); font-size: 0.8rem; font-family: inherit; outline: none; }
.fdr-docs-cfg-save { padding: 6px 14px; background: var(--accent); border: none; border-radius: var(--r-xs); color: var(--on-accent); font-size: 0.8rem; font-weight: 700; cursor: pointer; }

/* ── Persona picker (Frade / Teljo) ─────────────────────────────────────── */
#persona-overlay { position: fixed; inset: 0; background: rgba(15,12,5,.92); backdrop-filter: blur(10px); z-index: 1500; display: none; align-items: center; justify-content: center; }
#persona-overlay.open { display: flex; }
.persona-modal { width: min(440px, 92vw); background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 28px 24px; text-align: center; box-shadow: var(--elev-3); }
.persona-modal h2 { margin: 0 0 6px; font-size: 1.3333rem; font-weight: 700; color: var(--text-primary); }
.persona-modal p { margin: 0 0 22px; font-size: 0.8667rem; color: var(--text-muted); }
.persona-choices { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.persona-choice { cursor: pointer; background: var(--bg-card-alt); border: 2px solid var(--border); border-radius: var(--r-md); padding: 18px 12px; transition: var(--transition); display: flex; flex-direction: column; align-items: center; gap: 8px; }
.persona-choice:hover { border-color: var(--accent-bright); transform: translateY(-2px); background: rgba(var(--accent-rgb),.08); }
.persona-avatar { width: 56px; height: 56px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.4667rem; font-weight: 800; color: var(--on-accent); }
.persona-avatar.frade { background: var(--accent); }
.persona-avatar.teljo { background: var(--accent); }
.persona-name { font-size: 1rem; font-weight: 700; color: var(--text-primary); }
.persona-role { font-size: 0.7333rem; color: var(--text-muted); }

/* ── Live Klanten panel ─────────────────────────────────────────────────── */
.fdr-live-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; margin-bottom: 20px; }
.fdr-live-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); justify-content: space-between; }
.fdr-live-hdr-left { display: flex; align-items: center; gap: 10px; }
.fdr-live-icon { width: 32px; height: 32px; border-radius: var(--r-sm); background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
.fdr-live-title { font-size: 0.9333rem; font-weight: 700; }
.fdr-live-sub { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-live-count { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-live-count .online-num { color: var(--green-ink); font-weight: 700; }
.fdr-live-table { width: 100%; border-collapse: collapse; font-size: 0.8667rem; }
.fdr-live-table th { text-align: left; padding: 10px 16px; font-size: 0.7333rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: .04em; border-bottom: 1px solid var(--border); background: var(--bg-card-alt); }
.fdr-live-table td { padding: 12px 16px; border-bottom: 1px solid var(--border); }
.fdr-live-table tr:last-child td { border-bottom: none; }
.fdr-live-table tr:hover td { background: rgba(var(--accent-rgb),.04); }
.fdr-live-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
.fdr-live-dot.online { background: var(--success); animation: pulseDot 1.6s ease-in-out infinite; }
.fdr-live-dot.offline { background: var(--text-muted-c); }
@keyframes pulseDot { 0%,100% { opacity: 1; } 50% { opacity: .5; } }
.fdr-live-name { font-weight: 600; color: var(--text-primary); }
.fdr-live-meta { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-live-stat { font-weight: 600; font-variant-numeric: tabular-nums; }
.fdr-live-mrr { color: var(--green-ink); font-weight: 700; font-variant-numeric: tabular-nums; }
.fdr-live-empty { padding: 32px 16px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; }
.fdr-live-mrr-input { width: 70px; padding: 4px 6px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-xs); color: var(--text-primary); font-size: 0.8rem; font-variant-numeric: tabular-nums; text-align: right; }
.fdr-live-mrr-input:focus { outline: none; border-color: var(--accent-bright); }

/* ── Meeting widget ─────────────────────────────────────────────────────── */
.fdr-meeting-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px 18px; margin-bottom: 20px; }
.fdr-meeting-hdr { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.fdr-meeting-icon { font-size: 1.0667rem; }
.fdr-meeting-title { font-size: 0.8667rem; font-weight: 700; }
.fdr-meeting-when { font-size: 1.2rem; font-weight: 700; color: var(--accent-ink); margin: 4px 0; }
.fdr-meeting-agenda { font-size: 0.8rem; color: var(--text-muted); margin-bottom: 10px; }
.fdr-meeting-row { display: flex; gap: 8px; align-items: center; margin-top: 8px; }
.fdr-meeting-row input { flex: 1; padding: 7px 10px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-xs); color: var(--text-primary); font-size: 0.8rem; font-family: inherit; outline: none; }
.fdr-meeting-row button { padding: 7px 12px; background: var(--accent-bright); border: none; border-radius: var(--r-xs); color: var(--on-accent); font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.fdr-meeting-empty { color: var(--text-muted); font-size: 0.8rem; font-style: italic; }

/* ── Persona greeting in hero ───────────────────────────────────────────── */
.fdr-persona-greeting { font-size: 0.8rem; color: var(--text-muted); margin-top: 4px; }
.fdr-persona-greeting strong { color: var(--accent-ink); }
.fdr-persona-switch { background: none; border: 1px solid var(--border); color: var(--text-muted); padding: 4px 10px; border-radius: var(--r-xs); font-size: 0.7333rem; cursor: pointer; margin-left: 8px; }
.fdr-persona-switch:hover { color: var(--text-primary); border-color: var(--border-bright); }

/* ── Editable cost panel ────────────────────────────────────────────────── */
.fdr-cost-edit-btn { background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.7333rem; padding: 0 4px; display: inline-flex; align-items: center; vertical-align: middle; }
.fdr-cost-edit-btn:hover { color: var(--accent-ink); }
.fdr-cost-edit-input { width: 60px; padding: 2px 6px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-xs); color: var(--text-primary); font-size: 0.8rem; text-align: right; font-variant-numeric: tabular-nums; }

/* AI Coach chat */
.fdr-chat-box { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
.fdr-chat-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border); }
.fdr-chat-avatar { width: 32px; height: 32px; border-radius: 50%; background: var(--accent); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 1rem; }
.fdr-chat-hdr-info {}
.fdr-chat-hdr-name { font-size: 0.9333rem; font-weight: 700; }
.fdr-chat-hdr-sub { font-size: 0.7333rem; color: var(--text-muted); }
.fdr-chat-clear { margin-left: auto; background: none; border: none; color: var(--text-muted); font-size: 0.7333rem; cursor: pointer; padding: 4px 8px; border-radius: var(--r-xs); }
.fdr-chat-clear:hover { color: var(--text-primary); background: var(--bg-card-alt); }
.fdr-chat-msgs { height: 280px; overflow-y: auto; padding: 14px 18px; display: flex; flex-direction: column; gap: 10px; scroll-behavior: smooth; }
.fdr-chat-bubble { max-width: 82%; padding: 9px 13px; border-radius: var(--r-md); font-size: 0.8667rem; line-height: 1.55; }
.fdr-chat-bubble.assistant { background: var(--bg-card-alt); border: 1px solid var(--border); color: var(--text-primary); align-self: flex-start; border-bottom-left-radius: 3px; }
.fdr-chat-bubble.user { background: var(--accent); color: var(--on-accent); align-self: flex-end; border-bottom-right-radius: 3px; }
.fdr-chat-bubble.typing { opacity: .55; font-style: italic; }
.fdr-chat-input-row { display: flex; gap: 8px; padding: 12px 14px; border-top: 1px solid var(--border); }
.fdr-chat-input { flex: 1; padding: 9px 13px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8667rem; font-family: inherit; outline: none; transition: border-color .15s; resize: none; height: 38px; overflow: hidden; }
.fdr-chat-input:focus { border-color: var(--accent); }
.fdr-chat-send { padding: 9px 16px; background: var(--accent); border: none; border-radius: var(--r-sm); color: var(--on-accent); font-size: 0.8667rem; font-weight: 700; cursor: pointer; transition: var(--transition); flex-shrink: 0; }
.fdr-chat-send:hover:not(:disabled) { background: var(--accent-bright); }
.fdr-chat-send:disabled { opacity: .5; cursor: not-allowed; }

/* ============================================================
   SIDEBAR
   ============================================================ */
.sidebar {
  width: 220px;
  height: 100vh;
  position: fixed;
  left: 0;
  top: 0;
  /* Permanently dark in BOTH themes, the anchor the light content area
     sits against. Rebinding the colour tokens here means every child
     (nav labels, icons, dividers, the account block) picks up
     dark-surface values automatically instead of needing its own
     override. The inset highlight is the specular edge that makes the
     pane read as a physical sheet catching light. */
  /* ── Warm, niet blauw ────────────────────────────────────────────────
     Hier stond rgba(15,20,30,0.88): rood 15, groen 20, BLAUW 30. Blauw
     domineerde met vijftien punten, en dat is genoeg om koud te lezen naast
     een app die verder volledig warm is -- de grond is #14120E, het accent is
     zand. De zijbalk stond dus letterlijk in een ander kleurenfamilie dan
     alles waar hij tegenaan ligt.

     Dezelfde behandeling als de vlakken eerder: de HELDERHEID exact gelijk
     gehouden en alleen de hue naar zand gedraaid. Gemeten in OKLCH: L blijft
     0,191, alleen de tint verschuift. Er gaat dus geen contrast verloren --
     de gedempte tekst hierop haalt voor en na precies 6,40:1.

     Het blijft een EIGEN vlak en niet dezelfde kleur als de pagina: iets
     donkerder en met de doorschijnendheid intact, zodat hij als een aparte
     laag leest en niet als een uitsnede. */
  background: rgba(24,20,9,0.88);
  backdrop-filter: saturate(160%) blur(20px);
  -webkit-backdrop-filter: saturate(160%) blur(20px);
  /* The sidebar is dark in BOTH themes, so it rebinds the FULL token set
     and becomes a self-contained dark context. Rebinding only a few of
     them is what caused a run of light-theme bugs in here: the account
     block painted white (it used --bg-card-alt), the client's own name
     rendered at 1.04 contrast (it used --text-primary), and the logout
     button sat at 2.38 (it used --red, which light tunes for white).
     Every alias a child might reach for is covered here on purpose. */
  /* Ook deze zijn warm gemaakt op gelijke helderheid. #E9EEF6 was een koud
     blauwwit en #8D99AC een blauwgrijs -- die laatste werd 185 keer gebruikt
     in de zijbalk en was dus de dominante tekstkleur van het hele paneel. */
  --text:           #F1EDE5;
  --text-c:         #F1EDE5;
  --text-primary:   #F1EDE5;
  --text-muted:     #9E988B;
  --text-muted-c:   #9E988B;
  --text-secondary: #9E988B;
  /* De zijbalk blijft donker in het lichte thema, dus het lichte goud (#96742F,
     4,23:1 hier) zou werken maar is nodeloos zwak. Zand haalt er 12,94:1. */
  --focus-ring:     #E8D7B1;
  --border:      rgba(255,255,255,0.07);
  --border-c:    rgba(255,255,255,0.07);
  --divider:     rgba(255,255,255,0.07);
  --hover:       rgba(255,255,255,0.06);
  --hover-c:     rgba(255,255,255,0.06);
  --bg-card:     transparent;
  --bg-card-alt: rgba(255,255,255,0.05);
  --bg-alt:      rgba(255,255,255,0.05);
  /* Semantic colours in their dark-surface variants, the light theme's
     deepened versions are unreadable against this pane. */
  --red:         #F87171;
  --error-c:     #F87171;
  --error-rgb:   248,113,113;
  --green:       #34D399;
  --success-c:   #34D399;
  --success-rgb: 52,211,153;
  --accent:        #E8D7B1;
  --accent-c:      #E8D7B1;
  --accent-bright: #F2C670;
  --accent-rgb:    231,183,90;
  border-right: 1px solid rgba(255,255,255,0.06);
  box-shadow: inset -1px 0 0 rgba(255,255,255,0.06);
  display: flex;
  flex-direction: column;
  z-index: 100;
  transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
/* Fase 4: de zijbalk volgt nu het thema, in opdracht van de eigenaar. Deze
   dark-only rebind hierboven blijft de DEFAULT (dark-theme) waarden zetten;
   [data-theme="light"] .sidebar hieronder herbindt dezelfde tokenset naar de
   lichte equivalenten -- warme grond, houtskool inkt -- zodat elk kind
   (navlabel, icoon, account-blok) automatisch mee overschakelt in plaats van
   een eigen override nodig te hebben. */
[data-theme="light"] .sidebar {
  background: var(--card);
  --text:           #1F1D19;
  --text-c:         #1F1D19;
  --text-primary:   #1F1D19;
  --text-muted:     #6B6252;
  --text-muted-c:   #6B6252;
  --text-secondary: #6B6252;
  /* Niet zand (var(--zand-200), 1,3:1 op licht): de zijbalk is nu een lichte kaart,
     dus dezelfde okerinkt als de rest van het lichte thema (#96742F, zie
     [data-theme="light"] hierboven), anders is de ring wel aanwezig en
     onzichtbaar -- exact de fout die dit token juist voorkomt. */
  --focus-ring:     #96742F;
  --border:      #D9CCB0;
  --border-c:    #D9CCB0;
  --divider:     #D9CCB0;
  --hover:       #EFE7D8;
  --hover-c:     #EFE7D8;
  --bg-card:     transparent;
  --bg-card-alt: #EFE7D8;
  --bg-alt:      #EAE2D2;
  --red:         #C2352B;
  --error-c:     #C2352B;
  --error-rgb:   194,53,43;
  --green:       #2F8F4E;
  --success-c:   #2F8F4E;
  --success-rgb: 47,143,78;
  --accent:        #E8D7B1;
  --accent-c:      #E8D7B1;
  --accent-bright: #DCC593;
  --accent-rgb:    232,215,177;
}
/* Without backdrop-filter the pane would render see-through and
   unreadable. Literal colour, not var(--bg-card), that token is
   rebound to transparent inside .sidebar. */
@supports not (backdrop-filter: blur(1px)) {
  .sidebar { background: #181409; }
}

/* ---- Sidebar navigation ---------------------------------------------
   Active = solid gold pill. On a dark pane a filled shape reads
   instantly at a glance, where the old 12%-alpha gradient tint was
   nearly invisible. Higher specificity than the base .nav-item.active
   rule so it wins regardless of source order. */
.sidebar .nav-item {
  color: var(--text-muted);
  border-radius: var(--r-sm);
}
.sidebar .nav-item:hover {
  background: rgba(255,255,255,0.06);
  color: var(--text);
}
.sidebar .nav-item.active {
  background: var(--accent-c);
  /* Koud zwart (#0B0F16) op een gouden pil las grijsblauw waar het zwart
     hoorde te zijn. Zelfde helderheid, warme tint: 13,51:1 -> 13,47:1. */
  color: #120F08;
  font-weight: 600;
  box-shadow: none;   /* finish-fix 4: geen zandgloed onder de actieve pil */
}
/* The old rule painted a 3px bar down the left edge. Redundant now that
   the whole item is a filled pill, and it broke the pill's silhouette. */
.sidebar .nav-item.active::before { display: none; }
.sidebar .nav-item.active svg { color: #120F08; stroke: currentColor; }
.sidebar .nav-item:active { transform: translateY(1px); }

.sidebar-logo {
  padding: 26px 20px 22px;
  border-bottom: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
}

.sidebar-logo img {
  height: 44px;
  width: auto;
  object-fit: contain;
  display: block;
  flex-shrink: 0;
}

/* Two flat colourways of the mark (see LOGO-RECOLOR notes), dark surfaces
   get the pale sand tint, the light surface gets the deeper bronze step so
   it keeps contrast on white/cream. Swapped per theme, never both at once. */
/* Hier stonden twee logo's over elkaar, een lichte en een donkere, waarvan de
   lichte permanent verborgen was, de sidebar is in beide thema's donker, dus
   die wissel had geen functie meer. Een img op display:none wordt door de
   browser nog steeds opgehaald, dus dat kostte elke lading een extra download
   voor niets. Nu één logo: het goud leest op donker én op licht, dus de
   ink/sand-splitsing is sowieso overbodig geworden. */

.sidebar-nav {
  flex: 1;
  padding: 20px 12px;
  overflow-y: auto;
}

.nav-divider {
  height: 1px;
  background: var(--border);
  margin: 10px 6px;
  opacity: 0.55;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 14px;
  border-radius: var(--r-sm);
  cursor: pointer;
  color: var(--text-secondary);
  font-size: 0.8667rem;
  font-weight: 500;
  transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  position: relative;
  margin-bottom: 4px;
  border: none;
  background: none;
  width: 100%;
  text-align: left;
}

/* ═══ Zijbalk: groepen, inklappen, actieve staat ═══════════════════════════
   Twaalf navigatie-items achter elkaar met twee naamloze streepjes ertussen
   dwingt je elke keer de hele lijst te lezen. De groepen bestonden al in de
   broncode als commentaar (Werk / Inzicht / Setup); dit maakt ze zichtbaar. */
.nav-group-label {
  font-size: 0.6667rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--text-muted);
  opacity: 0.62;
  padding: 0 14px;
  margin: 14px 0 6px;
  user-select: none;
}
.sidebar-nav > .nav-group-label:first-child { margin-top: 2px; }

/* De actieve pagina had alleen een achtergrondje. Een staaf aan de linkerkant
   leest sneller dan een kleurverschil, en werkt ook als je de kleuren niet
   goed uit elkaar houdt. */
.nav-item::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%) scaleY(0);
  width: 3px;
  height: 20px;
  border-radius: 0 3px 3px 0;
  background: var(--accent-c);
  transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1);
}
.nav-item.active::before { transform: translateY(-50%) scaleY(1); }
.nav-item.active { font-weight: 650; }

/* ── Ingeklapt ──────────────────────────────────────────────────────────────
   220px van een 1280px-scherm is 17% van de breedte, permanent, voor een lijst
   die je één keer per pagina gebruikt. Ingeklapt blijft de navigatie volledig
   bruikbaar (icoon + tooltip) en krijgt de inhoud 152px terug. De keuze wordt
   onthouden. */
.sidebar { transition: width 0.22s cubic-bezier(0.4, 0, 0.2, 1); }
body.sidebar-collapsed .sidebar { width: 68px; }
body.sidebar-collapsed .main-content,
body.sidebar-collapsed .topbar { margin-left: 68px; }
body.sidebar-collapsed .nav-item { justify-content: center; padding-left: 0; padding-right: 0; gap: 0; }
body.sidebar-collapsed .nav-item > :not(.nav-icon):not(.nav-badge) { display: none; }
body.sidebar-collapsed .nav-item { font-size: 0; }
body.sidebar-collapsed .nav-icon { font-size: 0.8667rem; }
/* De Faro-CTA is geen .nav-item maar eigen markup uit api/_faro/ui/markup.js,
   dus die viel buiten de regel hierboven en hield zijn label. */
body.sidebar-collapsed .faro-nav-cta__text { display: none; }
body.sidebar-collapsed .faro-nav-cta { justify-content: center; padding-left: 0; padding-right: 0; }
body.sidebar-collapsed .nav-group-label,
body.sidebar-collapsed .credit-usage-widget,
body.sidebar-collapsed .user-info > div:not(.user-avatar),
body.sidebar-collapsed .user-info > svg,
body.sidebar-collapsed .btn-logout span { display: none; }
body.sidebar-collapsed .user-info { justify-content: center; padding-left: 0; padding-right: 0; }
body.sidebar-collapsed .btn-logout { justify-content: center; }
/* Ingeklapt: één kolom, alles op de middenas -- zoals Claude's zijbalk. Het
   woordmerk maakt plaats voor het merkteken; elke knop wordt een vierkant
   van 44px dat zichzelf centreert in plaats van links te blijven hangen. */
.sidebar-logo img.sidebar-logo__mark { display: none; width: 34px; height: 34px; object-fit: contain; }
body.sidebar-collapsed .sidebar-logo { padding: 18px 0 16px; }
body.sidebar-collapsed .sidebar-logo img.sidebar-logo__full { display: none; }
body.sidebar-collapsed .sidebar-logo img.sidebar-logo__mark { display: block; }
body.sidebar-collapsed .sidebar-nav { padding: 16px 0; }
body.sidebar-collapsed .nav-item { width: 44px; height: 40px; margin: 0 auto 4px; }
body.sidebar-collapsed .nav-divider { width: 36px; margin-left: auto; margin-right: auto; }
body.sidebar-collapsed .sidebar-bottom { padding: 12px 0 14px; }
body.sidebar-collapsed .sidebar-collapse-btn { width: 44px; margin: 0 auto 8px; padding: 8px 0; }
body.sidebar-collapsed .user-info { width: 44px; margin: 0 auto 8px; padding: 4px 0; }
body.sidebar-collapsed .btn-logout { width: 44px; margin: 0 auto; padding: 9px 0; }
body.sidebar-collapsed .nav-badge {
  position: absolute; top: 5px; right: 9px;
  min-width: 7px; height: 7px; padding: 0;
  font-size: 0; border-radius: 50%;
}

/* De tooltip is wat inklappen bruikbaar houdt in plaats van een raadspelletje.
   Alleen ingeklapt, en alleen op apparaten met een muis. */
@media (hover: hover) {
  body.sidebar-collapsed .nav-item[data-label]:hover::after,
  body.sidebar-collapsed .nav-item[data-label]:focus-visible::after {
    content: attr(data-label);
    position: absolute;
    left: calc(100% + 10px);
    top: 50%;
    transform: translateY(-50%);
    background: #1B1B1B;
    color: #F4F4F4;
    border: 1px solid rgba(255,255,255,0.10);
    padding: 6px 10px;
    border-radius: var(--r-sm);
    font-size: 0.8rem;
    font-weight: 600;
    white-space: nowrap;
    pointer-events: none;
    z-index: 120;
    box-shadow: 0 6px 18px rgba(0,0,0,0.45);
  }
}

.sidebar-collapse-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  margin-top: 8px;
  padding: 8px;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  background: none;
  color: var(--text-muted);
  font-size: 0.8rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}
.sidebar-collapse-btn:hover { background: var(--hover-c); color: var(--text); }
.sidebar-collapse-btn:focus-visible { outline: 2px solid var(--accent-c); outline-offset: 2px; }
.sidebar-collapse-btn svg { transition: transform 0.22s ease; flex-shrink: 0; }
body.sidebar-collapsed .sidebar-collapse-btn span { display: none; }
body.sidebar-collapsed .sidebar-collapse-btn svg { transform: rotate(180deg); }

/* Het accountblok is nu een <button>, dus het heeft de knop-resets nodig die
   een <div> niet had, en een zichtbare focusring, want met de muis was het
   altijd al klikbaar en met het toetsenbord niet te bereiken. */
.user-info {
  border: none;
  font: inherit;
  text-align: left;
  cursor: pointer;
  width: 100%;
  /* Expliciet, want dit is een <button>: zonder background pakt Chrome zijn
     eigen knopkleur (#efefef). Op de donkere zijbalk gaf dat een lichtgrijze
     pil met bijna-witte tekst erop, de profielnaam was in het donkere thema
     onzichtbaar. Niet zichtbaar in de berekende stijl van een ouder: de
     UA-stijl staat op het element zelf. */
  background: rgba(255, 255, 255, 0.05);
}
.user-info:focus-visible { outline: 2px solid var(--accent-c); outline-offset: 2px; }

.nav-item:focus-visible {
  outline: 2px solid var(--blue-bright);
  outline-offset: 2px;
}

.nav-item:hover {
  background: rgba(255,255,255,0.05);
  color: var(--text-primary);
}

.nav-item:active {
  transform: scale(0.98);
  transition-duration: var(--dur-fast);
}

.nav-item.active {
  background: linear-gradient(90deg, rgba(var(--accent-rgb), 0.12), rgba(var(--accent-rgb), 0.06));
  color: var(--accent-ink);
  border: none;
  font-weight: 600;
}

.nav-item.active::before {
  content: '';
  position: absolute;
  left: 0;
  top: 15%;
  height: 70%;
  width: 3px;
  border-radius: 0 3px 3px 0;
  background: linear-gradient(180deg, var(--blue-primary), var(--blue-bright));
  box-shadow: none;
}

.nav-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  opacity: 0.75;
}

.nav-item:hover .nav-icon,
.nav-item.active .nav-icon { opacity: 1; }

.sidebar-bottom {
  padding: 16px 12px;
  border-top: 1px solid var(--border);
}

/* ── Credit usage widget. Hidden by default (display:none inline in the
   HTML), only shown once loadCreditUsage() confirms the credit system is
   active for this client (allowance configured). See CREDIT-SYSTEM-DESIGN.md
   and api/_credits.js. ─────────────────────────────────────────────────── */
.credit-usage-widget { position: relative; margin-bottom: 10px; }

/* De balk is een KNOP. Wat je altijd ziet is een percentage en een streep --
   meer heeft niemand nodig terwijl hij met iets anders bezig is. De cijfers
   (hoeveel credits, hoeveel gesprekken, hoeveel dagen) staan achter een klik,
   want dat zijn cijfers waar je pas naar kijkt als je ernaar zoekt. */
.credit-usage-btn {
  display: block; width: 100%; text-align: left;
  padding: 8px 10px 10px;
  border-radius: var(--r-sm);
  background: transparent; border: 1px solid transparent;
  cursor: pointer; font-family: inherit;
  transition: var(--transition);
}
.credit-usage-btn:hover { background: var(--hover); }
.credit-usage-btn[aria-expanded="true"] { background: var(--hover); border-color: var(--border); }
.credit-usage-btn:focus-visible { outline: 2px solid rgba(var(--accent-rgb),0.55); outline-offset: 1px; }
.credit-usage-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-size: 0.7333rem;
  color: var(--text-muted);
  margin-bottom: 6px;
}
.credit-usage-head .credit-usage-pct { font-weight: 700; font-variant-numeric: tabular-nums; }
.credit-usage-track {
  display: block;
  height: 6px;
  border-radius: var(--r-full);
  background: rgba(255,255,255,0.09);
  overflow: hidden;
}
.credit-usage-fill {
  display: block;
  height: 100%;
  border-radius: var(--r-full);
  transition: width .4s ease;
  background: var(--green);
}
.credit-usage-fill.amber { background: var(--orange); }
.credit-usage-fill.red   { background: var(--red); }
.credit-usage-head .credit-usage-pct.amber { color: var(--orange); }
.credit-usage-head .credit-usage-pct.red   { color: var(--red); }

/* Het detailvenster. position:fixed en niet absolute: de zijbalk is een eigen
   gestapelde context met blur, en een absoluut venster daarbinnen wordt bij de
   rand afgeknipt. De plaats wordt bij het openen berekend (zie plaatsCreditPop).

   De achtergrond is een vaste kleur en geen token, omdat .sidebar --bg-card op
   transparent zet: dit venster hoort dekkend te zijn, anders lees je de
   navigatie eronder er dwars doorheen. */
.credit-usage-pop {
  position: fixed;
  z-index: 1250;
  width: 264px;
  padding: 14px;
  border-radius: var(--r-md);
  background: #201B11;
  border: 1px solid rgba(255,255,255,0.10);
  box-shadow: 0 18px 44px rgba(0,0,0,0.55);
  display: flex; flex-direction: column; gap: 10px;
  animation: modalIn 0.14s ease;
}
.cu-pop-kop {
  display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
  font-size: 0.8rem; font-weight: 700; color: var(--text-primary);
}
.cu-pop-kop span { font-size: 0.7333rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.cu-pop-kop span.amber { color: var(--orange); }
.cu-pop-kop span.red   { color: var(--red); }
.cu-pop-groot {
  font-size: 1.1333rem; font-weight: 700; color: var(--text-primary);
  font-variant-numeric: tabular-nums; line-height: 1.2;
}
.cu-pop-rij { font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; }
.cu-pop-let {
  font-size: 0.8rem; line-height: 1.5; color: var(--orange);
  padding: 8px 10px; border-radius: var(--r-sm);
  background: rgba(255,255,255,0.05);
}
.cu-pop-knoppen { display: flex; flex-direction: column; gap: 6px; margin-top: 2px; }
.cu-pop-knop {
  display: block; width: 100%; padding: 8px 10px;
  border-radius: var(--r-sm); border: 1px solid var(--border);
  background: transparent; color: var(--text-primary);
  font-family: inherit; font-size: 0.8rem; font-weight: 600;
  cursor: pointer; text-align: center; transition: var(--transition);
}
.cu-pop-knop:hover { background: var(--hover); }
.cu-pop-knop.primair {
  border-color: transparent;
  background: var(--accent);
  color: #16130C;   /* warm zwart op zand; was #0E141C, 13,02:1 -> 13,06:1 */
}
.cu-pop-knop.primair:hover { filter: brightness(1.08); }

.user-info {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px;
  border-radius: var(--r-sm);
  margin-bottom: 8px;
}

.user-avatar {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--blue-primary), var(--blue-bright));
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.8667rem;
  font-weight: 700;
  color: var(--on-accent);
  flex-shrink: 0;
}

.user-name {
  font-size: 0.8667rem;
  font-weight: 600;
  color: var(--text-primary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.user-role {
  font-size: 0.7333rem;
  /* De zijbalk is in BEIDE thema's donker, dus --text-muted krijgt hier een
     eigen waarde per thema (zie de light-override verderop). Nagerekend op de
     samengestelde voet rgb(26,31,39): donker #B5B5B5 en licht #8D99AC halen
     allebei ruim boven 4,5:1. Twee meetmethodes zeiden hier eerst van niet --
     de ene mist gradiënten, de andere leest antialiasing als tekst. */
  color: var(--text-muted);
}

.btn-logout {
  width: 100%;
  padding: 9px 14px;
  background: rgba(255, 69, 96, 0.08);
  border: 1px solid rgba(255, 69, 96, 0.2);
  border-radius: var(--r-sm);
  color: var(--red-ink);
  font-size: 0.8rem;
  font-weight: 500;
  cursor: pointer;
  transition: var(--transition);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}

.btn-logout:hover {
  background: rgba(255, 69, 96, 0.15);
  border-color: rgba(255, 69, 96, 0.4);
}

/* Sidebar overlay (mobile) */
.sidebar-overlay {
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.6);
  backdrop-filter: blur(4px);
  z-index: 99;
}

.sidebar-overlay.visible { display: block; }

/* ============================================================
   TOPBAR
   ============================================================ */
.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 28px;
  /* Was a hardcoded rgba(13,17,23,.85), a near-black bar, which in the
     light theme rendered as a dark slab across the top of a pale page.
     Now themed, so it reads as the same material as the sidebar. */
  background: var(--glass-fill);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  border-bottom: 1px solid var(--border);
  box-shadow: none;   /* finish-fix 3: de onderrand is de scheiding, geen slagschaduw op de grond */
  position: sticky;
  top: 0;
  z-index: 50;
}

.topbar-left {
  display: flex;
  align-items: center;
  gap: 14px;
}

.hamburger {
  display: none;
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 8px;
  cursor: pointer;
  color: var(--text-primary);
  font-size: 1.0667rem;
  transition: var(--transition);
}

.hamburger:hover { background: var(--bg-card-alt); }

/* .page-title is nu een <h1>. De browser geeft die standaard 2em en flinke
   marges; dit blok stond er al voor de <div> en moet die reset dus expliciet
   maken, anders springt de hele topbalk uit elkaar. */
h1.page-title { margin: 0; font-weight: inherit; }

.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 200;
  padding: 10px 16px;
  background: var(--card);
  color: var(--text);
  border: 1px solid var(--accent-c);
  border-radius: 0 0 10px 0;
  font-size: 0.8667rem;
  font-weight: 600;
  text-decoration: none;
}
.skip-link:focus {
  left: 0;
}

.page-title {
  font-size: 1.0667rem;
  /* Deze regel staat na de kop-regel bovenaan en zou hem anders terugzetten
     naar Inter/800. Zelfde waarden als daar. */
  font-family: var(--font-head);
  font-weight: 700;
  letter-spacing: -0.02em;
  background: none;
  -webkit-background-clip: initial;
  -webkit-text-fill-color: currentColor;
  background-clip: initial;
  color: var(--text);
  transition: opacity 0.2s ease;
}

.page-subtitle {
  font-size: 0.8rem;
  color: var(--text-muted);
  margin-top: 3px;
  transition: opacity 0.2s ease;
  opacity: 0.8;
}

.topbar-right {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.timestamp-info {
  font-size: 0.8rem;
  color: var(--text-muted);
  white-space: nowrap;
}

/* ══ KNOPPEN ══════════════════════════════════════════════════════════════
   Wat de referentiesets gemeen hebben, en wat hier ontbrak.

   Vier dingen komen in alle vier de voorbeelden terug, en het zijn precies de
   vier die een knop van "vlak vlak met tekst" naar "voorwerp" tillen:

     1. RANDLICHT. Niet een rand van 1px in één kleur rondom, maar een lichte
        bovenrand en een donkere onderrand. Dat is licht van boven, en het is
        het goedkoopste signaal dat iets DIKTE heeft.
     2. VERLOOP. Nooit vlak. Boven iets lichter dan onder.
     3. GLOED IN DE EIGEN KLEUR. Geen neutrale drop shadow maar een bloem in de
        kleur van de knop zelf, onder hem.
     4. ECHTE STATEN. rust / zweef / druk / focus / uit, zichtbaar verschillend.

   Wat hier NIET van overgenomen wordt is de neon. Die sets staan op paars-zwart
   met verzadigde glow; Helvaro is zand op warm zwart en verkoopt vertrouwen,
   geen spektakel. De MECHANIEK is hetzelfde, de sterkte niet: waar de
   voorbeelden een gloed van 40% zetten, staat hier 14%.

   Eén plek, want er zijn 134 knop-selectors in dit bestand. Deze drie tokens
   voeden .btn-icon en zijn varianten, en dat is waar 75 van die selectors
   uiteindelijk op uitkomen. */
:root {
  /* Licht van boven, schaduw van onder. Twee inset-lijnen, geen border. */
  --btn-rim:  inset 0 1px 0 rgba(255,255,255,0.10), inset 0 -1px 0 rgba(0,0,0,0.24);
  --btn-rim-accent: inset 0 1px 0 rgba(255,255,255,0.28), inset 0 -1px 0 rgba(0,0,0,0.18);
  /* Fase 4 (ontwerpsysteem): de accent-gloed is weg. VISUAL-DIRECTION.md
     verbiedt gloed-effecten met naam ("glowing effects"), en de showroom-
     wereld tilt een sample één toonstap op tot --raised in plaats van hem te
     laten stralen. --btn-glow blijft als lege token gedefinieerd zodat de
     ~9.800 regels die er nog naar verwijzen (var(--btn-rim), var(--btn-glow))
     geldig blijven -- hij voegt nu alleen niets meer toe. */
  --btn-glow: none;
}

.btn-icon {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 7px 14px;
  /* Vlak weer, geen verlopen plaat: finish-fix 3 verbiedt de
     'kaart-is-een-verloop'-truc. Terug naar de rgba(255,255,255,0.04) die
     hier stond voor het verloop erbij kwam. */
  background: rgba(255,255,255,0.04);
  border: 1px solid rgba(255,255,255,0.07);
  box-shadow: var(--btn-rim);
  /* Van --radius-sm (8px) naar --radius-btn (14px): de knopmaat uit het
     ontwerpsysteem, die tot nu toe alleen op grote knoppen stond. De
     referenties gebruiken allemaal een ruimere hoek, en 8px liet deze knoppen
     als invoervelden lezen. */
  border-radius: var(--radius-btn);
  color: var(--text-secondary);
  font-size: 0.8rem;
  font-weight: 500;
  cursor: pointer;
  transition: background var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out),
              color var(--dur-base) var(--ease-out),
              transform var(--dur-fast) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
  white-space: nowrap;
}

.btn-icon:hover {
  background: rgba(var(--accent-rgb),0.14);
  border-color: rgba(var(--accent-rgb),0.28);
  color: var(--accent-ink);
  /* Hier stond box-shadow:none -- de knop verloor bij het zweven juist zijn
     diepte, precies andersom dan het hoort. Nu komt de gloed erbij. */
  box-shadow: var(--btn-rim), var(--btn-glow);
  transform: translateY(-1px);
}

/* Press responds instantly (fast duration, no separate delay), perceived
   speed matters more here than the animation itself. */
.btn-icon:active {
  transform: translateY(0) scale(0.97);
  transition-duration: var(--dur-fast);
}

.btn-icon:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.25);
  border-color: var(--blue-bright);
}

.btn-icon:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  transform: none;
  box-shadow: none;
}
.btn-icon:disabled:hover {
  background: rgba(255,255,255,0.04);
  border-color: rgba(255,255,255,0.07);
  color: var(--text-secondary);
}

    /* ── Global Search ── */
    .search-overlay {
      position: fixed;
      inset: 0;
      background: rgba(15,12,5,0.8);
      backdrop-filter: blur(8px);
      -webkit-backdrop-filter: blur(8px);
      z-index: 9000;
      display: none;
      align-items: flex-start;
      justify-content: center;
      padding-top: 90px;
    }
    .search-overlay.open { display: flex; animation: searchBgIn 0.15s ease both; }
    @keyframes searchBgIn { from { opacity:0; } to { opacity:1; } }
    .search-modal {
      background: var(--bg-card);
      border: 1px solid var(--border-bright);
      border-radius: var(--radius);
      width: min(660px, 92vw);
      box-shadow: var(--elev-3);
      overflow: hidden;
      position: relative;
      animation: searchModalIn 0.2s cubic-bezier(0.16,1,0.3,1) both;
    }
    /* Match stat-card top glow line */
    .search-modal::before {
      content: '';
      position: absolute;
      top: 0; left: 0; right: 0;
      height: 1px;
      background: var(--accent);
      z-index: 1;
    }
    @keyframes searchModalIn { from { transform: translateY(-14px) scale(0.97); opacity:0; } to { transform: none; opacity:1; } }
    .search-modal-bar {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 16px 20px;
      border-bottom: 1px solid var(--border);
    }
    .search-modal-bar svg { color: var(--accent-ink); flex-shrink:0; }
    .search-modal-input {
      flex: 1;
      background: none;
      border: none;
      outline: none;
      font-size: 1.0667rem;
      color: var(--text-primary);
      font-family: 'Inter', sans-serif;
    }
    .search-modal-input::placeholder { color: var(--text-secondary); }
    .search-kbd {
      background: var(--bg-card-alt);
      border: 1px solid var(--border);
      border-radius: var(--radius-sm);
      padding: 3px 10px;
      font-size: 0.7333rem;
      color: var(--text-secondary);
      cursor: pointer;
      font-family: 'Inter', sans-serif;
      white-space: nowrap;
      flex-shrink: 0;
      transition: var(--transition);
    }
    .search-kbd:hover { border-color: var(--accent); color: var(--text-primary); }
    .search-results {
      max-height: 420px;
      overflow-y: auto;
      padding: 6px 0;
    }
    .search-results::-webkit-scrollbar { width: 3px; }
    .search-results::-webkit-scrollbar-track { background: transparent; }
    .search-results::-webkit-scrollbar-thumb { background: var(--border-bright); border-radius: 2px; }
    .search-hint {
      padding: 32px 20px;
      text-align: center;
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 10px;
    }
    .search-hint-icon { opacity: 0.3; line-height: 1; color: var(--text-muted); }
    .search-hint-text { font-size: 0.8667rem; color: var(--text-secondary); }
    .search-hint-shortcuts { display: flex; gap: 16px; margin-top: 4px; flex-wrap: wrap; justify-content: center; }
    .search-hint-shortcut { font-size: 0.7333rem; color: var(--text-muted); display: flex; align-items: center; gap: 5px; }
    .search-hint-shortcut kbd {
      background: var(--bg-card-alt);
      border: 1px solid var(--border);
      border-radius: var(--r-xs);
      padding: 1px 6px;
      font-size: 0.6667rem;
      font-family: 'Inter', sans-serif;
      color: var(--text-secondary);
    }
    .search-section-label {
      padding: 10px 20px 3px;
      font-size: 0.6667rem;
      font-weight: 700;
      text-transform: uppercase;
      letter-spacing: 0.1em;
      color: var(--text-muted);
    }
    .search-result-item {
      display: flex;
      align-items: center;
      gap: 12px;
      padding: 10px 20px;
      cursor: pointer;
      transition: background 0.1s;
      user-select: none;
    }
    .search-result-item:hover,
    .search-result-item.active {
      background: var(--bg-card-alt);
    }
    .search-result-item:hover .search-result-name,
    .search-result-item.active .search-result-name {
      color: var(--accent-ink);
    }
    .search-result-avatar {
      width: 36px; height: 36px; border-radius: var(--radius-sm);
      background: linear-gradient(135deg, var(--blue-primary), var(--accent-bright));
      display: flex; align-items: center; justify-content: center;
      font-size: 0.8rem; font-weight: 700; color: var(--on-accent); flex-shrink: 0;
      letter-spacing: 0.03em;
      box-shadow: none;
    }
    .search-result-body { flex: 1; min-width: 0; }
    .search-result-name {
      font-size: 0.8667rem; font-weight: 600; color: var(--text-primary);
      white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    .search-result-name mark {
      background: rgba(var(--accent-rgb),0.2); color: var(--accent-ink);
      font-weight: 700; border-radius: var(--r-xs); padding: 0 2px;
    }
    .search-result-meta {
      font-size: 0.7333rem; color: var(--text-secondary); margin-top: 2px;
      white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    .search-result-tags {
      display: flex; gap: 5px; align-items: center;
      margin-left: auto; flex-shrink: 0; padding-left: 8px;
    }
    .search-result-badge {
      font-size: 0.6667rem; font-weight: 600; text-transform: uppercase;
      letter-spacing: 0.04em; padding: 2px 7px; border-radius: var(--r-lg);
      background: rgba(var(--accent-rgb),0.12); color: var(--accent-ink);
      border: 1px solid rgba(var(--accent-rgb),0.2);
    }
    .search-result-badge.qualified {
      background: rgba(var(--success-rgb),0.1); color: var(--green-ink);
      border-color: rgba(var(--success-rgb),0.2);
    }
    .search-result-score {
      font-size: 0.7333rem; font-weight: 700; font-variant-numeric: tabular-nums;
      color: var(--accent-ink);
      background: rgba(var(--accent-rgb),0.1);
      padding: 2px 8px; border-radius: var(--radius-sm);
      border: 1px solid rgba(var(--accent-rgb),0.2);
      white-space: nowrap;
    }
    .search-no-results {
      padding: 36px 20px;
      text-align: center;
      color: var(--text-secondary);
      font-size: 0.8667rem;
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 8px;
    }
    .search-no-results-icon { opacity: 0.3; color: var(--text-muted); }
    .search-footer {
      padding: 9px 20px;
      border-top: 1px solid var(--border);
      display: flex;
      gap: 16px;
      align-items: center;
      background: var(--bg-card-alt);
    }
    .search-footer-hint { font-size: 0.7333rem; color: var(--text-muted); display: flex; align-items: center; gap: 4px; }
    .search-footer-hint kbd {
      background: var(--bg-card);
      border: 1px solid var(--border);
      border-radius: var(--r-xs);
      padding: 1px 5px;
      font-size: 0.6667rem;
      font-family: 'Inter', sans-serif;
      color: var(--text-secondary);
    }
    .search-footer-count { margin-left: auto; font-size: 0.7333rem; color: var(--text-muted); }
    /* Search pill in topbar */
    .search-pill {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 6px 12px;
      background: var(--bg-card-alt);
      border: 1px solid var(--border);
      border-radius: var(--radius-sm);
      color: var(--text-secondary);
      font-size: 0.8667rem;
      cursor: pointer;
      transition: var(--transition);
      min-width: 170px;
      font-family: 'Inter', sans-serif;
    }
    .search-pill:hover { border-color: var(--accent); color: var(--text-primary); background: var(--bg-card-hover); }
    .search-pill svg { flex-shrink: 0; opacity: 0.7; }
    .search-pill-label { flex: 1; text-align: left; }
    .search-pill-kbd {
      font-size: 0.6667rem;
      background: var(--bg-card);
      border: 1px solid var(--border);
      border-radius: var(--r-xs);
      padding: 1px 5px;
      font-family: 'Inter', sans-serif;
      color: var(--text-muted);
      flex-shrink: 0;
    }
.notif-badge {
  position: absolute;
  top: 2px;
  right: 2px;
  background: var(--red);
  color: var(--on-accent);
  font-size: 0.6rem;
  font-weight: 700;
  min-width: 16px;
  height: 16px;
  border-radius: var(--r-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 3px;
  border: 2px solid var(--bg-topbar, var(--bg));
  pointer-events: none;
}

/* Notification dropdown */
.notif-wrap { position: relative; display: inline-flex; }
.notif-dropdown {
  position: absolute; top: calc(100% + 8px); right: 0;
  width: 340px; max-width: calc(100vw - 32px);
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); box-shadow: var(--shadow);
  z-index: 200; overflow: hidden;
  animation: notifDdIn 0.14s cubic-bezier(0.4,0,0.2,1);
}
@keyframes notifDdIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.notif-dd-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 14px; border-bottom: 1px solid var(--border);
  font-size: 0.8667rem; font-weight: 700; color: var(--text-primary);
}
.notif-dd-clear {
  background: none; border: none; color: var(--accent-ink);
  font-size: 0.7333rem; font-weight: 600; cursor: pointer; font-family: inherit;
}
.notif-dd-clear:hover { text-decoration: underline; }
.notif-dd-body { max-height: 360px; overflow-y: auto; }
.notif-dd-item {
  display: flex; align-items: center; gap: 10px;
  padding: 11px 14px; cursor: pointer; border-bottom: 1px solid var(--border);
  transition: background 0.12s ease;
}
.notif-dd-item:hover { background: var(--bg-card-hover); }
.notif-dd-item.unread { background: rgba(var(--accent-rgb),0.06); }
.notif-dd-dot {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
  background: var(--accent); opacity: 0;
}
.notif-dd-item.unread .notif-dd-dot { opacity: 1; }
.notif-dd-icon {
  width: 30px; height: 30px; border-radius: var(--r-sm); flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  background: var(--bg-card-alt); color: var(--accent-ink);
}
.notif-dd-icon.hot { background: rgba(var(--success-rgb),0.12); color: var(--green-ink); }
.notif-dd-main { flex: 1; min-width: 0; }
.notif-dd-title {
  font-size: 0.8667rem; font-weight: 600; color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.notif-dd-sub { font-size: 0.7333rem; color: var(--text-muted); margin-top: 1px; }
.notif-dd-empty { padding: 28px 14px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; }
.notif-dd-foot {
  width: 100%; padding: 11px; background: var(--bg-card-alt); border: none;
  border-top: 1px solid var(--border); color: var(--accent-ink);
  font-size: 0.8rem; font-weight: 600; cursor: pointer; font-family: inherit;
}
.notif-dd-foot:hover { background: var(--bg-card-hover); }

.btn-icon .icon { font-size: 0.9333rem; }

.btn-icon.spin .icon { animation: spin 1s linear infinite; }

@keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
@keyframes cmFadeIn { from { opacity: 0; } to { opacity: 1; } }

/* Generic confirm modal buttons (injected via showConfirmModal) */
.cm-btn:hover { opacity: 0.88; }
.cm-btn:active { transform: translateY(1px); }
.cm-btn:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.3); }
.cm-btn-confirm.danger:focus-visible { box-shadow: 0 0 0 3px rgba(var(--error-rgb),0.3); }
@keyframes modalIn { from { opacity: 0; transform: translateY(-8px) scale(.96); } to { opacity: 1; transform: translateY(0) scale(1); } }

/* De primaire knop. Fase 4: "de ene, effen chip" uit het richtingscontract --
   een vlakke vulling (--btn-primary-bg/--btn-primary-text), geen gloed en
   geen doorschijnend verloop. Was een 15-30%-getinte "geest"-knop; dat
   paste niet bij een brief die met naam een solide chip als primaire actie
   vraagt. Rand-licht (--btn-rim-accent) blijft voor de opgetilde rand. */
.btn-primary-sm {
  background: var(--btn-primary-bg);
  border-color: transparent;
  box-shadow: var(--btn-rim-accent);
  color: var(--btn-primary-text);
}

.btn-primary-sm:hover {
  /* Eén toonstap op, geen gloed: dezelfde taal als een kaart die optilt naar
     --raised. transform doet het merendeel van het werk. */
  filter: brightness(1.08);
  box-shadow: var(--btn-rim-accent);
  color: var(--btn-primary-text);
}

.btn-primary-sm:active {
  filter: brightness(0.96);
  box-shadow: var(--btn-rim-accent);
}

.btn-primary-sm:disabled,
.btn-primary-sm:disabled:hover {
  opacity: 0.45;
  cursor: not-allowed;
  background: var(--btn-primary-bg);
  filter: none;
  box-shadow: none;
  transform: none;
  color: var(--btn-primary-text);
}

.theme-toggle { font-size: 1.0667rem; padding: 8px 10px; }

/* ============================================================
   STATS GRID
   ============================================================ */
.stats-grid {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 16px;
  margin-bottom: 24px;
}

.stat-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px 20px 18px;
  position: relative;
  overflow: hidden;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out),
              background var(--dur-base) var(--ease-out);
  cursor: default;
  box-shadow: var(--edge-hi), var(--shadow-card);
}

/* ---- Per-metric colour -----------------------------------------------
   Each card binds one local --a / --a-soft pair; the icon chip, the fill
   bar and the top hairline all read from it, so a metric's colour is set
   in exactly one place. Colour never touches the value text, coloured
   numerals fail contrast and read as decoration rather than data. */
.stat-card[data-accent="blue"]    { --a: var(--c-blue);    --a-soft: var(--c-blue-soft); }
.stat-card[data-accent="emerald"] { --a: var(--c-emerald); --a-soft: var(--c-emerald-soft); }
.stat-card[data-accent="orange"]  { --a: var(--c-orange);  --a-soft: var(--c-orange-soft); }
.stat-card[data-accent="purple"]  { --a: var(--c-purple);  --a-soft: var(--c-purple-soft); }
.stat-card[data-accent="cyan"]    { --a: var(--c-cyan);    --a-soft: var(--c-cyan-soft); }
.stat-card[data-accent="gold"]    { --a: var(--c-gold);    --a-soft: var(--c-gold-soft); }

/* A 2px bar across the top edge, revealed on hover. At rest the grid stays
   calm; on approach the card identifies itself. */
.stat-card::after {
  content: '';
  position: absolute;
  inset: 0 0 auto 0;
  height: 2px;
  background: var(--a, var(--accent));
  opacity: 0;
  transition: opacity var(--dur-base, .18s) var(--ease-out, ease);
}
.stat-card:hover::after { opacity: 1; }
.stat-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--elev-2, var(--shadow));
  border-color: var(--a, var(--border));
}
.stat-card:active { transform: translateY(0); }

.stat-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
}
.stat-icon {
  flex: 0 0 auto;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  border-radius: var(--r-sm);
  background: var(--a-soft, rgba(0,0,0,.05));
  color: var(--a, var(--accent));
}
.stat-icon svg { width: 16px; height: 16px; display: block; }
.stat-bar-fill { background: var(--a, var(--accent)) !important; }

@media (prefers-reduced-motion: reduce) {
  .stat-card, .stat-card::after { transition: none; }
  .stat-card:hover { transform: none; }
}

/* Subtle top line, one quiet sand hairline, not a two-hue glow */
.stat-card::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: rgba(var(--accent-rgb), 0.35);
  transition: opacity 0.3s ease;
}

/* Corner shimmer removed, was a 60x60 solid-fill block, too heavy for "sand never a flood" */
.stat-card::after {
  content: '';
  position: absolute;
  top: 0;
  right: 0;
  width: 60px;
  height: 60px;
  background: none;
  pointer-events: none;
}

.stat-card:hover {
  border-color: var(--border-bright);
  background: var(--bg-card-hover);
  transform: translateY(-3px) scale(1.01);
  box-shadow: var(--elev-1);
}

.stat-card:active {
  transform: translateY(-1px) scale(1.005);
  transition-duration: var(--dur-fast);
}

.stat-card:hover::before {
  background: rgba(var(--accent-rgb), 0.6);
}

.stat-label {
  font-size: 0.7333rem;
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.073em;
  margin-bottom: 10px;
}

.stat-value {
  font-variant-numeric: tabular-nums;
  font-size: 1.8667rem;
  /* Deze regel staat na de kop-regel; zonder deze drie zou hij terugvallen
     op Inter/800. De grote cijfers zijn juist waar de kop-letter het meest
     doet. */
  font-family: var(--font-head);
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--text-primary);
  line-height: 1;
  margin-bottom: 8px;
}

.stat-value.cyan  { color: var(--accent-ink);        text-shadow: 0 0 20px rgba(188,159,95,0.35); }
.stat-value.green { color: var(--green-ink);        text-shadow: 0 0 20px rgba(16,185,129,0.35); }
.stat-value.orange{ color: var(--orange-ink);       text-shadow: 0 0 20px rgba(var(--warning-rgb),0.3); }
.stat-value.blue  { color: var(--accent-ink);  text-shadow: 0 0 20px rgba(159,131,67,0.35); }

.stat-unit {
  font-size: 1.0667rem;
  font-weight: 600;
  opacity: 0.45;
  margin-left: 2px;
  letter-spacing: 0;
}

.stat-desc {
  font-size: 0.7333rem;
  color: var(--text-secondary);
  margin-bottom: 10px;
}

.stat-trend {
  margin-top: 4px;
  min-height: 16px;
}

.stat-bar {
  height: 3px;
  background: var(--bg-card-alt);
  border-radius: 2px;
  overflow: hidden;
}

.stat-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--blue-primary), var(--cyan));
  border-radius: 2px;
  transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
  width: 0%;
}

/* ============================================================
   FILTERS BAR
   ============================================================ */
.filters-bar {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 12px 18px;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}

.search-wrapper {
  position: relative;
  flex: 1;
  min-width: 180px;
}

.search-icon {
  position: absolute;
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--text-muted);
  font-size: 0.9333rem;
  pointer-events: none;
}

.search-input {
  width: 100%;
  padding: 9px 12px 9px 36px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-primary);
  font-size: 0.8667rem;
  font-family: 'Inter', sans-serif;
  outline: none;
  transition: var(--transition);
}

.search-input:focus {
  border-color: var(--blue-bright);
  box-shadow: 0 0 0 2px rgba(var(--accent-rgb), 0.12);
}

.search-input::placeholder { color: var(--text-muted); }

.filter-select {
  padding: 9px 12px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-primary);
  font-size: 0.8667rem;
  font-family: 'Inter', sans-serif;
  outline: none;
  cursor: pointer;
  transition: var(--transition);
  min-width: 130px;
}

/* :focus alleen op border-color was in het donkere thema onzichtbaar, de
   randkleur verschilde te weinig van de rustkleur om als focus te lezen, en
   een tabpas leek daardoor nergens te landen. Nu een echte ring, en
   :focus-visible zodat een muisklik hem niet oproept. */
.filter-select:focus { border-color: var(--accent-c); }
/* box-shadow en geen outline: de regel met outline stond wél in de uitvoer en
   won ook op specificiteit, maar de gemeten breedte bleef 0px, een <select>
   laat zich door de browser maar beperkt opmaken. .cm-btn:focus-visible
   verderop in dit bestand doet het al zo, en dat werkt wel. */
.filter-select:focus-visible,
#search-input:focus-visible {
  box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.45);
  border-color: var(--accent-c);
}

.filters-label {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.8rem;
  color: var(--text-secondary);
  font-weight: 500;
  white-space: nowrap;
}

.filter-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  background: var(--blue-primary);
  border-radius: 50%;
  font-size: 0.6667rem;
  font-weight: 700;
  color: var(--on-accent);
}

.btn-reset {
  padding: 8px 12px;
  background: rgba(255, 69, 96, 0.08);
  border: 1px solid rgba(255, 69, 96, 0.2);
  border-radius: var(--r-sm);
  color: var(--red-ink);
  font-size: 0.8rem;
  font-weight: 500;
  cursor: pointer;
  transition: var(--transition);
  white-space: nowrap;
  display: none;
}

.btn-reset.visible { display: inline-flex; align-items: center; gap: 4px; }
.btn-reset:hover { background: rgba(255, 69, 96, 0.15); }

.leads-count {
  font-size: 0.8rem;
  color: var(--text-muted);
  white-space: nowrap;
  margin-left: auto;
}

.leads-count strong { color: var(--text-secondary); }

/* ============================================================
   TABLE
   ============================================================ */
.table-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--edge-hi), var(--shadow-card);
  position: relative;
}

.table-card::before {
  content: '';
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 1px;
  background: linear-gradient(90deg, transparent 10%, rgba(135,109,43,0.35) 40%, rgba(188,159,95,0.35) 60%, transparent 90%);
  z-index: 1;
  pointer-events: none;
}

.table-wrapper {
  overflow-x: auto;
}

table {
  width: 100%;
  border-collapse: collapse;
}

thead tr {
  border-bottom: 1px solid var(--border);
  background: linear-gradient(90deg, rgba(135,109,43,0.05) 0%, rgba(188,159,95,0.02) 100%);
}

th {
  padding: 12px 14px;
  text-align: left;
  font-size: 0.6667rem;
  font-weight: 700;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  white-space: nowrap;
}

th.sortable {
  cursor: pointer;
  user-select: none;
  transition: color 0.2s;
}

th.sortable:hover { color: var(--accent-ink); }
th.sort-active { color: var(--accent-ink); }

.sort-indicator { margin-left: 4px; font-size: 0.6667rem; }

tbody tr {
  border-bottom: 1px solid rgba(37, 33, 22, 0.5);
  transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1), transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
  cursor: pointer;
  position: relative;
}

tbody tr:nth-child(even) { background: rgba(255,255,255,0.012); }
tbody tr:hover {
  background: rgba(var(--accent-rgb), 0.08);
  box-shadow: inset 3px 0 0 var(--blue-bright);
  transform: scale(1.002);
}
tbody tr:active { transform: scale(0.998); }
tbody tr:last-child { border-bottom: none; }

/* Row focus state for keyboard navigation */
tbody tr:focus-visible {
  outline: 2px solid var(--blue-bright);
  outline-offset: -2px;
  background: rgba(var(--accent-rgb), 0.1);
}

td {
  padding: 12px 14px;
  font-size: 0.8667rem;
  color: var(--text-primary);
  vertical-align: middle;
}

.td-naam { font-weight: 600; max-width: 140px; }
.td-phone {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.8rem;
  color: var(--text-secondary);
  white-space: nowrap;
}

.copy-btn {
  opacity: 0;
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 0.8rem;
  padding: 2px 4px;
  border-radius: var(--r-xs);
  transition: var(--transition);
  position: relative;
}

tr:hover .copy-btn { opacity: 1; }
.copy-btn:hover { color: var(--accent-ink); background: rgba(193, 184, 164, 0.1); }

/* Touch devices have no hover, keep the copy button discoverable/tappable */
@media (hover: none) {
  .copy-btn { opacity: 0.65; }
}

.copy-tooltip {
  position: absolute;
  bottom: calc(100% + 4px);
  left: 50%;
  transform: translateX(-50%);
  background: var(--success);
  color: var(--on-accent);
  font-size: 0.6667rem;
  font-weight: 600;
  padding: 3px 8px;
  border-radius: var(--r-xs);
  white-space: nowrap;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.2s;
}

.copy-tooltip.show { opacity: 1; }

/* Badges */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 10px;
  border-radius: var(--r-lg);
  font-size: 0.7333rem;
  font-weight: 600;
  white-space: nowrap;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
  letter-spacing: 0.018em;
}

.badge-new {
  background: rgba(155, 149, 136, 0.12);
  color: var(--neutral-ink);
  border: 1px solid rgba(155,149,136,0.2);
}
.badge-inprogress {
  background: rgba(255, 149, 0, 0.1);
  color: var(--orange-ink);
  border: 1px solid rgba(255,149,0,0.22);
  position: relative;
}
.badge-inprogress::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--orange);
  animation: pulse 1.5s ease-in-out infinite;
}
.badge-done {
  background: rgba(var(--accent-rgb), 0.1);
  color: var(--accent-ink);
  border: 1px solid rgba(var(--accent-rgb),0.22);
}
.badge-yes {
  background: rgba(var(--success-rgb), 0.1);
  color: var(--green-ink);
  border: 1px solid rgba(var(--success-rgb),0.22);
}
.badge-yes::before {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--green);
  box-shadow: 0 0 6px rgba(var(--success-rgb),0.5);
}
.badge-no {
  background: rgba(var(--error-rgb), 0.1);
  color: var(--red-ink);
  border: 1px solid rgba(var(--error-rgb),0.22);
}
.badge-bron {
  background: rgba(var(--accent-rgb), 0.08);
  color: var(--accent-ink);
  border: 1px solid rgba(var(--accent-rgb),0.18);
  font-size: 0.6667rem;
}

@keyframes pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.5; transform: scale(0.85); }
}

/* Score pill */
.score-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 36px;
  height: 26px;
  border-radius: var(--r-xs);
  font-size: 0.8rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  cursor: default;
  transition: transform 0.2s ease;
  padding: 0 6px;
}

.score-pill:hover {
  transform: scale(1.05);
}

.score-green {
  background: rgba(var(--success-rgb), 0.12);
  color: var(--green-ink);
  border: 1px solid rgba(var(--success-rgb),0.25);
  box-shadow: none;
}
.score-orange {
  background: rgba(var(--warning-rgb), 0.12);
  color: var(--orange-ink);
  border: 1px solid rgba(var(--warning-rgb),0.25);
}
.score-red {
  background: rgba(var(--error-rgb), 0.12);
  color: var(--red-ink);
  border: 1px solid rgba(var(--error-rgb),0.25);
}
.score-gray {
  background: rgba(155, 149, 136, 0.08);
  color: var(--text-muted);
  border: 1px solid rgba(155,149,136,0.15);
}

.td-samenvatting {
  max-width: 200px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--text-secondary);
  font-size: 0.8rem;
}

.td-arrow { color: var(--text-muted); font-size: 0.9333rem; text-align: right; }
tr:hover .td-arrow { color: var(--accent-ink); }

/* Skeleton loading */
.skeleton-row td { padding: 16px 14px; }

/* De vormen van laadvlak() hierboven. Bewust minimaal: het is .skeleton met
   een indeling eromheen, geen tweede animatiesysteem. */
/* flex:1 en width:100% omdat een laadvlak in een flex- of grid-container
   anders inklapt tot de breedte van zijn inhoud. Gemeten op het pipeline-bord:
   42px in een bak van 1164px -- de placeholder was er wel, maar onvindbaar.
   grid-column om dezelfde reden: in de rasters van AI-beeld nam hij anders
   een enkele cel van 117px in beslag in plaats van de volle rij. */
.laadvlak { display: flex; flex-direction: column; gap: 12px; padding: 4px 0; flex: 1 1 auto; width: 100%; min-width: 0; grid-column: 1 / -1; }
.laadvlak--tegel { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: 10px; }
.laadvlak--kolom { flex-direction: row; gap: 14px; align-items: flex-start; }

.laad-rij { display: flex; align-items: center; gap: 10px; }
.laad-bol { width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0; }
.laad-tekst { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.laad-tegel { height: 62px; border-radius: var(--r-sm); }
/* Even breed als een echte pipeline-kolom (.pipeline-col is flex: 0 0 260px).
   Met flex:1 kromp de placeholder mee tot 79px op een telefoon, terwijl er
   daarna kolommen van 260px verschijnen die het bord horizontaal laten
   scrollen. Dan belooft de plaatshouder een andere indeling dan wat er komt,
   en dat is precies wat een plaatshouder-op-vorm hoort te voorkomen. */
.laad-kolom { flex: 1 1 210px; max-width: 100%; min-width: 210px; display: flex; flex-direction: column; gap: 10px; }
.laad-kaart { height: 54px; border-radius: var(--r-sm); }
/* Wat er staat als het wachten voorbij is en er niets kwam. Bewust rustig:
   de banner bovenaan zegt al wat er mis is en waarom -- dit is alleen de plek
   die anders eeuwig had staan schimmeren. */
.laad-mislukt { padding: 14px 2px; color: var(--text-muted); font-size: 0.8667rem; }

/* Alleen voor schermlezers. Niet display:none en niet visibility:hidden --
   die twee halen het uit de voorleesvolgorde, en dan is er alsnog niets te
   horen. Dit haalt het uit BEELD en laat het in de boom staan. */
.alleen-voorlezen {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}

.skeleton {
  background: linear-gradient(90deg, var(--bg-card-alt) 0%, var(--bg-card-hover) 20%, var(--bg-card-alt) 40%, var(--bg-card-alt) 100%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
  border-radius: var(--r-xs);
  height: 14px;
  display: block;
  position: relative;
  overflow: hidden;
}

.skeleton::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.04), transparent);
  animation: skeleton-shine 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
}

@keyframes skeleton-shimmer {
  0% { background-position: 200% 50%; }
  100% { background-position: -200% 50%; }
}

@keyframes skeleton-shine {
  0% { transform: translateX(-100%); }
  100% { transform: translateX(100%); }
}

/* Skeleton stat cards */
.stat-card-skeleton {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.stat-card-skeleton .skeleton-label {
  height: 12px;
  width: 60%;
  border-radius: var(--r-xs);
}
.stat-card-skeleton .skeleton-value {
  height: 32px;
  width: 45%;
  border-radius: var(--r-xs);
}
.stat-card-skeleton .skeleton-bar {
  height: 4px;
  width: 100%;
  border-radius: 2px;
  margin-top: 8px;
}

/* Empty state */
.empty-state {
  text-align: center;
  padding: 40px 32px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}

.empty-icon {
  font-size: 3.7333rem;
  margin-bottom: 12px;
  opacity: 0.25;
  filter: grayscale(0.5);
}
.empty-title {
  font-size: 1.1333rem;
  font-weight: 700;
  color: var(--text-secondary);
  margin-bottom: 6px;
  letter-spacing: -0.012em;
}
.empty-desc {
  font-size: 0.9333rem;
  color: var(--text-muted);
  margin-bottom: 24px;
  max-width: 320px;
  line-height: 1.6;
}
.empty-state-illustration {
  width: 120px;
  height: 120px;
  margin-bottom: 20px;
  border-radius: 50%;
  background: var(--accent);
  border: 1px dashed rgba(var(--accent-rgb),0.2);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 3.2rem;
  opacity: 0.6;
}

/* ============================================================
   DETAIL PANEL
   ============================================================ */
.panel-backdrop {
  /* Materialiseert in plaats van te ploppen: opacity in plaats van display. */
  position: fixed;
  inset: 0;
  background: rgba(23, 20, 15, 0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 200;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-out);
}

.panel-backdrop.visible { opacity: 1; pointer-events: auto; }

/* De pagina erachter wijkt iets terug zolang het paneel open is: het paneel
   is een taak bovenop de pagina, niet ernaast (Apple: dim to focus). */
.main-content { transition: transform var(--dur-enter) var(--ease-out); transform-origin: 50% 40%; }
body.panel-open .main-content { transform: scale(0.985); }
.detail-panel.is-swiping { transition: none; }
@media (prefers-reduced-motion: reduce) {
  body.panel-open .main-content { transform: none; }
  .panel-backdrop { transition: none; }
}

.detail-panel {
  position: fixed;
  right: 0;
  top: 0;
  height: 100vh;
  width: 480px;
  background: var(--card-elevated);
  border-left: 1px solid var(--border);
  /* Directional version of --elev-3, it slides in from the right edge,
     so the shadow reads leftward instead of the usual centred spread. */
  box-shadow: -6px 0 16px rgba(0,0,0,.32), -24px 0 56px rgba(0,0,0,.28);
  z-index: 201;
  display: flex;
  flex-direction: column;
  transform: translateX(100%);
  /* Buiten beeld schuiven verbergt het paneel voor het OOG, niet voor de rest.
     Zonder de regel hieronder bleef het display:flex, visibility:visible en
     opacity:1, en dus bleven zijn knoppen (sluiten, nummer kopieren) gewoon in
     de tabvolgorde staan -- op ELKE pagina, ook op het inlogscherm, waar je met
     Tab in een paneel belandde dat niemand kan zien.

     visibility:hidden haalt het uit de tabvolgorde en bij schermlezers weg, en
     is animeerbaar: door het mee te laten lopen met dezelfde duur blijft de
     uitschuif-animatie zichtbaar in plaats van halverwege te verspringen. */
  visibility: hidden;
  transition: transform var(--dur-enter) var(--ease-out),
              visibility 0s linear var(--dur-enter);
  overflow: hidden;
}

.detail-panel.visible {
  transform: translateX(0);
  visibility: visible;
  /* Bij het OPENEN moet visibility meteen aan, anders schuift er een
     onzichtbaar paneel in beeld. Vandaar hier geen vertraging. */
  transition: transform var(--dur-enter) var(--ease-out),
              visibility 0s linear 0s;
}

.panel-header {
  padding: 24px 24px 20px;
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  position: relative;
}

.panel-close {
  position: absolute;
  top: 18px;
  right: 18px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  color: var(--text-secondary);
  font-size: 1.0667rem;
  transition: var(--transition);
}

.panel-close:hover { background: rgba(255,69,96,0.1); border-color: var(--red); color: var(--red-ink); }

.panel-avatar {
  width: 60px;
  height: 60px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.4667rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  margin-bottom: 14px;
}

.avatar-green { background: rgba(0, 229, 160, 0.15); color: var(--green-ink); border: 2px solid rgba(0,229,160,0.3); }
.avatar-red { background: rgba(255, 69, 96, 0.15); color: var(--red-ink); border: 2px solid rgba(255,69,96,0.3); }
.avatar-orange { background: rgba(255, 149, 0, 0.15); color: var(--orange-ink); border: 2px solid rgba(255,149,0,0.3); }

.panel-name {
  font-size: 1.3333rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  margin-bottom: 8px;
}

.panel-meta {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.panel-phone {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.8667rem;
  color: var(--text-secondary);
}

.panel-copy-btn {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 0.8rem;
  padding: 3px 6px;
  border-radius: var(--r-xs);
  transition: var(--transition);
}

.panel-copy-btn:hover { color: var(--accent-ink); background: rgba(216,188,122,0.1); }

.panel-body {
  flex: 1;
  overflow-y: auto;
  padding: 20px 24px 24px;
}

.panel-section {
  margin-bottom: 22px;
}

.panel-section-title {
  font-size: 0.7333rem;
  font-weight: 700;
  color: var(--accent-ink);
  text-transform: uppercase;
  letter-spacing: 0.109em;
  margin-bottom: 10px;
  display: flex;
  align-items: center;
  gap: 8px;
}

.panel-section-title::after {
  content: '';
  flex: 1;
  height: 1px;
  background: linear-gradient(90deg, rgba(216,188,122,0.3), transparent);
}

.panel-row {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  padding: 8px 0;
  border-bottom: 1px solid rgba(37, 33, 22, 0.6);
  font-size: 0.8667rem;
  gap: 10px;
}

.panel-row:last-child { border-bottom: none; }
.panel-row-label { color: var(--text-muted); flex-shrink: 0; }
.panel-row-value { color: var(--text-primary); text-align: right; font-weight: 500; }

/* Score bar */
.score-bar-wrapper { display: flex; align-items: center; gap: 10px; }

.score-bar {
  display: flex;
  gap: 3px;
}

.score-segment {
  width: 18px;
  height: 8px;
  border-radius: 2px;
  background: var(--bg-card-alt);
  transition: background 0.3s ease;
}

.score-segment.filled { background: linear-gradient(90deg, var(--blue-primary), var(--cyan)); }
.score-segment.filled.high { background: linear-gradient(90deg, var(--green), var(--cyan)); }
.score-segment.filled.low { background: linear-gradient(90deg, var(--red), var(--orange)); }

/* Dealer-score kaart bovenaan het leadpaneel (api/_leadscore.js). */
.dealer-score-card {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 4px;
}
.dealer-temp-pill {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 10px;
  border-radius: var(--r-lg);
  font-size: 0.8rem;
  font-weight: 700;
}
.temp-stip { display: inline-block; width: 8px; height: 8px; border-radius: var(--r-full); flex-shrink: 0; vertical-align: middle; background: var(--text-disabled); }
.temp-stip--hot  { background: var(--error-ink); }
.temp-stip--warm { background: var(--warning-ink); }
.dealer-temp-pill.temp-hot  { background: rgba(239,68,68,.14);  color: var(--red-ink); }
.dealer-temp-pill.temp-warm { background: rgba(var(--warning-rgb),.14); color: var(--warning-ink); }
.dealer-temp-pill.temp-cold { background: var(--bg-card-alt); color: var(--text-muted); }
.dealer-scorebar {
  height: 6px;
  border-radius: var(--r-xs);
  background: var(--bg-card-alt);
  overflow: hidden;
}
.dealer-scorebar-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--blue-primary), var(--cyan));
}
.dealer-actie-line {
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--accent-ink);
  background: rgba(var(--accent-rgb),0.1);
  border-radius: var(--r-sm);
  padding: 8px 10px;
}
.dealer-actie-label { font-weight: 500; color: var(--text-muted); }
.dealer-facts-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.score-number {
  font-variant-numeric: tabular-nums;
  font-size: 1.4667rem;
  font-weight: 700;
}

/* Notes */
.notes-textarea {
  width: 100%;
  min-height: 100px;
  padding: 12px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-primary);
  font-size: 0.8667rem;
  font-family: 'Inter', sans-serif;
  resize: vertical;
  outline: none;
  transition: var(--transition);
  margin-bottom: 10px;
}

.notes-textarea:focus { border-color: var(--blue-bright); box-shadow: 0 0 0 2px rgba(168,140,76,0.12); }

.btn-save {
  padding: 10px 20px;
  background: linear-gradient(135deg, var(--blue-primary), var(--blue-bright));
  border: none;
  border-radius: var(--r-sm);
  color: var(--on-accent);
  font-size: 0.8667rem;
  font-weight: 600;
  cursor: pointer;
  transition: var(--transition);
}

.btn-save:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(168,140,76,0.3); }

/* ── CRM feature styles ── */
.panel-inline-input {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  color: var(--text-primary);
  font-size: 0.8667rem;
  padding: 4px 10px;
  width: 100%;
  font-family: 'Inter', sans-serif;
  transition: border-color 0.15s;
}
.panel-inline-input:focus { outline: none; border-color: var(--accent); }

/* Notes */
.panel-notes-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px; }
.panel-note-item {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  position: relative;
}
.panel-note-text { font-size: 0.8667rem; color: var(--text-primary); line-height: 1.5; white-space: pre-wrap; }
.panel-note-ts { font-size: 0.6667rem; color: var(--text-muted); margin-top: 4px; }
.panel-note-delete {
  position: absolute; top: 8px; right: 8px;
  background: none; border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: var(--text-muted); font-size: 0.8rem; padding: 4px 5px;
  border-radius: var(--r-xs); transition: color 0.1s, background 0.1s;
}
.panel-note-delete:hover { color: var(--red-ink); background: rgba(var(--error-rgb),0.08); }
.panel-add-note textarea {
  width: 100%; background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary); font-family: 'Inter',sans-serif;
  font-size: 0.8667rem; padding: 8px 10px; resize: vertical; min-height: 60px;
  transition: border-color 0.15s;
}
.panel-add-note textarea:focus { outline: none; border-color: var(--accent); }
.btn-add-note {
  margin-top: 6px; background: rgba(var(--accent-rgb),0.12); border: 1px solid rgba(var(--accent-rgb),0.25);
  color: var(--accent-ink); border-radius: var(--radius-sm); padding: 6px 14px;
  font-size: 0.8rem; cursor: pointer; font-family: 'Inter',sans-serif; transition: var(--transition);
}
.btn-add-note:hover { background: rgba(var(--accent-rgb),0.2); }

/* Tasks */
.panel-tasks-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.panel-task-item {
  display: flex; align-items: center; gap: 8px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 8px 10px;
}
.panel-task-item.done { opacity: 0.55; }
.panel-task-check { width: 16px; height: 16px; cursor: pointer; accent-color: var(--accent); flex-shrink: 0; }
.panel-task-text { flex: 1; font-size: 0.8667rem; color: var(--text-primary); }
.panel-task-item.done .panel-task-text { text-decoration: line-through; color: var(--text-muted); }
.panel-task-due {
  font-size: 0.6667rem; font-weight: 600; padding: 2px 7px; border-radius: var(--r-lg);
  background: var(--bg-card); color: var(--text-muted); border: 1px solid var(--border);
  white-space: nowrap; flex-shrink: 0;
}
.panel-task-due.overdue { background: rgba(var(--error-rgb),0.1); color: var(--red-ink); border-color: rgba(var(--error-rgb),0.25); }
.panel-task-due.today { background: rgba(var(--warning-rgb),0.1); color: var(--orange-ink); border-color: rgba(var(--warning-rgb),0.25); }
.panel-task-delete {
  background: none; border: none; cursor: pointer; color: var(--text-muted);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
  font-size: 0.8rem; padding: 4px 5px; border-radius: var(--r-xs); transition: color 0.1s;
}
.panel-task-delete:hover { color: var(--red-ink); }
.panel-add-task { display: flex; gap: 6px; align-items: center; }
.panel-add-task input[type="text"] {
  flex: 1; background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary); font-family: 'Inter',sans-serif;
  font-size: 0.8667rem; padding: 7px 10px; transition: border-color 0.15s;
}
.panel-add-task input[type="text"]:focus { outline: none; border-color: var(--accent); }
.panel-add-task input[type="date"] {
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-secondary); font-family: 'Inter',sans-serif;
  font-size: 0.8rem; padding: 7px 8px; width: 130px; transition: border-color 0.15s;
}
.panel-add-task input[type="date"]:focus { outline: none; border-color: var(--accent); }
.btn-add-task {
  background: rgba(var(--accent-rgb),0.12); border: 1px solid rgba(var(--accent-rgb),0.25);
  color: var(--accent-ink); border-radius: var(--radius-sm); padding: 7px 14px;
  font-size: 0.9333rem; cursor: pointer; font-family: 'Inter',sans-serif; transition: var(--transition);
}
.btn-add-task:hover { background: rgba(var(--accent-rgb),0.22); }

/* Calls */
.panel-calls-list { display: flex; flex-direction: column; gap: 6px; margin-bottom: 10px; }
.panel-call-item {
  display: flex; align-items: flex-start; gap: 10px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 9px 12px;
}
.panel-call-icon { font-size: 0.9333rem; margin-top: 1px; flex-shrink: 0; color: var(--accent-ink); display: flex; align-items: center; }
.panel-call-body { flex: 1; min-width: 0; }
.panel-call-meta { font-size: 0.7333rem; color: var(--text-muted); margin-bottom: 2px; }
.panel-call-note { font-size: 0.8667rem; color: var(--text-primary); line-height: 1.4; }
.panel-log-call { display: flex; gap: 6px; align-items: center; }
.panel-log-call input[type="number"] {
  width: 70px; background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary); font-family: 'Inter',sans-serif;
  font-size: 0.8667rem; padding: 7px 8px; transition: border-color 0.15s;
}
.panel-log-call input[type="text"] {
  flex: 1; background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary); font-family: 'Inter',sans-serif;
  font-size: 0.8667rem; padding: 7px 10px; transition: border-color 0.15s;
}
.panel-log-call input:focus { outline: none; border-color: var(--accent); }
.btn-log-call {
  background: rgba(var(--success-rgb),0.1); border: 1px solid rgba(var(--success-rgb),0.25);
  color: var(--green-ink); border-radius: var(--radius-sm); padding: 7px 14px;
  font-size: 0.8rem; cursor: pointer; font-family: 'Inter',sans-serif;
  white-space: nowrap; transition: var(--transition);
}
.btn-log-call:hover { background: rgba(var(--success-rgb),0.2); }

/* Afspraak Resultaat */
.afspraak-result { display: flex; flex-direction: column; gap: 10px; }
.afspraak-toggle-label { font-size: 0.7333rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; }
.afspraak-toggle-row { display: flex; gap: 8px; }
.afspraak-btn {
  flex: 1; padding: 9px 12px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-card-alt);
  color: var(--text-secondary); font-size: 0.8667rem; font-weight: 600;
  cursor: pointer; font-family: 'Inter', sans-serif; transition: var(--transition);
  text-align: center;
}
.afspraak-btn:hover { border-color: var(--border-bright); color: var(--text-primary); }
.afspraak-btn.active-yes { background: rgba(var(--success-rgb),0.12); border-color: rgba(var(--success-rgb),0.4); color: var(--green-ink); }
.afspraak-btn.active-no  { background: rgba(var(--error-rgb),0.1);  border-color: rgba(var(--error-rgb),0.35); color: var(--red-ink); }
.afspraak-value-row { display: flex; flex-direction: column; gap: 4px; }
.afspraak-value-label { font-size: 0.7333rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; }
.afspraak-notitie {
  width: 100%; background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary); font-family: 'Inter', sans-serif;
  font-size: 0.8667rem; padding: 8px 10px; resize: vertical; min-height: 56px; transition: border-color 0.15s;
}
.afspraak-notitie:focus { outline: none; border-color: var(--accent); }
.afspraak-status-chip {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 0.7333rem; font-weight: 700; padding: 3px 10px; border-radius: var(--r-lg);
}
.afspraak-status-chip.yes { background: rgba(var(--success-rgb),0.12); color: var(--green-ink); border: 1px solid rgba(var(--success-rgb),0.25); }
.afspraak-status-chip.no  { background: rgba(var(--error-rgb),0.1);  color: var(--red-ink);   border: 1px solid rgba(var(--error-rgb),0.2); }

/* Taken widget */
.taken-widget { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px; margin-bottom: 16px; }
.taken-widget-header { display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.taken-widget-title { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); text-transform: uppercase; letter-spacing: 0.05em; }
.taken-widget-count { font-size: 0.7333rem; font-weight: 700; background: rgba(var(--error-rgb),0.15); color: var(--red-ink); padding: 2px 8px; border-radius: var(--r-lg); }
.taken-widget-empty { font-size: 0.8667rem; color: var(--text-muted); text-align: center; padding: 12px 0; }
.taken-item {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 12px; border-radius: var(--radius-sm);
  background: var(--bg-card-alt); border: 1px solid var(--border);
  cursor: pointer; margin-bottom: 6px; transition: border-color 0.15s;
}
.taken-item:hover { border-color: var(--accent); }
.taken-item.overdue { border-color: rgba(var(--error-rgb),0.3); background: rgba(var(--error-rgb),0.04); }
.taken-item-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--orange); flex-shrink: 0; }
.taken-item.overdue .taken-item-dot { background: var(--red); }
.taken-item-body { flex: 1; min-width: 0; }
.taken-item-text { font-size: 0.8667rem; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.taken-item-lead { font-size: 0.7333rem; color: var(--text-muted); }
.taken-item-due { font-size: 0.7333rem; font-weight: 600; color: var(--orange-ink); white-space: nowrap; flex-shrink: 0; }
.taken-item.overdue .taken-item-due { color: var(--red-ink); }

/* ── Nav badge (new-lead notification) ── */
.nav-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  border-radius: var(--r-sm);
  background: var(--red);
  color: var(--on-accent);
  font-size: 0.6667rem;
  font-weight: 700;
  padding: 0 4px;
  margin-left: auto;
}

/* ── Status select in detail panel ── */
.status-select {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-primary);
  font-size: 0.8rem;
  font-family: 'Inter', sans-serif;
  padding: 5px 10px;
  cursor: pointer;
  outline: none;
  transition: border-color .15s;
}
.status-select:focus { border-color: var(--blue-bright); }

/* ── WhatsApp conversation bubbles ── */
.chat-wrap {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 280px;
  overflow-y: auto;
  padding: 4px 0;
}
.chat-bubble {
  max-width: 85%;
  padding: 8px 12px;
  border-radius: var(--r-md);
  font-size: 0.8667rem;
  line-height: 1.5;
  word-break: break-word;
}
.chat-bubble.user {
  align-self: flex-start;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-bottom-left-radius: 3px;
  color: var(--text-primary);
}
.chat-bubble.ai {
  align-self: flex-end;
  background: rgba(138,111,46,0.18);
  border: 1px solid rgba(138,111,46,0.3);
  border-bottom-right-radius: 3px;
  color: var(--text-primary);
}
.chat-bubble.ai.manual {
  background: rgba(var(--accent-rgb),0.18);
  border-color: rgba(var(--accent-rgb),0.4);
}
.panel-score-pills {
  display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end;
  max-width: 65%;
}
.score-pill {
  font-size: 0.7333rem; font-weight: 600; padding: 3px 9px; border-radius: var(--r-full);
  white-space: nowrap;
}
.score-pill.sp-strong { background: rgba(var(--success-rgb),.14); color: var(--green-ink); border: 1px solid rgba(var(--success-rgb),.3); }
.score-pill.sp-medium { background: rgba(var(--warning-rgb),.14); color: var(--warning-ink);     border: 1px solid rgba(var(--warning-rgb),.3); }
.score-pill.sp-weak   { background: rgba(239,68,68,.14); color: var(--red-ink);   border: 1px solid rgba(239,68,68,.3); }
.score-pill.sp-neutral{ background: var(--bg-card-alt); color: var(--text-muted); border: 1px solid var(--border); }

.panel-suggest-row {
  margin-top: 10px; display: flex; flex-direction: column; gap: 8px;
}
.panel-suggest-btn {
  align-self: flex-start;
  display: inline-flex; align-items: center; gap: 6px;
  background: rgba(var(--accent-rgb),.12); border: 1px solid rgba(var(--accent-rgb),.3);
  color: var(--accent-ink); padding: 6px 12px; border-radius: var(--r-xs);
  font-size: 0.8rem; font-weight: 600; cursor: pointer;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease; font-family: inherit;
}
.panel-suggest-btn:hover { background: rgba(var(--accent-rgb),.22); }
.panel-suggest-btn:disabled { opacity: .55; cursor: wait; }
.panel-suggest-chips {
  display: flex; flex-direction: column; gap: 6px;
}
.panel-suggest-chip {
  text-align: left; cursor: pointer;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); padding: 9px 12px;
  font-size: 0.8rem; line-height: 1.5; color: var(--text-primary);
  font-family: inherit; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.panel-suggest-chip:hover {
  background: rgba(var(--accent-rgb),.08); border-color: var(--accent-bright);
  transform: translateX(2px);
}
/* ── Takeover-balk (assistent actief vs mens aan het roer) ── */
.panel-takeover-bar {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
  margin-bottom: 10px; padding: 8px 10px;
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
}
.panel-takeover-status {
  font-size: 0.7333rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.045em;
  padding: 3px 9px; border-radius: var(--r-full); white-space: nowrap;
}
.panel-takeover-status.active { background: rgba(var(--success-rgb),.14); color: var(--green-ink); border: 1px solid rgba(var(--success-rgb),.3); }
.panel-takeover-status.paused { background: rgba(var(--warning-rgb),.14); color: var(--warning-ink);    border: 1px solid rgba(var(--warning-rgb),.3); }
.panel-takeover-meta { font-size: 0.7333rem; color: var(--text-muted); }
.panel-takeover-status.afgemeld { background: rgba(var(--error-rgb),.12); color: var(--red-ink); border: 1px solid rgba(var(--error-rgb),.3); }
.panel-afgemeld { margin-bottom: 0; }
.conv-stop-badge { display: inline-block; margin-left: 6px; padding: 1px 6px; border-radius: var(--r-full); font-size: 0.6667rem; font-weight: 700; letter-spacing: 0.05em; background: rgba(var(--error-rgb),.12); color: var(--red-ink); border: 1px solid rgba(var(--error-rgb),.3); vertical-align: middle; }
.panel-takeover-escalated {
  font-size: 0.7333rem; font-weight: 600; color: var(--red-ink);
  background: rgba(239,68,68,.12); border: 1px solid rgba(239,68,68,.3);
  padding: 3px 9px; border-radius: var(--r-full); cursor: help;
}
.panel-takeover-btn {
  margin-left: auto; border: none; border-radius: var(--r-xs); padding: 6px 12px;
  font-size: 0.8rem; font-weight: 600; cursor: pointer; font-family: inherit;
  transition: opacity .15s ease;
}
.panel-takeover-btn.pause  { background: rgba(var(--warning-rgb),.16); color: var(--warning-ink); border: 1px solid rgba(var(--warning-rgb),.35); }
.panel-takeover-btn.resume { background: rgba(var(--success-rgb),.16);  color: var(--green-ink); border: 1px solid rgba(var(--success-rgb),.35); }
.panel-takeover-btn:hover { opacity: .85; }
.conv-wis-btn {
  display: inline-flex; align-items: center; gap: 6px; margin-left: 10px;
  padding: 5px 10px; border-radius: var(--r-xs); font-size: 0.7333rem; font-weight: 600; font-family: inherit;
  background: transparent; color: var(--text-muted); border: 1px solid var(--border); cursor: pointer;
  transition: color .15s ease, border-color .15s ease, background-color .15s ease;
}
.conv-wis-btn:hover { color: var(--red-ink); border-color: rgba(var(--error-rgb),.35); background: rgba(var(--error-rgb),.08); }
.panel-takeover-btn:disabled { opacity: .5; cursor: wait; }

.panel-reply-row {
  display: flex; gap: 8px; margin-top: 10px; align-items: flex-end;
}
.panel-reply-row-paused .panel-reply-input {
  border-color: rgba(var(--warning-rgb),.5); box-shadow: 0 0 0 1px rgba(var(--warning-rgb),.15);
}
.panel-reply-input {
  flex: 1; padding: 10px 12px; background: var(--bg-card-alt);
  border: 1px solid var(--border); border-radius: var(--r-sm);
  color: var(--text-primary); font-size: 0.8667rem; font-family: inherit;
  resize: vertical; min-height: 44px; max-height: 160px; outline: none;
}
.panel-reply-input:focus { border-color: var(--accent-bright); }
.panel-reply-send {
  background: var(--success);
  border: none; border-radius: var(--r-sm); padding: 10px 16px;
  color: var(--on-accent); font-size: 0.8667rem; font-weight: 600; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0;
  transition: opacity 0.15s ease;
}
.panel-reply-send:hover { opacity: 0.9; }
.panel-reply-send:disabled { opacity: 0.5; cursor: not-allowed; }
.chat-label {
  font-size: 0.6667rem;
  color: var(--text-muted);
  margin-bottom: 2px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

/* ── Chart container ── */
.charts-row {
  display: flex;
  gap: 16px;
  margin-bottom: 20px;
  align-items: flex-start;
}
.chart-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px 24px;
  flex: 1;
  min-width: 0;
}
.chart-card-sm {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px 24px;
  width: 260px;
  flex-shrink: 0;
}
/* Every chart in the app runs with maintainAspectRatio:false and lives in one
   of these. Without a bounded parent Chart.js keeps growing the canvas to fill
   the available space and the bars run off the page; with maintainAspectRatio
   left on, a wide card produced an absurdly tall chart instead. A fixed-height
   parent is the documented requirement for that option, and it also decouples
   chart height from card width. flex:none so a flex-column card can't shrink it. */
.chart-canvas-wrap { position: relative; height: 220px; margin-top: 14px; flex: 0 0 auto; }
.chart-canvas-wrap--sm { height: 180px; }
.chart-canvas-wrap--xs { height: 150px; }
.chart-canvas-wrap > canvas { position: absolute; inset: 0; width: 100% !important; height: 100% !important; }
@media (max-width: 768px) {
  .chart-canvas-wrap { height: 180px; }
  .chart-canvas-wrap--sm { height: 160px; }
  .chart-canvas-wrap--xs { height: 140px; }
}

.chart-title {
  font-variant-numeric: tabular-nums;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.125em;
  text-transform: uppercase;
  margin-bottom: 16px;
}

/* ── Actie Nodig widget (waFailed + escalated) ── */
.nb-widget {
  background: var(--bg-card);
  border: 1px solid rgba(var(--error-rgb),0.35);
  border-radius: var(--r-md);
  padding: 16px 20px;
  margin-bottom: 16px;
}
.nb-header {
  display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;
}
.nb-title {
  display: flex; align-items: center; gap: 7px;
  font-size: 0.7333rem; font-weight: 700; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--red-ink);
}
.nb-count {
  background: rgba(var(--error-rgb),0.15); color: var(--red-ink);
  font-size: 0.7333rem; font-weight: 700; padding: 2px 8px;
  border-radius: var(--r-lg); border: 1px solid rgba(var(--error-rgb),0.3);
}
.nb-list { display: flex; flex-direction: column; gap: 8px; }
.nb-item {
  display: flex; align-items: center; gap: 10px;
  background: var(--bg-card-alt); border-radius: var(--r-sm);
  padding: 10px 12px; cursor: pointer; transition: background .15s;
}
.nb-item:hover { background: var(--bg-card-hover, rgba(255,255,255,.04)); }
.nb-item-info { flex: 1; min-width: 0; }
.nb-item-name { font-size: 0.8667rem; font-weight: 600; color: var(--text-primary); }
.nb-item-sub  { font-size: 0.7333rem; color: var(--text-muted); margin-top: 2px; }
.nb-item-tag {
  font-size: 0.6667rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em;
  padding: 2px 7px; border-radius: var(--r-full); white-space: nowrap; margin-right: 2px;
}
.nb-item-tag.tag-waFailed   { background: rgba(var(--error-rgb),.14);  color: var(--red-ink); border: 1px solid rgba(var(--error-rgb),.3); }
.nb-item-tag.tag-escalated { background: rgba(var(--warning-rgb),.14); color: var(--orange-ink); border: 1px solid rgba(var(--warning-rgb),.3); }
.nb-call-btn {
  display: flex; align-items: center; gap: 5px; padding: 6px 12px;
  background: rgba(var(--error-rgb),0.1); border: 1px solid rgba(var(--error-rgb),0.3);
  border-radius: var(--r-sm); color: var(--red-ink); font-size: 0.8rem; font-weight: 600;
  text-decoration: none; white-space: nowrap; transition: background 0.15s;
}
.nb-call-btn:hover { background: rgba(var(--error-rgb),0.2); }

.followup-widget {
  background: var(--bg-card);
  border: 1px solid rgba(var(--warning-rgb),0.35);
  border-radius: var(--r-md);
  padding: 16px 20px;
  margin-bottom: 16px;
}
.followup-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 12px;
}
.followup-title {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.7333rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orange-ink);
}
.followup-count {
  background: rgba(var(--warning-rgb),0.15);
  color: var(--orange-ink);
  font-size: 0.7333rem;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: var(--r-lg);
  border: 1px solid rgba(var(--warning-rgb),0.3);
}
.followup-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.followup-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 14px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: border-color 0.15s;
}
.followup-item:hover { border-color: var(--orange); }
.followup-item-name { font-size: 0.8667rem; font-weight: 600; color: var(--text); flex: 1; }

/* Dealer-overzicht: "wat vraagt vandaag aandacht" (api/_dealer-overzicht.js). */
.dealer-overzicht { margin-bottom: 16px; }
.dealer-aandacht-strip {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 10px;
  margin-bottom: 16px;
}
.dealer-aandacht-tile {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 12px 14px;
  cursor: pointer;
  transition: border-color 0.15s;
}
.dealer-aandacht-tile:hover { border-color: var(--accent); }
.dealer-aandacht-tile-value {
  font-size: 1.4667rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  color: var(--text-primary);
}
.dealer-aandacht-tile-label {
  font-size: 0.7333rem;
  color: var(--text-muted);
  margin-top: 2px;
}
.dealer-overzicht-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 14px;
  margin-bottom: 16px;
}
/* Op een breed scherm krijgt de prioriteitslijst dubbele breedte: dat is de
   lijst waar de verkoper zijn dag mee begint, de andere drie zijn tellers. */
@media (min-width: 1100px) {
  .dealer-overzicht-grid { grid-template-columns: 2fr 1fr 1fr 1fr; }
}
.dealer-prio-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
}
.dealer-prio-row:last-child { border-bottom: none; }
.dealer-prio-row:hover .dealer-prio-naam { color: var(--accent-ink); }
.dealer-prio-rang { font-size: 0.7333rem; font-weight: 700; color: var(--text-muted); min-width: 16px; text-align: right; font-variant-numeric: tabular-nums; }
.dealer-prio-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.dealer-prio-naam { font-size: 0.8667rem; font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dealer-prio-sub { font-size: 0.7333rem; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dealer-temp-pill {
  flex-shrink: 0;
  font-size: 0.7333rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  padding: 3px 8px;
  border-radius: var(--r-full);
  border: 1px solid var(--border);
  background: var(--bg-card-alt);
  color: var(--text-primary);
}
.dealer-temp-hot  { border-color: rgba(var(--error-rgb),0.35); color: var(--error-ink); }
.dealer-temp-warm { border-color: rgba(var(--warning-rgb),0.35); color: var(--orange-ink); }
.dealer-overzicht-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 14px 16px;
}
.dealer-overzicht-card-title {
  font-size: 0.7333rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 10px;
}
.dealer-overzicht-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  border-bottom: 1px solid var(--border);
  font-size: 0.8rem;
}
.dealer-overzicht-row:last-child { border-bottom: none; }
.dealer-overzicht-row-naam { font-weight: 600; color: var(--text); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dealer-overzicht-leeg { font-size: 0.8rem; color: var(--text-muted); padding: 6px 0; }
.dealer-funnel-row {
  display: flex;
  gap: 6px;
  align-items: flex-end;
}
.dealer-funnel-step {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
}
/* De balk staat in een spoor met VASTE hoogte: een procentuele hoogte op een
   kolom zonder eigen hoogte lost op naar niets, en dan is elke balk twee
   pixels -- zo zag de trechter er eerst uit. */
.dealer-funnel-track {
  width: 100%;
  height: 64px;
  display: flex;
  align-items: flex-end;
  background: var(--bg-card-alt);
  border-radius: var(--r-xs);
}
.dealer-funnel-bar {
  width: 100%;
  background: var(--accent);
  border-radius: var(--r-xs);
  min-height: 2px;
}
.dealer-funnel-label { font-size: 0.6rem; color: var(--text-muted); text-align: center; }
.dealer-funnel-count { font-size: 0.7333rem; font-weight: 700; color: var(--text-primary); }
.followup-item-meta { font-size: 0.7333rem; color: var(--text-muted); }
.followup-item-score { font-size: 0.8rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--orange-ink); }
.followup-call-btn {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 5px 10px;
  border-radius: var(--r-xs);
  background: rgba(var(--warning-rgb),0.12);
  border: 1px solid rgba(var(--warning-rgb),0.3);
  color: var(--orange-ink);
  font-size: 0.7333rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s;
}
.followup-call-btn:hover { background: rgba(var(--warning-rgb),0.22); }

/* ── Top Leads Strip ── */
.top-leads-strip {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 16px 20px;
  margin-bottom: 16px;
}
.top-leads-strip-title {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 0.7333rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 12px;
}
.top-leads-strip-title svg { color: var(--orange-ink); }
.top-leads-list {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}
.top-lead-chip {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: border-color 0.15s;
  font-size: 0.8667rem;
}
.top-lead-chip:hover { border-color: var(--accent); }
.top-lead-chip-avatar {
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--accent);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.6667rem; font-weight: 700; color: var(--on-accent);
}
.top-lead-chip-name { font-weight: 600; color: var(--text); }
.top-lead-chip-score { font-weight: 700; color: var(--accent-ink); font-variant-numeric: tabular-nums; font-size: 0.8rem; }

/* ── Today widget ── */
.today-widget {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 16px 20px;
  margin-bottom: 20px;
}
.today-widget-title {
  font-variant-numeric: tabular-nums;
  font-size: 0.7333rem;
  font-weight: 600;
  color: var(--text-muted);
  letter-spacing: 0.136em;
  text-transform: uppercase;
  margin-bottom: 12px;
}
.today-apt {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px 0;
  border-bottom: 1px solid var(--border);
}
.today-apt:last-child { border-bottom: none; }
.today-apt-time {
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--accent-ink);
  min-width: 48px;
  flex-shrink: 0;
}
.today-apt-name {
  font-size: 0.8667rem;
  color: var(--text-primary);
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.today-apt-type {
  font-size: 0.7333rem;
  color: var(--text-secondary);
  flex-shrink: 0;
}
.today-empty {
  font-size: 0.8667rem;
  color: var(--text-muted);
  padding: 4px 0;
}

/* ── Nav badge ── */
.nav-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--blue-primary);
  color: var(--on-accent);
  font-size: 0.6667rem;
  font-weight: 700;
  margin-left: auto;
  flex-shrink: 0;
}

/* ── Calendar weekend columns ── */
.cal-day-col.cal-weekend-col { background: rgba(0,0,0,0.06); }
[data-theme="light"] .cal-day-col.cal-weekend-col { background: rgba(0,0,0,0.03); }

/* ── Calendar event modal ── */
.cal-modal-overlay {
  display: none;
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.55);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  z-index: 2000;
  align-items: center;
  justify-content: center;
}
.cal-modal-overlay.open { display: flex; }
.cal-modal {
  background: var(--bg-card);
  border: 1px solid var(--border-bright);
  border-radius: var(--r-lg);
  width: 100%;
  max-width: 420px;
  box-shadow: var(--elev-3);
  overflow: hidden;
  animation: modal-in 0.2s cubic-bezier(0.4,0,0.2,1);
  /* Dezelfde bouw als #koop-modal, #pd-modal en #cal-book-modal: een kap op
     90vh, een kop die blijft staan en een body die scrollt.

     Deze had het als enige niet. Zodra de afspraakkaart lang wordt -- notities,
     een lang adres, het annuleerpaneel opengeklapt -- steekt hij boven het
     venster uit, en de overlay eromheen centreert met align-items: center.
     Wat er dan boven de bovenrand zit is ONBEREIKBAAR: er is geen negatieve
     scrollpositie. Gemeten op een venster van 620px met een lange kaart:
     737px boven de rand, en geen scrollbak om erbij te komen. */
  max-height: 90vh;
  display: flex;
  flex-direction: column;
}
@keyframes modal-in {
  from { opacity: 0; transform: scale(0.95) translateY(10px); }
  to   { opacity: 1; transform: scale(1) translateY(0); }
}
.cal-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 18px 20px 14px;
  border-bottom: 1px solid var(--border);
  /* Blijft staan terwijl de body eronder scrollt -- anders scrollt de titel
     weg en weet je halverwege niet meer welke afspraak je openhebt. */
  flex-shrink: 0;
}
.cal-modal-header-title {
  font-size: 0.9333rem;
  font-weight: 700;
  color: var(--text-primary);
}
.cal-modal-close {
  background: none;
  border: none;
  color: var(--text-muted);
  cursor: pointer;
  font-size: 1.2rem;
  line-height: 1;
  padding: 2px 6px;
  border-radius: var(--r-xs);
  transition: var(--transition);
}
.cal-modal-close:hover { background: rgba(255,255,255,0.08); color: var(--text-primary); }
.cal-modal-body {
  padding: 16px 20px 20px;
  /* De scrollbak van de kaart hierboven. Zonder dit blijft de kap op 90vh
     staan en wordt de rest simpelweg afgeknipt. */
  overflow-y: auto;
  flex: 1 1 0%;
}
.cal-modal-row {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 7px 0;
  font-size: 0.8667rem;
  color: var(--text-secondary);
  border-bottom: 1px solid var(--border);
}
.cal-modal-row:last-of-type { border-bottom: none; }
.cal-modal-row-label {
  font-size: 0.7333rem;
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.055em;
  min-width: 64px;
  padding-top: 1px;
}
.cal-modal-row-val { color: var(--text-primary); flex: 1; }
.cal-modal-actions {
  display: flex;
  gap: 8px;
  margin-top: 16px;
  flex-wrap: wrap;
}
.cal-modal-btn {
  padding: 8px 16px;
  border-radius: var(--r-sm);
  font-size: 0.8rem;
  font-weight: 600;
  cursor: pointer;
  border: none;
  transition: var(--transition);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.cal-modal-btn-primary {
  background: var(--blue-primary);
  color: var(--on-accent);
}
.cal-modal-btn-primary:hover { background: var(--blue-bright); }
.cal-modal-btn-secondary {
  background: rgba(255,255,255,0.06);
  color: var(--text-secondary);
  border: 1px solid var(--border-bright);
}
.cal-modal-btn-secondary:hover { background: rgba(255,255,255,0.1); color: var(--text-primary); }
.cal-modal-btn-danger {
  background: rgba(var(--error-rgb),0.1);
  color: var(--red-ink);
  border: 1px solid rgba(var(--error-rgb),0.25);
}
.cal-modal-btn-danger:hover { background: rgba(var(--error-rgb),0.2); }

/* ── Admin client cards ── */
.admin-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 16px;
}
.admin-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px;
  cursor: pointer;
  transition: border-color .2s, transform .15s;
}
.admin-card:hover { border-color: var(--blue-primary); transform: translateY(-2px); }
.admin-card-name { font-weight: 700; font-size: 1rem; margin-bottom: 4px; }
.admin-card-code { font-size: 0.7333rem; color: var(--text-muted); letter-spacing: 0.091em; margin-bottom: 14px; }
.admin-card-stats { display: flex; gap: 16px; }
.admin-stat { text-align: center; }
.admin-stat-val { font-size: 1.4667rem; font-weight: 700; color: var(--accent-ink); }
.admin-stat-lbl { font-size: 0.6667rem; color: var(--text-muted); margin-top: 2px; }

.check-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 0;
  font-size: 0.8667rem;
  color: var(--text-secondary);
}

.check-yes { color: var(--green-ink); }
.check-no { color: var(--red-ink); }

.ai-summary {
  font-size: 0.8667rem;
  color: var(--text-secondary);
  line-height: 1.6;
  padding: 12px;
  background: rgba(var(--accent-rgb), 0.06);
  border-left: 1px solid var(--border-c);
  border-radius: 0 8px 8px 0;
}

/* ============================================================
   TOAST NOTIFICATIONS
   ============================================================ */
.toast-container {
  position: fixed;
  /* Lifted clear of the help launcher, which now owns the bottom-right
     corner (24px + 54px button + 12px gap). Toasts stack upward from
     here, so the two never overlap. */
  bottom: 90px;
  right: 24px;
  /* Boven ALLE vensters. Stond op 9999, terwijl de overlays in dit bestand op
     10000, 10050 en 11000 zitten. Gevolg: wie in een venster opslaat, krijgt
     zijn bevestiging achter datzelfde venster te zien -- dus niet.

     Een melding hoort per definitie bovenaan: hij is kort, hij dekt niets af
     (pointer-events staat uit) en hij is het antwoord op iets dat de gebruiker
     zojuist deed. 12000 laat ruimte onder zich voor een toekomstig venster. */
  z-index: 12000;
  display: flex;
  flex-direction: column;
  gap: 10px;
  pointer-events: none;
}
@media (max-width: 520px) {
  /* Op een telefoon onderaan landde een melding precies op de Faro-balk en de
     hulpknop. Bovenaan, net onder de topbalk, dekt hij niets af wat je nodig
     hebt en zie je hem waar je al kijkt. */
  .toast-container { top: calc(env(safe-area-inset-top, 0px) + 64px); bottom: auto; right: 16px; left: 16px; }
}

.toast {
  background: var(--card-elevated);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 14px 16px;
  min-width: 280px;
  max-width: 360px;
  box-shadow: var(--elev-2);
  pointer-events: all;
  position: relative;
  overflow: hidden;
  animation: toastIn 0.35s var(--ease-out) both;
}

.toast.dismissing { animation: toastOut 0.3s ease forwards; }

@keyframes toastIn {
  from { opacity: 0; transform: translateX(100%) scale(0.9); }
  to { opacity: 1; transform: translateX(0) scale(1); }
}

@keyframes toastOut {
  from { opacity: 1; transform: translateX(0) scale(1); max-height: 200px; }
  to { opacity: 0; transform: translateX(100%) scale(0.9); max-height: 0; padding: 0; margin: 0; }
}


.toast-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 4px;
}

.toast-title {
  font-size: 0.8667rem;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: 6px;
}

.toast-success .toast-title { color: var(--green-ink); }
.toast-error .toast-title { color: var(--red-ink); }
.toast-info .toast-title { color: var(--accent-ink); }

.toast-close {
  background: none;
  border: none;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 0.9333rem;
  /* Was 16x19 met padding:2px. Een kruisje om een melding weg te klikken is
     precies iets wat je haastig aantikt; 24x24 is het minimum waarop dat
     betrouwbaar lukt. Het kruisje zelf blijft even groot. */
  padding: 0;
  min-width: 24px;
  min-height: 24px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: color 0.2s;
  line-height: 1;
}

.toast-close:hover { color: var(--text-primary); }

.toast-message { font-size: 0.8667rem; color: var(--text-secondary); }

.toast-progress {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 2px;
  border-radius: 0 0 12px 12px;
  animation: toastProgress 3.5s linear forwards;
}

.toast-success .toast-progress { background: var(--green); }
.toast-error .toast-progress { background: var(--red); }
.toast-info .toast-progress { background: var(--blue-bright); }

@keyframes toastProgress {
  from { width: 100%; }
  to { width: 0%; }
}

/* ============================================================
   EXPORTS PAGE
   ============================================================ */
.exports-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

.export-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 28px;
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out),
              border-color var(--dur-base) var(--ease-out);
}

.export-card:hover {
  border-color: var(--border-bright);
  transform: translateY(-2px);
  box-shadow: var(--elev-1);
}

.export-filter-bar {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 14px 20px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  margin-bottom: 20px;
  flex-wrap: wrap;
}
.export-filter-group {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.export-filter-label {
  font-size: 0.6667rem;
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.export-select {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text);
  font-size: 0.8667rem;
  padding: 7px 28px 7px 10px;
  cursor: pointer;
  outline: none;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23999999' stroke-width='2.5'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 8px center;
}
.export-select:focus { border-color: var(--accent); }
.export-preview-count {
  margin-left: auto;
  font-size: 0.8667rem;
  color: var(--text-muted);
  background: var(--bg-card-alt);
  padding: 8px 14px;
  border-radius: var(--r-sm);
  border: 1px solid var(--border);
}
.export-preview-count #export-count-num {
  font-weight: 700;
  color: var(--accent-ink);
}
/* "Featured" used to mean flood-filling the whole card with sand, heavy,
   and the accent-coloured title (.gradient-text) went unreadable against
   an accent-coloured card (same colour on itself). Sand should mark this
   card as primary without becoming its surface: a solid border plus a
   solid-fill icon (icons are an explicitly allowed sand use) does that
   while keeping the card on the same quiet surface as its siblings. */
.export-card-featured {
  border: 1.5px solid var(--accent) !important;
  background: var(--bg-card) !important;
}
.export-card-icon {
  width: 44px;
  height: 44px;
  border-radius: var(--r-md);
  background: rgba(var(--accent-rgb),0.12);
  border: 1px solid rgba(var(--accent-rgb),0.2);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 12px;
  color: var(--accent-ink);
}
.export-card-featured .export-card-icon {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--on-accent);
}
.export-includes {
  display: flex;
  flex-direction: column;
  gap: 7px;
  margin: 14px 0 18px;
}
.export-include-item {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.8rem;
  color: var(--text-muted);
}
.export-include-item svg { color: var(--green-ink); flex-shrink: 0; }
.export-card { display: flex; flex-direction: column; }
.export-snapshot {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 16px;
}
.export-snap-item {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 12px;
  text-align: center;
}
.export-snap-val {
  font-size: 1.4667rem;
  font-weight: 700;
  color: var(--accent-ink);
  font-variant-numeric: tabular-nums;
  line-height: 1;
  margin-bottom: 4px;
}
.export-snap-label {
  font-size: 0.6667rem;
  color: var(--text-muted);
  font-weight: 500;
}
.export-card-stats {
  grid-column: span 1;
}
.export-card-title {
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  margin-bottom: 8px;
}

.export-card-desc {
  font-size: 0.8667rem;
  color: var(--text-secondary);
  margin-bottom: 20px;
  line-height: 1.5;
}

.rapport-stats {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 12px;
  margin-bottom: 20px;
}

.rapport-stat {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 14px;
}

.rapport-stat-value {
  font-variant-numeric: tabular-nums;
  font-size: 1.4667rem;
  font-weight: 700;
  color: var(--accent-ink);
  margin-bottom: 4px;
}

.rapport-stat-label {
  font-size: 0.7333rem;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.064em;
}

.rapport-leads-list { margin-top: 16px; }

.rapport-lead-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 0;
  border-bottom: 1px solid var(--border);
  font-size: 0.8667rem;
}

.rapport-lead-item:last-child { border-bottom: none; }

/* ============================================================
   PIPELINE (KANBAN)
   ============================================================ */
    .pipeline-header-bar {
      padding: 0 24px 16px;
      display: flex;
      align-items: center;
      gap: 12px;
    }
    .pipeline-summary-chips {
      display: flex;
      gap: 10px;
      flex-wrap: wrap;
    }
    .pipeline-chip {
      display: flex;
      align-items: center;
      gap: 6px;
      padding: 6px 14px;
      border-radius: var(--r-lg);
      font-size: 0.8rem;
      font-weight: 600;
      background: var(--bg-card);
      border: 1px solid var(--border);
      color: var(--text-muted);
    }
    .pipeline-chip-count {
      font-variant-numeric: tabular-nums;
      font-size: 0.8667rem;
      font-weight: 700;
      color: var(--accent-ink);
    }
.pipe-filters {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.pipe-filter-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 6px 12px;
  border-radius: var(--r-lg);
  font-size: 0.8rem;
  font-weight: 600;
  background: var(--bg-card);
  border: 1px solid var(--border);
  color: var(--text-muted);
  cursor: pointer;
}
.pipe-filter-chip.actief {
  background: rgba(var(--accent-rgb),0.12);
  border-color: var(--accent);
  color: var(--accent-ink);
}
.pipeline-board {
  display: flex;
  gap: 16px;
  overflow-x: auto;
  padding-bottom: 16px;
  min-height: calc(100vh - 180px);
  align-items: flex-start;
}
/* Een leeg bord: de melding over de hele breedte, in het midden, niet in de linkerhoek. */
.pipeline-board > .empty-state { flex: 1 1 100%; min-width: 0; padding-top: 48px; }
.pipeline-board::-webkit-scrollbar { height: 6px; }
.pipeline-board::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb),0.35); border-radius: var(--r-xs); }
.pipeline-col {
  flex: 1 1 210px;
  min-width: 210px;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.pipeline-col-header {
  padding: 14px 16px 12px;
  border-bottom: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-shrink: 0;
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.067em;
  color: var(--text-muted);
}
.pipeline-col-count {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  border-radius: var(--r-sm);
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  font-size: 0.7333rem;
  font-weight: 700;
  color: var(--text-secondary);
  padding: 0 5px;
}
.pipeline-col-body {
  flex: 1;
  padding: 10px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  overflow-y: auto;
  min-height: 80px;
}
.pipeline-card {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  padding: 12px 14px;
  cursor: pointer;
  transition: border-color 0.15s, transform 0.15s;
}
/* Slepen met de wijzer: de kaart zelf beweegt (geen spookbeeld), boven de
   rest, en laat pointer-events los zodat de kolom eronder gevonden wordt. */
.pipeline-card { touch-action: pan-x pan-y; user-select: none; cursor: grab; }
.pipeline-card.is-dragging { position: relative; z-index: 30; pointer-events: none; cursor: grabbing; opacity: 0.96; }
.pipeline-card.is-dragging * { pointer-events: none; }

.pipeline-card:hover {
  border-color: var(--blue-primary);
  transform: translateY(-1px);
}
    .pipeline-card[draggable="true"] { cursor: grab; }
    .pipeline-card[draggable="true"]:active { cursor: grabbing; opacity: 0.7; }
    .pipeline-col.drag-over {
      background: rgba(var(--accent-rgb),0.08);
      border-color: rgba(var(--accent-rgb),0.4) !important;
      outline: 2px dashed rgba(var(--accent-rgb),0.4);
      outline-offset: -4px;
    }
.pipeline-card-name {
  font-size: 0.8667rem;
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: 6px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.pipeline-card-meta {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
}
.pipeline-score {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 24px;
  height: 20px;
  border-radius: var(--r-xs);
  font-size: 0.7333rem;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.pipe-temp-pill {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-size: 0.6667rem;
  font-weight: 700;
}
.pipe-vehicle-chip {
  font-size: 0.6667rem;
  font-weight: 600;
  color: var(--text-muted);
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-xs);
  padding: 1px 6px;
}
.pipeline-card-phone {
  font-size: 0.7333rem;
  color: var(--text-muted);
  margin-top: 5px;
}
.pipeline-card-date {
  font-size: 0.6667rem;
  color: var(--text-muted);
  margin-left: auto;
}
.pipeline-col-header.col-new    { border-top: 2px solid #989287; }
.pipeline-col-header.col-qual   { border-top: 2px solid var(--cyan); }
.pipeline-col-header.col-apt    { border-top: 2px solid var(--green); }
.pipeline-col-header.col-won    { border-top: 2px solid var(--accent); }
.pipeline-col-header.col-lost   { border-top: 2px solid var(--red); }

/* ============================================================
   GESPREKKEN (CONVERSATIONS)
   ============================================================ */
.conv-layout {
  display: flex;
  gap: 0;
  height: calc(100vh - 130px);
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  overflow: hidden;
}
.conv-list {
  width: 300px;
  flex-shrink: 0;
  border-right: 1px solid var(--border);
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

/* Zonder gesprekken stonden er TWEE lege toestanden naast elkaar: links "Nog
   geen gesprekken" met de uitleg en de knoppen, in een kolom van 300px, en
   rechts 913px die vroeg om een gesprek te selecteren dat niet bestaat. De
   nuttige helft kreeg de smalle kant.
   Met deze klasse verdwijnt de rechterhelft en krijgt de lege toestand de hele
   kaart -- één boodschap, op de plek waar je kijkt. */
.conv-layout.leeg .conv-list {
  width: 100%;
  border-right: none;
  justify-content: center;
}
.conv-layout.leeg .conv-list-header { display: none; }
.conv-layout.leeg .conv-detail { display: none; }
.conv-list-header {
  padding: 14px 16px;
  border-bottom: 1px solid var(--border);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.067em;
  color: var(--text-muted);
  flex-shrink: 0;
}
.conv-list-item {
  padding: 14px 16px;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
  transition: background 0.12s;
}
.conv-list-item:hover { background: var(--card-elevated); }   /* één toonstap omhoog, in beide thema's */
.conv-list-item.active { background: var(--card-elevated); }
.conv-list-item.active .conv-list-item-name { color: var(--accent-ink); }
.conv-list-item-name {
  display: flex;
  justify-content: space-between;
  font-size: 0.8667rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 4px;
}
.conv-list-item-date { font-size: 0.7333rem; color: var(--text-muted); font-weight: 400; }
.conv-list-item-preview { font-size: 0.8rem; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.conv-detail {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.conv-bubble {
  padding: 10px 14px;
  border-radius: var(--r-md);
  font-size: 0.8667rem;
  line-height: 1.55;
  max-width: 80%;
  word-break: break-word;
  margin-bottom: 4px;
}
.conv-bubble.user {
  background: var(--accent);
  color: var(--on-accent);
  margin-left: auto;
  border-bottom-right-radius: 4px;
}
.conv-bubble.assistant {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  color: var(--text);
  border-bottom-left-radius: 4px;
}
.conv-bubble-label {
  font-size: 0.6667rem;
  font-weight: 600;
  color: var(--text-muted);
  margin-bottom: 3px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
/* Faro's beoordeling boven het gesprek. Bewust rustig: een rand, een kleine
   kop en een raster. Geen gloed, geen gradient, geen grote mascotte -- dit is
   het paneel waar iemand in twee seconden wil zien of hij moet bellen. */
.faro-lead {
  padding: 14px 18px;
  border-bottom: 1px solid var(--border, #2A3444);
  background: var(--bg-subtle, rgba(255,255,255,.02));
}
.faro-lead__kop {
  display: flex; align-items: center; gap: 8px;
  font-size: 0.8rem; font-weight: 600; letter-spacing: .02em;
  color: var(--text-muted, #999); text-transform: uppercase;
  margin-bottom: 8px;
}
.faro-lead__kop img { flex-shrink: 0; object-fit: contain; }
.faro-lead__reden { margin: 0 0 10px; font-size: 0.9333rem; line-height: 1.55; color: var(--text, #E9EEF6); }
.faro-lead__punten { display: flex; flex-wrap: wrap; gap: 6px 20px; margin-bottom: 10px; }
.faro-lead__punt { display: flex; flex-direction: column; gap: 1px; min-width: 96px; }
.faro-lead__label { font-size: 0.7333rem; color: var(--text-muted, #999); }
.faro-lead__waarde { font-size: 0.8667rem; color: var(--text, #E9EEF6); font-weight: 500; }
.faro-lead__samenvatting { margin: 0 0 10px; font-size: 0.8rem; line-height: 1.55; color: var(--text-muted, #999); }
.faro-lead__deedkop { font-size: 0.7333rem; color: var(--text-muted, #999); margin-bottom: 3px; }
.faro-lead__deed ul { margin: 0; padding-left: 16px; }
.faro-lead__deed li { font-size: 0.8rem; line-height: 1.7; color: var(--text-muted, #999); }
.faro-lead__leeg { margin: 0; font-size: 0.8667rem; line-height: 1.55; color: var(--text-muted, #999); }
/* Op smal beeld heeft het gesprek voorrang; het paneel mag dan krimpen. */
@media (max-width: 640px) {
  .faro-lead { padding: 11px 14px; }
  .faro-lead__punten { gap: 5px 14px; }
}

/* Een kaart zonder meting. Kleiner en grijs, zodat hij niet leest als een
   getal van nul. */
.stat-value--leeg {
  font-size: 1rem;
  font-weight: 500;
  color: var(--text-muted, #999);
  letter-spacing: 0;
}

.conv-messages {
  flex: 1;
  overflow-y: auto;
  padding: 20px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
/* Het antwoordvak onder het gesprek. Blijft staan terwijl de berichten
   erboven scrollen, en houdt ruimte vrij van de Faro-balk onderaan. */
.conv-composer {
  flex-shrink: 0;
  border-top: 1px solid var(--border);
  padding: 12px 16px 14px;
  background: var(--bg-card);
}
.conv-composer .panel-takeover-bar { margin-bottom: 10px; }
.conv-header {
  padding: 18px 20px;
  border-bottom: 1px solid var(--border);
  font-size: 1rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  gap: 10px;
  background: var(--bg-card);
}
.conv-empty {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  gap: 10px;
  color: var(--text-muted);
  font-size: 0.9333rem;
}
.conv-empty-icon { opacity: 0.3; display: flex; align-items: center; justify-content: center; color: var(--text-muted); }

/* ============================================================
   ANALYSE (ANALYTICS)
   ============================================================ */
.analyse-grid {
  display: grid;
  /* minmax(0,1fr), niet 1fr. Een 1fr-track heeft impliciet min-width:auto en
     kan dus NIET kleiner worden dan zijn breedste kind, één tabel of één lang
     woord duwt de kolom breder dan de pagina. Gemeten op 390px: de track kwam
     uit op 457,7px in een container van 358px, en omdat .page-content
     overflow-x:hidden heeft werd dat niet afgekapt met een scrollbalk maar
     gewoon onzichtbaar afgesneden. */
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 16px;
  width: 100%;
  overflow: visible;
}
.analyse-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 22px 24px;
}
.analyse-card-full  { grid-column: 1 / -1; }
.analyse-card-span2 { grid-column: span 2; }
.analyse-card-title {
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.083em;
  color: var(--text-muted);
  margin-bottom: 18px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.funnel-step {
  margin-bottom: 12px;
}
.funnel-step-label {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.8667rem;
  color: var(--text-secondary);
  margin-bottom: 4px;
}
.funnel-step-label strong { color: var(--text-primary); font-weight: 700; }
.funnel-step-pct {
  font-size: 0.7333rem;
  color: var(--text-muted);
}
.funnel-bar {
  height: 10px;
  background: var(--bg-card-alt);
  border-radius: var(--r-xs);
  overflow: hidden;
}
.funnel-bar-fill {
  height: 100%;
  border-radius: var(--r-xs);
  background: linear-gradient(90deg, var(--blue-primary), var(--cyan));
  transition: width 0.8s cubic-bezier(0.4,0,0.2,1);
}
.source-table { width: 100%; border-collapse: collapse; }
.source-table th {
  font-size: 0.6667rem;
  font-weight: 700;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  padding: 6px 10px 10px;
  border-bottom: 1px solid var(--border);
  text-align: left;
}
.source-table td {
  font-size: 0.8667rem;
  color: var(--text-primary);
  padding: 8px 10px;
  border-bottom: 1px solid rgba(255,255,255,0.04);
}
.source-table tr:last-child td { border-bottom: none; }
.analyse-stat-big {
  font-variant-numeric: tabular-nums;
  font-size: 2.4rem;
  font-weight: 800;
  color: var(--accent-ink);
  line-height: 1;
  margin-bottom: 6px;
  text-shadow: 0 0 20px rgba(188,159,95,0.35);
}
.analyse-stat-label {
  font-size: 0.8rem;
  color: var(--text-muted);
}
.analyse-revenue-row {
  display: flex;
  gap: 16px;
  width: 100%;
  margin-bottom: 16px;
}
.analyse-revenue-card {
  flex: 1;
  min-width: 0;
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px 22px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
/* Onder 700px passen drie omzetkaarten niet meer naast elkaar.

   Deze regels stonden VOOR .analyse-revenue-card. Een @media-blok verhoogt de
   specificiteit niet, dus bij gelijke specificiteit wint wat later staat -- en
   dat was de flex-verkorting op de kaart hierboven. De kaarten kregen daardoor
   76px op een telefoon van 390px en de tekst erin werd afgekapt, terwijl de
   regel die dat had moeten voorkomen er gewoon stond. Dat is precies de
   cascadeval uit CLAUDE.md, en het is hier al eerder misgegaan met .btn-icon.

   Vandaar: NA de basisregel. Verplaats dit blok niet naar boven. */
@media (max-width: 700px) {
  .analyse-revenue-row { flex-wrap: wrap; }
  .analyse-revenue-row > * { flex: 1 1 100%; }
}

.analyse-revenue-val {
  font-variant-numeric: tabular-nums;
  font-size: 1.7333rem;
  font-weight: 800;
  color: var(--text-primary);
  line-height: 1;
}
.analyse-revenue-label {
  font-size: 0.7333rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  margin-top: 6px;
}
.analyse-revenue-sub {
  font-size: 0.7333rem;
  color: var(--text-muted);
}
.analyse-verlies-list {
  margin-top: 10px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.analyse-verlies-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-size: 0.7333rem;
  color: var(--text-secondary);
}
.analyse-verlies-count {
  font-weight: 700;
  color: var(--text-primary);
}

/* ============================================================
   ROW QUICK ACTIONS (Feature 2)
   ============================================================ */
.row-actions { display: flex; gap: 4px; align-items: center; opacity: 0; transition: opacity 0.15s; }
.leads-table tr:hover .row-actions { opacity: 1; }

/* Touch devices have no hover, without this the call/WhatsApp quick-action
   icons are permanently invisible (opacity: 0 with no way to trigger it),
   so a phone user has no way to know they exist. Same fix as .copy-btn above. */
@media (hover: none) {
  .row-actions { opacity: 0.65; }
}

/* 28x28 is prima voor een muis en te klein voor een duim. Dit zijn juist de
   knoppen die een makelaar op zijn telefoon gebruikt: bellen of WhatsAppen
   vanaf de leadlijst, tussen twee bezichtigingen door. WCAG vraagt 44x44 voor
   aanraken, en de knop groeit hieronder alleen op aanraakschermen -- op een
   muisscherm blijft de rij net zo compact als hij was. */
.row-action-btn {
  width: 28px; height: 28px; border-radius: var(--r-xs); border: 1px solid var(--border);
  background: var(--bg-card-alt); cursor: pointer; display: flex;
  align-items: center; justify-content: center; font-size: 0.8667rem;
  text-decoration: none; color: var(--text-secondary); transition: var(--transition);
}
.row-action-btn:hover { border-color: var(--accent); background: rgba(var(--accent-rgb),0.1); }

/* ============================================================
   PANEL QUICK ACTIONS (Feature 3)
   ============================================================ */
.panel-quick-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.panel-quick-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 14px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg-card-alt);
  color: var(--text-primary); font-size: 0.8rem; font-weight: 500;
  text-decoration: none; cursor: pointer; transition: var(--transition);
  font-family: 'Inter', sans-serif;
}
.panel-quick-btn:hover { border-color: var(--accent); background: rgba(var(--accent-rgb),0.08); color: var(--accent-ink); }

/* ============================================================
   LEAD AGE BADGES (Feature 4)
   ============================================================ */
.age-chip {
  font-size: 0.6667rem; font-weight: 600; padding: 2px 8px; border-radius: var(--r-lg);
  border: 1px solid var(--border);
}
.age-chip.fresh { display: none; }
.age-chip.warm { background: rgba(var(--success-rgb),0.1); color: var(--green-ink); border-color: rgba(var(--success-rgb),0.2); }
.age-chip.cooling { background: rgba(var(--warning-rgb),0.1); color: var(--orange-ink); border-color: rgba(var(--warning-rgb),0.2); }
.age-chip.cold { background: rgba(var(--error-rgb),0.1); color: var(--red-ink); border-color: rgba(var(--error-rgb),0.2); }
.age-badge-table {
  display: inline-block; font-size: 0.6667rem; font-weight: 700;
  padding: 1px 6px; border-radius: var(--r-sm); margin-left: 6px; vertical-align: middle;
}
.age-badge-warm { background: rgba(var(--success-rgb),0.12); color: var(--green-ink); }
.age-badge-cooling { background: rgba(var(--warning-rgb),0.12); color: var(--orange-ink); }
.age-badge-cold { background: rgba(var(--error-rgb),0.12); color: var(--red-ink); }

/* ============================================================
   REVENUE GOAL CARD (Feature 5)
   ============================================================ */
.revenue-goal-card {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 18px 20px; margin-bottom: 16px;
  position: relative; overflow: hidden;
}
.revenue-goal-card::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  background: var(--accent);
}
.revenue-goal-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; }
.revenue-goal-label { font-size: 0.7333rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
.revenue-goal-sub { font-size: 0.7333rem; color: var(--text-muted); margin-top: 2px; }
.revenue-goal-edit { background: none; border: none; cursor: pointer; font-size: 0.9333rem; opacity: 0.5; transition: opacity 0.15s; }
.revenue-goal-edit:hover { opacity: 1; }
.revenue-goal-amounts { display: flex; align-items: baseline; gap: 6px; margin-bottom: 12px; }
.revenue-goal-current { font-size: 1.8667rem; font-weight: 800; color: var(--text-primary); font-variant-numeric: tabular-nums; }
.revenue-goal-slash { font-size: 1.2rem; color: var(--text-muted); }
.revenue-goal-target { font-size: 1.0667rem; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.revenue-goal-bar-wrap { height: 6px; background: var(--bg-card-alt); border-radius: var(--r-xs); overflow: hidden; margin-bottom: 8px; border: 1px solid var(--border); }
.revenue-goal-bar { height: 100%; border-radius: var(--r-xs); background: linear-gradient(90deg, var(--accent), var(--blue-bright)); transition: width 0.6s cubic-bezier(0.4,0,0.2,1); }
.revenue-goal-pct { font-size: 0.8rem; color: var(--text-secondary); }

/* ============================================================
   INSTELLINGEN (SETTINGS)
   ============================================================ */
/* ── Formulier page ───────────────────────────────────────────────────── */
.fm-wrap { width: 100%; padding: 24px 0; display: flex; flex-direction: column; gap: 18px; }

/* Form stats */
.fm-stats {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px;
}
.fm-stat-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 16px 18px;
  display: flex; flex-direction: column; gap: 4px;
}
.fm-stat-num {
  font-size: 1.8667rem; font-weight: 700; color: var(--text-primary);
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
.fm-stat-lbl {
  font-size: 0.7333rem; font-weight: 600; color: var(--text-muted);
  text-transform: uppercase; letter-spacing: .04em;
}
.fm-stat-delta {
  font-size: 0.7333rem; color: var(--text-muted); margin-top: 4px; min-height: 14px;
}
.fm-stat-delta.up   { color: var(--green-ink); }
.fm-stat-delta.down { color: var(--red-ink); }

/* Code actions row (Kopieer + Stuur naar developer side by side) */
.fm-code-actions { display: flex; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.fm-code-actions .fm-btn { flex: 1; min-width: 130px; }

.fm-hero {
  background: rgba(var(--accent-rgb),.06);
  border: 1px solid rgba(var(--accent-rgb),.2); border-radius: var(--r-lg); padding: 24px 26px;
}
.fm-hero-top { display: flex; gap: 14px; align-items: flex-start; margin-bottom: 16px; }
.fm-hero-icon { font-size: 2.1333rem; line-height: 1; }
.fm-hero-text { flex: 1; min-width: 0; }
.fm-hero-title { margin: 0 0 4px; font-size: 1.4667rem; font-weight: 700; color: var(--text-primary); }
.fm-hero-sub { margin: 0; font-size: 0.8667rem; color: var(--text-muted); line-height: 1.55; }
.fm-url-row { display: flex; gap: 8px; align-items: stretch; flex-wrap: wrap; margin-bottom: 12px; }
.fm-url {
  flex: 1; min-width: 220px; padding: 11px 14px;
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-sm);
  color: var(--accent-ink); font-family: monospace; font-size: 0.8667rem;
  display: flex; align-items: center;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.fm-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 10px 14px; background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8667rem; font-weight: 600;
  cursor: pointer; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease; font-family: inherit; text-decoration: none;
}
.fm-btn:hover { border-color: var(--accent-bright); }
.fm-btn-primary { background: linear-gradient(135deg, var(--accent), var(--accent-bright)); border-color: transparent; color: var(--on-accent); }
.fm-btn-primary:hover { opacity: .9; }
.fm-btn-full { width: 100%; justify-content: center; margin-top: 8px; }

.fm-share-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.fm-share-lbl { font-size: 0.7333rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
.fm-share-btn {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 7px 11px; background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--r-xs); color: var(--text-muted); font-size: 0.8rem; font-weight: 600;
  text-decoration: none; cursor: pointer; font-family: inherit; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.fm-share-btn:hover { color: var(--accent-ink); border-color: var(--accent-bright); }
.fm-share-btn[id="fm-share-wa"]:hover     { color: #25d366; border-color: #25d366; }
.fm-share-btn[id="fm-share-linkedin"]:hover { color: #0a66c2; border-color: #0a66c2; }

.fm-options-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(310px, 1fr));
  gap: 16px;
}
.fm-option-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 20px 22px; display: flex; flex-direction: column;
}
/* ── De kop van een integratiekaart ───────────────────────────────────────
   Het label AANBEVOLEN stond hier op position:absolute met top:-6px en right:-6px
   in een position:relative kop. Dat werkt zolang de titel kort is; is hij dat
   niet, dan gaat het label er gewoon overheen liggen. Gemeten op het echte
   scherm: "Floating WhatsApp button on your site" werd voor 66% bedekt door
   "RECOMMENDED" -- twee woorden over elkaar, precies op de kaart die de klant
   moet lezen om te kiezen hoe hij het formulier op zijn site zet.

   En het wordt erger per taal, niet beter: het label is vertaald, en
   "AANBEVOLEN" is langer dan "RECOMMENDED". Een absolute plaatsing kan daar
   niet op meebewegen, want ze weet niet hoe breed de buurman is.

   Nu een raster. Het label krijgt een eigen kolom naast de titel, de
   onderregel loopt onder allebei door. De titel kan dan nooit onder het label
   komen, in geen enkele taal en bij geen enkele lengte -- het raster geeft ze
   allebei hun eigen ruimte in plaats van ze op dezelfde plek te leggen.

   Kaarten zonder label doen gewoon mee: die vullen kolom 1 en laten kolom 2
   leeg, wat op auto nul breed is. */
.fm-option-hdr {
  margin-bottom: 12px;
  display: grid;
  grid-template-columns: 1fr auto;
  column-gap: 10px;
  row-gap: 4px;
  align-items: start;
}
.fm-option-rec {
  grid-column: 2; grid-row: 1;
  justify-self: end;
  background: rgba(var(--success-rgb),.15); color: var(--green-ink);
  font-size: 0.6667rem; font-weight: 700; padding: 3px 8px; border-radius: var(--r-full);
  text-transform: uppercase; letter-spacing: .04em;
  border: 1px solid rgba(var(--success-rgb),.3);
  /* Het label mag zelf niet afbreken; het is twee woorden en een afgebroken
     keurmerk leest als een fout. De titel ernaast mag dat wel. */
  white-space: nowrap;
}
.fm-option-title {
  grid-column: 1; grid-row: 1;
  /* Zonder dit weigert een rasteritem smaller te worden dan zijn langste
     woord, en duwt een lange titel het label alsnog van de kaart af. */
  min-width: 0;
  font-size: 1rem; font-weight: 700; color: var(--text-primary);
}
.fm-option-sub {
  grid-column: 1 / -1; grid-row: 2;
  font-size: 0.8rem; color: var(--text-muted); line-height: 1.55; margin: 0;
}
.fm-code {
  width: 100%; padding: 11px 12px; background: var(--bg-card-alt);
  border: 1px solid var(--border); border-radius: var(--r-sm);
  color: var(--text-primary); font-family: monospace; font-size: 0.8rem; line-height: 1.5;
  resize: none; outline: none; white-space: pre;
}
.fm-code:focus { border-color: var(--accent-bright); }
.fm-instructions {
  margin-top: 12px; font-size: 0.7333rem; color: var(--text-muted); line-height: 1.55;
  padding: 10px 12px; background: var(--bg-card-alt); border-radius: var(--r-sm);
  border-left: 1px solid var(--border-c);
}
.fm-instructions strong { color: var(--text-primary); }
.fm-instructions code {
  background: rgba(var(--accent-rgb),.12); color: var(--accent-ink);
  padding: 1px 5px; border-radius: var(--r-xs); font-size: 0.7333rem;
}

/* Installation guide accordion */
.fm-guide-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 22px 24px;
}
.fm-guide-hdr { margin-bottom: 12px; }
.fm-guide-item {
  border-top: 1px solid var(--border);
  margin: 0 -24px;
}
.fm-guide-item:last-of-type { border-bottom: 1px solid var(--border); margin-bottom: 14px; }
.fm-guide-item summary {
  cursor: pointer; list-style: none;
  padding: 14px 24px;
  display: flex; align-items: center; gap: 10px;
  user-select: none;
  font-size: 0.9333rem; font-weight: 600; color: var(--text-primary);
  transition: background .15s ease;
}
.fm-guide-item summary::-webkit-details-marker { display: none; }
.fm-guide-item summary::after {
  content: ''; margin-left: auto;
  width: 8px; height: 8px;
  border-right: 2px solid var(--text-muted); border-bottom: 2px solid var(--text-muted);
  transform: rotate(-45deg); transition: transform .2s ease;
}
.fm-guide-item[open] summary::after { transform: rotate(45deg); }
.fm-guide-item summary:hover { background: var(--bg-card-alt); }
.fm-guide-item[open] summary { background: rgba(var(--accent-rgb),.06); color: var(--accent-ink); }
.fm-guide-emoji { font-size: 1.2rem; line-height: 1; }
.fm-guide-label { flex: 1; }
.fm-guide-meta { font-size: 0.7333rem; font-weight: 500; color: var(--text-muted); font-style: italic; }
.fm-guide-body {
  padding: 4px 24px 20px;
  font-size: 0.8667rem; color: var(--text-primary); line-height: 1.65;
}
.fm-guide-body p { margin: 8px 0; }
.fm-guide-body p strong { color: var(--text-primary); }
.fm-guide-body ol { padding-left: 22px; margin: 8px 0; }
.fm-guide-body ol li { margin-bottom: 6px; color: var(--text-primary); }
.fm-guide-body ol li strong { color: var(--accent-ink); font-weight: 600; }
.fm-guide-body code {
  background: var(--bg-card-alt); color: var(--accent-ink);
  padding: 1px 6px; border-radius: var(--r-xs); font-size: 0.8rem; font-family: monospace;
}
.fm-guide-tip {
  margin-top: 12px; padding: 10px 14px; border-radius: var(--r-sm);
  background: rgba(var(--warning-rgb),.08); border-left: 1px solid var(--border-c);
  font-size: 0.8rem; color: var(--text-primary); line-height: 1.55;
}
.fm-guide-tip strong { color: var(--warning-ink); font-weight: 700; }
.fm-guide-test {
  margin-top: 14px; padding: 14px 16px;
  background: rgba(var(--success-rgb),.08); border: 1px solid rgba(var(--success-rgb),.25);
  border-radius: var(--r-sm);
  font-size: 0.8667rem; color: var(--text-primary); line-height: 1.6;
}
.fm-guide-test strong { display: block; color: var(--green-ink); margin-bottom: 4px; font-weight: 700; }

.fm-bottom-grid {
  display: grid; grid-template-columns: 280px 1fr; gap: 16px; align-items: start;
}
@media (max-width: 900px) { .fm-bottom-grid { grid-template-columns: 1fr; } }
.fm-qr-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 20px; display: flex; flex-direction: column; align-items: stretch;
}
.fm-qr-frame {
  background: var(--zand-50); padding: 16px; border-radius: var(--r-md); margin: 14px 0 8px;
  display: flex; align-items: center; justify-content: center;
}
/* ── Formulier → Stijl & merk ──────────────────────────────────────────────
   Zelfde kaart als de integratie-opties; de velden hergebruiken .ap-field
   van AI-persoonlijkheid zodat kleur- en tekstinvoer overal hetzelfde voelt. */
.fm-style-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 20px 22px; margin-bottom: 16px; display: flex; flex-direction: column;
}
.fs-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-top: 14px; }
.fs-grid .ap-field { background: var(--bg-card-alt); }
.fs-span2 { grid-column: span 2; }
.fs-select { cursor: pointer; }
.fs-mt { margin-top: 10px; }
.fs-colors { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.fs-color, .fs-tekst-veld { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.fs-color-name { font-size: 0.7333rem; font-weight: 600; color: var(--text-muted); letter-spacing: 0.02em; }
.fs-teksten { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.fs-logo-row { display: flex; gap: 12px; align-items: center; }
.fs-logo-box {
  width: 64px; height: 64px; flex-shrink: 0; border-radius: var(--r-sm);
  border: 1px dashed var(--border-strong); background: var(--bg-primary);
  display: flex; align-items: center; justify-content: center; overflow: hidden;
}
.fs-logo-box.heeft-logo { border-style: solid; }
.fs-logo-box img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; }
.fs-logo-box img[hidden], .fs-logo-acties .fm-btn[hidden] { display: none; }
.fs-logo-acties { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.fs-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; }
@media (max-width: 1100px) { .fs-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px) {
  .fs-grid, .fs-colors, .fs-teksten { grid-template-columns: 1fr; }
  .fs-span2 { grid-column: auto; }
  .fs-actions .fm-btn { width: 100%; justify-content: center; }
}
.fm-preview-card {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 20px; display: flex; flex-direction: column;
}
.fm-iframe-wrap {
  margin-top: 12px; height: 560px; border-radius: var(--r-sm); overflow: hidden;
  border: 1px solid var(--border); background: var(--bg-card-alt);
}
.fm-iframe-wrap iframe { width: 100%; height: 100%; border: 0; display: block; }

/* ── Onboarding "Klaar!" celebration overlay ──────────────────────────── */
#onb-done-overlay {
  position: fixed; inset: 0;
  background: rgba(15,12,5,.92); backdrop-filter: blur(10px);
  z-index: 2500;
  display: none; align-items: center; justify-content: center;
  padding: 24px;
}
#onb-done-overlay.open { display: flex; animation: onbFade .35s ease; }
@keyframes onbFade { from { opacity: 0; } to { opacity: 1; } }
.onb-done-card {
  width: 100%; max-width: 520px;
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 36px 32px;
  text-align: center;
  box-shadow: var(--elev-3);
  animation: onbPop .3s var(--ease-out);
}
@keyframes onbPop { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
/* Fase 4: de oneindige stuiter is weg -- "nothing loops" (motion grammar,
   site-index-html.md) en een bounce-easing detector-vondst. Het icoon komt
   nu mee met de kaart in onbPop, één keer, en blijft dan stil staan. */
.onb-done-icon { font-size: 3.7333rem; margin-bottom: 12px; }
.onb-done-title { margin: 0 0 6px; font-size: 1.6rem; font-weight: 700; color: var(--text-primary); }
.onb-done-sub { margin: 0 0 22px; font-size: 0.8667rem; color: var(--text-muted); line-height: 1.55; }
.onb-done-url-card {
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-md); padding: 14px 16px; margin-bottom: 20px;
  text-align: left;
}
.onb-done-url-lbl {
  font-size: 0.6667rem; font-weight: 700; color: var(--text-muted);
  text-transform: uppercase; letter-spacing: .08em; margin-bottom: 6px;
}
.onb-done-url {
  display: block; font-family: monospace; font-size: 0.8667rem; color: var(--accent-ink);
  background: var(--bg-primary); padding: 8px 11px; border-radius: var(--r-xs);
  margin-bottom: 10px; word-break: break-all;
}
.onb-done-copy {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--accent-bright); border: none; border-radius: var(--r-xs);
  padding: 7px 12px; color: var(--on-accent); font-size: 0.8rem; font-weight: 600;
  cursor: pointer; font-family: inherit;
}
.onb-done-copy:hover { opacity: .9; }
.onb-done-steps { display: flex; flex-direction: column; gap: 8px; margin-bottom: 24px; text-align: left; }
.onb-done-step {
  display: flex; align-items: center; gap: 10px;
  background: rgba(var(--accent-rgb),.06); border-radius: var(--r-sm); padding: 10px 14px;
  font-size: 0.8667rem; color: var(--text-primary);
}
.onb-done-step-num {
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--accent-bright); color: var(--on-accent);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.8rem; font-weight: 700; flex-shrink: 0;
}
.onb-done-actions { display: flex; gap: 10px; flex-wrap: wrap; }
.onb-done-btn {
  flex: 1; min-width: 180px; padding: 12px 16px;
  border-radius: var(--r-sm); font-size: 0.8667rem; font-weight: 700;
  cursor: pointer; font-family: inherit;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.onb-done-btn-primary {
  background: linear-gradient(135deg, var(--accent), var(--accent-bright));
  border: none; color: var(--on-accent);
}
.onb-done-btn-primary:hover { opacity: .9; }
.onb-done-btn-secondary {
  background: var(--bg-card-alt); border: 1px solid var(--border);
  color: var(--text-primary);
}
.onb-done-btn-secondary:hover { border-color: var(--accent-bright); color: var(--accent-ink); }

/* ── Dashboard form-link banner ───────────────────────────────────────── */
.dash-formlink {
  display: flex; align-items: center; gap: 12px;
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md);
  padding: 12px 16px; margin-bottom: 16px;
  flex-wrap: wrap;
}
.dash-formlink-icon { font-size: 1.3333rem; line-height: 1; }
.dash-formlink-body { flex: 1; min-width: 200px; display: flex; flex-direction: column; gap: 2px; }
.dash-formlink-label { font-size: 0.7333rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: .06em; }
.dash-formlink-url {
  font-family: monospace; font-size: 0.8rem; color: var(--accent-ink);
  background: var(--bg-card-alt); padding: 5px 9px; border-radius: var(--r-xs);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  display: inline-block; max-width: 100%;
}
.dash-formlink-actions { display: flex; gap: 6px; flex-wrap: wrap; }
.dash-formlink-btn {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-xs);
  padding: 6px 10px; font-size: 0.8rem; font-weight: 600;
  color: var(--text-muted); text-decoration: none; cursor: pointer; font-family: inherit;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.dash-formlink-btn:hover { color: var(--accent-ink); border-color: var(--accent-bright); }

/* ── Trial banner. Hidden by default (display:none inline in the HTML) -
   only shown once loadPlanStatus() confirms this client is on trial or
   expired. See TRIAL-DESIGN.md and api/leads.js's plan-status mode. Two
   colour states via a modifier class: .trial (accent, informative) and
   .expired (amber, "non-alarming" per TRIAL-DESIGN.md §3, never red/error
   styling, leads are still being captured). ─────────────────────────────── */
.dash-trial-banner {
  display: flex; align-items: center; gap: 12px;
  border-radius: var(--r-md); padding: 12px 16px; margin-bottom: 16px;
  flex-wrap: wrap;
}
.dash-trial-banner.trial {
  background: rgba(var(--accent-rgb), .08); border: 1px solid rgba(var(--accent-rgb), .25);
}
.dash-trial-banner.expired {
  background: rgba(var(--warning-rgb), .08); border: 1px solid rgba(var(--warning-rgb), .25);
}
.dash-trial-banner-icon { font-size: 1.3333rem; line-height: 1; }
.dash-trial-banner-body { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: 2px; }
.dash-trial-banner-title { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.dash-trial-banner-sub { font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; }
.dash-trial-banner-cta {
  display: inline-flex; align-items: center; gap: 5px; flex-shrink: 0;
  background: var(--accent); color: var(--bg-primary); border: none; border-radius: var(--r-xs);
  padding: 8px 14px; font-size: 0.8rem; font-weight: 700;
  text-decoration: none; cursor: pointer; font-family: inherit;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.dash-trial-banner-cta:hover { background: var(--accent-hover); }

/* ── Email-verification banner. Hidden by default (display:none inline) -
   only shown once loadOnboardingChecklist() confirms config-get's
   emailVerified is explicitly false (fails open: absent/blank Airtable
   field or a pre-existing client both read as verified, see api/_verify.js).
   Separate from the onboarding checklist card below on purpose: dismissing
   the checklist is meant to be "I've got the gist, hide the getting-started
   card", but an unverified email is a standing account-recovery risk
   (password-reset is gated on it), it deserves its own quiet nudge that
   survives a checklist dismiss, not a fully separate visual language, so it
   reuses the trial banner's ".expired" amber treatment (non-alarming, same
   "gentle attention" register per TRIAL-DESIGN.md §3, never red/error). ── */
.dash-verify-banner {
  display: flex; align-items: center; gap: 12px;
  border-radius: var(--r-md); padding: 12px 16px; margin-bottom: 16px;
  flex-wrap: wrap;
  background: rgba(var(--warning-rgb), .08); border: 1px solid rgba(var(--warning-rgb), .25);
}
.dash-verify-banner-icon { font-size: 1.3333rem; line-height: 1; }
.dash-verify-banner-body { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: 2px; }
.dash-verify-banner-title { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.dash-verify-banner-sub { font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; }
.dash-verify-banner-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.dash-verify-banner-cta {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--warning-c); color: var(--bg-primary); border: none; border-radius: var(--r-xs);
  padding: 8px 14px; font-size: 0.8rem; font-weight: 700;
  cursor: pointer; font-family: inherit; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.dash-verify-banner-cta:hover { opacity: .88; }
.dash-verify-banner-cta:disabled { opacity: .5; cursor: not-allowed; }
.dash-verify-banner-close {
  background: none; border: none; color: var(--text-muted); font-size: 1.2rem;
  line-height: 1; cursor: pointer; padding: 4px 6px; border-radius: var(--r-xs); font-family: inherit;
}
.dash-verify-banner-close:hover { background: rgba(var(--warning-rgb), .12); color: var(--text-primary); }

/* ── Onboarding checklist card. Hidden by default, loadOnboardingChecklist()
   reveals it only when there is real, derived work left to do, and it hides
   itself again the instant every item is done OR the client dismisses it.
   Card, not a banner strip (this one carries 5 rows), so it borrows the
   stat-card surface treatment (--bg-card / --border / --shadow-card) rather
   than the thin colour-tinted banner style above. ─────────────────────── */
.dash-checklist {
  background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 18px 20px 8px; margin-bottom: 16px; box-shadow: var(--edge-hi), var(--shadow-card);
}
.dash-checklist-head { display: flex; align-items: center; gap: 14px; margin-bottom: 14px; }
.dash-checklist-title-wrap { flex: 1; min-width: 160px; }
.dash-checklist-title { font-size: 0.9333rem; font-weight: 700; color: var(--text-primary); }
.dash-checklist-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
.dash-checklist-progress-bar {
  width: 120px; height: 6px; border-radius: var(--r-full); background: var(--bg-card-alt);
  overflow: hidden; flex-shrink: 0;
}
.dash-checklist-progress-fill {
  height: 100%; background: var(--accent-c); border-radius: var(--r-full);
  transition: width var(--dur-base, .25s) var(--ease-out, ease);
}
.dash-checklist-close {
  background: none; border: none; color: var(--text-muted); font-size: 1.2rem;
  line-height: 1; cursor: pointer; padding: 4px 6px; border-radius: var(--r-xs); font-family: inherit;
  flex-shrink: 0;
}
.dash-checklist-close:hover { background: var(--bg-card-alt); color: var(--text-primary); }
.dash-checklist-items { display: flex; flex-direction: column; }
.chk-item {
  display: flex; align-items: center; gap: 12px; padding: 10px 0;
  border-top: 1px solid var(--divider);
}
/* Drie waarden per accent, niet twee: de VULLING (--a), het zachte vlak
   (--a-soft) waar het bolletje op staat, en de INKT (--a-ink) waarin het
   teken erin geschreven wordt.

   Er stonden er twee, en het bolletje gebruikte de vulling als letterkleur.
   Gemeten in het lichte thema: het groene rondje van een nog niet afgevinkte
   stap kwam uit op 2,95:1 -- #16A34A op #E8F6ED. Dat is precies de regel uit
   CLAUDE.md, en dit is de derde plek waar hij misging. De afgevinkte variant
   hieronder was al eerder gerepareerd; de NIET-afgevinkte niet, en die is
   degene die je het vaakst ziet. */
.chk-item[data-accent="blue"]    { --a: var(--c-blue);    --a-soft: var(--c-blue-soft);    --a-ink: var(--neutral-ink); }
.chk-item[data-accent="gold"]    { --a: var(--c-gold);    --a-soft: var(--c-gold-soft);    --a-ink: var(--accent-ink); }
.chk-item[data-accent="purple"]  { --a: var(--c-purple);  --a-soft: var(--c-purple-soft);  --a-ink: var(--neutral-ink); }
.chk-item[data-accent="cyan"]    { --a: var(--c-cyan);    --a-soft: var(--c-cyan-soft);    --a-ink: var(--neutral-ink); }
.chk-item[data-accent="emerald"] { --a: var(--c-emerald); --a-soft: var(--c-emerald-soft); --a-ink: var(--success-ink); }
.chk-item-icon {
  flex: 0 0 auto; width: 26px; height: 26px; display: grid; place-items: center;
  border-radius: 50%; background: var(--a-soft, var(--bg-card-alt));
  color: var(--a-ink, var(--text-muted));
  font-size: 0.8667rem; font-weight: 700;
}
/* Vulling en inkt uit elkaar: --c-emerald is de VULkleur en haalde als vinkje
   op de zachte groene pil 2,95:1 in het lichte thema. --success-ink is
   dezelfde kleur, afgestemd om als letter te lezen (#166534 in licht). */
.chk-item.chk-done .chk-item-icon { background: var(--c-emerald-soft); color: var(--success-ink); }
.chk-item-body { flex: 1; min-width: 160px; }
.chk-item-title { font-size: 0.8667rem; font-weight: 600; color: var(--text-primary); }
.chk-item.chk-done .chk-item-title { color: var(--text-muted); text-decoration: line-through; text-decoration-color: var(--border); }
.chk-item-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 1px; line-height: 1.4; }
.chk-item-action {
  flex-shrink: 0; background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 7px 12px; font-size: 0.8rem; font-weight: 600; color: var(--text-primary);
  cursor: pointer; font-family: inherit; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.chk-item-action:hover { border-color: var(--a, var(--accent-bright)); color: var(--a, var(--accent-bright)); }
/* De eerstvolgende stap valt op: een rustig vlak, een label en de enige gevulde knop. De rest blijft stil, zodat een nieuwe klant
   niet vijf dingen tegelijk moet kiezen maar weet wat nu aan de beurt is. */
.chk-item.chk-next { background: var(--bg-card-alt); border-radius: var(--r-sm); padding: 12px; margin: 4px -12px; border-top-color: transparent; }
.chk-item.chk-next + .chk-item { border-top-color: transparent; }
.chk-volgende { display: block; font-size: 0.6933rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--accent-ink); margin-bottom: 2px; }
.chk-item.chk-next .chk-item-action { background: var(--btn-primary-bg, var(--accent)); border-color: var(--btn-primary-bg, var(--accent)); color: var(--btn-primary-text, var(--on-accent, #1d1a16)); }
.chk-item.chk-next .chk-item-action:hover { filter: brightness(1.08); color: var(--btn-primary-text, var(--on-accent, #1d1a16)); }
.chk-whatsapp {
  display: flex; align-items: flex-start; gap: 12px; padding: 12px 0 14px;
  border-top: 1px solid var(--divider); margin-top: 2px;
}
.chk-whatsapp-icon { flex: 0 0 auto; font-size: 1.2rem; line-height: 1.3; }
.chk-whatsapp-body { flex: 1; min-width: 160px; }
.chk-whatsapp-title { font-size: 0.8667rem; font-weight: 600; color: var(--text-primary); }
.chk-whatsapp-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 3px; line-height: 1.5; }
.chk-whatsapp-action {
  flex-shrink: 0; align-self: center; background: none; border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 7px 12px; font-size: 0.8rem; font-weight: 600; color: var(--text-primary);
  cursor: pointer; font-family: inherit; text-decoration: none; display: inline-flex; align-items: center;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.chk-whatsapp-action:hover { border-color: var(--accent-bright); color: var(--accent-ink); }
@media (max-width: 640px) {
  .dash-checklist-head { flex-wrap: wrap; }
  .dash-checklist-progress-bar { order: 3; width: 100%; }
  .chk-item { flex-wrap: wrap; }
  .chk-item-action { margin-left: 38px; }
}

/* ── "Vertel over je bedrijf" modal, reuses the founder-modal-overlay
   visual language (dim scrim + centered elevated panel) already used for
   the pipeline/goal modals, so this doesn't invent a second modal system. */
.chk-biz-modal-overlay {
  position: fixed; inset: 0; background: rgba(0,0,0,.6); z-index: 950;
  display: none; align-items: center; justify-content: center; padding: 20px;
}
.chk-biz-modal-overlay.open { display: flex; }
.chk-biz-modal {
  background: var(--card-elevated); border: 1px solid var(--border); border-radius: var(--r-lg);
  padding: 26px 26px 20px; width: 100%; max-width: 540px; max-height: 88vh; overflow-y: auto;
  box-shadow: var(--elev-3);
}
.chk-biz-modal-title { font-size: 1.0667rem; font-weight: 700; color: var(--text-primary); margin-bottom: 6px; }
.chk-biz-modal-intro { font-size: 0.8667rem; color: var(--text-muted); line-height: 1.5; margin-bottom: 20px; }
.chk-biz-field { margin-bottom: 16px; }
.chk-biz-field label { display: block; font-size: 0.8rem; font-weight: 700; color: var(--text-primary); margin-bottom: 5px; }
.chk-biz-field-hint { font-size: 0.7333rem; color: var(--text-muted); margin-top: 4px; }
.chk-biz-field textarea {
  width: 100%; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 10px 12px; font-size: 0.8667rem; font-family: inherit; color: var(--text-primary);
  resize: vertical; min-height: 64px; transition: border-color .15s ease;
}
.chk-biz-field textarea:focus { outline: none; border-color: var(--accent); }
.chk-biz-modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 4px; }
.chk-biz-cancel {
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 10px 18px; font-size: 0.8667rem; font-weight: 600; color: var(--text-primary);
  cursor: pointer; font-family: inherit;
}
.chk-biz-save {
  background: linear-gradient(135deg, var(--accent), var(--accent-bright)); border: none; border-radius: var(--r-sm);
  padding: 10px 18px; font-size: 0.8667rem; font-weight: 700; color: var(--on-accent);
  cursor: pointer; font-family: inherit;
}
.chk-biz-save:disabled { opacity: .6; cursor: not-allowed; }

/* ── AI Persoonlijkheid page ──────────────────────────────────────────── */
.ap-wrap { width: 100%; padding: 24px 0; }
.ap-grid { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 28px; align-items: start; }
@media (max-width: 1100px) { .ap-grid { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 600px)  { .ap-grid { gap: 18px; } }
/* min-width:0 om dezelfde reden als hierboven: een flex-item weigert standaard
   onder zijn min-content-breedte te krimpen. */
.ap-form-col { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.ap-form-col > *, .ap-side-col > * { min-width: 0; max-width: 100%; }
.ap-welcome-banner {
  display: flex; gap: 14px; align-items: flex-start;
  background: linear-gradient(135deg, rgba(var(--success-rgb),.10), rgba(var(--success-rgb),.02));
  border: 1px solid rgba(var(--success-rgb),.3); border-radius: var(--r-md);
  padding: 18px 22px; margin-bottom: 18px;
  animation: apWelcomePop .35s ease;
}
@keyframes apWelcomePop { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }
.ap-welcome-icon { font-size: 1.8667rem; line-height: 1; }
.ap-welcome-body { flex: 1; min-width: 0; }
.ap-welcome-title { font-size: 0.9333rem; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; }
.ap-welcome-sub { font-size: 0.8rem; color: var(--text-muted); line-height: 1.55; }
.ap-welcome-sub b { color: var(--text-primary); font-weight: 600; }
.ap-welcome-checks { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.ap-welcome-chk {
  display: inline-flex; align-items: center; gap: 5px;
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--r-xs); padding: 4px 9px;
  font-size: 0.7333rem; font-weight: 600; color: var(--text-muted);
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.ap-welcome-chk.done { color: var(--green-ink); border-color: rgba(var(--success-rgb),.4); }
.ap-welcome-chk.done .ap-welcome-chk-icon { color: var(--green-ink); }
.ap-welcome-chk-icon { font-size: 0.8rem; }
.ap-hero { background: rgba(var(--accent-rgb),.06); border: 1px solid rgba(var(--accent-rgb),.2); border-radius: var(--r-md); padding: 22px 24px; }
.ap-hero-title { margin: 0 0 4px; font-size: 1.4667rem; font-weight: 700; color: var(--text-primary); }
.ap-hero-sub { margin: 0; font-size: 0.8667rem; color: var(--text-muted); line-height: 1.55; }
.ap-field { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md); padding: 16px 18px; }
.ap-label { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); margin-bottom: 8px; }
.ap-label-hint { font-size: 0.7333rem; font-weight: 400; color: var(--text-muted); }
.ap-input, .ap-textarea {
  width: 100%; padding: 10px 12px; background: var(--bg-card-alt);
  border: 1px solid var(--border); border-radius: var(--r-sm);
  color: var(--text-primary); font-size: 0.8667rem; font-family: inherit; outline: none;
  transition: border-color .15s ease;
}
.ap-lang-row { display: flex; gap: 8px; flex-wrap: wrap; }
.ap-lang-opt {
  display: inline-flex; align-items: center; gap: 8px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); padding: 9px 13px;
  /* 35px hoog gemeten. Boven de 24 die WCAG vraagt, maar onder wat je met
     een duim comfortabel raakt naast een tweede optie ernaast. */
  min-height: 44px;
  font-size: 0.8667rem; font-weight: 600; color: var(--text-primary);
  cursor: pointer; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.ap-lang-opt:hover { border-color: var(--accent-bright); }
.ap-lang-opt input[type="radio"] { margin: 0; flex-shrink: 0; cursor: pointer; accent-color: var(--accent); width: 18px; height: 18px; }
.ap-lang-opt:has(input:checked) {
  background: rgba(var(--accent-rgb),.15);
  border-color: var(--accent-bright);
  color: var(--accent-ink);
}
/* Gemeten op 390px: dit label was 320 breed en 16 HOOG. Het hokje eromheen
   16x16, het aanvinkgebied dus een streepje van zestien pixels. WCAG 2.5.8
   vraagt 24x24 als ondergrens en dit zat eronder; op een telefoon mis je hem
   gewoon. De rij is een label dat het hokje omvat, dus hoogte geven kost
   niets aan de opmaak en maakt het hele lint aanraakbaar. */
.ap-checkbox-row { display: flex; align-items: center; gap: 10px; min-height: 44px; cursor: pointer; font-size: 0.8667rem; font-weight: 600; color: var(--text-primary); }
/* De browser tekent een keuzerondje van 13px en een vinkje van 16px. Klein om
   te zien en klein om te raken; accent-color zet ze meteen in de merkkleur in
   plaats van in Chrome-blauw.

   Beide selectors bestonden al -- ik zette er eerst een tweede regel naast en
   die verdween stil onder de bestaande (zelfde specificiteit, de andere stond
   later). Gemeten bleef het vinkje gewoon 16x16. Dus: de bestaande regels
   aangepast, geen nieuwe ernaast. */
.ap-checkbox-row input[type="checkbox"] { margin: 0; flex-shrink: 0; cursor: pointer; accent-color: var(--accent); width: 18px; height: 18px; }
.ap-color-row { display: flex; gap: 8px; align-items: stretch; }
.ap-color-input { flex: 1; font-family: monospace; text-transform: uppercase; }
.ap-color-swatch {
  width: 44px; padding: 0; border: 1px solid var(--border); border-radius: var(--r-sm);
  background: transparent; cursor: pointer; appearance: none; -webkit-appearance: none;
}
.ap-color-swatch::-webkit-color-swatch-wrapper { padding: 4px; }
.ap-color-swatch::-webkit-color-swatch { border: none; border-radius: var(--r-xs); }
.ap-input:focus, .ap-textarea:focus { border-color: var(--accent-bright); }
.ap-textarea { resize: vertical; min-height: 70px; line-height: 1.55; }
.ap-hint { font-size: 0.7333rem; color: var(--text-muted); margin-top: 8px; line-height: 1.5; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.ap-hint em { color: var(--text-primary); font-style: normal; font-weight: 600; }
/* Deze chips zetten {naam}, {bedrijf} enzovoort in het welkomstbericht. Ze
   waren 19px hoog met 2px padding -- onder de 24x24 van WCAG 2.5.8, en op een
   telefoon is een rij van vier zulke blokjes naast elkaar een loterij.

   Hoogte via padding en niet via min-height, want ze staan in een regel tekst
   (.ap-hint) en moeten daarin blijven meelopen. */
.ap-chip {
  background: rgba(var(--accent-rgb),.12); border: 1px solid rgba(var(--accent-rgb),.25);
  color: var(--accent-ink); padding: 5px 9px; border-radius: var(--r-xs);
  font-size: 0.7333rem; font-weight: 600; cursor: pointer; font-family: monospace;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
@media (max-width: 600px) {
  /* Op een telefoon is de duim het aanwijsapparaat, dus daar helemaal naar
     boven de grens. De regel eromheen krijgt wat meer lucht zodat twee chips
     onder elkaar niet tegen elkaar aan komen te liggen. */
  .ap-chip { padding: 8px 12px; font-size: 0.8rem; }
  .ap-hint { gap: 8px; line-height: 1.9; }
}
.ap-chip:hover { background: rgba(var(--accent-rgb),.25); color: var(--text); }

/* AI photo file picker */
.ap-photo-row {
  display: flex; align-items: center; gap: 16px;
  padding: 4px 0;
}
.ap-photo-preview {
  width: 84px; height: 84px; border-radius: 50%;
  background: var(--bg-card-alt); border: 2px dashed var(--border);
  display: flex; align-items: center; justify-content: center;
  overflow: hidden; flex-shrink: 0;
  position: relative;
  transition: border-color .15s ease;
}
.ap-photo-preview.has-photo { border-style: solid; border-color: var(--accent); }
.ap-photo-preview img { width: 100%; height: 100%; object-fit: cover; }
.ap-photo-placeholder {
  font-size: 1.8667rem; font-weight: 300; color: var(--text-muted);
}
.ap-photo-controls {
  display: flex; flex-direction: column; gap: 8px; align-items: flex-start;
}
.ap-btn-secondary {
  background: rgba(var(--accent-rgb),.10); color: var(--accent-ink);
  border: 1px solid rgba(var(--accent-rgb),.30); padding: 8px 14px;
  border-radius: var(--r-sm); font-size: 0.8667rem; font-weight: 600; cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease; font-family: inherit;
}
.ap-btn-secondary:hover { background: rgba(var(--accent-rgb),.20); }
.ap-btn-link {
  background: transparent; color: var(--text-muted); border: 0;
  font-size: 0.8rem; cursor: pointer; padding: 4px 0;
  text-decoration: underline; font-family: inherit;
}
.ap-btn-link:hover { color: var(--red, var(--error)); }
.ap-photo-advanced {
  margin-top: 10px; font-size: 0.8rem;
}
.ap-photo-advanced summary {
  cursor: pointer; color: var(--text-muted); padding: 4px 0;
  user-select: none;
}
.ap-photo-advanced summary:hover { color: var(--accent-ink); }
.ap-photo-advanced[open] summary { margin-bottom: 8px; }

/* Template inspiration library, ingeklapt tot je hem opent (2026-10-03) */
.ap-tpl-wrap { margin-bottom: 12px; }
.ap-tpl-header { display: flex; align-items: baseline; gap: 8px; margin-bottom: 8px; }
summary.ap-tpl-header { cursor: pointer; list-style: none; margin-bottom: 0; padding: 6px 0; }
summary.ap-tpl-header::-webkit-details-marker { display: none; }
summary.ap-tpl-header::before { content: ''; width: 6px; height: 6px; border-right: 1.5px solid var(--accent-ink); border-bottom: 1.5px solid var(--accent-ink); transform: rotate(-45deg); transition: transform .15s ease; align-self: center; margin-right: 2px; }
.ap-tpl-wrap[open] > summary.ap-tpl-header { margin-bottom: 8px; }
.ap-tpl-wrap[open] > summary.ap-tpl-header::before { transform: rotate(45deg); }
summary.ap-tpl-header:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: var(--r-sm); }
/* Vier secties op de assistentpagina */
.ap-secties { display: flex; gap: 4px; padding: 4px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md); position: sticky; top: 0; z-index: 3; }
.ap-sec-knop { flex: 1; padding: 9px 12px; border: 0; border-radius: var(--r-sm); background: none; color: var(--text-secondary); font: inherit; font-weight: 600; font-size: 0.8667rem; cursor: pointer; white-space: nowrap; }
.ap-sec-knop:hover { color: var(--text-primary); }
.ap-sec-knop[aria-selected="true"] { background: var(--accent); color: var(--on-accent); }
.ap-sec-knop:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ap-sectie { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.ap-sectie[hidden] { display: none; }
.ap-tpl-title { font-size: 0.7333rem; font-weight: 700; color: var(--accent-ink); text-transform: uppercase; letter-spacing: .06em; }
.ap-tpl-sub { font-size: 0.7333rem; color: var(--text-muted); }
.ap-tpl-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 8px;
}
.ap-tpl-card {
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); padding: 10px 12px; cursor: pointer;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease; text-align: left; font-family: inherit;
  display: flex; flex-direction: column; gap: 4px; min-height: 72px;
}
.ap-tpl-card:hover {
  border-color: var(--accent-bright);
  background: rgba(var(--accent-rgb),.06);
  transform: translateY(-1px);
}
.ap-tpl-card.active {
  border-color: var(--accent-bright);
  background: rgba(var(--accent-rgb),.12);
}
.ap-tpl-card.recommended {
  border-color: rgba(var(--success-rgb),.5);
  background: rgba(var(--success-rgb),.05);
  position: relative; padding-top: 22px;
}
.ap-tpl-card-rec {
  position: absolute; top: 4px; left: 8px; right: 8px;
  font-size: 0.6rem; font-weight: 700; color: var(--green-ink);
  text-transform: uppercase; letter-spacing: .04em;
}
.ap-tpl-card-label {
  display: flex; align-items: center; gap: 6px;
  font-size: 0.7333rem; font-weight: 700; color: var(--text-primary);
}
.ap-tpl-card-emoji { font-size: 0.8667rem; }
.ap-tpl-card-preview {
  font-size: 0.7333rem; color: var(--text-muted); line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden;
}
.ap-actions { display: flex; align-items: center; gap: 12px; padding-top: 4px; }
.ap-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 10px 16px; background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8667rem; font-weight: 600;
  cursor: pointer; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease; font-family: inherit;
}
.ap-btn:hover { border-color: var(--accent-bright); }
.ap-btn-primary { background: linear-gradient(135deg, var(--accent), var(--accent-bright)); border-color: transparent; color: var(--on-accent); }
.ap-btn-primary:hover { opacity: .9; }
.ap-btn:disabled { opacity: .5; cursor: not-allowed; }
.ap-saved-mark { font-size: 0.8rem; color: var(--green-ink); opacity: 0; transition: opacity .25s ease; }
.ap-saved-mark.visible { opacity: 1; }

.ap-preview-col { position: relative; }
.ap-preview-sticky { position: sticky; top: 80px; display: flex; flex-direction: column; gap: 16px; }
.ap-preview-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md); padding: 18px; }
.ap-phone-mock {
  background: #0a1a17; border-radius: var(--r-md); overflow: hidden;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  display: flex; flex-direction: column; max-height: 520px;
}
.ap-phone-hdr { display: flex; align-items: center; gap: 10px; padding: 14px 16px; background: #1f2c2a; border-bottom: 1px solid rgba(255,255,255,.05); }
.ap-phone-back { color: #9B968B; font-size: 1.4667rem; line-height: 1; }
.ap-phone-avatar {
  width: 36px; height: 36px; border-radius: 50%;
  background: var(--accent); color: var(--on-accent);
  display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.9333rem;
}
.ap-phone-info { flex: 1; min-width: 0; }
.ap-phone-name { font-size: 0.9333rem; font-weight: 600; color: var(--zand-50); }
.ap-phone-status { font-size: 0.7333rem; color: #9B968B; }
.ap-phone-msgs {
  flex: 1; padding: 16px;
  background: #0e1d1b url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E%3Cpath d='M0 0h40v40H0z' fill='none'/%3E%3Cpath d='M20 20h.01' stroke='%23ffffff09' stroke-width='2'/%3E%3C/svg%3E");
  display: flex; flex-direction: column; gap: 8px; overflow-y: auto;
}
.ap-msg-day-divider { align-self: center; background: rgba(255,255,255,.06); color: #9B968B; font-size: 0.7333rem; padding: 3px 10px; border-radius: var(--r-full); margin-bottom: 4px; }
.ap-msg {
  max-width: 80%; padding: 8px 12px; border-radius: var(--r-sm);
  font-size: 0.9333rem; line-height: 1.4; color: #e8edec;
  white-space: pre-wrap; word-wrap: break-word;
}
.ap-msg-them { align-self: flex-start; background: #1f2c2a; border-bottom-left-radius: 2px; }

.ap-formlink-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md); padding: 18px; }
.ap-formlink-url-row { display: flex; gap: 8px; margin-top: 12px; align-items: stretch; }
.ap-formlink-url {
  flex: 1; min-width: 0; padding: 9px 12px;
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  color: var(--accent-ink); font-size: 0.8rem; font-family: monospace;
  display: flex; align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ap-formlink-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.ap-formlink-link {
  display: inline-flex; align-items: center; gap: 5px;
  background: transparent; border: 1px solid var(--border); border-radius: var(--r-xs);
  padding: 6px 10px; font-size: 0.8rem; font-weight: 600;
  color: var(--text-muted); text-decoration: none; cursor: pointer; font-family: inherit;
  transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.ap-formlink-link:hover { color: var(--accent-ink); border-color: var(--accent-bright); }
.ap-formlink-qr {
  margin-top: 12px; padding: 14px; background: var(--zand-50); border-radius: var(--r-sm);
  display: flex; flex-direction: column; align-items: center;
}
.ap-formlink-qr img { display: block; }
.ap-formlink-embed { margin-top: 12px; }
.ap-formlink-embed-code {
  font-family: monospace; font-size: 0.7333rem; line-height: 1.5;
  resize: none; white-space: pre; min-height: auto;
}
.ap-test-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-md); padding: 18px; }
.ap-test-title { font-size: 0.9333rem; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; }
.ap-test-sub { font-size: 0.8rem; color: var(--text-muted); margin: 0 0 12px; line-height: 1.5; }
.ap-test-row { display: flex; gap: 8px; }
.ap-test-row .ap-input { flex: 1; }
.ap-test-result { font-size: 0.8rem; margin-top: 10px; min-height: 16px; }
.ap-test-result.ok  { color: var(--green-ink); }
.ap-test-result.err { color: var(--red-ink); }

/* ── AI-beeld page (Phase 4 property images) ─────────────────────────────
   Reuses the ap-* token classes above (field/label/hint/chip/btn/tpl-card)
   for visual consistency with AI Persoonlijkheid, only the pieces with no
   existing analog (dropzone, gallery, AI-label badge) get new rules here. */
.pi-dropzone {
  border: 2px dashed var(--border); border-radius: var(--r-md);
  background: var(--bg-card-alt); padding: 20px; text-align: center;
  cursor: pointer; transition: border-color .15s ease, background .15s ease;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  min-height: 140px; justify-content: center;
}
.pi-dropzone:hover, .pi-dropzone.dragover { border-color: var(--accent-bright); background: rgba(var(--accent-rgb),.06); }
.pi-dropzone.has-image { border-style: solid; padding: 0; overflow: hidden; }
.pi-dropzone-placeholder { color: var(--text-muted); font-size: 0.8667rem; }
.pi-dropzone-placeholder b { color: var(--text-primary); }
.pi-dropzone img { display: block; width: 100%; max-height: 320px; object-fit: contain; background: var(--bg); }
.pi-dropzone-remove {
  margin-top: 8px; background: transparent; color: var(--text-muted); border: 0;
  font-size: 0.8rem; cursor: pointer; text-decoration: underline; font-family: inherit;
}
.pi-dropzone-remove:hover { color: var(--red, var(--error)); }
.pi-style-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; }
.pi-style-card {
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 10px 12px; cursor: pointer; text-align: center; font-family: inherit;
  font-size: 0.8rem; font-weight: 700; color: var(--text-primary); transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.pi-style-card:hover { border-color: var(--accent-bright); }
.pi-style-card.active { border-color: var(--accent-bright); background: rgba(var(--accent-rgb),.15); color: var(--accent-ink); }
.pi-result-wrap { margin-top: 16px; }
.pi-result-wrap.is-nieuw { animation: pi-in 200ms ease both; }
@keyframes pi-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* Generatietoestand: de eigen foto onder een sluier met een langzame lichtveeg
   (onbepaald), Faro's merk in de hoek, en een echte teller. Eén kaart, geen
   spinner in een knop. Mislukt = dezelfde kaart met uitleg en één knop. */
.pi-gen {
  margin-top: 16px;
  display: grid;
  grid-template-columns: minmax(0, 220px) minmax(0, 1fr);
  gap: var(--sp-4);
  align-items: center;
  padding: var(--sp-4);
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius-card);
}
.pi-gen[hidden] { display: none; }
.pi-gen-stage { position: relative; aspect-ratio: 4 / 3; overflow: hidden; border-radius: var(--radius-btn); background: var(--bg-alt); }
.pi-gen-src { width: 100%; height: 100%; object-fit: cover; display: block; }
.pi-gen-veil { position: absolute; inset: 0; background: var(--bg); opacity: 0.55; }
.pi-gen-sweep {
  position: absolute; inset: 0;
  background: linear-gradient(100deg, transparent 30%, rgba(var(--accent-rgb), 0.35) 50%, transparent 70%);
  transform: translateX(-100%);
}
.pi-gen.is-bezig .pi-gen-sweep { animation: pi-sweep 2.2s ease-in-out infinite; }
@keyframes pi-sweep { to { transform: translateX(100%); } }
.pi-gen-faro { position: absolute; right: var(--sp-2); bottom: var(--sp-2); width: 44px; height: 44px; border-radius: 50%; border: 1px solid var(--border-strong); background: var(--card); }
.pi-gen.is-mislukt .pi-gen-veil { opacity: 0.75; }
.pi-gen.is-mislukt .pi-gen-faro { filter: grayscale(1); opacity: 0.7; }
.pi-gen-title { font-weight: 600; font-size: 1rem; color: var(--text); }
.pi-gen-sub { margin-top: var(--sp-1); font-size: 0.8667rem; color: var(--text-muted); line-height: 1.5; }
.pi-gen-meta { margin-top: var(--sp-3); font-size: 0.8rem; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.pi-gen.is-mislukt .pi-gen-meta { display: none; }
.pi-gen.is-mislukt .pi-gen-title { color: var(--error-ink); }
.pi-gen-actions { margin-top: var(--sp-3); }
.pi-gen-actions[hidden] { display: none; }
@media (max-width: 700px) { .pi-gen { grid-template-columns: 1fr; } }
@media (prefers-reduced-motion: reduce) {
  .pi-gen.is-bezig .pi-gen-sweep { animation: none; transform: none; opacity: 0.5; }
  .pi-result-wrap.is-nieuw { animation: none; }
}
.pi-result-img-wrap { border-radius: var(--r-md); overflow: hidden; border: 1px solid var(--border); background: var(--bg); }
.pi-result-img-wrap img { display: block; width: 100%; }
.pi-ai-badge {
  display: flex; align-items: center; gap: 6px; font-size: 0.7333rem; font-weight: 600;
  color: var(--warning-ink); background: rgba(var(--warning-rgb),.10);
  border: 1px solid rgba(var(--warning-rgb),.3); border-radius: var(--r-sm);
  padding: 7px 10px; margin-top: 8px; line-height: 1.4;
}
.pi-gallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 14px; margin-top: 14px; }
.pi-gallery-item { border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; background: var(--bg-card); }
.pi-gallery-item img { display: block; width: 100%; aspect-ratio: 1; object-fit: cover; }
.pi-gallery-item-body { padding: 8px 10px 10px; }
.pi-gallery-item-style { font-size: 0.7333rem; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; }
.pi-gallery-item-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 8px; }
.pi-gallery-toggle {
  background: transparent; border: 1px solid var(--border); color: var(--text-muted);
  font-size: 0.6667rem; font-weight: 700; text-transform: uppercase; letter-spacing: .03em;
  padding: 4px 8px; border-radius: var(--r-xs); cursor: pointer; font-family: inherit; transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.pi-gallery-toggle:hover { border-color: var(--accent-bright); color: var(--accent-ink); }
.pi-empty { color: var(--text-muted); font-size: 0.8667rem; padding: 24px 0; text-align: center; }
.pi-empty-sub { margin-top: var(--sp-1); font-size: 0.8667rem; color: var(--text-muted); line-height: 1.5; }

/* Room-type chips, smaller sibling of pi-style-card, same visual language */
.pi-roomtype-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(110px, 1fr)); gap: 8px; }
.pi-roomtype-card {
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 8px 10px; cursor: pointer; text-align: center; font-family: inherit;
  font-size: 0.8rem; font-weight: 600; color: var(--text-secondary); transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
}
.pi-roomtype-card:hover { border-color: var(--accent-bright); }
.pi-roomtype-card.active { border-color: var(--accent-bright); background: rgba(var(--accent-rgb),.15); color: var(--accent-ink); font-weight: 700; }
.pi-roomtype-card:disabled, .pi-roomtype-card.disabled {
  opacity: .4; cursor: not-allowed; border-color: var(--border);
}
.pi-roomtype-card:disabled:hover, .pi-roomtype-card.disabled:hover { border-color: var(--border); }

/* Visual-controls: the "Meer opties" panel (furniture/walls/floor/lighting/
   renovation depth). Reuses <details>/<summary> exactly like the AI
   Persoonlijkheid page's .ap-photo-advanced, same collapsed-by-default
   pattern, so uploading a photo + picking a style + clicking Generate stays
   a two-click flow, and every axis in here is a deliberate opt-in. */
.pi-advanced-details { margin-top: 14px; }
.pi-advanced-details > summary {
  cursor: pointer; user-select: none; list-style: none;
  display: flex; align-items: center; gap: 6px;
  font-size: 0.8rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
  color: var(--text-muted); padding: 4px 0;
}
.pi-advanced-details > summary::-webkit-details-marker { display: none; }
.pi-advanced-details > summary:hover { color: var(--accent-ink); }
.pi-advanced-details > summary::before {
  content: '▸'; font-size: 0.6667rem; transition: transform .15s ease;
}
.pi-advanced-details[open] > summary::before { transform: rotate(90deg); }
.pi-advanced-body { display: flex; flex-direction: column; gap: 14px; margin-top: 12px; }

/* Wall-colour swatches, small curated palette, NOT a free colour picker
   (see api/_images.js's WALL_COLORS header for why). Each chip shows the
   actual colour as a quick visual reference plus the Dutch label. */
.pi-color-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 8px; }
.pi-color-card {
  background: var(--bg-card-alt); border: 1px solid var(--border); border-radius: var(--r-sm);
  padding: 7px 10px; cursor: pointer; text-align: left; font-family: inherit;
  font-size: 0.8rem; font-weight: 600; color: var(--text-secondary); transition: color .15s ease, background-color .15s ease, border-color .15s ease, opacity .15s ease;
  display: flex; align-items: center; gap: 8px;
}
.pi-color-card:hover { border-color: var(--accent-bright); }
.pi-color-card.active { border-color: var(--accent-bright); background: rgba(var(--accent-rgb),.15); color: var(--accent-ink); font-weight: 700; }
.pi-color-swatch-dot {
  width: 16px; height: 16px; border-radius: 50%; flex-shrink: 0;
  border: 1px solid rgba(255,255,255,.25); box-shadow: inset 0 0 0 1px rgba(0,0,0,.15);
}
.pi-color-note-input { margin-top: 8px; }

/* Honesty note, shown only when "Volledige renovatie" is selected. Uses the
   warning tokens (same family as the credit-usage bar's 80% state, see
   DESIGN-SYSTEM.md's deliberate warning/accent split) so it reads as an
   active caution, not a neutral hint. */
.pi-honesty-note {
  display: flex; gap: 8px; align-items: flex-start; font-size: 0.8rem; line-height: 1.5;
  color: var(--text-secondary); background: rgba(var(--warning-rgb),.08);
  border: 1px solid rgba(var(--warning-rgb),.28); border-radius: var(--r-sm);
  padding: 10px 12px; margin-top: 8px;
}
.pi-honesty-note b { color: var(--warning-ink); }

/* Before/after comparison slider, a single native <input type=range>
   (transparent, full-bleed) drives a clip-path on the "after" image so the
   drag/keyboard/touch handling is the browser's own accessible range input,
   never hand-rolled pointer math. The AI badge stays a separate, always-
   visible element below (never inside the draggable area) so it can never
   be dragged out of view, EU AI Act Art. 50(4), see api/_images.js header. */
.pi-compare-stage {
  position: relative; width: 100%; aspect-ratio: 1; border-radius: var(--r-md); overflow: hidden;
  border: 1px solid var(--border); background: var(--bg);
}
.pi-compare-img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  display: block; pointer-events: none; user-select: none;
}
.pi-compare-after { clip-path: inset(0 0 0 50%); }
.pi-compare-tag {
  position: absolute; top: 8px; font-size: 0.6667rem; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; padding: 4px 8px; border-radius: var(--r-xs);
  background: rgba(23,20,15,.62); color: var(--warm-sand); pointer-events: none;   /* warm scrim, geen neutraal zwart/wit */
}
.pi-compare-tag.before { left: 8px; }
.pi-compare-tag.after { right: 8px; }
.pi-compare-handle {
  position: absolute; top: 0; bottom: 0; width: 2px; left: 50%; transform: translateX(-1px);
  background: var(--accent-bright); pointer-events: none; box-shadow: 0 0 0 1px rgba(0,0,0,.3);
}
.pi-compare-handle::after {
  content: ''; position: absolute; top: 50%; left: 50%; width: 32px; height: 32px;
  border-radius: 50%; background: var(--accent-bright); transform: translate(-50%,-50%);
  box-shadow: 0 2px 6px rgba(0,0,0,.35);
}
.pi-compare-range {
  position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0;
  cursor: ew-resize; -webkit-appearance: none; appearance: none;
}
.pi-result-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; }

.settings-wrap { width: 100%; max-width: none; display: flex; flex-direction: column; gap: 20px; }
.settings-section {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  overflow: hidden;
}
.settings-section-title {
  padding: 16px 20px 14px;
  border-bottom: 1px solid var(--border);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.083em;
  color: var(--text-muted);
  display: flex;
  align-items: center;
  gap: 8px;
}
.settings-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 20px;
  border-bottom: 1px solid var(--border);
  gap: 20px;
}
.settings-row:last-child { border-bottom: none; }
.settings-label {
  font-size: 0.8667rem;
  color: var(--text-primary);
  font-weight: 500;
  flex-shrink: 0;
}
/* De kwaliteitswaarschuwing van Meta bij een eigen WhatsApp-nummer. Alleen
   zichtbaar bij YELLOW of RED -- zie api/dashboard.js waar hij gevuld wordt.
   Amber als aandachtspunt, rood als het echt om beperking of blokkade gaat. */
.set-waes-kwaliteit {
  margin-top: 8px;
  padding: 10px 12px;
  border-radius: var(--r-sm);
  font-size: 0.8125rem;
  line-height: 1.55;
  color: var(--warning-ink, #8A6A33);
  background: rgba(224, 160, 63, 0.10);
  border: 1px solid rgba(224, 160, 63, 0.28);
}
.set-waes-kwaliteit.ernstig {
  color: var(--error-ink, #B91C1C);
  background: rgba(220, 38, 38, 0.10);
  border-color: rgba(220, 38, 38, 0.30);
}

.settings-label-sub {
  font-size: 0.8rem;
  color: var(--text-muted);
  margin-top: 2px;
}
.settings-value {
  font-size: 0.8667rem;
  color: var(--text-secondary);
  text-align: right;
}
.settings-input {
  background: var(--bg-card-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-sm);
  color: var(--text-primary);
  font-size: 0.8667rem;
  font-family: 'Inter', sans-serif;
  padding: 7px 12px;
  outline: none;
  transition: border-color 0.15s;
  width: 220px;
}
.settings-input:focus { border-color: var(--blue-bright); }
.settings-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 0.8rem;
  color: var(--text-muted);
}
.settings-coming-soon {
  display: inline-flex;
  align-items: center;
  padding: 2px 10px;
  border-radius: var(--r-lg);
  font-size: 0.6667rem;
  font-weight: 600;
  background: rgba(var(--warning-rgb),0.1);
  border: 1px solid rgba(var(--warning-rgb),0.25);
  color: var(--orange-ink);
  letter-spacing: 0.05em;
}
.settings-danger .settings-label { color: var(--red-ink); }
.settings-info-box {
  margin: 0 20px 16px;
  padding: 14px;
  background: rgba(var(--accent-rgb),0.06);
  border-left: 1px solid var(--border-c);
  border-radius: 0 8px 8px 0;
  font-size: 0.8667rem;
  color: var(--text-secondary);
  line-height: 1.55;
}
.settings-apikey {
  font-family: monospace;
  font-size: 0.8667rem;
  color: var(--text-secondary);
  letter-spacing: 0.038em;
}
.btn-show-key {
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--r-xs);
  color: var(--text-muted);
  font-size: 0.7333rem;
  padding: 3px 8px;
  cursor: pointer;
  transition: var(--transition);
  margin-left: 8px;
}
.btn-show-key:hover { border-color: var(--blue-bright); color: var(--accent-ink); }

/* ============================================================
   ACTIVITEIT (ACTIVITY FEED)
   ============================================================ */
.activity-feed {
  display: flex;
  flex-direction: column;
  gap: 0;
  width: 100%;
}
.activity-item {
  display: flex;
  align-items: flex-start;
  gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid var(--border);
}
.activity-item:last-child { border-bottom: none; }
.activity-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  flex-shrink: 0;
  margin-top: 4px;
}
.activity-dot-new       { background: #989287; }
.activity-dot-qualified { background: var(--cyan); box-shadow: 0 0 8px rgba(188,159,95,0.5); }
.activity-dot-booked    { background: var(--green); box-shadow: 0 0 8px rgba(var(--success-rgb),0.5); }
.activity-dot-won       { background: var(--blue-bright); box-shadow: 0 0 8px rgba(var(--accent-rgb),0.5); }
.activity-dot-dealer    { background: var(--orange); box-shadow: 0 0 8px rgba(var(--warning-rgb),0.5); }
.activity-content { flex: 1; }
.activity-title {
  font-size: 0.8667rem;
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: 2px;
}
.activity-sub {
  font-size: 0.8rem;
  color: var(--text-muted);
}
.activity-time {
  font-size: 0.7333rem;
  color: var(--text-muted);
  flex-shrink: 0;
  margin-top: 2px;
  white-space: nowrap;
}
.activity-feed-wrap {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 20px 24px;
  width: 100%;
}
/* De voetnoot over de pipelinewaarde hoort bij de cijfers; zonder cijfers hing hij los in de lege ruimte. */
#resultaten-grid:has(.empty-state) ~ .res-voetnoot { display: none; }
.revenue-goal-card[hidden] { display: none; }
.activity-aantal { font-size: 0.7333rem; font-weight: 700; margin-left: 6px; padding: 1px 7px; border-radius: var(--r-lg); background: rgba(var(--accent-rgb), 0.14); color: var(--accent-ink); }
.activity-feed-header {
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.083em;
  color: var(--text-muted);
  margin-bottom: 4px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--border);
}

/* ============================================================
   PAGES VISIBILITY
   ============================================================ */
.page { display: none !important; }
.page.active { display: block !important; }
#page-kalender.active { display: flex !important; flex-direction: row; }

/* ── De overgang tussen schermen ──────────────────────────────────────────
   Hier gebeurde niets. Van scherm wisselen was display:none naar
   display:block: een harde knip, waarbij de hele inhoud in één frame vervangen
   wordt. Er is dan geen enkel signaal dat er iets NIEUWS is gekomen -- het oog
   ziet alleen dat alles anders is, en moet zelf uitzoeken of er iets geladen
   is of dat er iets stukging.

   display laat zich niet animeren, dus dit is een keyframe op het binnenkomende
   scherm en geen transition. Hij speelt vanzelf opnieuw bij elke navigatie,
   want .active wordt dan opnieuw gezet.

   Zes pixels en 200 ms. Bewust weinig: dit is gereedschap waar iemand de hele
   dag doorheen klikt, en een overgang die je OPMERKT wordt na de tiende keer
   vertraging. Hij hoort alleen het gat te vullen tussen "ik klikte" en "er
   staat iets anders".

   De beweging gaat OMHOOG, niet opzij. Zijwaarts suggereert een richting
   (vooruit, terug) en die is er niet: de zijbalk is geen volgorde. Omhoog leest
   als "hier komt iets", zonder een verhaal te vertellen dat niet klopt. */
@keyframes paginaBinnen {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}
.page.active { animation: paginaBinnen var(--dur-base, 220ms) var(--ease-out, cubic-bezier(0.4,0,0.2,1)) both; }

/* Wie beweging heeft uitgezet, krijgt het scherm meteen. Geen halve animatie
   en geen vertraging: dan is de knip juist het gewenste gedrag. */
@media (prefers-reduced-motion: reduce) {
  .page.active { animation: none; }
}
.cal-main { flex: 1; display: flex; flex-direction: column; overflow: hidden; min-width: 0; }
.cal-right-sidebar {
  width: 272px; flex-shrink: 0; border-left: 1px solid var(--border);
  background: var(--bg-card); display: flex; flex-direction: column; overflow: hidden;
}
.cal-sidebar-header {
  padding: 14px 14px 0; display: flex; align-items: center; gap: 8px; flex-shrink: 0;
}
.cal-sidebar-title {
  font-size: 0.8rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; color: var(--text-primary); flex: 1;
}
.cal-sidebar-count {
  font-size: 0.7333rem; font-weight: 700; padding: 2px 8px;
  border-radius: var(--r-lg); background: rgba(var(--error-rgb),0.15); color: var(--red-ink);
}
.cal-sidebar-desc {
  padding: 4px 14px 10px; font-size: 0.7333rem; color: var(--text-muted);
  border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.cal-sidebar-scroll {
  flex: 1; overflow-y: auto; padding: 10px 10px; display: flex;
  flex-direction: column; gap: 8px;
}
.cal-sidebar-empty {
  padding: 28px 14px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; line-height: 1.6;
}
.cal-call-item {
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); padding: 11px 12px; transition: border-color 0.15s;
  cursor: pointer;
}
.cal-call-item:hover { border-color: var(--accent); }
.cal-call-header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.cal-call-avatar {
  width: 30px; height: 30px; border-radius: var(--r-xs);
  background: var(--accent);
  display: flex; align-items: center; justify-content: center;
  font-size: 0.6667rem; font-weight: 700; color: var(--on-accent); flex-shrink: 0;
}
.cal-call-name {
  font-size: 0.8667rem; font-weight: 600; color: var(--text-primary);
  flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cal-call-score { font-size: 0.7333rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--accent-ink); }
.cal-call-phone-link {
  display: flex; align-items: center; gap: 7px; padding: 8px 10px;
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius-sm); margin-bottom: 7px;
  text-decoration: none; color: var(--text-primary);
  font-size: 0.8667rem; font-weight: 700; transition: border-color 0.15s, color 0.15s;
  font-family: 'Inter', sans-serif;
}
.cal-call-phone-link:hover { border-color: var(--green); color: var(--green-ink); }
.cal-call-actions { display: flex; gap: 6px; }
.cal-call-btn {
  flex: 1; padding: 6px 6px; border-radius: var(--r-xs);
  border: 1px solid var(--border); background: var(--bg-card);
  color: var(--text-secondary); font-size: 0.7333rem; font-weight: 600;
  cursor: pointer; text-align: center; text-decoration: none;
  transition: var(--transition); font-family: 'Inter', sans-serif;
  display: flex; align-items: center; justify-content: center; gap: 3px;
}
.cal-call-btn:hover { border-color: var(--accent); color: var(--accent-ink); background: rgba(var(--accent-rgb),0.08); }
.cal-call-btn.primary { background: rgba(var(--accent-rgb),0.1); border-color: rgba(var(--accent-rgb),0.25); color: var(--accent-ink); }
.cal-call-btn.primary:hover { background: rgba(var(--accent-rgb),0.2); }
.cal-hour-row { cursor: default; }
.cal-hour-add {
  display: none; position: absolute; top: 50%; right: 6px; transform: translateY(-50%);
  width: 22px; height: 22px; border-radius: var(--r-xs); border: 1px solid rgba(var(--accent-rgb),0.35);
  background: rgba(var(--accent-rgb),0.12); color: var(--accent-ink); font-size: 1.0667rem; font-weight: 300;
  cursor: pointer; align-items: center; justify-content: center; line-height: 1;
  transition: background 0.15s;
}
.cal-hour-add:hover { background: rgba(var(--accent-rgb),0.25); }
.cal-hour-row:hover .cal-hour-add { display: flex; }

/* ── Agenda: dag/week/maand/lijst + zoom (2026-10-03) ─────────────────────
   De rijhoogte komt uit --cal-row-h (gezet door renderCalendar), zodat het
   raster, de urenas en de halfuurlijn samen meeschalen. */
#page-kalender { --cal-row-h: 80px; }
.cal-hour-row, .cal-time-label { height: var(--cal-row-h); }
.cal-hour-row::after { top: calc(var(--cal-row-h) / 2); }
.cal-time-grid { min-height: 0; }
.cal-toolbar-rechts { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.cal-toolbar-rechts .cal-book-btn { margin-left: 0; }
.cal-zoom { display: flex; gap: 4px; }
.cal-zoom[hidden] { display: none; }
.cal-nav-btn:disabled { opacity: 0.4; cursor: default; border-color: var(--border); color: var(--text-primary); }
.cal-views { display: flex; padding: 3px; gap: 2px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg-card); }
.cal-view-btn { padding: 5px 12px; border: 0; border-radius: var(--r-xs); background: none; color: var(--text-secondary); font: inherit; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.cal-view-btn:hover { color: var(--text-primary); }
.cal-view-btn[aria-pressed="true"] { background: var(--accent); color: var(--on-accent); }
.cal-view-btn:focus-visible, .cal-chip:focus-visible, .cal-maand-num:focus-visible, .cal-lijst-rij:focus-visible, .cal-event:focus-visible, .cal-day-header-knop:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.cal-day-header-knop { background: none; border: 0; border-left: 1px solid var(--border); font: inherit; color: inherit; cursor: pointer; width: 100%; }
.cal-day-header-knop:hover .cal-day-num { background: rgba(var(--accent-rgb), 0.14); }
.cal-day-header-knop.cal-today:hover .cal-day-num { background: var(--accent); }
.cal-day-headers[hidden], .cal-scroll-area[hidden], .cal-alt-view[hidden] { display: none; }

/* Afspraakblokken: vlak, geen verloop. Een knop, dus bereikbaar met Tab. */
.cal-event { border: 0; border-left: 3px solid rgba(var(--on-accent-rgb), 0.35); font: inherit; text-align: left; align-items: stretch; box-shadow: 0 1px 4px rgba(0,0,0,0.25); padding: 5px 8px; }
.cal-event:hover { transform: none; filter: brightness(1.06); box-shadow: 0 4px 14px rgba(0,0,0,0.32); }
.cal-event--compact { padding: 3px 6px; justify-content: flex-start; }
/* Trapsgewijs gestapeld: een dunne rand in de achtergrondkleur scheidt ze. */
.cal-day-col .cal-event + .cal-event { outline: 1px solid var(--bg-primary); }
.cal-event-regel { display: flex; gap: 4px; align-items: baseline; min-width: 0; white-space: nowrap; overflow: hidden; }
.cal-event-regel .cal-event-time { flex: none; }
.cal-event-regel .cal-event-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cal-event--geannuleerd { opacity: 0.55; }
.cal-event--geannuleerd .cal-event-name { text-decoration: line-through; }
.cal-event-external { border-left: 3px dashed var(--border-c); opacity: 0.85; }
.cal-event-external:hover { opacity: 1; }
.cal-legenda { display: inline-flex; gap: 14px; margin-left: 10px; font-size: 0.7333rem; color: var(--text-secondary); }
.cal-legenda[hidden] { display: none; }
.cal-legenda-item { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.cal-legenda-blok { width: 14px; height: 10px; border-radius: var(--r-xs); flex: none; }
.cal-legenda-blok--eigen { background: var(--accent); }
.cal-legenda-blok--google { background: repeating-linear-gradient(135deg, var(--bg-card-alt) 0 3px, var(--hover-c) 3px 6px); border: 1px dashed var(--border-c); }
@media (max-width: 1100px) { .cal-legenda { display: none; } }

/* Maand */
.cal-alt-view { flex: 1; min-height: 0; overflow: auto; }
.cal-maand { display: flex; flex-direction: column; height: 100%; min-height: 560px; }
.cal-maand-kop { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); border-bottom: 1px solid var(--border); }
.cal-maand-kop > div { padding: 10px 10px 8px; font-size: 0.7333rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.073em; color: var(--text-muted); }
.cal-maand-grid { flex: 1; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.cal-maand-dag { border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 6px 6px 8px; display: flex; flex-direction: column; gap: 3px; min-width: 0; min-height: 96px; }
.cal-maand-dag:nth-child(7n) { border-right: 0; }
.cal-maand-dag--buiten { background: rgba(0,0,0,0.08); }
.cal-maand-dag--buiten .cal-maand-num { color: var(--text-muted); }
.cal-maand-dagkop { display: flex; align-items: center; justify-content: space-between; margin-bottom: 2px; }
.cal-maand-num { width: 28px; height: 28px; border-radius: 50%; border: 0; background: none; color: var(--text-primary); font: inherit; font-size: 0.8667rem; font-weight: 700; cursor: pointer; }
.cal-maand-num:hover { background: rgba(var(--accent-rgb), 0.14); }
.cal-maand-dag--vandaag .cal-maand-num { background: var(--accent); color: var(--on-accent); }
.cal-maand-plus { width: 22px; height: 22px; border-radius: var(--r-xs); border: 1px solid rgba(var(--accent-rgb), 0.35); background: rgba(var(--accent-rgb), 0.12); color: var(--accent-ink); font: inherit; font-size: 1rem; line-height: 1; cursor: pointer; opacity: 0; transition: opacity .15s ease; }
.cal-maand-dag:hover .cal-maand-plus, .cal-maand-plus:focus-visible { opacity: 1; }
.cal-chip { display: flex; gap: 5px; align-items: baseline; width: 100%; min-width: 0; padding: 3px 6px; border: 0; border-radius: var(--r-xs); background: rgba(var(--accent-rgb), 0.16); color: var(--text-primary); font: inherit; font-size: 0.7333rem; text-align: left; cursor: pointer; white-space: nowrap; overflow: hidden; }
.cal-chip:hover { background: rgba(var(--accent-rgb), 0.28); }
.cal-chip-tijd { flex: none; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--accent-ink); }
.cal-chip-naam { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.cal-chip--extern { background: var(--bg-card-alt); color: var(--text-muted-c); cursor: default; }
.cal-chip--extern .cal-chip-tijd { color: var(--text-muted-c); }
.cal-chip--geannuleerd { opacity: 0.55; }
.cal-chip--geannuleerd .cal-chip-naam { text-decoration: line-through; }
.cal-maand-meer { border: 0; background: none; padding: 2px 6px; color: var(--accent-ink); font: inherit; font-size: 0.7333rem; font-weight: 600; text-align: left; cursor: pointer; }
.cal-maand-meer:hover { text-decoration: underline; }

/* Lijst */
.cal-lijst { max-width: 880px; margin: 0 auto; padding: 18px 20px 40px; display: flex; flex-direction: column; gap: 18px; }
.cal-lijst-kop { display: flex; align-items: center; gap: 8px; margin: 0 0 8px; font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); position: sticky; top: 0; padding: 6px 0; background: var(--bg-primary); z-index: 1; }
.cal-lijst-aantal { font-size: 0.7333rem; font-weight: 700; padding: 1px 8px; border-radius: var(--r-lg); background: rgba(var(--accent-rgb), 0.14); color: var(--accent-ink); }
.cal-lijst-rij { display: grid; grid-template-columns: 110px minmax(0, 1fr) auto; gap: 14px; align-items: center; width: 100%; padding: 12px 14px; margin-bottom: 6px; border: 1px solid var(--border); border-left: 3px solid var(--accent); border-radius: var(--r-sm); background: var(--bg-card); color: var(--text-primary); font: inherit; text-align: left; cursor: pointer; }
.cal-lijst-rij:hover { border-color: rgba(var(--accent-rgb), 0.5); border-left-color: var(--accent); }
.cal-lijst-tijd { font-weight: 700; font-size: 0.8667rem; font-variant-numeric: tabular-nums; }
.cal-lijst-naam { display: flex; flex-direction: column; gap: 2px; min-width: 0; font-weight: 600; font-size: 0.9333rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cal-lijst-tel { font-weight: 400; font-size: 0.8rem; color: var(--text-secondary); }
.cal-lijst-type { font-size: 0.7333rem; color: var(--text-secondary); white-space: nowrap; }
.cal-lijst-rij--extern { border-left-color: var(--border-c); background: var(--bg-card-alt); color: var(--text-muted-c); cursor: default; }
.cal-lijst-rij--geannuleerd { opacity: 0.6; }
.cal-lijst-rij--geannuleerd .cal-lijst-naam { text-decoration: line-through; }
.cal-lijst-leeg { display: flex; flex-direction: column; align-items: center; gap: 14px; padding: 80px 20px; color: var(--text-secondary); }
.cal-lijst-leeg-titel { font-size: 0.9333rem; }

/* ── Attendance banner ────────────────────────────────────────── */
.cal-attendance-banner {
  display: none; flex-shrink: 0;
  background: linear-gradient(135deg,rgba(var(--warning-rgb),0.08),rgba(var(--warning-rgb),0.03));
  border-bottom: 1px solid rgba(var(--warning-rgb),0.2);
  padding: 10px 16px 12px;
}
.cal-attendance-banner.visible { display: block; }
.cal-att-banner-title {
  font-size: 0.7333rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.07em;
  color: var(--orange-ink); margin-bottom: 9px; display: flex; align-items: center; gap: 6px;
}
.cal-att-cards { display: flex; gap: 9px; flex-wrap: wrap; }
.cal-att-card {
  background: var(--bg-card); border: 1px solid rgba(var(--warning-rgb),0.22);
  border-radius: var(--r-sm); padding: 10px 12px;
  display: flex; align-items: center; gap: 12px;
  transition: border-color 0.15s;
}
.cal-att-card:hover { border-color: rgba(var(--warning-rgb),0.4); }
.cal-att-info { min-width: 0; }
.cal-att-name { font-size: 0.8667rem; font-weight: 700; color: var(--text-primary); }
.cal-att-time { font-size: 0.7333rem; color: var(--text-muted); margin-top: 2px; }
.cal-att-btns { display: flex; gap: 6px; flex-shrink: 0; }
.cal-att-btn {
  padding: 5px 13px; border-radius: var(--r-xs); font-size: 0.8rem; font-weight: 700;
  border: 1px solid; cursor: pointer; transition: var(--transition); font-family:'Inter',sans-serif;
}
.cal-att-btn.yes { background:rgba(16,185,129,0.1); border-color:rgba(16,185,129,0.3); color: var(--green-ink); }
.cal-att-btn.yes:hover { background:rgba(16,185,129,0.2); }
/* ── Verzetten en annuleren op de afspraakkaart ──────────────────────────
   Dezelfde maat en vorm als de aanwezigheidsknoppen eronder, want het zijn
   even zware acties op dezelfde kaart. 44px hoog: dit staat ook op een
   telefoon, en WCAG 2.5.8 vraagt 24, maar een knop die je per ongeluk raakt
   annuleert hier een afspraak -- dan is ruim beter dan net genoeg. */
.cal-modal-acties {
  display: flex; gap: 8px; margin-top: 14px;
  padding-top: 14px; border-top: 1px solid var(--divider);
}
.cal-act-btn {
  flex: 1; min-height: 44px; padding: 10px 14px;
  background: var(--bg-card-alt); border: 1px solid var(--border-bright);
  border-radius: var(--r-sm); color: var(--text); font-family: inherit;
  font-size: 0.8667rem; font-weight: 600; cursor: pointer;
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.cal-act-btn:hover:not(:disabled) { background: var(--hover); border-color: var(--accent-bright); }
.cal-act-btn:disabled { opacity: .55; cursor: default; }
.cal-act-btn.cal-act-primair { background: var(--accent-c); color: var(--on-accent); border-color: transparent; }
.cal-act-btn.cal-act-danger  { color: var(--red-ink); border-color: rgba(var(--error-rgb),.35); }
.cal-act-btn.cal-act-danger:hover:not(:disabled) { background: rgba(var(--error-rgb),.10); border-color: var(--red-ink); }

.cal-act-form { margin-top: 12px; }
.cal-act-label { display: block; font-size: 0.8rem; font-weight: 600; color: var(--text); margin-bottom: 6px; }
.cal-act-input {
  width: 100%; box-sizing: border-box; min-height: 44px; padding: 10px 12px;
  background: var(--bg); border: 1px solid var(--border-bright); border-radius: var(--r-sm);
  color: var(--text); font-family: inherit; font-size: 0.9333rem;
  /* Zonder dit tekent de browser de datumkiezer in zijn lichte thema: een wit
     kalendertje uit een donker veld. */
  color-scheme: dark;
}
.cal-act-input:focus-visible { outline: 2px solid var(--accent-bright); outline-offset: 2px; }
.cal-act-sub { margin: 8px 0 0; font-size: 0.8rem; line-height: 1.5; color: var(--text-muted); }
.cal-act-rij { display: flex; gap: 8px; margin-top: 12px; }
.cal-act-status { min-height: 18px; margin-top: 8px; font-size: 0.8rem; line-height: 1.45; }

.cal-att-btn.no  { background:rgba(var(--error-rgb),0.1); border-color:rgba(var(--error-rgb),0.3); color: var(--red-ink); }
.cal-att-btn.no:hover  { background:rgba(var(--error-rgb),0.2); }
.cal-att-followup-input, .cal-att-followup-textarea {
  width:100%; box-sizing:border-box; padding:7px 10px;
  background:var(--bg-card); border:1px solid var(--border);
  border-radius:var(--r-xs); color:var(--text-primary); font-size: 0.8rem;
  font-family:'Inter',sans-serif; outline:none; transition:border-color 0.15s;
}
.cal-att-followup-input:focus, .cal-att-followup-textarea:focus { border-color:var(--accent); }
.cal-att-followup-textarea { resize:vertical; min-height:52px; }
/* Orange pulse dot on calendar events needing attendance */
.cal-event-needs-att {
  position:absolute; top:5px; right:5px; width:8px; height:8px;
  border-radius:50%; background:var(--orange); animation:pulse 1.5s infinite;
}
/* Attendance section in cal event modal */
.cal-modal-att-section {
  margin-top:14px; padding-top:14px; border-top:1px solid var(--border);
}
.cal-modal-att-label {
  font-size: 0.7333rem; font-weight:700; text-transform:uppercase; letter-spacing:0.07em;
  color:var(--text-muted); margin-bottom:9px;
}
.cal-modal-att-btns { display:flex; gap:8px; }
.cal-modal-att-result {
  margin-top:14px; padding:9px 14px; border-radius:var(--r-sm);
  font-size: 0.8667rem; font-weight:700; display:flex; align-items:center; gap:8px;
}
.cal-modal-att-result.yes { background:rgba(16,185,129,0.1); color: var(--green-ink); }
.cal-modal-att-result.no  { background:rgba(var(--error-rgb),0.1);  color: var(--red-ink);   }
.cal-modal-att-result-edit {
  margin-left:auto; font-size: 0.7333rem; font-weight:600; cursor:pointer;
  color:var(--text-muted); text-decoration:underline;
}
/* Follow-up form after marking attendance */
.cal-att-followup {
  margin-top:12px; display:flex; flex-direction:column; gap:10px;
  padding:12px; background:var(--bg-card-alt); border-radius:var(--r-sm);
  border:1px solid var(--border); animation:modalIn 0.15s ease;
}
.cal-att-followup-label {
  font-size: 0.7333rem; font-weight:700; text-transform:uppercase; letter-spacing:0.07em; color:var(--text-muted);
}
.cal-att-followup-input {
  width:100%; box-sizing:border-box; padding:8px 11px;
  background:var(--bg-card); border:1px solid var(--border);
  border-radius:var(--r-sm); color:var(--text-primary); font-size: 0.8667rem;
  font-family:'Inter',sans-serif; transition:border-color 0.15s; outline:none;
}
.cal-att-followup-input:focus { border-color:var(--accent); }
.cal-att-followup-textarea {
  width:100%; box-sizing:border-box; padding:8px 11px;
  background:var(--bg-card); border:1px solid var(--border);
  border-radius:var(--r-sm); color:var(--text-primary); font-size: 0.8667rem;
  font-family:'Inter',sans-serif; transition:border-color 0.15s; outline:none;
  resize:vertical; min-height:72px;
}
.cal-att-followup-textarea:focus { border-color:var(--accent); }
.cal-att-save-btn {
  padding:9px 16px; border-radius:var(--r-sm); border:none; cursor:pointer;
  background:var(--accent); color: var(--on-accent);
  font-size: 0.8667rem; font-weight:700; font-family:'Inter',sans-serif;
  transition:filter 0.15s; text-align:center;
}
.cal-att-save-btn:hover { filter:brightness(1.1); }
.cal-att-save-btn:disabled { opacity:0.5; pointer-events:none; }

/* ── Custom booking modal ─────────────────────────────────────── */
/* ── Credits bijkopen ────────────────────────────────────────────────────── */
#koop-overlay {
  position: fixed; inset: 0; z-index: 1200;
  background: rgba(0,0,0,0.65); backdrop-filter: blur(6px);
  display: none; align-items: center; justify-content: center;
}
#koop-overlay.open { display: flex; }
#koop-modal {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); width: min(500px, 96vw); max-height: 90vh;
  display: flex; flex-direction: column; overflow: hidden;
  box-shadow: var(--elev-3); animation: modalIn 0.18s ease;
}
.koop-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 16px 20px; border-bottom: 1px solid var(--border);
  font-size: 1rem; font-weight: 700; color: var(--text-primary); flex-shrink: 0;
}
.koop-body { flex: 1; overflow-y: auto; padding: 20px; display: flex; flex-direction: column; gap: 10px; }
.koop-label {
  font-size: 0.7333rem; font-weight: 700; letter-spacing: 0.04em;
  text-transform: uppercase; color: var(--text-muted);
}
/* De tegels. Vier bedragen die het gros van de keuzes dekken, met eronder wat
   je ervoor krijgt -- een makelaar kiest op "hoeveel gesprekken", niet op
   "hoeveel euro". De getallen komen van de SERVER (mode credit-quote, veld
   presets); hier staat alleen hoe ze eruitzien. */
.koop-tegels { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
@media (min-width: 440px) { .koop-tegels { grid-template-columns: repeat(4, 1fr); } }
.koop-tegel {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  padding: 10px 11px; text-align: left;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: transparent; color: var(--text-primary);
  cursor: pointer; font-family: inherit; transition: var(--transition);
}
.koop-tegel:hover { background: var(--bg-card-alt); border-color: rgba(var(--accent-rgb),0.35); }
.koop-tegel:focus-visible { outline: 2px solid rgba(var(--accent-rgb),0.55); outline-offset: 2px; }
.koop-tegel.actief {
  border-color: rgba(var(--accent-rgb),0.55);
  background: rgba(var(--accent-rgb),0.10);
}
.koop-tegel-bedrag { font-size: 1rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.koop-tegel.actief .koop-tegel-bedrag { color: var(--accent-ink); }
.koop-tegel-sub { font-size: 0.6667rem; color: var(--text-muted); line-height: 1.4; white-space: nowrap; }
.koop-veld { position: relative; margin-top: 4px; }
.koop-euro {
  position: absolute; left: 12px; top: 50%; transform: translateY(-50%);
  font-size: 1rem; font-weight: 600; color: var(--text-muted); pointer-events: none;
}
.koop-input {
  width: 100%; padding: 11px 12px 11px 30px; font-size: 1.0667rem; font-weight: 600;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary);
  font-family: inherit; font-variant-numeric: tabular-nums;
}
.koop-input:focus { outline: none; border-color: rgba(var(--accent-rgb),0.5); }
.koop-hint { font-size: 0.8rem; color: var(--text-muted); }

/* De samenvatting. Regels met een label links en een bedrag rechts, en de
   totaalregel apart onderaan -- dat is het getal dat straks van de kaart gaat,
   en het hoort het laatste te zijn wat je leest. */
.koop-uitkomst {
  margin-top: 6px; padding: 14px 16px; border-radius: var(--radius-sm);
  background: rgba(var(--accent-rgb),0.08); border: 1px solid rgba(var(--accent-rgb),0.20);
}
.koop-credits {
  font-size: 1.4667rem; font-weight: 700; color: var(--accent-ink);
  font-variant-numeric: tabular-nums;
}
.koop-detail { font-size: 0.8rem; color: var(--text-secondary); line-height: 1.5; margin-top: 3px; }
.koop-rijen { display: flex; flex-direction: column; gap: 6px; margin-top: 12px; }
.koop-rij {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  font-size: 0.8rem; color: var(--text-muted);
}
.koop-rij b { font-weight: 500; color: var(--text-secondary); font-variant-numeric: tabular-nums; white-space: nowrap; }
.koop-rij.totaal {
  margin-top: 2px; padding-top: 9px;
  border-top: 1px solid rgba(var(--accent-rgb),0.22);
  font-size: 0.9333rem; font-weight: 600; color: var(--text-primary);
}
.koop-rij.totaal b { font-size: 1.0667rem; font-weight: 700; color: var(--text-primary); }

/* Het planadvies. Een rustig kaartje, geen banner: het hoort te helpen, niet
   te duwen. De accentkleur zit in de RAND en de kop, nooit als vlak achter
   lopende tekst -- zand op zand leest niet. */
.koop-staffel { display: flex; flex-direction: column; gap: var(--sp-1); margin-top: var(--sp-1); }
.koop-advies {
  display: flex; flex-direction: column; gap: var(--sp-1);
  padding: var(--sp-3);
  border: 1px solid rgba(var(--accent-rgb), 0.30);
  border-radius: var(--r-md);
  background: rgba(var(--accent-rgb), 0.07);
}
.koop-advies strong { font-size: 0.8667rem; color: var(--accent-ink); font-weight: 650; }
.koop-advies span   { font-size: 0.8rem; color: var(--text-secondary); line-height: 1.55; }
.koop-uitleg { font-size: 0.8rem; color: var(--text-muted); line-height: 1.5; margin-top: 4px; }

/* ── Facturatie ──────────────────────────────────────────────────────────────
   Kleuren uit tokens, tekst uit de ink-variant van het vlak eronder. Een
   bedrag mag hier nooit slecht leesbaar zijn: dit is de pagina waar een klant
   naar kijkt als hij twijfelt of hij te veel betaalt. */
/* ── De plannen ──────────────────────────────────────────────────────────
   Drie kaarten naast elkaar, met het huidige plan gemarkeerd. Het accent zit
   in de RAND en in de knop, nooit als vlak achter lopende tekst -- zand als
   ondergrond voor een alinea leest niet, en dat is precies de regel waar dit
   project al twee keer op is misgegaan. */
.fa-plannen { display: flex; flex-direction: column; gap: var(--sp-2); }
.fa-plannen-titel { font-size: 1.0667rem; font-weight: 650; margin: 0; color: var(--text-primary); }
.fa-plannen-sub   { font-size: 0.8667rem; color: var(--text-secondary); margin: 0 0 var(--sp-2); }
.fa-plannen-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--sp-3);
}
.fa-plan {
  display: flex; flex-direction: column; gap: var(--sp-2);
  padding: var(--sp-4);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  background: var(--card);
}
.fa-plan.huidig {
  border-color: rgba(var(--accent-rgb), 0.45);
  box-shadow: 0 0 0 1px rgba(var(--accent-rgb), 0.18);
}
.fa-plan-kop { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); }
.fa-plan-titel { font-size: 1rem; font-weight: 650; color: var(--text-primary); }
.fa-plan-badge {
  font-size: 0.6667rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase;
  color: var(--accent-ink);
  border: 1px solid rgba(var(--accent-rgb), 0.35);
  border-radius: var(--r-full); padding: 2px 8px; white-space: nowrap;
}
.fa-plan-prijs {
  font-size: 1.7333rem; font-weight: 700; color: var(--text-primary);
  font-variant-numeric: tabular-nums; line-height: 1.1;
}
.fa-plan-prijs span { font-size: 0.8667rem; font-weight: 500; color: var(--text-muted); }
.fa-plan-regel { font-size: 0.8667rem; color: var(--text-secondary); line-height: 1.55; }
.fa-plan-knop { margin-top: auto; }

.fa-wrap { display: flex; flex-direction: column; gap: 16px; max-width: 1280px; }
.fa-onder { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: 16px; align-items: start; }
@media (max-width: 1000px) { .fa-onder { grid-template-columns: 1fr; } }
.fa-top { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 780px) { .fa-top { grid-template-columns: 1fr; } }

.fa-card {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); padding: 18px 20px;
  display: flex; flex-direction: column; gap: 6px;
}
.fa-label {
  font-size: 0.7333rem; font-weight: 700; letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--text-muted);
}
.fa-kop { font-size: 1rem; font-weight: 700; color: var(--text-primary); }
.fa-sub { font-size: 0.8rem; color: var(--text-muted); margin-bottom: 8px; }

.fa-plan-naam { font-size: 1.4667rem; font-weight: 700; color: var(--text-primary); margin-top: 4px; }
.fa-plan-sub  { font-size: 0.8667rem; color: var(--text-secondary); line-height: 1.5; }
.fa-plan-acties { margin-top: 12px; display: flex; gap: 8px; flex-wrap: wrap; }

.fa-saldo {
  font-size: 2rem; font-weight: 700; color: var(--text-primary); margin-top: 4px;
  font-variant-numeric: tabular-nums;
}
.fa-saldo-sub { font-size: 0.8667rem; color: var(--text-secondary); }
.fa-balk {
  height: 6px; border-radius: var(--r-full); background: var(--bg-card-alt);
  overflow: hidden; margin-top: 10px;
}
.fa-balk-vul { height: 100%; width: 0; background: var(--accent); transition: width var(--dur-base) var(--ease-out); }
/* Bijna op is een waarschuwing, niet een fout: er werkt nog van alles. */
.fa-balk-vul.fa-bijna { background: rgba(var(--warning-rgb), 0.85); }
.fa-balk-vul.fa-op    { background: rgba(var(--error-rgb), 0.85); }

.fa-rij {
  display: flex; align-items: center; gap: 12px;
  padding: 9px 0; border-top: 1px solid var(--border);
  font-size: 0.8667rem;
}
.fa-rij:first-child { border-top: none; }
.fa-rij-naam { flex: 1; min-width: 0; color: var(--text-primary); }
.fa-rij-detail { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
.fa-rij-bedrag {
  flex: 0 0 auto; font-weight: 700; font-variant-numeric: tabular-nums;
  color: var(--text-primary);
}
.fa-rij-bedrag.fa-plus { color: var(--success-ink); }
.fa-rij-bedrag.fa-min  { color: var(--text-secondary); }
.fa-rij-datum { flex: 0 0 auto; font-size: 0.8rem; color: var(--text-muted); font-variant-numeric: tabular-nums; }
.fa-chip {
  font-size: 0.6667rem; font-weight: 700; letter-spacing: 0.03em;
  padding: 2px 7px; border-radius: var(--r-full); flex: 0 0 auto;
  background: var(--bg-card-alt); color: var(--text-secondary);
}
.fa-mini-balk { height: 4px; border-radius: var(--r-full); background: var(--bg-card-alt); margin-top: 6px; overflow: hidden; }
.fa-mini-vul { height: 100%; background: rgba(var(--accent-rgb), 0.7); }

.fa-leeg { font-size: 0.8667rem; color: var(--text-muted); padding: 14px 0; line-height: 1.6; }
.fa-notice {
  padding: 14px 16px; border-radius: var(--radius-sm);
  background: rgba(var(--accent-rgb),0.08); border: 1px solid rgba(var(--accent-rgb),0.22);
  font-size: 0.8667rem; line-height: 1.55; color: var(--text-secondary);
}
.fa-notice strong { color: var(--accent-ink); }
.fa-notice code {
  font-family: var(--font-mono, ui-monospace, monospace); font-size: 0.8rem;
  padding: 1px 5px; border-radius: var(--r-xs); background: rgba(var(--accent-rgb),0.12); color: var(--accent-ink);
}

/* ── Panden ──────────────────────────────────────────────────────────────────
   Kleuren komen uit tokens, en tekst gebruikt de ink-variant van de kleur die
   eronder ligt -- een groene status staat op een groene chip, niet op de kaart
   eronder. Zie CLAUDE.md. */
.pd-wrap { display: flex; flex-direction: column; gap: 18px; }
.pd-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.pd-head-title { font-size: 1.0667rem; font-weight: 700; color: var(--text-primary); }
.pd-head-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 3px; }

/* Voorraadwaarheid-kaart (voertuigenpagina + startpagina). Warm palet,
   geen gloed: status is een kleine stip, de kaart zelf blijft rustig. */
.inv-card {
  background: var(--bg-card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 14px 16px;
  margin-bottom: 16px;
  display: flex; flex-direction: column; gap: 10px;
}
.inv-card--home { margin-bottom: 14px; }
.inv-kop { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.inv-titelblok { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.inv-titel {
  font-size: 0.7333rem; font-weight: 700; letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--text-muted);
}
.inv-status { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.inv-status-label { font-size: 0.9333rem; font-weight: 650; color: var(--text-primary); }
.inv-sub { font-size: 0.8rem; color: var(--text-muted); }
.inv-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--text-muted); }
.inv-dot--ok { background: var(--success-c); }
.inv-dot--bezig { background: var(--accent-c); }
.inv-dot--let { background: rgb(var(--warning-rgb)); }
.inv-dot--fout { background: rgb(var(--error-rgb)); }
/* ── Setup (2026-09-27) ─────────────────────────────────────────────────────
   Vijf statuskaarten, tabs, en het voorraadpaneel. Alleen bestaande tokens en
   de hoekschaal van Fase 4 (--radius-sm/-btn/-card). */
.su-wrap { display: grid; gap: 20px; }
.su-kaarten { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; }
.su-kaart { display: grid; gap: 6px; text-align: left; padding: 14px 16px; border-radius: var(--radius-card); border: 1px solid var(--border); background: var(--bg-card); color: var(--text-primary); font: inherit; cursor: pointer; min-height: 104px; align-content: start; }
.su-kaart:hover { border-color: rgba(var(--accent-rgb), 0.45); }
.su-kaart:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.su-kaart-kop { display: flex; align-items: center; gap: 8px; font-weight: 700; font-size: 0.9333rem; }
.su-kaart-regel { font-size: 0.8667rem; color: var(--text-secondary); line-height: 1.4; }
.su-kaart-actie { font-size: 0.8rem; font-weight: 600; color: var(--accent-ink, var(--accent)); margin-top: auto; }
.su-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--border); }
.su-dot--ok { background: var(--success-c); }
.su-dot--let { background: rgb(var(--warning-rgb)); }
.su-dot--fout { background: rgb(var(--error-rgb)); }
.su-dot--laden { background: var(--text-secondary); opacity: 0.5; }
/* De kaart is de tab: de gekozen kaart draagt de accentrand en een balk
   onderaan, zodat duidelijk is welk paneel eronder open staat. */
.su-kaart { position: relative; min-height: 0; }
.su-kaart[aria-selected="true"] { border-color: var(--accent); background: rgba(var(--accent-rgb), 0.08); }
.su-kaart[aria-selected="true"]::after { content: ''; position: absolute; left: 16px; right: 16px; bottom: -1px; height: 2px; border-radius: var(--radius-sm); background: var(--accent); }
.su-kaart[hidden], .su-kaart-actie[hidden] { display: none; }
.su-paneel { display: grid; gap: 16px; }
.su-paneel[hidden], .su-bron-invoer[hidden] { display: none; }
.su-blok { display: grid; gap: 12px; padding: 16px 18px; }
.su-blok-kop { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; flex-wrap: wrap; }
.su-blok-titel { font-weight: 700; font-size: 1rem; color: var(--text-primary); }
.su-sub-titel { font-weight: 700; font-size: 0.8667rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.06em; margin-top: 4px; }
.su-bronnen { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px; }
.su-bron { position: relative; display: grid; gap: 4px; padding: 12px 14px 12px 40px; border-radius: var(--radius-card); border: 1px solid var(--border); background: var(--bg-card-alt); cursor: pointer; }
/* Een rondje per kaart, gevuld bij de gekozen bron. Alleen een tint maakte de
   gekozen kaart in het lichte thema lichter dan de rest: je zag niet wat aan stond. */
.su-bron::before { content: ''; position: absolute; left: 14px; top: 14px; width: 16px; height: 16px; border-radius: 50%; border: 2px solid var(--border); background: var(--card); box-sizing: border-box; }
.su-bron--aan { border-color: var(--c-sand); box-shadow: inset 0 0 0 1px var(--c-sand); background: rgba(var(--accent-rgb), 0.12); }
.su-bron--aan::before { border-color: var(--c-sand); background: radial-gradient(circle, var(--c-sand) 0 4px, var(--card) 4.5px); }
.su-bron-elders { margin-top: 8px; }
.su-bron input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.su-bron:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
.su-bron-titel { font-weight: 700; font-size: 0.9333rem; color: var(--text-primary); }
.su-bron-uitleg { font-size: 0.8667rem; color: var(--text-secondary); line-height: 1.45; }
.su-bron-invoer { display: grid; gap: 6px; }
.su-tabel-wrap { overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius-btn); }
.su-tabel { width: 100%; border-collapse: collapse; font-size: 0.8667rem; font-variant-numeric: tabular-nums; }
.su-tabel th, .su-tabel td { padding: 8px 10px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; }
.su-tabel th { color: var(--text-secondary); font-weight: 600; font-size: 0.8rem; }
.su-tabel tr:last-child td { border-bottom: 0; }
.su-rij-fout td { color: var(--red-ink); }
.su-code { margin: 0; padding: 12px 14px; border-radius: var(--radius-btn); background: var(--bg-card-alt); border: 1px solid var(--border); font-size: 0.8rem; white-space: pre-wrap; word-break: break-all; color: var(--text-primary); }
.su-feed-url { font-size: 0.8rem; word-break: break-all; }
@media (max-width: 520px) {
  .su-kaarten { grid-template-columns: 1fr 1fr; }
}
.inv-dot--onbekend { background: transparent; border: 1.5px solid var(--text-muted); }
.inv-sync {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 14px; min-height: 36px;
  border-radius: var(--r-sm); border: 1px solid var(--border);
  background: var(--bg-card-alt); color: var(--text-primary);
  font: inherit; font-size: 0.8333rem; font-weight: 600; cursor: pointer;
  transition: background 120ms ease-out, border-color 120ms ease-out, transform 100ms ease-out;
}
.inv-sync:hover:not([disabled]) { border-color: rgba(var(--accent-rgb),0.45); background: rgba(var(--accent-rgb),0.08); }
.inv-sync:active:not([disabled]) { transform: scale(0.97); }
.inv-sync:focus-visible { outline: 2px solid var(--accent-c); outline-offset: 2px; }
.inv-sync[disabled] { opacity: 0.7; cursor: progress; }
.inv-spin { animation: inv-draai 900ms linear infinite; }
@keyframes inv-draai { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .inv-spin { animation: none; } }
.inv-cijfers { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: 0.8rem; color: var(--text-secondary); }
.inv-let {
  font-size: 0.8rem; line-height: 1.5; color: var(--orange-ink);
  padding: 8px 10px; border-radius: var(--r-sm);
  background: rgba(var(--warning-rgb),0.08); border: 1px solid rgba(var(--warning-rgb),0.25);
}
.inv-fout {
  font-size: 0.8rem; line-height: 1.5; color: var(--error-ink);
  padding: 8px 10px; border-radius: var(--r-sm);
  background: rgba(var(--error-rgb),0.08); border: 1px solid rgba(var(--error-rgb),0.25);
}
@media (max-width: 560px) {
  .inv-kop { align-items: stretch; }
  .inv-sync { width: 100%; justify-content: center; }
}
/* Kanalen in Gesprekken + e-mail (automotive engine). Zelfde warme tokens,
   geen nieuwe kleuren; status in tekstkleur, niet in gloed. */
.conv-kanalen {
  display: flex; gap: 4px; padding: 8px 10px; flex-shrink: 0;
  border-bottom: 1px solid var(--border); overflow-x: auto; scrollbar-width: none;
}
.conv-kanalen::-webkit-scrollbar { display: none; }
.conv-kanaal {
  position: relative; display: inline-flex; align-items: center; gap: 5px;
  padding: 6px 10px; min-height: 32px; border-radius: var(--r-sm); border: 1px solid transparent;
  background: transparent; color: var(--text-muted); font: inherit; font-size: 0.8rem; font-weight: 600;
  cursor: pointer; white-space: nowrap; transition: background 120ms ease-out, color 120ms ease-out;
}
.conv-kanaal:hover { background: var(--card-elevated); color: var(--text-primary); }
.conv-kanaal.actief { background: rgba(var(--accent-rgb),0.12); border-color: rgba(var(--accent-rgb),0.3); color: var(--accent-ink); }
.conv-kanaal:focus-visible { outline: 2px solid var(--accent-c); outline-offset: 1px; }
.conv-kanaal-tel { font-weight: 500; opacity: 0.75; font-variant-numeric: tabular-nums; }
.conv-kanaal-stip { width: 6px; height: 6px; border-radius: 50%; background: var(--accent-c); }
.conv-kanaal-tag {
  display: inline-block; padding: 1px 7px; margin-right: 6px; border-radius: var(--r-xs);
  background: var(--bg-card-alt); border: 1px solid var(--border);
  font-size: 0.7rem; font-weight: 600; color: var(--text-secondary); vertical-align: 1px;
}
.conv-kanaal-tag.mens { color: var(--accent-ink); border-color: rgba(var(--accent-rgb),0.3); }
.conv-kanaal-leeg { padding: 24px 20px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; display: flex; flex-direction: column; align-items: center; gap: 10px; }
.conv-kanaal-leeg-titel { font-weight: 600; color: var(--text-primary); }
.conv-list-item.ongelezen .conv-list-item-name span:first-child { font-weight: 700; color: var(--text-primary); }
.conv-header-titel { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.conv-bubble.conv-mail { white-space: normal; max-width: 92%; }
.conv-mail-status { margin-left: 6px; font-weight: 600; }
.conv-mail-status.mislukt { color: var(--error-ink); }
.conv-mail-status.verzenden { color: var(--orange-ink); }
.mail-instructie-rij { display: flex; gap: 8px; align-items: stretch; }
.mail-instructie {
  flex: 1; min-width: 0; min-height: 36px; padding: 8px 12px; border-radius: var(--r-sm);
  border: 1px solid var(--border); background: var(--bg-card-alt); color: var(--text-primary);
  font: inherit; font-size: 0.8667rem;
}
.mail-instructie:focus { outline: none; border-color: rgba(var(--accent-rgb),0.5); }
.mail-hint { font-size: 0.7667rem; color: var(--text-muted); line-height: 1.5; padding: 2px 2px 0; }
.panel-reply-input.mail-concept { min-height: 120px; }
.mail-staat { font-size: 0.8333rem; font-weight: 600; }
.mail-staat.ok { color: var(--success-ink); }
.mail-staat.let { color: var(--orange-ink); }
.mail-knoppen { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
.mail-koppel { border-color: rgba(var(--accent-rgb),0.35); color: var(--accent-ink); background: rgba(var(--accent-rgb),0.08); }
.mail-ontkoppel { border-color: rgba(var(--error-rgb),0.35); color: var(--red-ink); background: rgba(var(--error-rgb),0.08); }
.mail-provider-lijst { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 20px; border-bottom: 1px solid var(--border); }
#mail-instellingen > .inv-fout { margin: 10px 20px; }
#mail-handtekening, #widget-domeinen { width: 100%; resize: vertical; }
.mail-schakel { display: inline-flex; align-items: center; gap: 8px; font-size: 0.8333rem; color: var(--text-secondary); cursor: pointer; }
.mail-schakel input { width: 18px; height: 18px; accent-color: var(--accent-c); }
.mail-google-noot { padding: 12px 20px 14px; }
@media (max-width: 560px) {
  .mail-instructie-rij { flex-direction: column; }
  .mail-instructie-rij .inv-sync { width: 100%; justify-content: center; }
}
.widget-code { padding: 12px 20px 16px; display: flex; flex-direction: column; gap: 10px; }
.widget-code code {
  display: block; padding: 10px 12px; border-radius: var(--r-sm); background: var(--bg-card-alt); border: 1px solid var(--border);
  font-family: var(--font-mono, ui-monospace, monospace); font-size: 0.7667rem; color: var(--text-primary); word-break: break-all;
}
.widget-code .mail-knoppen { justify-content: flex-start; }
.inv-bron-link {
  align-self: flex-start; background: none; border: 0; padding: 0; cursor: pointer;
  font: inherit; font-size: 0.8rem; color: var(--accent-ink); text-decoration: underline; text-underline-offset: 3px;
}
.inv-bron-form { display: flex; flex-direction: column; gap: 10px; padding-top: 4px; }
.inv-bron-keuze { display: flex; flex-direction: column; gap: 6px; font-size: 0.8333rem; color: var(--text-primary); }
.inv-bron-keuze input { accent-color: var(--accent-c); margin-right: 6px; }
.mail-bijlagen { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.conv-bubble.user + .mail-bijlagen { justify-content: flex-end; }
.mail-bijlage {
  display: inline-flex; align-items: center; gap: 6px; max-width: 100%;
  padding: 5px 10px; border-radius: var(--r-sm); border: 1px solid var(--border);
  background: var(--bg-card-alt); color: var(--text-primary); font: inherit; font-size: 0.7667rem; cursor: pointer;
}
.mail-bijlage span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 220px; }
.mail-bijlage small { color: var(--text-muted); }
.mail-bijlage:hover { border-color: rgba(var(--accent-rgb),0.45); }
.mail-bijlage[disabled] { opacity: 0.6; cursor: progress; }
.pd-notice {
  padding: 14px 16px; border-radius: var(--radius-sm);
  background: rgba(var(--accent-rgb),0.08); border: 1px solid rgba(var(--accent-rgb),0.22);
  font-size: 0.8667rem; line-height: 1.55; color: var(--text-secondary);
}
.pd-notice strong { color: var(--accent-ink); }
.pd-notice code {
  font-family: var(--font-mono, ui-monospace, monospace); font-size: 0.8rem;
  padding: 1px 5px; border-radius: var(--r-xs); background: rgba(var(--accent-rgb),0.12); color: var(--accent-ink);
}

.pd-empty {
  padding: 40px 28px; text-align: center;
  border: 1px dashed var(--border); border-radius: var(--radius);
  display: flex; flex-direction: column; align-items: center; gap: 10px;
}
.pd-empty-title { font-size: 1rem; font-weight: 700; color: var(--text-primary); }
.pd-empty-text { font-size: 0.8667rem; line-height: 1.6; color: var(--text-muted); max-width: 440px; }

.pd-grid {
  display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
}
.pd-card {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); overflow: hidden;
  display: flex; flex-direction: column;
  transition: var(--transition);
}
.pd-card:hover { border-color: rgba(var(--accent-rgb),0.35); }
.pd-card--archived { opacity: 0.55; }
.pd-card-foto {
  width: 100%; height: 150px; object-fit: cover; display: block;
  background: var(--bg-card-alt);
}
.pd-card-foto-leeg {
  height: 150px; display: flex; align-items: center; justify-content: center;
  background: var(--bg-card-alt); color: var(--text-disabled);
}
.pd-card-body { padding: 14px 15px; display: flex; flex-direction: column; gap: 9px; flex: 1; }
.pd-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.pd-card-adres { font-size: 0.9333rem; font-weight: 700; color: var(--text-primary); line-height: 1.35; }
.pd-card-plaats { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
.pd-card-code {
  font-family: var(--font-mono, ui-monospace, monospace); font-size: 0.7333rem; font-weight: 700;
  padding: 3px 7px; border-radius: var(--r-xs); flex-shrink: 0;
  background: rgba(var(--accent-rgb),0.12); color: var(--accent-ink);
}
.pd-card-feiten { display: flex; flex-wrap: wrap; gap: 6px; }
.pd-feit {
  font-size: 0.8rem; font-weight: 600; padding: 3px 8px; border-radius: var(--r-full);
  background: var(--bg-card-alt); color: var(--text-secondary);
}
.pd-feit--prijs { background: rgba(var(--accent-rgb),0.14); color: var(--accent-ink); }
/* Een verkochte wagen die nog op de website staat: hoe lang nog. Warm en
   zichtbaar, maar geen alarmkleur -- het is een aftelling, geen fout. */
.pd-feit--verkocht { color: var(--warning-ink); }
/* De etalage (actief / verkocht / gearchiveerd) is het antwoord op "hoe staat
   mijn voorraad ervoor"; de regel eronder is wat de laatste sync deed. De
   eerste weegt zwaarder. */
.inv-etalage { color: var(--text-primary); font-weight: 600; }
/* Status: de vulling is de kleur, de tekst is de ink-variant van diezelfde
   kleur. Zand op wit haalt 1,29:1 -- dit is geen smaakkwestie. */
.pd-status { font-size: 0.7333rem; font-weight: 700; padding: 3px 8px; border-radius: var(--r-full); letter-spacing: 0.02em; }
.pd-status--beschikbaar { background: rgba(var(--success-rgb),0.14); color: var(--success-ink); }
.pd-status--bod         { background: rgba(var(--warning-rgb),0.16); color: var(--warning-ink); }
.pd-status--weg         { background: rgba(var(--error-rgb),0.14);   color: var(--error-ink); }

.pd-link-row { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
.pd-link {
  flex: 1; min-width: 0; font-family: var(--font-mono, ui-monospace, monospace);
  font-size: 0.7333rem; color: var(--text-muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  padding: 6px 9px; border-radius: var(--r-xs); background: var(--bg-card-alt); border: 1px solid var(--border);
}
.pd-card-acties { display: flex; gap: 7px; margin-top: auto; padding-top: 4px; }
.pd-mini {
  flex: 1; font-size: 0.8rem; font-weight: 600; padding: 7px 8px;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
  background: transparent; color: var(--text-secondary); cursor: pointer;
  transition: var(--transition);
}
.pd-mini:hover { background: var(--bg-card-alt); color: var(--text-primary); }
.mc-overlay { position: fixed; inset: 0; z-index: 1200; display: none; align-items: center; justify-content: center; background: rgba(0,0,0,0.55); padding: 24px; }
.mc-overlay.open { display: flex; }
.mc-modal { width: min(640px, 100%); max-height: 90vh; overflow: auto; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--r-lg); padding: 20px 22px; display: flex; flex-direction: column; gap: 10px; }
.mc-kop { display: flex; justify-content: space-between; align-items: center; font-weight: 700; font-size: 1.0667rem; color: var(--text-primary); }
.mc-x { border: 0; background: none; color: var(--text-secondary); font-size: 1.4rem; line-height: 1; cursor: pointer; }
.mc-rij { display: flex; gap: 12px; font-size: 0.8667rem; }
.mc-label { font-size: 0.7333rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); min-width: 56px; }
.mc-waarde { color: var(--text-primary); word-break: break-all; }
.mc-veld { width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg-card-alt); color: var(--text-primary); font: inherit; font-size: 0.9333rem; }
.mc-veld:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.mc-tekst { resize: vertical; min-height: 140px; line-height: 1.5; }
.mc-noot { font-size: 0.8rem; color: var(--text-secondary); }
.mc-acties { display: flex; justify-content: flex-end; gap: 10px; margin-top: 4px; }
.pd-filter { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; margin-bottom: 14px; }
.pd-filter[hidden] { display: none; }
.pd-zoek { flex: 0 1 320px; min-width: 200px; padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--bg-card); color: var(--text-primary); font: inherit; font-size: 0.8667rem; }
.pd-zoek:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pd-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.pd-chip { padding: 7px 12px; border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--bg-card); color: var(--text-secondary); font: inherit; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.pd-chip:hover { color: var(--text-primary); border-color: rgba(var(--accent-rgb), 0.45); }
.pd-chip.actief { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
.pd-chip:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pd-chip-n { font-weight: 700; opacity: 0.75; margin-left: 2px; }
.pd-meer, .pd-geen-treffers { grid-column: 1 / -1; display: flex; justify-content: center; align-items: center; gap: 12px; padding: 18px; color: var(--text-secondary); }
.pd-mini--gevaar { color: var(--red-ink); border-color: rgba(var(--error-rgb), 0.35); }
.pd-mini--gevaar:hover { background: rgba(var(--error-rgb), 0.10); color: var(--red-ink); }
.pd-leads { font-size: 0.8rem; color: var(--text-muted); }
.pd-leads strong { color: var(--text-primary); }
.pd-volgende-afspraak { font-size: 0.7333rem; color: var(--text-muted); margin-top: 2px; }
.pd-kandidaten-toggle {
  font-size: 0.7333rem;
  font-weight: 600;
  color: var(--accent-ink);
  cursor: pointer;
  margin-top: 4px;
  background: none;
  border: none;
  padding: 0;
}
.pd-kandidaten-lijst { display: none; flex-direction: column; gap: 4px; margin-top: 6px; }
.pd-kandidaten-lijst.open { display: flex; }
.pd-kandidaat-rij {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.7333rem;
  color: var(--text-muted);
}
.pd-kandidaat-naam { flex: 1; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Importeren uit een link. Staat bovenaan het venster en mag dat ook zien:
   dit is de weg die een makelaar zou moeten nemen, de losse velden zijn de
   uitwijk. */
/* [hidden] wint hier niet vanzelf. Het HTML-attribuut zet display:none via de
   stylesheet van de BROWSER, en elke eigen display-regel is specifieker en wint
   dus. .pd-import staat op display:flex, dus el.hidden = true deed zichtbaar
   niets -- de balk bleef gewoon staan terwijl de eigenschap wel op true stond.

   Een !important is hier de juiste oplossing en geen luiheid: "verborgen"
   hoort geen onderhandeling te zijn met de rest van de cascade. Beperkt tot de
   twee blokken die echt geschakeld worden, zodat het geen algemene dreun wordt. */
#pd-import[hidden], #pd-vast[hidden], #pd-deal[hidden] { display: none !important; }
/* Idem voor de navigatie: .nav-item staat op display:flex, dus el.hidden = true
   zou daar niets doen. Dit is dezelfde val, twee keer in hetzelfde bestand --
   het is de reden dat "verborgen" nooit een onderhandeling met de cascade mag
   zijn. */
.nav-item[hidden] { display: none !important; }

.pd-import {
  padding: 13px 14px;
  border-radius: var(--radius-sm);
  background: rgba(var(--accent-rgb),0.07);
  border: 1px solid rgba(var(--accent-rgb),0.20);
  display: flex; flex-direction: column; gap: 4px;
}
.pd-import-kop { font-size: 0.8667rem; font-weight: 700; color: var(--accent-ink); }
.pd-import-sub { font-size: 0.8rem; line-height: 1.45; color: var(--text-muted); margin-bottom: 6px; }
.pd-import-row { display: flex; gap: 8px; align-items: stretch; }
.pd-import-row .pd-input { flex: 1; min-width: 0; }
.pd-import-row button { flex: 0 0 auto; white-space: nowrap; }
.pd-import-status { font-size: 0.8rem; line-height: 1.5; margin-top: 8px; }
.pd-import-status--bezig { color: var(--text-muted); }
.pd-import-status--ok    { color: var(--success-ink); }
.pd-import-status--fout  { color: var(--error-ink); }
/* Een veld dat de import NIET kon invullen. Geen foutkleur: er is niets mis,
   er staat alleen nog niets -- de makelaar moet er even naar kijken. */
.pd-input--leeg {
  border-color: rgba(var(--warning-rgb),0.45);
  background: rgba(var(--warning-rgb),0.06);
}

/* Het bewerkvenster */
#pd-overlay {
  position: fixed; inset: 0; z-index: 1200;
  background: rgba(0,0,0,0.65); backdrop-filter: blur(6px);
  display: none; align-items: center; justify-content: center;
}
#pd-overlay.open { display: flex; }
#pd-modal {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); width: min(640px, 96vw); max-height: 90vh;
  display: flex; flex-direction: column; overflow: hidden;
  box-shadow: var(--elev-3); animation: modalIn 0.18s ease;
}
.pd-modal-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 16px 20px; border-bottom: 1px solid var(--border); flex-shrink: 0;
  font-size: 1rem; font-weight: 700; color: var(--text-primary);
}
.pd-modal-x {
  width: 30px; height: 30px; border-radius: var(--r-sm); border: 1px solid var(--border);
  background: transparent; cursor: pointer; color: var(--text-muted);
  font-size: 1.2rem; line-height: 1; transition: var(--transition);
}
.pd-modal-x:hover { background: var(--bg-card-alt); color: var(--text-primary); }
.pd-modal-body {
  flex: 1; overflow-y: auto; padding: 20px;
  display: flex; flex-direction: column; gap: 12px;
}
.pd-modal-body::-webkit-scrollbar { width: 5px; }
.pd-modal-body::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb),0.3); border-radius: var(--r-xs); }
.pd-modal-foot {
  display: flex; justify-content: flex-end; gap: 9px;
  padding: 14px 20px; border-top: 1px solid var(--border); flex-shrink: 0;
}
.pd-modal-err {
  padding: 10px 12px; border-radius: var(--radius-sm);
  background: rgba(var(--error-rgb),0.10); border: 1px solid rgba(var(--error-rgb),0.28);
  color: var(--error-ink); font-size: 0.8rem; line-height: 1.5;
}
.pd-label {
  display: block; font-size: 0.7333rem; font-weight: 700; letter-spacing: 0.04em;
  text-transform: uppercase; color: var(--text-muted); margin-bottom: 5px;
}
.pd-input {
  width: 100%; padding: 9px 11px; font-size: 0.8667rem;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--radius-sm); color: var(--text-primary);
  font-family: inherit; transition: var(--transition);
}
.pd-input:focus { outline: none; border-color: rgba(var(--accent-rgb),0.5); }
.pd-textarea { resize: vertical; line-height: 1.5; }
.pd-hint { font-size: 0.8rem; color: var(--text-muted); margin-top: 4px; line-height: 1.45; }
.pd-row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.pd-row-3 { display: grid; grid-template-columns: 1fr 2fr; gap: 12px; }
/* pd-row-3 is ondanks zijn naam TWEE kolommen (1fr 2fr) -- hij hoort bij
   postcode + gemeente. Voor drie gelijke velden is een eigen klasse nodig;
   pd-row-3 verbreden zou het pandformulier scheeftrekken. */
.pd-row-3e { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
@media (max-width: 560px) { .pd-row-3e, .pd-row-4 { grid-template-columns: 1fr 1fr; } }
.pd-row-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
.pd-col-2 { grid-column: span 1; }
.pd-checkline { display: flex; align-items: center; gap: 8px; font-size: 0.8667rem; color: var(--text-secondary); cursor: pointer; }
@media (max-width: 620px) {
  .pd-row-2, .pd-row-3, .pd-row-4 { grid-template-columns: 1fr; }
}

#cal-book-overlay {
  position: fixed; inset: 0; z-index: 1200;
  background: rgba(0,0,0,0.65); backdrop-filter: blur(6px);
  display: none; align-items: center; justify-content: center;
}
#cal-book-overlay.open { display: flex; }
#cal-book-modal {
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--radius); width: min(520px, 96vw); max-height: 90vh;
  display: flex; flex-direction: column; overflow: hidden;
  box-shadow: var(--elev-3);
  animation: modalIn 0.18s ease;
}
#cal-book-header {
  display: flex; align-items: center; gap: 12px;
  padding: 16px 20px; border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.cal-book-icon {
  width: 36px; height: 36px; border-radius: var(--r-sm);
  background: var(--accent);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
#cal-book-title {
  flex: 1; font-size: 1rem; font-weight: 700; color: var(--text-primary); line-height: 1.2;
}
#cal-book-subtitle { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }
#cal-book-close {
  width: 30px; height: 30px; border-radius: var(--r-sm); border: 1px solid var(--border);
  background: transparent; cursor: pointer; display: flex; align-items: center;
  justify-content: center; color: var(--text-muted); transition: var(--transition); flex-shrink: 0;
}
#cal-book-close:hover { background: var(--bg-card-alt); color: var(--text-primary); }
/* Scrollable body */
#cal-book-body {
  flex: 1; overflow-y: auto; padding: 20px;
  display: flex; flex-direction: column; gap: 18px;
}
#cal-book-body::-webkit-scrollbar { width: 5px; }
#cal-book-body::-webkit-scrollbar-thumb { background: rgba(var(--accent-rgb),0.3); border-radius: var(--r-xs); }
/* Section label */
.cb-label {
  font-size: 0.7333rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.07em; color: var(--text-muted); margin-bottom: 8px;
}
/* Date nav */
.cb-date-nav {
  display: flex; align-items: center; gap: 8px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); padding: 8px 12px;
}
.cb-date-label {
  flex: 1; font-size: 0.9333rem; font-weight: 700; color: var(--text-primary); text-align: center;
}
.cb-date-btn {
  width: 28px; height: 28px; border-radius: var(--r-xs); border: 1px solid var(--border);
  background: transparent; cursor: pointer; display: flex; align-items: center;
  justify-content: center; color: var(--text-muted); transition: var(--transition);
  font-family: 'Inter',sans-serif;
}
.cb-date-btn:hover { background: var(--bg-card); color: var(--text-primary); border-color: var(--accent); }
/* Slot grid */
.cb-slots {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px;
}
.cb-slot {
  padding: 10px 8px; border-radius: var(--r-sm); border: 1px solid var(--border);
  background: var(--bg-card-alt); color: var(--text-primary);
  font-size: 0.8667rem; font-weight: 700; cursor: pointer; text-align: center;
  transition: var(--transition); font-family: 'Inter',sans-serif;
}
.cb-slot:hover { border-color: var(--accent); background: rgba(var(--accent-rgb),0.08); color: var(--accent-ink); }
.cb-slot.selected {
  background: rgba(var(--accent-rgb),0.15); border-color: var(--accent);
  color: var(--accent-ink); box-shadow: 0 0 0 2px rgba(var(--accent-rgb),0.2);
}
.cb-slots-empty {
  grid-column: 1/-1; text-align: center; padding: 24px;
  color: var(--text-muted); font-size: 0.8667rem; line-height: 1.6;
  display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.cb-empty-next {
  background: var(--accent); color: var(--on-accent); border: none;
  padding: 9px 18px; border-radius: var(--radius-sm);
  font-size: 0.8667rem; font-weight: 600; cursor: pointer;
  transition: var(--transition); font-family: inherit;
}
.cb-empty-next:hover { filter: brightness(1.1); transform: translateY(-1px); }
/* Lead search */
.cb-lead-search {
  position: relative;
}
.cb-lead-input {
  width: 100%; box-sizing: border-box; padding: 9px 12px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8667rem;
  font-family: 'Inter',sans-serif; transition: border-color 0.15s; outline: none;
}
.cb-lead-input:focus { border-color: var(--accent); }
.cb-field-input {
  width: 100%; box-sizing: border-box; padding: 9px 12px;
  background: var(--bg-card-alt); border: 1px solid var(--border);
  border-radius: var(--r-sm); color: var(--text-primary); font-size: 0.8667rem;
  font-family: 'Inter',sans-serif; transition: border-color 0.15s; outline: none;
}
.cb-field-input:focus { border-color: var(--accent); }
.cb-lead-dropdown {
  position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 10;
  background: var(--bg-card); border: 1px solid var(--border);
  border-radius: var(--r-sm); max-height: 160px; overflow-y: auto;
  box-shadow: 0 8px 24px rgba(0,0,0,0.25);
}
.cb-lead-opt {
  padding: 8px 12px; cursor: pointer; font-size: 0.8667rem; color: var(--text-primary);
  border-bottom: 1px solid var(--border); transition: background 0.1s;
  display: flex; align-items: center; gap: 8px;
}
.cb-lead-opt:last-child { border-bottom: none; }
.cb-lead-opt:hover { background: rgba(var(--accent-rgb),0.07); }
.cb-lead-opt-score { font-size: 0.6667rem; color: var(--accent-ink); font-weight: 700; margin-left: auto; }
/* Confirm button */
.cb-confirm-wrap { padding-top: 4px; }
.cb-confirm-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  width: 100%; padding: 13px; border-radius: var(--r-sm);
  background: var(--accent); color: var(--on-accent);
  font-size: 0.9333rem; font-weight: 700; cursor: pointer; border: none;
  font-family: 'Inter',sans-serif; transition: filter 0.15s, transform 0.12s;
  text-decoration: none;
}
.cb-confirm-btn:hover { filter: brightness(1.1); transform: translateY(-1px); }
.cb-confirm-btn:disabled { opacity: 0.4; pointer-events: none; }
.cb-confirm-note { font-size: 0.7333rem; color: var(--text-muted); text-align: center; margin-top: 7px; }
/* Loading / empty states */
.cb-loading {
  display: flex; flex-direction: column; align-items: center;
  justify-content: center; gap: 10px; padding: 32px;
  color: var(--text-muted); font-size: 0.8667rem;
}
.cb-spinner-ring {
  width: 28px; height: 28px; border: 3px solid var(--border);
  border-top-color: var(--accent); border-radius: 50%;
  animation: spin 0.7s linear infinite;
}
.cb-no-connection {
  padding: 24px; text-align: center; color: var(--text-muted); font-size: 0.8667rem; line-height: 1.7;
}
.cb-no-connection a { color: var(--accent-ink); font-weight: 600; }
/* Loading spinner for slots refresh */
.cb-slots-loading {
  grid-column: 1/-1; display: flex; align-items: center; justify-content: center;
  gap: 8px; padding: 20px; color: var(--text-muted); font-size: 0.8rem;
}
.cal-book-spinner-ring {
  width: 16px; height: 16px; border: 2px solid var(--border);
  border-top-color: var(--accent); border-radius: 50%;
  animation: spin 0.7s linear infinite;
}
#page-profile.active { display: block !important; }

/* ============================================================
   RESPONSIVE - TABLET & MOBILE
   ============================================================ */

/* Large desktop tweaks */
@media (max-width: 1400px) {
  .stats-grid { gap: 14px; }
}

/* Tablet landscape */
@media (max-width: 1200px) {
  .analyse-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .exports-grid { grid-template-columns: repeat(2, 1fr); }
  .profile-cards { grid-template-columns: 1fr 1fr; }
  .charts-row { flex-direction: column; }
  .chart-card-sm { width: 100%; }
}

@media (max-width: 1100px) {
  .stats-grid { grid-template-columns: repeat(3, 1fr); }
}

/* Tablet portrait */
@media (max-width: 1024px) {
  .conv-layout { flex-direction: column; height: auto; min-height: calc(100vh - 130px); }
  .conv-list { width: 100%; max-height: 280px; border-right: none; border-bottom: 1px solid var(--border); }
  /* Op een telefoon stond de lijst afgeknipt op vier rijen boven een lege
     rechterhelft die vroeg om een gesprek te kiezen. Zolang er niets gekozen
     is, krijgt de lijst de hele kaart; kies je er een, dan schuift het
     gesprek eronder zoals voorheen. */
  .conv-layout:not(:has(.conv-list-item.active)) .conv-list { max-height: none; flex: 1; border-bottom: none; }
  .conv-layout:not(:has(.conv-list-item.active)) .conv-detail { display: none; }
  .pipeline-board { gap: 12px; }
  .pipeline-col { flex: 0 0 240px; }
  .profile-stats-row { grid-template-columns: repeat(2, 1fr); }
  .cal-right-sidebar { width: 240px; }
}

/* Larger phones / small tablets */
@media (max-width: 900px) {
  .analyse-grid { grid-template-columns: minmax(0, 1fr); }
  .analyse-card-span2 { grid-column: span 1; }
  .profile-cards { grid-template-columns: 1fr; }
  .cal-right-sidebar { display: none; }
  .search-pill-label { display: none; }
  .search-pill { min-width: auto; padding: 8px 10px; }
}

@media (max-width: 768px) {
  .sidebar {
    transform: translateX(-100%);
  }

  .sidebar.mobile-open {
    transform: translateX(0);
    box-shadow: 4px 0 30px rgba(0, 0, 0, 0.5);
  }

  .main-content {
    margin-left: 0;
  }

  .hamburger { display: flex; align-items: center; justify-content: center; }

  .stats-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 12px;
  }

  .stat-card {
    padding: 16px 14px 14px;
  }

  .stat-value {
    font-size: 1.6rem;
  }

  /* Extra bottom padding so the last row of content can always be
     scrolled clear of the floating help launcher, which is fixed and
     would otherwise sit permanently on top of whatever ends the page. */
  .page-content { padding: 16px 16px 96px; }

  .topbar { padding: 12px 16px; }

  .timestamp-info { display: none; }

  /* Wrapped to three lines at 375px and doubled the header height */
  .page-subtitle { display: none; }

  /* A phone has no Cmd key, so the ⌘K hint is both misleading and the
     widest thing in the row. Dropping it lets the five topbar controls
     sit on one line instead of wrapping onto a second. */
  .search-pill-kbd { display: none; }

  /* Let the title give up space before the actions wrap. */
  .topbar-left { min-width: 0; flex-shrink: 1; }
  .page-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* Het titelblok is zelf ook een flex-kind met min-width:auto en weigerde
     dus onder zijn tekstbreedte te zakken -- flex-shrink op de ouder alleen
     doet daar niets. */
  .topbar-titel { min-width: 0; }

  .detail-panel {
    width: 100vw;
  }

  .exports-grid {
    grid-template-columns: 1fr;
  }

  .filters-bar {
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
  }

  .filter-select, .search-wrapper { min-width: unset; }

  .leads-count { margin-left: 0; text-align: center; padding-top: 4px; }

  /* Hide less important table columns on mobile */
  .td-samenvatting { display: none; }

  .pipeline-board { padding-bottom: 80px; }
}

@media (max-width: 480px) {
  .stats-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .login-form-side { padding: 32px 24px; }
  .login-welcome { font-size: 1.8667rem; }
  /* Collapse the topbar actions to icons. This rule existed before but
     only matched <span>s, and these two labels were bare text nodes, so
     the buttons stayed ~110px wide, wrapped onto three rows, and pushed
     the topbar to 137px tall on a 375px phone. */
  .btn-icon span:not(.icon), .btn-label { display: none; }
  /* Icon-only buttons don't need label-sized side padding; trimming this
     plus the gap is what gets all five controls onto a single row at
     375px instead of leaving the theme toggle stranded on its own line. */
  .topbar-right { gap: 4px; }
  .topbar-right .btn-icon, .topbar-right .search-pill { padding-left: 9px; padding-right: 9px; }
  .page-title { font-size: 0.9333rem; letter-spacing: 0.107em; }

  /* Lead detail panel, tighter padding + smaller avatar so the header
     doesn't feel cramped on the smallest phones */
  .panel-header { padding: 18px 16px 16px; }
  .panel-body   { padding: 16px; }
  .panel-avatar { width: 48px; height: 48px; font-size: 1.2rem; margin-bottom: 10px; }
  .panel-close  { top: 14px; right: 14px; width: 40px; height: 40px; }

  /* Takeover bar / reply row, allow the send button to sit under the
     textarea instead of squeezing both into ~300px of width */
  .panel-reply-row { flex-wrap: wrap; }
  .panel-reply-send { flex: 1 1 100%; justify-content: center; }
  .panel-takeover-bar { padding: 8px; gap: 6px; }
  .panel-takeover-btn { margin-left: 0; }

  /* Actie Nodig / follow-up / top-leads widgets, match .page-content's
     16px gutter instead of the desktop 20px */
  .nb-widget, .followup-widget, .top-leads-strip, .taken-widget { padding: 14px 16px; }
}

/* ============================================================
   PAGE HIDDEN WHEN LOGGED OUT
   ============================================================ */
#dashboard-app { display: none; }
#dashboard-app.visible { display: flex; flex-direction: column; min-height: 100vh; }

/* ============================================================
   LIGHT MODE COMPONENT OVERRIDES
   ============================================================ */

/* Fase 4: de zijbalk volgt het thema (opdracht van de eigenaar) -- de
   permanent-donkere opzet is teruggedraaid. De tokenrebind staat bij de
   basisregel van .sidebar; hier alleen wat op die basisregel zelf niet met
   een token kan (rand, schaduw) plus de kind-selectors die een letterlijke
   waarde hadden die op donker klopte en op de nieuwe warme grond niet meer. */
[data-theme="light"] .sidebar {
  border-right: 1px solid var(--border-c);
  box-shadow: none;
}

[data-theme="light"] .nav-item:hover {
  background: var(--hover);
  color: var(--text);
}

[data-theme="light"] .nav-item.active {
  background: var(--accent-c);
  /* Zelfde ingreep als in het donkere thema: koud zwart op een gouden pil
     leest grijsblauw. Gelijke helderheid, warme tint: 11,87:1 -> 11,86:1. */
  color: #1F1D18;
}

[data-theme="light"] .nav-item.active::before { display: none; }

/* Topbar: glass, not flat white. 0.72 rather than 0.92 alpha so content
   scrolling underneath actually shows through and the bar reads as a
   pane floating over the page instead of a painted strip. The inset
   highlight is the specular top edge. */
[data-theme="light"] .topbar {
  background: rgba(255,255,255,0.72);
  border-bottom: 1px solid var(--border);
  box-shadow: none;   /* finish-fix 3: ook in het lichte thema geen slagschaduw op de grond */
}

/* Page titles were gold, which put brand colour on ordinary structural
   text and left nothing louder for actual emphasis. Gold is now reserved
   for the active nav pill, primary actions and money. */
[data-theme="light"] .page-title {
  color: var(--text);
}

/* Knoppen op wit. Zelfde mechaniek als op donker -- randlicht, verloop, gloed
   -- maar de richting van het licht klopt anders niet: op wit kan de bovenrand
   niet lichter dan de ondergrond, dus daar draagt de ONDERrand het verschil.
   Dat zit al in --btn-rim, die in dit blok andere waarden krijgt.

   Hier stond box-shadow:none op de zweefstaat. Dat was consequent met de oude
   opzet (er was geen schaduw om weg te halen) maar het zou nu precies de gloed
   uitzetten die de knop zijn diepte geeft. */
[data-theme="light"] .btn-icon {
  background: linear-gradient(180deg, var(--card) 0%, var(--card-elevated) 100%);
  border: 1px solid var(--border);
  box-shadow: var(--btn-rim);
  color: var(--text-secondary);
}

[data-theme="light"] .btn-icon:hover {
  background: linear-gradient(180deg, rgba(var(--accent-rgb),0.16) 0%, rgba(var(--accent-rgb),0.09) 100%);
  border-color: rgba(var(--accent-rgb),0.32);
  color: var(--accent-ink);
  box-shadow: var(--btn-rim), var(--btn-glow);
}

/* Fase 4: geen override meer nodig. .btn-primary-sm leest nu rechtstreeks
   var(--btn-primary-bg)/var(--btn-primary-text), en die twee tokens zijn al
   per thema goed gezet (charcoal-op-zand hier, zand-op-charcoal donker) --
   dit blok herhaalde alleen in kleur wat de basisregel al deed. */

/* Stat cards. White with real depth */
[data-theme="light"] .stat-card {
  background: var(--card);
  box-shadow: var(--edge-hi), var(--shadow-card);
  border: 1px solid var(--border);
}

[data-theme="light"] .stat-card:hover {
  box-shadow: none;
  border-color: rgba(var(--accent-rgb),0.2);
}

/* Stat value color */
/* Fase 4: verwijderd -- dupliceerde de regel verderop in dit bestand
   (".stat-value { color: #0f1117 }" stond twee keer), en die tweede is nu
   getokeniseerd. */

/* Filters bar */
[data-theme="light"] .filters-bar {
  background: rgba(255,255,255,0.8);
  border: 1px solid var(--border);
  box-shadow: 0 1px 4px rgba(23,19,12,0.04);
}

/* Selects & search */
[data-theme="light"] .filter-select,
[data-theme="light"] .search-input {
  background: var(--bg);
  border-color: var(--border);
  color: var(--text-primary);
}

[data-theme="light"] .filter-select:focus,
[data-theme="light"] .search-input:focus {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(var(--accent-rgb),0.12);
}

/* Lead table */
[data-theme="light"] .leads-table thead th {
  background: var(--bg-card-alt);
  color: var(--text-secondary);
  border-bottom: 1px solid var(--border);
}

[data-theme="light"] .leads-table tbody tr:hover {
  background: rgba(var(--accent-rgb),0.04);
  box-shadow: inset 3px 0 0 var(--accent);
}

/* Badge overrides for light */
[data-theme="light"] .badge {
  font-weight: 600;
}

/* Detail panel */
[data-theme="light"] .detail-panel {
  background: var(--bg);
  border-left: 1px solid var(--border);
  box-shadow: -4px 0 20px rgba(23,19,12,0.08);
}

/* Login split in light mode */
[data-theme="light"] .login-split {
  box-shadow: 0 8px 40px rgba(23,19,12,0.14);
}

/* User info bottom of sidebar */
[data-theme="light"] .user-info {
  background: var(--bg-card-alt);
  border-radius: var(--r-sm);
}
/* Fase 4: de drie letterlijke tinten die hier stonden (#111827-achtige
   bijna-zwart, --red-ink op #B91C1C, #A3AEC0) waren getuned voor de
   PERMANENT DONKERE zijbalk-grond die nu is teruggedraaid. .user-name en
   .user-role gebruiken var(--text-primary)/var(--text-muted), .btn-logout
   gebruikt var(--red-ink) -- alle drie tokens die de .sidebar-basisregel
   hierboven al naar de lichte equivalenten herbindt (--text-primary:
   #1F1D19, --text-muted: #6B6252) of die op de nieuwe kaartgrond (#FAF6EE)
   al 5,08:1 halen zonder eigen override (--error-ink). Geen losse regel
   meer nodig; het is precies waarom de tokenrebind bestaat. */

/* Sidebar bottom button */
[data-theme="light"] .btn-logout {
  background: rgba(var(--error-rgb),0.06);
  border-color: rgba(var(--error-rgb),0.15);
}

[data-theme="light"] .btn-logout:hover {
  background: rgba(var(--error-rgb),0.12);
  border-color: rgba(var(--error-rgb),0.3);
}

/* ── Stat cards: colorful top line + corner glow in light ── */
[data-theme="light"] .stat-card::before {
  background: var(--accent);
  opacity: 0.8;
}

[data-theme="light"] .stat-card::after {
  background: none;
}

[data-theme="light"] .stat-card:hover {
  border-color: rgba(var(--accent-rgb),0.25);
  background: var(--card);
  box-shadow: none;
}

[data-theme="light"] .stat-card:hover::before {
  background: var(--accent);
  opacity: 1;
}

/* Colored stat values. Keep glow but lighter */
[data-theme="light"] .stat-value { text-shadow: none; color: var(--text); }
[data-theme="light"] .stat-value.cyan   { color: var(--info); text-shadow: none; }
[data-theme="light"] .stat-value.green  { color: var(--success-ink); text-shadow: none; }
[data-theme="light"] .stat-value.orange { color: var(--warning-ink); text-shadow: none; }
[data-theme="light"] .stat-value.blue   { color: var(--info); text-shadow: none; }

/* Stat bar in light */
[data-theme="light"] .stat-bar { background: var(--border); }
[data-theme="light"] .stat-bar-fill { background: var(--accent); }

/* Chart card */
[data-theme="light"] .chart-card,
[data-theme="light"] .chart-card-sm {
  background: var(--bg);
  border: 1px solid var(--border);
  box-shadow: var(--edge-hi), var(--shadow-card);
}

[data-theme="light"] .chart-title {
  color: var(--text-secondary);
}

/* Today widget */
[data-theme="light"] .today-widget {
  background: var(--bg);
  border: 1px solid var(--border);
  box-shadow: var(--edge-hi), var(--shadow-card);
}

/* Cal modal */
[data-theme="light"] .cal-modal {
  background: var(--bg);
}
[data-theme="light"] .cal-modal-btn-secondary {
  background: rgba(0,0,0,0.04);
  color: var(--text-secondary);
}
[data-theme="light"] .cal-modal-close:hover { background: rgba(0,0,0,0.06); }

/* Filters bar stronger presence */
[data-theme="light"] .filters-bar {
  background: var(--bg);
  border: 1px solid var(--border);
  box-shadow: 0 1px 6px rgba(23,19,12,0.05);
}

/* Table header row */
[data-theme="light"] .leads-table thead tr {
  background: var(--hover);
}

/* Badge coloring stays vibrant in light */
[data-theme="light"] .badge-bron {
  background: rgba(var(--accent-rgb),0.1);
  color: var(--accent-ink);
  border-color: rgba(var(--accent-rgb),0.2);
}

/* ============================================================
   HELP WIDGET (launcher bottom-right + slide-up panel)

   Deliberately NOT an LLM chat. It answers from a fixed set of
   articles written against features that actually exist in this
   build, and hands off to a human for anything else. A generative
   bot here would confidently invent settings that don't exist and
   turn every wrong answer into a support ticket.
   ============================================================ */
.hv-help-launcher {
  position: fixed;
  right: 24px;
  bottom: 24px;
  width: 54px;
  height: 54px;
  border-radius: 50%;
  border: none;
  cursor: pointer;
  /* Was 9000, gelijk aan de zoek-overlay. Bij gelijke z-index beslist de
     volgorde in de DOM en niet de bedoeling; de hulpknop hoort ONDER een
     geopende zoekbalk te vallen, niet erdoorheen te steken. */
  z-index: 8900;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--accent-c);
  color: var(--on-accent);
  box-shadow: none;   /* finish-fix 3/4: geen slagschaduw of zandgloed onder de hulpknop; de rand draagt hem */
  border: 1px solid var(--border-strong);
  transition: transform var(--dur-base) var(--ease-out),
              box-shadow var(--dur-base) var(--ease-out);
}
.hv-help-launcher:hover {
  transform: translateY(-2px) scale(1.04);
  box-shadow: none;
}
.hv-help-launcher:active { transform: translateY(0) scale(.97); }
.hv-help-launcher:focus-visible {
  outline: 2px solid var(--accent-c);
  outline-offset: 3px;
}
/* Two stacked icons, cross-faded, the launcher becomes its own close
   button when the panel is open, which is the pattern people already
   know from every other messenger. */
.hv-help-launcher svg {
  position: absolute;
  transition: opacity var(--dur-fast) var(--ease-out),
              transform var(--dur-base) var(--ease-out);
}
.hv-help-launcher .hv-help-ico-close { opacity: 0; transform: rotate(-90deg) scale(.6); }
.hv-help-launcher.is-open .hv-help-ico-chat  { opacity: 0; transform: rotate(90deg) scale(.6); }
.hv-help-launcher.is-open .hv-help-ico-close { opacity: 1; transform: none; }

/* Unread dot for the first-run nudge. */
.hv-help-launcher::after {
  content: '';
  position: absolute;
  top: 2px; right: 2px;
  width: 12px; height: 12px;
  border-radius: 50%;
  background: var(--c-coral);
  border: 2px solid var(--bg);
  opacity: 0;
  transform: scale(.4);
  transition: opacity var(--dur-base) var(--ease-out), transform var(--dur-base) var(--ease-out);
}
.hv-help-launcher.has-dot::after { opacity: 1; transform: none; }

.hv-help-panel {
  position: fixed;
  right: 24px;
  bottom: 90px;
  width: 380px;
  max-width: calc(100vw - 32px);
  height: 560px;
  max-height: calc(100vh - 130px);
  z-index: 9001;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border-radius: var(--r-lg);
  background: var(--card);
  border: 1px solid var(--border-c);
  box-shadow: var(--edge-hi), var(--elev-3);
  opacity: 0;
  transform: translateY(12px) scale(.97);
  transform-origin: bottom right;
  pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-out),
              transform var(--dur-enter) var(--ease-out);
}
.hv-help-panel.is-open {
  opacity: 1;
  transform: none;
  pointer-events: auto;
}
@media (prefers-reduced-motion: reduce) {
  .hv-help-launcher, .hv-help-launcher svg, .hv-help-panel { transition: none; }
}

.hv-help-head {
  padding: 18px 18px 14px;
  background: var(--accent-c);
  color: var(--on-accent);
  flex-shrink: 0;
}
.hv-help-head h2 { font-size: 1.0667rem; font-weight: 700; margin: 0 0 2px; }
.hv-help-head p  { font-size: 0.8rem; margin: 0; opacity: .82; }

.hv-help-search { padding: 12px 14px 8px; flex-shrink: 0; }
.hv-help-search input {
  width: 100%;
  padding: 9px 12px;
  font-family: inherit;
  font-size: 0.8667rem;
  color: var(--text-c);
  background: var(--bg-alt);
  border: 1px solid var(--border-c);
  border-radius: var(--r-sm);
  transition: border-color var(--dur-fast) var(--ease-out);
}
.hv-help-search input:focus {
  outline: none;
  border-color: var(--accent-c);
}
.hv-help-search input::placeholder { color: var(--text-muted-c); }

.hv-help-body {
  flex: 1;
  overflow-y: auto;
  padding: 4px 14px 14px;
}
.hv-help-sec {
  font-size: 0.6667rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-muted-c);
  margin: 12px 4px 6px;
}
.hv-help-item {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 10px 12px;
  margin-bottom: 4px;
  text-align: left;
  font-family: inherit;
  font-size: 0.8667rem;
  color: var(--text-c);
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out);
}
.hv-help-item:hover {
  background: var(--hover-c);
  border-color: var(--border-c);
}
.hv-help-item:focus-visible { outline: 2px solid var(--accent-c); outline-offset: -1px; }
.hv-help-item svg { flex-shrink: 0; opacity: .5; margin-left: auto; }

.hv-help-empty {
  padding: 28px 12px;
  text-align: center;
  font-size: 0.8667rem;
  color: var(--text-muted-c);
}

.hv-help-back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin: 8px 0 10px;
  padding: 5px 10px 5px 6px;
  font-family: inherit;
  font-size: 0.8rem;
  font-weight: 600;
  color: var(--text-muted-c);
  background: transparent;
  border: 1px solid var(--border-c);
  border-radius: var(--r-full);
  cursor: pointer;
}
.hv-help-back:hover { color: var(--text-c); background: var(--hover-c); }

.hv-help-article h3 { font-size: 1rem; font-weight: 700; margin: 0 0 10px; color: var(--text-c); }
.hv-help-article p  { font-size: 0.8667rem; line-height: 1.62; color: var(--text-muted-c); margin: 0 0 10px; }
.hv-help-article ol,
.hv-help-article ul { margin: 0 0 12px 18px; }
.hv-help-article li { font-size: 0.8667rem; line-height: 1.62; color: var(--text-muted-c); margin-bottom: 6px; }
.hv-help-article strong { color: var(--text-c); font-weight: 600; }
.hv-help-article code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.8rem;
  padding: 1px 5px;
  border-radius: var(--r-xs);
  background: var(--bg-alt);
  border: 1px solid var(--border-c);
  color: var(--accent-ink);
}

.hv-help-foot {
  flex-shrink: 0;
  display: flex;
  gap: 8px;
  padding: 12px 14px;
  border-top: 1px solid var(--divider);
  background: var(--bg-alt);
}
.hv-help-foot a {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 9px 10px;
  font-size: 0.8rem;
  font-weight: 600;
  text-decoration: none;
  color: var(--text-c);
  background: var(--card);
  border: 1px solid var(--border-c);
  border-radius: var(--r-sm);
  transition: border-color var(--dur-fast) var(--ease-out), color var(--dur-fast) var(--ease-out);
}
.hv-help-foot a:hover { border-color: var(--accent-c); color: var(--accent-ink); }

/* On phones the panel takes the whole screen, a 380px card floating on a
   375px viewport is the classic broken-messenger look. */
@media (max-width: 520px) {
  .hv-help-panel {
    right: 0; bottom: 0; left: 0;
    width: 100%;
    max-width: 100%;
    height: 88vh;
    max-height: 88vh;
    border-radius: 18px 18px 0 0;
    transform-origin: bottom center;
  }
  .hv-help-launcher { right: 16px; bottom: 16px; }
}
/* Kleinste schermen: de hulpknop zakt in de Faro-balk in plaats van er als
   extra 54px-bol bovenop te staan. Samen nemen ze nu één rij in. */
@media (max-width: 520px) {
  .hv-help-launcher { width: 44px; height: 44px; right: 12px; bottom: 10px; }
}
/* ── Wie om minder doorschijnendheid of meer contrast vraagt, krijgt dat ──────
   Het glas van topbalk en dock wordt dan een gewoon opgetild vlak met een
   duidelijke rand; niets verschuift. */
/* ═══ Onboarding-wizard, herontwerp 2026-10-02, verfijnd 2026-10-13 ═══════
   Zelfde negen stappen, velden en kaarten, op de thematokens (licht voorop).
   Wat de verfijning toevoegt, en alleen dat:
   - "Stap 4 van 9" boven elke kop, en in de rail een stand + dunne meter;
   - een rustiger rail: grotere haltes, de actieve in houtskool;
   - gekozen marktkaart en statuslabels die je zonder zoeken ziet;
   - de hoofdknop draagt een pijl, en een draaier zolang hij opslaat;
   - Klaar opent met de stand ("5 van 8 klaar") voor de regels eronder.
   Faro blijft de gids onderaan de rail. */
.wiz-overlay {
  position: fixed; inset: 0; z-index: 11000; display: flex; align-items: center; justify-content: center;
  padding: 24px; background: rgba(23,20,15,0.6); animation: cmFadeIn .2s ease-out;
}
.wiz-venster {
  display: flex; width: 100%; max-width: 1040px; height: min(700px, 92vh); overflow: hidden;
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--elev-3);
  animation: wiz-in .32s cubic-bezier(.16,1,.3,1);
}
@keyframes wiz-in { from { opacity: 0; transform: translateY(8px) scale(.99); } to { opacity: 1; transform: none; } }

/* Rail: de negen stappen als een lijn met haltes. */
.wiz-rail { flex: 0 0 272px; display: flex; flex-direction: column; padding: 30px 26px 22px; background: var(--bg); border-right: 1px solid var(--border); }
.wiz-rail-kop {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 0 0 12px;
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 1rem; font-weight: 600; letter-spacing: -0.01em; color: var(--text-primary, var(--text));
}
.wiz-rail-tel { font-family: 'Inter', sans-serif; font-size: 0.8rem; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: 0; color: var(--text-muted); }
.wiz-rail-meter { display: block; height: 3px; margin: 0 0 22px; border-radius: var(--r-full); background: var(--border); overflow: hidden; }
.wiz-rail-meter span { display: block; height: 100%; width: 0; border-radius: var(--r-full); background: var(--accent-ink); transition: width .35s cubic-bezier(.16,1,.3,1); }
.wiz-stap { position: relative; display: flex; align-items: center; gap: 12px; padding: 7px 0; }
.wiz-stap:not(:last-child)::after {
  content: ''; position: absolute; left: 13px; top: calc(50% + 15px); height: calc(100% - 16px); width: 1px; background: var(--border);
}
.wiz-stap.is-gedaan:not(:last-child)::after { background: var(--accent-c); }
.wiz-stap-bol {
  flex: 0 0 27px; height: 27px; border-radius: var(--r-full); display: flex; align-items: center; justify-content: center; box-sizing: border-box;
  font-size: 0.7667rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--text-muted);
  border: 1px solid var(--border-strong); background: var(--card); position: relative; z-index: 1;
  transition: background-color .2s ease, border-color .2s ease, color .2s ease;
}
.wiz-stap.is-actief .wiz-stap-bol { background: var(--btn-primary-bg); color: var(--btn-primary-text); border-color: transparent; box-shadow: 0 0 0 4px rgba(var(--accent-rgb), 0.28); }
.wiz-stap.is-gedaan .wiz-stap-bol { background: var(--accent-c); border-color: transparent; }
.wiz-stap.is-gedaan .wiz-stap-bol::before {
  content: ''; width: 12px; height: 12px; background: var(--on-accent);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
}
.wiz-stap-naam { font-size: 0.9rem; color: var(--text-muted); }
.wiz-stap.is-gedaan .wiz-stap-naam { color: var(--text-secondary); }
.wiz-stap.is-actief .wiz-stap-naam { color: var(--text-primary, var(--text)); font-weight: 600; }
.wiz-rail-vul { flex: 1; min-height: 24px; }
.wiz-gids { display: flex; align-items: flex-end; gap: 10px; padding-top: 16px; border-top: 1px solid var(--border); }
.wiz-gids-faro { width: 48px; height: 48px; flex: 0 0 48px; display: block; }
.wiz-gids-tekst {
  position: relative; flex: 1; font-size: 0.8333rem; line-height: 1.45; color: var(--text-secondary);
  background: var(--card); border: 1px solid var(--border); border-radius: var(--r-md); border-bottom-left-radius: var(--r-xs); padding: 9px 11px;
}

/* Inhoud */
.wiz-rechts { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.wiz-voortgang { display: none; }
.wiz-inhoud { flex: 1; overflow-y: auto; padding: 44px 56px 28px; scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
.wiz-binnen { max-width: 540px; }
.wiz-stapkop { margin: 0 0 10px; font-size: 0.8rem; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: 0.02em; color: var(--accent-ink); }
.wiz-titel { margin: 0 0 10px; font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 700; font-size: 1.8667rem; line-height: 1.12; letter-spacing: -0.025em; color: var(--text-primary, var(--text)); text-wrap: balance; }
.wiz-sub { margin: 0 0 28px; font-size: 1rem; line-height: 1.6; color: var(--text-secondary); max-width: 54ch; text-wrap: pretty; }
.wiz-fout { min-height: 20px; margin: 14px 0 0; font-size: 0.8667rem; font-weight: 500; color: var(--error-ink); }
.wiz-fout:not(:empty) { display: flex; align-items: flex-start; gap: 8px; }
.wiz-fout:not(:empty)::before {
  content: ''; flex: none; width: 15px; height: 15px; margin-top: 2px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='12.5'/><line x1='12' y1='16.5' x2='12.01' y2='16.5'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='12.5'/><line x1='12' y1='16.5' x2='12.01' y2='16.5'/></svg>") center / contain no-repeat;
}
.wiz-lijst { margin: 0; padding: 0; list-style: none; display: grid; gap: 12px; }
.wiz-lijst li { position: relative; padding-left: 30px; font-size: 0.9667rem; line-height: 1.55; color: var(--text-secondary); }
.wiz-lijst li::before {
  content: ''; position: absolute; left: 0; top: 1px; width: 20px; height: 20px; border-radius: var(--r-full);
  background: rgba(var(--accent-rgb), 0.32) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236E5320' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / 11px 11px no-repeat;
}
.wiz-noot, .wiz-hint, .wiz-volgende { margin: 16px 0 0; font-size: 0.8667rem; line-height: 1.6; color: var(--text-muted); }
.wiz-noot { padding-top: 16px; border-top: 1px solid var(--border); margin-top: 24px; }
.wiz-zacht { opacity: .8; }
.wiz-label { display: block; margin: 0 0 8px; font-size: 0.8667rem; font-weight: 600; color: var(--text-primary, var(--text)); }
.wiz-label--na { margin-top: 20px; }
.wiz-veld {
  display: block; width: 100%; box-sizing: border-box; min-height: 46px; padding: 11px 14px; font: inherit; font-size: 0.9667rem;
  color: var(--text-primary, var(--text)); background: var(--card-elevated, var(--bg)); border: 1px solid var(--border-strong); border-radius: var(--r-sm);
  box-shadow: 0 1px 2px rgba(23,19,12,0.04); transition: border-color .15s ease, box-shadow .15s ease;
}
.wiz-veld--tekst { line-height: 1.55; resize: vertical; }
/* Keuzelijsten in dezelfde vorm als de velden, met een eigen pijltje. */
select.wiz-veld {
  appearance: none; -webkit-appearance: none; padding-right: 40px; cursor: pointer;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%238A7F6B' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 15px center;
}
.wiz-veld--klein { min-height: 40px; margin-top: 10px; font-size: 0.9rem; }
.wiz-veld::placeholder { color: var(--text-muted); opacity: 0.7; }
.wiz-veld:hover { border-color: var(--accent-ink); }
.wiz-veld:focus { outline: none; border-color: var(--accent-ink); box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.32); }

/* Markt: kiezen is doorgaan; de gekozen kaart draagt een gevuld vinkje. */
.wiz-markt {
  display: flex; gap: 14px; align-items: center; width: 100%; text-align: left; padding: 14px 16px; margin: 0 0 10px;
  border-radius: var(--r-md); border: 1px solid var(--border); background: var(--card); cursor: pointer; font: inherit; position: relative;
  transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}
.wiz-markt:hover { border-color: var(--border-strong); background: var(--bg); }
.wiz-markt:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.wiz-markt.is-gekozen { border-color: var(--accent-ink); background: rgba(var(--accent-rgb), 0.16); box-shadow: inset 0 0 0 1px var(--accent-ink); }
.wiz-markt.is-gekozen::after {
  content: ''; width: 22px; height: 22px; flex: none; margin-left: auto; border-radius: var(--r-full);
  background: var(--accent-ink) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / 12px 12px no-repeat;
}
.wiz-markt-icoon { flex: 0 0 40px; height: 40px; border-radius: var(--r-sm); display: flex; align-items: center; justify-content: center; background: rgba(var(--accent-rgb), 0.22); color: var(--accent-ink); }
.wiz-markt.is-gekozen .wiz-markt-icoon { background: var(--card); }
.wiz-markt-tekst { flex: 1; min-width: 0; }
.wiz-markt-naam { display: block; font-size: 0.9667rem; font-weight: 600; color: var(--text-primary, var(--text)); }
.wiz-markt-uitleg { display: block; margin-top: 3px; font-size: 0.8667rem; line-height: 1.5; color: var(--text-muted); }

/* Kanalen en koppelingen */
.wiz-kaart { border: 1px solid var(--border); border-radius: var(--r-md); padding: 16px 18px; margin: 0 0 12px; background: var(--card); }
.wiz-kaart-kop { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.wiz-kaart-naam { font-size: 0.9667rem; font-weight: 600; color: var(--text-primary, var(--text)); }
.wiz-optioneel { font-weight: 400; font-size: 0.8rem; color: var(--text-muted); margin-left: 4px; }
/* De status als label: tekst in zijn eigen kleur (wizBadge zet die), op een
   neutraal vlak met rand -- zo leest elke kleur, en nooit alleen de kleur. */
.wiz-badge {
  display: inline-flex; align-items: center; padding: 3px 10px; border-radius: var(--r-full); border: 1px solid var(--border);
  background: var(--bg); font-size: 0.7667rem; font-weight: 600; line-height: 1.4; color: var(--text-muted); white-space: nowrap;
}
.wiz-kaart-uitleg { margin: 8px 0 0; font-size: 0.8667rem; line-height: 1.6; color: var(--text-muted); }
.wiz-kaart-uitleg:empty { display: none; }
.wiz-kaart-knop {
  margin-top: 12px; padding: 8px 14px; border-radius: var(--r-sm); border: 1px solid var(--border-strong); background: var(--card);
  color: var(--text-primary, var(--text)); font: inherit; font-size: 0.8667rem; font-weight: 600; cursor: pointer; white-space: nowrap;
  transition: border-color .15s ease, background-color .15s ease;
}
.wiz-kaart-knop:hover { border-color: var(--accent-ink); background: rgba(var(--accent-rgb), 0.14); }
.wiz-kaart-knop:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.wiz-kaart-knop:disabled { opacity: .55; cursor: default; }
.wiz-code { display: block; margin-top: 10px; padding: 10px 12px; border-radius: var(--r-sm); background: var(--bg); border: 1px solid var(--border); font-size: 0.7667rem; line-height: 1.5; word-break: break-all; color: var(--text-primary, var(--text)); }
/* Meldingen en uren, en het testbericht op Klaar (api/_dash/wizard-volledig.js) */
.wiz-tel { display: flex; align-items: center; width: 100%; box-sizing: border-box; min-height: 46px; background: var(--card-elevated, var(--bg)); border: 1px solid var(--border-strong); border-radius: var(--r-sm); box-shadow: 0 1px 2px rgba(23,19,12,0.04); transition: border-color .15s ease, box-shadow .15s ease; }
.wiz-tel:hover { border-color: var(--accent-ink); }
.wiz-tel:focus-within { border-color: var(--accent-ink); box-shadow: 0 0 0 3px rgba(var(--accent-rgb), 0.32); }
.wiz-tel-land { position: relative; display: flex; align-items: center; gap: 6px; align-self: stretch; padding: 0 10px 0 14px; border-right: 1px solid var(--border); color: var(--text-muted); cursor: pointer; }
.wiz-tel-land:focus-within { outline: 2px solid var(--accent-ink); outline-offset: -2px; }
.wiz-tel-vlag { font-size: 1.25rem; line-height: 1; }
.wiz-tel-land select { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; font-size: 1rem; border: 0; }
.wiz-tel-prefix { padding-left: 12px; white-space: nowrap; font-size: 0.9667rem; color: var(--text-primary, var(--text)); }
.wiz-tel input { flex: 1 1 auto; min-width: 0; border: 0; background: transparent; box-shadow: none; outline: none; padding: 11px 14px 11px 8px; font: inherit; font-size: 0.9667rem; color: var(--text-primary, var(--text)); }
.wiz-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.wiz-chip { padding: 6px 12px; border-radius: var(--r-full); border: 1px solid var(--border-strong); background: transparent; color: var(--text-primary, var(--text)); font: inherit; font-size: 0.8667rem; cursor: pointer; transition: border-color .15s ease, background-color .15s ease; }
.wiz-chip:hover { border-color: var(--accent-ink); }
.wiz-chip:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.wiz-chip[aria-pressed="true"] { border-color: var(--accent-ink); background: rgba(var(--accent-rgb), 0.22); font-weight: 600; }
.wiz-klaar-rij { flex-wrap: wrap; }
.wiz-klaar-detail { display: block; font-size: 0.8rem; color: var(--text-muted); }
.wiz-klaar-rij .wiz-kaart-knop { margin-top: 0; padding: 5px 12px; }
.wiz-test { margin-top: 28px; padding: 18px 18px 16px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--bg); }
.wiz-test .wiz-hint { margin-top: 4px; }
.wiz-test-uit { min-height: 20px; margin-top: 10px; font-size: 0.8667rem; line-height: 1.5; color: var(--text-muted); }
.wiz-test-uit.is-ok { color: var(--success-ink); }
.wiz-test-uit.is-fout { color: var(--error-ink); }

/* Klaar: eerst de link en de stand, dan de regels. */
.wiz-link {
  position: relative; user-select: all; -webkit-user-select: all; word-break: break-all; padding: 13px 14px 13px 40px; margin: 0 0 28px;
  background: var(--bg); border: 1px solid var(--border-strong); border-radius: var(--r-sm); font-size: 0.9333rem; font-weight: 500; color: var(--text-primary, var(--text));
}
.wiz-link::before {
  content: ''; position: absolute; left: 14px; top: 50%; width: 16px; height: 16px; margin-top: -8px; background: var(--accent-ink);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7'/><path d='M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M10 13a5 5 0 0 0 7.5.5l3-3a5 5 0 0 0-7-7l-1.7 1.7'/><path d='M14 11a5 5 0 0 0-7.5-.5l-3 3a5 5 0 0 0 7 7l1.7-1.7'/></svg>") center / contain no-repeat;
}
.wiz-kopje { font-size: 0.8667rem; font-weight: 600; color: var(--text-primary, var(--text)); margin: 0 0 4px; }
.wiz-klaar-kop { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.wiz-klaar-kop .wiz-kopje { margin: 0; }
.wiz-klaar-telling { font-size: 0.8rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--text-muted); }
.wiz-klaar-meter { display: block; height: 4px; margin: 10px 0 6px; border-radius: var(--r-full); background: var(--border); overflow: hidden; }
.wiz-klaar-meter span { display: block; height: 100%; border-radius: var(--r-full); background: var(--success-c); }
.wiz-klaar-lijst { list-style: none; margin: 0 0 6px; padding: 0; }
.wiz-klaar-rij { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--border); font-size: 0.9333rem; }
.wiz-klaar-bol { width: 20px; height: 20px; border-radius: var(--r-full); flex: none; box-sizing: border-box; border: 1.5px dashed var(--border-strong); display: inline-flex; align-items: center; justify-content: center; }
.wiz-klaar-bol.is-aan { border: 0; background: var(--success-c); }
.wiz-klaar-bol.is-aan::before {
  content: ''; width: 11px; height: 11px; background: #FFFFFF;
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
}
.wiz-klaar-naam { flex: 1; min-width: 0; color: var(--text-primary, var(--text)); }
.wiz-klaar-status { font-size: 0.7667rem; font-weight: 600; color: var(--text-muted); padding: 2px 9px; border-radius: var(--r-full); border: 1px solid var(--border); background: var(--bg); }
.wiz-klaar-status.is-aan { color: var(--success-ink); border-color: transparent; background: color-mix(in srgb, var(--success-c) 13%, transparent); }

/* Voet */
.wiz-voet { display: flex; align-items: center; gap: 10px; padding: 16px 56px; border-top: 1px solid var(--border); background: var(--card); }
.wiz-voet-vul { flex: 1; }
.wiz-knop {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 44px; padding: 0 18px; border-radius: var(--r-sm);
  font: inherit; font-size: 0.9333rem; font-weight: 600; cursor: pointer;
  transition: filter .15s ease, background-color .15s ease, border-color .15s ease, color .15s ease;
}
.wiz-knop:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.wiz-knop--stil { padding: 0 12px; margin-left: -12px; background: none; border: 0; color: var(--text-muted); font-weight: 500; }
.wiz-knop--stil:hover { color: var(--text-primary, var(--text)); }
.wiz-knop--terug { background: transparent; border: 1px solid var(--border-strong); color: var(--text-primary, var(--text)); }
.wiz-knop--terug:hover { border-color: var(--accent-ink); background: var(--bg); }
.wiz-knop--hoofd { min-width: 140px; background: var(--btn-primary-bg); color: var(--btn-primary-text); border: 0; font-family: 'Space Grotesk', 'Inter', sans-serif; }
.wiz-knop--hoofd::after {
  content: ''; width: 14px; height: 14px; flex: none; background: currentColor; transition: transform .2s cubic-bezier(.16,1,.3,1);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='5' y1='12' x2='19' y2='12'/><polyline points='12 5 19 12 12 19'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='5' y1='12' x2='19' y2='12'/><polyline points='12 5 19 12 12 19'/></svg>") center / contain no-repeat;
}
.wiz-knop--hoofd:hover { filter: brightness(1.12); }
.wiz-knop--hoofd:hover::after { transform: translateX(2px); }
/* Opslaan: de knop is uitgeschakeld met de tekst "Opslaan..."; een draaier
   ervoor in plaats van de pijl erachter. Niet half doorzichtig. */
.wiz-knop--hoofd:disabled { cursor: progress; filter: none; }
.wiz-knop--hoofd:disabled::after { display: none; }
.wiz-knop--hoofd:disabled::before {
  content: ''; width: 14px; height: 14px; flex: none; box-sizing: border-box; border-radius: var(--r-full);
  border: 2px solid currentColor; border-right-color: transparent; animation: spin .7s linear infinite;
}

/* Telefoon: geen rail, wel een compacte stand bovenaan; het venster is het scherm. */
.wiz-overlay.is-smal { padding: 0; }
.wiz-overlay.is-smal .wiz-venster { height: 100%; max-width: none; border-radius: 0; border: 0; }
.wiz-overlay.is-smal .wiz-rail { display: none; }
.wiz-overlay.is-smal .wiz-voortgang { display: block; padding: 16px 20px 14px; border-bottom: 1px solid var(--border); background: var(--bg); }
.wiz-voortgang-tekst { display: block; font-size: 0.8rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--text-secondary); margin-bottom: 10px; }
.wiz-voortgang-baan { display: block; height: 4px; border-radius: var(--r-full); background: var(--border); overflow: hidden; }
.wiz-voortgang-vul { display: block; height: 100%; border-radius: var(--r-full); background: var(--accent-ink); transition: width .3s cubic-bezier(.16,1,.3,1); }
.wiz-overlay.is-smal .wiz-stapkop { display: none; }
.wiz-overlay.is-smal .wiz-inhoud { padding: 22px 20px 18px; }
.wiz-overlay.is-smal .wiz-binnen { max-width: none; }
.wiz-overlay.is-smal .wiz-titel { font-size: 1.5333rem; }
.wiz-overlay.is-smal .wiz-sub { margin-bottom: 22px; }
.wiz-overlay.is-smal .wiz-voet { gap: 8px; padding: 12px 16px calc(12px + env(safe-area-inset-bottom, 0px)); }
.wiz-overlay.is-smal .wiz-knop--hoofd { flex: 1 1 auto; min-width: 0; }
.wiz-overlay.is-smal .wiz-voet-vul { display: none; }
.wiz-overlay.is-smal .wiz-knop--stil { margin-left: -6px; padding: 0 8px; }
@media (prefers-reduced-motion: reduce) {
  .wiz-venster, .wiz-overlay { animation: none; }
  .wiz-markt, .wiz-knop, .wiz-veld, .wiz-voortgang-vul, .wiz-rail-meter span, .wiz-stap-bol, .wiz-knop--hoofd::after { transition: none; }
  .wiz-knop--hoofd:hover::after { transform: none; }
  .wiz-knop--hoofd:disabled::before { animation-duration: 1.6s; }
}

/* ═══ Inlogpodium, derde herontwerp 2026-10-13 ═══════════════════════════
   Licht eerst. Het tweede herontwerp zette alles op zijn plek; dit maakt het
   rustiger en preciezer, zonder iets toe te voegen dat we niet waarmaken:
   - het podium rechts staat op warm zand (#F4E7C8, het palet) en draagt een
     paar haarfijne cirkels -- de cirkel uit het beeldmerk, verder niets;
   - links één leesritme: logo, kop, velden, knop, en onderaan één voetregel
     met de taalkeuze ernaast in plaats van eroverheen geschoven;
   - velden en knop hebben echte toestanden: hover, focus (ring in zand-inkt),
     fout (rode rand zolang de melding staat) en bezig (draaier + tekst);
   - /signup krijgt een eigen korte lijst "zo gaat het verder";
   - de uitlegalinea onder de vinkjes staat alleen nog waar het podium er niet
     is (smal scherm) -- naast het podium zei hij twee keer hetzelfde.
   NIETS beweegt uit zichzelf (WCAG 2.2.2): de tabs wisselen op een klik. */
/* De hoekschaal komt uit api/_faro/ui/tokens.js, en die staat alleen in de
   pagina als Faro aanstaat (FARO_WORKSPACE_ENABLED). Zonder Faro waren
   var(--r-sm) en co. leeg en had het inlogscherm en de wizard overal
   vierkante hoeken. Dezelfde waarden, alleen hier, zodat ze er altijd zijn. */
#login-page, .wiz-overlay { --r-xs: 6px; --r-sm: 10px; --r-md: 14px; --r-lg: 18px; --r-full: 999px; }
#login-page {
  --login-stage:       #F4E7C8;   /* warm zand: het podium */
  --login-stage-muted: #5E5546;   /* lopende tekst op het zand: 6,3:1 */
  --login-ring-line:   rgba(184,157,115,0.34);
  --login-card-edge:   #D8C49A;
  --login-card-shadow: 0 1px 2px rgba(23,19,12,0.05), 0 32px 64px -32px rgba(110,83,32,0.32);
  --login-skelet:      #ECE3D1;
  --login-fill-hover:  #DDCAA1;
  --login-fill-press:  #D3BE90;
  --login-error-ring:  rgba(194,53,43,0.14);
}
[data-theme="dark"] #login-page {
  --login-stage:       #17140F;
  --login-stage-muted: #A79B85;
  --login-ring-line:   rgba(232,215,177,0.07);
  --login-card-edge:   #3A3327;
  --login-card-shadow: none;
  --login-skelet:      #2A251C;
  --login-error-ring:  rgba(228,102,90,0.16);
}
#login-page .login-split { display: grid; grid-template-columns: minmax(480px, 560px) 1fr; width: 100%; height: 100vh; height: 100dvh; }

/* ── Links: het formulier ── */
#login-page .login-form-side {
  position: relative; flex: none; width: auto; padding: 36px 72px 28px; background: var(--login-panel);
  border-right: 1px solid var(--login-line); align-items: stretch; overflow-y: auto;
}
#login-page .login-form-side::after { display: none; }
#login-page .login-form-inner { max-width: 400px; width: 100%; margin: 0 auto; min-height: 100%; display: flex; flex-direction: column; }
/* Geen blok in deze kolom mag krimpen: groeit Clerks kaart, dan scrolt de
   kolom in plaats van dat het formulier over de vinkjes heen loopt. */
#login-page .login-form-inner > * { flex-shrink: 0; }
#login-page .login-logo-top { display: block; align-self: flex-start; margin: 0 0 auto; padding-bottom: 44px; text-align: left; }
#login-page .login-logo-top img { width: 132px; height: auto; display: block; }
#login-page .login-welcome {
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 700; font-size: 2.6rem;
  line-height: 1.04; letter-spacing: -0.032em; color: var(--login-text); margin: 0 0 12px; text-wrap: balance;
}
#login-page .login-subtitle { font-size: 1.0667rem; line-height: 1.5; color: var(--login-muted); margin: 0 0 32px; max-width: 34ch; text-wrap: pretty; }

/* Velden: label in inkt, veld iets lichter dan het paneel, zand-inkt bij focus. */
#login-page .form-group { margin-bottom: 20px; }
#login-page .form-label {
  display: block; font-size: 0.8667rem; font-weight: 600; letter-spacing: 0; text-transform: none;
  color: var(--login-text); margin-bottom: 8px;
}
#login-page .form-input {
  width: 100%; height: 50px; background: var(--login-input-bg); border: 1px solid var(--login-field-line); border-radius: var(--r-sm);
  color: var(--login-text); font-size: 1.0667rem; padding: 0 16px; caret-color: var(--login-caret);
  box-shadow: 0 1px 2px rgba(23,19,12,0.04);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}
#login-page .form-input::placeholder { color: var(--login-placeholder); }
#login-page .form-input:hover { border-color: var(--login-input-hover); }
#login-page .form-input:focus, #login-page .form-input:focus-visible { outline: none; border-color: var(--login-accent-ink); box-shadow: 0 0 0 3px var(--login-ring); background: var(--login-input-bg); }
/* Fout: de velden zeggen het mee zolang de melding staat (kleur is niet het
   enige signaal -- de melding zelf staat er in tekst onder). */
#login-page #login-form-wrap:has(.login-error.visible) .form-input { border-color: var(--login-error); }
#login-page #login-form-wrap:has(.login-error.visible) .form-input:focus { box-shadow: 0 0 0 3px var(--login-error-ring); }
#login-page .login-pw-toggle {
  position: absolute; right: 7px; top: 50%; transform: translateY(-50%); width: 36px; height: 36px;
  display: flex; align-items: center; justify-content: center; background: none; border: 0; border-radius: var(--r-xs);
  color: var(--login-muted); cursor: pointer; padding: 0; transition: color .15s ease, background-color .15s ease;
}
#login-page .login-pw-toggle:hover { color: var(--login-text); background: var(--login-hover); }
#login-page .login-pw-toggle:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 0; }

/* De ene knop: zand gevuld, houtskool erop. Geen rimpel, geen zweven. */
#login-page .btn-login {
  display: flex; align-items: center; justify-content: center; width: 100%; height: 50px; min-height: 50px; padding: 0 20px; margin-top: 8px;
  border-radius: var(--r-sm); background: var(--login-fill); color: var(--login-on-fill); border: 1px solid var(--login-fill-edge);
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 600; font-size: 1.0667rem; letter-spacing: -0.005em;
  box-shadow: 0 1px 2px rgba(23,19,12,0.08), inset 0 1px 0 rgba(255,255,255,0.4);
  transform: none; transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease;
}
#login-page .btn-login::before, #login-page .btn-login::after { display: none; }
#login-page .btn-login:hover { background: var(--login-fill-hover); transform: none; box-shadow: 0 1px 2px rgba(23,19,12,0.10), inset 0 1px 0 rgba(255,255,255,0.4); }
#login-page .btn-login:active { background: var(--login-fill-press); transform: none; box-shadow: none; }
#login-page .btn-login:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 3px; box-shadow: none; }
#login-page .btn-login span svg { transition: transform .2s cubic-bezier(.16,1,.3,1); }
#login-page .btn-login:hover span svg { transform: translateX(2px); }
/* Bezig: de knop blijft staan, krijgt een draaier en de tekst "Bezig..." die
   handleLogin() er zelf in zet. Niet half doorzichtig: dat leest als kapot. */
#login-page .btn-login:disabled, #login-page .btn-login.loading { opacity: 1; cursor: progress; background: var(--login-fill-hover); box-shadow: none; filter: none; }
#login-page .btn-login.loading span { opacity: 1; gap: 10px; }
.btn-login.loading span::before {
  content: ''; width: 16px; height: 16px; flex: none; box-sizing: border-box; border-radius: var(--r-full);
  border: 2px solid rgba(26,26,26,0.22); border-top-color: #1A1A1A; animation: spin .7s linear infinite;
}
#login-page .login-links { margin-top: 16px; text-align: center; }
#login-page .login-link {
  color: var(--login-accent-ink); font-size: 0.9rem; font-weight: 500; text-decoration: underline;
  text-decoration-color: var(--login-link-line); text-underline-offset: 3px; border-radius: var(--r-xs);
}
#login-page .login-link:hover { color: var(--login-text); text-decoration-color: currentColor; }

/* De foutmelding: links uitgelijnd, eigen icoon in de tekstkleur, en hij komt
   rustig binnen in plaats van te verspringen. */
#login-page .login-error.visible {
  justify-content: flex-start; align-items: flex-start; text-align: left; gap: 10px; margin-top: 14px; padding: 12px 14px;
  border-radius: var(--r-sm); background: var(--login-error-bg); border: 1px solid var(--login-error-line); color: var(--login-error);
  font-size: 0.9rem; font-weight: 500; line-height: 1.45; animation: login-fout-in .22s cubic-bezier(.16,1,.3,1);
}
#login-page .login-error::before {
  width: 16px; height: 16px; margin-top: 2px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='12.5'/><line x1='12' y1='16.5' x2='12.01' y2='16.5'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'><circle cx='12' cy='12' r='9.5'/><line x1='12' y1='7.5' x2='12' y2='12.5'/><line x1='12' y1='16.5' x2='12.01' y2='16.5'/></svg>") center / contain no-repeat;
}
@keyframes login-fout-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* Onder het formulier: de weg naar de andere pagina. */
#login-page .auth-switch { margin-top: 24px; font-size: 0.9333rem; }

/* /signup: wat er na het aanmelden gebeurt. Drie regels, genummerd, allemaal
   waar (de setup-wizard: markt, bedrijf, assistent, kanalen; overslaan kan). */
#login-page .auth-stappen { margin: 32px 0 0; padding: 22px 0 0; border-top: 1px solid var(--login-line); }
#login-page .auth-stappen-kop { margin: 0 0 14px; font-size: 0.8667rem; font-weight: 600; color: var(--login-text); }
#login-page .auth-stappen ol { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; counter-reset: auth-stap; }
#login-page .auth-stappen li {
  counter-increment: auth-stap; display: grid; grid-template-columns: 24px 1fr; gap: 12px; align-items: start;
  font-size: 0.9rem; line-height: 1.5; color: var(--login-muted);
}
#login-page .auth-stappen li::before {
  content: counter(auth-stap); display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; box-sizing: border-box;
  border-radius: var(--r-full); border: 1px solid var(--login-card-edge); background: var(--login-panel-lift);
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 0.8rem; font-weight: 600; font-variant-numeric: tabular-nums; color: var(--login-accent-ink);
}
/* Staat aanmelden uit (geen Clerk, geen open aanmelding), dan is er geen "verder". */
#login-page:has(#signup-uit) .auth-stappen { display: none; }

/* Drie feiten, een getekend vinkje. */
#login-page .login-trust {
  display: flex; flex-wrap: wrap; gap: 8px 20px; justify-content: flex-start; list-style: none; margin: 28px 0 32px; padding: 20px 0 0;
  border-top: 1px solid var(--login-line); color: var(--login-text); font-size: 0.8667rem;
}
html[data-auth="signup"] #login-page .auth-stappen + .login-trust { border-top: 0; padding-top: 0; margin-top: 20px; }
#login-page .login-trust li { gap: 8px; }
#login-page .login-trust li::before {
  content: ''; width: 14px; height: 14px; flex: none; border-radius: 0; background: var(--login-accent-ink);
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>") center / contain no-repeat;
}
/* Naast het podium zegt het podium dit al; alleen op een smal scherm, waar
   het podium wegvalt, staat de uitleg hier. */
#login-page .login-what { display: none; margin: -12px 0 32px; font-size: 0.8667rem; line-height: 1.6; color: var(--login-muted); max-width: 46ch; text-align: left; }

/* De voetregel: copyright links, taal rechts, op één lijn. */
#login-page .login-voet {
  margin-top: auto; padding-top: 20px; border-top: 1px solid var(--login-line);
  display: flex; align-items: center; justify-content: space-between; gap: 12px 16px; flex-wrap: wrap;
}
#login-page .login-footer { margin: 0; padding: 0; border: 0; color: var(--login-muted); font-size: 0.8rem; letter-spacing: 0; text-align: left; }
#login-page .login-lang { position: static; align-self: auto; margin: 0; }
#login-page .login-lang select {
  color-scheme: light; height: 34px; padding: 0 30px 0 32px; border: 1px solid var(--login-line); border-radius: var(--r-xs);
  background-color: var(--login-input-bg); color: var(--login-text); font-size: 0.8667rem; font-weight: 500;
  background-image:
    url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%238A7F6B' stroke-width='1.8' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9.5'/%3E%3Cpath d='M2.5 12h19M12 2.5c2.6 2.8 3.9 6 3.9 9.5s-1.3 6.7-3.9 9.5c-2.6-2.8-3.9-6-3.9-9.5s1.3-6.7 3.9-9.5z'/%3E%3C/svg%3E"),
    url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%238A7F6B' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat, no-repeat; background-position: left 11px center, right 11px center;
  transition: border-color .15s ease;
}
[data-theme="dark"] #login-page .login-lang select { color-scheme: dark; }
#login-page .login-lang select:hover { border-color: var(--login-field-line); color: var(--login-text); }

/* ── Rechts: het podium ── */
#login-page .login-brand-side {
  position: relative; isolation: isolate; padding: 64px 72px; background: var(--login-stage);
  display: flex; flex-direction: column; align-items: center; justify-content: center; overflow: hidden;
}
/* De cirkel uit het beeldmerk, als haarlijnen die naar de hoek uitdoven.
   Puur decor (geen inhoud), dus geen aria en geen beweging. */
#login-page .login-brand-side::before {
  content: ''; position: absolute; z-index: -1; width: 1200px; height: 1200px; right: -520px; bottom: -560px; border-radius: var(--r-full);
  background: repeating-radial-gradient(circle at center, transparent 0 79px, var(--login-ring-line) 79px 80px);
  -webkit-mask: radial-gradient(circle at center, #000 0 34%, transparent 68%);
          mask: radial-gradient(circle at center, #000 0 34%, transparent 68%);
  pointer-events: none;
}
#login-page .login-brand-side::after { display: none; }
#login-page .brand-slides-wrap { max-width: 600px; width: 100%; height: auto; min-height: 560px; margin: 0 auto; flex: none; position: static; }
#login-page .brand-slide { display: none; position: static; width: 100%; opacity: 1; transform: none; transition: none; pointer-events: auto; flex-direction: column; align-items: stretch; gap: 0; }
#login-page .brand-slide.active { display: flex; }
#login-page .brand-tagline { order: -1; text-align: left; padding: 0; margin-bottom: 40px; }
#login-page .brand-tagline h2 {
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 700; font-size: 3rem; line-height: 1.04;
  letter-spacing: -0.034em; color: var(--login-text); margin: 0 0 16px; text-wrap: balance; max-width: 14ch;
}
#login-page .brand-tagline p { font-size: 1.1333rem; line-height: 1.55; color: var(--login-stage-muted); max-width: 42ch; margin: 0; text-wrap: pretty; }

/* De kaart: een tan rand en een lage, warme schaduw -- het staal op het bord. */
#login-page .brand-card-mock {
  position: relative; width: 100%; max-width: none; background: var(--login-card); border: 1px solid var(--login-card-edge);
  border-radius: var(--r-lg); padding: 0; box-shadow: var(--login-card-shadow); overflow: hidden;
}
#login-page .brand-card-header { display: flex; align-items: center; gap: 10px; padding: 14px 22px; margin: 0; border-bottom: 1px solid var(--login-line); }
/* Drie vensterbolletjes zijn een sjabloon-tic; de kaart heeft een titel nodig, geen vensterrand. */
#login-page .brand-card-dot { display: none; }
#login-page .brand-card-title {
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 0.9333rem; font-weight: 600; letter-spacing: -0.005em;
  text-transform: none; color: var(--login-text);
}
#login-page .brand-chat { gap: 10px; padding: 22px; }
#login-page .brand-chat-msg { max-width: 82%; padding: 11px 15px 9px; border-radius: var(--r-md); font-size: 1rem; line-height: 1.45; }
#login-page .brand-chat-msg.in { background: var(--login-bubble-in); color: var(--login-text); border-bottom-left-radius: var(--r-xs); }
#login-page .brand-chat-msg.out { background: var(--login-fill); color: var(--login-on-fill); border-bottom-right-radius: var(--r-xs); }
#login-page .brand-chat-msg.out em { color: rgba(26,26,26,0.72); opacity: 1; }
#login-page .brand-chat-msg em { font-size: 0.7667rem; font-style: normal; font-variant-numeric: tabular-nums; }
#login-page .brand-chat-msg.in em { color: var(--login-muted); opacity: 1; }
#login-page .brand-score-row { padding: 28px 24px; gap: 28px; }
#login-page .brand-score-ring circle:first-child { stroke: var(--login-bar-bg); }
#login-page .brand-score-ring circle:last-child { stroke: var(--login-accent-ink); }
#login-page .brand-score-ring, #login-page .brand-score-ring svg { width: 104px; height: 104px; }
#login-page .brand-score-items { flex: 1; min-width: 0; }
#login-page .brand-score-bar-wrap { width: 100%; height: 6px; background: var(--login-bar-bg); }
#login-page .brand-score-bar-fill { background: var(--login-accent-ink); box-shadow: none; }
#login-page .brand-score-label { font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 1.4rem; font-variant-numeric: tabular-nums; color: var(--login-text); }
#login-page .brand-score-item span { font-size: 0.9333rem; color: var(--login-muted); }
#login-page .brand-agenda { padding: 22px; gap: 10px; }
#login-page .brand-agenda-item { padding: 14px 16px; border-radius: var(--r-sm); background: var(--login-card-inset); border: 1px solid var(--login-line); }
#login-page .brand-agenda-time { font-family: 'Space Grotesk', 'Inter', sans-serif; font-variant-numeric: tabular-nums; font-size: 1.0333rem; color: var(--login-text); }
#login-page .brand-agenda-name { font-size: 1.0333rem; color: var(--login-text); }
#login-page .brand-agenda-tag { font-size: 0.8667rem; color: var(--login-muted); }

/* Tabs: een vaste lijn, de actieve in zand-inkt. Niets loopt mee. */
#login-page .brand-dots { justify-content: flex-start; gap: 10px; margin: 44px auto 0; max-width: 600px; width: 100%; padding: 0; }
#login-page .brand-dot {
  width: auto; height: 44px; flex: 1; padding: 0; background: none; border-radius: 0; position: relative;
  display: flex; align-items: flex-end; text-align: left; cursor: pointer;
}
#login-page .brand-dot::before { content: ''; position: absolute; left: 0; top: 0; height: 2px; border-radius: 2px; background: var(--login-card-edge); width: 100%; }
#login-page .brand-dot::after { content: ''; position: absolute; left: 0; top: 0; height: 2px; border-radius: 2px; background: var(--login-accent-ink); width: 0; }
#login-page .brand-dot.active::after { width: 100%; }
#login-page .brand-dot-label { font-size: 0.9rem; font-weight: 600; color: var(--login-stage-muted); padding-bottom: 4px; transition: color .15s ease; }
#login-page .brand-dot:hover .brand-dot-label { color: var(--login-text); }
#login-page .brand-dot.active .brand-dot-label { color: var(--login-text); }
#login-page .brand-dot.active { width: auto; background: none; }

/* Terwijl Clerk laadt: de vorm van zijn kaart (knop, scheiding, twee velden
   met label, knop), in één rustige tint -- geen tweede kop, die staat er al. */
#login-page #clerk-skelet { min-height: 300px; padding: 0; }
#login-page .skelet-regel, #login-page .skelet-veld, #login-page .skelet-knop { background: var(--login-skelet); border: 0; border-radius: var(--r-sm); }
#login-page .skelet-titel { width: 100%; height: 50px; margin: 0; }
#login-page .skelet-sub { width: 100%; height: 1px; margin: 24px 0 28px; border-radius: 0; }
#login-page .skelet-veld { position: relative; height: 50px; margin: 40px 0 0; }
#login-page .skelet-sub + .skelet-veld { margin-top: 22px; }
#login-page .skelet-veld::before { content: ''; position: absolute; left: 0; top: -20px; width: 30%; height: 10px; border-radius: var(--r-xs); background: inherit; }
#login-page .skelet-knop { height: 50px; margin-top: 28px; background: var(--login-fill); opacity: .55; }

/* Clerk (het echte formulier op productie) krijgt dezelfde velden en knop. */
#login-page #clerk-signin .cl-formFieldInput, #login-page #clerk-signin .cl-input {
  height: 50px; min-height: 50px; background: var(--login-input-bg); border: 1px solid var(--login-field-line); border-radius: var(--r-sm);
  font-size: 1.0667rem; color: var(--login-text); caret-color: var(--login-caret); box-shadow: 0 1px 2px rgba(23,19,12,0.04);
  transition: border-color .15s ease, box-shadow .15s ease;
}
#login-page #clerk-signin .cl-formFieldInput:hover, #login-page #clerk-signin .cl-input:hover { border-color: var(--login-input-hover); }
#login-page #clerk-signin .cl-formFieldInput:focus, #login-page #clerk-signin .cl-input:focus { outline: none; border-color: var(--login-accent-ink); box-shadow: 0 0 0 3px var(--login-ring); }
#login-page #clerk-signin .cl-formFieldInput[aria-invalid="true"] { border-color: var(--login-error); }
#login-page #clerk-signin .cl-formFieldLabel { font-size: 0.8667rem; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--login-text); }
#login-page #clerk-signin .cl-formButtonPrimary {
  height: 50px; border-radius: var(--r-sm); background: var(--login-fill); color: var(--login-on-fill); border: 1px solid var(--login-fill-edge);
  box-shadow: 0 1px 2px rgba(23,19,12,0.08), inset 0 1px 0 rgba(255,255,255,0.4);
  font-family: 'Space Grotesk', 'Inter', sans-serif; font-weight: 600; font-size: 1.0667rem; text-transform: none; letter-spacing: -0.005em;
  transition: background-color .15s ease;
}
#login-page #clerk-signin .cl-formButtonPrimary:hover { background: var(--login-fill-hover); filter: none; }
#login-page #clerk-signin .cl-formButtonPrimary:active { background: var(--login-fill-press); }
#login-page #clerk-signin .cl-formButtonPrimary:focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 3px; box-shadow: none; }
#login-page #clerk-signin .cl-socialButtonsBlockButton {
  height: 50px; border-radius: var(--r-sm); background: var(--login-input-bg); border: 1px solid var(--login-field-line); color: var(--login-text);
  box-shadow: 0 1px 2px rgba(23,19,12,0.04); transition: background-color .15s ease, border-color .15s ease;
}
#login-page #clerk-signin .cl-socialButtonsBlockButton:hover { background: var(--login-panel-lift); border-color: var(--login-input-hover); }
#login-page #clerk-signin .cl-socialButtonsBlockButtonText { font-weight: 600; color: var(--login-text); }
#login-page #clerk-signin .cl-dividerLine { background: var(--login-line); }
#login-page #clerk-signin .cl-dividerText { color: var(--login-muted); font-size: 0.8rem; }
#login-page #clerk-signin .cl-formFieldErrorText, #login-page #clerk-signin .cl-formFieldWarningText, #login-page #clerk-signin .cl-alertText { color: var(--login-error); }
#login-page #clerk-signin .cl-alert { border-radius: var(--r-sm); background: var(--login-error-bg); border: 1px solid var(--login-error-line); }
#login-page #clerk-signin a, #login-page #clerk-signin .cl-footerActionLink, #login-page #clerk-signin .cl-formResendCodeLink, #login-page #clerk-signin .cl-identityPreviewEditButton { color: var(--login-accent-ink); }
#login-page #clerk-signin .cl-identityPreview { border-radius: var(--r-sm); border: 1px solid var(--login-line); background: var(--login-input-bg); }
#login-page #clerk-signin .cl-otpCodeFieldInput { border-radius: var(--r-sm); border: 1px solid var(--login-field-line); background: var(--login-input-bg); }

#login-page #clerk-toggle { color: var(--login-muted); text-align: center; margin-top: 16px; }
#login-page .clerk-toggle-link { color: var(--login-accent-ink); text-decoration-color: var(--login-link-line); text-underline-offset: 3px; }
#login-page .clerk-toggle-link:hover { color: var(--login-text); text-decoration-color: currentColor; }

/* Het podium kleurt ook wat de browser zelf tekent. */
#login-page ::selection { background: var(--login-sel); color: var(--login-text); }
#login-page :focus-visible { outline: 2px solid var(--login-accent-ink); outline-offset: 2px; }
#login-page .login-form-side { scrollbar-width: thin; scrollbar-color: var(--login-dot) transparent; }
#login-page .login-form-side::-webkit-scrollbar { width: 8px; }
#login-page .login-form-side::-webkit-scrollbar-track { background: transparent; }
#login-page .login-form-side::-webkit-scrollbar-thumb { background: var(--login-dot); border-radius: var(--r-xs); border: 2px solid var(--login-panel); }
#login-page .login-form-side::-webkit-scrollbar-thumb:hover { background: var(--login-input-hover); }

/* Op een laptop van 1280x720 moet het podium nog steeds in één beeld. */
@media (max-height: 800px) {
  #login-page .login-form-side { padding-top: 28px; }
  #login-page .login-logo-top { padding-bottom: 32px; }
  #login-page .login-welcome { font-size: 2.3rem; }
  #login-page .login-subtitle { margin-bottom: 26px; }
  #login-page .login-brand-side { padding: 40px 64px; }
  #login-page .brand-slides-wrap { min-height: 500px; }
  #login-page .brand-tagline { margin-bottom: 28px; }
  #login-page .brand-tagline h2 { font-size: 2.5rem; }
  #login-page .brand-dots { margin-top: 28px; }
}
@media (max-width: 1180px) {
  #login-page .login-split { grid-template-columns: minmax(440px, 480px) 1fr; }
  #login-page .login-form-side { padding: 36px 48px 28px; }
  #login-page .login-brand-side { padding: 48px; }
  #login-page .brand-tagline h2 { font-size: 2.5rem; }
}
@media (max-width: 960px) {
  #login-page .login-split { grid-template-columns: 1fr; height: auto; min-height: 100vh; min-height: 100dvh; }
  #login-page .login-brand-side { display: none; }
  #login-page .login-form-side { border-right: 0; min-height: 100vh; min-height: 100dvh; padding: 32px 32px 24px; }
  #login-page .login-form-inner { max-width: 420px; }
  #login-page .login-what { display: block; }
}
@media (max-width: 520px) {
  #login-page .login-form-side { padding: 24px 20px 20px; }
  #login-page .login-logo-top { margin-bottom: 0; padding-bottom: 48px; }
  #login-page .login-logo-top img { width: 116px; max-width: none; margin: 0; }
  #login-page .login-welcome { font-size: 2.1333rem; }
  #login-page .login-subtitle { margin-bottom: 28px; }
  #login-page .login-voet { flex-direction: column; align-items: flex-start; }
}
@media (prefers-reduced-motion: reduce) {
  #login-page .login-error.visible { animation: none; }
  #login-page .form-input, #login-page .btn-login, #login-page .btn-login span svg, #login-page .login-pw-toggle { transition: none; }
  #login-page .btn-login:hover span svg { transform: none; }
  .btn-login.loading span::before { animation-duration: 1.6s; }
}
@media (prefers-reduced-transparency: reduce) {
  .topbar, .faro-dock__inner, .search-overlay, .cmd-auto { background: var(--card) !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }
}
@media (prefers-contrast: more) {
  .topbar, .faro-dock__inner, .search-overlay { background: var(--card) !important; backdrop-filter: none !important; -webkit-backdrop-filter: none !important; border-color: var(--border-strong) !important; }
  .card, .stat-card, .pipeline-card, .conv-list-item, .ap-btn, .btn { border-color: var(--border-strong) !important; }
  :focus-visible { outline-width: 2px !important; }
}
/* ── Koppelingen met Google en Microsoft (api/_dash/koppelingen.js) ──
   Alles hier begint met .kp- en gebruikt alleen themavariabelen, op de officiële merktekens na. */
.kp-kaarten { display: grid; gap: 16px; margin-top: 12px; }
.kp-kaart { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px; }
.kp-kaart-kop { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.kp-merk { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: var(--radius); background: var(--bg-alt); border: 1px solid var(--border); flex: none; }
.kp-kaart-titel { margin: 0; font-size: 1rem; font-weight: 600; color: var(--text); }
.kp-kaart-sub { font-size: 0.8125rem; color: var(--text-muted); margin-top: 2px; }
.kp-tegels { display: grid; gap: 10px; }
.kp-tegel { background: var(--bg-alt); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px; }
.kp-tegel-kop { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 12px; }
.kp-ico { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: var(--radius); background: var(--card); border: 1px solid var(--border); color: var(--text-muted); flex: none; }
.kp-tegel-tekst { flex: 1 1 240px; min-width: 0; }
.kp-tegel-naam { font-weight: 600; font-size: 0.9375rem; color: var(--text); }
.kp-tegel-uitleg { font-size: 0.8125rem; color: var(--text-muted); margin-top: 2px; line-height: 1.45; }
.kp-tegel-status { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; }
.kp-tegel-acties { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; flex: none; margin-left: auto; }
.kp-account { font-size: 0.8125rem; color: var(--text-muted); word-break: break-all; }
.kp-hint { margin-top: 8px; font-size: 0.8125rem; color: var(--text); line-height: 1.45; }
.kp-pil { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: var(--radius-pill, 999px); font-size: 0.75rem; font-weight: 600; color: var(--text); border: 1px solid var(--border); background: var(--card); }
.kp-stip { width: 8px; height: 8px; border-radius: 50%; background: var(--text-muted); flex: none; }
.kp-pil-ok { background: color-mix(in srgb, var(--success) 14%, var(--card)); border-color: color-mix(in srgb, var(--success) 40%, var(--border)); }
.kp-pil-ok .kp-stip { background: var(--success); }
.kp-pil-let { background: color-mix(in srgb, var(--warning) 16%, var(--card)); border-color: color-mix(in srgb, var(--warning) 45%, var(--border)); }
.kp-pil-let .kp-stip { background: var(--warning); }
.kp-knop { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 40px; padding: 8px 16px; border-radius: var(--radius); font: inherit; font-size: 0.875rem; font-weight: 600; cursor: pointer; border: 1px solid var(--border); background: var(--card); color: var(--text); transition: background .15s, border-color .15s; }
.kp-knop:hover:not(:disabled) { border-color: var(--accent); }
.kp-knop:disabled { opacity: .6; cursor: not-allowed; }
.kp-knop-prim { background: var(--btn-primary-bg, var(--accent)); border-color: var(--btn-primary-bg, var(--accent)); color: var(--btn-primary-text, var(--on-accent, #1d1a16)); }
.kp-knop-prim:hover:not(:disabled) { filter: brightness(1.08); }
.kp-knop-gevaar { background: transparent; border-color: transparent; color: var(--red-ink, var(--error)); padding: 8px 10px; font-weight: 500; }
.kp-knop-gevaar:hover:not(:disabled) { border-color: transparent; text-decoration: underline; }
.kp-wissel svg { width: 16px; height: 16px; transition: transform .2s; }
.kp-wissel[aria-expanded="true"] svg { transform: rotate(180deg); }
.kp-spin { width: 16px; height: 16px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: spin .8s linear infinite; flex: none; }
.kp-inst { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); display: grid; gap: 12px; }
.kp-inst[hidden] { display: none; }
.kp-inst-voet { display: flex; justify-content: flex-end; }
.kp-uitleg { font-size: 0.8125rem; color: var(--text-muted); line-height: 1.5; }
.kp-veldgroep { display: grid; gap: 8px; }
.kp-invoer { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.kp-invoer .ap-input { flex: 1 1 220px; min-width: 0; }
.kp-site { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 0.875rem; color: var(--text); }
.kp-schakel { position: relative; display: flex; align-items: center; gap: 10px; min-height: 40px; cursor: pointer; font-size: 0.875rem; color: var(--text); }
.kp-schakel input, .kp-keuze input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; }
.kp-schakel-spoor { position: relative; width: 38px; height: 22px; border-radius: var(--radius-pill, 999px); background: var(--border); flex: none; transition: background .15s; }
.kp-schakel-spoor::after { content: ""; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--card); transition: transform .15s; }
.kp-schakel input:checked + .kp-schakel-spoor { background: var(--success); }
.kp-schakel input:checked + .kp-schakel-spoor::after { transform: translateX(16px); }
.kp-schakel input:focus-visible + .kp-schakel-spoor, .kp-keuze input:focus-visible + .kp-keuze-in { outline: 2px solid var(--accent); outline-offset: 2px; }
.kp-koppel { margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--border); display: grid; gap: 14px; justify-items: start; }
.kp-keuzes { display: grid; gap: 10px; width: 100%; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.kp-keuze { position: relative; display: block; cursor: pointer; }
.kp-keuze-in { display: flex; align-items: center; gap: 12px; min-height: 40px; padding: 12px; border-radius: var(--radius); border: 1px solid var(--border); background: var(--bg-alt); transition: border-color .15s, background .15s; }
.kp-keuze-tekst { display: grid; gap: 2px; flex: 1; min-width: 0; font-size: 0.8125rem; color: var(--text-muted); line-height: 1.4; }
.kp-keuze-tekst b { font-size: 0.9375rem; color: var(--text); }
.kp-keuze-vink { display: inline-flex; width: 24px; height: 24px; align-items: center; justify-content: center; border-radius: 50%; border: 1px solid var(--border); color: transparent; flex: none; }
.kp-keuze-vink svg { width: 14px; height: 14px; }
.kp-keuze input:checked + .kp-keuze-in { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, var(--bg-alt)); }
.kp-keuze input:checked + .kp-keuze-in .kp-keuze-vink { background: var(--btn-primary-bg, var(--accent)); border-color: var(--btn-primary-bg, var(--accent)); color: var(--btn-primary-text, var(--on-accent, #1d1a16)); }
.kp-rechten { font-size: 0.8125rem; color: var(--text-muted); }
.kp-rechten-titel { font-weight: 600; color: var(--text); margin-bottom: 6px; }
.kp-rechten ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.kp-rechten li { display: flex; align-items: flex-start; gap: 8px; line-height: 1.45; }
.kp-vink { display: inline-flex; flex: none; margin-top: 1px; color: var(--success); }
.kp-vink svg { width: 16px; height: 16px; }
.kp-notitie { margin-top: 12px; font-size: 0.8125rem; color: var(--text-muted); }
.kp-succes, .kp-fout { display: flex; align-items: flex-start; gap: 12px; margin-top: 12px; padding: 14px; border-radius: var(--radius); border: 1px solid var(--border); background: var(--card); }
.kp-succes { border-color: color-mix(in srgb, var(--success) 45%, var(--border)); background: color-mix(in srgb, var(--success) 10%, var(--card)); animation: kpIn .35s ease-out; }
.kp-fout { border-color: color-mix(in srgb, var(--warning) 45%, var(--border)); background: color-mix(in srgb, var(--warning) 10%, var(--card)); }
.kp-succes-cirkel { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; border-radius: 50%; background: var(--success); color: var(--bg); flex: none; animation: kpPop .45s cubic-bezier(.2, .9, .3, 1.3); }
.kp-fout-ico { display: inline-flex; color: var(--text-muted); flex: none; }
.kp-succes-tekst, .kp-fout-tekst { flex: 1; min-width: 0; font-size: 0.875rem; color: var(--text); line-height: 1.5; display: grid; gap: 8px; justify-items: start; }
.kp-succes-titel { font-weight: 600; font-size: 0.9375rem; }
.kp-succes-stap { color: var(--text-muted); }
.kp-sluit { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; margin: -8px -8px 0 0; border: 0; background: transparent; color: var(--text-muted); border-radius: var(--radius); cursor: pointer; flex: none; }
.kp-sluit:hover { color: var(--text); background: var(--bg-alt); }
@keyframes kpIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }
@keyframes kpPop { 0% { transform: scale(.4); opacity: 0; } 100% { transform: scale(1); opacity: 1; } }
@media (min-width: 1100px) { .kp-kaarten { grid-template-columns: 1fr 1fr; align-items: start; } }
@media (max-width: 900px) { .kp-tegel-kop { flex-wrap: wrap; } .kp-tegel-acties { width: 100%; justify-content: flex-start; } }
@media (prefers-reduced-motion: reduce) {
  .kp-succes, .kp-succes-cirkel { animation: none; }
  .kp-knop, .kp-schakel-spoor, .kp-schakel-spoor::after, .kp-keuze-in, .kp-wissel svg { transition: none; }
  .kp-spin { animation-duration: 2.4s; }
}



#toest-banner {
  position: fixed;
  left: 20px;
  bottom: 20px;
  z-index: 11000;
  width: min(420px, calc(100vw - 40px));
  padding: 18px 20px 16px;
  border: 1px solid var(--login-border, #D9CCB0);
  border-radius: var(--r-lg, 18px);
  background: var(--login-card, #FFFBF4);
  color: var(--login-text, #1F1D19);
  box-shadow: 0 18px 44px -14px rgba(23,19,12,0.35);
  font-size: 0.875rem;
  line-height: 1.5;
}
#toest-banner .toest-kop { font-weight: 700; font-size: 0.95rem; margin-bottom: 6px; }
#toest-banner p { margin: 0 0 8px; color: var(--login-muted, #6B6252); }
#toest-banner .toest-link { color: var(--login-accent-ink, #6E5320); text-decoration: underline; text-underline-offset: 2px; }
#toest-banner .toest-knoppen { display: flex; gap: 10px; margin-top: 14px; }
#toest-banner .toest-knop {
  flex: 1 1 0;
  min-height: 44px;
  padding: 0 14px;
  border: 1px solid var(--login-fill-edge, #BFA877);
  border-radius: var(--r-md, 12px);
  background: var(--login-fill, #E8D7B1);
  color: var(--login-on-fill, #1A1A1A);
  font: inherit;
  font-weight: 700;
  cursor: pointer;
}
#toest-banner .toest-knop:hover { filter: brightness(1.04); }
#toest-banner .toest-knop:focus-visible { outline: 2px solid var(--login-accent-ink, #6E5320); outline-offset: 2px; }
#login-page .toest-instelling { background: none; border: 0; padding: 0; font: inherit; color: var(--login-accent-ink, #6E5320); text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }


/* ═══ ONTWERPRONDE (api/_dash/ontwerp.js) ═══════════════════════════════════════════════════════ */

/* ── Gesprekken: de eerste lading ─────────────────────────────────────────────────────────────────
   De tabs blijven bovenaan; alleen de lege toestand zelf staat gecentreerd in de ruimte eronder.
   Eerder centreerde de hele kolom, waardoor de tabs midden in een leeg vlak zweefden. */
.conv-list { width: 340px; }
.conv-layout.leeg .conv-list { justify-content: flex-start; }
#conv-list-body { flex: 1 0 auto; }
.conv-layout.leeg #conv-list-body { display: flex; align-items: center; justify-content: center; }

/* ── Inloggen en aanmelden ────────────────────────────────────────────────────────────────────────
   1. Autofill. Chrome verft een door de browser ingevuld veld lichtblauw en zet zijn eigen tekstkleur
      neer. De inset-schaduw dekt dat af met de veldkleur van het podium, en de tekstkleur komt uit onze
      token. De lange transitie voorkomt dat de blauwe tint er een frame in beeld komt. */
#login-page input:-webkit-autofill,
#login-page input:-webkit-autofill:hover,
#login-page input:-webkit-autofill:active,
#login-page input:autofill {
  -webkit-text-fill-color: var(--login-text);
  caret-color: var(--login-caret);
  -webkit-box-shadow: 0 0 0 1000px var(--login-input-bg) inset;
  box-shadow: 0 0 0 1000px var(--login-input-bg) inset;
  border-color: var(--login-field-line);
  transition: background-color 600000s 0s, color 600000s 0s;
}
#login-page input:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--login-text);
  -webkit-box-shadow: 0 0 0 1000px var(--login-input-bg) inset, 0 0 0 3px var(--login-ring);
  box-shadow: 0 0 0 1000px var(--login-input-bg) inset, 0 0 0 3px var(--login-ring);
  border-color: var(--login-accent-ink);
}

/* 2. De hoofdknop. Licht: houtskool met warm zand als tekst (een duidelijke knop, 13:1), want zand op zand
      is het geheel eerder niet leesbaar gebleken. Donker blijft zand met houtskool (die combinatie is daar
      wel hoog contrast). Eén patroon voor de eigen knop en die van Clerk. */
[data-theme="light"] #login-page .btn-login,
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary {
  background: #1A1A1A; color: #F4E7C8; border: 1px solid #1A1A1A;
  box-shadow: 0 1px 2px rgba(23,19,12,0.18);
}
[data-theme="light"] #login-page .btn-login:hover,
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary:hover { background: #33302A; border-color: #33302A; }
[data-theme="light"] #login-page .btn-login:active,
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary:active { background: #0E0E0E; border-color: #0E0E0E; }
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary *,
[data-theme="light"] #login-page .btn-login span { color: #F4E7C8; }
[data-theme="light"] #login-page #clerk-signin .cl-buttonArrowIcon { color: #F4E7C8; opacity: 1; }
#login-page #clerk-signin .cl-formButtonPrimary:disabled,
#login-page .btn-login:disabled { opacity: .55; cursor: not-allowed; }

/* 3. Clerk: labels en "Optioneel" op één lijn, ook naast elkaar bij Voornaam / Achternaam. Het label en de
      hint zijn één rij met de basislijn gedeeld; beide kolommen krijgen dezelfde minimale hoogte. */
#login-page #clerk-signin .cl-formFieldRow { align-items: flex-start; gap: 12px; }
#login-page #clerk-signin .cl-formFieldRow > * { flex: 1 1 0; min-width: 0; }
#login-page #clerk-signin .cl-formFieldLabelRow { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; min-height: 22px; margin-bottom: 6px; }
#login-page #clerk-signin .cl-formFieldLabel { line-height: 1.3; margin: 0; }
#login-page #clerk-signin .cl-formFieldHintText,
#login-page #clerk-signin [class*="cl-formFieldHintText"] { margin: 0; font-size: 0.8rem; line-height: 1.3; font-weight: 500; color: var(--login-muted); white-space: nowrap; }
#login-page #clerk-signin .cl-formFieldInputGroup { width: 100%; }
#login-page #clerk-signin .cl-form, #login-page #clerk-signin .cl-main { gap: 16px; }

/* ── Onboarding: zes fasen in plaats van negen losse stappen ───────────────────────────────────── */
.wiz-stap-naam { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.wiz-stap-sub { font-size: 0.7667rem; font-weight: 500; color: var(--text-muted); line-height: 1.3; }
.wiz-stap.is-actief .wiz-stap-sub { color: var(--accent-ink); }
.wiz-stap { padding: 9px 0; }

/* De stand op de aanmeldpagina: zes streepjes, de eerste gevuld (het account is stap 1). */
#auth-fasen { margin: 0 0 22px; padding: 0; list-style: none; }
#auth-fasen .auth-fasen-balk { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin: 0 0 10px; padding: 0; list-style: none; }
#auth-fasen .auth-fasen-balk li { height: 4px; border-radius: var(--r-full); background: var(--login-line); }
#auth-fasen .auth-fasen-balk li.is-nu { background: var(--login-accent-ink); }
#auth-fasen .auth-fasen-tekst { margin: 0; font-size: 0.8rem; font-weight: 600; color: var(--login-muted); font-variant-numeric: tabular-nums; }
#auth-fasen .auth-fasen-namen { margin: 6px 0 0; font-size: 0.7667rem; color: var(--login-muted); line-height: 1.5; }
html[data-auth="signup"] #login-page #auth-fasen { display: block; }
/* ── Integraties (automotive): gegroepeerde kaarten ──────────────────────────────────────────────── */
#ig-lijst { padding: 4px 0 0; }
.ig-groep { margin: 0 0 var(--sp-8); }
.ig-groep-kop { margin: 0 0 4px; font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 1.0667rem; font-weight: 700; letter-spacing: -0.01em; color: var(--text); }
.ig-groep-sub { margin: 0 0 var(--sp-4); font-size: 0.8667rem; line-height: 1.5; color: var(--text-muted); }
.ig-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--sp-4); }
.ig-kaart { display: flex; flex-direction: column; gap: var(--sp-3); padding: var(--sp-5); background: var(--card); border: 1px solid var(--border); border-radius: var(--r-md); min-width: 0; transition: border-color .15s ease; }
.ig-kaart:hover { border-color: var(--border-strong); }
.ig-kaart.is-open { grid-column: 1 / -1; border-color: var(--border-strong); }
.ig-kaart--soon, .ig-kaart--uit { background: transparent; border-style: dashed; }
.ig-kop { display: flex; align-items: center; gap: var(--sp-3); }
.ig-logo { flex: 0 0 auto; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-sm); background: var(--btn-primary-bg); color: var(--btn-primary-text); font-family: 'Space Grotesk', 'Inter', sans-serif; font-size: 0.8rem; font-weight: 700; letter-spacing: -0.02em; }
.ig-logo.is-lang { font-size: 0.7rem; letter-spacing: -0.03em; }
.ig-kaart--soon .ig-logo, .ig-kaart--uit .ig-logo { background: var(--card-elevated); color: var(--text-muted); border: 1px solid var(--border); }
.ig-titel { min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: var(--sp-1); }
.ig-naam { margin: 0; font-size: 0.9667rem; font-weight: 600; line-height: 1.25; color: var(--text); overflow-wrap: anywhere; }
.ig-chip { display: inline-flex; align-items: center; gap: 6px; padding: 2px 10px; border-radius: var(--r-full); font-size: 0.75rem; font-weight: 600; line-height: 1.5; border: 1px solid transparent; }
.ig-chip::before { content: ''; width: 6px; height: 6px; border-radius: var(--r-full); background: currentColor; }
.ig-chip--ok { color: var(--success-ink); background: rgba(var(--success-rgb), 0.12); border-color: rgba(var(--success-rgb), 0.28); }
.ig-chip--fout { color: var(--error-ink); background: rgba(var(--error-rgb), 0.10); border-color: rgba(var(--error-rgb), 0.28); }
.ig-chip--wacht { color: var(--warning-ink); background: rgba(var(--warning-rgb), 0.12); border-color: rgba(var(--warning-rgb), 0.30); }
.ig-chip--open, .ig-chip--soon, .ig-chip--uit { color: var(--neutral-ink); background: var(--card-elevated); border-color: var(--border); }
.ig-chip--open::before, .ig-chip--soon::before, .ig-chip--uit::before { background: transparent; border: 1.5px solid currentColor; }
.ig-tekst { margin: 0; font-size: 0.8667rem; line-height: 1.55; color: var(--text-muted); }
.ig-feit { font-size: 0.8rem; color: var(--text-muted); }
.ig-kaart .inv-cijfers { margin: 0; }
.ig-kaart .inv-fout, .ig-kaart .inv-let { margin: 0; }
.ig-acties { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: auto; padding-top: var(--sp-1); }
.ig-kaart .su-bron-invoer { margin: 0; }
.ig-kaart.is-open .su-bron-invoer { max-width: 560px; }
.ig-bewaar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-4); padding: var(--sp-4) var(--sp-5); border: 1px solid var(--border); border-radius: var(--r-md); background: var(--card); }
@media (max-width: 640px) { .ig-grid { grid-template-columns: minmax(0, 1fr); } .ig-kaart { padding: var(--sp-4); } }
/* ── Faro (landing): zelfde specificiteit-truc als hierboven; faro.css komt NA dit blok ──────────────
   1. Snelle acties: één monochrome stijl in plaats van negen tinten. Zand als vlak, zand-inkt als lijn. */
html body .faro-quick__icon--amber, html body .faro-quick__icon--slate, html body .faro-quick__icon--teal,
html body .faro-quick__icon--terracotta, html body .faro-quick__icon--rose, html body .faro-quick__icon--gold,
html body .faro-quick__icon--green, html body .faro-quick__icon--orange, html body .faro-quick__icon--sky {
  background: rgba(var(--accent-rgb), 0.22); color: var(--accent-ink);
}
/* 2. Lege toestanden: één patroon (vlak met merkteken, titel, uitleg, volgende stap) in plaats van gestippelde dozen. */
html body .cmd-empty, html body .faro-empty {
  position: relative; display: flex; flex-direction: column; align-items: center; gap: var(--sp-2);
  padding: var(--sp-8) var(--sp-5); text-align: center;
  border: 1px solid var(--border); border-style: solid; border-radius: var(--r-lg);
  background: var(--card);
}
html body .cmd-empty::before, html body .faro-empty::before {
  content: ''; width: 40px; height: 40px; margin-bottom: var(--sp-1); border-radius: var(--r-full);
  background: rgba(var(--accent-rgb), 0.22);
  -webkit-mask: none; mask: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236E5320' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9z'/></svg>");
  background-repeat: no-repeat; background-position: center; background-size: 20px 20px;
}
html body .cmd-empty__t, html body .faro-empty__title { margin: 0; font-size: var(--fs-body); font-weight: 600; color: var(--text); }
html body .cmd-empty__s, html body .faro-empty__hint { margin: 0; max-width: 46ch; color: var(--text-muted); line-height: 1.5; }
html body .cmd-empty__a { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--sp-2); margin-top: var(--sp-3); }
html body .cmd-empty__a > div { margin-top: 0 !important; }
/* 3. "Wat Faro voor je doet": vier tegels, alleen voor dealers, zonder verzonnen cijfers. */
.hv-doel { margin: var(--sp-8) 0 0; }
.hv-doel-kop { margin: 0 0 var(--sp-1); font-size: var(--fs-lead); font-weight: 700; letter-spacing: -0.01em; color: var(--text); }
.hv-doel-sub { margin: 0 0 var(--sp-4); font-size: var(--fs-small); line-height: 1.5; color: var(--text-muted); max-width: 70ch; }
.hv-doel-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-3); }
.hv-doel-kaart { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-4); border: 1px solid var(--border); border-radius: var(--r-lg); background: var(--card); }
.hv-doel-nr { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-full); background: rgba(var(--accent-rgb), 0.22); color: var(--accent-ink); font-size: var(--fs-tiny); font-weight: 700; font-variant-numeric: tabular-nums; }
.hv-doel-t { margin: 0; font-size: var(--fs-meta); font-weight: 600; color: var(--text); }
.hv-doel-s { margin: 0; font-size: var(--fs-small); line-height: 1.5; color: var(--text-muted); }
.hv-doel-a { align-self: flex-start; margin-top: auto; padding: var(--sp-1) 0; background: none; border: 0; font: inherit; font-size: var(--fs-small); font-weight: 600; color: var(--accent-ink); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
@media (max-width: 1100px) { .hv-doel-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .hv-doel-grid { grid-template-columns: minmax(0, 1fr); } }
/* ── Facturatie: gecentreerd op brede schermen, boekingen gegroepeerd ─────────────────────────────── */
.fa-wrap { margin-inline: auto; max-width: 1360px; }
.fa-plannen-grid { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.fa-rij.is-groep .fa-rij-datum { white-space: normal; max-width: 150px; }
.fa-meer { margin-top: var(--sp-3); }
/* ── Alle pagina's: leesbaarheid ────────────────────────────────────────────────────────────────────
   Gemeten (Playwright, 1280 en 375): tientallen labels stonden op 10 tot 11 px. Ondergrens nu 11,5 px (0,7667rem);
   niets wordt groter dan nodig. Plus drie oranje teksten die op hun eigen tint 4,37:1 haalden (norm 4,5:1). */
html body .badge-bron,
html body .pipeline-card-date,
html body .pipeline-card-phone,
html body .pipeline-score,
html body .conv-list-item-date,
html body .conv-kanaal-tag,
html body .export-filter-label,
html body .export-snap-label,
html body .fa-chip,
html body .fa-label,
html body .nav-group-label,
html body .dash-formlink-label,
html body .stat-label,
html body .stat-desc,
html body .cal-day-name,
html body .activity-time,
html body .inv-titel,
html body .pd-card-code,
html body .pd-status,
html body .pd-link,
html body .analyse-revenue-label,
html body .analyse-revenue-sub,
html body .ap-label-hint,
html body .ap-hint,
html body .ap-tpl-title,
html body .psl,
html body .profile-badge,
html body .user-role,
html body .btn-show-key,
html body .search-pill-kbd,
html body .revenue-goal-label,
html body .revenue-goal-sub,
html body .followup-title,
html body .followup-item-meta,
html body .followup-call-btn,
html body .top-leads-strip-title,
html body .top-lead-chip-avatar,
html body .age-badge-table,
html body .copy-tooltip,
html body .badge,
html body .faro-dock__kbd,
html body .hv-help-sec,
html body .cal-time-label,
html body .cal-time-label-half,
html body .cal-sidebar-desc,
html body .cal-call-avatar,
html body .cal-call-score,
html body .cal-call-btn,
html body .funnel-step-pct,
html body .faro-dock__hinttext,
html body .ap-tpl-sub,
html body .ap-tpl-card-label,
html body .ap-tpl-card-preview,
html body .ap-tpl-card-rec,
html body .ap-chip,
html body .ap-phone-status,
html body .ap-msg-day-divider,
html body .ig-chip,
html body .profile-section-title,
html body .today-widget-title { font-size: 0.7667rem; }
html body .sortable, html body th, html body .psl, html body .cal-day-name, html body .badge { font-size: 0.7667rem !important; }
[data-theme="light"] .copy-tooltip { background: var(--success-ink); color: #F4E7C8; }
.ig-logo.is-lang { font-size: 0.7667rem; }
[data-theme="light"] .followup-item-score, [data-theme="light"] .followup-call-btn,
[data-theme="light"] .score-orange, [data-theme="light"] .pipeline-score.score-orange { color: #86490F; }
/* Kalender op een telefoon: de rechterkant van de werkbalk (weergave-keuze + afspraak maken) liep 68 px buiten beeld. */
@media (max-width: 640px) {
  html body .cal-toolbar-rechts { margin-left: 0; width: 100%; flex-wrap: wrap; justify-content: space-between; gap: var(--sp-2); }
  html body .cal-toolbar-rechts .cal-book-btn { flex: 1 1 auto; justify-content: center; }
}


/* ═══ MERKLAAG (api/_dash/merk.js): websitepalet ═══════════════════════════════════════════════════ */

/* Lettertypen: zelf gehost (CSP font-src 'self', AVG). Latin dekt NL/FR/DE/EN; latin-ext de rest. */
@font-face { font-family: 'Bricolage Grotesque'; font-style: normal; font-weight: 500 700; font-display: swap;
  src: url('/fonts/bricolage-grotesque-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Bricolage Grotesque'; font-style: normal; font-weight: 500 700; font-display: swap;
  src: url('/fonts/bricolage-grotesque-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113; }
@font-face { font-family: 'Instrument Serif'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/fonts/instrument-serif-latin.woff2') format('woff2'); }
@font-face { font-family: 'Instrument Serif'; font-style: italic; font-weight: 400; font-display: swap;
  src: url('/fonts/instrument-serif-italic-latin.woff2') format('woff2'); }

:root {
  --font-head:    'Bricolage Grotesque', 'Space Grotesk', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-display: 'Instrument Serif', Georgia, 'Times New Roman', serif;
  --goud-verloop: linear-gradient(180deg, #F5ECD7 0%, #B08A4A 55%, #D3BE93 100%);
  --radius-pil:   999px;
}

/* ── Donker: de website-waarden ──────────────────────────────────────────────────────────────── */
:root {
  --bg:            #121212;
  --bg-alt:        #0D0D0D;
  --card-flat:     #1A1A1A;
  --card:          #1A1A1A;
  --card-elevated: #232323;
  --border-c:      #2E2E2E;
  --border-strong: #3F3F3F;
  --divider:       #262626;
  --hover-c:       #202020;
  --accent-c:        #E8D7B1;
  --accent-hover-c:  #DDCAA1;
  --accent-pressed-c:#D3BE93;
  --accent-deep:     #C9AE7C;
  --accent-ink:      #F0E4C8;
  --on-accent:       #141010;
  --text-c:        #F9F9F9;
  --text-muted-c:  #B5B5B5;
  --text-disabled: #6B6B6B;
  --text-inverse:  #121212;
  --success-c: #22C55E;
  --warning-c: #D4A017;
  --error-c:   #EF5350;
  --success-ink: #4ADE80;
  --warning-ink: #E8B93C;
  --error-ink:   #F47A77;
  --neutral-ink: #B5B5B5;
  --bubble-incoming: #232323;
  --accent-rgb:  232,215,177;
  --success-rgb: 34,197,94;
  --warning-rgb: 212,160,23;
  --error-rgb:   239,83,80;
  --info-rgb:    240,228,200;
  --text-rgb:    249,249,249;
  --on-accent-rgb: 20,16,16;
}

/* ── Licht: de website-waarden (de standaard van de app) ────────────────────────────────────── */
[data-theme="light"] {
  --bg:            #F7F7F7;
  --bg-alt:        #F3F4F6;
  --card-flat:     #FFFFFF;
  --card:          #FFFFFF;
  --card-elevated: #FFFFFF;
  --border-c:      #E5E7EB;
  --border-strong: #D1D5DB;
  --divider:       #EEF0F2;
  --hover-c:       #F3F4F6;
  --accent-c:        #E8D7B1;
  --accent-hover-c:  #DDCAA1;
  --accent-pressed-c:#D3BE93;
  --accent-deep:     #C9AE7C;
  --accent-ink:      #8A6A33;
  --on-accent:       #141010;
  --text-c:        #111827;
  --text-muted-c:  #4B5563;
  --text-disabled: #9CA3AF;
  --text-inverse:  #FFFFFF;
  --success-c: #22C55E;
  --warning-c: #D4A017;
  --error-c:   #DC2626;
  --success-ink: #15803D;
  --warning-ink: #8A5A00;
  --error-ink:   #B91C1C;
  --neutral-ink: #4B5563;
  --bubble-incoming: #F3F4F6;
  --accent-rgb:  232,215,177;
  --success-rgb: 34,197,94;
  --warning-rgb: 212,160,23;
  --error-rgb:   220,38,38;
  --info-rgb:    138,106,51;
  --text-rgb:    17,24,39;
  --on-accent-rgb: 20,16,16;
  --c-sand:    #8A6A33;  --c-sand-soft:    rgba(232,215,177,0.38);
  --c-deep:    #8A6A33;  --c-deep-soft:    rgba(201,174,124,0.28);
  --c-emerald: #15803D;  --c-emerald-soft: rgba(34,197,94,0.12);
  --c-amber:   #8A5A00;  --c-amber-soft:   rgba(212,160,23,0.14);
  --c-coral:   #B91C1C;  --c-coral-soft:   rgba(220,38,38,0.10);
}

/* De zijbalk volgt het thema (styles.js bindt de tokenset opnieuw; hier dezelfde websitewaarden). */
[data-theme="light"] .sidebar {
  background: #FFFFFF;
  --text: #111827; --text-c: #111827; --text-primary: #111827;
  --text-muted: #4B5563; --text-muted-c: #4B5563; --text-secondary: #4B5563;
  --focus-ring: #8A6A33;
  --border: #E5E7EB; --border-c: #E5E7EB; --divider: #EEF0F2;
  --hover: #F3F4F6; --hover-c: #F3F4F6;
  --bg-card-alt: #F3F4F6; --bg-alt: #F3F4F6;
  --red: #DC2626; --error-c: #DC2626; --error-rgb: 220,38,38;
  --green: #15803D; --success-c: #15803D; --success-rgb: 21,128,61;
}
[data-theme="light"] .nav-item.active,
[data-theme="light"] .sidebar .nav-item.active { background: var(--goud-verloop); color: #141010; }
[data-theme="light"] .sidebar .nav-item.active svg { color: #141010; }
.sidebar .nav-item.active { background: var(--goud-verloop); color: #141010; }
.sidebar .nav-item.active svg { color: #141010; stroke: currentColor; }

/* Donker: de zijbalk in hetzelfde neutrale zwart als de rest (stond nog op een bruin dat bij het oude palet hoorde). */
[data-theme="dark"] .sidebar { background: rgba(10,10,10,0.94); border-right: 1px solid #262626; box-shadow: inset -1px 0 0 rgba(255,255,255,0.04); }
[data-theme="dark"] .sidebar-logo { border-bottom-color: #262626; }
@supports not (backdrop-filter: blur(1px)) { [data-theme="dark"] .sidebar { background: #0A0A0A; } }

/* ── Knoppen: de gouden pil van de website ──────────────────────────────────────────────────── */
:root, [data-theme="light"] {
  --btn-primary-bg:   var(--goud-verloop);
  --btn-primary-text: #141010;
}
.btn-primary-sm {
  background: var(--goud-verloop);
  color: #141010;
  border-radius: var(--radius-pil);
  font-weight: 600;
  box-shadow: 0 6px 18px rgba(0,0,0,0.14);
}
.btn-primary-sm:hover { filter: brightness(1.04); box-shadow: 0 8px 22px rgba(0,0,0,0.18); color: #141010; }

/* Koppen: Bricolage, korte harde zinnen. Het signatuurwoord (een span.sig of em in een kop) is Instrument
   Serif cursief, zoals het gemarkeerde woord in elke H1 op de website. */
h1, h2, h3, .page-title, .login-welcome { font-family: var(--font-head); letter-spacing: -0.02em; text-wrap: balance; }
.sig, h1 em, h2 em { font-family: var(--font-display); font-style: italic; font-weight: 400; letter-spacing: -0.01em; color: var(--accent-ink); }
.page-title { font-weight: 600; }

/* Kaarten: rustig, een rand en bijna geen schaduw op licht (websitetaal: 14px hoek, 1px rand). */
[data-theme="light"] .stat-card,
[data-theme="light"] .card { border-color: var(--border-c); box-shadow: 0 1px 2px rgba(17,24,39,0.04); }

/* Faro is nu de witte uil. Op een lichte ondergrond krijgt hij een fijne schaduw, zodat hij niet in het wit oplost;
   op donker staat hij er vanzelf. */
[data-theme="light"] img[src^="/faro/"] { filter: drop-shadow(0 1px 2px rgba(17,24,39,0.38)) drop-shadow(0 4px 10px rgba(17,24,39,0.14)); }

/* Faro (api/_faro/ui) komt NA deze laag in de pagina; html-voorvoegsels geven deze regels voorrang. */
html:root {
  --faro-canvas: #121212; --faro-surface: #1A1A1A; --faro-raised: #232323;
  --surface-2: #232323; --surface-3: #2A2A2A; --faro-input-bg: #1A1A1A;
  --faro-input-ring: rgba(232,215,177,0.24); --faro-hairline: rgba(255,255,255,0.09);
  --warm-sand: #E8D7B1; --champagne: #D3BE93; --deep-sand: #B08A4A;
  --sand-on-surface: #E8D7B1;
}
html[data-theme="light"] {
  --faro-canvas: #F7F7F7; --faro-surface: #FFFFFF; --faro-raised: #F3F4F6; --faro-input-bg: #FFFFFF;
  --faro-input-ring: rgba(176,138,74,0.32); --faro-hairline: rgba(17,24,39,0.10);
  --sand-on-surface: #8A6A33; --champagne-dim: rgba(176,138,74,0.12); --champagne-line: rgba(176,138,74,0.40);
  --warm-sand-glow: rgba(176,138,74,0.07);
}

/* ═══ INLOGGEN: ontwerp in websitetaal ═══════════════════════════════════════════════════════════
   Links een lichte, rustige formulierkant; rechts een donker podium met een warme gloed, het
   signatuurkopje in Instrument Serif en een glazen chatkaart, net als de hero op helvaro.pro. */
#login-page {
  --login-stage:      #121212;
  --login-stage-ink:  #F9F9F9;
  --login-stage-dim:  #B5B5B5;
  --login-panel:      #FFFFFF;
  --login-panel-lift: #FFFFFF;
  --login-track:      #F3F4F6;
  --login-input-bg:   #FFFFFF;
  --login-border:     #E5E7EB;
  --login-line:       #E5E7EB;
  --login-field-line: #9CA3AF;
  --login-input-hover:#4B5563;
  --login-text:       #111827;
  --login-muted:      #4B5563;
  --login-faint:      #6B7280;
  --login-placeholder:#6B7280;
  --login-accent-ink: #8A6A33;
  --login-fill:       #E8D7B1;
  --login-fill-edge:  #B08A4A;
  --login-on-fill:    #141010;
  --login-caret:      #8A6A33;
  --login-ring:       rgba(176,138,74,0.28);
  --login-hover:      rgba(17,24,39,0.04);
  --login-link-line:  rgba(138,106,51,0.45);
  --login-card:       rgba(255,255,255,0.10);
  --login-card-inset: rgba(255,255,255,0.06);
  --login-bubble-in:  rgba(255,255,255,0.14);
  --login-bar-bg:     rgba(255,255,255,0.14);
  --login-dot:        rgba(255,255,255,0.28);
  --login-error:      #B91C1C;
  --login-error-bg:   rgba(220,38,38,0.07);
  --login-error-line: rgba(220,38,38,0.30);
  --login-shadow:     0 24px 60px -24px rgba(0,0,0,0.55);
  --login-sel:        rgba(232,215,177,0.65);
}
[data-theme="dark"] #login-page {
  --login-panel:      #121212;
  --login-panel-lift: #1A1A1A;
  --login-track:      #1A1A1A;
  --login-input-bg:   #1A1A1A;
  --login-border:     #2E2E2E;
  --login-line:       #2E2E2E;
  --login-field-line: #6B6B6B;
  --login-input-hover:#B5B5B5;
  --login-text:       #F9F9F9;
  --login-muted:      #B5B5B5;
  --login-faint:      #999999;
  --login-placeholder:#8A8A8A;
  --login-accent-ink: #F0E4C8;
  --login-caret:      #E8D7B1;
  --login-ring:       rgba(232,215,177,0.22);
  --login-hover:      rgba(249,249,249,0.06);
  --login-link-line:  rgba(240,228,200,0.40);
  --login-error:      #F47A77;
}

#login-page .login-form-side { background: var(--login-panel); }
#login-page .login-welcome { font-family: var(--font-head); font-weight: 600; font-size: 2.35rem; line-height: 1.08; letter-spacing: -0.03em; color: var(--login-text); }
#login-page .login-subtitle { color: var(--login-muted); font-size: 1.0333rem; line-height: 1.55; }
#login-page .form-input { border-radius: 12px; border: 1px solid var(--login-field-line); background: var(--login-input-bg); color: var(--login-text); }
#login-page .form-input:focus { border-color: #B08A4A; box-shadow: 0 0 0 4px var(--login-ring); outline: none; }
#login-page .form-label { color: var(--login-text); font-weight: 600; }

/* De hoofdknop: de gouden pil, ook die van Clerk. Overschrijft de houtskoolknop uit ontwerp.js. */
#login-page .btn-login,
[data-theme="light"] #login-page .btn-login,
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary,
#login-page #clerk-signin .cl-formButtonPrimary {
  background: var(--goud-verloop); color: #141010; border: 0; border-radius: 999px;
  font-weight: 600; box-shadow: 0 6px 18px rgba(0,0,0,0.14);
}
[data-theme="light"] #login-page .btn-login:hover,
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary:hover,
#login-page .btn-login:hover { background: var(--goud-verloop); filter: brightness(1.05); box-shadow: 0 8px 22px rgba(0,0,0,0.2); }
[data-theme="light"] #login-page #clerk-signin .cl-formButtonPrimary *,
[data-theme="light"] #login-page .btn-login span,
#login-page .btn-login span { color: #141010; }
[data-theme="light"] #login-page #clerk-signin .cl-buttonArrowIcon { color: #141010; }

/* Rechts: het donkere podium. */
#login-page .login-brand-side {
  background:
    radial-gradient(900px 520px at 78% 8%, rgba(232,215,177,0.20), transparent 62%),
    radial-gradient(700px 480px at 12% 100%, rgba(176,138,74,0.16), transparent 60%),
    #121212;
  color: var(--login-stage-ink);
}
#login-page .brand-tagline h2 { font-family: var(--font-display); font-style: italic; font-weight: 400; font-size: 2.9rem; line-height: 1.04; letter-spacing: -0.02em; color: #F9F9F9; }
#login-page .brand-tagline p { color: #B5B5B5; font-size: 1.0667rem; line-height: 1.6; }
#login-page .brand-card-mock {
  background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.14); border-radius: 18px;
  -webkit-backdrop-filter: blur(18px) saturate(140%); backdrop-filter: blur(18px) saturate(140%);
  box-shadow: 0 24px 60px -24px rgba(0,0,0,0.6);
}
#login-page .brand-card-title { color: #F0E4C8; font-weight: 600; }
#login-page .brand-card-header { border-bottom: 1px solid rgba(255,255,255,0.10); background: transparent; }
#login-page .brand-chat-msg { border-radius: 16px; color: #F9F9F9; }
#login-page .brand-chat-msg.in  { background: rgba(255,255,255,0.14); }
#login-page .brand-chat-msg.out { background: var(--goud-verloop); color: #141010; }
#login-page .brand-chat-msg span, #login-page .brand-chat-msg em { color: inherit; }
#login-page .brand-chat-msg.in  { color: #F9F9F9; }
#login-page .brand-chat-msg.out { color: #141010; }
#login-page .brand-chat-msg.in em  { color: #B5B5B5; opacity: 1; }
#login-page .brand-chat-msg.out em { color: #3D3220; opacity: 1; }
html[data-auth="signup"] #login-page #auth-fasen { display: none !important; }
#login-page .brand-dot-label { color: #B5B5B5; }
#login-page .brand-dot.active .brand-dot-label { color: #F0E4C8; }

/* Licht thema (de standaard): het rechterpodium is zacht zand met een witte kaart. Donker blijft een accent: de
   koptekst, de uitgaande chatbubbel en de gouden pil. Het donkere thema houdt zijn donkere podium. */
[data-theme="light"] #login-page .login-brand-side {
  background:
    radial-gradient(880px 560px at 88% 0%, rgba(255,255,255,0.90), rgba(255,255,255,0) 62%),
    radial-gradient(720px 520px at 4% 108%, rgba(176,138,74,0.24), rgba(176,138,74,0) 60%),
    linear-gradient(160deg, #FBF6E8 0%, #F2E6C8 58%, #E8D7B1 100%);
  color: #111827;
  border-left: 1px solid #E5E7EB;
}
[data-theme="light"] #login-page .brand-tagline h2 { color: #111827; }
[data-theme="light"] #login-page .brand-tagline p { color: var(--text-muted-c); }
[data-theme="light"] #login-page .brand-card-mock {
  background: #FFFFFF; border: 1px solid rgba(138,106,51,0.28); border-radius: 18px;
  -webkit-backdrop-filter: none; backdrop-filter: none;
  box-shadow: 0 34px 60px -34px rgba(90,66,20,0.42), 0 2px 6px rgba(90,66,20,0.08);
}
[data-theme="light"] #login-page .brand-card-header { border-bottom: 1px solid #EEF0F2; }
[data-theme="light"] #login-page .brand-card-title { color: #8A6A33; }
[data-theme="light"] #login-page .brand-chat-msg.in  { background: #F3F4F6; color: #111827; }
[data-theme="light"] #login-page .brand-chat-msg.out { background: #121212; color: #F0E4C8; }
[data-theme="light"] #login-page .brand-chat-msg.in em  { color: var(--text-muted-c); }
[data-theme="light"] #login-page .brand-chat-msg.out em { color: #B5B5B5; }
[data-theme="light"] #login-page .brand-dot-label { color: var(--text-muted-c); }
[data-theme="light"] #login-page .brand-dot.active .brand-dot-label { color: #111827; }
[data-theme="light"] #login-page .brand-score-label { color: #111827; }
[data-theme="light"] #login-page .brand-agenda-name { color: #111827; }
[data-theme="light"] #login-page .brand-agenda-tag, [data-theme="light"] #login-page .brand-agenda-time { color: var(--text-muted-c); }
[data-theme="light"] #login-page .brand-score-item span { color: var(--text-muted-c); }

/* De korte uitleg onder het formulier (alleen op mobiel zichtbaar) stond met een negatieve marge tegen de weggehaalde
   voorwaardenlijst aan; nu staat de kennismakingslink erboven, dus een gewone ruimte ertussen. */
#login-page .login-what { margin: 24px 0 32px; }

/* Onderaan: geen gratis-proefbelofte en geen aanmeldlink meer. Wel de weg naar een kennismaking. */
#login-page .auth-switch { color: var(--login-muted); }
#login-page .auth-switch a { color: var(--login-accent-ink); font-weight: 600; }
#login-page .login-trust { display: none; }

/* /signup is geen formulier meer maar een rustige uitleg: toegang loopt via een uitnodiging. */
#login-page .toegang-kaart { display: none; }
html[data-auth="signup"] #login-page .toegang-kaart { display: block; margin-top: var(--sp-6, 28px); }
html[data-auth="signup"] #login-page #login-form-wrap,
html[data-auth="signup"] #login-page #clerk-signin,
html[data-auth="signup"] #login-page #clerk-skelet,
html[data-auth="signup"] #login-page #clerk-toggle,
html[data-auth="signup"] #login-page .auth-stappen { display: none !important; }
.toegang-kaart ol { list-style: none; counter-reset: stap; margin: 0 0 24px; padding: 0; display: grid; gap: 14px; }
.toegang-kaart li { counter-increment: stap; display: grid; grid-template-columns: 30px 1fr; gap: 14px; align-items: start; color: var(--login-text); line-height: 1.5; }
.toegang-kaart li::before {
  content: counter(stap); width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center;
  font-family: var(--font-head); font-weight: 600; font-size: 0.9rem; color: #141010; background: var(--login-fill);
}
.toegang-cta {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; box-sizing: border-box;
  padding: 14px 24px; border-radius: 999px; background: var(--goud-verloop); color: #141010; font-weight: 600;
  font-size: 1rem; text-decoration: none; box-shadow: 0 6px 18px rgba(0,0,0,0.14);
}
.toegang-cta:hover { filter: brightness(1.05); }
.toegang-cta:focus-visible { outline: 3px solid var(--login-ring); outline-offset: 3px; }
.toegang-uitnodiging { margin: 16px 0 0; font-size: 0.9rem; color: var(--login-muted); line-height: 1.5; }


/* ═══ UITNODIGINGEN (api/_dash/uitnodigingen.js) ═══════════════════════════════════════════════════ */
.inv-sec { margin: 0 0 28px; }
.inv-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 14px; }
.inv-head h3 { font-size: 1.2rem; margin: 0 0 2px; }
.inv-head p { margin: 0; color: var(--text-muted-c); font-size: 0.9rem; }
.inv-filters { display: flex; gap: 6px; flex-wrap: wrap; }
.inv-filter { border: 1px solid var(--border-c); background: var(--card); color: var(--text-muted-c); border-radius: 999px; padding: 6px 14px; font: inherit; font-size: 0.85rem; font-weight: 500; cursor: pointer; min-height: 34px; }
.inv-filter[aria-pressed="true"] { background: var(--accent-c); color: #141010; border-color: #B08A4A; font-weight: 600; }
.inv-list { display: grid; gap: 10px; }
.inv-row { display: grid; grid-template-columns: minmax(170px, 1.2fr) 210px 200px 190px 210px; gap: 18px; align-items: center; padding: 16px 18px; background: var(--card); border: 1px solid var(--border-c); border-radius: 16px; }
.inv-naam { font-weight: 600; line-height: 1.3; }
.inv-sub { color: var(--text-muted-c); font-size: 0.85rem; word-break: break-word; }
.inv-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.inv-chip { display: inline-flex; align-items: center; gap: 6px; font-size: 0.78rem; font-weight: 600; padding: 4px 10px; border-radius: 999px; border: 1px solid var(--border-strong); color: var(--text-muted-c); background: var(--bg); white-space: nowrap; }
.inv-chip.ok { color: var(--success-ink); border-color: rgba(var(--success-rgb), .4); background: rgba(var(--success-rgb), .10); }
.inv-chip.warn { color: var(--warning-ink); border-color: rgba(var(--warning-rgb), .45); background: rgba(var(--warning-rgb), .12); }
.inv-chip.bad { color: var(--error-ink); border-color: rgba(var(--error-rgb), .4); background: rgba(var(--error-rgb), .09); }
.inv-chip.gold { color: #141010; background: var(--accent-c); border-color: #B08A4A; }
.inv-voortgang { display: grid; gap: 6px; }
.inv-bar { height: 6px; border-radius: 6px; background: var(--border-c); overflow: hidden; }
.inv-bar i { display: block; height: 100%; background: var(--goud-verloop); border-radius: 6px; }
.inv-dots { display: flex; gap: 6px; }
.inv-dot { width: 26px; height: 26px; border-radius: 8px; display: grid; place-items: center; font-size: 0.7rem; font-weight: 700; border: 1px solid var(--border-strong); color: var(--text-disabled); background: var(--bg); }
.inv-dot.aan { color: var(--success-ink); border-color: rgba(var(--success-rgb), .5); background: rgba(var(--success-rgb), .12); }
.inv-acties { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; }
.inv-btn { border: 1px solid var(--border-strong); background: var(--card); color: var(--text-c); border-radius: 999px; padding: 7px 14px; font: inherit; font-size: 0.82rem; font-weight: 600; cursor: pointer; min-height: 36px; }
.inv-btn:hover { background: var(--hover-c); }
.inv-btn.gold { background: var(--goud-verloop); color: #141010; border-color: transparent; }
.inv-btn.gevaar { color: var(--error-ink); }
.inv-btn[disabled] { opacity: .5; cursor: not-allowed; }
.inv-leeg { padding: 28px; text-align: center; color: var(--text-muted-c); background: var(--card); border: 1px dashed var(--border-strong); border-radius: 16px; }
.inv-skel { height: 76px; border-radius: 16px; background: linear-gradient(90deg, var(--border-c), var(--bg), var(--border-c)); background-size: 200% 100%; animation: inv-sh 1.2s infinite; }
@keyframes inv-sh { to { background-position: -200% 0; } }
.inv-fout { padding: 14px 16px; border-radius: 12px; background: rgba(var(--error-rgb), .09); border: 1px solid rgba(var(--error-rgb), .35); color: var(--error-ink); font-size: 0.9rem; }
.inv-hulp { display: flex; flex-wrap: wrap; gap: 6px; grid-column: 1 / -1; padding-top: 2px; }
@media (max-width: 1100px) { .inv-row { grid-template-columns: 1fr 1fr; } .inv-acties { justify-content: flex-start; } }
@media (max-width: 640px) { .inv-row { grid-template-columns: 1fr; } }

/* Het formulier in de modal */
.inv-form { display: grid; gap: 14px; }
.inv-form label.inv-l { display: block; font-size: 0.8rem; font-weight: 600; margin-bottom: 5px; color: var(--text-c); }
.inv-form .inv-l .opt { font-weight: 400; color: var(--text-muted-c); }
.inv-form input[type=text], .inv-form input[type=email], .inv-form input[type=number], .inv-form select {
  width: 100%; box-sizing: border-box; font: inherit; font-size: 0.93rem; color: var(--text-c); background: var(--card); border: 1px solid var(--border-strong); border-radius: 12px; padding: 11px 13px; min-height: 44px;
}
.inv-form input:focus, .inv-form select:focus { outline: none; border-color: #B08A4A; box-shadow: 0 0 0 4px rgba(176,138,74,.25); }
.inv-form .inv-twee { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.inv-keuze { display: grid; gap: 8px; }
.inv-optie { display: grid; grid-template-columns: 22px 1fr; gap: 10px; padding: 12px 14px; border: 1px solid var(--border-strong); border-radius: 14px; cursor: pointer; background: var(--card); }
.inv-optie input { margin-top: 3px; accent-color: #B08A4A; }
.inv-optie b { display: block; font-size: 0.92rem; }
.inv-optie small { color: var(--text-muted-c); font-size: 0.82rem; line-height: 1.4; }
.inv-optie:has(input:checked) { border-color: #B08A4A; background: rgba(var(--accent-rgb), .22); }
.inv-resultaat { display: none; padding: 16px; border-radius: 14px; background: rgba(var(--accent-rgb), .22); border: 1px solid #B08A4A; }
.inv-resultaat.aan { display: block; }
.inv-link { display: flex; gap: 8px; margin: 10px 0; }
.inv-link input { flex: 1; font-family: ui-monospace, Menlo, monospace; font-size: 0.78rem; min-height: 42px; }
.inv-noot { font-size: 0.82rem; color: var(--text-muted-c); line-height: 1.5; margin: 6px 0 0; }


/* ═══ CONTROL CENTER (api/_control/ui-css.js) ══════════════════════════════════════════════════════ */
.cc-wrap { max-width: 1280px; padding-bottom: 96px; }
.cc-bar { display: flex; align-items: center; justify-content: space-between; gap: 14px; flex-wrap: wrap; margin-bottom: 8px; }
.cc-tabs { display: flex; gap: 6px; overflow-x: auto; max-width: 100%; padding-bottom: 2px; }
.cc-tab { border: 1px solid var(--border-c); background: var(--card); color: var(--text-muted-c); border-radius: 999px; padding: 8px 16px; font: inherit; font-size: 0.88rem; font-weight: 500; cursor: pointer; min-height: 40px; white-space: nowrap; }
.cc-tab[aria-selected="true"] { background: var(--accent-c); color: var(--on-accent); border-color: #B08A4A; font-weight: 600; }
.cc-status { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; color: var(--text-muted-c); flex-wrap: wrap; }
.cc-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--text-disabled); flex: none; }
.cc-dot.ok { background: var(--success-c); }
.cc-dot.warn { background: var(--warning-c); }
.cc-dot.bad { background: var(--error-c); }
.cc-eerlijk { margin: 0 0 18px; font-size: 0.82rem; color: var(--text-muted-c); }
.cc-knop { border: 1px solid var(--border-strong); background: var(--card); color: var(--text-c); border-radius: 10px; padding: 7px 14px; font: inherit; font-size: 0.85rem; font-weight: 500; cursor: pointer; min-height: 38px; }
.cc-knop:hover { background: var(--hover-c); }
.cc-knop.goud { background: var(--accent-c); color: var(--on-accent); border-color: #B08A4A; font-weight: 600; }
.cc-knop[disabled] { opacity: .5; cursor: not-allowed; }
.cc-panel { display: none; }
.cc-panel.actief { display: block; }
.cc-kop { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 22px 0 10px; }
.cc-kop h3 { font-size: 1.05rem; margin: 0; }
.cc-kop span { font-size: 0.8rem; color: var(--text-muted-c); }
.cc-tegels { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 12px; }
.cc-tegel { background: var(--card); border: 1px solid var(--border-c); border-radius: 14px; padding: 16px 18px; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.cc-tegel.nb { border-style: dashed; }
.cc-tegel-l { font-size: 0.74rem; letter-spacing: .06em; text-transform: uppercase; color: var(--text-muted-c); }
.cc-tegel-w { font-size: 1.7rem; font-weight: 700; font-variant-numeric: tabular-nums; line-height: 1.1; }
.cc-tegel.nb .cc-tegel-w { color: var(--text-disabled); font-size: 1.2rem; }
.cc-tegel-o { font-size: 0.8rem; color: var(--text-muted-c); word-break: break-word; }
.cc-tegel-m { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 0.74rem; color: var(--text-muted-c); margin-top: auto; padding-top: 6px; }
.cc-chip { display: inline-flex; align-items: center; font-size: 0.74rem; font-weight: 600; padding: 3px 9px; border-radius: 999px; border: 1px solid var(--border-strong); color: var(--text-muted-c); background: var(--bg); white-space: nowrap; }
.cc-chip.ok { color: var(--success-ink); border-color: rgba(var(--success-rgb), .4); background: rgba(var(--success-rgb), .10); }
.cc-chip.warn { color: var(--warning-ink); border-color: rgba(var(--warning-rgb), .45); background: rgba(var(--warning-rgb), .12); }
.cc-chip.bad { color: var(--error-ink); border-color: rgba(var(--error-rgb), .4); background: rgba(var(--error-rgb), .09); }
.cc-chip.gold { color: var(--on-accent); background: var(--accent-c); border-color: #B08A4A; }
.cc-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; margin-bottom: 12px; }
.cc-veld { display: flex; flex-direction: column; gap: 4px; font-size: 0.74rem; color: var(--text-muted-c); }
.cc-veld label { font-size: inherit; color: inherit; }
.cc-filters select, .cc-filters input, .cc-form select, .cc-form input { background: var(--card); color: var(--text-c); border: 1px solid var(--border-strong); border-radius: 10px; padding: 8px 10px; font: inherit; font-size: 0.88rem; min-height: 38px; min-width: 130px; }
.cc-lijst { background: var(--card); border: 1px solid var(--border-c); border-radius: 14px; overflow: hidden; }
.cc-rij { display: grid; grid-template-columns: 150px 110px 100px minmax(0, 1fr) 100px; gap: 12px; align-items: center; padding: 11px 16px; border-bottom: 1px solid var(--divider); font-size: 0.88rem; cursor: pointer; min-height: 44px; }
.cc-rij:last-child { border-bottom: 0; }
.cc-rij:hover, .cc-rij:focus-visible { background: var(--hover-c); outline: none; }
.cc-rij.kop { cursor: default; font-size: 0.72rem; letter-spacing: .06em; text-transform: uppercase; color: var(--text-muted-c); min-height: 0; padding-top: 9px; padding-bottom: 9px; }
.cc-rij.kop:hover { background: transparent; }
.cc-rij.nieuw { animation: cc-nieuw 4s ease-out; }
@keyframes cc-nieuw { from { background: rgba(var(--accent-rgb), .22); } to { background: transparent; } }
@media (prefers-reduced-motion: reduce) { .cc-rij.nieuw { animation: none; } }
.cc-t { color: var(--text-muted-c); font-variant-numeric: tabular-nums; font-size: 0.82rem; }
.cc-titel { min-width: 0; overflow-wrap: anywhere; }
.cc-sub { display: block; color: var(--text-muted-c); font-size: 0.78rem; }
.cc-dag { padding: 8px 16px; font-size: 0.74rem; letter-spacing: .06em; text-transform: uppercase; color: var(--text-muted-c); background: var(--bg-alt); border-bottom: 1px solid var(--divider); }
.cc-leeg, .cc-fout, .cc-laden { padding: 26px 18px; text-align: center; color: var(--text-muted-c); font-size: 0.9rem; }
.cc-fout { color: var(--error-ink); }
.cc-banner { background: var(--card); border: 1px dashed var(--border-strong); border-radius: 14px; padding: 18px 20px; margin-bottom: 14px; }
.cc-banner h4 { margin: 0 0 6px; font-size: 1rem; }
.cc-banner p { margin: 4px 0; font-size: 0.88rem; color: var(--text-muted-c); }
.cc-banner code, .cc-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.82rem; background: var(--bg); border: 1px solid var(--border-c); border-radius: 6px; padding: 1px 6px; }
.cc-detail { background: var(--card); border: 1px solid var(--border-strong); border-radius: 14px; padding: 18px 20px; margin-top: 14px; }
.cc-detail h4 { margin: 0 0 4px; font-size: 1.05rem; overflow-wrap: anywhere; }
.cc-dl { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 6px 14px; margin: 12px 0; font-size: 0.88rem; }
.cc-dl dt { color: var(--text-muted-c); }
.cc-dl dd { margin: 0; overflow-wrap: anywhere; }
.cc-acties { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
.cc-pre { background: var(--bg); border: 1px solid var(--border-c); border-radius: 10px; padding: 10px 12px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.78rem; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 260px; overflow: auto; margin: 8px 0; }
.cc-tijdlijn { list-style: none; margin: 8px 0; padding: 0 0 0 14px; border-left: 2px solid var(--border-strong); }
.cc-tijdlijn li { position: relative; padding: 4px 0 8px 12px; font-size: 0.86rem; }
.cc-tijdlijn li::before { content: ""; position: absolute; left: -20px; top: 10px; width: 10px; height: 10px; border-radius: 50%; background: var(--accent-c); border: 2px solid var(--card); }
.cc-tijdlijn li.bad::before { background: var(--error-c); }
.cc-tijdlijn li.ok::before { background: var(--success-c); }
.cc-form { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; margin: 10px 0; }
.cc-form .cc-veld.breed { flex: 1 1 260px; }
.cc-form .cc-veld.breed input { width: 100%; }
.cc-noot { font-size: 0.8rem; color: var(--text-muted-c); margin: 6px 0; }
.cc-meer { display: flex; justify-content: center; padding: 12px; }
@media (max-width: 900px) {
  .cc-rij { grid-template-columns: 110px minmax(0, 1fr) 90px; }
  .cc-rij .cc-kol-klant, .cc-rij .cc-kol-kanaal { display: none; }
  .cc-rij.kop .cc-kol-klant, .cc-rij.kop .cc-kol-kanaal { display: none; }
  .cc-dl { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .cc-tegels { grid-template-columns: 1fr 1fr; }
  .cc-tegel-w { font-size: 1.35rem; }
  .cc-rij { grid-template-columns: minmax(0, 1fr) 84px; }
  .cc-rij .cc-t { grid-column: 1 / -1; }
}

/* ═══ FARO (api/_faro/ui/styles.js + tokens.js) ═══ */

/* ── Faro tokens (extends DESIGN-SYSTEM.md) ────────────────────────── */
:root {
  --warm-sand:      #F4E7C8;
  --champagne:      #D8C49A;
  --deep-sand:      #B89D73;

  /* Derived, so components never compute their own alpha */
  --champagne-dim:  rgba(216, 196, 154, 0.14);
  --champagne-line: rgba(216, 196, 154, 0.32);
  --warm-sand-glow: rgba(244, 231, 200, 0.10);

  /* Faro canvas, one step darker than the CRM's --bg-alt so the
     workspace switch is felt, not just seen. */
  --faro-canvas:      #17140F;   /* warm zwart, zelfde grond als Dark Helvaro -- nooit puur zwart */
  --faro-surface:     #211D16;
  --faro-raised:      #2A251C;

  /* Twee sporten voor knoppen die OP een oppervlak liggen: een rust- en een
     hoverstand. Ze worden al gebruikt door .faro-send--stop en
     .faro-attach__rm, maar bestonden niet -- en een var() zonder definitie en
     zonder terugval maakt niet de waarde ongeldig maar de hele DECLARATIE.

     Gevolg in productie: de stopknop hield de vulling van de verzendknop.
     Juist die twee moeten uit elkaar liggen -- de een start iets, de ander
     breekt het af -- en er was niets te zien van het verschil.

     De waarden volgen de warme ladder hierboven: --surface-2 is dezelfde
     trede als --faro-raised, --surface-3 een stap lichter met dezelfde
     sprong. */
  --surface-2:        #2A251C;
  --surface-3:        #332D22;
  --faro-hairline:    rgba(184, 157, 115, 0.16);

  /* The AI input is the visual focus of the landing screen (requirement 4). */
  --faro-input-bg:    #1E1A14;
  --faro-input-ring:  rgba(244, 231, 200, 0.22);

  /* ── Quick-action icon hues ───────────────────────────────────────────────
     One hue per action, families per group. These are the ONE deliberate
     exception to DESIGN-SYSTEM.md's "Sand is the only accent", added on
     request, so they are bounded on purpose:

       - Muted and mid-toned, never saturated. Each reads as a tinted metal,
         not a highlighter, so nine of them in a row still look like one
         palette rather than a toolbar from a different app.
       - No purple, and blue only in a slate-leaning form. Requirement 2 rules
         out "generic AI purple/blue gradients", and that instinct survives
         even though solid icon fills are not gradients.
       - Confined to a 26px icon chip inside a quick action. They never appear
         on text, borders, buttons, charts or status. Sand remains the accent
         everywhere else in the product.
       - Each hue is paired with its own tint so the chip background is derived
         from the glyph rather than guessed. */
  --ic-amber:       #E0A03F;   /* hot leads, heat */
  --ic-slate:       #6B9BC4;   /* pipeline, data */
  --ic-teal:        #4CA39B;   /* conversations */
  --ic-terracotta:  #D08A6A;   /* property image */
  --ic-rose:        #BE7B8D;   /* property video */
  --ic-gold:        #C9B285;   /* listing copy, closest to brand */
  --ic-green:       #5FA877;   /* follow-up, go */
  --ic-orange:      #D9884A;   /* campaign, broadcast */
  --ic-sky:         #6FA9C7;   /* calls */

  /* Sand text that sits on an AI SURFACE (canvas, topbar, composer) rather than
     inside the permanently-dark sidebar. --warm-sand is near-white: correct on
     #101010, invisible on cream. Anything sand-coloured outside the sidebar
     must use this token, which flips with the theme. The switcher's active
     segment measured 1.15:1 in light mode before this existed, on the one
     control that carries the whole two-workspace claim. */
  --sand-on-surface: #F4E7C8;

  --ic-amber-bg:      rgba(224, 160,  63, 0.18);
  --ic-slate-bg:      rgba(107, 155, 196, 0.18);
  --ic-teal-bg:       rgba( 76, 163, 155, 0.18);
  --ic-terracotta-bg: rgba(208, 138, 106, 0.18);
  --ic-rose-bg:       rgba(190, 123, 141, 0.18);
  --ic-gold-bg:       rgba(201, 178, 133, 0.20);
  --ic-green-bg:      rgba( 95, 168, 119, 0.18);
  --ic-orange-bg:     rgba(217, 136,  74, 0.18);
  --ic-sky-bg:        rgba(111, 169, 199, 0.18);
}

/* ── Licht thema: alleen wat op een THEMA-vlak staat ───────────────────────
   Faro's canvas volgt intussen het thema (zie .faro-page in _dash/styles.js),
   dus alles wat daarop staat moet mee: opgetilde vlakken, hairlines en de
   zandkleurige labels. Ook de invoerbalk doet mee (zie hieronder); alleen de
   zijbalk en het inlogpodium blijven donker. Gemeten
   op de lichte grond: --sand-on-surface #6E5320 = 6,9:1 op #F3EDE1. */
[data-theme="light"] {
  --faro-canvas:      #F3EDE1;
  --faro-surface:     #FAF6EE;
  --faro-raised:      #EFE7D8;
  /* De invoerbalk (dock op het dashboard, composer in Faro) volgt sinds
     2026-09-20 het thema -- op verzoek van de eigenaar. In het lichte thema
     één stap boven het canvas, met een echte rand; geen donker podium meer. */
  --faro-input-bg:    #FAF6EE;
  --faro-input-ring:  rgba(184, 157, 115, 0.35);
  --faro-hairline:    rgba(184, 157, 115, 0.34);
  --sand-on-surface:  #6E5320;
  --champagne-dim:    rgba(184, 157, 115, 0.14);
  --champagne-line:   rgba(184, 157, 115, 0.45);
  --warm-sand-glow:   rgba(184, 157, 115, 0.08);
}

/* ── Er is geen lichte Faro meer ───────────────────────────────────────────
   Hier stond een [data-theme="light"]-blok: een tweede canvas (#FAF8F4), een
   tweede stel negen pictogramkleuren, en een tweede --sand-on-surface. Faro is
   weg op verzoek, en dat is niet alleen minder werk -- het is dezelfde keuze
   die de zijbalk, het merkpaneel en sinds vandaag het inlogscherm al maken.

   Faro IS donker. Hij staat als valk op een donker canvas, de bol op de
   landingspagina gloeit, de invoerbalk heeft een gloedring, de mediakaarten
   liggen op bijna-zwart. Dat op wit zetten is geen thema maar een tweede
   ontwerp -- en het was het enige oppervlak in de app dat er twee had.

   Praktisch gevolg: dit bestand hoeft niet langer twee palettes gelijk te
   houden. Er was er één van de twee die je nooit ziet als je zelf in het
   donker werkt, en juist die viel stil kapot -- de actieve pil van de
   schakelaar heeft in het lichte thema ooit op 1,15:1 gestaan.

   De CRM-kant houdt zijn lichte thema gewoon; #btn-theme in de topbalk
   schakelt die nog steeds. Alleen Faro's eigen werkvlak doet niet meer mee.

   Wat hierboven staat geldt dus altijd. Twee controles in scripts/faro-check.js
   die het lichte palet nameten zijn mee verwijderd. */

/* ═══ Scales ══════════════════════════════════════════════════════════════
   Colour tokens flip with the theme; these do not, so they live outside both
   blocks and are declared once.

   Faro's CSS reached 17 distinct font sizes, 10 radii, and spacing values
   scattered across 23 numbers with more than half of them off any grid. Every
   one of those was a reasonable local decision -- 12.5px because 13 looked a
   touch heavy next to that icon -- and together they are the reason two cards
   built a month apart do not line up. The fix is not taste, it is a closed
   set: pick from the scale, and if nothing on it fits, the scale is wrong and
   changes for everyone.

   scripts/faro-check.js enforces this. A raw px value in a size, radius or
   spacing property fails the build.

   ── Spacing: a 4px grid, with 2 and 6 as deliberate half-steps ─────────────
   Half-steps exist because optical alignment sometimes genuinely needs 2px
   (a hairline offset, an icon nudge) and pretending otherwise just pushes
   people back to raw values. */
:root {
  --sp-05: 2px;
  --sp-1:  4px;
  --sp-15: 6px;
  --sp-2:  8px;
  --sp-3:  12px;
  --sp-4:  16px;
  --sp-5:  20px;
  --sp-6:  24px;
  --sp-8:  32px;
  --sp-10: 40px;
  --sp-12: 48px;
  --sp-16: 64px;

  /* ── Type: eight steps, and the names say the job, not the number ──────
     Named by role rather than by size so a step can be retuned without every
     call site lying about what it is. --fs-body is the reading size; anything
     smaller is supporting text, anything larger is a heading. */
  --fs-micro: 11px;   /* keyboard hints, counters */
  --fs-tiny:  12px;   /* uppercase labels, chips */
  --fs-small: 13px;   /* secondary text, list rows */
  --fs-meta:  14px;   /* controls, card body */
  --fs-body:  15px;   /* the composer and message text */
  --fs-lead:  19px;   /* section headings */
  --fs-title: 23px;   /* panel titles */
  --fs-display: 30px; /* the landing headline, once */

  /* ── Radius: five, two of them fixed by DESIGN-SYSTEM.md ───────────────
     The 14px button and 18px card are the house rule; the other three exist
     because a chip cannot wear a card's corner. */
  --r-xs:   6px;      /* chips, tags, step marks */
  --r-sm:   10px;     /* small controls, icon buttons */
  --r-md:   14px;     /* buttons, DESIGN-SYSTEM.md */
  --r-lg:   18px;     /* cards, panels, DESIGN-SYSTEM.md */
  --r-full: 999px;    /* pills, avatars */
}

/* ═══ Dock ════════════════════════════════════════════════════════════════
   The ask bar along the bottom of every page. A flex child of .main-content,
   never fixed, .page-content is flex:1 with its own scroll, so the page
   simply gets shorter and nothing is ever hidden behind this. */
.faro-dock {
  flex-shrink: 0;
  /* Sticky, not fixed. Fixed would float over the page and hide whatever is
     under it; as a sticky flex child the bar still OCCUPIES its space at the
     end of the document, so nothing is ever covered, while pinning to the
     viewport bottom on any page taller than the screen. Without this it sat
     at y=1225 on a 900px viewport, i.e. you had to scroll to find the thing
     whose entire purpose is being in peripheral vision. */
  position: sticky;
  bottom: 0;
  z-index: 40;
  padding: var(--sp-3) var(--sp-6) var(--sp-4);
  background: var(--bg);
  border-top: 1px solid var(--border);
}
/* Faro's regel boven de balk. Klein, één regel, en hij verdwijnt zodra je hem
   wegklikt of naar een ander scherm gaat. Bewust GEEN ballon met een pijltje:
   die vraagt aandacht, en dit is bedoeld als iets dat je opmerkt terwijl je
   naar iets anders kijkt.

   prefers-reduced-motion wordt gerespecteerd -- zie onderaan. */
.faro-dock__hint {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  max-width: 940px;
  margin: 0 auto var(--sp-2);
  padding: var(--sp-15) var(--sp-2) var(--sp-15) var(--sp-15);
  border-radius: var(--r-sm);
  background: var(--faro-input-bg);
  border: 1px solid var(--border);
  animation: faro-hint-in 220ms ease both;
}
.faro-dock__hint[hidden] { display: none; }
.faro-dock__hintmark {
  flex-shrink: 0; width: 22px; height: 22px; object-fit: contain;
  /* Heel licht zweven. Eén beweging, traag, en niet in de looprichting van
     de tekst -- genoeg om levend te lijken, te weinig om je blik te trekken. */
  animation: faro-hint-drift 4.5s ease-in-out infinite;
}
.faro-dock__hinttext {
  flex: 1; min-width: 0;
  font-size: var(--fs-micro);
  line-height: 1.5;
  color: var(--text-muted);
}
.faro-dock__hintclose {
  flex-shrink: 0;
  border: 0; background: transparent; cursor: pointer;
  font-size: var(--fs-body); line-height: 1;
  padding: var(--sp-05) var(--sp-15);
  border-radius: var(--r-xs);
  color: var(--text-disabled);
}
.faro-dock__hintclose:hover { color: var(--text); }

@keyframes faro-hint-in {
  from { opacity: 0; transform: translateY(4px); }
  to   { opacity: 1; transform: none; }
}
@keyframes faro-hint-drift {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-2px); }
}
/* Wie beweging heeft uitgezet krijgt geen beweging. Niet onderhandelbaar:
   dit is een voorkeur die mensen om een reden instellen. */
@media (prefers-reduced-motion: reduce) {
  .faro-dock__hint { animation: none; }
  .faro-dock__hintmark { animation: none; }
}

.faro-dock__inner {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  max-width: 940px;
  margin: 0 auto;
  padding: var(--sp-2) var(--sp-2) var(--sp-2) var(--sp-4);
  border-radius: var(--r-md);
  background: var(--faro-input-bg);
  border: 1px solid var(--border);
  transition: border-color 150ms ease, box-shadow 150ms ease;
}
.faro-dock__inner:focus-within {
  border-color: var(--champagne);   /* één ring: de rand zelf wordt champagne, geen tweede outline */
}
.faro-dock__spark { display: inline-flex; color: var(--champagne); flex-shrink: 0; }
.faro-dock__input {
  flex: 1; min-width: 0;
  border: 0; outline: 0; background: transparent;
  color: var(--text); font: inherit; font-size: var(--fs-meta);
}
.faro-dock__input::placeholder { color: var(--text-disabled); }
.faro-dock__kbd {
  flex-shrink: 0;
  font: inherit; font-size: var(--fs-micro);
  padding: var(--sp-05) var(--sp-15); border-radius: var(--r-xs);
  border: 1px solid var(--border);
  color: var(--text-disabled);
}
.faro-dock__open {
  width: 30px; height: 30px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--r-sm); border: 0;
  background: var(--accent); color: var(--on-accent);
  cursor: pointer; transition: background 150ms ease;
}
.faro-dock__open:hover { background: var(--accent-hover); }

/* Faro owns image generation, so the CRM's AI-beeld nav entry is redundant
   while Faro is on. It is hidden HERE rather than deleted from the markup,
   because this stylesheet only ships when the feature is enabled: switch Faro
   off and the CRM gets its navigation, and that paid feature, back. */
#nav-ai-beeld { display: none !important; }

/* One page sets its own height inline (calc(100vh - 56px), the calendar), so
   it does not participate in the flex shrink and would push the dock off the
   bottom. Subtract the dock here rather than editing the CRM's inline style. */
#page-kalender { height: calc(100vh - 56px - 62px) !important; }

/* On the Faro page the dock is redundant -- the page has its own, larger
   composer -- and two live composers on screen is one too many. Hidden, not
   dimmed: a 40%-opacity input still looks clickable and still takes a tab
   stop. .main-content is a flex column, so removing it also gives the page
   back the height the dock was reserving. */
body.faro-open .faro-dock { display: none; }

/* ═══ The Faro page ═══════════════════════════════════════════════════════
   Faro is a .page like Dashboard or Pipeline, so the CRM's own page machinery
   sizes and shows it. What this adds is the internal split -- rail beside
   main -- and the fact that it must fill the viewport rather than flow: the
   thread scrolls inside itself, the composer stays pinned at the bottom, and
   the page as a whole never scrolls.

   The height matches #page-kalender's above: the topbar is 56px, and the dock
   is gone here so its 62px does not need subtracting. */
.faro-page.page-content {
  padding: 0;
  /* flex:0 0 auto, not the .page-content default of flex:1. With flex-grow on
     and a flex-basis of 0, the flex algorithm, not the height below, decides
     the box, so the page grew to fit the landing screen's own content, which
     made .main-content taller than the viewport, which grew the page again.
     Pinning the basis breaks that loop; the landing and thread scroll inside. */
  flex: 0 0 auto;
  height: calc(100vh - 56px);
  overflow: hidden;
}
.faro-page__body { display: flex; height: 100%; min-height: 0; }
/* Desktop keeps the rail permanently visible, so the handle only exists on
   narrow screens, see the 860px breakpoint. */
.faro-page__rail-toggle {
  display: none;
  position: absolute;
  top: 10px; left: 10px;
  z-index: 5;
  width: 32px; height: 32px;
  align-items: center; justify-content: center;
  border-radius: var(--r-sm);
  border: 1px solid var(--faro-hairline);
  background: var(--faro-raised);
  color: var(--text-muted);
  cursor: pointer;
}
.faro-page__rail-toggle:hover { color: var(--text); }
.faro-page__main {
  position: relative;
  flex: 1;
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;
}

/* ═══ Sidebar entry ═══════════════════════════════════════════════════════
   A primary action above the nav list, not a thirteenth row inside it. The
   mark on Faro's side is his own head (public/faro/faro-merk.webp); it used to
   be an orb built from the landing screen's gradient recipe, back when the
   button carried Faro's identity without shipping an icon for it.

   ⚠ Every colour here comes from the CRM's token set, not Faro's. The sidebar
   is permanently dark in BOTH themes and rebinds --text/--border/--hover/
   --bg-card-alt to dark-surface values for its children; Faro's own
   --faro-raised and --faro-hairline are :root tokens that flip with the theme
   and are NOT rebound. Using them here painted a light surface under
   dark-context text, and in light theme the button read at roughly 1:1 -
   the title was invisible. --champagne is safe: it is the same value in both
   themes, and raw sand is legible inside this permanently-dark pane (which is
   exactly what --sand-on-surface exists to handle everywhere else). */
.hv-switch {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--sp-05);
  /* Zat eerst in de zijbalk en was daar zo breed als het paneel. In de
     topbalk voegt hij zich naar zijn inhoud en duwt hij niets weg;
     flex-shrink:0 zodat de paginatitel ernaast krimpt en hij niet.

     Bewust groot. Dit is geen bijkomstige knop maar de schakelaar tussen de
     twee helften van de app, en klein en grijs in een hoek was hij niet te
     vinden. Hij is nu even hoog als de knoppen rechts in de balk, staat
     helemaal vooraan, en heeft een eigen rand zodat hij als één control leest
     en niet als twee losse woorden. */
  /* Volle breedte van de zijbalk op een marge na. Dit is de grootste knop in
     het paneel, en dat is de bedoeling: kleiner en in een hoek was hij niet
     te vinden. */
  width: calc(100% - 24px);
  margin: 0 var(--sp-3) var(--sp-3);
  padding: var(--sp-05);
  border-radius: var(--r-md);
  border: 1px solid var(--border-bright, var(--border));
  background: var(--bg-card-alt);
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.04);
}
.hv-switch__tab {
  /* minmax(0,1fr) on the grid is not enough on its own: a grid ITEM also
     defaults to min-width:auto and would refuse to shrink below its label. */
  min-width: 0;
  /* Een raster van twee, zodat de bol en het woord samen gecentreerd staan en
     de twee kanten even breed blijven ook al heeft er maar een een pictogram. */
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  padding: var(--sp-3) var(--sp-2);
  border: 0;
  border-radius: var(--r-sm);
  background: transparent;
  /* Hier stond een literal (#A3AEC0), en met reden: in de zijbalk is het
     paneel in BEIDE thema's donker, dus een thema-token zou daar omklappen.
     Nu de schakelaar in de TOPBALK staat geldt precies het omgekeerde -- die
     balk volgt het thema wel, en een vaste koude grijstint zou daar in het
     lichte thema als vlek liggen. Dus terug naar het token dat er hoort. */
  /* Niet --text-muted: de niet-gekozen kant moet je nog steeds meteen KUNNEN
     lezen, want die is de helft van de keuze. Gedempt grijs maakte er een
     uitgeschakelde knop van. */
  color: var(--text);
  font: inherit;
  font-size: var(--fs-body);
  font-weight: 600;
  letter-spacing: 0.01em;
  cursor: pointer;
  transition: background 150ms ease, color 150ms ease;
}
/* Faro's merkteken: zijn kop (public/faro/faro-merk.webp). Hier stond een
   gouden bol met een conic-gradient -- zie markup.js voor waarom die weg is en
   waarom het juist DIT bestand is.

   18px en niet 16: een bol werkt op elke maat, een gezicht niet. Naast elkaar
   gezet in de browser is 16 het punt waarop de ogen dichtvallen en er een
   donkere veeg overblijft; op 18 lezen ze nog. Groter mag niet, want dan wordt
   de rij hoger dan de andere navigatie-items ernaast.

   Geen border-radius: het bestand heeft zijn eigen silhouet met transparante
   randen. Een cirkelmasker zou er de oren afsnijden. */
.hv-switch__merk {
  width: 18px; height: 18px;
  flex-shrink: 0;
  display: block;
  object-fit: contain;
}
/* Faro is bijna zwart met gouden accenten. Op de gekozen kant ligt hij op het
   zandvlak en staat hij scherp; op de niet-gekozen kant ligt hij op de donkere
   balk, waar zijn silhouet in de achtergrond zakt en alleen de gouden ogen nog
   dragen. Een zweem licht eromheen geeft hem daar zijn omtrek terug.

   Geen harde rand en geen ring: dat zou er een insigne van maken naast een
   woord dat gewoon een label is. */
.hv-switch__tab:not(.active) .hv-switch__merk {
  filter: drop-shadow(0 0 1.5px rgba(255,255,255,0.5));
}

.hv-switch__tab:hover { color: var(--text); background: var(--hover); }
.hv-switch__tab.active {
  background: var(--accent);
  /* The paired ink token, not the fill: --accent as text on --accent as
     background is the 1:1 mistake this codebase has made before. */
  color: var(--on-accent);
  /* Een schaduw eronder zodat de gekozen kant naar voren komt in plaats van
     alleen een andere kleur te hebben. */
  box-shadow: 0 1px 2px rgba(0,0,0,0.28);
}
.hv-switch__tab:focus-visible {
  /* --champagne is in beide thema's dezelfde zandtint en werkte in de donkere
     zijbalk. Op een topbalk die met het thema meegaat haalt zand op licht
     1,3:1. --focus-ring is de tint die per thema is nagerekend. */
  outline: 2px solid var(--focus-ring, var(--champagne));
  outline-offset: 2px;
}

/* ── One navigation column, never two ──────────────────────────────────────
   The rail is moved into the CRM sidebar on boot, so both navs are siblings
   there and the mode decides which one is in the document flow. display:none
   rather than visibility, so the hidden one costs no space and its buttons
   leave the tab order. */
body.hv-mode-crm .faro-rail { display: none; }
body.hv-mode-ai  .sidebar-nav { display: none; }

/* The rail was a column inside the page; in the sidebar it is the sidebar. */
body.hv-mode-ai .faro-rail {
  width: auto;
  border-right: 0;
  background: transparent;
  padding-top: 0;
  flex: 1 1 auto;
  overflow-y: auto;
}

/* ═══ Rail, Faro's own nav, inside the page ══════════════════════════════
   This is what keeps conversations, Images and Projects reachable without any
   of them appearing in the CRM sidebar. */
.faro-rail {
  width: 208px;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  min-height: 0;
  padding: var(--sp-4) 0 var(--sp-3);
  border-right: 1px solid var(--faro-hairline);
  background: var(--faro-surface);
}
.faro-rail__new {
  display: flex; align-items: center; justify-content: center; gap: var(--sp-2);
  margin: 0 var(--sp-3) var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-sm);
  border: 0;
  background: var(--accent);
  color: var(--on-accent);
  font-size: var(--fs-small); font-weight: 600;
  cursor: pointer;
  transition: background 150ms ease;
}
.faro-rail__new:hover { background: var(--accent-hover); }

.faro-rail__item {
  display: flex; align-items: center; gap: var(--sp-2);
  width: 100%; text-align: left;
  padding: var(--sp-2) var(--sp-4);
  border: 0; background: transparent;
  color: var(--text-muted);
  font-size: var(--fs-small);
  cursor: pointer;
  transition: color 150ms ease, background 150ms ease;
}
.faro-rail__item:hover { color: var(--text); background: var(--hover); }
.faro-rail__item.active { color: var(--sand-on-surface); background: var(--champagne-dim); }
.faro-rail__icon { display: inline-flex; opacity: 0.85; }

.faro-rail__section {
  padding: var(--sp-4) var(--sp-4) var(--sp-15);
  font-size: var(--fs-micro); font-weight: 700; letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--text-disabled);
}
.faro-rail__convos { overflow-y: auto; flex: 1 1 auto; min-height: 30px; }
.faro-convo {
  display: block; width: 100%; text-align: left;
  padding: var(--sp-15) var(--sp-4);
  font-size: var(--fs-small); color: var(--text-muted);
  background: transparent; border: 0; cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  transition: color 150ms ease, background 150ms ease;
}
/* ── De rij in de gesprekkenlijst ────────────────────────────────────────
   Was één knop; is nu een rij van drie: ster, titel, menu. Een <button> in een
   <button> is ongeldige HTML en wordt door de browser uit elkaar getrokken,
   dus de buitenkant is een div.

   De ster en het menu staan standaard op opacity 0 en komen op hover en op
   focus. Op een aanraakscherm bestaat hover niet, dus daar staan ze altijd aan
   -- anders is de enige manier om een gesprek te hernoemen onvindbaar. */
.faro-convo-rij {
  display: flex; align-items: center; gap: var(--sp-1);
  border-radius: var(--r-sm); position: relative;
}
.faro-convo-rij:hover { background: var(--hover); }
.faro-convo-rij.active { background: var(--champagne-dim); }
.faro-convo-rij.active .faro-convo { color: var(--sand-on-surface); }
.faro-convo-ster, .faro-convo-menu {
  flex: 0 0 auto;
  width: 24px; height: 24px;
  display: flex; align-items: center; justify-content: center;
  border: 0; background: transparent; cursor: pointer; padding: 0;
  color: var(--text-muted); font-size: var(--fs-small); line-height: 1;
  opacity: 0; transition: opacity 150ms ease, color 150ms ease;
}
.faro-convo-rij:hover .faro-convo-ster,
.faro-convo-rij:hover .faro-convo-menu,
.faro-convo-ster:focus-visible, .faro-convo-menu:focus-visible { opacity: 1; }
/* Een gemarkeerd gesprek blijft altijd zichtbaar gemarkeerd: de ster is dan
   geen bedieningselement meer maar informatie. */
.faro-convo-ster.aan { opacity: 1; color: var(--champagne); }
.faro-convo-ster:hover, .faro-convo-menu:hover { color: var(--text); }
@media (hover: none) and (pointer: coarse) {
  .faro-convo-ster, .faro-convo-menu { opacity: 1; }
}

/* Het menu zweeft (position:fixed, aan de body). Hij hing eerst aan de rij
   in de scrollende lijst en viel bij het laatste gesprek onder de rand. */
.faro-convo-menu-pop {
  position: fixed; z-index: 400;
  min-width: 150px; padding: var(--sp-1);
  background: var(--bg-card-alt); border: 1px solid var(--border-bright);
  border-radius: var(--r-sm); box-shadow: 0 6px 20px rgba(0,0,0,0.35);
}
.faro-convo-menu-pop button {
  display: block; width: 100%; text-align: left;
  padding: var(--sp-2) var(--sp-3); border: 0; background: transparent;
  color: var(--text); font: inherit; font-size: var(--fs-small);
  border-radius: var(--r-sm); cursor: pointer;
}
.faro-convo-menu-pop button:hover { background: var(--hover); }
.faro-convo-menu-pop button.gevaar { color: var(--red-ink, #F4A4A4); }

.faro-convo:hover { color: var(--text); background: var(--hover); }
.faro-convo.active { color: var(--sand-on-surface); background: var(--champagne-dim); }

/* De lege regel onder "Recent". Bewust GEEN knop-opmaak: er valt niets te
   klikken, en iets wat op een gesprek lijkt maar er geen is, is erger dan de
   leegte die hier stond. Wel dezelfde inspringing, zodat het onder de kop
   hoort en er niet los onder hangt.

   --text-disabled en niet --text-muted: dit is de zachtste tekst in de rail,
   want het is een mededeling en geen inhoud. Nog steeds leesbaar -- zie
   scripts/faro-check.js, dat elke tekstkleur op dit vlak nameet. */
.faro-convo-leeg {
  margin: 0;
  padding: var(--sp-15) var(--sp-4);
  font-size: var(--fs-tiny);
  line-height: 1.5;
  color: var(--text-disabled);
}

/* min-height omdat dit een knop is en geen link in lopende tekst: op 390px
   doorgemeten was hij 14 pixels hoog, en WCAG 2.5.8 (AA) vraagt 24 als
   ondergrens voor iets wat je met een duim moet raken. --sp-6 IS 24, dus dit
   blijft op de schaal (zie tests/raakdoelen.test.js voor de drie soorten die
   hetzelfde probleem hadden op "Je assistent").

   inline-flex en niet flex: flex maakt er een blok van dat de hele rail breed
   wordt, en dan verandert het uiterlijk in plaats van alleen het raakvlak. */
.faro-rail__viewall {
  margin: var(--sp-1) var(--sp-4) 0; padding: var(--sp-1) 0;
  min-height: var(--sp-6);
  display: inline-flex; align-items: center;
  background: none; border: 0;
  color: var(--text-disabled); font-size: var(--fs-tiny); text-align: left; cursor: pointer;
  transition: color 150ms ease;
}
.faro-rail__hint {
  margin: var(--sp-05) var(--sp-3) 0;
  font-size: var(--fs-micro);
  color: var(--text-muted);
  line-height: 1.4;
}
.faro-rail__viewall:hover { color: var(--accent); }


/* ═══ Landing (requirement 4) ══════════════════════════════════════════════ */
.faro-landing { flex: 1; overflow-y: auto; padding: var(--sp-8) var(--sp-6) var(--sp-10); }
.faro-landing__inner { width: 100%; max-width: 720px; margin: 0 auto; }

/* Mascot. Smaller than the design's, requirement 4 asks for "subtle and
   relatively small" and requirement 11 for "not childish", and at the mockup's
   size it out-competed the input, which is supposed to be the page's focus.
   One number to revisit if that judgement is wrong. */
.faro-mascot {
  position: relative;          /* above the orb, which is the grid's other cell */
  width: 72px;
  height: 72px;
  margin: 0;                   /* .faro-mark owns the spacing now */
  display: block;
  transition: filter 400ms ease, transform 400ms ease;
}
/* If the asset is missing, hide rather than show a broken-image glyph -
   only the idle render exists today. */
.faro-mascot--missing { visibility: hidden; }
/* ── Elke toestand beweegt anders ──────────────────────────────────────────
   Er waren zes tekeningen maar maar EEN beweging: alleen 'thinking' ademde,
   de rest stond stil. Een valk die niet beweegt is een plaatje, geen collega.
   En omdat verschillende toestanden dezelfde tekening delen (zie TOESTANDEN in
   api/_faro/werk.js), was 'aan het werk' visueel niet te onderscheiden van
   'zit stil te wachten'.

   Beweging doet hier dus twee dingen tegelijk: ze geeft Faro karakter, en ze
   maakt zichtbaar WAT hij aan het doen is zonder dat er zes nieuwe tekeningen
   bij moeten.

   Twee regels die de hele opzet bepalen:

   1. Wat blijft duren, beweegt zacht en traag. Ademen, deinen, drijven. Iets
      dat de hele dag in je ooghoek staat te stuiteren wordt binnen een uur
      irritant en daarna zet je het uit.

   2. Wat een GEBEURTENIS is, speelt EEN keer af en stopt. Een juichende valk
      die blijft juichen viert niets meer, en een die blijft trillen leest als
      een kapotte pagina in plaats van als een melding. Vandaar de eindige
      herhalingen bij success en error, met forwards zodat hij netjes stil
      eindigt in plaats van terug te springen. */

/* Rust: ademen. De basis waar alles op terugvalt. */
.faro-mascot[data-state="idle"]      { animation: faro-breathe 4.6s ease-in-out infinite; }

/* Denken: sneller ademen en licht schuin -- hij is ergens mee bezig. */
.faro-mascot[data-state="thinking"]  { animation: faro-denkt 2.8s ease-in-out infinite; }

/* Aan het werk: een gestage puls, als iets dat draait. */
.faro-mascot[data-state="generating"]{ animation: faro-werkt 1.9s ease-in-out infinite; }

/* Video: trager en breder, hij kijkt rond. */
.faro-mascot[data-state="video"]     { animation: faro-drijft 6.5s ease-in-out infinite; }

/* Gelukt: twee keer stuiteren, dan klaar. */
.faro-mascot[data-state="success"]   {
  animation: faro-juicht 620ms cubic-bezier(.22, 1.2, .36, 1) 2 forwards;   /* lichte overshoot, geen cartoonveer */
}

/* Aandacht: een korte schud, en dan stil blijven staan. */
.faro-mascot[data-state="error"]     {
  filter: none;   /* finish-fix 4: geen rode gloed; de foutkaart zegt het in tekst */
  animation: faro-schudt 480ms ease-in-out 1 forwards;
}

/* Deliberately tiny amplitude. Requirement 11: "extremely subtle". */
@keyframes faro-breathe {
  0%, 100% { transform: translateY(0)    scale(1);     }
  50%      { transform: translateY(-2px) scale(1.015); }
}
@keyframes faro-denkt {
  0%, 100% { transform: translateY(0)    rotate(0deg);      }
  50%      { transform: translateY(-3px) rotate(-1.5deg);   }
}
@keyframes faro-werkt {
  0%, 100% { transform: scale(1);     }
  50%      { transform: scale(1.035); }
}
@keyframes faro-drijft {
  0%, 100% { transform: translate(0, 0)        rotate(0deg);    }
  33%      { transform: translate(3px, -3px)   rotate(1deg);    }
  66%      { transform: translate(-3px, -1px)  rotate(-1deg);   }
}
@keyframes faro-juicht {
  0%   { transform: translateY(0)     scale(1);     }
  40%  { transform: translateY(-9px)  scale(1.06);  }
  70%  { transform: translateY(1px)   scale(0.985); }
  100% { transform: translateY(0)     scale(1);     }
}
@keyframes faro-schudt {
  0%, 100% { transform: translateX(0);    }
  20%      { transform: translateX(-4px); }
  40%      { transform: translateX(4px);  }
  60%      { transform: translateX(-3px); }
  80%      { transform: translateX(2px);  }
}

/* Wie beweging heeft uitgezet, meent dat. Dan geen enkele animatie -- ook niet
   de eenmalige, want juist een sprong of een schud is wat iemand met
   bewegingsklachten ziek maakt. De toestand blijft af te lezen aan de tekening
   en aan de gloed, en die veranderen allebei gewoon mee. */
@media (prefers-reduced-motion: reduce) {
  .faro-mascot,
  .faro-mascot[data-state="idle"],
  .faro-mascot[data-state="thinking"],
  .faro-mascot[data-state="generating"],
  .faro-mascot[data-state="video"],
  .faro-mascot[data-state="success"],
  .faro-mascot[data-state="error"] { animation: none; transition: none; }
}

/* ── The orb ────────────────────────────────────────────────────────────────
   It exists because public/faro/ is empty on a fresh checkout, which left the
   landing screen with a headline and no face at all.

   Finish-fix 4: no gloss, no conic sheen, no bloom. A flat sand disc with a
   1px --deep-sand ring -- the same "declare elevation once" rule the rest of
   the app follows, not a glow as a device. */
.faro-mark {
  position: relative;
  width: 72px; height: 72px;
  margin: 0 auto var(--sp-5);
  display: grid; place-items: center;
}
.faro-orb {
  position: absolute; inset: 0;
  border-radius: 50%;
  background: var(--warm-sand);
  box-shadow: 0 0 0 1px var(--deep-sand);
}

/* States. A change of tint, never of shape or glow. */
.faro-mark[data-state="error"]      .faro-orb {
  background: #8a7a63;
  box-shadow: 0 0 0 1px #6f6152;
}
/* When the falcon artwork exists it sits on the orb; the orb then reads as the
   backing shape behind it rather than as the mark itself. */
.faro-mark:has(.faro-mascot:not(.faro-mascot--missing)) .faro-orb { opacity: 0.5; }

.faro-landing__title {
  font-size: var(--fs-display); font-weight: 600; letter-spacing: -0.02em;
  text-align: center; color: var(--text); margin: 0 0 var(--sp-2);
}
/* The question, once the headline above it has become a greeting. Sits between
   title and sub in weight so the eye still lands on it before the input. */
.faro-landing__lead {
  font-size: var(--fs-body); font-weight: 500; text-align: center;
  color: var(--text); margin: 0 0 var(--sp-15);
}
.faro-landing__sub {
  font-size: var(--fs-meta); text-align: center; color: var(--text-muted); margin: 0 0 var(--sp-6);
}

/* ═══ The input, the visual focus of the panel ═══════════════════════════ */
.faro-input {
  position: relative;
  background: var(--faro-input-bg);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  padding: var(--sp-4) var(--sp-4) var(--sp-3);
  transition: border-color 150ms ease, box-shadow 150ms ease;
}
/* Finish-fix 4: no ambient bloom under the composer -- focus reads from a
   1px tan outline, same mechanism as everywhere else, not a glow. */
.faro-input:focus-within,
.faro-input.dragover {
  border-color: var(--champagne);   /* één ring: de rand zelf, geen tweede outline */
}

/* ── Step list ──────────────────────────────────────────────────────────────
   Every tool the model runs gets a row that STAYS. The single status line it
   replaces overwrote itself, so a three-tool turn showed only whichever tool
   happened to be last -- the user could not tell whether Faro had read their
   pipeline before answering, which is exactly the thing that makes an answer
   trustworthy. */
.faro-steps {
  margin: 0 0 var(--sp-3);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: var(--sp-2) var(--sp-3) var(--sp-2) var(--sp-3);
  background: var(--faro-input-bg);
  display: inline-flex; flex-direction: column; gap: var(--sp-05);
  /* Hugs its rows. Stretched to the bubble width a single step reads as an
     empty banner rather than a line of progress. */
  width: fit-content; max-width: 100%; align-self: flex-start;
}
.faro-step {
  display: flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-small); color: var(--text-muted);
  padding: var(--sp-1) var(--sp-05); line-height: 1.4;
}
.faro-step__mark {
  flex: 0 0 auto; width: 14px; height: 14px;
  display: grid; place-items: center;
}
.faro-step__mark::before {
  content: ''; width: 9px; height: 9px; border-radius: 50%;
  background: var(--border);
}
.faro-step[data-state="running"] .faro-step__mark::before {
  background: var(--champagne);
  animation: faro-step-pulse 1.1s ease-in-out infinite;
}
.faro-step[data-state="done"]   .faro-step__mark::before { background: var(--champagne); }
.faro-step[data-state="failed"] .faro-step__mark::before { background: #dc2626; }
.faro-step[data-state="done"]   { color: var(--text); }
.faro-step[data-state="failed"] { color: var(--text); }
@keyframes faro-step-pulse {
  0%, 100% { transform: scale(1);   opacity: 1;    }
  50%      { transform: scale(0.6); opacity: 0.45; }
}
@media (prefers-reduced-motion: reduce) {
  .faro-step[data-state="running"] .faro-step__mark::before { animation: none; }
}
.faro-input__field {
  width: 100%; min-height: 24px; max-height: 200px; resize: none;
  border: 0; outline: 0; background: transparent; color: var(--text);
  font: inherit; font-size: var(--fs-body); line-height: 1.5;
}
.faro-input__field::placeholder { color: var(--text-disabled); }

.faro-input__attachments { display: flex; flex-wrap: wrap; gap: var(--sp-15); }
.faro-input__attachments:not(:empty) { margin-top: var(--sp-2); }

.faro-input__bar { display: flex; align-items: center; gap: var(--sp-15); margin-top: var(--sp-3); }
.faro-input__spacer { flex: 1; }

.faro-tool-btn {
  display: inline-flex; align-items: center; gap: var(--sp-15);
  padding: var(--sp-15) var(--sp-3); border-radius: var(--r-sm);
  border: 1px solid var(--faro-hairline); background: transparent;
  color: var(--text-muted); font-size: var(--fs-small); cursor: pointer;
  transition: color 150ms ease, background 150ms ease, border-color 150ms ease;
}
.faro-tool-btn:hover { color: var(--text); background: var(--faro-raised); border-color: var(--champagne-line); }
.faro-tool-btn--icon { padding: var(--sp-15) var(--sp-2); }
.faro-model-btn { font-weight: 500; }

/* Send button. Dark glyph on champagne, the light arrow in the design would
   not have met contrast against this fill, and this is the one control the
   user must always be able to find. --on-accent is the token for exactly this. */
/* Stopmodus: dezelfde knop, duidelijk andere betekenis. Rood zou hier "fout"
   suggereren terwijl stoppen een normale keuze is, dus neutraal met een rand -
   het verschil zit in de vorm (vierkant) en het label. */
/* Bijlagen: miniatuur, naam, en een kruisje om hem weer weg te halen. */
.faro-attach {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-15);
  padding-right: var(--sp-1);
  max-width: 220px;
}
.faro-attach__thumb {
  width: 18px; height: 18px;
  border-radius: var(--sp-1);
  object-fit: cover;
  flex-shrink: 0;
}
.faro-attach__name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.faro-attach__rm {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px; height: 18px;
  flex-shrink: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: inherit;
  opacity: 0.6;
  cursor: pointer;
}
.faro-attach__rm:hover { opacity: 1; background: var(--surface-3); }
.faro-attach__rm:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; opacity: 1; }

.faro-send--stop {
  background: var(--surface-2) !important;
  color: var(--text) !important;
  border: 1px solid var(--border) !important;
}
.faro-send--stop:hover { background: var(--surface-3) !important; }

.faro-send {
  width: 34px; height: 34px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: var(--r-sm); border: 0;
  background: var(--accent); color: var(--on-accent);
  cursor: pointer;
  transition: background 150ms ease, opacity 150ms ease;
}
.faro-send:hover:not(:disabled) { background: var(--accent-hover); }
.faro-send:disabled { opacity: 0.3; cursor: default; }

/* ═══ Faro context (requirement 6) ════════════════════════════════════════ */
.faro-context-row {
  display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2);
  margin-top: var(--sp-4); padding: 0 var(--sp-05);
}
.faro-context-row__label { font-size: var(--fs-tiny); color: var(--text-muted); }
.faro-context-row__chips { display: flex; flex-wrap: wrap; gap: var(--sp-15); flex: 1; }
.faro-context-chip {
  display: inline-flex; align-items: center; gap: var(--sp-15);
  padding: var(--sp-1) var(--sp-3); border-radius: var(--r-full);
  border: 1px solid var(--faro-hairline);
  font-size: var(--fs-tiny); color: var(--text-muted);
}
.faro-context-chip svg { color: var(--success); }
.faro-context-chip--off { opacity: 0.45; }
.faro-context-chip--off svg { color: var(--text-disabled); }

.faro-context-row__manage {
  padding: var(--sp-1) var(--sp-3); border-radius: var(--r-full);
  border: 1px solid var(--faro-hairline); background: transparent;
  color: var(--text-muted); font-size: var(--fs-tiny); cursor: pointer;
  transition: color 150ms ease, border-color 150ms ease;
}
.faro-context-row__manage:hover { color: var(--text); border-color: var(--champagne-line); }

.faro-context-panel {
  margin-top: var(--sp-3); padding: var(--sp-4) var(--sp-4);
  border: 1px solid var(--faro-hairline); border-radius: var(--r-md);
  background: var(--faro-surface);
}
.faro-context-panel__note { margin: 0 0 var(--sp-3); font-size: var(--fs-small); color: var(--text-muted); }
.faro-context-toggle {
  display: flex; align-items: center; justify-content: space-between;
  padding: var(--sp-2) 0; font-size: var(--fs-small); color: var(--text);
  border-top: 1px solid var(--divider);
}
.faro-context-toggle:first-child { border-top: 0; }

/* ═══ Sections ════════════════════════════════════════════════════════════ */
.faro-section { margin-top: var(--sp-8); }
.faro-section__head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-3); margin-bottom: var(--sp-4);
}
.faro-section__title {
  margin: 0; font-size: var(--fs-lead); font-weight: 600;
  letter-spacing: -0.01em; color: var(--text);
}
.faro-pill {
  padding: var(--sp-15) var(--sp-3); border-radius: var(--r-full);
  border: 1px solid var(--faro-hairline); background: transparent;
  color: var(--text-muted); font-size: var(--fs-tiny); cursor: pointer; white-space: nowrap;
  transition: color 150ms ease, border-color 150ms ease;
}
.faro-pill:hover { color: var(--text); border-color: var(--champagne-line); }

/* ═══ Quick actions (requirement 5) ═══════════════════════════════════════ */
.faro-quick { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-4); }
.faro-quick__group {
  min-width: 0;
  border: 1px solid var(--faro-hairline);
  border-radius: var(--r-lg);
  background: var(--faro-surface);
  padding: var(--sp-4);
}
.faro-quick__label {
  font-size: var(--fs-small); font-weight: 600; color: var(--text); margin-bottom: var(--sp-3);
}
.faro-quick__action {
  display: flex; align-items: center; gap: var(--sp-3);
  width: 100%; text-align: left;
  padding: var(--sp-3) var(--sp-3); margin-bottom: var(--sp-15);
  border-radius: var(--r-md);
  border: 1px solid transparent;
  background: var(--faro-raised);
  color: var(--text-muted);
  font-size: var(--fs-small);
  cursor: pointer;
  transition: color 150ms ease, background 150ms ease, border-color 150ms ease;
}
.faro-quick__action:last-child { margin-bottom: 0; }
.faro-quick__action:hover { color: var(--text); border-color: var(--champagne-line); }
/* Icon chips. Colour is scoped to exactly this element, 26px, inside a quick
   action, nowhere else in the product. See ./tokens.js for why the hues are
   muted and why purple is absent. */
.faro-quick__icon {
  display: inline-flex; flex-shrink: 0;
  width: 30px; height: 30px; align-items: center; justify-content: center;
  border-radius: var(--r-sm);
  background: var(--champagne-dim);
  color: var(--deep-sand);
  transition: background 150ms ease, color 150ms ease;
}
.faro-quick__icon--amber      { background: var(--ic-amber-bg);      color: var(--ic-amber);      }
.faro-quick__icon--slate      { background: var(--ic-slate-bg);      color: var(--ic-slate);      }
.faro-quick__icon--teal       { background: var(--ic-teal-bg);       color: var(--ic-teal);       }
.faro-quick__icon--terracotta { background: var(--ic-terracotta-bg); color: var(--ic-terracotta); }
.faro-quick__icon--rose       { background: var(--ic-rose-bg);       color: var(--ic-rose);       }
.faro-quick__icon--gold       { background: var(--ic-gold-bg);       color: var(--ic-gold);       }
.faro-quick__icon--green      { background: var(--ic-green-bg);      color: var(--ic-green);      }
.faro-quick__icon--orange     { background: var(--ic-orange-bg);     color: var(--ic-orange);     }
.faro-quick__icon--sky        { background: var(--ic-sky-bg);        color: var(--ic-sky);        }
.faro-quick__text { flex: 1; min-width: 0; }
.faro-quick__chev { flex-shrink: 0; opacity: 0.3; transition: opacity 150ms ease, transform 150ms ease; }
.faro-quick__action:hover .faro-quick__chev { opacity: 0.8; transform: translateX(2px); }

/* ═══ Recently created ════════════════════════════════════════════════════ */
.faro-activity { position: relative; }
.faro-activity__track {
  display: flex; gap: var(--sp-3);
  overflow-x: auto;
  scroll-snap-type: x proximity;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  /* Room for the card's own hover lift, so it is not clipped by the scroller. */
  padding: var(--sp-05) var(--sp-05) var(--sp-2);
}
.faro-activity__track::-webkit-scrollbar { display: none; }

/* The arrow floats over the last card rather than beside the row: putting it
   outside would either eat page width or hang into the gutter, and this
   section already sits at the container edge. */
.faro-activity__nav {
  position: absolute; right: calc(var(--sp-05) * -1); top: 38%;
  width: var(--sp-8); height: var(--sp-8); border-radius: var(--r-full);
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid var(--faro-hairline);
  background: var(--faro-surface); color: var(--text-muted);
  box-shadow: 0 var(--sp-05) var(--sp-3) rgba(0,0,0,0.28);
  cursor: pointer; transition: color 150ms ease, border-color 150ms ease, transform 150ms ease;
}
.faro-activity__nav:hover { color: var(--text); border-color: var(--champagne); }
.faro-activity__nav[hidden] { display: none; }
/* At the end it points back to the start rather than pretending there is more. */
.faro-activity__nav[data-at-end="1"] svg { transform: scaleX(-1); }

.faro-act-card {
  flex: 0 0 216px; scroll-snap-align: start;
  border: 1px solid var(--faro-hairline); border-radius: var(--r-lg);
  background: var(--faro-surface); overflow: hidden;
  cursor: pointer;
  transition: border-color 150ms ease, transform 150ms ease;
}
.faro-act-card:hover { border-color: var(--champagne-line); transform: translateY(calc(var(--sp-05) * -1)); }
.faro-act-card:focus-visible { outline: 2px solid var(--champagne); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .faro-act-card:hover { transform: none; } }

/* 4:3, so a room photo reads as a room. The surface underneath is what shows
   while the image loads and if it never does, a plain panel with a badge on
   it, rather than a browser's broken-image glyph. */
.faro-act-card__media {
  position: relative; aspect-ratio: 4 / 3;
  background: var(--faro-raised);
  display: flex; align-items: center; justify-content: center;
}
.faro-act-card__media img,
.faro-act-card__media video { width: 100%; height: 100%; object-fit: cover; display: block; }

.faro-act-card__badge {
  position: absolute; top: var(--sp-2); left: var(--sp-2);
  padding: var(--sp-05) var(--sp-2); border-radius: var(--r-xs);
  background: rgba(18,18,18,0.72); color: var(--warm-sand);
  font-size: var(--fs-micro); font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
  backdrop-filter: blur(2px);
}
.faro-act-card__dur {
  position: absolute; top: var(--sp-2); right: var(--sp-2);
  padding: var(--sp-05) var(--sp-2); border-radius: var(--r-xs);
  /* Literal white, not var(--text). This chip sits on a dark scrim in BOTH
     themes, so a token that flips with the theme puts near-black text on a
     near-black pill, the duration was invisible in light mode. Same reason
     the badge above uses --warm-sand rather than an accent that flips. */
  background: rgba(18,18,18,0.72); color: #F4F1EA;
  font-size: var(--fs-micro); font-variant-numeric: tabular-nums;
  backdrop-filter: blur(2px);
}
/* Play marker, centred. Marks a video as a video without needing the word. */
.faro-act-card__play {
  position: absolute; inset: 0; margin: auto;
  width: var(--sp-8); height: var(--sp-8); border-radius: var(--r-full);
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(23,20,15,0.62); color: #F4E7C8;   /* warm scrim, zandinkt */
  backdrop-filter: blur(2px);
}

/* TEXT artifacts have no image, the copy itself is the preview, faded at the
   bottom so a long excerpt reads as continuing rather than as cut off. */
.faro-act-card__media--text {
  display: block;
  padding: var(--sp-8) var(--sp-3) var(--sp-3);
  overflow: hidden;
}
.faro-act-card__excerpt {
  margin: 0;
  font-size: var(--fs-tiny); line-height: 1.55; color: var(--text-muted);
}
.faro-act-card__media--text::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: var(--sp-8);
  background: linear-gradient(to bottom, rgba(0,0,0,0), var(--faro-raised));
  pointer-events: none;
}

.faro-act-card__meta { padding: var(--sp-3); }
.faro-act-card__title {
  font-size: var(--fs-small); font-weight: 600; color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.faro-act-card__sub {
  font-size: var(--fs-micro); color: var(--text-muted); margin-top: var(--sp-05);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ═══ Conversation view (requirement 7) ═══════════════════════════════════ */
.faro-thread { flex: 1; overflow-y: auto; padding: var(--sp-6) 0 var(--sp-2); min-height: 0; }
.faro-thread__inner { max-width: 760px; margin: 0 auto; padding: 0 var(--sp-6); }
.faro-composer { flex-shrink: 0; border-top: 1px solid var(--faro-hairline); padding: var(--sp-4) var(--sp-6) var(--sp-4); }
.faro-composer__inner { max-width: 760px; margin: 0 auto; }

/* User messages stay minimal, requirement 7. No avatar, no chrome. */
.faro-msg--user {
  margin: 0 0 var(--sp-5) auto; max-width: 78%; width: fit-content;
  padding: var(--sp-3) var(--sp-4); border-radius: var(--r-lg) var(--r-lg) var(--r-xs) var(--r-lg);
  background: var(--faro-raised); color: var(--text);
  font-size: var(--fs-meta); line-height: 1.55; white-space: pre-wrap;
  /* Een geplakte AutoScout-link van 200 tekens zonder spatie rekte de
     bel uit tot voorbij het scherm en gaf de hele pagina een horizontale
     scrollbalk. Breken mag overal, want hier staat geen code. */
  overflow-wrap: anywhere; word-break: break-word; min-width: 0;
}
.faro-msg--ai, .faro-msg__text { overflow-wrap: anywhere; min-width: 0; }
.faro-msg__text pre { overflow-x: auto; }
.faro-thread__inner { min-width: 0; }
.faro-msg--ai { margin: 0 0 var(--sp-6); font-size: var(--fs-meta); line-height: 1.65; color: var(--text); }
/* Het merkteken bij een antwoord. Zweeft links van de tekst zodat de
   regelbreedte niet verspringt tussen berichten mét en zonder avatar, en
   verdwijnt op smal beeld waar die ruimte er simpelweg niet is. */
.faro-msg--ai { position: relative; }
.faro-msg__ai-avatar {
  position: absolute; left: calc(var(--sp-8) * -1); top: 2px;
  width: 22px; height: 22px; border-radius: var(--r-full);
  opacity: 0.92; pointer-events: none; user-select: none;
}
@media (max-width: 1100px) { .faro-msg__ai-avatar { display: none; } }
.faro-dock__mark { display: block; border-radius: var(--r-full); }
/* pre-wrap tijdens het streamen (de tekst komt als kale regels binnen);
   zodra de beurt klaar is tekent faroRenderMarkdown() alinea's, koppen en
   lijsten als echte elementen, en dan is pre-wrap juist in de weg -- een
   lege regel tussen twee alinea's zou dubbel tellen. */
.faro-msg__text { white-space: pre-wrap; }
.faro-msg__text:has(p, ul, ol, h3, h4, pre) { white-space: normal; }
.faro-msg__text p { margin: 0 0 var(--sp-2); }
.faro-msg__text p:last-child { margin-bottom: 0; }
.faro-msg__text h3 { font-size: var(--fs-lead); font-weight: 600; margin: var(--sp-3) 0 var(--sp-1); }
.faro-msg__text h4 { font-size: var(--fs-body); font-weight: 600; margin: var(--sp-2) 0 var(--sp-05); }
.faro-msg__text ul, .faro-msg__text ol { margin: 0 0 var(--sp-2); padding-left: var(--sp-5); }
.faro-msg__text li { margin: 0 0 var(--sp-05); }
.faro-msg__text li p { margin: 0; }
.faro-msg__text code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-small);
  padding: 0 var(--sp-05);
  border-radius: var(--r-xs);
  background: var(--faro-raised);
}
.faro-msg__text pre {
  margin: 0 0 var(--sp-2);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-sm);
  background: var(--faro-raised);
  overflow-x: auto;
}
.faro-msg__text pre code { padding: 0; background: none; }
.faro-msg__thumb {
  display: block;
  max-width: 220px; max-height: 160px;
  border-radius: var(--r-sm);
  margin-bottom: var(--sp-2);
}
.faro-msg__thumb:last-child { margin-bottom: 0; }

.faro-status {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-small); color: var(--text-muted); margin-bottom: var(--sp-3);
}
/* De bewegende valk (geanimeerde webp) naast "Faro denkt na". Rond, met een
   dun champagne-randje zodat het grijze plaatje niet als een losse munt op
   het donker ligt. */
.faro-status__mascot {
  width: 28px; height: 28px; border-radius: var(--r-full); display: block; flex: 0 0 auto;
  box-shadow: 0 0 0 1px var(--champagne-line);
  user-select: none; pointer-events: none;
}
.faro-msg__ai-avatar--bezig {
  width: 30px; height: 30px; left: calc(var(--sp-8) * -1 - 4px); top: 0;
  box-shadow: 0 0 0 1px var(--champagne-line);
  opacity: 1;
}
.faro-status__dot {
  width: 5px; height: 5px; border-radius: 50%; background: var(--champagne);
  animation: faro-pulse 1.4s ease-in-out infinite;
}
@keyframes faro-pulse { 0%,100% { opacity: 0.3; } 50% { opacity: 1; } }

/* ═══ Response components ═════════════════════════════════════════════════ */
.faro-cards { display: grid; gap: var(--sp-3); }
.faro-cards:not(:empty) { margin-top: var(--sp-4); }

.faro-card {
  border: 1px solid var(--faro-hairline); border-radius: var(--r-lg);
  background: var(--faro-surface); padding: var(--sp-4) var(--sp-4);
  transition: border-color 150ms ease;
}
.faro-card:hover { border-color: var(--champagne-line); }
.faro-card__name { font-size: var(--fs-body); font-weight: 600; color: var(--text); }
.faro-card__budget { font-size: var(--fs-lead); font-weight: 600; color: var(--deep-sand); margin: var(--sp-1) 0 var(--sp-05); }
.faro-card__meta { font-size: var(--fs-small); color: var(--text-muted); line-height: 1.5; }
.faro-card__tags { display: flex; flex-wrap: wrap; gap: var(--sp-15); margin: var(--sp-3) 0 0; }
.faro-tag {
  font-size: var(--fs-micro); padding: var(--sp-1) var(--sp-2); border-radius: var(--r-xs);
  background: var(--faro-raised); color: var(--text-muted);
}
.faro-tag--qualified { background: var(--champagne-dim); color: var(--deep-sand); }
.faro-card__actions { display: flex; flex-wrap: wrap; gap: var(--sp-15); margin-top: var(--sp-3); }
.faro-card__btn {
  padding: var(--sp-15) var(--sp-3); border-radius: var(--r-sm);
  border: 1px solid var(--faro-hairline); background: transparent;
  color: var(--text-muted); font-size: var(--fs-small); cursor: pointer;
  transition: color 150ms ease, background 150ms ease;
}
.faro-card__btn:hover { color: var(--text); background: var(--faro-raised); }
.faro-card__btn--primary {
  background: var(--accent); color: var(--on-accent);
  border-color: transparent; font-weight: 600;
}
.faro-card__btn--primary:hover { background: var(--accent-hover); color: var(--on-accent); }
.faro-card__btn:disabled { opacity: 0.5; cursor: default; }

/* Confirmation card, deliberately more prominent than a lead card. It is the
   one component gating a real-world side effect (requirement 8). */
/* De afgeronde kaart: een vinkje en een zin op leesgrootte, geen grijze
   statusregel. Dit is Faro's antwoord op de bevestiging. */
.faro-card--done { border-color: var(--champagne-line); }
.faro-card__done { display: flex; gap: var(--sp-3); align-items: flex-start; font-size: var(--fs-meta); line-height: 1.6; color: var(--text); }
.faro-card__done-mark { flex: 0 0 auto; color: var(--champagne); font-weight: 700; }
.faro-card--confirm { border-color: var(--champagne-line); background: var(--champagne-dim); }
.faro-card--confirm .faro-card__name { color: var(--deep-sand); }

/* ═══ Skeletons, empties, errors (requirement 15) ═════════════════════════ */
.faro-skeleton {
  border-radius: var(--r-md);
  background: linear-gradient(90deg, var(--faro-surface) 25%, var(--faro-raised) 37%, var(--faro-surface) 63%);
  background-size: 400% 100%;
  animation: faro-shimmer 1.4s ease infinite;
}
@keyframes faro-shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } }
@media (prefers-reduced-motion: reduce) { .faro-skeleton { animation: none; } }

.faro-empty {
  padding: var(--sp-5); border: 1px dashed var(--faro-hairline); border-radius: var(--r-lg);
  color: var(--text-disabled); font-size: var(--fs-small); text-align: center;
}
.faro-card--error { border-color: rgba(220,38,38,0.35); }

/* ═══ Panels & galleries (requirements 9, 10, 12) ═════════════════════════ */
.faro-panel { flex: 1; overflow-y: auto; padding: var(--sp-6) var(--sp-6) var(--sp-16); }
/* These sub-pages are toggled by the hidden attribute, which any display rule
   above would silently defeat, hence the explicit reset. */
.faro-panel[hidden] { display: none; }
.faro-panel__head {
  max-width: 980px; margin: 0 auto var(--sp-4);
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
}
.faro-panel__controls, .faro-gallery, #faro-projects-list { max-width: 980px; margin: 0 auto; }
.faro-gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--sp-4); }
.faro-gallery--video { grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); }
.faro-gallery:empty { display: none; }
.faro-media { border-radius: var(--r-lg); overflow: hidden; border: 1px solid var(--faro-hairline); background: var(--faro-surface); }
.faro-media__img { width: 100%; display: block; aspect-ratio: 4 / 3; object-fit: cover; background: var(--faro-raised); }
/* Wachtrij / wordt gemaakt / mislukt -- zie faroMediaCard() in client.js. */
.faro-media__pending { position: relative; }
.faro-media__pending--failed .faro-media__img { background: var(--faro-surface); }
.faro-media__pending--failed .faro-media__mark { filter: grayscale(1); opacity: 0.7; }
.faro-media__mark { position: absolute; right: var(--sp-2); bottom: var(--sp-2); width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--faro-hairline); background: var(--faro-surface); }
.faro-media__state { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); font-size: var(--fs-meta); color: var(--text-muted); font-variant-numeric: tabular-nums; }
.faro-media__state--failed { flex-direction: column; gap: var(--sp-1); }
.faro-media__state--failed .faro-media__label { color: var(--error-ink, var(--text)); font-weight: 600; }
.faro-media__sub { line-height: 1.5; }
/* Het hele beeld tonen, niet bijsnijden: een logo of tekst aan de rand verdween anders uit beeld. */
.faro-media__img:not(.faro-skeleton) { aspect-ratio: auto; object-fit: contain; max-height: 78vh; }
.faro-media__img--9-16 { aspect-ratio: 9 / 16; }
.faro-media__img--1-1  { aspect-ratio: 1 / 1;  }
.faro-media__bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-15); padding: var(--sp-3) var(--sp-3); }

/* Before/after toggle, sitting on the image itself rather than in the button
   row, it changes what you are looking at, so it belongs on the thing it
   changes. */
.faro-media__frame { position: relative; }
.faro-media__ba {
  position: absolute; left: 10px; bottom: 10px;
  padding: var(--sp-15) var(--sp-3); border-radius: var(--r-full);
  border: 1px solid rgba(255,255,255,0.18);
  background: rgba(18,18,18,0.72);
  backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px);
  color: #F4E7C8; font: inherit; font-size: var(--fs-tiny); font-weight: 600;
  cursor: pointer;
  transition: background 150ms ease;
}
.faro-media__ba:hover { background: rgba(18,18,18,0.88); }
.faro-media__ba.active { background: var(--accent); color: var(--on-accent); border-color: transparent; }

/* ═══ Menu, the model tier picker ════════════════════════════════════════ */
.faro-input__bar { position: relative; }
.faro-menu {
  position: absolute; bottom: calc(100% + 8px); right: 44px;
  min-width: 208px; z-index: 30;
  padding: var(--sp-15);
  border: 1px solid var(--faro-hairline); border-radius: var(--r-md);
  background: var(--faro-raised);
  box-shadow: 0 8px 28px rgba(0,0,0,0.28);
}
.faro-menu__item {
  display: block; width: 100%; text-align: left;
  padding: var(--sp-2) var(--sp-3); border: 0; border-radius: var(--r-sm);
  background: transparent; cursor: pointer;
  transition: background 150ms ease;
}
.faro-menu__item:hover { background: var(--hover); }
.faro-menu__item.active { background: var(--champagne-dim); }
.faro-menu__label { display: block; font-size: var(--fs-small); font-weight: 600; color: var(--text); }
.faro-menu__item.active .faro-menu__label { color: var(--sand-on-surface); }
.faro-menu__hint { display: block; font-size: var(--fs-tiny); color: var(--text-muted); margin-top: var(--sp-05); }

/* ═══ Gallery empty states ════════════════════════════════════════════════
   These have to teach, not just report emptiness: generation moved to the chat
   and a user landing here may not know that yet. */
.faro-empty--cta { padding: var(--sp-8) var(--sp-5); }
.faro-empty__title { font-size: var(--fs-meta); font-weight: 600; color: var(--text); margin-bottom: var(--sp-15); }
.faro-empty__hint { font-size: var(--fs-small); color: var(--text-muted); margin-bottom: var(--sp-4); line-height: 1.5; }

/* ═══ Responsive (requirement 16) ═════════════════════════════════════════ */
@media (max-width: 1100px) {
  .faro-quick { grid-template-columns: 1fr; }
}

@media (max-width: 860px) {
  /* The 208px rail does not fit, so it becomes a drawer inside the page -
     the same move the CRM sidebar already makes at this width. */
  .faro-page__rail-toggle { display: inline-flex; }
  .faro-rail {
    position: absolute;
    top: 0; bottom: 0; left: 0;
    z-index: 4;
    transform: translateX(-100%);
    transition: transform 180ms ease;
    box-shadow: 0 0 40px rgba(0,0,0,0.4);
  }
  .faro-rail.open { transform: none; }
  .faro-page__body { position: relative; }
}

@media (prefers-reduced-motion: reduce) { .faro-rail { transition: none; } }

@media (max-width: 768px) {
  /* Extra top padding clears the rail handle pinned at the top left. */
  .faro-landing { padding: var(--sp-12) var(--sp-4) var(--sp-10); }
  .faro-landing__title { font-size: var(--fs-title); }
  .faro-landing__sub { font-size: var(--fs-small); }
  .faro-mark { width: 56px; height: 56px; margin-bottom: var(--sp-4); }
  .faro-mascot { width: 56px; height: 56px; }
  .faro-landing__lead { font-size: var(--fs-body); }

  .faro-thread__inner { padding: 0 var(--sp-4); }
  .faro-composer { padding: var(--sp-3) var(--sp-4) var(--sp-4); }
  .faro-msg--user { max-width: 88%; }

  /* The control row does not fit at 390px with five items and text labels, and
     the one being pushed off the edge was Send, the single control
     requirement 16 says must "remain easily accessible". So on narrow screens
     the tool buttons go icon-only and Send may never shrink. */
  .faro-input { padding: var(--sp-3) var(--sp-3) var(--sp-2); }
  .faro-input__bar { gap: var(--sp-1); flex-wrap: nowrap; }
  .faro-tool-btn { padding: var(--sp-15) var(--sp-2); }
  .faro-tool-btn span:not(.faro-input__spacer) { display: none; }
  .faro-model-btn { min-width: 0; overflow: hidden; }
  .faro-model-btn #faro-model-label {
    display: inline; max-width: 84px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  }
  .faro-send { margin-left: auto; }

  /* Quick actions become one horizontally-scrollable row per group. overflow-x
     lives on the strip, never the page, requirement 16's "no horizontal
     overflow". */
  .faro-quick__actions {
    display: flex; gap: var(--sp-2); overflow-x: auto;
    scrollbar-width: none; -webkit-overflow-scrolling: touch; padding-bottom: var(--sp-05);
  }
  .faro-quick__actions::-webkit-scrollbar { display: none; }
  .faro-quick__action { flex: 0 0 auto; width: auto; margin-bottom: 0; white-space: nowrap; }
  .faro-quick__chev { display: none; }

  /* Wrapping put the manage button mid-chip-run. Stack instead. */
  .faro-context-row { flex-direction: column; align-items: flex-start; gap: var(--sp-15); }
  .faro-context-row__chips { width: 100%; }

  .faro-gallery, .faro-gallery--video, .faro-cards { grid-template-columns: 1fr; }
  /* The arrow goes; a thumb swipes the row on a phone. */
  .faro-activity__nav { display: none; }
  .faro-act-card { flex-basis: 176px; }
  .faro-section { margin-top: var(--sp-6); }

}

/* Phones. The launcher must survive a crowded topbar without pushing the theme
   toggle onto a second row, so it drops to icon-only. */
@media (max-width: 768px) {
  .faro-dock { padding: var(--sp-2) var(--sp-4) var(--sp-3); }
  .faro-dock__inner { padding: var(--sp-15) var(--sp-15) var(--sp-15) var(--sp-3); }
  .faro-dock__kbd { display: none; }
  #page-kalender { height: calc(100vh - 56px - 58px) !important; }
}

/* .hv-help-launcher (api/_dash/styles.js) drops to its own compact position
   at this same breakpoint -- right:16px, a 54px circle -- which a full-width
   sticky dock has no way to know about; the two stylesheets don't share
   selectors on purpose (see the file banner above). Below 520px the
   launcher's footprint (54px + 16px offset) landed on top of the dock's
   send button and clipped the placeholder text, confirmed in
   .impeccable/review/after-dashboard-light-390.png. --sp-4 (the dock's own
   side padding) + --sp-16 clears it with room to spare -- no raw pixel
   value, per the scale rule above. */
@media (max-width: 520px) {
  .faro-dock { padding: var(--sp-15) calc(var(--sp-3) + var(--sp-12)) var(--sp-15) var(--sp-3); }
  /* Faro's tipregel is op een telefoon een tweede balk boven de balk. Op dit
     formaat telt elke rij; de tip blijft in de werkruimte van Faro zelf. */
  .faro-dock .faro-dock__hint { display: none; }
}

/* ═══ Ingeklapte zijbalk, Faro-kant ═══════════════════════════════════════
   De CRM-kant had al regels voor body.sidebar-collapsed (api/_dash/styles.js);
   de Faro-kant niet. Op 68px breed bleef de hele rail gewoon op volle breedte
   staan en werd hij afgeknipt: "New nversat", "RECENT CONVER", de titels van
   gesprekken tot twee letters. Dat zag eruit als kapot, want dat was het.

   Wat hier gebeurt, per onderdeel:
   - de schakelaar CRM/Faro wordt een verticaal stapeltje van twee vierkante
     knoppen (het woord CRM in kleine letters, Faro als zijn merkteken);
   - "Nieuw gesprek" wordt alleen het plusje;
   - de vier navigatieknoppen tonen alleen hun pictogram, gecentreerd;
   - de gesprekkenlijst, de sectiekop, "alles bekijken" en de hint gaan weg --
     die passen niet op 68px en half-afgeknipte titels zijn erger dan geen.
   Uitklappen zet alles terug; er wordt niets uit de DOM gehaald. */
body.sidebar-collapsed .hv-switch {
  grid-template-columns: 1fr;
  width: 44px;
  margin: 0 auto var(--sp-3);
  padding: var(--sp-05);
}
body.sidebar-collapsed .hv-switch__tab {
  padding: var(--sp-2) 0;
  gap: 0;
  font-size: var(--fs-micro);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
body.sidebar-collapsed .hv-switch__tab .hv-switch__merk + span { display: none; }
body.sidebar-collapsed .faro-rail__new {
  margin: 0 auto var(--sp-3);
  width: var(--sp-10);
  height: var(--sp-10);
  padding: 0;
  gap: 0;
  font-size: 0;
  border-radius: var(--r-md);
}
body.sidebar-collapsed .faro-rail__new svg { width: var(--sp-4); height: var(--sp-4); }
body.sidebar-collapsed .faro-rail__item {
  justify-content: center;
  gap: 0;
  padding: var(--sp-2) 0;
  font-size: 0;
  line-height: 0;
}
body.sidebar-collapsed .faro-rail__icon { opacity: 1; }
body.sidebar-collapsed .faro-rail__icon svg { width: var(--sp-4); height: var(--sp-4); }
body.sidebar-collapsed .faro-rail__section,
body.sidebar-collapsed .faro-rail__convos,
body.sidebar-collapsed .faro-rail__viewall,
body.sidebar-collapsed .faro-rail__hint { display: none; }


/* ═══ Command Center ═══════════════════════════════════════════════════════ */
:root {
  /* Semantic tone per opportunity category. Dark-surface values.
     Elke waarde is gemeten tegen de chip waar hij ECHT op staat: dezelfde tint
     op 13% over de kaart, niet tegen de kaart zelf. Dat scheelt ongeveer een
     punt contrast, en drie van de vijf zakten daardoor onder 4,5:1 terwijl ze
     tegen de kale kaart nog leken te kloppen. */
  --cmd-hot:    #EDA164;  --cmd-hot-bg:    rgba(224, 135,  63, 0.13);  /* 6,0:1 */
  --cmd-ready:  #6FC4BC;  --cmd-ready-bg:  rgba( 76, 163, 155, 0.13);  /* 6,3:1 */
  --cmd-risk:   #E4907F;  --cmd-risk-bg:   rgba(201, 106,  90, 0.13);  /* 5,5:1 */
  --cmd-value:  #CFB57C;  --cmd-value-bg:  rgba(183, 154,  94, 0.13);  /* 6,4:1 */
  --cmd-cold:   #8FB9DC;  --cmd-cold-bg:   rgba(107, 155, 196, 0.13);  /* 6,2:1 */
}
[data-theme="light"] {
  --cmd-hot:    #A2541A;  --cmd-hot-bg:    rgba(224, 135,  63, 0.13);
  --cmd-ready:  #276C64;  --cmd-ready-bg:  rgba( 76, 163, 155, 0.13);
  --cmd-risk:   #9A3D2C;  --cmd-risk-bg:   rgba(201, 106,  90, 0.13);
  --cmd-value:  #7A6224;  --cmd-value-bg:  rgba(183, 154,  94, 0.15);
  --cmd-cold:   #2F5F86;  --cmd-cold-bg:   rgba(107, 155, 196, 0.15);
}

/* ── Inside the Faro landing ────────────────────────────────────────────────
   These sections are children of .faro-landing__inner, which already owns the
   width and the scroll. What they need is the vertical rhythm that separates
   "what happened" from the ask bar above it. */
#cmd-body { margin-top: var(--sp-8); }
.cmd-section { margin-bottom: var(--sp-8); }

/* Autopilot sits in the page header, opposite the rail toggle. Absolute rather
   than in flow: the landing is a scroll container, and a control that scrolls
   away is a control nobody finds again. */
.cmd-auto {
  position: absolute;
  top: var(--sp-3); right: var(--sp-4);
  z-index: 5;
  display: inline-flex; align-items: center; gap: var(--sp-2);
  padding: var(--sp-2) var(--sp-3);
  border: 1px solid var(--border); border-radius: var(--r-md);
  background: var(--faro-raised); color: var(--text);
  font: inherit; cursor: pointer; flex-shrink: 0;
  transition: border-color 150ms ease;
}
.cmd-auto:hover { border-color: var(--champagne); }
/* Alleen bij de briefing (de landing). In een gesprek hing hij rechtsboven
   OVER de eerste berichtbubbel van de gebruiker -- zichtbaar op de live app.
   Autopilot is een stand van de briefing, niet van een lopend gesprek; zodra
   de landing weg is, gaat hij mee. */
.faro-page__main:has(#faro-landing[hidden]) .cmd-auto { display: none; }
.cmd-auto__dot {
  width: var(--sp-2); height: var(--sp-2); border-radius: var(--r-full);
  background: var(--cmd-ready); flex-shrink: 0;
}
.cmd-auto[aria-pressed="false"] .cmd-auto__dot { background: var(--text-disabled); }
.cmd-auto__text { display: flex; flex-direction: column; text-align: left; }
.cmd-auto__title { font-size: var(--fs-tiny); font-weight: 600; }
.cmd-auto__state { font-size: var(--fs-micro); color: var(--text-muted); }

/* ── Error ────────────────────────────────────────────────────────────────── */
/* [hidden] loses to any display rule, so an element toggled by the attribute
   needs the reset spelled out. Without it this banner sat above a perfectly
   healthy page announcing that the CRM was unreachable. */
.cmd-error[hidden] { display: none; }
.cmd-error {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4);
  padding: var(--sp-5); border: 1px solid var(--cmd-risk); border-radius: var(--r-lg);
  background: var(--cmd-risk-bg);
}
.cmd-error__text { margin: 0; font-size: var(--fs-meta); color: var(--text); }

/* ── Briefing ─────────────────────────────────────────────────────────────── */
.cmd-brief {
  border: 1px solid var(--border); border-radius: var(--r-lg);
  background: var(--bg-card); padding: var(--sp-5);
  margin-bottom: var(--sp-6);
}
.cmd-brief__counts {
  display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-5);
  padding-bottom: var(--sp-4); margin-bottom: var(--sp-4);
  border-bottom: 1px solid var(--border);
}
.cmd-brief__count { display: flex; align-items: baseline; gap: var(--sp-15); }
.cmd-brief__n {
  font-size: var(--fs-lead); font-weight: 600; color: var(--text);
  font-variant-numeric: tabular-nums;
}
.cmd-brief__l { font-size: var(--fs-small); color: var(--text-muted); }
.cmd-brief__label {
  font-size: var(--fs-micro); font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--sand-on-surface);
  margin-bottom: var(--sp-15);
}
.cmd-brief__line { font-size: var(--fs-body); color: var(--text); margin: 0 0 var(--sp-4); }

/* ── KPI strip ────────────────────────────────────────────────────────────── */
.cmd-kpis {
  display: grid; gap: var(--sp-3);
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  margin-bottom: var(--sp-8);
}
.cmd-kpi {
  border: 1px solid var(--border); border-radius: var(--r-lg);
  background: var(--bg-card); padding: var(--sp-4);
}
.cmd-kpi__l {
  font-size: var(--fs-micro); font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--text-muted); margin-bottom: var(--sp-2);
}
.cmd-kpi__v {
  font-size: var(--fs-title); font-weight: 600; letter-spacing: -0.02em;
  color: var(--text); font-variant-numeric: tabular-nums; line-height: 1.1;
}
.cmd-kpi__s { font-size: var(--fs-micro); color: var(--text-muted); margin-top: var(--sp-1); }

/* ── Sections ─────────────────────────────────────────────────────────────── */
.cmd-section { margin-bottom: var(--sp-8); }
.cmd-section__head {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--sp-4); margin-bottom: var(--sp-4);
}
.cmd-section__title {
  font-size: var(--fs-lead); font-weight: 600; letter-spacing: -0.01em;
  color: var(--text); margin: 0;
}

/* ── Opportunity cards ────────────────────────────────────────────────────── */
.cmd-opps { display: flex; flex-direction: column; gap: var(--sp-3); }
.cmd-opp {
  display: grid;
  grid-template-columns: 1px 1fr auto;
  gap: 0 var(--sp-4);
  align-items: stretch;
  border: 1px solid var(--border); border-radius: var(--r-lg);
  background: var(--bg-card);
  overflow: hidden;
  transition: border-color 150ms ease;
}
.cmd-opp:hover { border-color: var(--champagne); }
/* The tone rail is a 1px neutral edge now, the .cmd-opp__cat badge already
   encodes category in colour and label, so the rail doesn't need to repeat it. */
.cmd-opp__rail { background: var(--border-c); }

.cmd-opp__main { padding: var(--sp-4) 0 var(--sp-4) 0; min-width: 0; cursor: pointer; }
.cmd-opp__top { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.cmd-opp__name {
  font-size: var(--fs-body); font-weight: 600; color: var(--text);
  letter-spacing: -0.01em;
}
.cmd-opp__cat {
  display: inline-flex; align-items: center; gap: var(--sp-1);
  font-size: var(--fs-micro); font-weight: 600;
  letter-spacing: 0.04em; text-transform: uppercase;
  padding: var(--sp-05) var(--sp-15); border-radius: var(--r-xs);
}
.cmd-opp[data-tone="hot"]   .cmd-opp__cat { color: var(--cmd-hot);   background: var(--cmd-hot-bg);   }
.cmd-opp[data-tone="ready"] .cmd-opp__cat { color: var(--cmd-ready); background: var(--cmd-ready-bg); }
.cmd-opp[data-tone="risk"]  .cmd-opp__cat { color: var(--cmd-risk);  background: var(--cmd-risk-bg);  }
.cmd-opp[data-tone="value"] .cmd-opp__cat { color: var(--cmd-value); background: var(--cmd-value-bg); }
.cmd-opp[data-tone="cold"]  .cmd-opp__cat { color: var(--cmd-cold);  background: var(--cmd-cold-bg);  }

.cmd-opp__facts {
  display: flex; flex-wrap: wrap; gap: var(--sp-1) var(--sp-3);
  margin-top: var(--sp-15);
  font-size: var(--fs-small); color: var(--text-muted);
  font-variant-numeric: tabular-nums;
}
.cmd-opp__facts b { color: var(--text); font-weight: 600; }
.cmd-opp__why {
  margin-top: var(--sp-2);
  font-size: var(--fs-small); color: var(--text-secondary); line-height: 1.5;
}
.cmd-opp__why span {
  color: var(--sand-on-surface); font-weight: 600;
  text-transform: uppercase; font-size: var(--fs-micro);
  letter-spacing: 0.06em; margin-right: var(--sp-15);
}

.cmd-opp__side {
  display: flex; flex-direction: column; align-items: flex-end; justify-content: center;
  gap: var(--sp-2); padding: var(--sp-4) var(--sp-4) var(--sp-4) 0;
}
/* Opportunity score. Deliberately quiet, it is the sort key, not the headline;
   the reason a lead is here matters more than the arithmetic behind it. */
.cmd-opp__score {
  font-size: var(--fs-micro); color: var(--text-muted);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.cmd-opp__score b { color: var(--text); font-size: var(--fs-small); }

/* ── Buttons ──────────────────────────────────────────────────────────────── */
.cmd-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-15);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-md); border: 1px solid transparent;
  font: inherit; font-size: var(--fs-small); font-weight: 600;
  cursor: pointer; white-space: nowrap;
  background: var(--accent); color: #1A1712;
  transition: filter 150ms ease, border-color 150ms ease;
}
.cmd-btn:hover { filter: brightness(1.06); }
/* Keyboard users get the same affordance mouse users get. :focus-visible so a
   mouse click does not leave a ring behind, which is the reason people remove
   these and end up with nothing. */
.cmd-btn:focus-visible,
.cmd-auto:focus-visible,
.cmd-drawer__close:focus-visible,
.cmd-opp__main:focus-visible {
  outline: 2px solid var(--champagne);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}
.cmd-btn:disabled { opacity: 0.5; cursor: default; }
.cmd-btn--ghost {
  background: transparent; color: var(--text-muted);
  border-color: var(--border);
}
.cmd-btn--ghost:hover { color: var(--text); border-color: var(--champagne); filter: none; }

/* ── Empty + insights ─────────────────────────────────────────────────────── */
.cmd-empty {
  border: 1px dashed var(--border); border-radius: var(--r-lg);
  padding: var(--sp-8) var(--sp-5); text-align: center;
}
.cmd-empty__t { font-size: var(--fs-meta); font-weight: 600; color: var(--text); margin-bottom: var(--sp-15); }
.cmd-empty__s { font-size: var(--fs-small); color: var(--text-muted); max-width: 46ch; margin: 0 auto; }

.cmd-insights { display: flex; flex-direction: column; gap: var(--sp-2); }
.cmd-insight {
  display: flex; gap: var(--sp-3); align-items: flex-start;
  border: 1px solid var(--border); border-radius: var(--r-md);
  background: var(--bg-card); padding: var(--sp-3) var(--sp-4);
}
.cmd-insight__icon { color: var(--sand-on-surface); flex-shrink: 0; margin-top: var(--sp-05); }
.cmd-insight__t { font-size: var(--fs-meta); color: var(--text); }
.cmd-insight__d { font-size: var(--fs-small); color: var(--text-muted); margin-top: var(--sp-05); }

/* ── Drawer ───────────────────────────────────────────────────────────────── */
.cmd-drawer { position: fixed; inset: 0; z-index: 180; }
.cmd-drawer[hidden] { display: none; }
.cmd-drawer__scrim { position: absolute; inset: 0; background: rgba(8, 8, 8, 0.5); }
.cmd-drawer__panel {
  position: absolute; top: 0; right: 0; bottom: 0;
  width: 100%; max-width: 460px;
  display: flex; flex-direction: column;
  background: var(--bg-card); border-left: 1px solid var(--border);
  animation: cmd-slide 180ms ease;
}
@keyframes cmd-slide { from { transform: translateX(var(--sp-6)); opacity: 0; } to { transform: none; opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .cmd-drawer__panel { animation: none; } }

.cmd-drawer__head {
  display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3);
  padding: var(--sp-4) var(--sp-5);
  border-bottom: 1px solid var(--border); flex-shrink: 0;
}
.cmd-drawer__name { font-size: var(--fs-lead); font-weight: 600; color: var(--text); margin: 0; }
.cmd-drawer__close {
  width: var(--sp-8); height: var(--sp-8); flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid transparent; border-radius: var(--r-sm);
  background: transparent; color: var(--text-muted); cursor: pointer;
}
.cmd-drawer__close:hover { color: var(--text); background: var(--bg-card-alt); }
.cmd-drawer__body { flex: 1; overflow-y: auto; padding: var(--sp-5); }

.cmd-dl { display: grid; grid-template-columns: auto 1fr; gap: var(--sp-2) var(--sp-4); margin-bottom: var(--sp-5); }
.cmd-dl dt { font-size: var(--fs-small); color: var(--text-muted); }
.cmd-dl dd { font-size: var(--fs-small); color: var(--text); margin: 0; font-variant-numeric: tabular-nums; }

.cmd-block { margin-bottom: var(--sp-5); }
.cmd-block__t {
  font-size: var(--fs-micro); font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--text-muted); margin-bottom: var(--sp-2);
}
.cmd-block__p { font-size: var(--fs-small); color: var(--text); line-height: 1.6; margin: 0; }

/* Reasoning. Each line is one contribution to the score, in the order it
   contributed, this is the component that decides whether the prioritisation
   reads as trustworthy or arbitrary. */
.cmd-reason { display: flex; gap: var(--sp-3); align-items: baseline; padding: var(--sp-2) 0; border-bottom: 1px solid var(--border); }
.cmd-reason:last-child { border-bottom: 0; }
.cmd-reason__l { font-size: var(--fs-small); font-weight: 600; color: var(--text); flex-shrink: 0; }
.cmd-reason__d { font-size: var(--fs-small); color: var(--text-muted); flex: 1; }
.cmd-reason--neg .cmd-reason__l { color: var(--text-muted); }

.cmd-drawer__actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-5); }

/* ── Responsive ───────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
  /* Opportunities move ABOVE the KPI strip. On a phone the first screen has to
     answer "what do I do now", and five metrics pushing that under the fold is
     precisely the dashboard behaviour this page exists to replace.

     Ordered by explicit class, not :nth-of-type. Every child here is a
     <section>, so .cmd-section:nth-of-type(1) asks for an element that is both
     the first section AND carries that class -- which is the briefing, which
     does not. It matched nothing and the briefing ended up BELOW the list it
     summarises. */
  #cmd-body { display: flex; flex-direction: column; margin-top: var(--sp-6); }
  .cmd-brief             { order: 1; }
  .cmd-section--opps     { order: 2; }
  .cmd-kpis              { order: 3; }
  .cmd-section--insights { order: 4; }

  /* The strip scrolls sideways INSIDE itself rather than shrinking each tile
     to unreadable. The page body still never scrolls horizontally. */
  .cmd-kpis {
    display: flex; overflow-x: auto; gap: var(--sp-2);
    margin-bottom: var(--sp-6);
    scroll-snap-type: x proximity;
    -webkit-overflow-scrolling: touch;
  }
  .cmd-kpi { flex: 0 0 152px; scroll-snap-align: start; }

  /* Autopilot shrinks to its dot and title; the state word is the first thing
     that can go when the header is competing with a rail toggle. */
  .cmd-auto { top: var(--sp-2); right: var(--sp-3); padding: var(--sp-15) var(--sp-2); }
  .cmd-auto__state { display: none; }

  .cmd-opp { grid-template-columns: 1px 1fr; }
  .cmd-opp__side {
    grid-column: 2; align-items: stretch; flex-direction: row-reverse;
    justify-content: flex-end; gap: var(--sp-3);
    padding: 0 var(--sp-4) var(--sp-4);
  }
  .cmd-opp__side .cmd-btn { flex: 1; }
  .cmd-opp__score { align-self: center; }
  .cmd-drawer__panel { max-width: none; top: var(--sp-10); border-radius: var(--r-lg) var(--r-lg) 0 0; border-left: 0; }
}


/* ═══ INTRO (api/_intro.js) ═══ */

/* ═══ Faro-intro, speelt bij elke start, 1,7 s, geluidloos ═══════════════ */
/* Standaard weg, en met een KLASSE aangezet, niet met het hidden-attribuut.

   Dat attribuut werkte hier namelijk niet. De UA-stylesheet zet [hidden] op
   display:none met de laagst mogelijke specificiteit, en een id-selector die
   display:flex zegt wint daar altijd van. Gevolg: de laag stond bij ELKE
   paginalading in beeld en speelde zijn uitgang af, precies het tegenovergestelde
   van "alleen na een verse login". Onzichtbaar in code, meteen zichtbaar zodra
   je de pagina opent.

   Met display:none als grondtoestand kan geen enkele animatie starten voordat
   .fi-aan erbij komt, een element in display:none animeert niet, en begint
   netjes bij frame 0 zodra het wél getoond wordt. Het hidden-attribuut blijft
   staan voor de betekenis, niet voor de opmaak. */
#faro-intro { display: none; }
/* .fi-wacht: de grond staat er al terwijl de clip nog laadt. Zonder deze
   tussenstand stond het dashboard-skelet tot 350 ms in beeld VOOR de intro
   (de laag bleef display:none tot .fi-aan), en dat is precies de flits die de
   eigenaar zag. Zelfde opmaak als .fi-aan, alleen zonder de uitgang. */
#faro-intro.fi-wacht {
  position: fixed;
  inset: 0;
  z-index: 11500;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 30px;
  background: var(--bg);
}
#faro-intro.fi-wacht .fi-stage,
#faro-intro.fi-wacht .fi-word { visibility: hidden; }
#faro-intro.fi-aan {
  position: fixed;
  inset: 0;
  z-index: 11500;             /* boven inlogscherm (1000), dashboard én de welkomwizard (11000); onder de toasts (12000) */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 30px;
  background: var(--bg);
  cursor: pointer;            /* hij is overslaanbaar, dus dat mag je zien */
  animation: fi-out 0.35s cubic-bezier(.4,0,.7,.2) 1.75s forwards;
}
/* Overslaan: dezelfde uitgang, maar nu. */
#faro-intro.fi-skip { animation: fi-out .18s ease forwards; }

.fi-stage {
  position: relative;
  display: grid;
  place-items: center;
  width: 284px;
  height: 284px;
}
/* Elk kind van de stage ligt in dezelfde gridcel, geen absolute positionering
   nodig om ze te stapelen, en dus ook niets dat kan verschuiven. */
.fi-stage > * { grid-area: 1 / 1; }

/* De haarlijn om het portret. Twee dingen tegelijk: hij opent als een iris aan
   het begin, en hij maakt van de uitgevloeide cirkel een bedoelde vorm in
   plaats van een uitsnede, vooral op wit, waar de rand anders zweeft. */
.fi-ring {
  width: 260px;
  height: 260px;
  border: 1px solid var(--accent-c);
  border-radius: 50%;
  opacity: 0;
  animation: fi-ring 0.5s cubic-bezier(.2,.7,.3,1) 0.05s both;
}

/* Finish-fix 4: geen gloed als middel, ook niet in het donkere thema --
   deze staat nu net als de lichte variant hieronder altijd uit. */
.fi-bloom {
  width: 284px;
  height: 284px;
  border-radius: 50%;
  opacity: 0;
  animation: none;
}

/* De kop. Geen slagschaduw: op een uitgevloeide cirkel wordt die modderig.
   Een zachte gloed doet hier wat een schaduw elders doet, hem losmaken van
   de achtergrond. */
.fi-kop {
  width: 220px;
  height: 220px;
  display: block;
  border-radius: 50%;
  object-fit: cover;
  opacity: 0;
  box-shadow: 0 0 0 1px var(--accent-c);   /* finish-fix 4: alleen de haarlijn, geen halo */
  /* De clip beweegt zelf (hij vliegt in en landt), dus hier alleen een
     fade -- een knik bovenop een landing is dubbel. */
  animation: fi-fade-in .28s ease .05s both;
}
@keyframes fi-fade-in { from { opacity: 0; transform: scale(.96); } to { opacity: 1; transform: none; } }
/* Nog niet geladen of 404: verbergen, de bol neemt het over. */
.fi-kop--missing { visibility: hidden; }

/* De vervangende bol. Draait dezelfde track, zodat het bij een ontbrekend
   bestand niet stiller of anders wordt, alleen abstracter. */
.fi-orb {
  width: 180px;
  height: 180px;
  border-radius: 50%;
  background:
    radial-gradient(circle at 34% 30%, var(--accent-ink, #F0E4C8) 0%, var(--accent-c) 34%, var(--accent-deep, #C9AE7C) 72%, #8A7350 100%);
  box-shadow: 0 0 0 1px var(--accent-deep, #C9AE7C);
  opacity: 0;
  animation: fi-kop 1.3s cubic-bezier(.22,.9,.28,1) 0.1s both;
}
/* Zodra de tekening er staat, is de bol overbodig. */
.fi-stage.is-ready .fi-orb { display: none; }

/* Het licht dat over zijn gezicht trekt. Dit is de beat die de kop verdient en
   de hele valk niet had: de veeg loopt precies over de gouden oogranden en de
   snavel, en dat leest als een blik die oplicht.

   Alleen mét bestand: de maskering leunt op diezelfde webp, dus zonder
   tekening zou dit een rechthoek zijn. Vandaar de .is-ready-poort. */
.fi-sheen { display: none; }
/* Finish-fix 4: de lichtveeg (shine) speelt niet meer -- .fi-sheen blijft
   op display:none staan, ook wanneer de tekening klaar is. */
.fi-stage.is-ready .fi-sheen {
  width: 220px;
  height: 220px;
  opacity: 0;
}

.fi-word {
  font-family: var(--font-head, 'Space Grotesk', sans-serif);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--text-muted-c, #B5B5B5);
  opacity: 0;
  margin: 0;
  animation: fi-word 0.55s cubic-bezier(.2,.7,.3,1) 1s both;
}
.fi-word b { color: var(--accent-ink, #F0E4C8); font-weight: 600; }
/* Sand als TÉKST mag alleen op donker (de contrastregel bij --accent-ink).
   Op wit wordt het de diepere tint, die daar wel leesbaar is. */
[data-theme="light"] .fi-word b { color: var(--accent-pressed-c, #C9AE7C); }
/* Op een witte grond doet een warme gloed niets, en dan valt de zwarte rand
   van het portret juist op. Daar dus een zachte schaduw in plaats van gloed. */
[data-theme="light"] .fi-bloom { opacity: 0; animation: none; }
[data-theme="light"] .fi-ring  { border-color: var(--accent-pressed-c, #C9AE7C); }
[data-theme="light"] .fi-kop   { filter: drop-shadow(0 10px 26px rgba(18,18,18,.20)); }

@keyframes fi-ring {
  0%   { opacity: 0;   transform: scale(.42); }
  45%  { opacity: .5; }
  100% { opacity: 0;   transform: scale(1.10); }
}
@keyframes fi-bloom {
  0%   { opacity: 0; transform: scale(.6); }
  40%  { opacity: 1; }
  100% { opacity: 0; transform: scale(1.55); }
}
@keyframes fi-sheen {
  0%   { opacity: 0; transform: translateX(-70%); }
  35%  { opacity: .55; }
  100% { opacity: 0; transform: translateX(70%); }
}
/* Eén spoor voor drie dingen, want twee animaties op dezelfde transform vechten
   om dezelfde eigenschap en de laatste wint meteen:
     0-34%   indraaien, hij komt scherp en draait naar je toe (rotate -3° → 0)
     34-58%  stilstaan, even niets, anders leest het als onrust
     58-86%  de knik, één keer zakken en terug: hij ziet je
     86-100% uitrollen, laatste rest van de knik dempt uit
   Een knik van 7 px op 200 px is klein op papier en groot genoeg in beeld. */
@keyframes fi-kop {
  0%   { opacity: 0; transform: scale(.80) rotate(-3deg); }
  34%  { opacity: 1; transform: scale(1.03) rotate(0deg); }
  46%  { opacity: 1; transform: scale(1) rotate(0deg) translateY(0); }
  58%  { opacity: 1; transform: scale(1) rotate(0deg) translateY(0); }
  72%  { opacity: 1; transform: scale(1.005) rotate(.6deg) translateY(7px); }
  86%  { opacity: 1; transform: scale(1) rotate(0deg) translateY(-2px); }
  100% { opacity: 1; transform: scale(1) rotate(0deg) translateY(0); }
}
@keyframes fi-word {
  0%   { opacity: 0; transform: translateY(9px); }
  100% { opacity: 1; transform: translateY(0); }
}
@keyframes fi-out {
  0%   { opacity: 1; transform: scale(1); }
  100% { opacity: 0; transform: scale(1.045); visibility: hidden; }
}

/* Kleine schermen: 200 px kop naast 30 px marge wordt benauwd onder ~380 px. */
@media (max-width: 380px) {
  .fi-stage { width: 208px; height: 208px; }
  .fi-kop   { width: 158px; height: 158px; }
  .fi-ring  { width: 190px; height: 190px; }
  .fi-bloom { width: 208px; height: 208px; }
  .fi-stage.is-ready .fi-sheen { width: 158px; height: 158px; }
  .fi-orb   { width: 124px; height: 124px; }
}

/* ── Minder beweging ───────────────────────────────────────────────────────
   Geen indraaien, geen knik, geen veeg. Wel een korte, rustige overgang: het
   scherm wisselt nog steeds zichtbaar, alleen zonder dat er iets beweegt.
   Ook korter, want zonder beweging is twee seconden alleen maar wachten. */
@media (prefers-reduced-motion: reduce) {
  #faro-intro.fi-aan { animation: fi-out .35s ease .75s forwards; }
  .fi-kop, .fi-orb  { animation: fi-fade .3s ease .05s both; }
  .fi-word          { animation: fi-fade .3s ease .3s both; }
  .fi-ring, .fi-bloom, .fi-stage.is-ready .fi-sheen { animation: none; opacity: 0; }
  @keyframes fi-fade { from { opacity: 0; } to { opacity: 1; } }
}

