/* ═══════════════════════════════════════════════════════════════════════════
   BARA DE CONSIMȚĂMÂNT COOKIE + CONFIRMARE 18+

   ⚠️ ASTA NU E PARITATE. E O ADĂUGARE DELIBERATĂ, cerută de owner 2026-09-04.

   Producția CakePHP avea un banner de cookie-uri (`Elements/footer.ctp:158-185`
   + `webroot/js/cookie.js`), pe care portul NU l-a preluat: Faza 1 nu avea voie
   să scrie niciun cookie. După cutover-ul din 2026-09-03 asta a lăsat site-ul
   fără NICIUN mecanism de consimțământ, cu containerul GTM încărcat la fiecare
   vizită. În plus, PayU a cerut un mecanism de confirmare a vârstei.

   NU e o portare a bannerului vechi. Acela era o cutie de 240px lipită
   stânga-jos (`public/css/legacy/cookie.css`, care se încarcă în continuare pe
   fiecare pagină prin `LegacyStylesheets` și rămâne INERTĂ — n-are markup).
   De aceea toate clasele de aici sunt `shop-consent-*`: zero coliziune cu
   `.cc-wrapper`, `.cc-message`, `.x-agree`, `.more-info`, `.switch`, `.slider`.

   ── DE CE Z-INDEX 1035, ȘI NU 9999 CA BANNERUL VECHI ──────────────────────
   Scara reală a storefront-ului, măsurată prin grep pe toate foile:

       900   .shop-sticky-cart          (bara „Adaugă în coș", pagina de produs)
      1000   #header
      1035   ← BARA ASTA
      1040   scrimul sertarelor         (shop-filters.css:193, account:324)
      1045   sertarul de filtre / cont  (shop-filters.css:163, account:298)
     10000   notificarea de coș
     10001   panoul de sugestii de căutare

   Butoanele „Șterge filtre" / „Aplică filtrele" stau JOS în sertarul de filtre
   (`.shop-filters-foot`, `filters.blade.php:139`). O bară la 9999 le-ar acoperi
   pe fiecare pagină de catalog, pe telefon. La 1035 bara trece cuminte în
   spatele scrimului când se deschide un sertar, iar în rest e cel mai de sus
   element fix. Zero JavaScript pentru asta.

   ── AFIȘAREA E CONDIȚIONATĂ DE O CLASĂ PE <html>, NU DE JS ────────────────
   Clasa `shop-consent-ask` / `shop-consent-done` e pusă de scriptul SINCRON din
   `<head>` (`shop/layout.blade.php`), înainte de primul paint. Consecințe, toate
   dorite:
     1. zero pâlpâire pentru cine a ales deja — bara n-are cutie nicio
        milisecundă; nu e „se arată și se ascunde", e „nu se randează";
     2. HTML identic pentru toți vizitatorii — doar clasa diferă, iar ea se
        calculează în browser. Nicio variație server-side, niciun `Vary: Cookie`;
     3. fără JavaScript bara nu apare — și e corect: fără JS nici `gtm.js` nu se
        încarcă, deci nu se scrie niciun cookie neesențial. Nu există la ce
        consimți.

   Culorile sunt cele deja folosite de `shop-sticky-cart.css` (#cd0018 / #ffffff
   / #999999). Zero culori noi în proiect.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ── 1. Cutia barei ──────────────────────────────────────────────────────── */

.shop-consent {
    display: none;
}

html.shop-consent-ask .shop-consent {
    display: block;
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1035;
    box-sizing: border-box;
    background: #ffffff;
    border-top: 1px solid #e0e0e0;
    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.12);
    /* `env(safe-area-inset-bottom)` — bara de gesturi de pe iPhone-urile fără
       buton fizic. Pe orice altceva `env()` e 0px și nu schimbă nimic. */
    padding: 12px 16px;
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
}

.shop-consent * {
    box-sizing: border-box;
}


/* ── 2. Rândul principal: text la stânga, butoane la dreapta ─────────────── */

.shop-consent-main {
    display: flex;
    align-items: center;
    gap: 16px;
    max-width: 1240px;
    margin: 0 auto;
}

.shop-consent-text {
    flex: 1 1 auto;
    margin: 0;
    color: #212529;
    font-size: 12px;
    line-height: 1.45;
}

.shop-consent-age {
    display: inline-block;
    margin-right: 6px;
    padding: 1px 6px;
    border-radius: 3px;
    background: #cd0018;
    color: #ffffff;
    font-size: 11px;
    font-weight: 700;
    vertical-align: 1px;
}

.shop-consent-text a {
    color: #cd0018;
    text-decoration: underline;
}

/* Cele două variante de frază. Implicit se vede cea lungă; media query-ul de la
   §7 le inversează. Motivul e măsurat: cu varianta lungă bara ocupa 257px la
   375×812, adică 32% din ecran — împotriva cerinței „să nu fie deloc invazivă". */
.shop-consent-short {
    display: none;
}


/* ── 3. Butoanele ────────────────────────────────────────────────────────── */
/* Acceptul și refuzul au ACEEAȘI înălțime și ACELAȘI `font-size`. Nu e o
   preferință estetică: Ghidul EDPB 03/2022 privind tiparele înșelătoare, și
   amenzile CNIL din ianuarie 2022 (Google 150 mil. €, Meta 60 mil. €), au ca
   obiect exact refuzul făcut mai greu decât acceptul. Diferă doar culoarea. */

.shop-consent-actions {
    display: flex;
    align-items: center;
    gap: 10px;
    flex: 0 0 auto;
}

.shop-consent-accept,
.shop-consent-reject {
    min-height: 40px;
    padding: 8px 16px;
    border-radius: 4px;
    font-size: 13px;
    font-weight: 600;
    line-height: 1.2;
    cursor: pointer;
    white-space: nowrap;
}

.shop-consent-accept {
    border: 1px solid #cd0018;
    background: #cd0018;
    color: #ffffff;
}

.shop-consent-reject {
    border: 1px solid #999999;
    background: #ffffff;
    color: #333333;
}

/* Setarile sunt un control TERTIAR si traiesc in fluxul textului, langa
   "Detalii" si "Termeni". Arata ca ele (aceeasi culoare, subliniat), dar raman
   `<button>`. Padding-ul vertical le da o tinta de atingere de 44px; fiind
   `inline-block`, el CHIAR dilata randul — de asta stau pe randul de linkuri,
   unde costul se plateste o singura data, nu pe un rand propriu de 44px.
   Padding-ul mare e DOAR pe telefon (vezi media query-ul de la §7): pe desktop
   se apasa cu mausul, 44px nu sunt necesari, iar padding-ul dilata randul cu
   24px degeaba. Masurat: bara desktop 120px cu padding mobil, 96px asa. */
.shop-consent-settings {
    display: inline-block;
    padding: 2px;
    border: 0;
    background: none;
    color: #cd0018;
    font: inherit;
    text-decoration: underline;
    cursor: pointer;
    white-space: nowrap;
    vertical-align: baseline;
}

.shop-consent-accept:focus-visible,
.shop-consent-reject:focus-visible,
.shop-consent-settings:focus-visible,
.shop-consent-panel button:focus-visible,
.shop-consent-toggle input:focus-visible + .shop-consent-knob {
    outline: 2px solid #005fcc;
    outline-offset: 2px;
}


/* ── 4. Panoul „Setări" ──────────────────────────────────────────────────── */
/* Crește bara ÎN SUS. Nu e un modal: fără scrim, fără blocarea derulării.
   Înălțimea barei se schimbă când se deschide, de aceea `shop-consent.js` o
   remăsoară cu `ResizeObserver` și republică `--shop-consent-h`. */

.shop-consent-panel {
    max-width: 1240px;
    margin: 0 auto 12px;
    padding-bottom: 12px;
    border-bottom: 1px solid #e9ecef;
    /* Cu două categorii nu se atinge niciodată, dar protejează dacă apar mai multe. */
    max-height: 45vh;
    overflow-y: auto;
}

.shop-consent-panel[hidden] {
    display: none;
}

.shop-consent-panel-intro {
    margin: 0 0 10px;
    color: #555555;
    font-size: 12px;
    line-height: 1.45;
}

.shop-consent-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 8px 0;
    border-top: 1px solid #f1f3f5;
}

.shop-consent-row:first-of-type {
    border-top: 0;
}

.shop-consent-row-name {
    color: #212529;
    font-size: 13px;
    font-weight: 600;
}

.shop-consent-row-note {
    display: block;
    color: #6c757d;
    font-size: 11px;
    font-weight: 400;
    line-height: 1.4;
}

/* Comutatorul. `<input type="checkbox">` REAL, ascuns vizual dar NU cu
   `display:none` — altfel iese din ordinea de tabulare și devine inaccesibil
   de la tastatură. Ținta de atingere e eticheta, 44×44. */
.shop-consent-toggle {
    position: relative;
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 44px;
    cursor: pointer;
}

.shop-consent-toggle input {
    position: absolute;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
}

.shop-consent-knob {
    position: relative;
    display: block;
    width: 44px;
    height: 24px;
    border-radius: 12px;
    background: #adb5bd;
    transition: background 0.15s ease;
}

.shop-consent-knob::before {
    content: "";
    position: absolute;
    top: 3px;
    left: 3px;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: #ffffff;
    transition: transform 0.15s ease;
}

.shop-consent-toggle input:checked + .shop-consent-knob {
    background: #cd0018;
}

.shop-consent-toggle input:checked + .shop-consent-knob::before {
    transform: translateX(20px);
}

.shop-consent-panel-actions {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-top: 12px;
}

.shop-consent-all,
.shop-consent-none {
    min-height: 40px;
    padding: 8px 12px;
    border: 1px solid #ced4da;
    border-radius: 4px;
    background: #ffffff;
    color: #333333;
    font-size: 12px;
    cursor: pointer;
}

.shop-consent-save {
    min-height: 40px;
    margin-left: auto;
    padding: 8px 20px;
    border: 1px solid #cd0018;
    border-radius: 4px;
    background: #cd0018;
    color: #ffffff;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}

.shop-consent-panel-note {
    margin: 8px 0 0;
    color: #6c757d;
    font-size: 11px;
}


/* ── 5. Butonul de retragere din subsol ──────────────────────────────────── */
/* Randat de `partials/footer.blade.php` cu `hidden`; JS îl dezvăluie. Trebuie
   să arate ca ancorele albe din jurul lui (ANPC, SAL, SOL). Retragerea
   consimțământului trebuie să fie la fel de ușoară ca acordarea lui. */

.shop-consent-reopen {
    padding: 0;
    border: 0;
    background: none;
    color: #ffffff;
    font: inherit;
    text-decoration: underline;
    cursor: pointer;
}


/* ── 6. Voalul blocant — LIVRAT DORMANT ──────────────────────────────────── */
/* Inert cât timp `shop-consent-blocking` lipsește de pe <html>. Se aprinde din
   `.env` cu `SHOP_CONSENT_BLOCKING=true`, dacă PayU respinge varianta
   non-blocantă. Ambele clase vin din scriptul sincron din `<head>`, deci și
   voalul apare fără flash — nu există o milisecundă de conținut navigabil.
   Stă la 1034, adică IMEDIAT sub bară: bara rămâne singurul lucru clicabil. */

.shop-consent-veil {
    display: none;
}

html.shop-consent-blocking.shop-consent-ask .shop-consent-veil {
    display: block;
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1034;
    background: rgba(0, 0, 0, 0.65);
}

html.shop-consent-blocking.shop-consent-ask body {
    overflow: hidden;
}


/* ── 7. Spațiul de la finalul paginii + stivuirea cu „Adaugă în coș" ─────── */
/* Bara e `fixed`, deci ar acoperi ultimele ei înălțimi de conținut — inclusiv
   linkurile ANPC/SAL/SOL, care au valoare legală și n-au voie să fie ascunse.
   `shop-consent.js` măsoară înălțimea REALĂ (nu una ghicită) și o publică în
   `--shop-consent-h`, exact ca `shop-sticky-cart.js:112-125`.

   ⚠️ `shop-sticky-cart.css` NU se atinge. Toată cuplarea e aici, și e scrisă ca
   să câștige pe DOUĂ axe, ca să nu depindă de ordinea de încărcare:
     · specificitate — `body.has-shop-consent .shop-sticky-cart` (0,2,1) bate
       `.shop-sticky-cart` (0,1,0); `body.has-shop-consent.has-shop-sticky-cart`
       (0,2,1) bate `body.has-shop-sticky-cart` (0,1,1);
     · ordine — `shop-sticky-cart.css` intră prin `@push('head')` din
       `product/show.blade.php:540`, foaia asta e un `<link>` în `<body>`.
   Fără asta, sticky-cart-ul ar rescrie `padding-bottom` și ultimii ~130px de
   conținut ar rămâne acoperiți pe pagina de produs. */

body.has-shop-consent {
    padding-bottom: var(--shop-consent-h, 0px);
}

@media (max-width: 767px) {

    html.shop-consent-ask .shop-consent {
        padding: 10px 12px;
        padding-bottom: calc(10px + env(safe-area-inset-bottom, 0px));
    }

    .shop-consent-main {
        display: block;
    }

    /* Fraza scurtă în locul celei lungi. Ambele spun aceleași două lucruri —
       la ce folosim cookie-urile și că apăsarea e o declarație pe propria
       răspundere — deci substanța juridică nu se pierde, doar cuvintele. */
    .shop-consent-long {
        display: none;
    }

    .shop-consent-short {
        display: inline;
    }

    .shop-consent-text {
        margin-bottom: 8px;
        line-height: 1.4;
    }

    /* 14px sus/jos ⇒ tinta de atingere 44px, minimul recomandat pe telefon. */
    .shop-consent-settings {
        padding: 14px 3px;
    }

    /* Butoanele pe un rând, 50/50. „Setări" NU mai primește un rând propriu de
       44px: intră în fluxul textului, lângă „Detalii · Termeni", unde e oricum
       un control terțiar. Ținta de atingere rămâne ≥44px prin padding vertical,
       fără să coste înălțime de bară (`line-height` mic + `padding` care se
       suprapune peste rândul de linkuri). */
    .shop-consent-actions {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: 8px;
    }

    .shop-consent-accept,
    .shop-consent-reject {
        min-height: 44px;
        padding: 8px 6px;
        font-size: 12px;
        white-space: normal;
    }

    /* Notele explicative ale categoriilor ies pe telefon: „Marketing" și
       „Statistică" sunt autoexplicative, iar fiecare notă costa ~30px. */
    .shop-consent-row-note {
        display: none;
    }

    .shop-consent-panel {
        margin-bottom: 8px;
        padding-bottom: 8px;
    }

    .shop-consent-panel-intro {
        font-size: 11px;
    }

    .shop-consent-panel-actions {
        flex-wrap: wrap;
    }

    .shop-consent-save {
        flex: 1 0 100%;
        margin-left: 0;
    }

    /* Sticky-cart-ul urcă deasupra barei. */
    body.has-shop-consent .shop-sticky-cart {
        bottom: var(--shop-consent-h, 0px);
        /* Ridicat, nu mai e el elementul de jos, deci nu mai trebuie să plătească
           `env(safe-area-inset-bottom)` — altfel iPhone X+ îi lasă ~34px de
           padding mort deasupra barei noastre. */
        padding-bottom: 6px;
    }

    /* Ambele prezente ⇒ spațiul rezervat e SUMA celor două înălțimi. */
    body.has-shop-consent.has-shop-sticky-cart {
        padding-bottom: calc(var(--shop-sticky-cart-h, 56px) + var(--shop-consent-h, 0px));
    }
}

/* `prefers-reduced-motion: reduce` ⇒ comutatoarele nu mai animă. Tiparul e cel
   din `shop-sticky-cart.css:151-158`. */
@media (prefers-reduced-motion: reduce) {

    .shop-consent-knob,
    .shop-consent-knob::before {
        transition: none;
    }
}
