
*,*:before,*:after{box-sizing:border-box}
:root{
  /* Kleuren */
  --c1:#86b6ff; --c2:#b59cff; --c3:#5ce1b9; --c4:#ffe08a; --c5:#ffa2c0;
  /* Onderkleur van de .bg-laag. Staat bewust in :root en NIET in de
     dark-mode-override hieronder: de achtergrondlaag zelf kent geen
     donkere variant, dus zou <html> in donkere modus donkerblauw worden
     terwijl de pagina pastel blijft. Op een iPhone gaf dat een donkere
     strook boven de statusbalk en onder de adresbalk. Eén variabele voor
     allebei, dan kunnen ze niet meer uit elkaar lopen. */
  --bg-basis:#eef4fb;
  /* De kleur waar de achtergrond BOVENAAN mee begint. Staat hier apart omdat
     de theme-color-meta (de strook achter de statusbalk op een telefoon) er
     gelijk aan moet zijn: die stond op --bg-basis, en dat is de ONDERkant van
     het verloop. Op een iPhone gaf dat een nét andere kleur boven de pagina dan
     eronder — een naad precies op de plek waar je hem het eerst ziet.
     tests/test_achtergrond_mobiel.py bewaakt dat ze gelijk blijven. */
  --bg-top:#edf3ff;
  --brand:#0f4c98; --brand-2:#003366;
  --text:#0f172a; --muted:#475569; --line:#d1d5db; --ring:#2563eb;
  --surface:#ffffff; --surface-2:#f1f5f9;
  --panel:rgba(255,255,255,.82); --panel-b:rgba(255,255,255,.45);
  /* Animatie snelheden */
  --t-slow: 28s;
  --t-med:  18s;
  --t-fast:  8s;
}
/* Dark mode (volgt OS) */
@media (prefers-color-scheme: dark){
  :root{
    --brand:#7db4ff; --brand-2:#4a7fff;
    --text:#e5e7eb; --muted:#9aa3b2; --line:#3b4252; --ring:#8ab4ff;
    --surface:#0b1020; --surface-2:#0f172a;
    --panel:rgba(13,20,40,.72); --panel-b:rgba(13,20,40,.4);
  }
}

html,body{height:100%}
/* [iOS] Ook het HTML-element de basiskleur geven. Safari schildert het gebied
   achter de in- en uitschuivende balken (en de overscroll-rand) met de
   achtergrond van <html>, niet die van <body>. Zonder deze regel bleef daar een
   witte strook staan boven- en onderaan.

   BELANGRIJK: NIET var(--surface). Die wordt in dark mode #0b1020, terwijl de
   .bg-laag eronder geen dark-variant kent en gewoon pastel blijft. Op een
   iPhone in donkere modus gaf dat een lichte pagina met een donkerblauwe strook
   boven de statusbalk en onder de adresbalk (gebruikersmelding 08-08-2026).
   --bg-basis is dezelfde kleur waar de .bg-gradient op eindigt, dus loopt de
   achtergrond visueel door tot de schermrand. */
html{ background:var(--bg-basis); }
body{
  font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
  color:var(--text); margin:0; position:relative; overflow-x:hidden;
  /* [LET OP] GEEN eigen background op body. Zodra <html> een achtergrond heeft
     (de iOS-regel hierboven), propageert body's achtergrond niet meer naar het
     canvas maar schildert hij op body zelf — en body is position:relative, dus
     dat vlak komt in de paint-order BOVEN de .bg-laag (z-index:-2) te liggen.
     Resultaat (melding 7 aug 2026): de hele gradient-achtergrond afgedekt door
     een egale vlakke kleur. De basiskleur zit al op <html>; die dekt het canvas
     én het iOS-overscroll-gebied. */
  background: transparent;
}

/* ======= Nieuwe achtergrond ======= */
.bg{
  /* [iOS] GEEN inset:0. Een fixed laag met bottom:0 wordt op iOS Safari zo hoog
     als de KLEINE viewport — precies het stuk tussen de adresbalk en de
     knoppenbalk. Schuiven die balken weg, of veert de pagina door bij het
     scrollen, dan valt de achtergrond aan de boven- en onderkant weg en zie je
     een kale strook. Met een expliciete hoogte in lvh (de GROTE viewport, dus
     inclusief het gebied achter de balken) dekt hij het hele scherm; overflow
     staat toch al op hidden. 100vh blijft als terugval voor oudere browsers. */
  position:fixed; top:0; left:0; right:0;
  height:100vh;
  height:100lvh;
  z-index:-2; overflow:hidden;
  /* Basismix (zachte radialen + subtiele vertical fade) */
  background:
    radial-gradient(40vmax 40vmax at 14% 24%, var(--c1) 0%, transparent 60%),
    radial-gradient(38vmax 38vmax at 86% 30%, var(--c2) 0%, transparent 60%),
    radial-gradient(50vmax 50vmax at 52% 92%, var(--c3) 0%, transparent 60%),
    linear-gradient(180deg, var(--bg-top) 0%, var(--bg-basis) 100%);
  filter:saturate(1.06);
  animation: hueShift var(--t-slow) linear infinite;
}

/* Aurora laag */
.bg::before,
.bg::after{
  content:""; position:absolute; inset:-10%;
  /* Aurora met conic-gradients; de mask maakt vloeiende vormen */
  background:
    conic-gradient(from 0deg at 30% 60%, rgba(255,255,255,.08), rgba(255,255,255,0) 60%),
    conic-gradient(from 180deg at 70% 40%, rgba(255,255,255,.06), rgba(255,255,255,0) 60%);
  mix-blend-mode: overlay;
  will-change: transform, opacity;
}
.bg::before{
  animation: driftA var(--t-med) ease-in-out infinite alternate;
  opacity:.4;
  /* [FIX] Lange, vloeiende maskerrand i.p.v. een harde 60->62%-overgang.
     Die scherpe ring was de zichtbare grijze "fade-naad" in de aurora. */
  -webkit-mask-image: radial-gradient(70% 62% at 35% 60%, #000 0 22%, transparent 88%);
          mask-image: radial-gradient(70% 62% at 35% 60%, #000 0 22%, transparent 88%);
}
.bg::after{
  animation: driftB var(--t-slow) ease-in-out infinite;
  opacity:.28;
  /* [FIX] idem: zachte fade, geen zichtbare ellips-rand meer. */
  -webkit-mask-image: radial-gradient(82% 72% at 70% 40%, #000 0 22%, transparent 88%);
          mask-image: radial-gradient(82% 72% at 70% 40%, #000 0 22%, transparent 88%);
}

/* Subtiele korrel / film grain (zonder externe asset) */
.bg::marker{display:none}
.bg > i{display:none}
/* [FIX] backdrop-filter VERWIJDERD: deze stond op de achterste aurora-laag
   (.bg is position:fixed; z-index:-2), die niets zinnigs achter zich heeft. Op
   iOS Safari rendert een backdrop-filter dan als een grijze waas over de hele
   achtergrond ("vreemde lichte grijze waas rondom het uploadscherm"). De aurora
   houdt z'n eigen gradients + mask, dus de look blijft; alleen de sluier is weg. */
.bg + .grain{ /* aparte overlay via pseudo-element lukt niet overal; gebruik extra div niet nodig – we faken ruis met gradients */
  display:none;
}

/* Glass kaarten en UI */
.wrap{max-width:980px;margin:6vh auto;padding:0 1rem}
.card{
  padding:1.5rem; background:var(--panel); border:1px solid var(--panel-b);
  border-radius:18px; box-shadow:0 18px 40px rgba(0,0,0,.12);
  backdrop-filter: blur(10px) saturate(1.05);
}
h1{line-height:1.15}
.footer{color:var(--muted);margin-top:1.2rem;text-align:center}
.small{font-size:.9rem;color:var(--muted)}

/* Forms/Buttons */
/* Scope tot de form-containers .card/.wrap i.p.v. globaal. Voorheen stylede
   `label{}` ELK <label> op elke base_css-pagina en lekte zo in componenten
   (o.a. de segmented-control labels in transfer.html — de "dikke bezel"-bug).
   De velden in auth/admin staan in .card/.wrap en behouden hun opmaak;
   transfer.html gebruikt .oh-label voor echte labels (eigen styling, hogere
   specificiteit) en bare <label> alleen in componenten, dus dat scherm blijft
   ongemoeid. (De input/select/textarea-globals blijven bewust ongescoped: die
   overschrijven elders al component-styling, dus scopen zou daar wel zichtbaar
   wijzigen.) */
.card label, .wrap label{display:block;margin:.65rem 0 .35rem;font-weight:600;color:var(--text)}
.input, input[type=text], input[type=password], input[type=email], input[type=number],
select, textarea{
  width:100%; display:block; appearance:none;
  /* [MOBIEL 25-08-2026] font:inherit + 1rem. Formuliervelden erven de body-letter
     NIET; zonder deze twee eigenschappen bleef de UA-standaard staan en dat is
     13,3px. Alles onder 16px laat iOS Safari bij focus automatisch inzoomen, en
     daarna zoomt hij niet terug: de bezoeker houdt een uitvergrote pagina over
     die horizontaal schuift. Gemeten op zes velden: /login, /trial/signup en
     /contact. Dat is precies de aanmeldtrechter waar de advertentieklikken
     landen, en elke browser op iOS is WebKit, dus dit raakt ze allemaal.
     1rem en niet 16px, zodat een bezoeker die zijn browserletter groter zet dat
     behoudt. */
  font:inherit; font-size:1rem;
  padding:.85rem 1rem; border-radius:12px; border:1px solid var(--line);
  background:color-mix(in oklab, var(--surface-2) 90%, white 10%); color:var(--text);
  outline:none; transition: box-shadow .15s, border-color .15s, background .15s;
}
input:focus, .input:focus, select:focus, textarea:focus{
  border-color: var(--ring); box-shadow: 0 0 0 4px color-mix(in oklab, var(--ring) 30%, transparent);
}
/* Toetsenbord-focus voor tekstlinks (zichtbare ring alleen bij keyboard-navigatie) */
a:focus-visible{ outline:2px solid var(--ring); outline-offset:2px; border-radius:4px; }
input[type=file]{padding:.55rem 1rem; background:var(--surface-2); cursor:pointer}
input[type=file]::file-selector-button{
  margin-right:.75rem; border:1px solid var(--line);
  background:var(--surface); color:var(--text);
  padding:.55rem .9rem; border-radius:10px; cursor:pointer;
}
.btn{
  padding:.85rem 1.05rem;border:0;border-radius:12px;
  background:linear-gradient(180deg, var(--brand), color-mix(in oklab, var(--brand) 85%, black 15%));
  color:#fff;font-weight:700;cursor:pointer;
  box-shadow:0 4px 14px rgba(15,76,152,.25); transition:filter .15s, transform .02s;
  font-size:.95rem; line-height:1;
}
.btn.small{padding:.55rem .8rem;font-size:.9rem}
.btn:hover{filter:brightness(1.05)}
.btn:active{transform:translateY(1px)}
.btn:focus-visible{ outline:none; box-shadow:0 4px 14px rgba(15,76,152,.25), 0 0 0 3px color-mix(in oklab, var(--ring) 35%, transparent); }
.btn.secondary{background:linear-gradient(180deg, var(--brand-2), color-mix(in oklab, var(--brand-2) 85%, black 15%))}

/* ======= Verfijnde knop-variant (stijl uit header, voor lichte kaarten) ======= */
/* Wordt gebruikt op admin-, foutpagina's en contactformulier, zodat de login-knop (.btn) ongemoeid blijft. */
.btn-pro{
  display:inline-flex; align-items:center; justify-content:center;
  gap:.4rem;
  padding:.6rem 1rem;
  font-size:.9rem; font-weight:600; line-height:1;
  color:var(--text);
  background:color-mix(in oklab, var(--surface) 88%, var(--brand) 12%);
  border:1px solid color-mix(in oklab, var(--line) 70%, var(--brand) 30%);
  border-radius:10px;
  text-decoration:none !important;
  cursor:pointer;
  box-shadow:0 1px 2px rgba(15,23,42,.06), 0 2px 6px rgba(15,23,42,.04);
  transition:background .15s, border-color .15s, box-shadow .15s, transform .02s, color .15s;
  appearance:none;
  -webkit-appearance:none;
}
.btn-pro:hover{
  background:color-mix(in oklab, var(--surface) 75%, var(--brand) 25%);
  border-color:color-mix(in oklab, var(--line) 40%, var(--brand) 60%);
  color:var(--brand);
  text-decoration:none !important;
  box-shadow:0 2px 4px rgba(15,23,42,.08), 0 4px 12px rgba(15,76,152,.12);
}
.btn-pro:active{ transform:translateY(1px); }
.btn-pro:focus-visible{
  outline:none;
  box-shadow:0 0 0 3px color-mix(in oklab, var(--ring) 35%, transparent);
}

/* Primaire variant: gevuld, voor accent-acties (bv. "Aanmaken") */
.btn-pro.primary{
  color:#fff;
  background:linear-gradient(180deg, var(--brand), color-mix(in oklab, var(--brand) 88%, black 12%));
  border-color:color-mix(in oklab, var(--brand) 80%, black 20%);
  box-shadow:0 1px 2px rgba(15,76,152,.25), 0 2px 8px rgba(15,76,152,.18);
}
.btn-pro.primary:hover{
  color:#fff;
  background:linear-gradient(180deg, color-mix(in oklab, var(--brand) 92%, white 8%), var(--brand));
  border-color:color-mix(in oklab, var(--brand) 70%, black 30%);
  box-shadow:0 2px 4px rgba(15,76,152,.28), 0 6px 16px rgba(15,76,152,.22);
}

/* Secundair (subtiel): identiek aan basis .btn-pro, expliciete class voor leesbaarheid */
.btn-pro.secondary{
  color:var(--text);
  background:color-mix(in oklab, var(--surface) 92%, var(--brand) 8%);
  border-color:var(--line);
}
.btn-pro.secondary:hover{
  background:color-mix(in oklab, var(--surface) 80%, var(--brand) 20%);
  color:var(--brand);
  border-color:color-mix(in oklab, var(--line) 50%, var(--brand) 50%);
}

/* Gevaar-variant: voor "Verwijderen" */
.btn-pro.danger{
  color:#b91c1c;
  background:color-mix(in oklab, var(--surface) 92%, #ef4444 8%);
  border-color:color-mix(in oklab, var(--line) 55%, #ef4444 45%);
}
.btn-pro.danger:hover{
  color:#fff;
  background:linear-gradient(180deg, #ef4444, #b91c1c);
  border-color:#991b1b;
  box-shadow:0 2px 4px rgba(185,28,28,.25), 0 6px 16px rgba(185,28,28,.18);
}

/* Kleine variant voor dichtbevolkte toolbars */
.btn-pro.sm{ padding:.45rem .75rem; font-size:.82rem; }

/* Dark mode: iets transparanter zodat het past op glas-kaarten */
@media (prefers-color-scheme: dark){
  .btn-pro{
    color:var(--text);
    background:color-mix(in oklab, var(--surface-2) 70%, var(--brand) 15%);
    border-color:color-mix(in oklab, var(--line) 60%, var(--brand) 40%);
  }
  .btn-pro:hover{
    background:color-mix(in oklab, var(--surface-2) 55%, var(--brand) 30%);
    color:#fff;
  }
  .btn-pro.secondary{
    background:color-mix(in oklab, var(--surface-2) 80%, var(--brand) 10%);
    border-color:var(--line);
  }
}

/* Progress */
.progress{
  height:14px;background:color-mix(in oklab, var(--surface-2) 85%, white 15%);
  border-radius:999px;overflow:hidden;margin-top:.75rem;border:1px solid #dbe5f4; position:relative;
}
.progress > i{
  display:block;height:100%;width:0%;
  background:linear-gradient(90deg,#0f4c98,#1e90ff);
  transition:width .12s ease; position:relative;
}
.progress > i::after{
  content:""; position:absolute; inset:0;
  background-image: linear-gradient(135deg, rgba(255,255,255,.28) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.28) 50%, rgba(255,255,255,.28) 75%, transparent 75%, transparent);
  background-size:24px 24px; animation: stripes 1s linear infinite; mix-blend-mode: overlay;
}
.progress.indet > i{ width:40%; animation: indet-move 1.2s linear infinite; }

@keyframes indet-move{0%{transform:translateX(-100%)}100%{transform:translateX(250%)}}
@keyframes stripes{0%{transform:translateX(0)}100%{transform:translateX(24px)}}

/* Tabel */
.table{width:100%;border-collapse:collapse;margin-top:.6rem}
.table th,.table td{padding:.55rem .7rem;border-bottom:1px solid #e5e7eb;text-align:left}

/* Responsive tabel */
@media (max-width: 680px){
  .table thead{display:none}
  .table, .table tbody, .table tr, .table td{display:block;width:100%}
  .table tr{
    margin-bottom:.75rem;
    background:var(--surface);
    border:1px solid var(--line);
    border-radius:12px;
    padding:.85rem 1rem;
    box-shadow:0 1px 2px rgba(15,23,42,.05);
  }
  .table td{
    border:0;
    padding:.3rem 0;
    display:flex;
    justify-content:space-between;
    align-items:baseline;
    gap:1rem;
    color:var(--text);
    font-size:.92rem;
  }
  .table td:not(:last-child){ border-bottom:1px solid var(--line); }
  .table td[data-label]:before{
    content:attr(data-label);
    font-weight:600;
    color:var(--muted);
    font-size:.82rem;
    flex-shrink:0;
  }
  /* Actie-knoppen krijgen geen label en staan op een eigen regel */
  .table td.actions-col{ justify-content:flex-start; padding-top:.5rem; }
  .table td.actions-col:before{ content:none; }
  .cols-2{ grid-template-columns: 1fr !important; }
}

/* ZIP lijst kolombreedte */
.table th.col-size,
.table td.col-size,
.table td[data-label="Grootte"]{
  white-space:nowrap; text-align:right; min-width:72px;
}

/* Aurora animaties */
@keyframes driftA{
  0%{transform:translate3d(0,0,0) scale(1)}
  50%{transform:translate3d(.6%,1.4%,0) scale(1.03)}
  100%{transform:translate3d(0,0,0) scale(1)}
}
@keyframes driftB{
  0%{transform:rotate(0deg) translateY(0)}
  50%{transform:rotate(180deg) translateY(-1%)}
  100%{transform:rotate(360deg) translateY(0)}
}
/* Kleurverschuiving over tijd */
@keyframes hueShift{
  0%{filter:hue-rotate(0deg) saturate(1.06)}
  100%{filter:hue-rotate(360deg) saturate(1.06)}
}

/* Respecteer reduced motion */
@media (prefers-reduced-motion: reduce){
  .bg, .bg::before, .bg::after{ animation: none !important; }
}
