/* =============================================================================
   chat-fix10.css — pachetul „interacțiune 10/10". Se încarcă ULTIMUL, după
   acx-abonament.css (vezi ChatRouteController.php din livrabil).
   -----------------------------------------------------------------------------
   Nu înlocuiește nimic: suprascrie punctual, ca și chat-patch2.css. Rollback =
   scoți fișierul din controller. Fiecare bloc spune CE repară, DE CE și CUM a
   fost măsurat. Perechea JS e chat-fix10.js — blocurile marcate [JS] depind de ea.
   ============================================================================= */


/* =========================================================================
   1. RAMA DE APLICAȚIE PE MOBIL + TABLETĂ (≤1023.98px) — [JS]
   -------------------------------------------------------------------------
   CAUZA-RĂDĂCINĂ a lui „fuge bara de scris când ating inputul" (Safari):
   meta-ul `interactive-widget=resizes-content` NU e implementat în WebKit —
   bug-ul webkit.org/b/259770 e DESCHIS (verificat 20 aug 2026; consola
   WebKit chiar scrie „Viewport argument key `interactive-widget` not
   recognized and ignored", măsurat pe beta14). Pe iOS tastatura NU
   redimensionează viewportul de layout: doar cel VIZUAL se strânge, iar
   Safari „plimbă" camera peste pagină ca să aducă textarea la vedere.
   Consecința, cu bara `position: fixed; bottom: 0`: bara rămâne ancorată de
   viewportul de LAYOUT (acum parțial sub tastatură), documentul e derulat de
   Safari ca să dezvăluie caretul → bara pleacă de sub deget, mesajele zboară
   în sus. Ambele simptome raportate, un singur mecanism.

   REPARAȚIA e arhitectura folosită de ChatGPT/Claude/Perplexity pe iOS:
     · documentul NU derulează deloc (html/body înghețate);
     · o „ramă" exact cât viewportul VIZUAL (--acx-vvh, scrisă de JS din
       visualViewport.height);
     · mesajele derulează într-un container INTERN — exact scroller-ul pe
       care motorul deja îl caută (`zonaDerulare()` din dashboard.module.js:
       `.messages > .grid-x` cu overflow) — deci motorul comută singur, fără
       nicio editare;
     · bara de scris e ancorată de BAZA RAMEI (absolute), nu de viewportul
       de layout — când rama se strânge la deschiderea tastaturii, bara urcă
       împreună cu ea, iar Safari nu mai are ce derula (caretul e deja
       vizibil → nu mai există „reveal scroll").

   Pe Chrome/Firefox Android meta-ul funcționează: viewportul de layout se
   strânge, visualViewport.height == innerHeight, deci rama urmează aceeași
   valoare — un singur mecanism pe toate platformele, fără ramuri de cod.

   Gard dublu: media query (≤1023.98px, aceleași praguri ca restul chat-ului)
   ȘI clasa `html.acx-rama` pusă de chat-fix10.js. Fără JS nu există clasa,
   deci totul rămâne EXACT ca azi — degradare, nu ruptură. Desktop (≥1024px)
   nu e atins deloc: acolo documentul derulează ca înainte.

   NOTĂ pentru istorie: abordările demontate pe 20 aug (bare plutitoare pe
   transform, pre-strângeri, lacăte de gesturi) mutau BARA după viewportul
   vizual dar lăsau DOCUMENTUL derulabil — Safari continua să-l plimbe, de
   aici glitch-urile. Diferența de acum: documentul nu mai derulează deloc,
   deci nu mai există două sisteme de scroll care să se certe.
   ====================================================================== */
@media (max-width: 1023.98px) {
  /* documentul nu mai derulează: rama e singura fereastră */
  html.acx-rama,
  html.acx-rama body {
    height: 100%;
    overflow: hidden;
    overscroll-behavior: none;
  }

  /* rama = viewportul vizual; 100svh e rezerva până scrie JS-ul prima valoare.
     `overflow: hidden` NU e decorativ: fără el, marginile negative ale gridului
     (framework: `.grid-x` cu `--gap: .5rem` → margin -4px) COLAPSEAZĂ prin
     `main` și împing toată rama cu 4px deasupra viewportului — bara de scris
     rămânea suspendată la 4px de fund (MĂSURAT: main.top = -4). Un context nou
     de formatare oprește orice scurgere de margini prin peretele ramei. */
  html.acx-rama .up5acc-content {
    height: var(--acx-vvh, 100svh);
    min-height: 0;
    overflow: hidden;
  }
  html.acx-rama .up5-chat {
    position: relative;   /* contextul pentru bara și capul absolut */
    height: 100%;
    min-height: 0;
    /* bara ascunsă (`[data-hidden]`, translateY(112%)) iese SUB ramă și, fără
       clip, devine „overflow derulabil" al ramei — orice reveal-scroll (iOS la
       focus, click-uri automate) putea deplasa rama cu câțiva px (MĂSURAT:
       main.scrollTop = 4). O tăiem la perete; vizual era oricum invizibilă. */
    overflow: hidden;
  }

  /* capul conversației: din sticky în absolut, peste scroller (blur-ul
     rămâne: mesajele trec pe sub el, ca acum) */
  html.acx-rama .up5-chat .chatroom-top {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
  }

  /* scroller-ul intern = exact elementul pe care îl caută motorul.
     71px = capul măsurat pe telefon (chat-patch2.css, blocul aurei: 61+10);
     69px între 720-1024 (avatar 48; vezi blocul „Ultimul reglaj" din patch2).
     Rezerva de jos rămâne cea a listei de azi (132px), mutată AICI de pe
     `.messages`, fiindcă acum containerul intern e cel care are nevoie de
     loc sub ultimul mesaj, nu documentul. */
  html.acx-rama .up5-chat > .messages {
    flex: 1 1 auto;
    min-height: 0;
    height: auto;
    padding-bottom: 0;
    position: static;
  }
  html.acx-rama .up5-chat > .messages > .grid-x {
    height: 100%;
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
    padding-top: calc(4.4375rem + env(safe-area-inset-top, 0px));
    padding-bottom: 8.25rem;
  }
  /* PRE-CONSIMȚĂMÂNT: compozitorul e ascuns, jos e doar bara de acord (79px),
     deci rezerva de 132px ar face conținutul derulabil degeaba — cardul de
     disclaimer e croit să umple exact rama (§6), iar orice pixel de scroll în
     plus împinge TITLUL sub cap (VĂZUT pe iPhone real la verificare). Cu
     rezerva corectă, ecranul de acord nu are nimic de derulat: derulează
     doar CARDUL, în interior, cum e proiectat. */
  html.chat-pre-disclaimer.acx-rama .up5-chat > .messages > .grid-x {
    padding-bottom: calc(4.9375rem + env(safe-area-inset-bottom, 0px));
  }

  /* bara de scris: din fixed în absolute — ancorată de baza RAMEI.
     `left/right: 0` înlocuiește `left: var(--rail)`: sub 1024px rail-ul e
     oricum 0 (sidebar-ul devine meniu full-screen). */
  html.acx-rama .up5-chat .search-bar-container {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
  }
  /* bara de acord a disclaimerului: TOT în ramă (absolute), ca bara de scris —
     O SINGURĂ ancoră de fund pentru toate barele, aceeași referință de
     geometrie. VERIFICAT pe iPhone 17 real (Simulator, iOS 26.5, reporter de
     geometrie): cu documentul înghețat de ramă, chrome-ul Safari nu se mai
     colapsează, innerHeight == visualViewport.height == 100svh == 714pt,
     env(safe-area-inset-bottom) == 0, iar bara absolută stă la client
     [635..714] — exact deasupra chrome-ului, pixel-identic cu varianta fixed,
     dar imună la subtilitățile de „paint pinning" ale lui fixed pe iOS în
     tranzițiile de chrome. Overflow-ul stării ei ascunse (translateY(112%))
     nu mai e o problemă: `main` are `overflow: hidden` (BFC) iar sync() din
     chat-fix10.js resetează orice scroll accidental al pereților ramei —
     gărzile care nu existau când varianta asta a fost încercată prima dată
     și retrasă. */
  html.acx-rama .disclaimer-actions {
    position: absolute;
    left: 0;
    right: 0;
  }
  html.acx-rama .up5acc-content {
    position: relative;
  }

  /* cât e tastatura pe ecran (clasa pusă de JS): safe-area-inset-bottom
     rămâne raportat de iOS deși bara de gesturi nu mai e acolo — scoatem
     rezerva, altfel rămâne un gol între casetă și tastatură.
     Înlocuiește hack-ul `:has(textarea:focus)` din chat-patch2.css:1247
     (care se declanșa pe FOCUS, nu pe TASTATURĂ — greșit cu tastatură
     fizică pe tabletă, și fără tranziție la momentul exact al focusului). */
  html.acx-rama.acx-kb .up5-chat .search-bar-container {
    padding-bottom: 0.75rem;
  }
  /* dezarmăm vechiul hack ca să nu existe două mecanisme (cauza, nu simptomul):
     valoarea revine la definiția din chat-v7.css:2810 */
  html.acx-rama .up5-chat .search-bar-container:has(textarea:focus),
  html.acx-rama .up5-chat .search-bar-container:has(input:focus) {
    padding-bottom: calc(0.75rem + env(safe-area-inset-bottom, 0px));
  }
  html.acx-rama.acx-kb .up5-chat .search-bar-container:has(textarea:focus),
  html.acx-rama.acx-kb .up5-chat .search-bar-container:has(input:focus) {
    padding-bottom: 0.75rem;
  }

  /* CÂT E TASTATURA PE ECRAN, sugestiile se retrag (cerut de Andu, 20 aug, la
     verificarea pe iPhone real): în rama comprimată, cele 4 chip-uri acopereau
     conversația/hero-ul chiar în timp ce omul scrie — standardul platformelor
     mari e „compui = doar compozitorul". Legat de starea REALĂ de tastatură
     (`acx-kb`, din visualViewport), nu de focus — cu tastatură fizică pe
     tabletă ecranul nu se comprimă și chip-urile rămân. Tranziția de opacitate
     există deja pe element (chat-v7.css); la închiderea tastaturii revin. */
  html.acx-rama.acx-kb .up5-chat .search-bar-container .chat-suggestions {
    /* (0,5,1) — peste starea „activ" din chat-v7.css:3014, care e (0,5,0) */
    opacity: 0;
    pointer-events: none;
  }
}

/* tabletă (720-1023.98): capul e de 69px (avatar 48 — vezi „Ultimul reglaj" din
   patch2), deci scroller-ul își ajustează rezerva de sus. Interval scris
   EXPLICIT, nu imbricat, ca regula să fie citeață și robustă. */
@media (min-width: 720px) and (max-width: 1023.98px) {
  html.acx-rama .up5-chat > .messages > .grid-x {
    padding-top: calc(4.3125rem + env(safe-area-inset-top, 0px));
  }
}


/* =========================================================================
   2. --screen-height DEZGROPAT — fix-ul svh din patch2 era INERT
   -------------------------------------------------------------------------
   MĂSURAT: blocul de tokens din chat-v7.css:25-31 declară
   `--screen-height: 100vh` direct pe `body, .up5acc, .up5-chat, …`. O
   variabilă declarată PE element bate orice moștenire, deci `:root
   { --screen-height: 100svh !important }` din chat-patch2.css:1271 nu
   ajungea NICIODATĂ la consumatori (.up5acc-content:400, starea de chat
   gol: chat-v7.css:1473 + chat-patch2.css:189/1235) — toți vedeau 100vh.
   Pe telefon 100vh = viewportul MARE (cu bara de adrese retrasă), deci
   pagina ieșea cu ~60-100px mai înaltă decât ecranul → derulabilă „din
   senin" chiar și goală, hero-ul centrat greșit.
   Aceeași listă de selectori, valoare corectă, câștigă prin ORDINE (fișierul
   ăsta vine după chat-v7.css).
   ATENȚIE, capcană de spec (prinsă la review-ul advers): la CUSTOM PROPERTIES
   nu există „rezervă prin declarație invalidă" — orice șir de tokeni e valid,
   deci ULTIMA declarație câștigă întotdeauna, inclusiv pe browserele care nu
   cunosc `svh` (unde consumatorii `var()` ar deveni invalizi → min-height:
   auto → colaps). Rezerva corectă se face cu `@supports`: fără suport svh
   rămâne 100vh — exact comportamentul funcțional de azi. */
body,
.up5acc,
.up5-chat,
.acx,
.popup-custom,
.snackbar,
.up5-modal {
  --screen-height: 100vh;
}
@supports (height: 100svh) {
  body,
  .up5acc,
  .up5-chat,
  .acx,
  .popup-custom,
  .snackbar,
  .up5-modal {
    --screen-height: 100svh;
  }
}


/* =========================================================================
   3. STOP DISPONIBIL DIN PRIMA SECUNDĂ (standardul ChatGPT/Claude)
   -------------------------------------------------------------------------
   MĂSURAT pe beta14 (rulare test-stop.js, scenariul A): în faza „se
   gândește" (10-40s!) butonul de stop NU există pe ecran — e activat de
   motor abia când începe scrierea răspunsului. Utilizatorul vede doar
   spinner-ul și nu poate opri nimic exact în faza cea mai lungă.
   Standardul platformelor mari: pătratul de stop apare ÎN CLIPA trimiterii.

   Butoanele stau suprapuse absolut în `.actions-cnt` (chat-v7.css:2894), în
   ordinea: submit, .button-loading, .button-stop — deci combinatorul de
   frați ajunge la stop fără `:has()`, adică merge pe orice browser.
   Spinner-ul se stinge; starea de „lucru" rămâne comunicată de bula cu
   puncte + statusul din cap („Se gândește…", reparat în chat-patch2.js).
   Click-ul pe stop e deja legat de motor (btnStop.addEventListener →
   stopAll → abort pe fetch) — doar că elementul nu era vizibil.
   Curățenia completă a stării după stop: vezi editările din
   dashboard.module.js (stopAll) și chat-patch2.js (AbortError).
   ====================================================================== */
.up5-chat .actions-cnt .button-loading[data-active] {
  opacity: 0;
  pointer-events: none;
}
/* VIZIBIL imediat, APĂSABIL după armare (450ms, clasa pusă de chat-fix10.js).
   Fără fereastra de armare, al doilea tap al unui DUBLU-CLICK pe „trimite"
   ateriza pe stop și își anula singur cererea abia trimisă (prins la review-ul
   advers). Fără JS clasa nu apare → stop-ul rămâne doar vizual în pending,
   adică exact comportamentul de azi — degradare, nu ruptură. */
.up5-chat .actions-cnt .button-loading[data-active] ~ .button-stop {
  opacity: 1;
  transform: scale(1);
  pointer-events: none;
}
.up5-chat .search-bar.js-chat-form.acx-stop-armat .actions-cnt .button-loading[data-active] ~ .button-stop {
  pointer-events: auto;
}


/* =========================================================================
   4. ISTORICUL NU SE MAI DESENEAZĂ „UMFLAT" — [JS]
   -------------------------------------------------------------------------
   CAUZA-RĂDĂCINĂ a lui „când se deschide chat-ul fug rândurile în sus",
   pe ORICE browser, verificată la sursă:
     · modelul scrie `data-active` pe TOATE secțiunile pliabile
       (gemini_system_instructions.txt:576-630), iar HTML-ul e salvat așa
       în baza de date;
     · chat-explicatii.css §1 face `[data-active] + .content
       { height: auto !important }` → la PRIMUL desen istoricul apare cu
       toate secțiunile DESCHISE;
     · la DOMContentLoaded motorul scoate `data-active` și pune height: 0
       (dashboard.module.js:341-342) → toată conversația se prăbușește cu
       sute/mii de px într-o singură cadră, apoi sare la fund.
   Pe un telefon real, între primul desen și DCL trec 0,5-2s (stiva de JS:
   GSAP ×4 + framework + module) — utilizatorul vede exact „rândurile fug".

   PRINCIPIU: starea de la primul desen trebuie să fie EGALĂ cu starea de
   după JS. Starea finală a istoricului e „totul pliat" — deci așa trebuie
   să se și deseneze. `html.acx-boot` e pusă de scriptul inline din
   chat-v5.html.twig (rulează la parsare, înainte de desen) și scoasă de
   chat-fix10.js imediat după ce motorul a terminat plierea (DCL), cu plasă
   la 5s. Fără JS clasa nu apare deloc → secțiunile rămân deschise, tot
   conținutul e lizibil (comportamentul de azi).
   Specificitate: (0,5,1) > (0,5,0) al regulii din chat-explicatii.css:85 —
   câștigă și fără !important suplimentar, dar ÎL punem fiindcă și regula
   veche îl are, iar la egalitate de importanță decide specificitatea.
   [data-text-loading] nu poate coexista cu boot-ul (typing-ul începe după
   DCL, când clasa e deja scoasă), deci nu are nevoie de excepție.
   ====================================================================== */
html.acx-boot .up5-chat .message .trigger + .content {
  height: 0 !important;
}


/* =========================================================================
   5. FINISAJE DE TRANZIȚIE (landing → chat) — mărunte, măsurate
   ====================================================================== */

/* 5a. Morph-ul NATIV (drumul de rezervă din Safari, fără dreptunghi de predare)
   folosea încă `--ease-emph` — exact curba măsurată în README-ul demo-ului ca
   „49% din drum în 58ms" și corectată peste tot în rest. Aliniem cu
   home.css:1736 și cu FLIP-ul (.22,.61,.36,1).
   NOTĂ de investigație (păstrată ca să nu se repete drumul): în sesiunile
   AUTOMATE (Playwright/CDP) apare „AbortError: Transition was skipped" la
   sosirea din landing pe Chromium — e tranziția internă pe care Chrome o
   creează pentru `@view-transition` și o abortează singur la ratarea
   termenului de desen. VERIFICAT în consola REALĂ DevTools pe beta14: eroarea
   NU există acolo — e doar zgomot al canalului de automatizare, invizibil
   utilizatorilor. Nu se „repară" (promisiunea nu e expusă paginii) și nu
   trebuie: filtrați-l în harness-urile de test. */
::view-transition-group(composer) {
  animation-timing-function: cubic-bezier(0.22, 0.61, 0.36, 1);
}

/* 5b. Pasul doi al morph-ului (acord → bara de scris, chat-patch2.js §C)
   măsura destinația în timp ce containerul barei încă ALUNECA din
   translateY(112%) cu tranziția lui de .42s — punctul de start ieșea
   decalat cu zeci de px și cele două mișcări se compuneau, cu bara aproape
   transparentă la start (opacity în tranziție). Cât zboară FLIP-ul, tăiem
   tranziția containerului: geometria destinației e finală din prima cadră,
   morph-ul rămâne singura mișcare. Clasa `data-acx-flip` e pusă/scoasă de
   flip() (chat-patch2.js:221/227), deci fereastra e exact durata morph-ului. */
body[data-acx-flip] .up5-chat .search-bar-container {
  transition: none;
}

/* 5c. Garda „fără intrare proprie cât rulează morph-ul" era legată de
   `@supports (view-transition-name: none)` — un test de VOCABULAR, nu de
   stare: pe browserele care nu cunosc proprietatea (unde azi rulează
   FLIP-ul!), garda pică și intrarea `acxUp` se joacă PESTE morph — părintele
   țintei stă la opacity: 0 primele ~160ms, deci obiectul zburător dispărea
   o clipă. Politica reală (decisă în chat-v5.html.twig) e: pe handoff
   morph-ul e UNUL și e FLIP — deci garda corectă e chiar prezența
   handoff-ului. Nu putem șterge blocul vechi de aici, dar îl facem inofensiv:
   regula de mai jos acoperă ambele lumi la aceeași adresă, fără @supports. */
body[data-anim-handoff] .up5-chat .search-bar-container:not([data-hidden]),
body[data-anim-handoff] .disclaimer-actions[data-active] {
  animation: none;
}
/* …dar coregrafia armată de patch2 DUPĂ morph (fade-urile acxApareDupaMorph,
   delay .6-.9s) are specificitate mai mare și rămâne neatinsă — verificat:
   chat-patch2.css:892-972 folosește selectori cu 2 clase + atribut. */

/* 5e. Chip-urile de sugestii FANTOMĂ pe sosirea din landing cu conversație.
   chat-patch2.css:1018 le dă fade-in pe durata `data-anim-handoff` INDIFERENT
   de `data-active` — dar la un chat cu istoric motorul nu le activează, deci
   `fill: both` le ținea forțat la opacity 1 (ne-clicabile) plutind peste
   mesaje cât trăia atributul. Defect preexistent, pe care prelungirea curățării
   la 4000ms (chat-v5.html.twig, pentru pulsul de atenție) l-ar fi lungit și el.
   Fade-in-ul rămâne DOAR pentru starea activă (chat gol) — acolo e dorit. */
body[data-anim-handoff] .up5-chat .chat-suggestions:not([data-active]) {
  animation: none;
}

/* 5d. `gradientShift` e referit de `.cta--background-gradient`
   (chat-v7.css:301) dar keyframes-ul NU există pe ruta de chat (doar în
   home.css) — butonul „Sunt de acord" nu „respira" niciodată. Îl definim
   identic cu landing-ul, ca intenția să se și vadă. */
@keyframes gradientShift {
  0% { background-position: 0% 50%; }
  50% { background-position: 100% 50%; }
  100% { background-position: 0% 50%; }
}


/* =========================================================================
   6. DISCLAIMERUL UMPLE PÂNĂ LÂNGĂ „SUNT DE ACORD" (cerut de Andu, 20 aug,
      la verificarea pe iPhone real)
   -------------------------------------------------------------------------
   Formula din chat-patch2.css §2 lăsa sub card 26px de margini + 32px de
   „respiro" — pe iPhone 17 real asta se citea ca un GOL de ~55pt între card
   și bara de acord („pare că nu e bine încadrat"). Păstrăm aceeași
   construcție (funcție de viewport cu constante de design, zero măsurători),
   doar strângem rezerva: golul vizual țintit e ~14px. Constanta veche:
   mobil 208 (71 cap + 26 margini + 79 bară + 32 respiro) → 170;
   desktop 222 (79 + 26 + 79 + 38) → 184. Selector identic cu patch2, decide
   ordinea fișierelor. Masca de estompare de 22px de la baza cardului rămâne —
   e afordanța de derulare, nu parte din gol. */
.up5-chat .message.message-assistant-disclaimer {
  height: max(13.75rem, calc(100dvh - 10.625rem - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)));
}
@media (min-width: 720px) {
  .up5-chat .message.message-assistant-disclaimer {
    height: max(13.75rem, calc(100dvh - 11.5rem - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)));
  }
}

/* 6b. FĂRĂ SCROLL MORT SUB CARD (raportat de Dennis, 26 aug: „la încărcarea
   paginii de chat există un scroll complet nenecesar").
   Aspectul de la scroll 0 era deja cel aprobat la §6 — dar DOCUMENTUL rămânea
   cu 69px mai înalt decât viewportul, numai spațiu mort: `.messages` ține
   `padding-bottom: 132px` (148 pe desktop) ca loc pentru COMPOZITOR, care în
   starea de disclaimer e ascuns sub viewport (bara „Sunt de acord" e FIXĂ și
   nu are nevoie de loc în flux). Îl strângem doar în starea asta, la valoarea
   care închide ecuația EXACT — și care face constantele §6 corecte structural,
   nu negociate:
     mobil:   71 cap + 24+8 paddingurile listei + 2+2 marginile cadrului
              + 63 aici  = 170 = constanta §6  →  scrollHeight == 100dvh
     desktop: 79 + 24+8 + 2+2 + 69 = 184 = constanta §6
   `html.chat-pre-disclaimer`, nu `:has(.message-assistant-disclaimer)`:
   cardul static rămâne în DOM (display:none) și după acord, iar `:has()` l-ar
   vedea în continuare — compozitorul real ar rămâne fără locul lui. Clasa de
   stare o scoate scriptul chiar la acord. */
html.chat-pre-disclaimer .up5-chat > .messages {
  padding-bottom: 3.9375rem;
}
@media (min-width: 720px) {
  html.chat-pre-disclaimer .up5-chat > .messages {
    padding-bottom: 4.3125rem;
  }
}


/* =========================================================================
   7. IGIENĂ FULLSCREEN (Safari 15-16.3)
   -------------------------------------------------------------------------
   chat-patch2.css:445-448 grupează `:fullscreen` cu `:-webkit-full-screen`
   în ACEEAȘI listă; pe Safari <16.4 selectorul neprefixat e necunoscut și
   invalidează ÎNTREAGA listă (regula CSS: un selector neparsabil omoară
   lista) — fix-ul de fullscreen murea exact pe browserele pentru care
   exista prefixul. Redeclarăm varianta webkit SEPARAT, cu valorile identice
   din patch2 §7. */
:-webkit-full-screen .up5-chat .search-bar-container,
:-webkit-full-screen .up5-chat .chatroom-top {
  background-color: var(--bg, #080B12);
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
}

/* ═════════════════════════════════════════════════════════════════════════════
   v2.2 · SOSIREA DIN LANDING — bara ta devine mesajul tău
   Pagina de chat pornește EXACT din ultimul cadru al landing-ului: pe fundalul chatului, bara
   cu întrebarea, în același loc, cu lumina de pe contur rotindu-se din același unghi (fantoma,
   `.acx-v3-ghost`, desenată înainte de primul cadru de scriptul din chat-v5.html.twig). Apoi:
     0 → 0,72 s   bara devine bula mesajului tău (forma, locul, culoarea, textul);
     0,10 s →     antetul (și, pe desktop, meniul din stânga) apar lin;
     0,28 s →     disclaimerul (sau istoricul) urcă sub mesaj;
     0,36 s →     bara de jos („Sunt de acord" / bara de scriere) urcă.
   La „Sunt de acord", disclaimerul se topește în jos, mesajul tău rămâne pe loc și primește o
   lumină de „trimis" când motorul îl trimite. Logica e a motorului; aici e doar scena.
   `body[data-acx-v3]` = scena ascunsă; `="go"` = pornește; atributul se scoate la final.
   ═════════════════════════════════════════════════════════════════════════════ */
.acx-v3-ghost {
  position: fixed;
  inset: 0;
  z-index: 2147483000;
  pointer-events: none;
}
.acx-v3-ghost > * {
  position: absolute;
  box-sizing: border-box;
  transform-origin: 0 0;
}
/* bara: exact aspectul de plecare de pe landing (home.css, „v2.2 · plecarea spre chat") */
.acx-v3-ghost .g-pill {
  background: linear-gradient(#131a28, #0d111a);
  box-shadow:
    inset 0 1px 0 rgba(255, 255, 255, 0.08),
    0 18px 44px -18px rgba(124, 92, 252, 0.6),
    0 10px 30px -14px rgba(0, 194, 255, 0.45);
}
.acx-v3-ghost .g-ring {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1.5px;
  background: conic-gradient(from var(--acx-ang, 0deg), rgba(0, 194, 255, 0.95), rgba(124, 92, 252, 0.22) 22%, rgba(181, 33, 233, 0.95) 50%, rgba(124, 92, 252, 0.22) 78%, rgba(0, 194, 255, 0.95));
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask-composite: exclude;
}
/* bula: exact aspectul bulei tale din chat (chat-v7.css, `.message--user`) */
.acx-v3-ghost .g-bub {
  opacity: 0;
  border-radius: 18px 18px 6px 18px;
  background:
    linear-gradient(135deg, rgba(0, 194, 255, 0.16), rgba(124, 92, 252, 0.18) 55%, rgba(181, 33, 233, 0.16)),
    #080b12;
  box-shadow:
    inset 0 0 0 1px rgba(124, 92, 252, 0.32),
    0 6px 18px -8px rgba(124, 92, 252, 0.25);
}
.acx-v3-ghost .g-txt {
  font: 400 16px / 1.5 Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  color: #ececf3;
  white-space: nowrap;
  overflow: hidden;
  /* tăiat ca în câmpul de pe landing: cu focus (Enter) fără „…"; fără focus (clic pe săgeată) cu „…",
     pus de scriptul din chat-v5.html.twig după cum arăta câmpul la plecare */
  text-overflow: clip;
  transform-origin: 0 50%;
}
/* întrebare lungă (bula are mai multe rânduri): textul bulei, așezat exact ca în bula reală */
.acx-v3-ghost .g-fin {
  opacity: 0;
  margin: 0;
}

/* scena: până pornește transformarea, pe ecran e doar bara (ca pe landing) */
body[data-acx-v3]:not([data-acx-v3="go"]) .chatroom-top,
body[data-acx-v3]:not([data-acx-v3="go"]) .acx-mbtns,
body[data-acx-v3]:not([data-acx-v3="go"]) header.acx,
body[data-acx-v3]:not([data-acx-v3="go"]) .up5-chat .js-messages-container > :not(.acx-v3-target),
body[data-acx-v3]:not([data-acx-v3="go"]) .disclaimer-actions,
body[data-acx-v3]:not([data-acx-v3="go"]) .up5-chat .search-bar-container,
body[data-acx-v3]:not([data-acx-v3="go"]) .up5-chat .chat-suggestions {
  opacity: 0 !important;
  transition: none !important;
}
body[data-acx-v3]:not([data-acx-v3="go"]) .chatroom-top,
body[data-acx-v3]:not([data-acx-v3="go"]) .acx-mbtns {
  transform: translateY(-6px) !important;
}
body[data-acx-v3]:not([data-acx-v3="go"]) header.acx {
  transform: translateX(-12px) !important;
}
body[data-acx-v3]:not([data-acx-v3="go"]) .up5-chat .js-messages-container > :not(.acx-v3-target) {
  transform: translateY(18px) !important;
}
body[data-acx-v3]:not([data-acx-v3="go"]) .disclaimer-actions,
body[data-acx-v3]:not([data-acx-v3="go"]) .up5-chat .search-bar-container {
  transform: translateY(28px) !important;
}
body[data-acx-v3="go"] .chatroom-top,
body[data-acx-v3="go"] .acx-mbtns {
  transition:
    opacity 0.42s ease-out 0.1s,
    transform 0.6s cubic-bezier(0.2, 0.8, 0.2, 1) 0.1s !important;
}
body[data-acx-v3="go"] header.acx {
  transition:
    opacity 0.45s ease-out 0.12s,
    transform 0.6s cubic-bezier(0.2, 0.8, 0.2, 1) 0.12s !important;
}
body[data-acx-v3="go"] .up5-chat .js-messages-container > :not(.acx-v3-target) {
  transition:
    opacity 0.5s ease-out 0.28s,
    transform 0.7s cubic-bezier(0.2, 0.8, 0.2, 1) 0.28s !important;
}
body[data-acx-v3="go"] .disclaimer-actions,
body[data-acx-v3="go"] .up5-chat .search-bar-container,
body[data-acx-v3="go"] .up5-chat .chat-suggestions {
  transition:
    opacity 0.45s ease-out 0.36s,
    transform 0.65s cubic-bezier(0.2, 0.8, 0.2, 1) 0.36s !important;
}
/* ținta (bula ta: cea pregătită aici sau cea reală a motorului) stă pe loc și e ascunsă până
   aterizează fantoma; în clipa aterizării apare fără tranziție, deci nu se vede nicio schimbare */
.up5-chat .js-messages-container > .acx-v3-target {
  transform: none !important;
}
.up5-chat .message.acx-v3-hold,
.up5-chat .acx-v3-pending:not(.acx-v3-arrived) .message {
  opacity: 0 !important;
  transition: none !important;
}
.up5-chat .message.acx-v3-swap,
.up5-chat .acx-v3-pending .message {
  opacity: 1;
  transform: none !important;
  transition: none !important;
}
/* la „Sunt de acord": disclaimerul se topește în jos, peste mesajul tău care rămâne pe loc */
.up5-chat .acx-v3-leaving {
  animation: acxV3Pleaca 0.42s cubic-bezier(0.4, 0, 0.6, 1) forwards;
}
body[data-acx-v3-pleaca] .up5-chat .message--pending {
  opacity: 0 !important;
}
.up5-chat .message--pending {
  transition: opacity 0.3s ease-out;
}
@keyframes acxV3Pleaca {
  to {
    opacity: 0;
    transform: translateY(22px);
  }
}
/* în clipa trimiterii, peste bula ta trece o lumină („trimis") */
.up5-chat .message.message--user.acx-v3-sent {
  position: relative;
  overflow: hidden;
}
.up5-chat .message.message--user.acx-v3-sent::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(100deg, rgba(255, 255, 255, 0) 30%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 70%);
  transform: translateX(-100%);
  animation: acxV3Trimis 0.9s cubic-bezier(0.4, 0, 0.2, 1) 0.05s both;
  pointer-events: none;
}
@keyframes acxV3Trimis {
  to {
    transform: translateX(100%);
  }
}
/* lista nu mai „reapare" la acord (chat-patch2.css §C): pe drumul ăsta mesajul tău e deja pe ecran */
html.acx-v3 body[data-acx-acord] .up5-chat .js-messages-container {
  animation: none !important;
}
@media (prefers-reduced-motion: reduce) {
  .up5-chat .acx-v3-leaving,
  .up5-chat .message.message--user.acx-v3-sent::after {
    animation: none;
  }
}
