/* SALESSYNC — GLAS & DIEPTE
   ==========================
   Laden ná tokens.css en kit.css:

       <link rel="stylesheet" href="/static/css/tokens.css">
       <link rel="stylesheet" href="/static/css/kit.css">
       <link rel="stylesheet" href="/static/css/glas.css">

   Dit bestand voegt geen nieuwe kleuren toe en verandert geen indeling.
   Het doet drie dingen:
     1. het glasrecept op vier lagen, in plaats van één doorschijnend vlak
     2. hover die de STATUS van de rij overneemt (rood dossier = rode schijn)
     3. de correctie op de reduced-motion regel die de waas nul maakte

   Wat je in de HTML moet doen staat onderaan, in vier punten.               */


/* ── 1. Het glasrecept ──────────────────────────────────────────────────────
   Doorschijnend alleen is niet genoeg. Glas ontstaat pas als vier dingen
   samen kloppen:
     a. een diagonaal lichtverloop ÓP het vlak      → het licht dat erop valt
     b. waas + verzadiging + helderheid             → wat je erdóór ziet
     c. een lichte boven- en donkere onderbinnenrand → de dikte van de plaat
     d. contactschaduw + omgevingsschaduw           → het zweven
   Laat er één weg en het wordt weer grijs vlak.                            */

:root {
    --glas-licht: linear-gradient(152deg,
        rgba(255, 255, 255, .13) 0%,
        rgba(255, 255, 255, .05) 44%,
        rgba(255, 255, 255, .015) 72%,
        rgba(255, 255, 255, .06) 100%);

    --glas-licht-hover: linear-gradient(148deg,
        rgba(255, 255, 255, .34) 0%,
        rgba(255, 255, 255, .12) 28%,
        rgba(255, 255, 255, .03) 55%,
        rgba(255, 255, 255, .22) 100%);

    --binnenrand: inset 0 1px 0 rgba(255, 255, 255, .30),
                  inset 0 -1px 0 rgba(0, 0, 0, .24);

    --binnenrand-hover: inset 0 1px 0 rgba(255, 255, 255, .58),
                        inset 0 -1px 0 rgba(0, 0, 0, .28);

    --vloei: transform .22s cubic-bezier(.2, .75, .3, 1),
             box-shadow .22s ease,
             background .22s ease,
             border-color .22s ease,
             backdrop-filter .22s ease;
}

/* Elk vlak dat glas moet zijn krijgt deze klasse. */
/* ⚠️ DE RAND IS GEEN `border` MAAR EEN INSET-SCHADUW.

   GEMETEN, 14-8-2026, in de ingelogde app op 1280×800. Met `border: 1px` erbij
   verschoof de eerste dashboardkaart van y=961 naar y=968 — zeven pixels, en dat
   telt op over een kolom kaarten. Een rand neemt ruimte in; een inset-schaduw
   niet. Ze tekenen hetzelfde en de indeling blijft exact staan.

   Dit is dezelfde afweging als bij de knopmaten verderop: het glas mag alles
   veranderen aan hoe iets ERUITZIET, en niets aan waar het STAAT. */
.glas {
    background: var(--glas-licht), var(--glas-1);
    backdrop-filter: blur(var(--waas)) saturate(170%) brightness(108%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(170%) brightness(108%);
    border-radius: var(--rond);
    box-shadow: var(--diepte-2), var(--binnenrand),
                inset 0 0 0 1px var(--lijn);
    transition: var(--vloei);
}

/* Eén trede hoger: de kaart die de aandacht moet hebben. */
.glas--hoog {
    background: linear-gradient(150deg,
        rgba(255, 255, 255, .18) 0%,
        rgba(255, 255, 255, .06) 40%,
        rgba(255, 255, 255, .02) 70%,
        rgba(255, 255, 255, .09) 100%), var(--glas-2);
    backdrop-filter: blur(var(--waas-diep)) saturate(190%) brightness(112%);
    -webkit-backdrop-filter: blur(var(--waas-diep)) saturate(190%) brightness(112%);
    border-color: var(--lijn-sterk);
    box-shadow: var(--diepte-3),
                inset 0 1px 0 rgba(255, 255, 255, .48),
                inset 0 0 0 1px rgba(255, 255, 255, .07),
                inset 0 -1px 0 rgba(0, 0, 0, .28);
}


/* ── 2. Statusgebonden hover ────────────────────────────────────────────────
   De statuskleur zet je per rij één keer in de HTML als --status. Deze regel
   leest hem uit. Zo heb je één hoverregel voor alle statussen, in plaats van
   vier bijna identieke.

   16% radiale schijn + 7% vlakke tint: voelbaar, maar ver onder een gekleurde
   rij-achtergrond. De linkerrand blijft de echte indicator — dat blijft de
   afspraak.                                                                 */

.rij,
.tegel {
    --status: var(--merk);
    background: var(--glas-licht), var(--glas-1);
    backdrop-filter: blur(var(--waas)) saturate(170%) brightness(108%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(170%) brightness(108%);
    border-radius: var(--rond-klein);
    box-shadow: var(--diepte-2), var(--binnenrand),
                inset 0 0 0 1px var(--lijn);
    transition: var(--vloei);
}

/* De linkerrand van een rij is wél een echte border: dat is de statusindicator
   waar we het over eens zijn, en die MAG ruimte innemen — hij moet opvallen.
   Rijen zijn ook het enige waar hij op staat; een tegel krijgt hem niet. */
.rij {
    border-left: 3px solid var(--status);
}

.tegel {
    border-radius: var(--rond);
}

.rij:hover,
.tegel:hover,
.glas:hover,
.glas--hoog:hover {
    background:
        var(--glas-licht-hover),
        radial-gradient(120% 140% at 82% 0%,
            color-mix(in srgb, var(--status) 16%, transparent) 0%,
            transparent 62%),
        linear-gradient(180deg,
            color-mix(in srgb, var(--status) 7%, transparent) 0%,
            color-mix(in srgb, var(--status) 3%, transparent) 100%),
        var(--glas-3);
    backdrop-filter: blur(var(--waas-diep)) saturate(215%) brightness(118%);
    -webkit-backdrop-filter: blur(var(--waas-diep)) saturate(215%) brightness(118%);
    border-color: color-mix(in srgb, var(--status) 42%, var(--lijn-sterk));
    box-shadow: var(--diepte-3),
                var(--binnenrand-hover),
                inset 0 0 0 1px color-mix(in srgb, var(--status) 14%, transparent),
                0 0 42px color-mix(in srgb, var(--status) 26%, transparent);
}

/* Rijen blijven exact staan — geen verschuiving, alleen het glas verandert.
   Losse tegels en kaarten mogen wel oplichten. */
.rij:hover { transform: none; }
.tegel:hover,
.glas:hover { transform: translateY(-3px); }

/* Rijen zonder eigen linkerrand houden de statuskleur wel voor de hover:
   zet dan gewoon --status en laat border-left weg met .rij--vlak. */
.rij--vlak { border-left-width: 1px; }


/* ── 3. Knoppen ─────────────────────────────────────────────────────────────
   Een knop is glas met een top-lichtstreep. De hoofdknop is hetzelfde in
   accentkleur, met een gloed die pas bij hover verschijnt.                  */

/* ⚠️ MATEN STAAN HIER NIET IN — zie het blok `:not(.btn)` hieronder.

   GEMETEN, 14-8-2026. Met de maten erin werd elke knop in SalesSync groter
   (min-height 44 → en de hoofdknop 52, met ruimere padding). Op de vergelijking
   naast elkaar sprong dat er meteen uit: de knoppen schoven, en daarmee alles
   eronder. Dat botst frontaal met wat de eigenaar vroeg:

       "ik wil niet de werking of indeling verandert"

   Dus krijgt een knop die de app al heeft (.btn) wél het glas, maar houdt hij
   zijn eigen maat. Een knop die alleen `knop` draagt — nieuw werk dat het
   pakket rechtstreeks gebruikt — krijgt de maten van het pakket wél. */
.knop {
    font-weight: 600;
    border: 1px solid var(--lijn-sterk);
    border-radius: var(--rond-klein);
    cursor: pointer;
    color: var(--tekst);
    background: linear-gradient(152deg,
        rgba(255, 255, 255, .15) 0%,
        rgba(255, 255, 255, .05) 46%,
        rgba(255, 255, 255, .07) 100%), var(--glas-2);
    backdrop-filter: blur(var(--waas)) saturate(170%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(170%);
    box-shadow: var(--diepte-2),
                inset 0 1px 0 rgba(255, 255, 255, .34),
                inset 0 -1px 0 rgba(0, 0, 0, .24);
    transition: var(--vloei);
}

.knop:hover {
    transform: translateY(-3px);
    background: linear-gradient(148deg,
        rgba(255, 255, 255, .42) 0%,
        rgba(255, 255, 255, .14) 28%,
        rgba(255, 255, 255, .04) 56%,
        rgba(255, 255, 255, .26) 100%), var(--glas-3);
    backdrop-filter: blur(var(--waas-diep)) saturate(210%) brightness(118%);
    -webkit-backdrop-filter: blur(var(--waas-diep)) saturate(210%) brightness(118%);
    box-shadow: var(--diepte-3),
                inset 0 1px 0 rgba(255, 255, 255, .70),
                inset 0 0 0 1px rgba(255, 255, 255, .14),
                inset 0 -1px 0 rgba(0, 0, 0, .30),
                0 0 38px color-mix(in srgb, var(--merk) 20%, transparent);
}

.knop:active {
    transform: translateY(-1px);
    box-shadow: var(--diepte-1), inset 0 1px 0 rgba(255, 255, 255, .34);
}

/* De maten van de hoofdknop staan om dezelfde reden apart, hieronder. */
.knop--hoofd {
    color: var(--merk-op);
    border-color: color-mix(in srgb, var(--merk) 60%, transparent);
    background: linear-gradient(168deg,
        color-mix(in srgb, #fff 26%, var(--merk)) 0%,
        var(--merk) 42%,
        var(--merk-diep) 100%);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    box-shadow: var(--diepte-2),
                inset 0 1px 0 rgba(255, 255, 255, .55),
                inset 0 -1px 0 rgba(0, 0, 0, .26),
                0 0 0 1px color-mix(in srgb, var(--merk) 32%, transparent);
}

.knop--hoofd:hover {
    background: linear-gradient(160deg,
        rgba(255, 255, 255, .55) 0%,
        color-mix(in srgb, #fff 22%, var(--merk)) 20%,
        var(--merk) 58%,
        var(--merk-diep) 100%);
    filter: saturate(120%) brightness(108%);
    box-shadow: var(--diepte-3),
                inset 0 1px 0 rgba(255, 255, 255, .85),
                inset 0 -1px 0 rgba(0, 0, 0, .28),
                0 0 50px color-mix(in srgb, var(--merk) 58%, transparent),
                0 0 0 1px color-mix(in srgb, var(--merk) 50%, transparent);
}

/* De maten van het pakket — alleen voor knoppen die SalesSync nog niet heeft.
   Draagt een element ook `.btn`, dan blijft de bestaande maat staan en verschuift
   er niets. Zie de uitleg bij `.knop` hierboven. */
.knop:not(.btn) {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    font: inherit;
    font-size: var(--tekst-s);
    font-weight: 600;
    min-height: 44px;            /* garage, handschoenen, tablet */
    padding: .5rem 1rem;
}

.knop--hoofd:not(.btn) {
    font-size: var(--tekst-l);
    min-height: 52px;
    padding: .8rem 1.5rem;
}

/* De stille knop: geen vlak tot je erover gaat. */
.knop--stil {
    border-color: transparent;
    background: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    box-shadow: none;
    color: var(--tekst-zacht);
}

.knop--stil:hover {
    border-color: var(--lijn-sterk);
    color: var(--tekst);
    background: linear-gradient(150deg,
        rgba(255, 255, 255, .26) 0%,
        rgba(255, 255, 255, .08) 40%,
        rgba(255, 255, 255, .14) 100%), var(--glas-2);
    backdrop-filter: blur(var(--waas)) saturate(185%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(185%);
    box-shadow: var(--diepte-2),
                inset 0 1px 0 rgba(255, 255, 255, .48),
                inset 0 -1px 0 rgba(0, 0, 0, .24);
}


/* ── 4. Zijbalk en kopbalk ──────────────────────────────────────────────────
   Twee valkuilen die ons hier een halve dag kostten, dus lees dit voor je
   backdrop-filter op een groot vlak zet.

   VALKUIL 1 — een vlak dat de volle documenthoogte spant (bv. een zijbalk van
   1600px) wordt door de browser niet meer samengesteld: de waas valt stil op
   blur(0). Oplossing: leg het glas niet op de zijbalk zelf, maar op een lege
   laag binnenin die precies één schermhoogte is.

   VALKUIL 2 — die laag is position:sticky en tekent daardoor bóven de
   statische inhoud van de zijbalk: je eigen navlabels gaan door de waas.
   Oplossing: isolation:isolate op de zijbalk, z-index:-1 op de laag. Negatieve
   z-index tekent boven de achtergrond maar onder de inhoud.

   Markup:
       <aside class="zijbalk">
         <div class="zijbalk__glas"></div>
         ... je bestaande inhoud, ongewijzigd ...
       </aside>                                                              */

.zijbalk {
    position: relative;
    isolation: isolate;
    background: linear-gradient(152deg,
        rgba(255, 255, 255, .10) 0%,
        rgba(255, 255, 255, .035) 46%,
        rgba(255, 255, 255, .05) 100%), var(--glas-1);
    border-right: 1px solid var(--lijn);
    box-shadow: var(--glans);
}

/* ⚠️ ABSOLUUT, NIET STICKY MET NEGATIEVE MARGES.

   GEMETEN, 14-8-2026, ingelogd op 1280×800. Het pakket zette deze laag op
   `position: sticky` met `margin: -1.15rem -1rem -100vh`. De marge onderaan
   haalt de hoogte weer weg, maar de marge BOVENAAN trekt de laag én alles wat
   erna komt omhoog. Gemeten gevolg: het logo ging van y=24 naar y=6 en elk van
   de twintig menu-items schoof 18px op. Precies wat niet mocht gebeuren.

   De bedoeling van die negatieve marges was de padding van de zijbalk mee te
   bedekken. Dat lukt met `position: absolute` even goed — en absoluut staat
   helemaal buiten de flow, dus er kán niets meer verschuiven.

   De hoogte blijft 100vh: dat was de hele reden voor een aparte laag. Een vlak
   van volle documenthoogte wordt niet meer als eigen laag samengesteld en dan
   rekent backdrop-filter naar blur(0px). */
.zijbalk__glas {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    z-index: -1;
    height: 100vh;
    pointer-events: none;
    border-right: 1px solid var(--lijn);
    backdrop-filter: blur(var(--waas)) saturate(165%) brightness(108%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(165%) brightness(108%);
    will-change: backdrop-filter;
    transform: translateZ(0);
}

.kopbalk {
    position: sticky;
    top: 0;
    z-index: 5;
    background: linear-gradient(180deg,
        rgba(255, 255, 255, .12) 0%,
        rgba(255, 255, 255, .03) 100%), var(--glas-1);
    border-bottom: 1px solid var(--lijn);
    backdrop-filter: blur(var(--waas)) saturate(180%) brightness(110%);
    -webkit-backdrop-filter: blur(var(--waas)) saturate(180%) brightness(110%);
    will-change: backdrop-filter;
    transform: translateZ(0);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, .24),
                0 1px 0 rgba(0, 0, 0, .20);
}


/* ── 5. Voorkeuren van de gebruiker ─────────────────────────────────────────
   In tokens.css stond doorzichtigheid en beweging in één media query. Gevolg:
   wie reduced-motion aan had (en dat is vaker dan je denkt) kreeg --waas: 0px
   en dus géén glas, terwijl alle overgangen wél bleven lopen — precies
   omgekeerd. Deze twee horen apart.                                         */

@media (prefers-reduced-transparency: reduce) {
    :root {
        --waas: 0px;
        --waas-diep: 0px;
        --glas-1: #131d2c;
        --glas-2: #182437;
        --glas-3: #1d2a3f;
    }
}

@media (prefers-reduced-motion: reduce) {
    /* Het glas blijft, de hovertoestand blijft; alleen doorlopende animatie
       wordt getemperd. Een hover die niets doet is geen toegankelijkheid.

       ⚠️ MET html:not(.beweging-aan) ERVOOR, EN DAT IS GEEN DETAIL.
       Zonder die voorwaarde zet deze regel ELKE animatie in SalesSync op
       0,01 ms — ook als de gebruiker beweging uitdrukkelijk aan heeft staan.
       Op Windows staat "animaties weergeven" standaard UIT, dus op deze server
       gold dat voor iedereen.

       Gemeten 22-8-2026 op de draaiende app: animation-duration van .ss-in was
       '1e-05s' in plaats van '0.22s'. Alles wat er aan beweging in zit — het
       opkomen van de kaarten, de vullende voortgangsbalken, de optrekkende
       raceauto's, Nova's ademhaling — werd wél afgespeeld, maar onzichtbaar.

       style.css en tokens.css hebben de voorwaarde WEL, met dezelfde uitleg
       erboven. Dit bestand was het enige dat hem miste, en één ongeschermde
       regel volstaat om de andere twee te overrulen. */
    html:not(.beweging-aan) *,
    html:not(.beweging-aan) *::before,
    html:not(.beweging-aan) *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        scroll-behavior: auto !important;
    }
}


/* ── WAT JE IN DE HTML MOET DOEN ────────────────────────────────────────────

   1. Klassen zetten op wat er al staat. Niets verplaatsen:
        vlakken / kaarten     → class="glas"        (de belangrijkste: glas--hoog)
        rijen in een werklijst → class="rij"
        cijfertegels          → class="tegel"
        knoppen               → class="knop"        (de doorgeefknop: knop--hoofd)
        annuleren / later     → class="knop knop--stil"

   2. De statuskleur per rij meegeven. Eén inline eigenschap, server-side:

        <div class="rij" style="--status: var(--fout)">      geblokkeerd
        <div class="rij" style="--status: var(--let-op)">     wacht op klant
        <div class="rij" style="--status: var(--ok)">         klaar om door te geven
        <div class="rij" style="--status: var(--info)">       ingepland

      In Jinja bijvoorbeeld:
        <div class="rij" style="--status: var(--{{ taak.status_token }})">

      Zet je geen --status, dan valt de rij terug op het merkgoud. Nooit stuk.

   3. De zijbalk krijgt één lege div als eerste kind (zie punt 4 hierboven),
      en de kopbalk de klasse kopbalk. Dat is de enige markupwijziging.

   4. In tokens.css: haal (prefers-reduced-motion: reduce) uit de media query
      die --waas op 0px zet. Anders werkt het glas op de helft van de machines
      niet, en zie je nooit waar dit bestand voor bedoeld was.

   Nakijken of het werkt, in de console:

        getComputedStyle(document.documentElement).getPropertyValue('--waas')
        → moet 14px zijn, niet 0px

        getComputedStyle(document.querySelector('.glas')).backdropFilter
        → moet blur(14px) ... zijn, niet blur(0px)                            */


/* ── 5. De grond waar het glas op rust ──────────────────────────────────────
   GEMETEN, 14-8-2026. De eigenaar op zijn gsm: *"Ik zie niet echt een verschil"*.
   Terecht. Met glas.js aan stonden alle klassen er wél op — gemeten in Edge op
   de draaiende app: `adm-card glas`, en `blur(14px) saturate(1.7)
   brightness(1.08)`. Toch zag hij niets. Dat is geen fout in de schakelaar maar
   in de veronderstelling eronder.

   backdrop-filter vervaagt wat ACHTER het vlak ligt. Achter een kaart in
   SalesSync ligt één vlakke kleur (--grond). Een waas over een egale kleur
   geeft exact diezelfde egale kleur terug. Al het werk aan verzadiging en
   helderheid valt dus weg, en wat overblijft is een randje en een schaduw.

   Daarom krijgt de app een grond met heel zwakke kleurvelden. Geen patroon en
   geen beeld: drie zeer lichte radiale vlekken in de merk- en betekeniskleuren,
   vast op het scherm. Ze vallen zelf niet op, maar het glas heeft nu iets om te
   breken — en dán zie je pas dat het glas is.

   Raakt de indeling niet: de laag staat position:fixed op z-index -1 en zit
   buiten de flow. Er verschuift geen enkel element een pixel.                */

html.glas-aan body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    /* Maten in PROCENT van het scherm, niet in rem.
       Eerste poging stond op 52rem — op een gsm van 390px breed is dat twee
       schermbreedtes, dus zag je één vlakke tint en nog steeds geen glas.
       Procenten schalen mee: dezelfde compositie op een gsm en op 27 duim. */
    background:
        radial-gradient(78% 52% at 6% 10%,
            color-mix(in srgb, var(--merk) 16%, transparent) 0%, transparent 62%),
        radial-gradient(72% 48% at 94% 82%,
            color-mix(in srgb, var(--info) 18%, transparent) 0%, transparent 64%),
        radial-gradient(64% 44% at 58% 46%,
            color-mix(in srgb, var(--ok) 11%, transparent) 0%, transparent 60%);
}

/* Wie doorzichtigheid weg wil, wil deze wolken ook niet. Zonder waas is er toch
   niets om te breken, en dan is het alleen nog gekleurde ruis. */
@media (prefers-reduced-transparency: reduce) {
    html.glas-aan body::before { background: none; }
}
