/* ==========================================================================
   Arctic CRM — ontwerpsysteem
   Rustig, strak en met materiaal: matglas voor de dragende vlakken (zijbalk,
   bovenbalk, kerncijfers), haarlijnen in plaats van zware randen, en veel wit.
   Alle kleuren komen uit variabelen; de accentkleur wordt door de app op <body>
   gezet vanuit Instellingen → Huisstijl.
   ========================================================================== */

:root {
    /* Vlakken */
    --canvas: #f2f3f6;
    --surface: #ffffff;
    --surface-2: #f7f8fa;

    /* Tekst */
    --text: #14181f;
    --text-2: #495260;
    --muted: #767d89;

    /* Lijnen & diepte */
    --hairline: rgba(20, 24, 31, .09);
    --hairline-strong: rgba(20, 24, 31, .16);
    --shadow-sm: 0 1px 2px rgba(16, 24, 40, .04), 0 1px 3px rgba(16, 24, 40, .06);
    --shadow-md: 0 4px 12px rgba(16, 24, 40, .06), 0 2px 4px rgba(16, 24, 40, .04);
    --shadow-lg: 0 18px 40px rgba(12, 24, 45, .12);

    /* Accent (wordt overschreven vanuit de huisstijl-instellingen) */
    --primary: #2b5ce6;
    --primary-soft: rgba(43, 92, 230, .10);

    /* Signaalkleuren */
    --danger: #c0392b;
    --danger-soft: #fdecea;
    --success: #1e8f57;
    --success-soft: #e7f6ee;
    --warning: #b26a00;

    /* Donkere zijbalk */
    --sidebar-a: #101a2c;
    --sidebar-b: #16233b;
    --sidebar-text: rgba(255, 255, 255, .72);

    --radius: 14px;
    --radius-sm: 10px;
    --radius-pill: 980px;

    /* De standaard paginabreedte: elke gewone adminpagina (facturen, offertes, klanten,
       creditnota's, …) rendert in .content en deelt deze bovengrens. Eén knop, zodat de
       breedte overal gelijk loopt (kassa en reparatie-ticket zijn fullscreen en vallen
       hier buiten -- die hebben hun eigen layout). */
    --content-max: 1500px;
}

* { box-sizing: border-box; }

body {
    margin: 0;
    font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text",
                 "Segoe UI", Inter, system-ui, sans-serif;
    font-size: 14.5px;
    line-height: 1.55;
    color: var(--text);
    background: var(--canvas);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

a { color: var(--primary); text-decoration: none; }
a:hover { text-decoration: underline; }

h1, h2, h3 { letter-spacing: -.017em; font-weight: 600; }
h1 { font-size: 1.55rem; margin: 0 0 .4rem; }
h2 { font-size: 1.02rem; margin: 0 0 .9rem; }

.muted { color: var(--muted); }
.small { font-size: .82rem; }

/* Bedragen en aantallen uitlijnen op cijferbreedte */
.num, .stat__value, td.num, th.num {
    font-variant-numeric: tabular-nums;
    font-feature-settings: "tnum" 1;
}

/* ── Layout ────────────────────────────────────────────────────────────── */
.layout { display: flex; min-height: 100vh; }

.sidebar {
    width: 248px; flex-shrink: 0;
    /* Vast aan het scherm, niet aan de paginahoogte. Met position:sticky liet de balk
       los zodra er iets onder .layout de pagina langer maakte dan de zijbalk (bijv. de
       absoluut-gepositioneerde feedback-pinnen op een factuurpagina): de sticky-grens
       ligt bij de onderkant van .layout, en daaronder scrolde de balk mee weg. Fixed is
       immuun voor wat de pagina ook langer maakt. .main schuift ernaast (margin-left). */
    position: fixed; top: 0; left: 0; bottom: 0;
    overflow-y: auto; overscroll-behavior: contain;
    display: flex; flex-direction: column;
    padding: .8rem .7rem .9rem;
    color: var(--sidebar-text);
    /* Egale, diepe kleur in plaats van een flauw verloop: geeft de kolom een
       duidelijke rand en laat de accentkleur het werk doen. */
    background: var(--sidebar-a);
    box-shadow: inset -1px 0 0 rgba(255, 255, 255, .07);
    scrollbar-width: thin;
    scrollbar-color: rgba(255, 255, 255, .18) transparent;
}
.sidebar::-webkit-scrollbar { width: 8px; }
.sidebar::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, .16); border-radius: 8px; }

/* ── Inklapbare zijbalk: alleen de pictogrammen ────────────────────────────
   De knop staat onderaan (margin-top:auto). Ingeklapt versmalt de balk en
   verdwijnen de labels + groepskoppen, zodat een lange lijst weer past. De
   keuze wordt per browser onthouden (zie admin.twig). */
.sidebar-toggle {
    position: sticky; bottom: 0; margin-top: auto;
    display: flex; align-items: center; gap: .6rem;
    padding: .6rem .7rem; border: 0; border-top: 1px solid rgba(255, 255, 255, .08);
    background: var(--sidebar-a); color: var(--sidebar-text);
    font: inherit; font-size: .85rem; cursor: pointer;
    transition: color .14s ease;
}
.sidebar-toggle:hover { color: #fff; }
.sidebar-toggle svg { flex: 0 0 auto; transition: transform .18s ease; }

/* Ingeklapt: overflow zichtbaar en een hogere z-index, zodat de snelle tooltip (zie
   verderop) rechts naast het icoon buiten de smalle balk mag uitsteken en boven de
   pagina-inhoud komt te liggen. */
.sidebar.is-ingeklapt { width: 66px; overflow: visible; z-index: 30; }
.sidebar.is-ingeklapt .brand { justify-content: center; padding-left: 0; padding-right: 0; }
/* Ingeklapt is er geen ruimte voor het volledige logo of de naam: toon het merkteken. */
.sidebar.is-ingeklapt .brand__logo,
.sidebar.is-ingeklapt .brand__name { display: none; }
.sidebar.is-ingeklapt .brand__mark { display: grid; place-items: center; }
.sidebar.is-ingeklapt .nav__group { display: none; }
/* Icoonmodus: een groep kan hier niet in- of uitgeklapt worden (de kop is verborgen),
   dus tonen we alle items -- ook die van een dichte groep -- zodat elk pictogram
   bereikbaar blijft. */
.sidebar.is-ingeklapt .nav__groep.is-dicht .nav__items { display: flex; }
.sidebar.is-ingeklapt .nav__item { justify-content: center; padding-left: 0; padding-right: 0; gap: 0; }
.sidebar.is-ingeklapt .nav__item > span { display: none; }
.sidebar.is-ingeklapt .nav__item.is-active::before { display: none; }
.sidebar.is-ingeklapt .sidebar-toggle { justify-content: center; padding-left: 0; padding-right: 0; }
.sidebar.is-ingeklapt .sidebar-toggle__tekst { display: none; }
.sidebar.is-ingeklapt .sidebar-toggle svg { transform: rotate(180deg); }

/* ── Snelle tooltip bij de ingeklapte zijbalk ──────────────────────────────────
   Ingeklapt zie je alleen de pictogrammen; het label komt dan als eigen tooltip
   meteen in beeld. De trage native title-tooltip (~1s) is bewust weg: het label
   staat nu in aria-label (voor schermlezers) en die tekst gebruiken we hier ook.
   Alleen ingeklapt, rechts van het icoon, boven de rest en niet-klikbaar. */
.sidebar.is-ingeklapt .nav__item::after {
    content: attr(aria-label);
    position: absolute; left: calc(100% + 12px); top: 50%; transform: translateY(-50%);
    z-index: 50;
    padding: .3rem .55rem; border-radius: var(--radius-sm);
    background: #0b1220; color: #fff;
    font-size: .8rem; font-weight: 500; line-height: 1.2; white-space: nowrap;
    box-shadow: var(--shadow-lg);
    opacity: 0; pointer-events: none; transition: opacity .09s ease;
}
.sidebar.is-ingeklapt .nav__item:hover::after,
.sidebar.is-ingeklapt .nav__item:focus-visible::after { opacity: 1; }

.main { flex: 1; display: flex; flex-direction: column; min-width: 0; position: relative; margin-left: 248px; }
/* Volgt de ingeklapte zijbalk: die is 66px, dus schuift .main net zo ver mee terug. */
.layout:has(.sidebar.is-ingeklapt) .main { margin-left: 66px; }

.topbar, .content { position: relative; z-index: 1; }

/* Merk: logo + naam uit de huisstijl-instellingen */
.brand {
    display: flex; align-items: center; gap: .6rem;
    padding: .3rem .5rem .9rem;
    color: #fff; font-weight: 600; font-size: 1.02rem; letter-spacing: -.01em;
}
/* Vaste hoogte, breedte schaalt mee en wordt begrensd door de zijbalk (244px
   min padding). Zo blijft élk aangeleverd logo netjes en onvervormd. */
.brand__logo {
    display: block; height: 36px; width: auto;
    max-width: 200px; object-fit: contain; object-position: left center;
}
.brand__name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Het merkteken (favicon): standaard verborgen; alleen zichtbaar als de zijbalk is
   ingeklapt (zie de is-ingeklapt-regel hierboven). Vierkant en klein, past in 66px.
   Zonder geüpload merkteken is het een gekleurd vierkantje met de beginletter. */
.brand__mark {
    display: none; flex: 0 0 auto;
    width: 34px; height: 34px; border-radius: 9px; object-fit: contain;
}
.brand__mark--letter {
    background: rgba(255, 255, 255, .14); color: #fff;
    font-weight: 700; font-size: 1rem; line-height: 1;
}
.brand--center { justify-content: center; padding-bottom: 0; }

.nav { display: flex; flex-direction: column; gap: 2px; }

/* Kop boven een groep items: houdt een lange lijst leesbaar. Nu een echte knop,
   want klikken vouwt de groep open of dicht (zie .nav__groep hieronder). De
   typografie blijft gelijk aan de oude kop; alleen de knop-chrome halen we eraf. */
.nav__group {
    display: flex; align-items: center; gap: .4rem;
    width: 100%; margin: .6rem 0 .2rem; padding: .15rem .75rem;
    background: none; border: 0; border-radius: var(--radius-sm);
    font-family: inherit; font-size: .66rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: .11em; text-align: left;
    color: rgba(255, 255, 255, .5); cursor: pointer;
}
.nav__group:hover { color: rgba(255, 255, 255, .82); background: rgba(255, 255, 255, .04); }
.nav__group:focus-visible { outline: 2px solid rgba(255, 255, 255, .45); outline-offset: 1px; }
.nav__group-tekst { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* De caret rechts in de kop: wijst omlaag als de groep open is, naar rechts als hij
   dicht is. */
.nav__caret { flex: 0 0 auto; opacity: .7; transition: transform .16s ease; }

/* Een inklapbare groep is de kop plus zijn items. */
.nav__groep { display: flex; flex-direction: column; }
.nav__items { display: flex; flex-direction: column; gap: 2px; }
.nav__groep.is-dicht .nav__items { display: none; }
.nav__groep.is-dicht .nav__caret { transform: rotate(-90deg); }

/* Rustige regels: alleen tekst en pictogram. De doorzichtige rand houdt de breedte
   gelijk aan het actieve item, dat er wél een echte rand omheen krijgt. */
.nav__item {
    position: relative;
    display: flex; align-items: center; gap: .65rem;
    padding: .38rem .7rem; border-radius: var(--radius-sm);
    border: 1px solid transparent;
    color: var(--sidebar-text); text-decoration: none;
    font-size: .91rem; font-weight: 450;
    transition: background-color .14s ease, color .14s ease;
}
.nav__icon { flex: 0 0 20px; opacity: .62; transition: opacity .14s ease; }
.nav__item:hover { background: rgba(255, 255, 255, .06); color: #fff; text-decoration: none; }
.nav__item:hover .nav__icon { opacity: .9; }

/* Alleen waar je staat krijgt matglas: een opgetild vlak in de accentkleur, met
   een lichte rand en een glans langs de bovenrand. Eén element dat eruit springt
   wijst beter de weg dan vijftien die allemaal om aandacht vragen. */
.nav__item.is-active {
    background: color-mix(in srgb, var(--primary) 42%, rgba(255, 255, 255, .10));
    border-color: color-mix(in srgb, var(--primary) 26%, rgba(255, 255, 255, .34));
    color: #fff; font-weight: 550;
    box-shadow: 0 6px 18px rgba(4, 10, 24, .35),
                inset 0 1px 0 rgba(255, 255, 255, .3);
    -webkit-backdrop-filter: saturate(1.6) blur(12px);
    backdrop-filter: saturate(1.6) blur(12px);
}
.nav__item.is-active .nav__icon { opacity: 1; }
.nav__item.is-active::before {
    content: ""; position: absolute; left: -.7rem; top: 50%; transform: translateY(-50%);
    width: 3px; height: 20px; border-radius: 0 3px 3px 0; background: #fff;
}

/* Bovenbalk: egaal, blijft staan bij scrollen. Matglas heeft hier geen zin —
   wat erachter langs schuift is toch bijna wit. */
.topbar {
    position: sticky; top: 0; z-index: 20;
    display: flex; align-items: center; gap: 1rem;
    padding: .7rem 1.6rem;
    background: var(--surface);
    border-bottom: 1px solid var(--hairline);
}
.page-title { font-weight: 600; letter-spacing: -.01em; }
.user-menu { display: flex; align-items: center; gap: .9rem; margin-left: auto; color: var(--muted); font-size: .9rem; }
.user-name { font-weight: 500; color: var(--text-2); }
/* Naam + foto samen één klikbare link naar het eigen profiel. */
.profiel-knop {
    display: inline-flex; align-items: center; gap: .5rem;
    padding: .25rem .5rem .25rem .3rem; border-radius: 999px;
    text-decoration: none; transition: background .15s ease;
}
.profiel-knop:hover { background: var(--hairline); }
.profiel-knop:hover .user-name { color: var(--text); }
.profiel-knop .avatar { flex: 0 0 auto; }
.inline-form { display: inline; }

/* Uren-knop in de bovenbalk (module Urenregistratie). Zelfde maat en gedrag als het
   belletje ernaast; de stip verschijnt zodra er voor de gebruiker een timer loopt. De
   stijl staat bewust in app.css (altijd geladen) en niet in een module-bestand, want
   de knop zelf komt al via een 'ignore missing'-partial mee of niet. */
.uren-knop {
    position: relative;
    display: inline-flex; align-items: center; justify-content: center;
    width: 34px; height: 34px; border-radius: var(--radius-pill);
    color: var(--text-2); text-decoration: none;
}
.uren-knop:hover, .uren-knop:focus-visible { background: var(--surface-2); color: var(--text); }
.uren-knop .nav__icon { flex: 0 0 20px; opacity: 1; }
/* De stip met een ringetje in de balkkleur, zodat hij loskomt van het pictogram. */
.uren-knop__stip {
    position: absolute; top: 3px; right: 3px;
    width: 9px; height: 9px; border-radius: 50%;
    background: var(--success); box-shadow: 0 0 0 2px var(--surface);
}

/* Extra lucht onderaan: rechtsonder zweeft de feedbackknop, en die dekte anders af
   wat daar toevallig eindigde — op het factuurformulier precies het totalenblok. Deze
   ruimte zorgt dat je altijd langs de knop heen kunt scrollen. */
.content { padding: 1.6rem 1.6rem 5.5rem; max-width: var(--content-max); width: 100%; }

/* ── Globaal zoeken ────────────────────────────────────────────────────── */
.topsearch { flex: 0 1 340px; margin-left: 1.5rem; }
.topsearch__input {
    width: 100%; padding: .45rem .8rem;
    background: var(--surface-2); border: 1px solid transparent; border-radius: var(--radius-pill);
    font: inherit; font-size: .9rem; color: var(--text);
    transition: background-color .15s ease, border-color .15s ease, box-shadow .15s ease;
}
.topsearch__input::placeholder { color: var(--muted); }
.topsearch__input:focus {
    outline: none; background: var(--surface);
    border-color: var(--hairline-strong);
    box-shadow: 0 0 0 4px var(--primary-soft);
}

/* ── Panelen & kaarten ─────────────────────────────────────────────────── */
/* Egaal wit met een haarlijn. Matglas werkt alleen als er iets áchter zit om te
   vervagen; op een bijna witte pagina levert het alleen vaagheid op. De scheiding
   komt hier van de rand en een lichte schaduw. */
.panel {
    background: var(--surface);
    border: 1px solid var(--hairline);
    box-shadow: var(--shadow-sm);
    border-radius: var(--radius);
    padding: 1.35rem;
    margin-bottom: 1.1rem;
}
.cards-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 1.1rem; margin-bottom: 1.1rem; }

.page-head {
    display: flex; align-items: center; justify-content: space-between;
    gap: 1rem; margin-bottom: 1.1rem;
}
.page-head__title { display: flex; align-items: center; gap: .6rem; flex-wrap: wrap; }

/* ── Hero: zachte merkachtergrond waar de glazen kaarten op rusten ─────── */
.hero {
    position: relative; isolation: isolate;
    margin: -.4rem -.4rem 1.2rem;
    padding: 1.5rem 1.6rem 1.7rem;
    border-radius: 22px;
    overflow: hidden;
    background: linear-gradient(150deg, #16233b 0%, #1d3557 45%, #24507e 100%);
    box-shadow: var(--shadow-lg);
}
/* Het berglandschap ligt er heel subtiel onder, zodat het glas iets te tonen heeft. */
.hero::before {
    content: ""; position: absolute; inset: 0; z-index: -1;
    background-image: var(--hero-image); background-size: cover; background-position: center 65%;
    opacity: .34;
}
.hero::after {
    content: ""; position: absolute; inset: 0; z-index: -1;
    background: linear-gradient(180deg, rgba(12, 24, 45, .30) 0%, rgba(12, 24, 45, .72) 100%);
}
.hero__intro h1 { color: #fff; margin: 0 0 .1rem; font-size: 1.6rem; }
.hero__date { margin: 0; color: rgba(255, 255, 255, .68); font-size: .9rem; }
.hero .stat-grid { margin: 1.3rem 0 0; }

/* Binnen de hero zijn de kaarten écht van glas */
.hero .stat {
    background: linear-gradient(rgba(255, 255, 255, .16), rgba(255, 255, 255, .07));
    border-color: rgba(255, 255, 255, .18);
    color: #fff;
    box-shadow: 0 8px 26px rgba(5, 19, 34, .18);
}
.hero .stat__label { color: rgba(255, 255, 255, .68); }
.hero .stat__sub { color: rgba(255, 255, 255, .62); }
.hero a.stat:hover { background: linear-gradient(rgba(255, 255, 255, .22), rgba(255, 255, 255, .10)); }
.hero .stat--alert { border-color: rgba(255, 168, 160, .55); }
.hero .stat--alert .stat__value { color: #ffcfc9; }

/* ── Kerncijfers: matglas op een subtiel verloop ───────────────────────── */
.stat-grid {
    display: grid; grid-template-columns: repeat(auto-fit, minmax(178px, 1fr));
    gap: .75rem; margin: 1.1rem 0;
}
/* Bewust wat compacter dan eerst (feedback: "deze blokken mogen kleiner"): minder
   padding en een kleiner bedrag, zodat er meer naast elkaar past zonder dat de cijfers
   onleesbaar worden. Gedeeld component, dus dit werkt op alle lijstpagina's door. */
.stat {
    display: flex; flex-direction: column; gap: .15rem;
    padding: .85rem 1rem;
    border-radius: var(--radius);
    background: var(--surface);
    border: 1px solid var(--hairline);
    box-shadow: var(--shadow-sm);
    text-decoration: none; color: var(--text);
    transition: transform .16s cubic-bezier(.2, .7, .3, 1), box-shadow .16s ease;
}
a.stat:hover { text-decoration: none; transform: translateY(-2px); box-shadow: var(--shadow-md); }
.stat__label {
    font-size: .74rem; font-weight: 600; letter-spacing: .045em; text-transform: uppercase;
    color: var(--muted);
}
.stat__value { font-size: 1.4rem; font-weight: 600; letter-spacing: -.022em; }
.stat__sub { font-size: .82rem; color: var(--muted); }
.stat--alert { border-color: rgba(192, 57, 43, .28); }
.stat--alert .stat__value { color: var(--danger); }

/* ── Snelkoppelingen: glazen tegels op de huisstijl-achtergrond ────────── */
.quick-nav {
    margin-top: 1.4rem; padding: 1.4rem;
    border-radius: 20px;
    background-size: cover; background-position: center;
    box-shadow: var(--shadow-lg);
}
.quick-nav__title {
    margin: 0 0 .2rem; font-size: .74rem; font-weight: 600;
    text-transform: uppercase; letter-spacing: .09em;
    color: rgba(255, 255, 255, .62);
}
.tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(172px, 1fr)); gap: .8rem; margin-top: 1rem; }
.tile {
    padding: 1.05rem 1.15rem;
    border-radius: var(--radius);
    background-color: rgba(18, 30, 52, .40);
    background-image: linear-gradient(rgba(255, 255, 255, .12), rgba(255, 255, 255, .04));
    -webkit-backdrop-filter: blur(16px) saturate(1.3);
    backdrop-filter: blur(16px) saturate(1.3);
    border: .8px solid rgba(255, 255, 255, .16);
    box-shadow: 0 8px 24px rgba(5, 19, 34, .16);
    color: #fff; text-decoration: none;
    transition: transform .16s cubic-bezier(.2, .7, .3, 1), border-color .16s ease, background-color .16s ease;
}
.tile:hover {
    text-decoration: none; transform: translateY(-2px);
    border-color: rgba(255, 255, 255, .3);
    background-color: rgba(18, 30, 52, .5);
}
.tile__label { font-weight: 550; font-size: .95rem; }

/* ── Formulieren ───────────────────────────────────────────────────────── */
.form, .field { display: block; }
.field { margin-bottom: .95rem; }
.field > span { display: block; font-size: .82rem; color: var(--text-2); margin-bottom: .3rem; font-weight: 500; }
.field-row { display: flex; gap: .9rem; flex-wrap: wrap; }
.field-row .field { flex: 1; min-width: 140px; }
.field--grow { flex: 2; }
.field--small { flex: 0 0 110px; }
.field-error { display: block; color: var(--danger); font-size: .8rem; font-style: normal; margin-top: .25rem; }
.form--narrow { max-width: 620px; }
.form--wide { max-width: 820px; }
.form-actions { display: flex; gap: .6rem; margin-top: 1.4rem; }

/* ── Documentformulier (factuur, offerte) ──────────────────────────────────
   Een document met een regeltabel is geen invulformulier maar een werkblad: de
   tabel heeft zes kolommen plus een keuzelijst per regel en past niet in de
   820px van .form--wide (die blijft ongemoeid, elders in gebruik). Vandaar een
   eigen, veel bredere variant. De bovengrens houdt de leesregels van de
   kopvelden hanteerbaar op een zeer breed scherm.

   De opbouw volgt het patroon dat boekhoudpakketten hanteren: kopgegevens in
   twee kolommen naast elkaar, daaronder de regels over de volle breedte. */
.form--document { max-width: var(--content-max); }
.form__kop {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 0 2rem;
    align-items: start;
}
/* Onder deze breedte is twee kolommen naast elkaar smaller dan één leesbare
   kolom; dan vallen de blokken onder elkaar. */
@media (max-width: 900px) {
    .form__kop { grid-template-columns: minmax(0, 1fr); gap: 0; }
}
.form__kop-blok { min-width: 0; }
.form__kop-titel {
    font-size: .82rem; font-weight: 600; letter-spacing: .02em;
    text-transform: uppercase; color: var(--text-2);
    margin: 0 0 .7rem;
}
.form__regels { margin-top: 1.6rem; }
/* De regeltabel gebruikt de volle breedte; de tekstkolommen rekken mee en de
   getalkolommen blijven zo smal als hun inhoud. */
.form__regels .table { width: 100%; table-layout: auto; }
.form__regels .table td { vertical-align: top; }
.regel__product { margin-bottom: .35rem; }
/* In een tabelcel moeten de getalvelden zich naar hun kolom voegen in plaats van
   de width:100% van een gewoon formulierveld te erven. */
.form__regels .table td input[type=text],
.form__regels .table td select { width: 100%; min-width: 0; }
/* .row-actions is elders een flexrij, maar op een <td> haalt display:flex de cel
   uit de tabelopmaak: de tabel rekent haar breedte dan zonder die kolom en de
   rijscheiding stopt te vroeg. Binnen de regeltabel blijft het dus een gewone cel. */
.form__regels .table td.row-actions { display: table-cell; text-align: right; }
.col--getal { width: 7rem; }
.col--smal { width: 6rem; }
/* Ruim genoeg voor "21% (hoog)" plus het uitklappijltje van de browser. */
.col--btw { width: 10rem; }
.col--acties { width: 7rem; }

input[type=text], input[type=email], input[type=password], input[type=number],
input[type=date], input[type=datetime-local], input[type=search], input[type=color],
select, textarea {
    width: 100%; padding: .55rem .75rem;
    background: var(--surface);
    border: 1px solid var(--hairline-strong);
    border-radius: var(--radius-sm);
    font: inherit; font-size: .93rem; color: var(--text);
    transition: border-color .15s ease, box-shadow .15s ease;
}
input:focus, select:focus, textarea:focus {
    outline: none; border-color: var(--primary);
    box-shadow: 0 0 0 4px var(--primary-soft);
}
input:disabled, select:disabled, textarea:disabled { background: var(--surface-2); color: var(--muted); }
textarea { resize: vertical; }

/* Label met een actie ernaast, bijv. "Klant  + Nieuwe klant" */
.field__label {
    display: flex; align-items: baseline; justify-content: space-between; gap: .75rem;
    font-size: .82rem; color: var(--text-2); margin-bottom: .3rem; font-weight: 500;
}

.check { display: flex; align-items: center; gap: .5rem; margin: .9rem 0; font-size: .93rem; }
.check input { width: auto; }
.toolbar { display: flex; align-items: center; gap: .6rem; margin-bottom: 1.1rem; flex-wrap: wrap; }
.toolbar input[type=search] { max-width: 300px; }

/* In een filterbalk sturen de velden zich naar hun inhoud. Zonder dit erven ze de
   width:100% van een gewoon formulierveld, en springt elk filter op een eigen regel:
   op een breed scherm krijg je dan een kolom van balken over de volle breedte in
   plaats van een balk. */
/* Onderdelen die samen één gedachte vormen (twee vinkjes plus hun knop) breken als
   één geheel af in plaats van los van elkaar. */
.toolbar__groep { display: inline-flex; align-items: center; gap: .6rem; flex: 0 0 auto; }

.toolbar select,
.toolbar input[type=text],
.toolbar input[type=date],
.toolbar input[type=number],
.toolbar .picker {
    width: auto;
    min-width: 170px;
    flex: 0 1 auto;
}

/* ── Knoppen ───────────────────────────────────────────────────────────── */
.btn {
    display: inline-flex; align-items: center; justify-content: center;
    padding: .5rem .95rem; border-radius: var(--radius-sm);
    border: 1px solid var(--hairline-strong);
    background: var(--surface); color: var(--text);
    font: inherit; font-size: .9rem; font-weight: 500;
    cursor: pointer; text-decoration: none; white-space: nowrap;
    transition: background-color .14s ease, border-color .14s ease, transform .1s ease;
}
.btn:hover { text-decoration: none; background: var(--surface-2); }
.btn:active { transform: scale(.985); }
.btn-primary {
    background: var(--primary); border-color: transparent; color: #fff;
    box-shadow: 0 1px 2px rgba(16, 24, 40, .12);
}
.btn-primary:hover { background: var(--primary); filter: brightness(1.07); }
/* Onomkeerbare acties: rood van tekst en rand, maar niet gevuld — het is een
   uitweg, geen hoofdactie, en mag dus niet om aandacht schreeuwen. */
.btn-danger { color: var(--danger); border-color: rgba(192, 57, 43, .28); }
.btn-danger:hover { background: var(--danger-soft); border-color: rgba(192, 57, 43, .45); }
.btn-block { width: 100%; }
.btn-link {
    background: none; border: 0; padding: 0;
    color: var(--primary); font: inherit; font-size: .89rem; cursor: pointer;
}
.btn-link:hover { text-decoration: underline; }
.row-actions { display: flex; gap: .8rem; align-items: center; white-space: nowrap; }

/* ── Kleine, herbruikbare hulpjes (globaal, zodat er geen losse CSS per pagina nodig is) ── */
.nowrap { white-space: nowrap; }
/* Een inhouds-thumbnail (bijv. een productafbeelding), begrensd en met de standaardronding. */
.thumb { display: block; max-width: 220px; height: auto; border-radius: var(--radius-sm); }
/* Boomweergave: inspringing per diepte via een variabele --diepte, zodat de OPMAAK globaal
   blijft en alleen de (dynamische) waarde inline staat. */
.boom-node { margin-left: calc(var(--diepte, 0) * 1.6rem); }
/* Paginering onder een tabel: info links, knoppen rechts. */
.pager { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 1rem; flex-wrap: wrap; }

/* ── Meldingen ─────────────────────────────────────────────────────────── */
/* Melding met een pictogram links en een kruisje rechts. Het pictogram zegt of het
   goed of mis ging zonder dat je de kleur hoeft te kunnen zien; het kruisje geeft je
   de kans hem weg te halen in plaats van eromheen te lezen. */
.flash {
    display: flex; align-items: flex-start; gap: .6rem;
    padding: .75rem 1rem; border-radius: var(--radius);
    margin: 1rem 0; font-size: .92rem;
    border: 1px solid transparent;
    box-shadow: var(--shadow-sm);
}
/* Een leeg meldingsvak dat pas door JavaScript gevuld wordt, staat als [hidden] in de
   HTML. Zonder deze regel wint de display:flex hierboven van de browser-standaard en zie
   je een lege rode balk (o.a. in het taak-popupformulier). Geldt overal. */
.flash[hidden] { display: none !important; }
/* In de adminlayout staat de melding tussen de bovenbalk en .content en zou hij
   anders vlak tegen de balk plakken en tot de rand doorlopen. Deze regel geeft hem
   lucht aan de bovenkant en lijnt hem uit met de padding van .content. Alleen daar:
   op het inlogscherm zit de melding in een kaart en hoort dit niet. */
.main > .flash { margin: 1.2rem 1.6rem 0; }
.flash__teken { flex: 0 0 auto; display: flex; margin-top: .05rem; }
.flash__tekst { flex: 1 1 auto; min-width: 0; }
.flash__sluit {
    flex: 0 0 auto;
    margin: -.15rem -.35rem 0 .4rem; padding: 0 .35rem;
    border: 0; background: none; cursor: pointer;
    color: inherit; opacity: .55;
    font: inherit; font-size: 1.25rem; line-height: 1.2;
    border-radius: var(--radius-sm);
}
.flash__sluit:hover { opacity: 1; background: rgba(20, 24, 31, .08); }
.flash--error { background: var(--danger-soft); color: var(--danger); border-color: rgba(192, 57, 43, .22); }
.flash--success { background: var(--success-soft); color: var(--success); border-color: rgba(30, 143, 87, .22); }
.flash--info { background: var(--primary-soft); color: var(--primary); border-color: color-mix(in srgb, var(--primary) 22%, transparent); }

/* ── Tabellen ──────────────────────────────────────────────────────────── */
.table-wrap { overflow-x: auto; border-radius: var(--radius); }
.table {
    width: 100%; border-collapse: separate; border-spacing: 0;
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, .68);
    border-radius: var(--radius);
    overflow: hidden;
    font-size: .92rem;
}
/* Binnen een paneel staat de tabel al op glas: dan geen tweede laag. */
.panel .table { background: transparent; -webkit-backdrop-filter: none; backdrop-filter: none; border-color: var(--hairline); }
.table th, .table td { text-align: left; padding: .68rem .85rem; border-bottom: 1px solid var(--hairline); }
.table th {
    background: rgba(247, 248, 250, .8);
    font-size: .72rem; font-weight: 600; text-transform: uppercase; letter-spacing: .05em;
    color: var(--muted);
}
.table tr:last-child td { border-bottom: 0; }
.table tbody tr { transition: background-color .12s ease; }
/* Subtiele zebra: even rijen een heel lichte tint, zodat lange lijsten beter te volgen zijn. */
.table tbody tr:nth-child(even) { background: color-mix(in srgb, var(--surface-2) 55%, transparent); }
.table tbody tr:hover { background: var(--surface-2); }
.table td.num, .table th.num { text-align: right; white-space: nowrap; }
.table tr.is-muted td { color: var(--muted); }

/* ── Bladerbalk onder een lijst (partials/_paginering.twig) ─────────────── */
.lijst-pager {
    display: flex; align-items: center; flex-wrap: wrap; gap: .75rem 1.1rem;
    margin-top: 1rem;
}
.lijst-pager__tel { font-variant-numeric: tabular-nums; }
.lijst-pager__grootte { display: inline-flex; align-items: center; gap: .45rem; }
.lijst-pager__grootte select {
    padding: .38rem .5rem; border-radius: var(--radius-sm);
    border: 1px solid var(--hairline-strong); background: var(--surface);
    color: var(--text); font: inherit; font-size: .86rem;
}
/* De knoppen rechts uitlijnen zodat Vorige/Volgende los van de teller staat. */
.lijst-pager__knoppen { margin-left: auto; display: inline-flex; align-items: center; gap: .5rem; }
.lijst-pager__knop { padding: .4rem .8rem; font-size: .85rem; }
.lijst-pager__pos { font-variant-numeric: tabular-nums; min-width: 3.5rem; text-align: center; }
.lijst-pager .is-disabled { opacity: .45; pointer-events: none; }

/* ── Labels ────────────────────────────────────────────────────────────── */
.badge {
    display: inline-block; padding: .16rem .6rem;
    border-radius: var(--radius-pill);
    background: var(--primary-soft); color: var(--primary);
    font-size: .76rem; font-weight: 550; letter-spacing: -.005em;
    white-space: nowrap;
}
.badge--muted { background: rgba(20, 24, 31, .06); color: var(--muted); }
.badge--danger { background: var(--danger-soft); color: var(--danger); }
.badge--success { background: var(--success-soft); color: var(--success); }

/* ── Venster (native <dialog>) ─────────────────────────────────────────── */
/* Matglas, net als het inlogscherm: doorschijnend wit met blur en een lichte
   glans langs de bovenrand. */
.modal {
    width: min(560px, calc(100vw - 2rem));
    padding: 1.6rem 1.7rem 1.5rem;
    border: 1px solid rgba(255, 255, 255, .55);
    border-radius: 22px;
    box-shadow: 0 30px 80px rgba(8, 20, 40, .28), inset 0 1px 0 rgba(255, 255, 255, .75);
    background: linear-gradient(165deg, rgba(255, 255, 255, .90), rgba(255, 255, 255, .80));
    -webkit-backdrop-filter: saturate(1.8) blur(26px);
    backdrop-filter: saturate(1.8) blur(26px);
    color: var(--text);
}
.modal::backdrop {
    background: rgba(10, 22, 42, .45);
    -webkit-backdrop-filter: blur(6px) saturate(1.2);
    backdrop-filter: blur(6px) saturate(1.2);
}
/* Velden in het venster iets doorschijnend, zodat ze bij het glas passen. */
.modal input[type=text], .modal input[type=email], .modal select {
    background: rgba(255, 255, 255, .72);
    border-color: rgba(20, 24, 31, .12);
}
.modal input:focus, .modal select:focus { background: #fff; }
.modal h2 { margin: 0 0 .2rem; }
.modal .form-actions { margin-top: 1.2rem; }
.modal__close-form { float: right; margin: -.4rem -.4rem 0 0; }
.modal__close {
    background: none; border: 0; cursor: pointer;
    font-size: 1.4rem; line-height: 1; color: var(--muted); padding: .2rem .35rem;
    border-radius: var(--radius-sm);
}
.modal__close:hover { background: var(--surface-2); color: var(--text); }

/* ── Venster: brede fetch-modal om één record te bekijken/bewerken ──────────
   Native <dialog>, opgebouwd door venster.js. Anders dan de kleine .modal
   (quick-create) is dit een breed, scrollbaar paneel dat een heel detail-
   fragment toont met inline-formulieren erin. De inhoud komt van de server
   (het fragment), venster.js verzorgt openen, submitten via fetch en het
   verversen van dat fragment. */
.venster {
    position: relative;
    width: min(940px, calc(100vw - 2rem));
    max-height: calc(100vh - 2.5rem);
    display: flex;
    flex-direction: column;
    padding: 0;
    overflow: hidden;
    border: 1px solid var(--hairline-strong);
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
    background: var(--surface);
    color: var(--text);
}
.venster::backdrop {
    background: rgba(10, 22, 42, .45);
    -webkit-backdrop-filter: blur(6px) saturate(1.2);
    backdrop-filter: blur(6px) saturate(1.2);
}
.venster__sluit {
    position: absolute; top: .7rem; right: .85rem; z-index: 5;
    background: var(--surface); border: 1px solid var(--hairline); cursor: pointer;
    font-size: 1.35rem; line-height: 1; color: var(--muted);
    padding: .1rem .45rem .2rem; border-radius: var(--radius-sm);
}
.venster__sluit:hover { background: var(--surface-2); color: var(--text); }
.venster__inhoud { overflow-y: auto; padding: 1.3rem 1.5rem 1.5rem; }
.venster__laden { padding: 3.5rem 1.5rem; text-align: center; color: var(--muted); }
/* Onopvallende melding boven het fragment na een actie (verschijnt kort). */
.venster__flits { margin: 0 0 1rem; }
/* Zwevende melding bij het plakken van een schermafdruk (Ctrl+V). Kind van de
   top-layer-<dialog>, dus staat boven de modal; tokens houden hem theme-proof. */
.venster__toast {
    position: fixed; left: 50%; bottom: 1.5rem; transform: translateX(-50%);
    z-index: 10; max-width: calc(100vw - 3rem);
    padding: .55rem .95rem; border: 1px solid var(--hairline-strong);
    border-radius: var(--radius-sm); background: var(--surface); color: var(--text);
    box-shadow: var(--shadow-lg); font-size: .86rem; pointer-events: none;
}

/* Twee kolommen op een breed venster (werk links, gegevens rechts), één kolom
   op smal. Fragmenten gebruiken dit voor de Perfex-achtige indeling. */
.venster-grid { display: grid; gap: 1.3rem 1.6rem; align-items: start; }
@media (min-width: 800px) { .venster-grid { grid-template-columns: minmax(0, 1fr) 290px; } }
.venster-grid > * { min-width: 0; }

/* ── Detailpaneel naast de lijst ─────────────────────────────────────────────
   paneel.js dokt de VOLLEDIGE detailpagina (in een iframe met ?paneel=1) rechts naast
   de lijst; de lijst (.main) schuift ernaast en wordt smaller — precies zoals bij een
   factuur die je opent. Vast aan het scherm, net als de zijbalk. Anders dan het venster
   (een modal met een uitgekleed fragment) blijven hier álle knoppen en formulieren
   werken, want het is de echte pagina, alleen zonder de admin-schil. Op smallere
   schermen legt het paneel zich als overlay over de lijst i.p.v. ernaast. */
:root { --paneel-breedte: min(50vw, 860px); }

.paneel {
    position: fixed; top: 0; right: 0; bottom: 0; z-index: 40;
    width: var(--paneel-breedte);
    display: flex; flex-direction: column;
    background: var(--surface);
    border-left: 1px solid var(--hairline-strong);
    box-shadow: -12px 0 40px rgba(12, 24, 45, .12);
}
.paneel__balk {
    display: flex; align-items: center; gap: .75rem;
    padding: .5rem .7rem .5rem 1rem;
    border-bottom: 1px solid var(--hairline);
    background: var(--surface-2);
}
.paneel__titel {
    flex: 1; min-width: 0;
    font-weight: 600; font-size: .95rem; color: var(--text);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.paneel__vol { font-size: .85rem; color: var(--primary); text-decoration: none; white-space: nowrap; }
.paneel__vol:hover { text-decoration: underline; }
.paneel__sluit {
    background: var(--surface); border: 1px solid var(--hairline); cursor: pointer;
    font-size: 1.3rem; line-height: 1; color: var(--muted);
    padding: .05rem .45rem .15rem; border-radius: var(--radius-sm);
}
.paneel__sluit:hover { background: var(--surface-2); color: var(--text); }
.paneel__laden { padding: 2.5rem 1.5rem; text-align: center; color: var(--muted); }
.paneel__frame { flex: 1; width: 100%; border: 0; background: var(--canvas); }
/* De achtergrond-scrim: standaard weg (op breed scherm staat het paneel naast de lijst,
   die blijft bruikbaar). Alleen in de overlay-modus hieronder komt hij in beeld. */
.paneel__scrim { display: none; }

/* De lijst schuift naast het paneel en wordt smaller. */
body.has-paneel .main { margin-right: var(--paneel-breedte); }

/* De aangeklikte rij blijft gemarkeerd zolang het paneel open is. */
tr.is-paneel-actief > td { background: var(--primary-soft); }

/* De zwevende feedbackknop (en pinnen) zitten op de lijstpagina op z-index 9000+ en zouden
   over het paneel heen vallen; verberg ze zolang het paneel open is. */
body.has-paneel #feedback-root,
body.has-paneel #feedback-pins { display: none; }

/* In het paneel zweeft geen feedbackknop, dus de extra ruimte onder .content (die daar
   langs laat scrollen) is hier overbodig. */
.paneel-body .content { padding-bottom: 1.6rem; }

@media (max-width: 1279px) {
    /* Te weinig ruimte voor een split: het paneel wordt een overlay over de lijst, met
       een scrim eronder zodat de lijst niet per ongeluk meebeweegt of aangeklikt wordt. */
    :root { --paneel-breedte: min(94vw, 860px); }
    body.has-paneel .main { margin-right: 0; }
    body.has-paneel { overflow: hidden; }
    body.has-paneel .paneel__scrim {
        display: block;
        position: fixed; inset: 0; z-index: 39;
        background: rgba(12, 24, 45, .45);
        -webkit-backdrop-filter: blur(2px);
        backdrop-filter: blur(2px);
    }
}

/* ── Detailregels ──────────────────────────────────────────────────────── */
.details { display: grid; grid-template-columns: 168px 1fr; gap: .45rem .9rem; margin: 0; font-size: .93rem; }
.details dt { color: var(--muted); }
.details dd { margin: 0; }

/* ── Instellingen-hub ──────────────────────────────────────────────────── */
.settings { display: grid; grid-template-columns: 252px 1fr; gap: 1.4rem; align-items: start; }
.settings__nav {
    background: var(--surface);
    border: 1px solid rgba(255, 255, 255, .7);
    border-radius: var(--radius);
    box-shadow: var(--shadow-sm), inset 0 1px 0 rgba(255, 255, 255, .6);
    padding: .9rem .6rem; position: sticky; top: 5rem;
}
.settings__nav-title { font-weight: 600; padding: .2rem .55rem .8rem; letter-spacing: -.01em; }
.settings__group { margin-bottom: .9rem; }
.settings__group-label {
    display: block; padding: 0 .55rem .3rem;
    font-size: .69rem; font-weight: 600; text-transform: uppercase; letter-spacing: .07em;
    color: var(--muted);
}
.settings__link {
    display: block; padding: .42rem .55rem; border-radius: var(--radius-sm);
    color: var(--text-2); text-decoration: none; font-size: .91rem;
    transition: background-color .14s ease, color .14s ease;
}
.settings__link:hover { background: var(--surface-2); color: var(--text); text-decoration: none; }
.settings__link.is-active { background: var(--primary); color: #fff; font-weight: 500; }
.settings__head { margin-bottom: 1.2rem; }
.settings__head h1 { margin-bottom: .2rem; }
.settings__body .panel:last-of-type { margin-bottom: 0; }

/* Tabstrip (ook gebruikt door de rapportages) */
.settings-nav { display: flex; gap: .15rem; border-bottom: 1px solid var(--hairline); margin: 0 0 1.2rem; }
.settings-nav a {
    padding: .5rem .85rem; color: var(--muted); text-decoration: none;
    border-bottom: 2px solid transparent; margin-bottom: -1px; font-size: .92rem;
}
.settings-nav a:hover { color: var(--text); text-decoration: none; }
.settings-nav a.is-active { color: var(--primary); border-bottom-color: var(--primary); font-weight: 550; }

/* Huisstijl-voorbeeld */
.brand-preview {
    border-radius: var(--radius); background-size: cover; background-position: center;
    padding: 2rem; display: flex; align-items: center; justify-content: center; min-height: 160px;
}
.brand-preview__card {
    background: rgba(8, 24, 41, .46);
    -webkit-backdrop-filter: blur(18px) saturate(1.2);
    backdrop-filter: blur(18px) saturate(1.2);
    border: .8px solid rgba(255, 255, 255, .16); border-radius: 20px;
    padding: 1.15rem 1.6rem; display: flex; align-items: center; gap: .75rem;
}
.brand-preview__logo { height: 26px; width: auto; max-width: 200px; object-fit: contain; }
.brand-preview__dot { width: 12px; height: 12px; border-radius: var(--radius-pill); display: inline-block; }

/* Voorbeeld van de zijbalk: zelfde ondergrond en maten als het echte menu. */
.brand-preview--sidebar {
    background: linear-gradient(180deg, var(--sidebar-a) 0%, var(--sidebar-b) 100%);
    justify-content: flex-start; align-items: flex-start; padding: 1.25rem; min-height: 120px;
}
.brand-preview__sidebar {
    width: 244px; max-width: 100%; padding: .35rem .5rem;
    display: flex; align-items: center; gap: .6rem;
}

/* ── Inloggen: matglas op het Webarctic-berglandschap ──────────────────── */
.guest { background: #0b1b2e; overflow: hidden; }
/* Precies zo hoog als het scherm, niet hoger. Met min-height:100vh rekent mobiel de
   adresbalk niet mee: de pagina werd dan een paar tientallen pixels te lang en je kon
   hem wegscrollen. 100dvh volgt de werkelijk zichtbare hoogte; de 100vh-regel erboven
   blijft staan als terugval voor browsers die dvh niet kennen.
   background-attachment: fixed is eruit — bij een vaste hoogte voegt het niets toe en
   op iOS geeft het schokkerig gedrag. */
.guest-wrap {
    height: 100vh;
    height: 100dvh;
    overflow: hidden;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 1.25rem; padding: 1.5rem;
    background-size: cover; background-position: center; background-repeat: no-repeat;
}
.glass-card {
    width: 100%; max-width: 420px; padding: 2.5rem;
    /* Past de kaart bij uitzondering toch niet (telefoon in liggende stand), dan
       schuift hij van binnen mee. Beter dan een inlogknop die buiten beeld valt. */
    max-height: 100%; min-height: 0; overflow-y: auto;
    background-color: rgba(8, 24, 41, .46);
    background-image: linear-gradient(rgba(255, 255, 255, .10), rgba(255, 255, 255, .043));
    -webkit-backdrop-filter: blur(18px) saturate(1.2);
    backdrop-filter: blur(18px) saturate(1.2);
    border: .8px solid rgba(255, 255, 255, .16);
    border-radius: 30px;
    box-shadow: 0 30px 90px rgba(5, 19, 34, .28);
    color: #fff; text-align: center;
}
/* Ook hier vaste hoogte + begrensde breedte, zodat een breed of hoog logo de
   kaart niet uit balans trekt. */
.glass-card__logo {
    display: block; height: 34px; width: auto;
    max-width: 260px; object-fit: contain;
    margin: 0 auto 1.5rem;
}
.glass-card__wordmark {
    margin: 0 auto 1.5rem; color: #fff;
    font-size: 1.15rem; font-weight: 600; letter-spacing: .01em;
}
.glass-pill {
    display: inline-block; margin-bottom: 1rem; padding: .3rem .85rem;
    background: rgba(255, 255, 255, .06); border: .8px solid rgba(255, 255, 255, .14);
    border-radius: var(--radius-pill); color: rgba(255, 255, 255, .78);
    font-size: 12px; letter-spacing: .12em; text-transform: uppercase;
}
.glass-title { font-size: 1.7rem; margin: 0 0 .25rem; color: #fff; }
.glass-sub { margin: 0 0 1.5rem; color: rgba(255, 255, 255, .7); font-size: .95rem; }
.glass-card .form { text-align: left; }
.glass-card .field > span { color: rgba(255, 255, 255, .72); }
.glass-card input[type=email],
.glass-card input[type=password],
.glass-card input[type=text] {
    background: rgba(255, 255, 255, .07); border: .8px solid rgba(255, 255, 255, .18);
    color: #fff; border-radius: 12px; padding: .7rem .85rem;
}
.glass-card input::placeholder { color: rgba(255, 255, 255, .45); }
.glass-card input:focus {
    border-color: rgba(255, 255, 255, .45); background: rgba(255, 255, 255, .12);
    box-shadow: none;
}
.btn-glass {
    display: block; width: 100%; padding: .75rem 1rem; border-radius: 14px; cursor: pointer;
    font: inherit; font-weight: 600; border: .8px solid rgba(255, 255, 255, .18);
    background: rgba(255, 255, 255, .06); color: #fff; margin-top: .5rem;
}
.btn-glass--primary { background: #fff; color: #0c1f33; border-color: transparent; }
.btn-glass--primary:hover { background: rgba(255, 255, 255, .9); }
/* Wachtwoordveld met een toon/verberg-knop erin, plus de caps-lock-hint eronder. */
.glass-card .wachtwoord { position: relative; display: block; }
.glass-card .wachtwoord input { width: 100%; padding-right: 4.4rem; }
.wachtwoord__toon {
    position: absolute; top: 50%; right: .5rem; transform: translateY(-50%);
    border: 0; background: none; cursor: pointer; font: inherit; font-size: .8rem;
    color: rgba(255, 255, 255, .72); padding: .25rem .45rem; border-radius: 8px;
}
.wachtwoord__toon:hover { color: #fff; background: rgba(255, 255, 255, .12); }
.capslock { display: block; margin-top: .35rem; font-size: .78rem; color: #ffd9a8; font-style: normal; }
/* Het hidden-attribuut moet winnen van de display:block hierboven, anders staat de
   caps-lock-hint meteen aan (dezelfde val als .picker__paneel[hidden]). */
.capslock[hidden] { display: none; }
/* "Ingelogd blijven" links, "wachtwoord vergeten?" rechts. */
.login-rij { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin: .1rem 0 .2rem; }
.onthoud { display: flex; align-items: center; gap: .5rem; margin: 0; cursor: pointer; font-size: .86rem; color: rgba(255, 255, 255, .8); }
.glass-card .onthoud input[type=checkbox] { width: auto; padding: 0; accent-color: #fff; }
.login-link { font-size: .84rem; color: rgba(255, 255, 255, .78); text-decoration: none; white-space: nowrap; }
.login-link:hover { color: #fff; text-decoration: underline; }
.glass-card .flash { background: rgba(255, 255, 255, .10); border-color: rgba(255, 255, 255, .2); color: #fff; text-align: left; }
.glass-card .flash--error { background: rgba(192, 57, 43, .28); border-color: rgba(255, 140, 130, .45); color: #ffe3e0; }
.guest-footer { color: rgba(255, 255, 255, .55); font-size: .8rem; margin: 0; }

/* Lage schermen: alles krimpt mee zodat de kaart binnen het scherm blijft passen.
   De volgorde van weglaten is bewust — eerst het decor (het label "Portaal", de
   ondertitel), dan de kop, en pas als laatste raken we het merk aan. Wat er hoe dan
   ook moet blijven staan zijn de twee velden en de knop; daar kom je om. */
@media (max-height: 680px) {
    .guest-wrap { gap: .6rem; padding: .7rem; }
    .glass-card { padding: 1.35rem 1.6rem; border-radius: 22px; }
    .glass-card__logo { height: 26px; margin-bottom: .8rem; }
    .glass-card__wordmark { margin-bottom: .8rem; font-size: 1.02rem; }
    .glass-pill { display: none; }
    .glass-title { font-size: 1.25rem; margin-bottom: .15rem; }
    .glass-sub { margin-bottom: .9rem; font-size: .88rem; }
    .glass-card .field { margin-bottom: .6rem; }
}

@media (max-height: 500px) {
    .guest-wrap { gap: .4rem; padding: .5rem; }
    .glass-card { padding: 1rem 1.4rem; }
    .glass-card__logo { height: 22px; margin-bottom: .55rem; }
    .glass-card__wordmark { margin-bottom: .55rem; font-size: .95rem; }
    /* Kop en ondertitel zijn hier puur sfeer; het formulier spreekt voor zich. */
    .glass-title, .glass-sub { display: none; }
    .glass-card .field { margin-bottom: .45rem; }
    .glass-card .field > span { font-size: .78rem; }
    .guest-footer { display: none; }
}

.error-code { font-size: 2.6rem; letter-spacing: -.03em; }

/* ── Responsief ────────────────────────────────────────────────────────── */
@media (max-width: 980px) {
    .cards-2 { grid-template-columns: 1fr; }
    .settings { grid-template-columns: 1fr; }
    .settings__nav { position: static; }
    .topsearch { flex-basis: 220px; margin-left: .75rem; }
}

@media (max-width: 760px) {
    .layout { flex-direction: column; }
    /* Op smal is de zijbalk een gewone bovenbalk in de flow: geen vaste positie en geen
       verschoven .main. */
    .sidebar { width: 100%; flex-direction: row; align-items: center; overflow-x: auto; padding: .6rem .75rem; position: static; }
    .main, .layout:has(.sidebar.is-ingeklapt) .main { margin-left: 0; }
    .brand { padding: 0 .75rem 0 .35rem; }
    .nav { flex-direction: row; gap: .2rem; }
    /* Op de smalle bovenbalk geen groepskoppen en geen open/dicht: alle items stromen
       naast elkaar. display: contents laat de wrappers zich gedragen alsof ze er niet
       zijn, zodat de items directe buren in de rij worden -- ook die van een groep die
       op de brede weergave dichtstaat. */
    .nav__groep, .nav__items, .nav__groep.is-dicht .nav__items { display: contents; }
    .nav__group { display: none; }
    .topsearch { display: none; }
    .content { padding: 1rem; }
    .details { grid-template-columns: 1fr; gap: .1rem .9rem; }
    .details dt { margin-top: .5rem; }
    /* Documentformulier (factuur/offerte/creditnota): de twee kopblokken onder elkaar. */
    .form__kop { grid-template-columns: 1fr; }
    /* Paginakop en knoprijen mogen afbreken i.p.v. horizontaal buiten beeld te lopen. */
    .page-head { flex-wrap: wrap; }
    .row-actions { flex-wrap: wrap; white-space: normal; }
    .form-actions { flex-wrap: wrap; }
    /* Het detailpaneel (master-detail) is op smal al een overlay; laat 'm de volle breedte
       pakken zodat de knoppen erin niet ingeklemd raken. */
    :root { --paneel-breedte: 100vw; }
}

/* ── Medewerkerstegels ─────────────────────────────────────────────────── */
/* Overal waar een taak, opmerking of klus een persoon heeft. Een foto als die er
   is, anders de initialen in een kleur die uit de naam volgt. */
.avatar {
    display: inline-grid; place-items: center;
    flex: none;
    border-radius: var(--radius-pill);
    object-fit: cover;
    color: #fff; font-weight: 650; letter-spacing: .01em;
    line-height: 1;
    user-select: none;
    box-shadow: 0 0 0 1px rgba(255, 255, 255, .85), 0 1px 2px rgba(16, 24, 40, .18);
}

.avatar--leeg {
    background: var(--surface-2);
    color: var(--muted);
    box-shadow: inset 0 0 0 1px var(--hairline-strong);
    font-weight: 600;
}

.avatar--meer {
    background: var(--surface-2);
    color: var(--text-2);
    font-weight: 650;
}

.avatar-naam { display: inline-flex; align-items: center; gap: .45rem; }

/* Overlappende rij: de tegels schuiven over elkaar heen, de eerste bovenop. */
.avatar-stapel { display: inline-flex; align-items: center; }
.avatar-stapel .avatar + .avatar { margin-left: -8px; }

/* In een donkere omgeving (bordkaart op kleur, zijbalk) moet de rand meelopen. */
.is-dark .avatar { box-shadow: 0 0 0 1px rgba(255, 255, 255, .25); }

/* Fotoveld op het medewerkersformulier */
.foto-veld { display: flex; align-items: flex-start; gap: 1rem; }
.foto-veld__keuze { display: flex; flex-direction: column; gap: .45rem; min-width: 0; }
.foto-veld__keuze input[type="file"] { font-size: .88rem; }

/* ── Nummerreeksen (Instellingen) ──────────────────────────────────────────
   Eén blok per documentsoort in plaats van één tabelregel: er hoort per reeks
   een waarschuwing en een bevestiging bij te kunnen staan, en dat past niet in
   een cel. */
.seq__kop { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.seq__titel { margin: 0 0 .2rem; font-size: 1.02rem; }
.seq__voorbeeld { margin: .5rem 0 .2rem; font-size: .95rem; }
.seq__badge {
    display: inline-block; margin-left: .4rem;
    padding: .1rem .45rem; border-radius: 999px;
    background: var(--primary-soft); color: var(--primary);
    font-size: .72rem; font-weight: 600;
}
.seq__uitleg { margin: .4rem 0 0; padding-left: 1.1rem; }
.seq__uitleg li { margin-bottom: .45rem; }
