/* theme.css — the light theme, in ONE place.
 *
 * Why this is a real stylesheet and not injected by pwa.js: a <link> in <head>
 * blocks first paint, so the page renders in the right theme immediately. When
 * these rules were injected by a deferred script the browser painted the DARK
 * theme first and flipped afterwards — a visible flash on every single tab
 * click, which is exactly what "the theme should follow me while navigating"
 * means in practice.
 *
 * Paired with a one-line inline script in each page's <head> that sets
 * data-theme from localStorage before anything renders. Both halves are needed:
 * the attribute alone with late CSS still paints dark, and the CSS alone with a
 * late attribute does too.
 *
 * The design system is token-based, so overriding the tokens flips almost
 * everything at once. The rules under it are the exceptions: gradients and
 * alpha washes that cannot be expressed as a single token. They live here
 * rather than in each page's own CSS because that is how four pages (crm,
 * estados, promo, portadas) ended up with a black sidebar on a white page.
 * A rule whose class is absent on a page simply does nothing.
 */

/* ---- barras de desplazamiento ------------------------------------------
 * Salían BLANCAS sobre el panel oscuro por una razón concreta: el tema oscuro
 * nunca declaraba `color-scheme`, así que el navegador dibujaba sus controles
 * nativos en claro. Declararlo es el arreglo de fondo — vale para las barras,
 * y también para los desplegables y los selectores de fecha nativos.
 * El color explícito va después para que la barra sea discreta y de la paleta,
 * en vez del gris del sistema. */
:root, :root[data-theme="dark"] { color-scheme: dark; }

/* El pulgar va TEÑIDO DE ORO a baja opacidad, no en --ink-line. Ese token es el
 * color de los bordes: sobre el fondo (#0E0A07) queda más CLARO que la página,
 * así que la barra se leía como una tira gris pálida — que es exactamente lo que
 * se quería quitar. Con el oro del sol al 22% se ve que pertenece a la interfaz
 * y nunca se confunde con la barra blanca del sistema.
 * Comprobado que este motor SÍ honra scrollbar-color: al forzarlo en rojo/verde,
 * la barra cambió. */
* { scrollbar-width: thin; scrollbar-color: rgba(255, 200, 61, .22) transparent; }
*:hover { scrollbar-color: rgba(255, 200, 61, .42) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: rgba(255, 200, 61, .22); border-radius: 999px;
  border: 2px solid transparent; background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover { background: rgba(255, 200, 61, .42); background-clip: padding-box; }
::-webkit-scrollbar-corner { background: transparent; }

/* En tema claro el oro sobre blanco no se ve: ahí manda el tono de tinta. */
:root[data-theme="light"] * { scrollbar-color: rgba(33, 26, 18, .30) transparent; }
:root[data-theme="light"] ::-webkit-scrollbar-thumb { background: rgba(33, 26, 18, .30); background-clip: padding-box; }

:root[data-theme="light"] {
  --ink: #FAF6EF;
  --ink-raised: #FFFFFF;
  --ink-line: #E8E0D2;
  --text: #211A12;
  --muted: #736A5B;
  --up: #1F9D57;
  color-scheme: light;
}

/* the sidebar is a gradient, so it cannot ride on --ink alone */
:root[data-theme="light"] .side { background: linear-gradient(180deg, #FFFFFF, #FAF6EF); }
:root[data-theme="light"] .nav a:hover { background: rgba(0, 0, 0, .05); }

/* white-alpha washes read as "slightly lighter than the dark ground";
   on a white ground they are invisible, so they invert */
:root[data-theme="light"] .bar .track-b,
:root[data-theme="light"] .eco-row .eco-bar { background: rgba(0, 0, 0, .06); }
:root[data-theme="light"] a.feed-row:hover,
:root[data-theme="light"] tr.ss-tr:hover td,
:root[data-theme="light"] .row:hover,
:root[data-theme="light"] .st-row:hover,
:root[data-theme="light"] .top-row:hover { background: rgba(0, 0, 0, .04); }

/* inputs sit DARKER than their panel in dark mode; on a white panel that reads
   as a hole, so they go white and lean on the border instead */
:root[data-theme="light"] .field input,
:root[data-theme="light"] .field textarea,
:root[data-theme="light"] .field select,
:root[data-theme="light"] .frm input,
:root[data-theme="light"] .frm textarea,
:root[data-theme="light"] .frm select { background: #FFFFFF; }

/* ═══════════════════════════════════════════════════════════════════════
 * LAYOUT RESPONSIVE — una sola capa para las 25 páginas del portal.
 *
 * POR QUÉ AQUÍ Y NO EN CADA PÁGINA: las reglas responsive estaban copiadas
 * y pegadas página a página, y habían derivado. `proyectos` sólo apilaba la
 * rejilla y dejaba la barra lateral en columna, así que se salía de la
 * pantalla en el móvil; `estados` hacía el bloque completo; `lanzamientos`
 * cortaba a 980 y el resto a 900. De ahí que las cosas se recolocaran
 * distinto según la pestaña.
 *
 * POR QUÉ CADA REGLA LLEVA `body` DELANTE: esta hoja se enlaza en el <head>
 * y el <style> de cada página va DESPUÉS, así que a igual especificidad gana
 * la página. Con `body .side` (0,0,1,1) esta capa gana a su `.side` (0,0,1,0)
 * sin tener que tocar los 25 archivos ni usar !important.
 *
 * Cortes: 1100 (portátil estrecho) · 900 (la barra se acuesta) · 560 (móvil).
 * ═══════════════════════════════════════════════════════════════════════ */

/* ---- ancho: que las pestañas ocupen la pantalla -------------------------
 * Cada página capaba .main entre 1100 y 1240px, así que en un monitor ancho
 * quedaba una banda muerta a la derecha. El ancho lo pone ahora la ventana;
 * el aire lo pone el padding, que crece con ella en vez de a saltos. */
body .main{
  max-width:none;
  padding:clamp(18px, 2.2vw, 32px) clamp(16px, 2.6vw, 40px) 56px;
}

/* Un hijo de grid o flex NO se encoge por debajo de su contenido si no se le
 * dice: `min-width:auto` es el valor por defecto y es la causa más común de
 * que algo se salga por la derecha al estrechar. */
body .shell > *, body .main{ min-width:0; }
body img, body canvas, body video{ max-width:100%; height:auto; }

/* ---- portátil estrecho -------------------------------------------------- */
@media (max-width:1100px){
  /* Los paneles de lista + detalle: a una sola columna antes de que el
   * detalle quede tan estrecho que no se pueda leer. */
  body .cols, body .tpl-wrap, body .cvwrap{ grid-template-columns:1fr; }
  body .list{ max-height:none; }
}

/* UN SOLO punto de corte para la barra, y este bloque es el que lo impone.
 *
 * Cinco páginas la colapsaban a 980 y nav.js aplana sus módulos a 900. Entre
 * 901 y 980 quedaba lo peor de los dos: la barra ya era una tira horizontal
 * pero el menú seguía dibujando módulos plegables en columna, así que se veían
 * cinco botones de módulo en fila en lugar de las pestañas. Aquí se fuerza la
 * forma de escritorio hasta 900, que es donde nav.js cambia. */
@media (min-width:901px){
  /* 264 y no 248: en 248 el pie sumaba ~210px de controles contra 212 útiles,
   * así que iba justo — y al reservar el hueco del deslizador (nav.js) se
   * quedaba en 197 y «Cerrar sesión» caía a su propia línea. Con 264 hay
   * ~228 útiles, o ~213 con el hueco reservado, y los tres controles caben
   * con holgura en vez de por los pelos. */
  body .shell{ grid-template-columns:264px 1fr; }

  /* EL PIE DE LA BARRA: una fila de tres y el tema debajo.
   *
   * Estaban uno encima de otro —perfil, cerrar sesión, idioma, tema— gastando
   * cuatro líneas al final de la barra. En fila caben los tres controles y el
   * tema queda como una barra propia debajo, que es donde se busca.
   *
   * El orden en el marcado es perfil · cerrar sesión · idioma, y el tema lo
   * inserta pwa.js detrás del idioma. Se reordena con `order` en vez de tocar
   * el marcado de 25 páginas.
   *
   * El nombre y el puesto se retiran de la fila: tres controles no caben en los
   * 212px útiles de la barra con un nombre al lado. Siguen a un palmo — el
   * avatar los lleva en su `title`. */
  /* Una sola regla para el pie en escritorio. Antes había dos en este mismo
   * bloque —esta y una anterior que lo devolvía a columna— y ganaba la de
   * abajo, así que la fila no llegaba a formarse. */
  body .side-foot{
    margin:auto 0 0;
    flex-direction:row; flex-wrap:wrap; align-items:center;
    justify-content:space-between; gap:8px;
  }
  body .side-foot .who{ order:1; padding:0; }
  body .side-foot .who .meta{ display:none; }
  body .side-foot #langToggle{ order:2; flex-direction:row; gap:6px; }
  /* Tres idiomas con el relleno de siempre (11px a cada lado) ocupan ~132px de
   * los ~212 que hay: más de la mitad del pie para algo que se toca una vez.
   * Aquí van más ajustadas — sólo aquí: en el login y en las páginas públicas
   * el mismo control conserva su tamaño porque allí sobra sitio. */
  body .side-foot .langtoggle{ padding:2px; gap:2px; }
  body .side-foot .langtoggle .lt{ padding:4px 8px; font-size:10.5px; letter-spacing:.04em; }
  body .side-foot .signout{ order:3; padding:6px; }
  body .side-foot .signout span{ display:none; }
  body .side-foot #themeToggle{
    order:4; flex-basis:100%; margin:0 !important;
    display:flex !important; align-items:center; justify-content:center;
  }
  body .side{ position:sticky; top:0; height:100vh; flex-direction:column; align-items:stretch; }
  body .side .navgroup{ flex-direction:column; }
}

/* ---- la barra lateral se acuesta ---------------------------------------
 * UN SOLO punto para todas. Antes unas cortaban a 980 y otras a 900, y al
 * arrastrar el borde de la ventana cada pestaña saltaba en un sitio. */
@media (max-width:900px){
  body .shell{ grid-template-columns:1fr; }
  body .side{
    position:static; height:auto; width:auto;
    flex-direction:row; align-items:center; flex-wrap:wrap; gap:14px;
    padding:14px 16px;
  }
  body .side .navgroup{ flex-direction:row; flex-wrap:wrap; }
  body .side .navgroup > .eyebrow{ display:none; }
  body .side-foot{ margin:0 0 0 auto; flex-direction:row; gap:14px; align-items:center; }

  /* LOS CONTROLES DE CUENTA, AL PIE DE LA PÁGINA.
   *
   * Apretados arriba junto a la marca y las pestañas, el avatar, cerrar
   * sesión, el idioma y el tema se amontonaban en una franja ilegible. Abajo,
   * fijos, están donde el pulgar llega y dejan la cabecera en una sola línea.
   * No se pueden mover en el árbol —viven dentro de .side— pero sí sacarlos
   * del flujo. */
  body .side-foot{
    position:fixed; left:0; right:0; bottom:0; z-index:40;
    margin:0; padding:8px 14px calc(8px + env(safe-area-inset-bottom));
    display:flex; flex-direction:row; align-items:center; justify-content:space-between; gap:14px;
    background:var(--ink-raised); border-top:1px solid var(--ink-line);
  }
  /* Las tres piezas a la misma altura y centradas.
   *
   * El botón de idioma salía más alto que los demás por dos cosas suyas, no de
   * esta barra: `.langtoggle` lleva `align-self:flex-start`, que en una COLUMNA
   * lo pegaba a la izquierda (para lo que se escribió) pero en una FILA lo pega
   * ARRIBA; y el selector Sello/Artista que inyecta auth-guard trae un
   * marginBottom de 6px en línea, pensado para cuando iba apilado encima. */
  body .side-foot > *{ align-self:center; margin:0; min-height:38px; }
  body .side-foot .langtoggle{ align-self:center; margin:0; }
  /* En FILA aquí abajo. Sin decirlo, heredaba el `column` de la barra
   * lateral —la regla de arriba gana en especificidad pero no declara la
   * dirección— y los dos selectores se apilaban, dejando esta pieza al doble
   * de alto que las otras dos. */
  body .side-foot #langToggle{ display:flex; flex-direction:row; align-items:center; gap:8px; }
  body .side-foot .who{ padding:0; min-width:0; }
  body .side-foot .signout{ padding:0; white-space:nowrap; }
  /* Y el contenido deja de esconderse debajo. */
  body .main{ padding-bottom:84px; }
  body .toast{ bottom:76px; }

  /* EL MENÚ ABIERTO, EN REJILLA.
   *
   * Desplegado era una fila que envolvía, así que cada pestaña medía lo que
   * medía su texto: «Resumen» al lado de «Lanzamientos» al lado de «CRM»,
   * en filas de longitudes distintas y con huecos irregulares al final de cada
   * una. En rejilla todas las celdas miden igual y las columnas quedan a plomo.
   *
   * auto-fill con un mínimo: dos columnas en un teléfono, tres o cuatro en una
   * tablet, sin tener que elegir el número a mano. */
  body .side.abierta .nav{
    display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr));
    gap:6px; width:100%; margin-top:10px;
  }
  body .side.abierta .nav a{ padding:11px 12px; border-radius:10px; }
  /* Los módulos van aplanados (display:contents), así que sus hijos son celdas
   * de esta misma rejilla y no una fila dentro de una celda. */
  body .side.abierta .nav .navmod,
  body .side.abierta .nav .navmod-c{ display:contents; }

  /* Rejillas de N columnas fijas: a dos, que en una tablet siguen cabiendo. */
  body .stats, body .lp-perf, body .fxgrid, body .np-grid, body .board,
  body .bgs, body .suns, body .saved{ grid-template-columns:repeat(2,1fr); }

  /* LO ANCHO SE ARRASTRA DENTRO DE SU TARJETA, NUNCA LA PÁGINA.
   *
   * Esto lo tenía en .main y estaba mal: convertía la columna entera en un
   * carril horizontal, así que para leer cualquier cosa había que arrastrar de
   * lado. Puesto en las tarjetas, la página no se mueve nunca en horizontal y
   * sólo la tabla que de verdad no cabe se desplaza dentro de su caja. */
  body .panel, body .card, body .detail, body .ss-panel, body .box{ overflow-x:auto; }

  /* Una cadena sin espacios —un ISRC, un correo, un enlace— no puede ensanchar
   * la página. Es la otra causa habitual del arrastre lateral en el móvil. */
  body .main{ overflow-wrap:anywhere; }
  body .num, body .isrc, body code{ overflow-wrap:anywhere; }
}

/* El aviso flotante mide 340px fijos y se ancla a 20px del borde: en un móvil
 * de 375 tapa la pantalla entera. Aparece igual en 16 páginas, así que se
 * arregla una vez. */
body .toast{ max-width:calc(100vw - 28px); }

/* LA PASTILLA DE IDIOMA, para las páginas que nunca la definieron.
 *
 * Ocho —Ajustes, Eventos, Legal, Portadas, Proyectos, Plantillas, Vault y el
 * alta— se escribieron sin copiar este bloque, así que en ellas ES/EN/PT salían
 * como tres botones sueltos, sin pastilla ni relleno en el activo: el mismo
 * control con dos aspectos según la pestaña en la que estuvieras.
 *
 * ESTA regla va SIN `body` delante, al revés que todo lo demás en esta hoja.
 * Aquí NO se quiere ganar: las 18 páginas que ya lo definen (con valores
 * idénticos) y el acceso, que lo ajusta a su tarjeta centrada, tienen que
 * seguir mandando. Esto es sólo el respaldo de la que no lo trae, y por eso se
 * queda a la misma especificidad y pierde por orden de aparición. */
.langtoggle{ display:inline-flex; gap:2px; border:1px solid var(--ink-line); border-radius:999px; padding:3px; }
.langtoggle .lt{ background:none; color:var(--muted); font-weight:700; font-size:11px; letter-spacing:.06em;
  border:0; border-radius:999px; padding:5px 11px; cursor:pointer; font-family:inherit; }
.langtoggle .lt.on{ background:var(--sun-grad); color:var(--ink); }

/* El idioma (y el selector Sello/Artista de las cuentas dobles) lo definen las
 * DOS media queries de arriba, y entre las dos cubren cualquier ancho: en fila
 * en la barra lateral y en fila también cuando la barra se va abajo.
 *
 * Aquí había una regla suelta que los ponía en COLUMNA. Nunca llegó a aplicarse
 * en la barra —las media queries la pisaban— pero sí alcanzaba a las páginas sin
 * barra, acceso y alta de contraseña, donde apilaba ES/EN/PT en vertical dentro
 * de una tarjeta centrada. Al acotarla a .side-foot pasó a tener el mismo peso
 * que las de arriba y, por ir después, ganó: entonces se apilaron en el panel.
 * No se arregla acotándola, se quita: no hay ningún ancho que quiera columna. */

/* ---- móvil -------------------------------------------------------------- */
@media (max-width:560px){
  body .toast{ left:14px; right:14px; max-width:none; }
  /* El nombre y el puesto se comen el ancho de la barra: basta el avatar, y
   * "Cerrar sesión" se queda en su icono. */
  body .side-foot .who .meta{ display:none; }
  body .side-foot .signout span{ display:none; }
  body .side-foot{ gap:10px; }
  /* Cabeceras y filas de dos piezas que no envolvían. */
  body .pagehead, body .dhead, body .rhead, body .hero{ flex-wrap:wrap; }
  body .rhead .cover, body .cover{ max-width:100%; }
  /* Formularios: un campo por línea antes que dos cortados. */
  body .frm, body .row, body .cbar, body .cmsgs{ flex-wrap:wrap; }
  body .frm input, body .frm select, body .frm textarea{ min-width:0; flex:1 1 100%; }
  body .main{ padding:14px 12px 40px; }
  body .stats, body .lp-perf, body .fxgrid, body .np-grid, body .board,
  body .bgs, body .suns, body .saved{ grid-template-columns:1fr; }
  /* Rejillas de tarjetas: el mínimo de 280px no cabe en 375 con padding. */
  body .grid, body .relgrid, body .cards{ grid-template-columns:1fr; }
  /* Barras de 3 columnas con anchos fijos a los lados. */
  body .bar{ grid-template-columns:1fr; gap:4px; }
  /* Modales: pegados a la pantalla, no a un ancho de escritorio. */
  body .modal, body .modal-card, body .sheet{ width:auto; max-width:calc(100vw - 24px); padding:20px 16px; }
  /* Un botón o un campo no deberían obligar a hacer scroll lateral. */
  body input, body select, body textarea, body button{ max-width:100%; }

  /* PIEZAS QUE NO ENCOGEN. `flex:0 0 200px` significa literalmente «doscientos
   * píxeles pase lo que pase», y con el texto de al lado en nowrap la fila mide
   * más que el teléfono. Se ve en la ficha del artista: la barra de progreso
   * más «63% ficha completa» suman 335px antes de contar la foto ni el margen,
   * y el porcentaje acababa 103px fuera de la pantalla.
   *
   * Aquí abajo esas medidas pasan a ser un mínimo, no una imposición. */
  /* La foto, arriba y no a media altura: al apilarse la columna de al lado
   * crece, y con align-items:center la foto quedaba flotando en el centro con
   * un hueco encima. */
  body .dhead, body .rhead{ align-items:flex-start; }
  body .completion{ flex-wrap:wrap; }
  body .cbar{ flex:1 1 110px; max-width:none; min-width:0; }
  body .ss-plat{ flex-wrap:wrap; }
  body .ss-pn{ flex:1 1 auto; }
  body .ss-mini{ margin-left:0; }
  body .audtot .k{ min-width:0; }
  /* Y lo que quede con un ancho mínimo mayor que la pantalla, que ceda. */
  body .main [style*="min-width"]{ max-width:100%; }
}

/* ---- el gráfico de ingresos --------------------------------------------
 * Los meses se pintan aquí, encima del SVG, y no dentro de él: el gráfico
 * llena el ancho con preserveAspectRatio="none", que escala X e Y por
 * separado, y eso al texto lo deforma (estirado a lo ancho, aplastado a lo
 * alto). La posición sigue siendo exacta porque va en % del mismo ancho. */
body .chartwrap{ position:relative; }
body .chartwrap .chartx{ position:relative; height:16px; margin-top:2px; }
body .chartwrap .chartx span{
  position:absolute; transform:translateX(-50%); white-space:nowrap;
  font:11px/1 "Space Mono", ui-monospace, monospace; color:var(--muted);
}
body .chart-vacio{
  display:grid; place-items:center; min-height:200px;
  font:13px "Space Mono", ui-monospace, monospace; color:var(--muted);
}
/* El año, cuando el eje lo lleva (enero y el primer mes). */
body .chartwrap .chartx span i{ font-style:normal; opacity:.55; margin-left:3px; }

/* ---- un punto por mes, con su cifra al pasar el cursor ------------------
 * La capa va EXACTAMENTE sobre el SVG: .chartarea no crea contexto de bloque,
 * así que el margen superior del SVG se colapsa hacia fuera y el borde de la
 * caja coincide con el del gráfico. Por eso `inset:0` cae donde debe sin tener
 * que repetir aquí la altura, que cada página fija a la suya (230px en los
 * paneles, 200px en Estados). */
body .chartwrap .chartarea{ position:relative; }
body .chartwrap .chartdots{ position:absolute; inset:0; pointer-events:none; }
body .chartwrap .chartdot{
  /* box-sizing explícito: el borde de 2px suma al ancho si no, y entonces el
   * margen negativo que lo centra deja de cuadrar — el punto quedaba 2px abajo
   * y 2px a la derecha de su sitio en la línea. */
  position:absolute; box-sizing:border-box; width:12px; height:12px; margin:-6px 0 0 -6px;
  border-radius:50%; background:var(--ink); border:2px solid var(--sun-gold);
  pointer-events:auto; cursor:pointer; transition:transform .12s, background .12s;
}
body .chartwrap .chartdot:hover, body .chartwrap .chartdot:focus-visible{
  background:var(--sun-gold); transform:scale(1.35); outline:none;
}
body .chartwrap .chartdot i{
  position:absolute; left:50%; bottom:calc(100% + 9px); transform:translateX(-50%);
  background:var(--ink-raised); border:1px solid var(--ink-line); border-radius:8px;
  padding:5px 9px; font:11.5px/1.35 "Space Mono", ui-monospace, monospace;
  font-style:normal; color:var(--text); white-space:nowrap;
  opacity:0; pointer-events:none; transition:opacity .12s; box-shadow:0 6px 18px rgba(0,0,0,.45);
}
body .chartwrap .chartdot:hover i, body .chartwrap .chartdot:focus i{ opacity:1; }
body .chartwrap .chartdot.izq i{ left:0; transform:none; }
body .chartwrap .chartdot.der i{ left:auto; right:0; transform:none; }

/* En pantallas estrechas MUCHOS meses no caben sin encimarse: se dejan los
 * pares, que siguen dando la escala temporal. Ahora sólo cuando de verdad hay
 * muchos (clase `denso`, >8 etiquetas): esta regla disparaba con cualquier
 * número, así que con cuatro meses en pantalla escondía dos — eso no es
 * ordenar el eje, es esconder datos. Su comentario decía «doce meses», señal
 * de que quien la escribió daba por hecho que se pintaban los doce; el tope de
 * seis que había en el código nunca fue intencional. */
@media (max-width:700px){
  body .chartwrap .chartx.denso span:nth-child(even){ display:none; }
  /* «jun 25» mide ~40px y a 375px hay 27.8px por mes; el mes solo entra. */
  body .chartwrap .chartx span i{ display:none; }
}
