/* tokens.css — sistema visual de myyo (paleta monocromàtica, espaiat 8px). */

:root {
  /* Fons (de més profund a més elevat) */
  --bg-0: #000000;   /* fons primari */
  --bg-1: #0F0F10;   /* fons secundari, contenidors */
  --bg-2: #18181A;   /* cards, elements elevats */
  --bg-3: #202024;   /* hover sobre cards */

  /* Línies i separadors */
  --line:        #2A2A2D;
  --line-strong: #34343A;
  --line-soft:   rgba(255, 255, 255, 0.08);   /* per inputs / pills sobre bg-1 */

  /* Text */
  --text-3: #5C5C60;   /* terciari, captions */
  --text-2: #8A8A8E;   /* secundari, icones inactives */
  --text-1: #F5F4F1;   /* primari (blanc càlid) */
  --text-0: #FFFFFF;   /* highlight, focus */

  /* Estats (ús minimalista) */
  --error: #E5484D;

  /* Tipografia */
  --font-body:    'Geist', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
  --font-display: 'Fraunces', Georgia, serif;
  --font-mono:    'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;

  /* Radius */
  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 24px;
  --r-pill: 999px;

  /* Espaiat (sistema 8px) */
  --space-1: 8px;
  --space-2: 16px;
  --space-3: 24px;
  --space-4: 32px;
  --space-5: 48px;
  --space-6: 64px;
  --space-7: 96px;

  /* Animació */
  --ease: cubic-bezier(0.4, 0, 0.2, 1);
  --dur-fast: 150ms;
  --dur:      220ms;
  --dur-slow: 320ms;

  /* Elevació subtil (1px ring blanc translúcid) */
  --ring:        0 0 0 1px rgba(255, 255, 255, 0.06);
  --ring-strong: 0 0 0 1px rgba(255, 255, 255, 0.15);
}

/* ============================================================
   Brief 017 TASCA B — mode "light" per testing.
   Activable amb ?theme=light o localStorage.myyo_theme="light".
   NO és canvi de disseny final — eina perquè Pere pugui fer
   captures/proves a fons blanc on el contrast amb papers físics
   sigui útil. Per tornar a fosc: ?theme=dark.
   ============================================================ */
:root[data-theme="light"] {
  /* Brief 022 TASCA C — color-scheme nadiu perquè iOS Safari respecti
     el mode al rendering nadiu de scrollbars i form widgets. */
  color-scheme: light;
  --bg-0: #ffffff;
  --bg-1: #f7f7f7;
  --bg-2: #ececec;
  --bg-3: #e0e0e0;
  --line:        #d0d0d2;
  --line-strong: #b8b8bc;
  --line-soft:   rgba(0, 0, 0, 0.08);
  --text-3: #8a8a8e;
  --text-2: #555558;
  --text-1: #1a1a1c;
  --text-0: #000000;
  --ring:        0 0 0 1px rgba(0, 0, 0, 0.06);
  --ring-strong: 0 0 0 1px rgba(0, 0, 0, 0.15);
  background-color: #ffffff;
  color: #1a1a1c;
}
:root[data-theme="light"] body {
  background: var(--bg-0);
  color: var(--text-1);
}
/* Brief 018 TASCA C + Brief 022 TASCA C — !important al :root i al
   body per al iPhone Safari. El bug: ?theme=light no aplicava encara
   que data-theme="light" estigués posat al <html>. Forcem amb
   !important com a últim recurs. */
:root[data-theme="light"],
:root[data-theme="light"] body {
  background-color: #ffffff !important;
  color: #1a1a1c !important;
}
:root[data-theme="light"] ::selection {
  background: rgba(0, 0, 0, 0.12);
  color: var(--text-0);
}
:root[data-theme="light"] :focus-visible {
  outline-color: rgba(0, 0, 0, 0.3);
}
/* La bola en mode light necessita contrast — el kaki dorat sobre
   blanc pràcticament no es veu. Fem el host més visible amb un
   contorn fosc i un glow més apagat. */
:root[data-theme="light"] .myyo-orb {
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.18), 0 4px 12px rgba(0, 0, 0, 0.10);
}
/* Toast en light: fons fosc per contrastar amb el viewport blanc. */
:root[data-theme="light"] .myyo-toast {
  background: rgba(20, 20, 22, 0.92);
  color: #fff;
  border-color: rgba(0, 0, 0, 0.18);
}
/* Backdrop del panel ja és fosc — el deixem igual perquè la
   transparència sobre blanc dóna un gris clar acceptable. */

*, *::before, *::after { box-sizing: border-box; }

html, body { margin: 0; padding: 0; }

html { background: var(--bg-0); }

body {
  background: var(--bg-0);
  color: var(--text-1);
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  min-height: 100svh;
  display: flex;
  flex-direction: column;
}

a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; padding: 0; }
input, textarea { font: inherit; color: inherit; }
img { max-width: 100%; display: block; }

:focus { outline: none; }
:focus-visible {
  outline: 1px solid rgba(255, 255, 255, 0.3);
  outline-offset: 2px;
  border-radius: var(--r-sm);
}

::selection { background: rgba(245, 244, 241, 0.18); color: var(--text-0); }

/* Animacions globals reutilitzables */

@keyframes fade-rise {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* ============================================================
   Brief 022 TASCA A — mode embed.
   Quan la pàgina està iframecarregada dins /dashboard (el shell
   posa data-embed="1" al <html>), amaguem topbar + version-badge
   per no duplicar UI. La bola del shell parent ja gestiona la veu.
   ============================================================ */
:root[data-embed="1"] .topbar,
:root[data-embed="1"] #myyo-version-badge,
:root[data-embed="1"] .myyo-orb,
/* Brief 073 (9/5/2026) — el iframe parent (dashboard) ja té el seu xat
   omnipresent i la bola; dins el preview de Tu myyo amaguem el chat
   form, transcript, disclaimer i banner per evitar duplicacions. */
:root[data-embed="1"] .chat,
:root[data-embed="1"] .transcript,
:root[data-embed="1"] .profile-disclaimer,
:root[data-embed="1"] .profile-owner-banner {
  display: none !important;
}

/* ============================================================
   Brief 022 TASCA D — botó back universal.
   Reutilitzable a totes les pantalles. Tap target 40px
   (recomanació iOS) i font 15px. text-decoration none perquè
   funcioni igual com <a> i com <button>.
   ============================================================ */
.back-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 40px;
  padding: 0 12px;
  background: transparent;
  border: none;
  color: var(--text-1);
  font-size: 15px;
  font-family: inherit;
  cursor: pointer;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  border-radius: 999px;
  transition: opacity var(--dur) var(--ease), background var(--dur) var(--ease);
}
.back-btn::before {
  content: "←";
  font-size: 22px;
  line-height: 1;
}
.back-btn:hover,
.back-btn:focus-visible {
  background: var(--bg-1);
  outline: none;
}
.back-btn:active { opacity: 0.6; }


/* ============ Brief 042-fix4 (7/5/2026) — pegats CSS hereus revertits ============
 * Cadena 042-fix2/3 va afegir aquí 3 regles amb valors hardcoded (54px top,
 * 34px bottom, position:fixed inset explícit, fitShellHeight via JS) per
 * compensar que el WKWebView pintés sota la Dynamic Island i la Home Indicator.
 *
 * La causa real era `ios.contentInset: 'never'` a capacitor.config (introduït
 * al Brief 042 §A.1 per error de raonament). Amb 'never', env(safe-area-inset-*)
 * retorna 0 dins el WebView i cap pegat CSS funcionava de manera fiable.
 *
 * Tornant contentInset a 'automatic' (Brief 042-fix4), env() retorna els valors
 * natius reals (47px top, 34px bottom al iPhone 17). Les regles dels headers
 * (.dashboard-header, .app-shell__header) i del footer (.app-shell__footer)
 * a app-shell.css i dashboard.css ja usen `max(var(--space-X), env(safe-area-
 * inset-*))` que ara funciona nativament. Ja no calen overrides per
 * is-native-ios.
 *
 * La classe `is-native-ios` la segueix posant native-keyboard.js i pot ser
 * útil en el futur per a fixes específics natius — però ja no toca geometria. */


/* ============ Brief 042-fix4b (7/5/2026) — padding-top extra Capacitor iOS ============
 *
 * Confirmat via Web Inspector connectat al iPhone 17 (Pere 7/5/2026 ~19:45):
 *
 *   getComputedStyle(.dashboard-header).paddingTop = "8px"
 *
 * És a dir: amb contentInset:'automatic', el WebView NO s'estén sota la status
 * bar (per això la barra de baix funciona via env(safe-area-inset-bottom)=34px).
 * Però des del punt de vista del WebView, com que ja comença sota la status bar,
 * env(safe-area-inset-top) retorna 0 — el WebView no té res a compensar.
 *
 * Resultat: el header rep només `var(--space-2)` = 8px de padding-top, que és
 * insuficient. Visualment els títols queden enganxats a la part superior.
 *
 * Fix: padding-top hardcoded de 18px només quan estem a Capacitor iOS (classe
 * is-native-ios al body, posada per native-keyboard.js). Web normal i Safari
 * iPad mantenen el padding base de var(--space-2). */

body.is-native-ios .dashboard-header,
body.is-native-ios .topbar {
  padding-top: 50px !important;
}


/* ============ Brief 042-fix6 (7/5/2026) — compensació visualViewport iOS ============
 *
 * iOS WKWebView desplaça visualViewport.offsetTop quan el teclat puja
 * (confirmat: 17px al iPhone 17). Tot el contingut sembla pujar amb el
 * teclat — incloent el header sticky/relative.
 *
 * native-keyboard.js sincronitza --vv-offset-top amb el valor real i
 * aquí el compensem amb translateY positiu al header. Així el header
 * queda fix visualment encara que iOS hagi desplaçat el viewport. */

body.is-native-ios .dashboard-header,
body.is-native-ios .topbar {
  transform: translateY(var(--vv-offset-top, 0px));
  transition: transform 220ms cubic-bezier(0.32, 0.72, 0, 1);
}


/* ============ Brief 042-fix7 (7/5/2026) — menú kebab al topbar ============
 *
 * Substitueix el botó "Salir" per un botó icona ⋮ (kebab vertical, estil iOS)
 * que obre un popover amb opcions. De moment només té "Cerrar sesión", però
 * l'estructura és extensible per a futurs (Configuración, Privacidad, etc.).
 *
 * Disseny: monocromàtic coherent amb la resta del producte. Popover amb fons
 * sòlid var(--bg-0), border subtle, sombra discreta. */

.topbar-menu-wrap {
  position: relative;
  display: inline-block;
}

.topbar-menu-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 999px;
  color: var(--text-1);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: background var(--dur) var(--ease);
}

.topbar-menu-btn:hover,
.topbar-menu-btn:focus-visible {
  background: var(--bg-1);
  outline: none;
}

.topbar-menu-btn[aria-expanded="true"] {
  background: var(--bg-1);
}

.topbar-menu-popover {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  min-width: 180px;
  padding: 6px;
  background: var(--bg-0);
  border: 1px solid var(--line-soft);
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
  z-index: 100;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.topbar-menu-popover[hidden] {
  display: none;
}

.topbar-menu-item {
  display: block;
  width: 100%;
  padding: 10px 14px;
  text-align: left;
  background: transparent;
  border: 0;
  border-radius: 8px;
  color: var(--text-1);
  font-family: inherit;
  font-size: 0.92rem;
  line-height: 1.2;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: background var(--dur) var(--ease);
}

.topbar-menu-item:hover,
.topbar-menu-item:focus-visible {
  background: var(--bg-1);
  outline: none;
}

.topbar-menu-item:active {
  opacity: 0.7;
}
