/* Summary: styling van de publieke site — thema "Nachtdienst" (donker als basis, licht als
   keuze). Alle kleuren staan als custom properties op :root; een component-regel verwijst nooit
   naar een letterlijke kleur, zodat het lichte thema puur een set andere tokens is en niet een
   tweede stylesheet. Het actieve thema staat als data-theme op <html> (zie js/theme.js) — zonder
   dat attribuut geldt donker.
   Let op: dit bestand raakt ALLEEN de publieke site. De CRM heeft z'n eigen admin.css en is bij
   deze restyle bewust ongemoeid gelaten.
   Keywords: publieke site, styling, thema, dark mode, light mode, data-theme, restyle */

/* ============================================================================================
   1. Thematokens
   --brand      = amber vlak (knoppen) — het signaal van dit thema
   --brand-text = dezelfde amber, maar als tekstkleur; op een lichte achtergrond moet die
                  donkerder zijn, anders is 'ie niet te lezen
   --accent     = koel cyaan/petrol voor links, labels en data
   ============================================================================================ */

:root {
    color-scheme: dark;

    --bg: #0A1220;
    --bg-alt: #0E1929;
    --surface: #131F32;
    --surface-2: #18273D;
    --surface-input: #0C1524;

    --line: #24344E;
    --line-strong: #35507A;

    --brand: #F5A524;
    --brand-hover: #FFB944;
    --brand-text: #F5A524;
    --on-brand: #16202F;

    --accent: #38D6C4;
    --accent-soft: rgba(56, 214, 196, .08);
    --accent-border: rgba(56, 214, 196, .22);

    --text: #C3D0E2;
    --text-bright: #F2F6FC;
    --muted: #7E90AA;
    --placeholder: #55688A;

    --star: #F5A524;

    --ok-bg: rgba(16, 185, 129, .10);
    --ok-border: rgba(52, 211, 153, .38);
    --ok-text: #6EE7B7;

    --bad-bg: rgba(239, 68, 68, .10);
    --bad-border: rgba(248, 113, 113, .38);
    --bad-text: #FCA5A5;

    /* Boekingskalender. --cal-open is "hier kan iets", --cal-split is de andere helft van een
       halve dag (in het donkere thema mag dat geen wit vlak zijn). */
    --cal-open: #0E9F8B;
    --cal-open-text: #04231F;
    --cal-full: #B4332F;
    --cal-full-text: #FFE8E6;
    --cal-split: #1B2B42;
    --cal-closed: #182740;
    --cal-closed-text: #5D708C;

    /* Half-doorzichtige kop; als losse token omdat color-mix() hier niet nodig is en een rgba()
       per thema gewoon overal werkt. */
    --nav-bg: rgba(10, 18, 32, .84);

    --glow-warm: rgba(245, 165, 36, .16);
    --glow-cool: rgba(56, 214, 196, .12);
    --grid-line: rgba(53, 80, 122, .16);
    --media-placeholder: #172641;
    --media-filter: saturate(.85) contrast(1.05);

    --radius: 10px;
    --radius-sm: 7px;
    --shadow: none;

    --sans: system-ui, "Segoe UI", Roboto, Arial, sans-serif;
    --mono: ui-monospace, "Cascadia Mono", Consolas, "Courier New", monospace;
}

/* Lichte variant: hetzelfde merk, alleen omgedraaid. Geen blauw-uit-de-oude-stijl maar dezelfde
   amber/petrol, in tinten die op papierwit leesbaar zijn. */
:root[data-theme="light"] {
    color-scheme: light;

    --bg: #F7F9FC;
    --bg-alt: #ECF1F8;
    --surface: #FFFFFF;
    --surface-2: #F4F7FB;
    --surface-input: #FFFFFF;

    --line: #DEE6F0;
    --line-strong: #BFCDDF;

    --brand: #F0A01B;
    --brand-hover: #DB8E0C;
    --brand-text: #96590A;
    --on-brand: #1B1305;

    --accent: #0F766E;
    --accent-soft: rgba(15, 118, 110, .07);
    --accent-border: rgba(15, 118, 110, .22);

    --text: #43536A;
    --text-bright: #101E33;
    --muted: #64748B;
    --placeholder: #94A3B8;

    --star: #D98A0B;

    --ok-bg: #ECFDF5;
    --ok-border: #A7F3D0;
    --ok-text: #065F46;

    --bad-bg: #FEF2F2;
    --bad-border: #FECACA;
    --bad-text: #991B1B;

    --cal-open: #0E9F8B;
    --cal-open-text: #FFFFFF;
    --cal-full: #DC2626;
    --cal-full-text: #FFFFFF;
    --cal-split: #FFFFFF;
    --cal-closed: #E4EAF2;
    --cal-closed-text: #94A3B8;

    --nav-bg: rgba(247, 249, 252, .88);

    --glow-warm: rgba(240, 160, 27, .16);
    --glow-cool: rgba(15, 118, 110, .10);
    --grid-line: rgba(15, 30, 51, .06);
    --media-placeholder: #DCE7F4;
    --media-filter: none;

    --shadow: 0 1px 2px rgba(15, 30, 51, .04), 0 10px 26px -14px rgba(15, 30, 51, .16);
}

/* ============================================================================================
   2. Basis
   ============================================================================================ */

* { margin: 0; padding: 0; box-sizing: border-box; }

body {
    font-family: var(--sans);
    font-size: 17px;
    line-height: 1.68;
    color: var(--text);
    background: var(--bg);
    -webkit-font-smoothing: antialiased;
}

h1, h2, h3 { color: var(--text-bright); line-height: 1.2; letter-spacing: -.02em; }
h1 { font-size: clamp(2rem, 5vw, 3.3rem); font-weight: 700; }
h2 { font-size: clamp(1.45rem, 3vw, 2.1rem); font-weight: 680; }
h3 { font-size: 1.12rem; font-weight: 650; }

a { color: var(--accent); }

code {
    font-family: var(--mono);
    font-size: .9em;
    background: var(--surface-2);
    border: 1px solid var(--line);
    border-radius: 5px;
    padding: 1px 6px;
}

.container { width: 90%; max-width: 1160px; margin: auto; }

/* Sprongdoel van een ankerlink: de plakkende kop mag de bovenkant niet bedekken. */
.block-anchor { scroll-margin-top: 90px; }

/* Vangnet: geen enkele afbeelding op de publieke site mag buiten z'n kolom vallen. */
.section img { max-width: 100%; }

/* Zichtbare focus, in beide thema's. Zonder dit is toetsenbordbediening op donker niet te volgen. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
    * { transition: none !important; animation: none !important; }
}

/* ============================================================================================
   3. Navigatie + themaknop
   ============================================================================================ */

.site-nav {
    background: var(--nav-bg);
    backdrop-filter: blur(12px);
    border-bottom: 1px solid var(--line);
    position: sticky;
    top: 0;
    z-index: 10;
}

.site-nav .container {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 20px;
    padding: 15px 0;
}

.site-nav .brand {
    font-weight: 650;
    font-size: .96rem;
    color: var(--text-bright);
    text-decoration: none;
    display: flex;
    align-items: center;
    gap: 11px;
    letter-spacing: -.01em;
}

/* Merkteken: amber blokje met een cyaan hoek. Puur CSS — geen logo-afbeelding om te laden. */
.site-nav .brand::before {
    content: "";
    width: 24px;
    height: 24px;
    border-radius: 6px;
    flex: none;
    background: var(--brand);
    box-shadow: inset -6px -6px 0 0 var(--accent);
}

.site-nav ul { list-style: none; display: flex; gap: 2px; flex-wrap: wrap; align-items: center; }

.site-nav a {
    color: var(--text);
    text-decoration: none;
    font-weight: 500;
    font-size: .94rem;
    padding: 8px 13px;
    border-radius: var(--radius-sm);
    display: block;
}

.site-nav a:hover { color: var(--brand-text); background: var(--surface); }

/* Themaknop. Staat in dezelfde <ul> als de navigatie, dus valt op een smal scherm gewoon mee.
   De twee icoontjes staan allebei in de markup; CSS kiest welke past bij het actieve thema —
   zo hoeft theme.js alleen data-theme te zetten en niets aan de knop te veranderen. */
.theme-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    margin-left: 6px;
    background: transparent;
    color: var(--muted);
    border: 1px solid var(--line);
    border-radius: var(--radius-sm);
    cursor: pointer;
    transition: color .18s ease, border-color .18s ease, background .18s ease;
}

.theme-toggle:hover { color: var(--brand-text); border-color: var(--line-strong); background: var(--surface); }
.theme-toggle svg { width: 18px; height: 18px; display: block; }

/* Donker actief → toon de zon (klik = naar licht). Licht actief → toon de maan. */
.theme-toggle .theme-icon-light { display: none; }
:root[data-theme="light"] .theme-toggle .theme-icon-light { display: block; }
:root[data-theme="light"] .theme-toggle .theme-icon-dark { display: none; }

/* Zonder JavaScript kan het thema niet gewisseld worden; dan hoort de knop er ook niet te staan
   (theme.js haalt de klasse weg zodra het draait). */
.theme-toggle.theme-toggle-unavailable { display: none; }

/* ============================================================================================
   4. Hero
   ============================================================================================ */

.hero {
    position: relative;
    overflow: hidden;
    color: var(--text);
    background: var(--bg);
    border-bottom: 1px solid var(--line);
    padding: 108px 20px 116px;
    text-align: left;
}

/* Warme gloed rechtsboven, koele linksonder: diepte zonder een afbeelding te laden. */
.hero::before {
    content: "";
    position: absolute;
    inset: 0;
    background:
        radial-gradient(760px 420px at 78% 12%, var(--glow-warm), transparent 62%),
        radial-gradient(620px 420px at 6% 92%, var(--glow-cool), transparent 66%);
}

/* Fijn raster dat naar de randen wegvalt — verwijst naar planborden/routes. */
.hero::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image:
        linear-gradient(var(--grid-line) 1px, transparent 1px),
        linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
    background-size: 56px 56px;
    mask-image: radial-gradient(ellipse 90% 70% at 50% 40%, #000, transparent);
    -webkit-mask-image: radial-gradient(ellipse 90% 70% at 50% 40%, #000, transparent);
}

.hero .container { position: relative; z-index: 1; max-width: 880px; }
.hero h1 { margin-bottom: 22px; }
.hero p { font-size: 1.16rem; max-width: 640px; color: var(--muted); }

/* ============================================================================================
   5. Secties
   ============================================================================================ */

.section { padding: 78px 20px; }

/* Een haarlijn tussen twee secties in plaats van afwisselende achtergronden: de volgorde van de
   blokken komt uit de page-builder, dus een :nth-of-type-bandering zou verschuiven zodra iemand
   een sectie verbergt of verplaatst. */
.section + .section { border-top: 1px solid var(--line); }

.section > .container > h2 { margin-bottom: 12px; }

/* Introtekst direct onder een sectiekop (PortfolioGrid, Reviews). */
.section > .container > h2 + p { max-width: 640px; margin: 0 0 40px; color: var(--muted); }
.section > .container > h2 + .grid,
.section > .container > h2 + .process { margin-top: 40px; }

/* ============================================================================================
   6. Kaarten (CardsGrid)
   ============================================================================================ */

.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 20px; }

.card {
    background: var(--surface);
    padding: 30px 28px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    position: relative;
    overflow: hidden;
    transition: transform .2s ease, border-color .2s ease, background .2s ease;
}

/* Amber streep links die bij hover volledig oplicht. */
.card::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 3px;
    background: var(--brand);
    opacity: .4;
    transition: opacity .2s ease;
}

.card:hover { transform: translateY(-3px); border-color: var(--line-strong); background: var(--surface-2); }
.card:hover::before { opacity: 1; }

.card h3 { margin-bottom: 16px; }
.card ul { list-style: none; }

.card ul li {
    margin-bottom: 10px;
    padding-left: 24px;
    position: relative;
    font-size: .96rem;
}

/* Pijl in plaats van een vinkje: bij een lijst diensten is "→" passender dan "afgevinkt". */
.card ul li::before {
    content: "\2192";
    position: absolute;
    left: 0;
    top: 0;
    color: var(--accent);
    font-weight: 700;
}

/* ============================================================================================
   7. Uitgelicht blok + rijke tekst
   ============================================================================================ */

.highlight {
    background: var(--surface);
    border: 1px solid var(--line);
    border-left: 3px solid var(--brand);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    padding: 30px 32px;
    margin-top: 26px;
}

.rich-content { max-width: 760px; }
.rich-content p { margin-bottom: 18px; }
.rich-content h2, .rich-content h3 { margin: 28px 0 12px; }
.rich-content ul, .rich-content ol { margin: 0 0 18px 24px; }
.rich-content li { margin-bottom: 8px; }
.rich-content strong { color: var(--text-bright); }

.rich-content blockquote {
    border-left: 2px solid var(--accent);
    margin: 22px 0;
    padding: 6px 22px;
    color: var(--text-bright);
    font-style: italic;
}

.rich-content a { color: var(--accent); text-underline-offset: 3px; }

.rich-content img {
    max-width: 100%;
    height: auto;
    border-radius: var(--radius);
    margin: 20px 0;
}

/* ============================================================================================
   8. Processtappen
   ============================================================================================ */

.process { display: flex; flex-wrap: wrap; gap: 18px; }

.step {
    background: var(--surface);
    flex: 1 1 230px;
    max-width: 290px;
    padding: 26px 24px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    text-align: left;
}

.step h3 { margin-bottom: 8px; }
.step p { font-size: .94rem; color: var(--muted); }

/* Genummerde stap als monospace-teller met een lijntje erachter: technisch, geen bolletje.
   De "0" komt uit CSS zodat de view gewoon het echte stapnummer blijft renderen. */
.step-number {
    background: transparent;
    color: var(--brand-text);
    width: auto;
    height: auto;
    margin: 0 0 14px;
    display: flex;
    align-items: center;
    gap: 10px;
    font-family: var(--mono);
    font-size: .82rem;
    font-weight: 700;
    letter-spacing: .12em;
}

.step-number::before { content: "0"; }
.step-number::after { content: ""; flex: 1; height: 1px; background: var(--line-strong); }

/* ============================================================================================
   9. Afbeelding met tekst
   ============================================================================================ */

.image-with-text { display: flex; align-items: center; gap: 48px; flex-wrap: wrap; }
.image-with-text-reverse { flex-direction: row-reverse; }
.image-with-text-text, .image-with-text-image { flex: 1 1 320px; }
.image-with-text-text h2 { margin-bottom: 16px; }

.image-with-text-image img {
    width: 100%;
    border-radius: var(--radius);
    border: 1px solid var(--line);
    filter: var(--media-filter);
}

/* ============================================================================================
   10. Call to action + knoppen
   ============================================================================================ */

.cta {
    text-align: center;
    padding: 84px 20px;
    color: var(--text);
    background: var(--bg-alt);
    border-top: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
    position: relative;
    overflow: hidden;
}

.cta::before {
    content: "";
    position: absolute;
    inset: 0;
    background: radial-gradient(700px 300px at 50% 0%, var(--glow-warm), transparent 70%);
}

.cta .container { position: relative; z-index: 1; }
.cta h2 { margin-bottom: 14px; }
.cta p { color: var(--muted); max-width: 620px; margin: 0 auto; }

.button {
    display: inline-block;
    margin-top: 20px;
    padding: 14px 30px;
    background: var(--brand);
    color: var(--on-brand);
    text-decoration: none;
    border-radius: var(--radius-sm);
    font-weight: 700;
    font-size: 1rem;
    border: none;
    cursor: pointer;
    transition: background .18s ease, transform .18s ease;
}

.button:hover { background: var(--brand-hover); transform: translateY(-2px); }

/* Maandnavigatie op de boekingspagina: een kale tekstlink als knop. */
.link-button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 34px;
    padding: 4px 10px;
    border: 1px solid var(--line-strong);
    border-radius: var(--radius-sm);
    color: var(--text-bright);
    text-decoration: none;
    font-weight: 600;
}

.link-button:hover { background: var(--surface-2); border-color: var(--accent); }

/* Kleine toelichting onder een formulier of op een foutpagina. */
.admin-note { color: var(--muted); font-size: .9rem; }

/* ============================================================================================
   11. Formulieren (contactformulier, review, boeking)
   ============================================================================================ */

.contact-form {
    max-width: 640px;
    margin: 0 auto;
    background: var(--surface);
    padding: 32px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    color: var(--text);
}

.contact-form label {
    display: block;
    margin-bottom: 7px;
    color: var(--muted);
    font-family: var(--mono);
    font-size: .74rem;
    letter-spacing: .11em;
    text-transform: uppercase;
}

/* Radio's en checkboxen bewust uitgesloten: width:100% op een radiobutton rekt 'm uit tot volle
   breedte en duwt het labeltekstje op een eigen regel (zie de valkuil in CLAUDE.md). */
.contact-form input:not([type="radio"]):not([type="checkbox"]),
.contact-form select,
.contact-form textarea {
    width: 100%;
    padding: 11px 13px;
    margin-bottom: 18px;
    border: 1px solid var(--line-strong);
    border-radius: var(--radius-sm);
    font-family: inherit;
    font-size: 1rem;
    background: var(--surface-input);
    color: var(--text-bright);
}

.contact-form textarea { resize: vertical; }

.contact-form input::placeholder,
.contact-form textarea::placeholder { color: var(--placeholder); }

.contact-form input:focus,
.contact-form select:focus,
.contact-form textarea:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--accent-soft);
}

/* Rijen met een radio/checkbox (werktype-, duur- en dagkeuze op de boekingspagina). */
.contact-form label.checkbox-label {
    display: flex;
    align-items: center;
    gap: 8px;
    font-family: var(--sans);
    font-size: 1rem;
    letter-spacing: normal;
    text-transform: none;
    color: var(--text);
    font-weight: 400;
    margin-bottom: 10px;
}

.contact-form label.checkbox-label input[type="radio"],
.contact-form label.checkbox-label input[type="checkbox"] {
    width: auto;
    margin: 0;
    accent-color: var(--brand);
}

/* Honeypot: onzichtbaar voor een bezoeker, bots vullen 'm wel in. */
.contact-form .honeypot-field {
    position: absolute;
    left: -9999px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

.alert-success {
    background: var(--ok-bg);
    border: 1px solid var(--ok-border);
    color: var(--ok-text);
    padding: 14px 16px;
    border-radius: var(--radius-sm);
    margin-bottom: 20px;
}

.alert-error {
    background: var(--bad-bg);
    border: 1px solid var(--bad-border);
    color: var(--bad-text);
    padding: 14px 16px;
    border-radius: var(--radius-sm);
    margin-bottom: 20px;
}

.alert-error ul { margin: 0; padding-left: 20px; list-style: none; }

/* Foutmelding per veld. ASP.NET Core zet zelf de klasse op de <span> (field-validation-error als er
   iets mis is, field-validation-valid als niet) en op het invoerveld zelf
   (input-validation-error) — er is geen client-side validatielibrary, dus dít is wat een bezoeker
   te zien krijgt.
   De negatieve bovenmarge trekt de melding onder z'n eigen veld: het invoerveld erboven heeft
   margin-bottom 18px, waardoor de tekst anders dichter bij het volgende label komt te staan dan bij
   het veld waar 'ie over gaat. */
.contact-form .field-validation-error {
    display: block;
    margin: -14px 0 16px;
    color: var(--bad-text);
    font-size: .88rem;
}

.contact-form input.input-validation-error,
.contact-form select.input-validation-error,
.contact-form textarea.input-validation-error {
    border-color: var(--bad-border);
    background: var(--bad-bg);
}

/* Melding die niet uit de modelvalidatie komt (netwerk eruit, ratelimiet) — gevuld door
   contactform.js, verborgen zolang er niets aan de hand is. */
.contact-form-status {
    margin: 14px 0 0;
    color: var(--bad-text);
    font-size: .9rem;
}

/* Knop tijdens het versturen. */
.contact-form .button:disabled {
    opacity: .65;
    cursor: progress;
    transform: none;
}

/* Geen foutbalk als er geen fout is. Een lege validatiesamenvatting rendert alsnog
   <ul><li style="display:none"></li></ul>, dus :empty vangt 'm niet — de klasse die ASP.NET Core
   er zelf op zet wel. */
.alert-error:empty,
.alert-error.validation-summary-valid { display: none; }

/* ============================================================================================
   12. Boekingskalender (/afspraak/{token})
   Elke dag blijft een echte (eventueel disabled) radiobutton; de halve-dag-diagonaal is pure CSS.
   ============================================================================================ */

.booking-calendar-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 6px;
    margin-bottom: 10px;
}

.booking-calendar-weekday {
    text-align: center;
    font-family: var(--mono);
    font-weight: 600;
    font-size: .72rem;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--muted);
    padding: 4px 0;
}

.contact-form label.booking-day {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    aspect-ratio: 1;
    border: 1px solid var(--line);
    border-radius: 8px;
    font-family: var(--sans);
    font-size: 1rem;
    letter-spacing: normal;
    text-transform: none;
    font-weight: 600;
    color: var(--text-bright);
    margin-bottom: 0;
    overflow: hidden;
}

/* De radio bedekt het hele vlak maar is onzichtbaar: de dag zelf is het klikdoel — een kaal
   radiorondje is met een vinger niet te raken. */
.booking-day input[type="radio"] {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: not-allowed;
}

.booking-day input[type="radio"]:not(:disabled) { cursor: pointer; }

.booking-day:has(input:checked),
.booking-day:has(input:focus-visible) {
    outline: 3px solid var(--brand);
    outline-offset: 2px;
}

.booking-day-number { pointer-events: none; position: relative; z-index: 1; }

.booking-day-full { background: var(--cal-open); color: var(--cal-open-text); border-color: var(--cal-open); }
.booking-day-none { background: var(--cal-full); color: var(--cal-full-text); border-color: var(--cal-full); }

/* Linksboven open = ochtend beschikbaar; rechtsonder open = middag. */
.booking-day-morning { background: linear-gradient(135deg, var(--cal-open) 50%, var(--cal-split) 50%); }
.booking-day-afternoon { background: linear-gradient(135deg, var(--cal-split) 50%, var(--cal-open) 50%); }

.booking-day-closed { background: var(--cal-closed); color: var(--cal-closed-text); border-color: var(--cal-closed); }
.booking-day-other-month { opacity: .35; }

.booking-calendar-legend-dot {
    display: inline-block;
    width: 12px;
    height: 12px;
    border-radius: 3px;
    margin-right: 4px;
    vertical-align: middle;
    border: 1px solid var(--line-strong);
}

/* ============================================================================================
   13. Portfolio (PortfolioGrid-blok, gevuld door de portfoliomodule)
   ============================================================================================ */

.portfolio-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
    margin-top: 24px;
}

.portfolio-card {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition: border-color .2s ease, transform .2s ease;
}

.portfolio-card:hover { border-color: var(--line-strong); transform: translateY(-3px); }

.portfolio-card-image {
    width: 100%;
    /* Vaste verhouding i.p.v. een vaste hoogte: een staande foto wordt zo netjes bijgesneden in
       plaats van uitgerekt, en de kaarten in de grid blijven even hoog. */
    aspect-ratio: 3 / 2;
    object-fit: cover;
    object-position: center;
    display: block;
    background: var(--media-placeholder);
    filter: var(--media-filter);
}

.portfolio-card-body { padding: 22px 24px; }
.portfolio-card-body h3 { margin: 0 0 6px; }
.portfolio-card-body p { font-size: .94rem; margin-bottom: 10px; }
.portfolio-card-body strong { color: var(--text-bright); }

.portfolio-sector {
    font-family: var(--mono);
    color: var(--accent);
    font-size: .74rem;
    letter-spacing: .13em;
    text-transform: uppercase;
    margin: 0 0 14px;
}

.portfolio-tags {
    list-style: none;
    padding: 0;
    margin: 16px 0 0;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.portfolio-tags li {
    background: var(--accent-soft);
    color: var(--accent);
    border: 1px solid var(--accent-border);
    border-radius: 5px;
    padding: 3px 10px;
    font-size: .8rem;
    font-family: var(--mono);
}

.portfolio-anonymous {
    font-size: .84rem;
    color: var(--muted);
    font-style: italic;
    margin-top: 12px;
}

/* Extra afbeeldingen onder een case: kleine, klikbare thumbnails. */
.portfolio-thumbs { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 0; }

.portfolio-thumbs img {
    width: 84px;
    height: 63px;
    object-fit: cover;
    border-radius: 6px;
    display: block;
    background: var(--media-placeholder);
    border: 1px solid var(--line);
}

/* ============================================================================================
   14. Reviews (TestimonialsCarousel-blok, alleen goedgekeurde reviews)
   ============================================================================================ */

.review-average { font-size: 1rem; margin-bottom: 26px; color: var(--muted); }
.review-average strong { color: var(--brand-text); }

.review-list {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
    gap: 20px;
}

.review-card {
    background: var(--surface);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    padding: 26px;
    margin: 0;
}

.review-stars { color: var(--star); letter-spacing: .1em; margin-bottom: 12px; }
.review-card blockquote { margin: 0 0 16px; color: var(--text-bright); font-style: normal; }
.review-card figcaption strong { color: var(--text-bright); }
.review-author-meta { display: block; color: var(--muted); font-size: .88rem; }
.review-cta { margin-top: 26px; }

/* ============================================================================================
   15. Footer
   ============================================================================================ */

.site-footer {
    background: var(--bg-alt);
    color: var(--muted);
    text-align: center;
    padding: 40px 20px;
    font-size: .9rem;
    border-top: 1px solid var(--line);
}

.site-footer a { color: var(--text); }

/* ============================================================================================
   16. Smalle schermen
   ============================================================================================ */

@media (max-width: 768px) {
    body { font-size: 16px; }

    .site-nav .container { flex-direction: column; align-items: flex-start; gap: 10px; }
    .site-nav ul { margin-left: -13px; }
    .theme-toggle { margin-left: 0; }

    .hero { padding: 70px 20px 78px; }
    .section { padding: 56px 20px; }
    .cta { padding: 60px 20px; }

    .step { max-width: none; }
    .image-with-text { gap: 26px; }
    .contact-form { padding: 22px; }
}
