/* ============================================================
   Colección de Gemas — hoja de estilos
   Estética: joyería editorial. Serif (Cormorant) para titulares,
   Inter para el cuerpo. Borgoña profundo + acento dorado sobre marfil.
   ============================================================ */
:root{
  --burg:#6d1a2e;         /* borgoña principal, como TINTA (texto, bordes) */
  --burg2:#8b2a3d;        /* borgoña hover */
  --burg-deep:#4a0f1f;    /* borgoña oscuro (degradados) */

  /* El borgoña cuando es FONDO y no tinta: la barra de arriba, la cabecera de
     una tabla, un botón macizo. Son dos trabajos distintos y hacían falta dos
     fichas: en modo oscuro el borgoña se aclara para poder leerse como texto,
     y usar ese mismo valor de fondo dejaba la barra superior **más clara de
     noche que de día**. Con dos fichas, cada uso va por su lado. */
  --burg-fondo:#6d1a2e;
  --burg-fondo-2:#8b2a3d;   /* el mismo, al pasar el ratón */
  --sobre-burg:#ffffff;     /* texto encima de un fondo borgoña */
  --gold:#c39b4a;         /* dorado acento */
  --gold-soft:#e7d3a1;    /* dorado claro */
  --ink:#2a2320;          /* texto principal */
  --muted:#8a807a;        /* texto secundario */
  --line:#ece4dc;         /* bordes */
  --bg:#fcf9f6;           /* fondo marfil */
  --card:#ffffff;         /* tarjetas */
  --ok:#1f7a4d;           /* verde éxito */
  --shadow:0 8px 30px rgba(74,15,31,.07);
  --shadow-sm:0 2px 10px rgba(74,15,31,.06);
  --radius:14px;

  /* --- Fichas con nombre, no colores sueltos (V-04) ---------------------
     Antes, cada fondo se escribía a mano aquí y otra vez, con otro valor, en
     el bloque de modo oscuro del final. Cualquier cosa nueva había que
     parchearla en los dos sitios, y olvidarse de uno no rompía nada: solo
     quedaba feo de noche, que es peor porque no se nota hasta que alguien lo ve.

     Desde aquí, una regla dice QUÉ es (`var(--superficie)`), no de qué color
     va, y claro y oscuro son solo dos juegos de valores. */

  /* Superficies, del fondo de la página hacia arriba. */
  --superficie:#fefcf9;       /* un bloque dentro de una tarjeta */
  --superficie-2:#faf5ee;     /* el mismo, al pasar el ratón por encima */
  --superficie-3:#f9f3ec;     /* hueco de foto, barra, placeholder */
  --campo:#fffefd;            /* el fondo de un input */
  --campo-activo:#ffffff;     /* ...cuando tiene el foco */
  --chip-fondo:#f4eee8;       /* la píldora de un chip neutro */
  --sobre-color:#ffffff;      /* texto encima de borgoña o de dorado */

  /* Los cuatro tonos con significado. Panel = área grande; chip = píldora.
     Son distintos a propósito: un chip necesita más cuerpo para leerse. */
  --ok-panel:#f0f7f2;
  --ok-borde:#cfe7d9;
  --ok-chip:#e4f5ec;
  --aviso-panel:#fdf0e2;
  --aviso-borde:#eeddc2;
  --aviso-chip:#fdf0e2;
  --aviso-tinta:#a86a1f;
  --oro-panel:#faf5ea;
  --oro-borde:#ecdfc2;
  --oro-chip:#f8f0dc;
  --oro-tinta:#8a6a1f;
  --peligro-panel:#f4e2e2;
  --peligro-tinta:#a23b3b;

  --barra:#f4eee7;            /* el carril de una barra de progreso */
  --flash-fondo:#fff7e8;      /* el aviso que sale arriba tras hacer algo */
  --flash-borde:var(--gold-soft);
}
*{ box-sizing:border-box; }

/* `hidden` tiene que ganar SIEMPRE.
   El atributo del HTML solo aplica `display:none` desde la hoja del navegador,
   que pierde contra cualquier clase con su propio `display`. Sin esta línea, un
   `<div class="respondiendo" hidden>` se ve igual —y eso es justo lo que pasaba
   con el cartel de «respondiendo a», que no se iba nunca—. Afecta a todo lo que
   nace escondido y lo enciende JavaScript: la zona de soltar fotos, las muestras
   del cuentagotas, el editor de un mensaje. */
[hidden]{ display:none !important; }
html,body{ height:100%; }
body{
  margin:0; color:var(--ink); background:var(--bg);
  font-family:'Inter',system-ui,Arial,sans-serif;
  font-size:15px; line-height:1.55; -webkit-font-smoothing:antialiased;
}
h1,h2,h3{ font-family:'Cormorant Garamond',Georgia,serif; color:var(--burg); font-weight:700; letter-spacing:.2px; }
h1{ font-size:38px; margin:0 0 6px; line-height:1.1; }
h2{ font-size:26px; margin:0 0 14px; }
h3{ font-size:22px; margin:0 0 6px; }
a{ color:var(--burg); }
.eyebrow{ text-transform:uppercase; letter-spacing:.18em; font-size:11px; font-weight:600;
  color:var(--gold); margin:0 0 4px; }

/* ---------- Barra superior ---------- */
.topbar{
  display:flex; align-items:center; gap:26px;
  background:linear-gradient(100deg,var(--burg-deep),var(--burg-fondo));
  color:#fff; padding:0 26px; height:64px;
  box-shadow:0 2px 20px rgba(74,15,31,.25); position:sticky; top:0; z-index:50;
}
.brand{ font-family:'Cormorant Garamond',serif; font-size:23px; font-weight:700;
  color:#fff; text-decoration:none; display:flex; align-items:center; gap:9px; white-space:nowrap; }
.brand-gem{ color:var(--gold-soft); font-size:16px; }
.nav{ display:flex; gap:6px; margin-left:8px; min-width:0; }
/* En un monitor muy ancho basta el texto, así que el icono se apaga.
   **Esta línea tiene que ir por encima del `@media` que lo vuelve a
   encender**: entre dos reglas igual de específicas manda la última que se
   lea, y estar dentro de un `@media` no da preferencia ninguna. Estuvo abajo
   del todo y el resultado era que la barra salía con nueve enlaces vacíos en
   cualquier pantalla de menos de 1680 px — o sea, en casi todas. */
.nav-icono{ display:none; }
.nav a{ color:rgba(255,255,255,.82); text-decoration:none; font-size:14px; font-weight:500;
  padding:8px 14px; border-radius:8px; transition:.15s; }
.nav a:hover{ background:rgba(255,255,255,.1); color:#fff; }
.nav a.active{ background:rgba(255,255,255,.16); color:#fff; box-shadow:inset 0 -2px 0 var(--gold-soft); }
.nav-user{ margin-left:auto; display:flex; align-items:center; gap:12px; flex-shrink:0; }

/* --- La barra superior, cuando las secciones ya no caben ---------------
   Nació con seis secciones y hoy tiene nueve. Sumando la marca, el buscador
   y el usuario, la fila pedía ~1600 px: **no cabía ni en un monitor de
   1440**, y en un móvil pidiendo «versión de escritorio» —que finge tener
   980— se salía por 600.

   La solución no es apretar: es **quitar las palabras y dejar los iconos**,
   que es lo que hace cualquier barra con muchas secciones. El texto no se
   borra con `display:none` sino que se esconde a la vista y sigue ahí para
   quien navegue con lector de pantalla, y se añade un `title` para que al
   pasar el ratón se lea igual. */

@media (max-width:1680px){
  /* Solo iconos. El corte está aquí y no más abajo porque las nueve etiquetas,
     con la marca, el buscador y el usuario, piden cerca de **1700 px**. Un
     portátil de 1366 o de 1440 no da de sí, ni de lejos. Con las palabras se
     queda solo un monitor grande, que es la verdad aunque apetezca poner el
     corte más abajo y fingir que caben.

     El texto no se borra con `display:none`: se esconde a la vista y sigue en
     el HTML para quien navegue con lector de pantalla. Y cada enlace lleva un
     `title` para que al pasar el ratón se lea igual. */
  .topbar{ gap:16px; padding:0 18px; }
  .nav-txt{ position:absolute; width:1px; height:1px; padding:0; margin:-1px;
    overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }
  .nav a{ padding:8px 11px; }
  /* En escritorio ancho los iconos están apagados (`.nav-icono{display:none}`)
     porque basta el texto. Al esconder el texto hay que **encenderlos**: sin
     esta línea los enlaces se quedaban vacíos y la barra parecía en blanco. */
  .nav-icono{ display:inline-block; font-size:19px; line-height:1; }
  .buscador input{ width:160px; }
  .buscador input:focus{ width:210px; }
}

@media (max-width:1100px){
  /* Y aquí ya sobran la palabra de la marca y el nombre del usuario: queda el
     rombo y la inicial, que es lo que se reconoce igual. */
  .brand-txt{ display:none; }
  .brand{ font-size:26px; }
  .user-name{ display:none; }
  .buscador input{ width:120px; }
  .buscador input:focus{ width:170px; }
}

.user-link{ display:flex; align-items:center; gap:9px; text-decoration:none; color:#fff;
  padding:5px 10px 5px 5px; border-radius:22px; transition:.15s; }
.user-link:hover{ background:rgba(255,255,255,.1); }
.user-link.active{ background:rgba(255,255,255,.16); box-shadow:inset 0 -2px 0 var(--gold-soft); }
.avatar{ width:34px; height:34px; border-radius:50%; display:grid; place-items:center;
  background:var(--gold); color:var(--burg-deep); font-weight:700; font-size:15px; flex-shrink:0; }
.user-name{ font-size:14px; opacity:.95; }
.btn-out{ color:var(--sobre-color); text-decoration:none; background:rgba(255,255,255,.12);
  padding:7px 14px; border-radius:8px; font-size:13px; font-weight:500; transition:.15s; }
.btn-out:hover{ background:rgba(255,255,255,.22); }

/* ---------- Contenedor ---------- */
.container{ max-width:1080px; margin:38px auto; padding:0 22px; }
.header-row{ display:flex; justify-content:space-between; align-items:flex-end; margin-bottom:22px; gap:16px; }
.section-title{ margin:34px 0 16px; padding-bottom:8px; border-bottom:1px solid var(--line); }
.back-link{ display:inline-block; margin-bottom:14px; color:var(--muted); text-decoration:none; font-size:14px; }
.back-link:hover{ color:var(--burg); }

/* ---------- Botones ---------- */
.btn{ display:inline-block; background:var(--burg-fondo); color:var(--sobre-burg); border:none;
  padding:11px 20px; border-radius:10px; font-size:14px; font-weight:600; cursor:pointer;
  text-decoration:none; transition:.15s; box-shadow:var(--shadow-sm); }
.btn:hover{ background:var(--burg-fondo-2); transform:translateY(-1px); }
.btn-block{ width:100%; text-align:center; margin-top:8px; }
.btn-ghost{ display:inline-block; background:transparent; color:var(--burg); border:1px solid var(--line);
  padding:10px 18px; border-radius:10px; font-size:14px; font-weight:600; cursor:pointer;
  text-decoration:none; transition:.15s; }
.btn-ghost:hover{ border-color:var(--burg); background:var(--campo-activo); }
.btn-sec{ display:inline-block; background:var(--superficie-3); color:var(--burg); border:1px dashed var(--gold);
  padding:9px 16px; border-radius:10px; font-size:13px; font-weight:600; cursor:pointer;
  text-decoration:none; margin-top:10px; }
.btn-sec:hover{ background:var(--oro-chip); }

/* ---------- Hero del panel ---------- */
.hero{
  background:linear-gradient(120deg,var(--burg-deep),var(--burg-fondo) 60%,var(--burg-fondo-2));
  color:#fff; border-radius:20px; padding:34px 36px; margin-bottom:8px;
  display:flex; justify-content:space-between; align-items:center; gap:30px; flex-wrap:wrap;
  box-shadow:var(--shadow); position:relative; overflow:hidden;
}
.hero::after{ content:"◆"; position:absolute; right:-10px; top:-30px; font-size:190px;
  color:rgba(255,255,255,.05); pointer-events:none; }
.hero .eyebrow{ color:var(--gold-soft); }
.hero h1{ color:#fff; }
.hero-sub{ margin:6px 0 0; opacity:.85; max-width:420px; }
.stat-row{ display:flex; gap:14px; position:relative; z-index:1; }
.stat{ background:rgba(255,255,255,.1); border:1px solid rgba(255,255,255,.15);
  border-radius:14px; padding:16px 20px; text-align:center; min-width:104px; backdrop-filter:blur(4px); }
.stat-num{ display:block; font-family:'Cormorant Garamond',serif; font-size:32px; font-weight:700; color:var(--gold-soft); line-height:1; }
.stat-label{ display:block; font-size:12px; text-transform:uppercase; letter-spacing:.08em; opacity:.8; margin-top:6px; }

/* ---------- Rejilla de módulos ---------- */
.module-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:20px; }
.module-card{
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:26px 24px 22px; text-decoration:none; color:var(--ink); display:flex; flex-direction:column;
  box-shadow:var(--shadow-sm); transition:.18s; position:relative; overflow:hidden;
}
.module-card::before{ content:""; position:absolute; left:0; top:0; height:100%; width:4px;
  background:linear-gradient(var(--gold),var(--burg)); opacity:0; transition:.18s; }
.module-card:hover{ transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--gold-soft); }
.module-card:hover::before{ opacity:1; }
.module-card.disabled{ opacity:.6; }
.module-icon{ font-size:34px; margin-bottom:12px; }
.module-card h3{ margin:0 0 4px; }
.module-card p{ margin:0 0 16px; color:var(--muted); font-size:14px; flex:1; }
.module-tag{ align-self:flex-start; background:var(--superficie-3); color:var(--burg); font-size:12px; font-weight:600;
  padding:5px 12px; border-radius:20px; }
.module-tag.soon{ background:var(--chip-fondo); color:var(--muted); }
.module-go{ margin-top:14px; color:var(--gold); font-weight:600; font-size:14px; }

/* ---------- Tarjetas / formularios ---------- */
.card{ background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:28px; box-shadow:var(--shadow-sm); }
.form-card{ max-width:640px; }
.form-hint{ color:var(--muted); margin:-2px 0 20px; font-size:14px; }
label{ display:block; margin:14px 0; font-size:13px; font-weight:600; color:var(--ink); }
.label-strong{ font-weight:700; color:var(--burg); margin:22px 0 8px; }
input,textarea{ display:block; width:100%; margin-top:6px; padding:11px 13px;
  border:1px solid var(--line); border-radius:10px; font-size:14px; font-weight:400;
  font-family:inherit; color:var(--ink); background:var(--campo); transition:.15s; }
/* Los campos de texto ocupan toda la fila, pero **una casilla o un botón de
   opción no son un campo de texto**: estirarlos al 100% los pone encima del
   texto de su etiqueta y la fila queda descuadrada e imposible de leer. Estaba
   parcheado uno por uno (`.vote-option-pick input`, `.casilla input`) y a los
   que se añadieron después se les olvidó. Aquí vale para todos y para siempre. */
input[type=checkbox], input[type=radio]{
  width:auto; height:auto; margin:0; flex-shrink:0;
  accent-color:var(--burg); transform:scale(1.15); }

input:focus,textarea:focus{ outline:none; border-color:var(--gold); box-shadow:0 0 0 3px rgba(195,155,74,.15); background:var(--campo-activo); }
input[type=file]{ padding:8px; background:var(--campo); cursor:pointer; }
textarea{ resize:vertical; }
.grid2{ display:grid; grid-template-columns:1fr 1fr; gap:0 20px; }
.actions{ margin-top:22px; display:flex; gap:12px; align-items:center; }
.opcion-row{ margin-bottom:8px; }
.opcion-row input{ margin-top:0; }
.add-op{ margin-top:4px; }

/* ---------- Tablas ---------- */
.table-wrap{ overflow-x:auto; border-radius:var(--radius); box-shadow:var(--shadow-sm); }
.tabla{ width:100%; border-collapse:collapse; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); overflow:hidden; }
.tabla th{ background:linear-gradient(var(--burg-fondo),var(--burg-deep)); color:#fff; text-align:left;
  padding:13px 14px; font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:.05em; }
.tabla td{ padding:12px 14px; border-top:1px solid var(--line); font-size:14px; }
.tabla tbody tr{ transition:.12s; }
.tabla tbody tr:hover td{ background:var(--superficie-2); }
.cell-id{ color:var(--muted); font-variant-numeric:tabular-nums; }
.link{ color:var(--gold); font-weight:600; text-decoration:none; }
.link:hover{ text-decoration:underline; }
.cell-acciones{ white-space:nowrap; text-align:right; }
.btn-edit{ display:inline-block; font-size:12px; font-weight:600; color:var(--burg);
  border:1px solid var(--line); border-radius:8px; padding:5px 12px; text-decoration:none;
  background:var(--card); transition:.15s; }
.btn-edit:hover{ border-color:var(--burg-fondo); background:var(--burg-fondo); color:var(--sobre-burg); }
.file-actual{ display:block; margin-top:6px; font-size:12px; font-weight:400; color:var(--muted); }

/* ---------- Estados de votación / badges ---------- */
.badge{ display:inline-block; font-size:11px; font-weight:700; text-transform:uppercase;
  letter-spacing:.06em; padding:4px 11px; border-radius:20px; }
.badge-open{ background:var(--ok-chip); color:var(--ok); }
.badge-closed{ background:var(--peligro-panel); color:var(--peligro-tinta); }
.badge-neutral{ background:var(--chip-fondo); color:var(--muted); }

/* ---------- Perfil ---------- */
.profile-head{ display:flex; align-items:center; gap:20px; margin-bottom:26px; }
.avatar-lg{ width:72px; height:72px; font-size:30px; box-shadow:var(--shadow-sm); }
.profile-head h1{ margin:2px 0; }
.profile-meta{ color:var(--muted); font-size:14px; margin:0; display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.profile-grid{ display:grid; grid-template-columns:1fr 1fr; gap:22px; align-items:start; }
@media(max-width:760px){ .profile-grid{ grid-template-columns:1fr; } }

/* ---------- Lista de votaciones ---------- */
.vote-list{ display:flex; flex-direction:column; gap:12px; }
.vote-item{ display:flex; justify-content:space-between; align-items:center; gap:20px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:20px 24px; text-decoration:none; color:var(--ink); box-shadow:var(--shadow-sm); transition:.16s; }
.vote-item:hover{ border-color:var(--gold-soft); transform:translateX(3px); box-shadow:var(--shadow); }
.vote-item-main h3{ margin:8px 0 2px; }
.vote-item-main p{ margin:0; color:var(--muted); font-size:14px; }
.vote-item-meta{ text-align:center; flex-shrink:0; }
.vote-count{ display:block; font-family:'Cormorant Garamond',serif; font-size:30px; font-weight:700; color:var(--burg); line-height:1; }
.vote-count-label{ font-size:12px; color:var(--muted); }

/* ---------- Detalle de votación ---------- */
.vote-detail{ max-width:680px; }
.vote-detail-head h1{ margin:10px 0 6px; }
.vote-desc{ color:var(--muted); margin:0 0 8px; }
.vote-form{ margin-top:22px; }
.vote-option-pick{ display:flex; align-items:center; gap:12px; padding:14px 16px; margin:10px 0;
  border:1px solid var(--line); border-radius:12px; cursor:pointer; font-weight:500; transition:.15s; background:var(--campo); }
.vote-option-pick:hover{ border-color:var(--gold); background:var(--campo-activo); }
.vote-option-pick input{ width:auto; margin:0; accent-color:var(--burg); transform:scale(1.2); }
.vote-option-text{ font-size:15px; }

.results{ margin-top:22px; display:flex; flex-direction:column; gap:16px; }
.result-row.is-mine .result-text{ color:var(--burg); font-weight:600; }
.result-top{ display:flex; justify-content:space-between; margin-bottom:6px; font-size:14px; }
.result-num{ color:var(--muted); font-variant-numeric:tabular-nums; font-weight:600; }
.mine-tag{ font-size:10px; background:var(--gold); color:var(--sobre-color); padding:2px 7px; border-radius:10px;
  margin-left:8px; text-transform:uppercase; letter-spacing:.05em; vertical-align:middle; }
.bar{ height:12px; background:var(--barra); border-radius:20px; overflow:hidden; }
.bar-fill{ height:100%; background:linear-gradient(90deg,var(--gold),var(--burg)); border-radius:20px;
  transition:width .5s ease; min-width:2px; }
.results-total{ color:var(--muted); font-size:13px; margin:4px 0 0; }
.vote-admin{ margin-top:24px; padding-top:20px; border-top:1px solid var(--line); }

/* ---------- Estado vacío ---------- */
.empty-state{ text-align:center; padding:60px 20px; background:var(--card); border:1px dashed var(--line);
  border-radius:var(--radius); }
.empty-icon{ font-size:52px; margin-bottom:12px; }
.empty-state p{ color:var(--muted); max-width:420px; margin:0 auto 20px; }

/* ---------- Mensajes flash ---------- */
.flash{ background:var(--flash-fondo); border:1px solid var(--flash-borde); border-left:4px solid var(--gold);
  border-radius:10px; padding:12px 16px; margin-bottom:20px; box-shadow:var(--shadow-sm); }
.flash p{ margin:3px 0; font-size:14px; color:var(--ink); }
.vacio{ color:var(--muted); font-style:italic; }

/* ============================================================
   Login (pantalla partida)
   ============================================================ */
.auth-body{ background:var(--burg-deep); }
.auth-wrap{ min-height:100vh; display:grid; place-items:center; padding:24px; }
.auth-split{ display:grid; grid-template-columns:1.1fr 1fr; width:100%; max-width:940px;
  min-height:540px; background:var(--card); border-radius:22px; overflow:hidden; box-shadow:0 30px 80px rgba(0,0,0,.4); }
.auth-hero{ background:linear-gradient(150deg,var(--burg-deep),var(--burg-fondo) 70%,var(--burg-fondo-2));
  color:#fff; display:grid; place-items:center; padding:40px; position:relative; overflow:hidden; }
.auth-hero::after{ content:"◆"; position:absolute; bottom:-40px; right:-30px; font-size:230px; color:rgba(255,255,255,.06); }
.auth-hero-inner{ position:relative; z-index:1; }
.auth-gem{ font-size:44px; color:var(--gold-soft); margin-bottom:14px; }
.auth-hero h1{ color:#fff; font-size:46px; line-height:1.05; }
.auth-hero p{ opacity:.82; max-width:280px; margin-top:12px; }
.auth-form-side{ display:grid; place-items:center; padding:40px; }
.auth-card{ width:100%; max-width:330px; }
.auth-card h2{ margin:0 0 4px; }
.auth-sub{ color:var(--muted); font-size:14px; margin:0 0 20px; }

/* ---------- Responsive ---------- */
@media(max-width:820px){
  .auth-split{ grid-template-columns:1fr; max-width:400px; }
  .auth-hero{ padding:34px; }
  .auth-hero h1{ font-size:36px; }
  .hero{ flex-direction:column; align-items:stretch; }
}
@media(max-width:760px){
  /* La barra superior y la navegación las cubre el bloque de más abajo. */
  .grid2{ grid-template-columns:1fr; }
}

/* ============================================================
   PARTE 2 — Fichas, galerías, contabilidad y adaptación a móvil
   ------------------------------------------------------------
   Todo lo de aquí abajo está pensado para funcionar igual en un
   monitor y en un teléfono. La regla general: en pantallas
   estrechas todo pasa a una sola columna, la navegación baja a
   una barra inferior tipo app, y nada obliga a hacer zoom.
   ============================================================ */

/* ---------- Accesibilidad ---------- */
.saltar{ position:absolute; left:-9999px; top:0; z-index:200; background:var(--gold);
  color:var(--burg-deep); padding:12px 18px; border-radius:0 0 10px 0; font-weight:700; text-decoration:none; }
.saltar:focus{ left:0; }
:focus-visible{ outline:3px solid var(--gold); outline-offset:2px; border-radius:4px; }
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{ animation-duration:.01ms !important; transition-duration:.01ms !important; }
}

/* ---------- Secciones plegables de las fichas ---------- */
.seccion{ border:1px solid var(--line); border-radius:12px; margin:12px 0; background:var(--campo); }
.seccion > summary{ cursor:pointer; padding:14px 16px; font-weight:600; color:var(--burg);
  list-style:none; display:flex; align-items:center; gap:10px; border-radius:12px; min-height:48px; }
.seccion > summary::-webkit-details-marker{ display:none; }
.seccion > summary::after{ content:"▾"; margin-left:auto; color:var(--muted); transition:.2s; }
.seccion[open] > summary::after{ transform:rotate(180deg); }
.seccion > summary:hover{ background:var(--superficie-2); }
.sec-icono{ font-size:18px; }
.sec-cuenta{ margin-left:auto; font-size:12px; font-weight:400; color:var(--muted); }
.seccion[open] > summary .sec-cuenta{ margin-left:12px; }
.campos{ padding:6px 16px 18px; display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:0 18px; }
.campo{ margin:10px 0; }
.campo > label{ margin:0 0 4px; }
.campo input, .campo select, .campo textarea{ margin-top:0; }
.campo-texto_largo{ grid-column:1 / -1; }
.ayuda{ display:block; margin-top:5px; font-size:12px; color:var(--muted); font-weight:400; line-height:1.4; }
.req{ color:var(--burg2); }
.unidad{ font-weight:400; color:var(--muted); }
select{ display:block; width:100%; padding:11px 13px; border:1px solid var(--line); border-radius:10px;
  font-size:16px; font-family:inherit; color:var(--ink); background:var(--campo); min-height:44px; }
select:focus{ outline:none; border-color:var(--gold); box-shadow:0 0 0 3px rgba(195,155,74,.15); }
.casilla{ display:flex; align-items:center; gap:9px; padding:10px 0; min-height:44px; }
.casilla input{ width:22px; height:22px; margin:0; accent-color:var(--burg); flex-shrink:0; }
.con-unidad{ display:flex; align-items:stretch; }
.con-unidad input{ border-radius:10px 0 0 10px; }
.con-unidad .sufijo{ display:grid; place-items:center; padding:0 14px; background:var(--superficie-3);
  border:1px solid var(--line); border-left:none; border-radius:0 10px 10px 0; color:var(--burg);
  font-weight:600; font-size:14px; }
.form-acciones{ margin-top:22px; display:flex; gap:12px; flex-wrap:wrap; align-items:center; }
.separador{ border:none; border-top:1px solid var(--line); margin:26px 0; }
.btn-peligro{ color:#a23b3b; border-color:#e8d0d0; }
.btn-peligro:hover{ background:var(--peligro-tinta); color:var(--sobre-color); border-color:var(--peligro-tinta); }
.en-linea{ display:inline-block; margin:0; }

/* ---------- Cabecera de una ficha ---------- */
.ficha-cabecera{ display:grid; grid-template-columns:minmax(0,320px) minmax(0,1fr); gap:28px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:24px; box-shadow:var(--shadow-sm); margin-bottom:22px; }
.ficha-foto img{ width:100%; height:100%; max-height:360px; object-fit:cover; border-radius:12px;
  display:block; background:var(--superficie-3); }
.sin-foto{ display:grid; place-items:center; align-content:center; gap:6px; min-height:220px;
  background:linear-gradient(140deg,var(--superficie-3),#efe4d6); border-radius:12px; color:var(--gold); }
.sin-foto span{ font-size:52px; }
.sin-foto small{ color:var(--muted); }
.ficha-resumen h1{ margin:4px 0 10px; }
.destacados{ display:grid; grid-template-columns:repeat(auto-fit,minmax(130px,1fr)); gap:12px; margin:18px 0; }
.destacado{ background:var(--superficie); border:1px solid var(--line); border-radius:10px; padding:10px 12px; }
.destacado-et{ display:block; font-size:11px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted); }
.destacado strong{ font-size:15px; color:var(--ink); }
.linea-porct{ background:var(--oro-panel); border:1px solid var(--oro-borde); border-radius:10px; padding:11px 14px;
  font-size:14px; color:var(--oro-tinta); margin-bottom:10px; }
.linea-porct strong{ font-size:16px; }
.linea-porct small{ color:var(--muted); font-weight:400; }
.linea-beneficio{ background:var(--ok-panel); border:1px solid var(--ok-borde); border-radius:10px; padding:11px 14px;
  font-size:14px; color:var(--ok); }
.linea-beneficio small{ color:var(--muted); font-weight:400; }
.ficha-acciones{ display:flex; gap:10px; flex-wrap:wrap; margin-top:16px; }
.pie-ficha{ color:var(--muted); font-size:13px; text-align:center; margin:28px 0 0; }

/* ---------- El color, medido (bloque X) ----------
   Un sistema de color no puede pintar la foto de otro color que el que tiene:
   por eso en modo oscuro NO hay filtro sobre las imágenes (ver V-05) y por eso
   las muestras se enseñan sobre fondo neutro, sin sombras encima. */

/* --- El cuentagotas sobre la foto --- */
.cuentagotas{ margin-top:12px; }
.ct-empezar{ width:100%; }
.ct-instrucciones{ font-size:13px; color:var(--muted); margin:10px 0 0; line-height:1.5; }
.ct-aviso{ font-size:13px; color:var(--aviso-tinta); background:var(--aviso-panel); border-radius:8px;
  padding:8px 10px; margin:10px 0 0; }

/* Mientras se mide: la piedra entera a la vista y sin recortar, porque el
   punto donde se pincha tiene que corresponder al píxel que se lee. */
.ficha-foto{ position:relative; }
.ficha-foto.midiendo img{ object-fit:contain; height:auto; max-height:70vh;
  cursor:crosshair; background:var(--superficie-2); }
.ficha-foto.midiendo{ cursor:crosshair; }
.ct-punto{ position:absolute; width:22px; height:22px; margin:-11px 0 0 -11px;
  border-radius:50%; border:2px solid #fff; box-shadow:0 0 0 1.5px rgba(0,0,0,.45);
  display:grid; place-items:center; font-size:10px; font-weight:700; color:#fff;
  text-shadow:0 0 3px rgba(0,0,0,.9); pointer-events:none; }

.ct-muestras{ list-style:none; margin:12px 0 0; padding:0; display:flex;
  flex-wrap:wrap; gap:6px; }
.ct-muestras li{ display:flex; align-items:center; gap:6px; font-size:11.5px;
  font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  background:var(--card); border:1px solid var(--line); border-radius:20px;
  padding:3px 4px 3px 3px; }
.ct-tinta{ width:18px; height:18px; border-radius:50%; flex-shrink:0;
  border:1px solid rgba(0,0,0,.15); }
.ct-quitar{ border:0; background:none; color:var(--muted); cursor:pointer;
  font-size:12px; line-height:1; padding:2px 4px; }
.ct-quitar:hover{ color:#a23b3b; }
.ct-luz{ display:block; font-size:12px; color:var(--muted); margin:12px 0 0; }
.ct-luz select{ width:100%; margin-top:4px; }
.ct-guardar{ width:100%; margin-top:10px; }
.ct-guardar:disabled{ opacity:.45; cursor:not-allowed; }

/* --- La sección con el color ya guardado --- */
.color-cabecera{ display:flex; gap:18px; align-items:flex-start; flex-wrap:wrap; }
.color-muestra{ width:96px; height:96px; border-radius:12px; flex-shrink:0;
  border:1px solid rgba(0,0,0,.12); }
.color-cifras{ flex:1 1 240px; min-width:0; }
.color-nombre{ margin:0 0 12px; font-size:19px; font-weight:600;
  font-family:'Cormorant Garamond',Georgia,serif; color:var(--burg); }
.color-nombre span{ font-family:'Inter',sans-serif; font-size:14px;
  font-weight:400; color:var(--muted); }
.color-lch{ display:grid; grid-template-columns:repeat(auto-fit,minmax(110px,1fr));
  gap:12px; margin:0; }
.color-lch dt{ font-size:11px; text-transform:uppercase; letter-spacing:.07em;
  color:var(--muted); margin-bottom:2px; }
.color-lch dt small{ text-transform:none; letter-spacing:0; opacity:.75; }
.color-lch dd{ margin:0; font-size:17px; font-weight:600; }
.color-lch code{ font-size:14px; }

.color-zonacion{ margin:16px 0 0; font-size:13.5px; padding:10px 12px;
  border-radius:9px; background:var(--ok-panel); color:var(--ok); border:1px solid var(--ok-borde); }
.color-zonacion.es-zonada{ background:var(--aviso-panel); color:var(--aviso-tinta); border-color:var(--aviso-borde); }

.color-puntos{ list-style:none; display:flex; flex-wrap:wrap; gap:6px;
  margin:14px 0 0; padding:0; }
.color-puntos li{ display:flex; align-items:center; gap:6px; font-size:11.5px;
  color:var(--muted);
  font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace; }

/* Una muestra descartada se sigue enseñando —para poder ver qué pasó— pero
   apagada y con su etiqueta, para que no parezca que contó. */
.color-puntos li.es-reflejo{ opacity:.55; text-decoration:line-through; }
.color-descartada{ font-size:10px; text-transform:uppercase; letter-spacing:.06em;
  background:var(--aviso-panel); color:var(--aviso-tinta); padding:1px 6px; border-radius:20px;
  text-decoration:none; display:inline-block; }
.color-descarte{ margin:10px 0 0; font-size:12.5px; color:var(--aviso-tinta); }

.color-origen{ margin:14px 0 12px; font-size:12.5px; color:var(--muted);
  line-height:1.6; }
.color-cautela{ display:block; margin-top:4px; }

/* ---------- Lotes: una compra, varias piezas ----------
   La idea de fondo de estas pantallas es que el reparto se VE antes de
   aplicarse. Por eso la tabla enseña a la vez lo que le tocaría a cada pieza y
   lo que tiene hoy: aplicar el reparto pisa fichas, y eso se hace mirando. */

.der{ text-align:right; font-variant-numeric:tabular-nums; }

.rejilla-lotes{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:18px; }
.tarjeta-lote{ display:block; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); padding:18px 20px; text-decoration:none; color:var(--ink);
  box-shadow:var(--shadow-sm); transition:.15s; }
.tarjeta-lote:hover{ border-color:var(--gold); transform:translateY(-2px); }
.tarjeta-lote h3{ margin:0 0 4px; font-size:19px; }
.tl-meta{ margin:0 0 10px; font-size:13px; color:var(--muted); }
.tl-cifras{ margin:0 0 12px; font-size:14px; }
.tl-cifras strong{ font-size:16px; }

/* Elegir la base del reparto: cada opción con su porqué al lado, porque
   elegir mal aquí da números creíbles y equivocados. */
.opcion-base{ display:flex; gap:12px; align-items:flex-start; padding:12px 14px;
  border:1px solid var(--line); border-radius:10px; background:var(--superficie);
  cursor:pointer; grid-column:1 / -1; margin:0; transition:.15s; }
.opcion-base:hover{ border-color:var(--gold); }
.opcion-base input{ margin-top:3px; flex-shrink:0; }
.opcion-base strong{ display:block; font-size:14px; }
.opcion-base small{ display:block; color:var(--muted); font-size:12.5px;
  line-height:1.5; margin-top:2px; }

.elegir-piezas{ display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr));
  gap:10px; margin:14px 0; }
.pieza-elegible{ display:flex; gap:10px; align-items:flex-start; margin:0;
  padding:10px 12px; border:1px solid var(--line); border-radius:10px;
  background:var(--superficie); cursor:pointer; transition:.15s; }
.pieza-elegible:hover{ border-color:var(--gold); }
.pieza-elegible input{ margin-top:3px; flex-shrink:0; }
.pieza-elegible strong{ display:block; font-size:13.5px; }
.pieza-elegible small{ display:block; color:var(--muted); font-size:11.5px; margin-top:2px; }

.aviso-reparto{ background:var(--aviso-panel); border:1px solid var(--aviso-borde); color:var(--aviso-tinta);
  border-radius:10px; padding:12px 14px; font-size:13.5px; line-height:1.6; }
.cambiaria{ color:var(--muted); text-decoration:line-through; }
.linea-factor{ background:var(--oro-panel); border:1px solid var(--oro-borde); border-radius:10px;
  padding:11px 14px; font-size:13.5px; color:var(--oro-tinta); margin:16px 0 0; line-height:1.6; }
/* Teclear una cifra dentro de una tabla, sin que parezca otro formulario. */
.celda-numero{ width:96px; text-align:right; padding:6px 8px; font-size:14px;
  font-variant-numeric:tabular-nums; min-height:34px; }
.nota-cambio{ font-size:13px; color:var(--muted); margin:14px 0 0; }
.nota-reparto{ margin-top:10px; font-size:12.5px; }

/* La marca de que un coste es un reparto y no una factura. Discreta pero
   siempre presente: un número prorrateado no puede pasar por medido. */
.chip-prorrateado{ background:var(--oro-chip); color:var(--oro-tinta); font-size:11px; }
.coste-prorrateado{ font-size:12px; color:var(--muted); }

/* ---------- Tareas y notas ----------
   Todo cabe en una página, y es a propósito: una lista de tareas que obliga a
   navegar deja de usarse a la semana. Lo que la mantiene viva es apuntar algo
   en dos segundos y marcarlo hecho de un clic sin salir de donde estás. */

.apuntar{ padding:18px 20px; margin-bottom:20px; }
.apuntar-linea{ display:flex; gap:10px; }
.apuntar-linea input{ flex:1; min-width:0; }
.apuntar-mas{ margin-top:12px; }
.apuntar-mas > summary{ cursor:pointer; font-size:13px; color:var(--burg);
  font-weight:600; list-style:none; padding:6px 2px; min-height:34px;
  display:inline-flex; align-items:center; gap:8px; }
.apuntar-mas > summary::-webkit-details-marker{ display:none; }
.apuntar-mas > summary::before{ content:"▸"; transition:transform .15s; }
.apuntar-mas[open] > summary::before{ transform:rotate(90deg); }

.lista-tareas{ list-style:none; margin:0; padding:0; display:grid; gap:10px; }
.tarea{ display:flex; gap:14px; align-items:flex-start; background:var(--card);
  border:1px solid var(--line); border-radius:var(--radius); padding:14px 16px;
  box-shadow:var(--shadow-sm); }
.tarea.va-tarde{ border-left:3px solid #c98b2f; }
.tarea.esta-hecha{ opacity:.6; }
.tarea.esta-hecha .t-titulo{ text-decoration:line-through; }

/* La casilla es el gesto más usado de la página: grande y sin adornos. */
.t-marcar{ flex-shrink:0; }
.t-casilla{ width:34px; height:34px; border-radius:50%; border:1.5px solid var(--line);
  background:none; color:var(--gold); font-size:16px; line-height:1; cursor:pointer;
  display:grid; place-items:center; transition:.15s; padding:0; }
.t-casilla:hover{ border-color:var(--burg); color:var(--burg); background:var(--superficie-2); }

.t-cuerpo{ flex:1; min-width:0; }
.t-titulo{ margin:0; font-size:15px; font-weight:600; overflow-wrap:anywhere; }
.t-detalle{ margin:4px 0 0; font-size:13.5px; color:var(--muted); white-space:pre-line; }
.t-meta{ margin:8px 0 0; display:flex; flex-wrap:wrap; gap:6px 14px;
  align-items:center; font-size:12px; color:var(--muted); }
.t-quien{ display:inline-flex; align-items:center; gap:6px; font-weight:600; color:var(--ink); }
.t-sin-dueno{ font-style:italic; }
.t-fecha{ font-variant-numeric:tabular-nums; }
.va-tarde .t-fecha{ color:var(--aviso-tinta); font-weight:600; }
.t-contexto{ color:var(--burg); text-decoration:none; }
.t-contexto:hover{ text-decoration:underline; }
.t-cerrada{ font-style:italic; }

.t-acciones{ display:flex; flex-direction:column; gap:6px; align-items:flex-end;
  flex-shrink:0; }
.t-acciones select{ font-size:12px; padding:6px 8px; min-height:32px; min-width:140px; }

@media (max-width:760px){
  .tarea{ flex-wrap:wrap; }
  .t-acciones{ flex-direction:row; width:100%; align-items:center;
    justify-content:flex-start; flex-wrap:wrap; }
  .t-acciones select{ min-width:120px; }
}

/* Quién ha visto una votación, y la nota que cada socio lleva de una pieza. */
.quien-ha-visto{ background:var(--superficie); border:1px solid var(--line); border-radius:10px;
  padding:11px 14px; font-size:13.5px; color:var(--muted); margin:0 0 18px; }
.quien-ha-visto.vista-por-todos{ background:var(--ok-panel); border-color:var(--ok-borde); color:var(--ok); }

.nota-privada{ padding:16px 20px; margin-bottom:18px; }
.nota-privada > summary{ cursor:pointer; font-weight:600; font-size:15px;
  color:var(--burg); list-style:none; display:flex; align-items:center; gap:10px;
  min-height:38px; }
.nota-privada > summary::-webkit-details-marker{ display:none; }
.nota-privada textarea{ margin-top:12px; }

/* Elegir cómo se ve la app: tres opciones con su porqué al lado. */
.elegir-tema{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:10px; margin-top:14px; }
.opcion-tema{ display:flex; gap:10px; align-items:flex-start; margin:0;
  padding:12px 14px; border:1px solid var(--line); border-radius:10px;
  background:var(--superficie); cursor:pointer; transition:.15s; }
.opcion-tema:hover{ border-color:var(--gold); }
.opcion-tema input{ margin-top:3px; flex-shrink:0; }
.opcion-tema strong{ display:block; font-size:14px; }
.opcion-tema small{ display:block; color:var(--muted); font-size:12px;
  line-height:1.5; margin-top:2px; }

/* ---------- La papelera ----------
   Se parece a la lista de tareas a propósito: es una lista de cosas sobre las
   que hay que decidir algo, no un inventario. */
.lista-papelera{ list-style:none; margin:0; padding:0; display:grid; gap:12px; }
.papelera-fila{ display:flex; gap:16px; align-items:center; background:var(--card);
  border:1px solid var(--line); border-radius:var(--radius); padding:14px 16px;
  box-shadow:var(--shadow-sm); }
.papelera-fila.ha-caducado{ border-left:3px solid var(--peligro-tinta); }
.pf-foto{ width:64px; height:64px; flex-shrink:0; border-radius:10px;
  overflow:hidden; background:var(--superficie-3); }
.pf-foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.pf-foto .sin-foto{ min-height:0; height:100%; border-radius:0; }
.pf-foto .sin-foto span{ font-size:24px; }
.pf-cuerpo{ flex:1; min-width:0; }
.pf-titulo{ margin:0; font-size:15px; font-weight:600; }
.pf-meta{ margin:3px 0 0; font-size:12.5px; color:var(--muted); }
.pf-plazo{ margin:5px 0 0; font-size:12.5px; color:var(--muted); }
.ha-caducado .pf-plazo strong{ color:var(--peligro-tinta); }
.pf-acciones{ display:flex; flex-direction:column; gap:8px; align-items:stretch;
  flex-shrink:0; }

@media (max-width:760px){
  .papelera-fila{ flex-wrap:wrap; }
  .pf-acciones{ flex-direction:row; width:100%; }
  .pf-acciones form{ flex:1; }
  .pf-acciones button{ width:100%; }
}

/* ---------- Precios por color (X-10) ----------
   La tabla enseña la media Y la mediana, y siempre cuántas piedras hay detrás:
   con tres piedras no hay un precio de mercado, hay tres precios. */
.aviso-estadistica{ background:var(--aviso-panel); border-color:var(--aviso-borde);
  color:var(--aviso-tinta); font-size:13.5px; line-height:1.65; padding:14px 18px;
  margin-bottom:20px; }
.aviso-estadistica p{ margin:0; }
.celda-tira{ display:inline-block; width:26px; height:14px; border-radius:4px;
  vertical-align:-2px; margin-right:8px; border:1px solid rgba(0,0,0,.15); }
.celda-fina{ opacity:.5; }
/* Una gema por bloque, sin mezclar: juntar rubelitas y turmalinas rosas en la
   misma tabla invitaría a compararlas, que es lo que no se puede hacer. */
.bloque-variedad h3{ flex-wrap:wrap; }
.bloque-variedad .sec-cuenta{ margin-left:auto; }
.aviso-estadistica p + p{ margin-top:10px; }
.celda-piezas td{ padding-top:0; border-top:0; font-size:12.5px; }
.celda-piezas a{ display:inline-block; margin:0 12px 4px 0; color:var(--burg);
  text-decoration:none; }
.celda-piezas a:hover{ text-decoration:underline; }
.celda-piezas small{ color:var(--muted); }
.vecina-delta{ font-size:11px; opacity:.8; }

/* El veredicto en la ficha: en línea, o llamativo si se sale mucho. */
.linea-comparacion{ background:var(--ok-panel); border:1px solid var(--ok-borde);
  border-radius:10px; padding:11px 14px; font-size:14px; color:var(--ok);
  margin-bottom:10px; }
.linea-tasacion{ background:var(--ok-panel); border:1px solid var(--ok-borde);
  border-radius:10px; padding:11px 14px; font-size:14px; color:var(--ok);
  margin-bottom:10px; }
.linea-tasacion.es-llamativo{ background:var(--aviso-panel);
  border-color:var(--aviso-borde); color:var(--aviso-tinta); }
.linea-tasacion small{ display:block; margin-top:5px; color:var(--muted);
  font-weight:400; font-size:12.5px; line-height:1.6; }

.elegir-color{ display:flex; align-items:center; gap:10px; }
.elegir-color input[type=color]{ width:64px; height:40px; padding:2px; cursor:pointer; }
.factor-sube{ color:var(--ok); font-weight:600; }
.factor-baja{ color:var(--aviso-tinta); font-weight:600; }
.resultado-tasacion{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:14px; margin:18px 0; }
.resultado-tasacion > div{ background:var(--oro-panel); border:1px solid var(--oro-borde);
  border-radius:10px; padding:14px 16px; }
.resultado-tasacion span{ display:block; font-size:11px; text-transform:uppercase;
  letter-spacing:.07em; color:var(--muted); }
.resultado-tasacion strong{ display:block; font-size:22px;
  font-family:'Cormorant Garamond',Georgia,serif; color:var(--oro-tinta); }

.linea-mercado{ background:var(--oro-panel); border:1px solid var(--oro-borde);
  border-radius:10px; padding:11px 14px; font-size:14px; color:var(--oro-tinta);
  margin-bottom:10px; }
.linea-mercado.es-llamativo{ background:var(--aviso-panel);
  border-color:var(--aviso-borde); color:var(--aviso-tinta); }
.linea-mercado small{ display:block; margin-top:5px; color:var(--muted);
  font-weight:400; font-size:12.5px; line-height:1.6; }
.linea-comparacion.es-llamativo{ background:var(--aviso-panel);
  border-color:var(--aviso-borde); color:var(--aviso-tinta); }
.linea-comparacion small{ display:block; margin-top:5px; color:var(--muted);
  font-weight:400; font-size:12.5px; line-height:1.6; }

/* ---------- Paginación ----------
   Dice siempre cuántas hay en total, no solo cuántas caben: una lista que
   enseña veinte de trescientas sin decirlo engaña por omisión. */
.paginacion{ display:flex; align-items:center; justify-content:center; gap:16px;
  flex-wrap:wrap; margin:26px 0 8px; }
.pg-cuenta{ font-size:13px; color:var(--muted); text-align:center; }
.pg-cuenta small{ display:block; font-size:11.5px; opacity:.8; }
.btn-ghost.desactivado{ opacity:.35; cursor:default; }

/* El registro de accesos: los fallos, apagados, para que las entradas
   de verdad destaquen entre el ruido de quien anda probando. */
.acceso-fallo{ opacity:.62; }
.acceso-fallo code{ color:var(--peligro-tinta); }
.acceso-agente{ font-size:11.5px; color:var(--muted); max-width:280px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.pestañas{ display:flex; gap:10px; flex-wrap:wrap; margin-bottom:20px; }

/* ---------- El menú del móvil, en el rombo ----------
   Antes era una barra fija abajo. Con nueve secciones iba tan apretada que
   estorbaba, y además **tapaba el final de todas las páginas**. Ahora el rombo
   de la barra de arriba abre un desplegable, que ocupa sitio solo cuando se
   usa. Va con <details>, así que funciona sin JavaScript. */
.menu-rombo{ position:relative; flex-shrink:0; }
.menu-rombo > summary{ list-style:none; cursor:pointer; color:var(--gold-soft);
  font-size:26px; line-height:1; padding:10px 12px; border-radius:12px;
  min-height:44px; min-width:44px; display:flex; align-items:center;
  justify-content:center; position:relative; }
.menu-rombo > summary::-webkit-details-marker{ display:none; }
.menu-rombo > summary:hover, .menu-rombo[open] > summary{ background:rgba(255,255,255,.14); }
.menu-rombo > summary .insignia-punto{ position:absolute; top:7px; right:7px; }

.menu-desplegado{ position:absolute; left:0; top:calc(100% + 8px); z-index:60;
  min-width:230px; background:var(--card); border:1px solid var(--line);
  border-radius:14px; box-shadow:var(--shadow); padding:8px;
  display:flex; flex-direction:column; gap:2px; }
.menu-desplegado a{ display:flex; align-items:center; gap:12px; padding:12px 14px;
  border-radius:10px; text-decoration:none; color:var(--ink); font-size:15px;
  font-weight:500; min-height:48px; }
.menu-desplegado a:hover{ background:var(--superficie); }
.menu-desplegado a.active{ background:var(--superficie-2); color:var(--burg);
  font-weight:600; box-shadow:inset 3px 0 0 var(--gold); }
.menu-desplegado .insignia{ margin-left:auto; }

/* El rombo-menú solo en estrecho; la marca con su nombre, solo en ancho. */
.solo-estrecho{ display:none; }
@media (max-width:900px){
  .solo-ancho{ display:none; }
  .solo-estrecho{ display:block; }
  .nav{ display:none; }        /* su sitio lo ocupa el desplegable */
}

/* ---------- Que se note que algo está pasando (V-11) ----------
   Una barra con el porcentaje real de lo subido, no una animación que da
   vueltas: con 30 MB por un túnel, saber que vas por el 40% es la diferencia
   entre esperar tranquilo y pensar que se ha colgado. */
.subiendo{ margin-top:14px; }
.subiendo-carril{ height:10px; background:var(--barra); border-radius:20px;
  overflow:hidden; }
.subiendo-relleno{ height:100%; width:0; border-radius:20px;
  background:linear-gradient(90deg,var(--burg),var(--gold));
  transition:width .25s ease-out; }
.subiendo-texto{ margin:7px 0 0; font-size:12.5px; color:var(--muted);
  font-variant-numeric:tabular-nums; }

/* El botón mientras trabaja: apagado y sin poder pulsarse otra vez. Pulsar
   dos veces «Subir» sube las fotos dos veces. */
button[data-ocupado]{ opacity:.6; cursor:progress; }

.recordarme{ margin:14px 0 2px; font-size:14px; font-weight:400; }
.recordarme span{ font-weight:400; }

/* El aviso de que hay un borrador esperando. Va arriba del formulario y
   ofrece, no rellena: un formulario que aparece relleno sin avisar asusta y
   hace dudar de si lo que hay es tuyo o de otro día. */
.hay-borrador{ background:var(--oro-panel); border:1px solid var(--oro-borde);
  border-left:4px solid var(--gold); border-radius:10px; padding:14px 16px;
  margin-bottom:18px; }
.hay-borrador p{ margin:0; font-size:14px; color:var(--oro-tinta); }
.hay-borrador .form-acciones{ margin-top:12px; }

/* Los códigos de recuperación: grandes y espaciados, que se van a copiar a
   mano o a leer de un papel. */
.lista-codigos{ list-style:none; padding:0; margin:18px 0;
  display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:10px; }
.lista-codigos li{ background:var(--superficie); border:1px solid var(--line);
  border-radius:10px; padding:12px 14px; text-align:center; }
.lista-codigos code{ font-size:16px; letter-spacing:.06em;
  font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace; }
.auth-pie{ text-align:center; margin-top:14px; }

/* Corregir un apunte sin salir de la lista. Antes había que borrarlo y
   volver a escribirlo, y entonces el movimiento pasaba a tener la fecha de
   hoy en vez de la del día en que se movió el dinero. */
.mov-editar{ flex-shrink:0; }
.mov-editar > summary{ cursor:pointer; list-style:none; color:var(--muted);
  border:1px solid var(--line); border-radius:8px; padding:7px 10px;
  min-height:32px; display:flex; align-items:center; font-size:12px; }
.mov-editar > summary::-webkit-details-marker{ display:none; }
.mov-editar > summary:hover{ border-color:var(--burg); color:var(--burg); }
.mov-editar[open]{ width:100%; order:9; }
.mov-editar[open] > summary{ margin-bottom:12px; }
.mov-editar form{ background:var(--superficie); border:1px solid var(--line);
  border-radius:12px; padding:14px 16px; }
.lista-movimientos li{ flex-wrap:wrap; }

/* ---------- Chips ---------- */
.chip{ display:inline-block; font-size:12px; font-weight:600; padding:4px 12px; border-radius:20px;
  background:var(--chip-fondo); color:var(--muted); margin-right:6px; }
.chip-ok{ background:var(--ok-chip); color:var(--ok); }
.chip-aviso{ background:var(--aviso-panel); color:var(--aviso-tinta); }
.chip-oro{ background:var(--oro-chip); color:var(--oro-tinta); }

/* ---------- Detalle de la ficha ---------- */
.ficha-seccion{ background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:22px 24px; box-shadow:var(--shadow-sm); margin-bottom:18px; }
.ficha-seccion h3{ display:flex; align-items:center; gap:10px; margin:0 0 14px;
  padding-bottom:10px; border-bottom:1px solid var(--line); }
.ficha-datos{ display:grid; grid-template-columns:repeat(auto-fit,minmax(210px,1fr)); gap:14px 24px; margin:0; }
.dato{ min-width:0; }
.dato dt{ font-size:11px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted); margin-bottom:2px; }
.dato dd{ margin:0; font-size:15px; overflow-wrap:anywhere; }
.dato-largo{ grid-column:1 / -1; }
.dato-largo dd{ white-space:pre-line; }

/* ---------- Galería ---------- */
.galeria{ display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:14px; }
.galeria-videos{ grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); margin-top:16px; }
.medio{ margin:0; position:relative; border-radius:12px; overflow:hidden; border:1px solid var(--line);
  background:var(--superficie-3); }
.medio img, .medio video{ width:100%; aspect-ratio:1/1; object-fit:cover; display:block; }
.galeria-videos .medio video{ aspect-ratio:16/9; }
.medio.es-principal{ border:2px solid var(--gold); }
.chip-principal{ position:absolute; top:8px; left:8px; background:var(--gold); color:var(--sobre-color);
  font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;
  padding:3px 9px; border-radius:20px; }
.medio-acciones{ display:flex; gap:6px; padding:8px; background:var(--card); flex-wrap:wrap; }
.mini{ font-size:11px; font-weight:600; padding:7px 10px; border-radius:8px; border:1px solid var(--line);
  background:var(--card); color:var(--burg); cursor:pointer; min-height:32px; }
.mini:hover{ border-color:var(--burg); }
.mini-borrar{ color:var(--peligro-tinta); }
.mini-borrar:hover{ background:var(--peligro-tinta); color:var(--sobre-color); border-color:var(--peligro-tinta); }
.chip-video{ position:absolute; bottom:8px; right:8px; background:rgba(0,0,0,.7); color:#fff;
  font-size:11px; padding:3px 8px; border-radius:20px; }
.lista-docs{ list-style:none; padding:0; margin:16px 0 0; }
.lista-docs li{ display:flex; align-items:center; gap:10px; padding:10px 0; border-top:1px solid var(--line); }
.subir-card{ margin-bottom:18px; }
.fila-subida{ display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:14px; align-items:end; }
.campo-archivo{ font-size:13px; font-weight:600; margin:0; }

/* ---------- Arrastrar y soltar archivos ----------
   Sin JavaScript esto es un <input type=file> con su etiqueta y punto.
   app.js le pone la clase .soltar-lista-viva, y solo entonces el input se
   esconde y aparece la zona. Así nunca hay un formulario que no se pueda usar. */
.campo-archivos label{ display:block; font-size:13px; font-weight:600; margin-bottom:6px; }
.soltar{ border:1.5px dashed var(--line); border-radius:12px; padding:16px;
  background:var(--superficie); transition:border-color .15s, background .15s; }
.soltar-lista-viva{ cursor:pointer; text-align:center; }
.soltar-lista-viva > input[type=file]{ position:absolute; width:1px; height:1px;
  opacity:0; pointer-events:none; }
.soltar-lista-viva:hover, .soltar.soltando{ border-color:var(--gold); background:var(--superficie-2); }
.soltar.soltando{ border-style:solid; }
.soltar-texto{ margin:0; font-size:13.5px; color:var(--muted); }
.soltar-enlace{ color:var(--burg); font-weight:600; text-decoration:underline; }
.soltar.con-archivos{ border-style:solid; border-color:var(--gold); background:var(--card); }

.soltar-lista{ list-style:none; margin:14px 0 0; padding:0; display:grid;
  grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:10px; text-align:left; }
.soltar-lista li{ display:flex; align-items:center; gap:10px; min-width:0;
  background:var(--superficie); border:1px solid var(--line); border-radius:10px; padding:7px; }
.soltar-lista img{ width:44px; height:44px; object-fit:cover; border-radius:7px;
  flex-shrink:0; display:block; }
.soltar-icono{ width:44px; height:44px; display:flex; align-items:center; justify-content:center;
  font-size:20px; background:var(--chip-fondo); border-radius:7px; flex-shrink:0; }
.soltar-nombre{ font-size:12px; font-weight:600; min-width:0; overflow-wrap:anywhere;
  line-height:1.3; }
.soltar-nombre small{ display:block; font-weight:400; color:var(--muted); }

/* Enlace para saltar del alta rápida a la ficha completa y al revés. */
.cambiar-modo{ margin:-8px 0 20px; font-size:13.5px; color:var(--muted); }

/* ---------- Rejilla del inventario ---------- */
.rejilla-piezas{ display:grid; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); gap:20px; }
.tarjeta-pieza{ display:flex; flex-direction:column; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); overflow:hidden; text-decoration:none; color:var(--ink);
  box-shadow:var(--shadow-sm); transition:.18s; }
.tarjeta-pieza:hover{ transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--gold-soft); }
.tp-foto{ position:relative; aspect-ratio:4/3; background:var(--superficie-3); }
.tp-foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.tp-foto .sin-foto{ min-height:0; height:100%; border-radius:0; }
.tp-foto .sin-foto span{ font-size:40px; }
.tp-cuerpo{ padding:14px 16px 16px; }
.tp-cuerpo h3{ margin:0 0 2px; font-size:19px; }
.tp-cuerpo h3 small{ display:block; font-family:'Inter',sans-serif; font-size:13px;
  font-weight:400; color:var(--muted); }
.tp-meta{ margin:0 0 8px; font-size:13px; color:var(--muted); }
.tp-precios{ margin:0 0 6px; font-size:14px; display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.tp-coste{ font-weight:600; }
.tp-flecha{ color:var(--gold); }
.tp-venta{ color:var(--ok); font-weight:600; }
/* El €/ct: discreto pero siempre en el mismo sitio, para poder recorrer
   la cuadrícula con la vista comparando solo esa cifra. */
.tp-porct{ margin:0 0 6px; font-size:12.5px; color:var(--muted);
  letter-spacing:.02em; }
/* El filete del color medido, entre la foto y los datos. Con el orden
   «rueda de matiz», la cuadrícula se lee de un vistazo como una paleta. */
.tp-color{ display:block; height:5px; }

/* ---------- Filtros y pestañas ---------- */
.barra-filtros{ display:flex; gap:14px; align-items:end; flex-wrap:wrap; margin-bottom:22px; }
.barra-filtros label{ margin:0; font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); }
.barra-filtros select{ min-width:170px; margin-top:5px; }
.barra-filtros input[type=search],
.barra-filtros input[type=number]{ margin-top:5px; }
.barra-filtros > .btn-ghost{ margin-bottom:1px; }

/* La búsqueda dentro del inventario manda: ocupa lo que sobre. */
.filtro-ancho{ flex:1 1 260px; }
.filtro-ancho input{ width:100%; }

/* Los rangos (quilates, coste) son dos casillas pequeñas con un guion. */
.filtro-rango .rango{ display:flex; align-items:center; gap:6px; margin-top:5px; }
.filtro-rango input{ width:88px; margin-top:0; }
.rango-guion{ color:var(--muted); }

/* «Más filtros»: lo de uso diario queda arriba, y lo demás a un clic.
   Se abre solo si venías con alguno de estos puesto (lo decide el router). */
.mas-filtros{ margin:-8px 0 22px; }
.mas-filtros > summary{ cursor:pointer; font-size:13px; font-weight:600;
  color:var(--burg); list-style:none; display:inline-flex; align-items:center;
  gap:8px; padding:8px 2px; min-height:38px; }
.mas-filtros > summary::-webkit-details-marker{ display:none; }
.mas-filtros > summary::before{ content:"▸"; transition:transform .15s; }
.mas-filtros[open] > summary::before{ transform:rotate(90deg); }
.barra-filtros-avanzada{ margin:6px 0 0; padding:16px 18px; background:var(--card);
  border:1px solid var(--line); border-radius:var(--radius); box-shadow:var(--shadow-sm); }
.filtros-acciones{ display:flex; gap:10px; align-items:end; flex-wrap:wrap; }
.pestaña{ padding:10px 18px; border-radius:10px; border:1px solid var(--line); background:var(--card);
  text-decoration:none; color:var(--ink); font-size:14px; font-weight:600; min-height:44px;
  display:inline-flex; align-items:center; }
.pestaña:hover{ border-color:var(--gold); }
.pestaña.activa{ background:var(--burg-fondo); color:var(--sobre-burg); border-color:var(--burg-fondo); }
.acciones-cabecera{ display:flex; gap:10px; flex-wrap:wrap; }

/* ---------- Votación de compra ---------- */
.badge-compra{ background:var(--oro-chip); color:var(--oro-tinta); }
.vote-item.es-compra{ align-items:stretch; }
.vote-mini-foto{ width:78px; height:78px; flex-shrink:0; border-radius:10px; overflow:hidden;
  background:var(--superficie-3); display:grid; place-items:center; font-size:30px; }
.vote-mini-foto img{ width:100%; height:100%; object-fit:cover; }
.vote-linea-compra{ display:flex; gap:10px; flex-wrap:wrap; align-items:center; margin-top:6px !important; }
.mini-resultado{ font-size:12px; font-weight:600; padding:2px 9px; border-radius:20px; background:var(--chip-fondo); }
.resultado-aprobada{ background:var(--ok-chip); color:var(--ok); }
.resultado-rechazada{ background:var(--peligro-panel); color:var(--peligro-tinta); }
.resultado-empate{ background:var(--aviso-panel); color:var(--aviso-tinta); }
.ya-vote{ display:block; font-size:11px; color:var(--gold); font-weight:600; margin-top:4px; }

.caja-numeros{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:14px; margin-top:16px; }
.caja-numeros > div{ background:var(--superficie); border:1px solid var(--line); border-radius:10px; padding:12px 14px; }
.caja-numeros span{ display:block; font-size:11px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted); }
.caja-numeros strong{ display:block; font-size:20px; font-family:'Cormorant Garamond',serif; }
.caja-numeros small{ color:var(--muted); font-size:12px; }
.positivo{ color:var(--ok); }
.negativo{ color:#a23b3b; }

.caja-votacion{ margin-bottom:18px; }
.marcador{ display:flex; flex-direction:column; gap:10px; margin:18px 0; }
.marcador-fila{ display:grid; grid-template-columns:96px 1fr 34px; align-items:center; gap:12px; }
.m-et{ font-size:14px; font-weight:600; }
.m-barra{ height:14px; background:var(--barra); border-radius:20px; overflow:hidden; }
.m-barra i{ display:block; height:100%; border-radius:20px; transition:width .4s ease; min-width:2px; }
.v-favor{ background:linear-gradient(90deg,#3ba36c,var(--ok)); }
.v-contra{ background:linear-gradient(90deg,#c96a6a,#a23b3b); }
.v-abs{ background:linear-gradient(90deg,#cfc6bd,var(--muted)); }
.m-n{ text-align:right; font-weight:700; font-variant-numeric:tabular-nums; }
.resultado{ padding:14px 16px; border-radius:10px; background:var(--superficie); font-size:15px; margin:16px 0; }
.botones-voto{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:12px; margin-top:16px; }
.btn-voto{ padding:15px 18px; border-radius:12px; border:2px solid var(--line); background:var(--card);
  font-size:15px; font-weight:700; cursor:pointer; color:var(--ink); min-height:52px; transition:.15s; }
.btn-voto-1{ border-color:var(--ok-borde); color:var(--ok); }
.btn-voto-1:hover{ background:var(--ok); color:#fff; border-color:var(--ok); }
.btn-voto-2{ border-color:#e8d0d0; color:#a23b3b; }
.btn-voto-2:hover{ background:var(--peligro-tinta); color:var(--sobre-color); border-color:var(--peligro-tinta); }
.btn-voto-3:hover{ background:var(--muted); color:#fff; border-color:var(--muted); }
.ya-votado{ background:var(--superficie); padding:12px 16px; border-radius:10px; font-size:14px; }
.acciones-admin{ display:flex; gap:10px; flex-wrap:wrap; margin-top:20px;
  padding-top:18px; border-top:1px solid var(--line); }

/* ---------- Contabilidad ---------- */
.tarjetas-resumen{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr));
  gap:16px; margin-bottom:22px; }
.tr{ background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  padding:18px 20px; box-shadow:var(--shadow-sm); }
.tr span{ display:block; font-size:11px; text-transform:uppercase; letter-spacing:.07em; color:var(--muted); }
.tr strong{ display:block; font-family:'Cormorant Garamond',serif; font-size:26px; margin:4px 0 2px;
  color:var(--burg); line-height:1.15; overflow-wrap:anywhere; }
.tr small{ color:var(--muted); font-size:12px; }
.tr-destacada{ background:linear-gradient(140deg,var(--superficie),var(--superficie-3)); border-color:var(--gold-soft); }
.calculado{ font-family:'Inter',sans-serif; font-size:12px; font-weight:400; color:var(--muted);
  text-transform:uppercase; letter-spacing:.06em; }
.aviso-compromiso{ background:var(--oro-panel); border:1px solid var(--gold-soft); border-left:4px solid var(--gold);
  border-radius:10px; padding:14px 18px; margin-bottom:22px; font-size:14px; }
.aviso-compromiso ul{ margin:8px 0 0; padding-left:20px; }
.tabla-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; border-radius:var(--radius);
  box-shadow:var(--shadow-sm); }
.tabla-scroll .tabla{ min-width:640px; }
.tabla .num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.tabla tfoot th{ background:var(--superficie-3); color:var(--burg); text-transform:none; font-size:14px; }
.fila-apagada{ opacity:.55; }
.rejilla-conta{ display:grid; grid-template-columns:minmax(0,340px) minmax(0,1fr); gap:20px; align-items:start; }
.form-movimiento .campo{ margin:12px 0; }
.totales-mini{ display:flex; flex-direction:column; gap:8px; margin-bottom:18px; }
.totales-mini > div{ display:flex; justify-content:space-between; align-items:center; gap:12px;
  padding:9px 12px; background:var(--superficie); border-radius:9px; font-size:14px; }
.total-fondo{ background:var(--superficie-3) !important; font-weight:700; border:1px solid var(--gold-soft); }
.lista-socios{ list-style:none; padding:0; margin:0 0 18px; }
.lista-socios li{ display:flex; justify-content:space-between; padding:8px 0; border-top:1px solid var(--line); font-size:14px; }
.lista-movimientos{ list-style:none; padding:0; margin:0; }
.lista-movimientos li{ display:flex; align-items:center; gap:12px; padding:12px 0;
  border-top:1px solid var(--line); }
.mov-icono{ font-size:20px; flex-shrink:0; }
.mov-cuerpo{ flex:1; min-width:0; display:flex; flex-direction:column; }
.mov-cuerpo strong{ font-size:14px; overflow-wrap:anywhere; }
.mov-cuerpo small{ color:var(--muted); font-size:12px; }
.mov-notas{ font-style:italic; }
.mov-importe{ font-weight:700; font-variant-numeric:tabular-nums; white-space:nowrap; }
.vacio-mini{ color:var(--muted); font-style:italic; font-size:14px; }

/* ---------- Ajustes ---------- */
.lista-tarjetas{ display:grid; grid-template-columns:repeat(auto-fill,minmax(320px,1fr)); gap:18px; }
.card-socio .socio-cabecera{ display:flex; gap:14px; align-items:flex-start; margin-bottom:14px; }
.avatar-grande{ width:52px; height:52px; font-size:22px; }
.card-socio h3{ margin:0 0 2px; }
.sub{ color:var(--muted); font-size:14px; margin:0 0 6px; }
.form-linea{ display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:0 18px; align-items:end; }
.form-linea > button{ margin-top:14px; }
.nota-explicativa{ background:var(--superficie); border:1px solid var(--line); border-left:4px solid var(--gold);
  border-radius:10px; padding:16px 20px; margin-bottom:22px; font-size:14px; }
.nota-explicativa p{ margin:6px 0; }
.campo-cabecera{ display:flex; justify-content:space-between; gap:12px; align-items:flex-start; flex-wrap:wrap; }
.card-campo code{ background:var(--superficie-3); padding:2px 7px; border-radius:6px; font-size:12px; }
.campo-inactivo{ opacity:.6; }

/* ============================================================
   ADAPTACIÓN A PANTALLAS PEQUEÑAS
   ============================================================ */

/* --- Tabletas y móviles apaisados --- */
@media (max-width:900px){
  .ficha-cabecera{ grid-template-columns:1fr; gap:18px; padding:18px; }
  .ficha-foto img{ max-height:300px; }
  .rejilla-conta{ grid-template-columns:1fr; }
  .container{ margin:24px auto; }
}

/* --- Móviles: la navegación baja a una barra inferior tipo app --- */
@media (max-width:760px){
  .topbar{ height:56px; padding:0 14px; gap:10px; }
  .topbar .nav{ display:none; }                 /* pasa a la barra inferior */
  .brand{ font-size:19px; }
  .brand-txt{ display:none; }                   /* solo el rombo, para dejar sitio */
  .nav-user{ margin-left:auto; gap:8px; }
  .user-name{ display:none; }
  .btn-out{ padding:8px 12px; }

  /* La navegación del móvil ya no es una barra fija abajo: es el desplegable
     del rombo, arriba. Tapaba el final de todas las páginas y con nueve
     secciones iba ilegible. Ver `.menu-rombo`. */

  .container{ margin:18px auto; padding:0 15px; }
  h1{ font-size:27px; }
  h2{ font-size:22px; }

  .header-row{ flex-direction:column; align-items:stretch; gap:12px; }
  .acciones-cabecera{ display:grid; grid-template-columns:1fr; gap:8px; }
  .acciones-cabecera .btn, .acciones-cabecera .btn-ghost{ text-align:center; }

  .card, .ficha-seccion{ padding:18px 16px; }
  .campos{ grid-template-columns:1fr; padding:4px 14px 14px; }
  .form-linea{ grid-template-columns:1fr; }
  .destacados{ grid-template-columns:1fr 1fr; }
  .ficha-datos{ grid-template-columns:1fr; gap:12px; }
  .rejilla-piezas{ grid-template-columns:1fr 1fr; gap:12px; }
  .tp-cuerpo{ padding:11px 12px 13px; }
  .tp-cuerpo h3{ font-size:16px; }
  .galeria{ grid-template-columns:1fr 1fr; gap:10px; }
  .galeria-videos{ grid-template-columns:1fr; }
  .lista-tarjetas{ grid-template-columns:1fr; }
  .tarjetas-resumen{ grid-template-columns:1fr 1fr; }
  .tr strong{ font-size:21px; }
  .fila-subida{ grid-template-columns:1fr; }
  .botones-voto{ grid-template-columns:1fr; }
  .barra-filtros{ gap:8px; overflow-x:auto; padding-bottom:4px; }
  .barra-filtros select{ min-width:0; width:100%; }
  .barra-filtros label{ flex:1; min-width:130px; }
  /* Los filtros avanzados son muchos para una tira horizontal: aquí bajan
     en dos columnas y el panel entero deja de hacer scroll lateral. */
  .barra-filtros-avanzada{ overflow-x:visible; display:grid;
    grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); padding:14px; }
  .filtro-ancho{ flex-basis:100%; }
  .filtro-rango, .filtros-acciones{ grid-column:1 / -1; }
  .filtro-rango input{ flex:1; width:auto; }
  .ficha-acciones, .acciones-admin, .form-acciones{ display:grid; grid-template-columns:1fr; gap:8px; }
  .ficha-acciones .btn, .ficha-acciones .btn-ghost,
  .acciones-admin .btn, .acciones-admin .btn-ghost,
  .form-acciones .btn, .form-acciones .btn-ghost,
  .en-linea, .en-linea button{ width:100%; text-align:center; }

  .vote-item{ padding:14px 16px; gap:12px; flex-wrap:wrap; }
  .vote-mini-foto{ width:56px; height:56px; }
  .vote-item-meta{ text-align:left; }
  .vote-count{ font-size:22px; display:inline; }
  .vote-count-label{ display:inline; }

  .lista-movimientos li{ flex-wrap:wrap; }
  .mov-cuerpo{ flex:1 1 60%; }
  .marcador-fila{ grid-template-columns:80px 1fr 28px; gap:8px; }
}

/* --- Móviles estrechos --- */
@media (max-width:400px){
  .rejilla-piezas, .tarjetas-resumen, .destacados{ grid-template-columns:1fr; }
  h1{ font-size:24px; }
  .bi-icono{ font-size:18px; }
}

/* Evita que iOS haga zoom al enfocar un campo: nunca menos de 16px. */
@media (max-width:760px){
  input, textarea, select{ font-size:16px; }
}

/* --- Impresión: la ficha en papel --- */
@media print{
  .topbar, .menu-rombo, .saltar, .ficha-acciones, .acciones-admin,
  .subir-card, .medio-acciones, .flash, .cuentagotas{ display:none !important; }
  body{ background:#fff; }
  .card, .ficha-seccion, .ficha-cabecera{ box-shadow:none; border:1px solid #ddd; break-inside:avoid; }
}

/* ---------- Guía ---------- */
.rejilla-guia{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:18px; }
.tarjeta-guia{ display:flex; flex-direction:column; background:var(--card); border:1px solid var(--line);
  border-radius:var(--radius); overflow:hidden; text-decoration:none; color:var(--ink);
  box-shadow:var(--shadow-sm); transition:.18s; }
.tarjeta-guia:hover{ transform:translateY(-3px); box-shadow:var(--shadow); border-color:var(--gold-soft); }
.tg-foto{ aspect-ratio:16/9; background:var(--superficie-3); }
.tg-foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.tg-cuerpo{ padding:16px 18px 14px; display:flex; flex-direction:column; flex:1; }
.tg-cuerpo h3{ margin:0 0 6px; font-size:20px; }
.tg-cuerpo p{ margin:0 0 10px; color:var(--muted); font-size:14px; flex:1; }
.tg-pie{ margin:0 !important; font-size:12px; color:var(--muted); }

.articulo{ max-width:760px; margin:0 auto 18px; }
.articulo h1{ margin:4px 0 8px; }
.articulo-firma{ color:var(--muted); font-size:13px; margin:0 0 18px; }
.articulo-resumen{ font-size:17px; color:var(--ink); border-left:3px solid var(--gold);
  padding-left:16px; margin:0 0 22px; }
.articulo-foto{ margin:0 0 22px; }
.articulo-foto img{ width:100%; border-radius:12px; display:block; }
.articulo-cuerpo{ font-size:16px; line-height:1.7; }
.articulo-cuerpo h3{ margin:28px 0 10px; font-size:24px; }
.articulo-cuerpo h4{ margin:22px 0 8px; font-size:17px; font-family:'Inter',sans-serif;
  color:var(--burg); font-weight:600; }
.articulo-cuerpo p{ margin:0 0 14px; }
.articulo-cuerpo ul, .articulo-cuerpo ol{ margin:0 0 16px; padding-left:24px; }
.articulo-cuerpo li{ margin-bottom:6px; }
.articulo-cuerpo blockquote{ margin:18px 0; padding:14px 18px; background:var(--superficie);
  border-left:3px solid var(--gold); border-radius:0 10px 10px 0; color:var(--ink); }
.articulo-cuerpo hr{ border:none; border-top:1px solid var(--line); margin:26px 0; }
.articulo-cuerpo a{ color:var(--burg); text-decoration:underline; overflow-wrap:anywhere; }
.form-ancha{ max-width:820px; }
.campos-anchos{ grid-template-columns:1fr 1fr; }
.chuleta{ list-style:none; padding:14px 18px; margin:0 0 20px; background:var(--superficie);
  border:1px solid var(--line); border-radius:10px; font-size:13px; color:var(--muted); }
.chuleta li{ margin:4px 0; }
.chuleta code{ background:var(--superficie-3); color:var(--burg); padding:2px 7px; border-radius:5px;
  font-size:12px; margin-right:6px; }

.tarjeta-ajustes{ display:flex; align-items:center; gap:16px; background:var(--card);
  border:1px solid var(--line); border-radius:var(--radius); padding:18px 22px;
  text-decoration:none; color:var(--ink); box-shadow:var(--shadow-sm);
  margin-bottom:20px; transition:.16s; }
.tarjeta-ajustes:hover{ border-color:var(--gold); transform:translateX(3px); }
.ta-icono{ font-size:28px; }
.ta-cuerpo{ flex:1; display:flex; flex-direction:column; }
.ta-cuerpo small{ color:var(--muted); font-size:13px; }
.ta-flecha{ color:var(--gold); font-size:20px; }

@media (max-width:760px){
  .rejilla-guia{ grid-template-columns:1fr; }
  .campos-anchos{ grid-template-columns:1fr; }
  .articulo-cuerpo{ font-size:15.5px; }
  .articulo-cuerpo h3{ font-size:21px; }
}

/* ---------- Buscador de la barra superior ---------- */
.buscador{ display:flex; align-items:center; margin:0 0 0 auto; position:relative; }
.buscador input{ width:190px; margin:0; padding:8px 34px 8px 13px; border-radius:20px;
  border:1px solid rgba(255,255,255,.22); background:rgba(255,255,255,.12); color:#fff;
  font-size:13px; transition:.18s; }
.buscador input::placeholder{ color:rgba(255,255,255,.6); }
.buscador input:focus{ width:250px; background:rgba(255,255,255,.2); border-color:var(--gold-soft);
  box-shadow:none; outline:none; }
.buscador button{ position:absolute; right:4px; background:none; border:none; cursor:pointer;
  font-size:14px; padding:6px; line-height:1; min-height:auto; }
.buscador-grande{ display:flex; gap:10px; margin-bottom:24px; }
.buscador-grande input{ flex:1; margin:0; font-size:17px; padding:14px 18px; border-radius:12px; }
.buscador-grande .btn{ flex-shrink:0; }

@media (max-width:760px){
  .buscador{ flex:1; margin-left:6px; }
  .buscador input{ width:100%; }
  .buscador input:focus{ width:100%; }
  .buscador-grande{ flex-direction:column; }
  .buscador-grande .btn{ width:100%; }
}

/* ---------- Comentarios ---------- */
.visualmente-oculto{ position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }
.lista-comentarios{ list-style:none; padding:0; margin:0 0 20px; }
.comentario{ display:flex; gap:12px; align-items:flex-start; padding:14px 0;
  border-top:1px solid var(--line); }
.comentario:first-child{ border-top:none; }
.avatar-mini{ width:34px; height:34px; font-size:14px; flex-shrink:0; }
.c-cuerpo{ flex:1; min-width:0; }
.c-firma{ margin:0 0 3px; font-size:13px; display:flex; gap:8px; align-items:baseline;
  flex-wrap:wrap; }
.c-firma small{ color:var(--muted); font-size:12px; }
.c-texto{ margin:0; font-size:15px; line-height:1.55; white-space:pre-line;
  overflow-wrap:anywhere; }
.comentario.es-mio .c-cuerpo{ background:var(--superficie); border-radius:10px; padding:10px 14px; }
.form-comentario textarea{ margin-bottom:12px; }
.form-comentario{ padding-top:18px; border-top:1px solid var(--line); }

/* ---------- Panel: avisos y actividad ---------- */
.aviso-pendiente{ display:flex; gap:18px; align-items:flex-start;
  background:linear-gradient(140deg,var(--oro-panel),var(--oro-chip)); border:1px solid var(--gold-soft);
  border-left:4px solid var(--gold); border-radius:var(--radius);
  padding:20px 24px; margin:22px 0 4px; box-shadow:var(--shadow-sm); }
.ap-icono{ font-size:32px; line-height:1; }
.ap-cuerpo{ flex:1; min-width:0; }
.ap-cuerpo h3{ margin:0 0 4px; }
.ap-cuerpo > p{ margin:0 0 10px; color:var(--muted); font-size:14px; }
.ap-lista{ list-style:none; padding:0; margin:0; }
.ap-lista li{ display:flex; justify-content:space-between; gap:12px; align-items:baseline;
  padding:7px 0; border-top:1px solid rgba(195,155,74,.25); }
.ap-lista a{ color:var(--burg); text-decoration:none; font-weight:600; font-size:14px;
  overflow-wrap:anywhere; }
.ap-lista a:hover{ text-decoration:underline; }
.ap-precio{ font-weight:700; font-variant-numeric:tabular-nums; white-space:nowrap; font-size:14px; }

.lista-actividad{ list-style:none; padding:0; margin:0; }
.lista-actividad li{ display:flex; align-items:center; gap:12px; padding:11px 0;
  border-top:1px solid var(--line); }
.lista-actividad li:first-child{ border-top:none; }
.act-icono{ font-size:18px; flex-shrink:0; width:24px; text-align:center; }
.act-texto{ flex:1; min-width:0; color:var(--ink); text-decoration:none; font-size:14px;
  overflow-wrap:anywhere; }
.act-texto:hover{ color:var(--burg); text-decoration:underline; }
.act-fecha{ color:var(--muted); font-size:12px; white-space:nowrap; flex-shrink:0; }

@media (max-width:760px){
  .aviso-pendiente{ padding:16px 18px; gap:12px; }
  .ap-icono{ font-size:26px; }
  .lista-actividad li{ flex-wrap:wrap; }
  .act-texto{ flex:1 1 70%; }
}

/* ---------- Páginas de error ---------- */
.pagina-error{ text-align:center; max-width:520px; margin:40px auto; padding:44px 28px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--radius);
  box-shadow:var(--shadow-sm); }
.err-gema{ font-size:64px; margin-bottom:10px; }
.pagina-error h1{ margin:2px 0 12px; }
.err-texto{ color:var(--muted); margin:0 0 24px; }
.pagina-error .ficha-acciones{ justify-content:center; }

/* ============================================================
   MODO OSCURO
   ------------------------------------------------------------
   Aquí abajo no hay ni una regla de componente: **solo el otro juego
   de valores**. Antes había cuarenta líneas repitiendo a mano el
   fondo de cada cosa, y cada componente nuevo obligaba a acordarse de
   volver y parchearlo. Olvidarse no rompía nada: solo quedaba feo de
   noche, que es peor, porque no se ve hasta que alguien lo sufre.

   Si algo se ve mal de noche, la causa es una de dos: le falta su
   ficha aquí, o la regla está usando un color a pelo en vez de una.

   Tres estados, y el orden importa porque el último gana:

     1. Sin elegir nada    -> lo que diga el sistema operativo.
     2. Eligiendo «oscuro» -> oscuro aunque el sistema sea claro.
     3. Eligiendo «claro»  -> claro aunque el sistema sea oscuro.

   El `:not([data-tema="claro"])` es lo que hace posible el punto 3:
   sin él, quien tenga el móvil en oscuro no podría pedir el modo
   claro y el interruptor sería mentira a medias.
   ============================================================ */

@media (prefers-color-scheme: dark){
  html:not([data-tema="claro"]){
    --burg:#c9758c;         /* el borgoña, aclarado para que se lea sobre oscuro */
    --burg2:#dd8ba1;
    --burg-deep:#2b1119;    /* fondo de la barra superior */
    /* Y el borgoña de FONDO se queda oscuro, que para eso son dos fichas: con
       el valor aclarado de arriba, la barra superior salía más clara de noche
       que de día y los dos temas acababan pareciéndose demasiado. */
    --burg-fondo:#54202f;
    --burg-fondo-2:#68293b;
    --sobre-burg:#f7ecef;
    --gold:#d4ac63;
    --gold-soft:#e8d3a4;
    --ink:#ece5e0;          /* texto principal */
    --muted:#a4988f;
    --line:#3a2f31;
    --bg:#181315;           /* fondo general */
    --card:#221b1e;
    --ok:#5cbc8a;
    --shadow:0 8px 30px rgba(0,0,0,.45);
    --shadow-sm:0 2px 10px rgba(0,0,0,.3);
    --superficie:#1e1719;
    --superficie-2:#241d20;
    --superficie-3:#2a2124;
    --campo:#1c1618;
    --campo-activo:#241d20;
    --chip-fondo:#2c2226;
    --sobre-color:#20161a;
    --ok-panel:#17251d;
    --ok-borde:#2c4436;
    --ok-chip:#17251d;
    --aviso-panel:#2c2216;
    --aviso-borde:#463a22;
    --aviso-chip:#2c2216;
    --aviso-tinta:#d9a459;
    --oro-panel:#261e14;
    --oro-borde:#463a22;
    --oro-chip:#2c2519;
    --oro-tinta:#e8d3a4;
    --peligro-panel:#2b1b1b;
    --peligro-tinta:#d98787;
    --barra:#332a2d;
    --flash-fondo:#2a2119;
    --flash-borde:#4a3a22;
  }
  html:not([data-tema="claro"]) .auth-body{ background:#120e10; }
  html:not([data-tema="claro"]) .tr-destacada{ background:linear-gradient(140deg,#231b1e,#2b2126); }
}

/* Elegido a mano en el perfil: manda sobre lo que diga el sistema. */
html[data-tema="oscuro"]{
  --burg:#c9758c;         /* el borgoña, aclarado para que se lea sobre oscuro */
  --burg2:#dd8ba1;
  --burg-deep:#2b1119;    /* fondo de la barra superior */
  /* Y el borgoña de FONDO se queda oscuro, que para eso son dos fichas: con
     el valor aclarado de arriba, la barra superior salía más clara de noche
     que de día y los dos temas acababan pareciéndose demasiado. */
  --burg-fondo:#54202f;
  --burg-fondo-2:#68293b;
  --sobre-burg:#f7ecef;
  --gold:#d4ac63;
  --gold-soft:#e8d3a4;
  --ink:#ece5e0;          /* texto principal */
  --muted:#a4988f;
  --line:#3a2f31;
  --bg:#181315;           /* fondo general */
  --card:#221b1e;
  --ok:#5cbc8a;
  --shadow:0 8px 30px rgba(0,0,0,.45);
  --shadow-sm:0 2px 10px rgba(0,0,0,.3);
  --superficie:#1e1719;
  --superficie-2:#241d20;
  --superficie-3:#2a2124;
  --campo:#1c1618;
  --campo-activo:#241d20;
  --chip-fondo:#2c2226;
  --sobre-color:#20161a;
  --ok-panel:#17251d;
  --ok-borde:#2c4436;
  --ok-chip:#17251d;
  --aviso-panel:#2c2216;
  --aviso-borde:#463a22;
  --aviso-chip:#2c2216;
  --aviso-tinta:#d9a459;
  --oro-panel:#261e14;
  --oro-borde:#463a22;
  --oro-chip:#2c2519;
  --oro-tinta:#e8d3a4;
  --peligro-panel:#2b1b1b;
  --peligro-tinta:#d98787;
  --barra:#332a2d;
  --flash-fondo:#2a2119;
  --flash-borde:#4a3a22;
}
html[data-tema="oscuro"] .auth-body{ background:#120e10; }
html[data-tema="oscuro"] .tr-destacada{ background:linear-gradient(140deg,#231b1e,#2b2126); }

/* ============================================================
   CHAT
   ------------------------------------------------------------
   Ocupa la pantalla entera menos la barra superior: la lista de
   mensajes es lo único que hace scroll, y la caja de escribir se
   queda siempre abajo. En el móvil las salas pasan a una tira
   horizontal arriba y la conversación se lleva todo el alto.
   ============================================================ */
.contenedor-chat{ max-width:1400px; margin:0 auto; padding:0; }
.chat{
  display:grid; grid-template-columns:230px minmax(0,1fr);
  height:calc(100vh - 64px);           /* 64px = alto de la barra superior */
  background:var(--card); border-left:1px solid var(--line); border-right:1px solid var(--line);
}
.chat.soltando{ outline:3px dashed var(--gold); outline-offset:-8px; }

/* ---------- Columna de salas ---------- */
.chat-salas{ border-right:1px solid var(--line); background:var(--superficie); overflow-y:auto;
  padding:14px 10px; }
.cs-cabecera{ display:flex; align-items:center; justify-content:space-between; padding:0 8px 8px; }
.cs-cabecera h2{ font-size:17px; margin:0; }
.chat-salas ul{ list-style:none; padding:0; margin:0 0 14px; }
.chat-salas li a{ display:flex; align-items:center; gap:10px; padding:10px 12px;
  border-radius:9px; text-decoration:none; color:var(--ink); font-size:14px;
  font-weight:500; min-height:42px; }
.chat-salas li a:hover{ background:var(--superficie-2); }
.chat-salas li a.activa{ background:var(--burg-fondo); color:var(--sobre-burg); }
.cs-icono{ font-size:17px; flex-shrink:0; }
.cs-nombre{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.cs-nueva summary{ font-size:13px; padding:10px 12px; }

/* ---------- Cabecera de la sala ---------- */
.chat-principal{ display:flex; flex-direction:column; min-width:0; min-height:0; }
.chat-cabecera{ display:flex; align-items:center; justify-content:space-between; gap:14px;
  padding:14px 22px; border-bottom:1px solid var(--line); flex-shrink:0; flex-wrap:wrap; }
.chat-cabecera h1{ font-size:23px; margin:0; }
.chat-cabecera .sub{ margin:2px 0 0; font-size:13px; }
.chat-cabecera-acciones{ display:flex; gap:8px; align-items:center; }
.btn-mini{ padding:7px 12px; font-size:13px; min-height:36px; display:inline-flex;
  align-items:center; border-radius:8px; }

.menu-panel{ position:relative; }
.menu-panel > summary{ list-style:none; cursor:pointer; }
.menu-panel > summary::-webkit-details-marker{ display:none; }
.panel-flotante{ position:absolute; right:0; top:calc(100% + 6px); z-index:40;
  width:min(340px,80vw); max-height:60vh; overflow-y:auto; background:var(--card);
  border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow); padding:14px; }
.panel-flotante h3{ font-size:16px; margin:0 0 10px; }
.panel-fila{ display:block; padding:9px 0; border-top:1px solid var(--line);
  text-decoration:none; color:var(--ink); font-size:13px; }
.panel-fila strong{ display:block; color:var(--burg); font-size:12px; }
.panel-fila span{ color:var(--muted); }

/* ---------- Lista de mensajes ---------- */
.chat-mensajes{ flex:1; overflow-y:auto; padding:18px 22px 10px;
  display:flex; flex-direction:column; gap:2px; scroll-behavior:smooth; }
.chat-vacio{ margin:auto; text-align:center; color:var(--muted); }
.cv-icono{ font-size:48px; margin:0 0 8px; }

.mensaje{ display:flex; gap:12px; padding:9px 10px; border-radius:12px;
  position:relative; align-items:flex-start; }
.mensaje:hover{ background:var(--superficie); }
.mensaje.destacado{ background:var(--oro-panel); box-shadow:0 0 0 2px var(--gold-soft); }
.mensaje.esta-fijado{ background:var(--campo); }
.mensaje.es-asistente{ background:linear-gradient(100deg,var(--superficie),transparent 60%);
  border-left:3px solid var(--gold); }
.mensaje.es-tarea{ border-left:3px solid #d9a459; }
.mensaje.tarea-hecha .m-texto{ opacity:.6; }
.mensaje.es-sistema{ justify-content:center; padding:5px 0; }
.m-sistema{ text-align:center; font-size:12.5px; color:var(--muted);
  background:var(--superficie-3); border-radius:20px; padding:5px 16px; display:inline-block; }
.m-sistema p{ margin:0; display:inline; }
.m-sistema .m-hora{ margin-left:8px; opacity:.7; }
.m-borrado{ color:var(--muted); font-style:italic; font-size:13.5px; margin:0; }

.avatar-claude{ background:linear-gradient(140deg,#c9752f,#8b3a1f); color:#fff; }
.m-cuerpo{ flex:1; min-width:0; }
.m-firma{ margin:0 0 3px; font-size:13px; display:flex; gap:8px; align-items:baseline;
  flex-wrap:wrap; }
.m-firma strong{ color:var(--burg); }
.m-firma time, .m-editado{ color:var(--muted); font-size:11.5px; }
.m-firma .chip{ font-size:10.5px; padding:2px 8px; }

.m-cita{ display:block; border-left:3px solid var(--gold-soft); padding:4px 0 4px 10px;
  margin:0 0 6px; text-decoration:none; font-size:12.5px; color:var(--muted); }
.m-cita strong{ color:var(--burg); display:block; }
.m-cita:hover{ background:var(--superficie-2); }

.m-texto{ font-size:15px; line-height:1.55; overflow-wrap:anywhere; }
.m-texto > p:first-child{ margin-top:0; }
.m-texto > p:last-child{ margin-bottom:0; }
.m-texto p{ margin:0 0 8px; }
.m-texto ul, .m-texto ol{ margin:6px 0 10px; padding-left:22px; }
.m-texto h3{ font-size:19px; margin:14px 0 6px; }
.m-texto h4{ font-size:15px; margin:12px 0 4px; font-family:'Inter',sans-serif;
  color:var(--burg); font-weight:600; }

.m-pensando{ display:flex; align-items:center; gap:4px; color:var(--muted);
  font-size:14px; font-style:italic; margin:2px 0; }
.m-pensando span{ width:6px; height:6px; border-radius:50%; background:var(--gold);
  animation:latido 1.2s infinite; }
.m-pensando span:nth-child(2){ animation-delay:.2s; }
.m-pensando span:nth-child(3){ animation-delay:.4s; margin-right:6px; }
@keyframes latido{ 0%,60%,100%{ opacity:.25; transform:translateY(0); }
                   30%{ opacity:1; transform:translateY(-3px); } }

/* ---------- Adjuntos ---------- */
.m-fotos{ display:grid; grid-template-columns:repeat(auto-fill,minmax(130px,1fr));
  gap:8px; margin:8px 0; max-width:520px; }
.m-fotos.una-sola{ grid-template-columns:minmax(0,320px); }
.m-fotos img{ width:100%; aspect-ratio:1/1; object-fit:cover; border-radius:10px;
  display:block; border:1px solid var(--line); }
.m-fotos.una-sola img{ aspect-ratio:auto; max-height:340px; object-fit:contain;
  background:var(--superficie-3); }
.m-video{ width:100%; max-width:460px; border-radius:10px; margin:8px 0; display:block; }
.m-doc{ display:inline-flex; align-items:center; gap:8px; padding:9px 14px; margin:6px 6px 6px 0;
  background:var(--superficie-3); border:1px solid var(--line); border-radius:9px;
  text-decoration:none; color:var(--burg); font-size:13.5px; font-weight:500; }
.m-doc:hover{ border-color:var(--gold); }

/* ---------- Reacciones ---------- */
.m-reacciones{ display:flex; gap:5px; flex-wrap:wrap; margin-top:7px; }
.m-reacciones form{ margin:0; }
.reaccion{ background:var(--superficie-3); border:1px solid var(--line); border-radius:20px;
  padding:3px 10px; font-size:12.5px; cursor:pointer; color:var(--ink); min-height:28px; }
.reaccion:hover{ border-color:var(--gold); }
.reaccion.mia{ background:var(--oro-chip); border-color:var(--gold); font-weight:600; }
.fila-reacciones{ display:flex; gap:2px; flex-wrap:wrap; padding-bottom:8px;
  border-bottom:1px solid var(--line); margin-bottom:6px; }
.fila-reacciones form{ margin:0; }
.reaccion-elegir{ background:none; border:none; font-size:19px; cursor:pointer;
  padding:5px; border-radius:7px; line-height:1; }
.reaccion-elegir:hover{ background:var(--superficie-3); transform:scale(1.15); }

/* ---------- Menú de cada mensaje ---------- */
.m-menu{ position:relative; flex-shrink:0; }
.m-menu > summary{ list-style:none; cursor:pointer; width:30px; height:30px;
  display:grid; place-items:center; border-radius:8px; color:var(--muted);
  opacity:0; transition:.15s; font-size:17px; }
.m-menu > summary::-webkit-details-marker{ display:none; }
.mensaje:hover .m-menu > summary, .m-menu[open] > summary{ opacity:1; }
.m-menu > summary:hover{ background:#efe4d6; color:var(--burg); }
.m-acciones{ position:absolute; right:0; top:calc(100% + 4px); z-index:45;
  width:236px; background:var(--card); border:1px solid var(--line);
  border-radius:12px; box-shadow:var(--shadow); padding:8px; }
.m-acciones form{ margin:0; }
.accion{ display:block; width:100%; text-align:left; background:none; border:none;
  padding:9px 11px; border-radius:8px; font-size:13.5px; cursor:pointer;
  color:var(--ink); text-decoration:none; font-family:inherit; min-height:38px; }
.accion:hover{ background:var(--superficie-3); }
.accion-peligro{ color:var(--peligro-tinta); }
.accion-peligro:hover{ background:var(--peligro-tinta); color:#fff; }

/* ---------- Lo que hizo el asistente ---------- */
.m-detalles-ia{ margin-top:10px; }
.plegable-ia{ margin:6px 0; background:transparent; border-color:#e3d6c6; }
.plegable-ia > summary{ font-size:12.5px; padding:8px 12px; min-height:auto; color:var(--muted); }
.plegable-ia .plegable-cuerpo{ font-size:13px; }
.pensamiento{ white-space:pre-line; color:var(--muted); font-style:italic; line-height:1.55; }
.uso-herramienta{ margin:8px 0; }
.uso-herramienta code{ background:var(--superficie-3); padding:2px 8px; border-radius:6px;
  font-size:12px; color:var(--burg); font-weight:600; }
.uso-herramienta small{ color:var(--muted); margin-left:8px; font-size:11.5px; }
.uso-herramienta pre{ margin:5px 0 0; padding:9px 12px; background:var(--superficie-3);
  border-radius:8px; font-size:11.5px; max-height:220px; overflow:auto;
  white-space:pre-wrap; overflow-wrap:anywhere; }
.m-coste{ margin:6px 0 0; font-size:11.5px; color:var(--muted); }

.m-tarea-check{ margin-top:8px; display:flex; gap:10px; align-items:center; }
.m-tarea-check small{ color:var(--muted); font-size:12px; }
.m-editor{ margin-top:8px; }
.m-editor textarea{ font-size:15px; }
.m-editor-botones{ display:flex; gap:8px; margin-top:8px; }

/* ---------- Caja de escribir ---------- */
.chat-escribir{ flex-shrink:0; border-top:1px solid var(--line); padding:12px 22px 14px;
  background:var(--card); }
.respondiendo{ display:flex; justify-content:space-between; align-items:center;
  background:var(--superficie-3); border-left:3px solid var(--gold); border-radius:8px;
  padding:7px 12px; margin-bottom:8px; font-size:13px; }
.adjuntos-previos{ display:flex; gap:8px; flex-wrap:wrap; margin-bottom:8px; align-items:center; }
.adjunto-previo{ background:var(--superficie-3); border:1px solid var(--line); border-radius:8px;
  padding:5px 11px; font-size:12px; color:var(--burg); }
.escribir-fila{ display:flex; gap:10px; align-items:flex-end; }
.boton-adjuntar{ position:relative; overflow:hidden; cursor:pointer; flex-shrink:0;
  width:44px; height:44px; display:grid; place-items:center; border-radius:10px;
  border:1px solid var(--line); background:var(--campo); font-size:19px; margin:0; }
.boton-adjuntar:hover{ border-color:var(--gold); background:#fff; }
.boton-adjuntar input{ position:absolute; inset:0; opacity:0; cursor:pointer; padding:0; }
.chat-escribir textarea{ flex:1; margin:0; resize:none; min-height:44px; max-height:220px;
  padding:11px 14px; font-size:15px; line-height:1.45; }
.chat-escribir .btn{ flex-shrink:0; min-height:44px; }
.escribir-ayuda{ margin:8px 0 0; font-size:11.5px; color:var(--muted); }
.escribir-ayuda code, .escribir-ayuda kbd{ background:var(--superficie-3); padding:1px 6px;
  border-radius:5px; font-size:11px; }
.escribir-ayuda kbd{ border:1px solid var(--line); }

/* ---------- Bloques de código y recuadros (chat y Guía) ---------- */
.bloque-codigo{ background:#2a2124; border-radius:10px; margin:10px 0; overflow:hidden;
  border:1px solid #3a2f31; }
.codigo-cabecera{ display:flex; align-items:center; justify-content:space-between;
  gap:10px; padding:7px 12px; background:#221b1e; border-bottom:1px solid #3a2f31; }
.codigo-nombre{ font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  font-size:11.5px; color:#c9a86a; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.copiar-codigo{ background:rgba(255,255,255,.09); border:1px solid rgba(255,255,255,.15);
  color:#e8ddd4; border-radius:7px; padding:4px 11px; font-size:11.5px; cursor:pointer;
  flex-shrink:0; font-family:inherit; }
.copiar-codigo:hover{ background:rgba(255,255,255,.18); }
.copiar-codigo.copiado{ background:#2e5c43; border-color:#3d7a58; color:#a8e6c4; }
.bloque-codigo pre{ margin:0; padding:13px 15px; overflow-x:auto; }
.bloque-codigo code{ font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace;
  font-size:12.8px; line-height:1.6; color:#ece5e0; background:none; padding:0;
  display:block; white-space:pre; }
.bloque-codigo.es-diff code span{ display:block; margin:0 -15px; padding:0 15px; }
.d-mas{ background:rgba(60,140,90,.22); color:#a8e6c4; }
.d-menos{ background:rgba(170,60,60,.22); color:#f0b4b4; }
.d-trozo{ color:#8fa6c9; }
.d-cabecera{ color:#9a8f88; }

.m-texto code, .articulo-cuerpo code{ background:#f0e7dc; color:#8a2a3d;
  padding:1.5px 6px; border-radius:5px; font-size:.9em;
  font-family:ui-monospace,'SFMono-Regular',Menlo,Consolas,monospace; }

.recuadro{ display:flex; gap:11px; align-items:flex-start; padding:11px 15px;
  border-radius:10px; margin:10px 0; font-size:14.5px; }
.recuadro-icono{ font-size:16px; line-height:1.4; flex-shrink:0; }
.recuadro > div{ min-width:0; }
.recuadro-aviso{ background:var(--oro-panel); border-left:3px solid var(--gold); }
.recuadro-nota{ background:#eef3f8; border-left:3px solid #7f9ec4; }
.recuadro-ojo{ background:#fbeaea; border-left:3px solid #c46a6a; }
.recuadro-bien{ background:#eaf6ef; border-left:3px solid var(--ok); }

.plegable{ border:1px solid var(--line); border-radius:10px; margin:10px 0;
  background:var(--superficie); }
.plegable > summary{ cursor:pointer; padding:10px 14px; font-weight:600; font-size:14px;
  color:var(--burg); list-style:none; border-radius:10px; }
.plegable > summary::-webkit-details-marker{ display:none; }
.plegable > summary::before{ content:"▸ "; color:var(--muted); }
.plegable[open] > summary::before{ content:"▾ "; }
.plegable-cuerpo{ padding:2px 14px 12px; }
.tabla-texto{ font-size:13.5px; }
.tabla-texto th{ padding:9px 12px; }
.tabla-texto td{ padding:8px 12px; }

.resultados-chat{ height:auto; overflow:visible; padding:0; }
.ir-al-mensaje{ display:block; font-size:12px; margin:14px 0 -4px; color:var(--gold);
  text-decoration:none; font-weight:600; }

/* ---------- El chat en el móvil ---------- */
@media (max-width:760px){
  .contenedor-chat{ padding:0; margin:0; }
  .chat{ grid-template-columns:1fr; height:calc(100vh - 56px - 64px); }
  .chat-salas{ border-right:none; border-bottom:1px solid var(--line);
    overflow-x:auto; overflow-y:hidden; padding:8px 10px; }
  /* «+ Nueva sala» se escondía en el móvil para ganar sitio, y con eso no
     había forma de crear una conversación desde el teléfono. Se queda: es una
     línea, y no poder crear una sala desde el móvil es una función que
     desaparece, no un ahorro de espacio. */
  .cs-cabecera{ display:none; }
  .cs-nueva{ display:block; flex-shrink:0; }
  .cs-nueva summary{ white-space:nowrap; padding:10px 14px; min-height:44px;
    display:flex; align-items:center; }
  .chat-salas ul{ display:flex; gap:6px; margin:0; }
  .chat-salas li a{ white-space:nowrap; padding:8px 14px; min-height:38px; }
  .chat-cabecera{ padding:10px 14px; }
  .chat-cabecera h1{ font-size:19px; }
  .chat-cabecera .sub{ display:none; }
  .chat-mensajes{ padding:12px 12px 6px; }
  .chat-escribir{ padding:10px 12px 12px; }
  .mensaje{ padding:8px 6px; gap:9px; }
  .m-menu > summary{ opacity:1; }        /* sin hover, el menú siempre visible */
  .m-acciones{ width:min(260px,84vw); }
  .m-fotos{ grid-template-columns:repeat(auto-fill,minmax(100px,1fr)); }
  .escribir-ayuda{ display:none; }
  .bloque-codigo code{ font-size:12px; }
}
/* Cursor parpadeante mientras el asistente escribe */
.cursor-ia{ display:inline-block; width:8px; height:1.05em; margin-left:2px;
  background:var(--gold); vertical-align:text-bottom; animation:parpadeo 1s steps(2) infinite; }
@keyframes parpadeo{ 50%{ opacity:0; } }

/* ---------- Historial de cambios ---------- */
.lista-historial{ list-style:none; padding:0; margin:0; }
.lista-historial li{ padding:11px 0; border-top:1px solid var(--line); }
.lista-historial li:first-child{ border-top:none; }
.h-quien{ display:inline-flex; align-items:center; gap:8px; font-size:14px; }
.lista-historial time{ color:var(--muted); font-size:12px; margin-left:8px; }
.tabla-cambios{ width:100%; border-collapse:collapse; font-size:13px; }
.tabla-cambios th{ text-align:left; padding:6px 10px; color:var(--muted);
  font-size:11px; text-transform:uppercase; letter-spacing:.06em;
  border-bottom:1px solid var(--line); }
.tabla-cambios td{ padding:7px 10px; border-bottom:1px solid var(--line);
  vertical-align:top; overflow-wrap:anywhere; }
.tabla-cambios .antes{ color:var(--peligro-tinta); text-decoration:line-through; opacity:.8; }
.tabla-cambios .despues{ color:var(--ok); font-weight:600; }

/* ---------- Insignias de novedades ---------- */
.nav a{ position:relative; }
.insignia{ display:inline-grid; place-items:center; min-width:18px; height:18px;
  padding:0 5px; margin-left:6px; border-radius:10px; background:var(--gold);
  color:var(--burg-deep); font-size:10.5px; font-weight:700; line-height:1;
  vertical-align:middle; }
.bi-icono{ position:relative; display:inline-block; }
.insignia-punto{ position:absolute; top:-2px; right:-5px; width:9px; height:9px;
  min-width:0; padding:0; border-radius:50%; background:var(--gold);
  box-shadow:0 0 0 2px var(--card); margin:0; }

/* ---------- Panel de novedades del inicio ---------- */
.panel-novedades{ display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
  gap:12px; margin:22px 0 4px; }
.nov{ display:flex; align-items:center; gap:12px; background:var(--card);
  border:1px solid var(--gold-soft); border-radius:var(--radius); padding:14px 16px;
  text-decoration:none; color:var(--ink); box-shadow:var(--shadow-sm); transition:.16s; }
.nov:hover{ transform:translateY(-2px); box-shadow:var(--shadow); }
.nov-icono{ font-size:24px; }
.nov-num{ display:block; font-family:'Cormorant Garamond',serif; font-size:26px;
  font-weight:700; color:var(--burg); line-height:1; }
.nov-txt{ font-size:12.5px; color:var(--muted); }

/* ---------- Visor de fotos a pantalla completa ---------- */
body.sin-scroll{ overflow:hidden; }
.visor{ position:fixed; inset:0; z-index:200; background:rgba(20,14,16,.94);
  display:none; align-items:center; justify-content:center;
  padding:clamp(12px,4vw,50px); backdrop-filter:blur(6px); }
.visor.abierto{ display:flex; }
.visor-imagen{ max-width:100%; max-height:100%; object-fit:contain; border-radius:8px;
  cursor:zoom-in; transition:transform .25s ease; box-shadow:0 20px 60px rgba(0,0,0,.5); }
.visor-imagen.ampliada{ transform:scale(2); cursor:zoom-out; }
.visor-cerrar, .visor-anterior, .visor-siguiente{
  position:absolute; background:rgba(255,255,255,.12); border:1px solid rgba(255,255,255,.2);
  color:#fff; cursor:pointer; border-radius:50%; display:grid; place-items:center;
  transition:.15s; font-family:inherit; }
.visor-cerrar{ top:16px; right:16px; width:44px; height:44px; font-size:19px; }
.visor-anterior, .visor-siguiente{ top:50%; transform:translateY(-50%);
  width:52px; height:52px; font-size:34px; line-height:1; padding-bottom:5px; }
.visor-anterior{ left:14px; }
.visor-siguiente{ right:14px; }
.visor-cerrar:hover, .visor-anterior:hover, .visor-siguiente:hover{
  background:rgba(255,255,255,.28); }
.visor-pie{ position:absolute; bottom:18px; left:50%; transform:translateX(-50%);
  color:rgba(255,255,255,.85); font-size:13px; margin:0; background:rgba(0,0,0,.45);
  padding:7px 16px; border-radius:20px; max-width:80vw; text-align:center; }
.galeria a, .m-fotos a, .ficha-foto a, .articulo-foto a{ cursor:zoom-in; }

@media (max-width:760px){
  .visor{ padding:8px; }
  .visor-anterior, .visor-siguiente{ width:44px; height:44px; font-size:28px; }
  .visor-cerrar{ width:40px; height:40px; top:10px; right:10px; }
}

/* ============================================================
   EN EL MÓVIL
   ------------------------------------------------------------
   Toda la app usa **dos** puntos de corte generales:

     760 px  el móvil, incluido apaisado
     400 px  el móvil estrecho de verdad (iPhone SE y parecidos)

   Tener tres o cuatro cortes distintos —760 aquí, 720 allá— es lo
   que hace que en un ancho raro se apliquen la mitad de las reglas
   y la otra mitad no, y que la pantalla quede a medio arreglar sin
   que se entienda por qué.

   Hay dos cortes más, y los dos son para pantallas intermedias, no
   para móviles: **900 px** es la tableta, donde la ficha y la
   contabilidad pasan a una columna aunque todavía sobre ancho para
   lo demás; y **820 px** es la pantalla de entrar, que va a dos
   columnas y se queda estrecha antes que el resto.

   Y tres reglas al mirar cada componente:
   Todo lo que se añadió al proyecto en un día largo se diseñó
   mirando una pantalla ancha. Aquí se repasa componente por
   componente con tres reglas:

     1. **Nada se sale de ancho.** Una tabla que desborda hace
        que la página entera se mueva de lado, y entonces no se
        puede leer nada.
     2. **Lo que se toca, se toca con el pulgar.** 44 px de alto
        mínimo, que es lo que ocupa un dedo.
     3. **Una columna.** Dos columnas de 160 px no son dos
        columnas: son dos columnas ilegibles.
   ============================================================ */
@media (max-width:760px){

  /* --- El panel de control ------------------------------------
     Aquí estaba el desbordamiento más gordo de toda la app: tres
     `.stat` con `min-width:104px`, sus huecos y el padding del hero
     sumaban unos 412 px de ancho mínimo. Un iPhone SE tiene 375, así
     que el panel —lo primero que se ve al entrar— empujaba la página
     de lado. Se quitan los mínimos y se reparte a tres columnas
     iguales, que es lo que de verdad cabe. */
  .hero{ padding:24px 20px; border-radius:16px; gap:20px; }
  .hero h1{ font-size:25px; }
  .hero-sub{ font-size:14px; }
  /* El rombo decorativo de fondo, más pequeño: a 190 px se comía el
     hero entero en pantalla estrecha. */
  .hero::after{ font-size:120px; right:-20px; top:-16px; }

  .stat-row{ display:grid; grid-template-columns:repeat(3,1fr); gap:8px; width:100%; }
  .stat{ min-width:0; padding:12px 6px; border-radius:11px; }
  .stat-num{ font-size:22px; overflow-wrap:anywhere; }
  .stat-label{ font-size:10px; letter-spacing:.04em; margin-top:4px; }

  .panel-novedades{ grid-template-columns:1fr; gap:8px; }
  .nov{ padding:12px 14px; }
  .nov-num{ font-size:22px; }

  /* «Lo tuyo» y «Te falta votar»: el icono grande al lado del texto
     robaba ancho, y la fecha de la derecha empujaba los títulos. */
  .aviso-pendiente{ gap:12px; padding:16px 16px; }
  .ap-icono{ font-size:24px; }
  .ap-lista li{ flex-wrap:wrap; gap:2px 10px; }
  .ap-precio{ font-size:12.5px; }

  .module-grid{ grid-template-columns:1fr; gap:14px; }
  .module-card{ padding:20px 18px 18px; }
  .module-icon{ font-size:28px; margin-bottom:8px; }
  .section-title{ margin:26px 0 12px; font-size:20px; }

  /* --- Cabeceras y acciones --- */
  .header-row{ flex-direction:column; align-items:stretch; gap:14px; }
  .acciones-cabecera{ display:grid; grid-template-columns:1fr 1fr; gap:8px; }
  .acciones-cabecera > *{ text-align:center; }
  .acciones-cabecera .btn:first-child{ grid-column:1 / -1; }

  /* --- Filtros del inventario. Nueve controles no caben en una tira
         horizontal: se apilan en dos columnas y los rangos ocupan fila. --- */
  .barra-filtros-avanzada{ grid-template-columns:1fr 1fr; gap:10px; padding:14px; }
  .filtro-ancho, .filtro-rango, .filtros-acciones{ grid-column:1 / -1; }
  .filtros-acciones{ display:grid; grid-template-columns:1fr; }
  .filtros-acciones > *{ text-align:center; }

  /* --- Elegir entre opciones con explicación (base de reparto, tema) --- */
  .elegir-tema, .elegir-piezas{ grid-template-columns:1fr; }
  .opcion-base, .opcion-tema, .pieza-elegible{ padding:14px; }

  /* --- Lotes --- */
  .rejilla-lotes{ grid-template-columns:1fr; }
  .caja-numeros{ grid-template-columns:1fr 1fr; gap:10px; }
  .caja-numeros strong{ font-size:18px; }
  .celda-numero{ width:78px; }

  /* --- El color medido --- */
  .color-cabecera{ gap:14px; }
  .color-muestra{ width:72px; height:72px; }
  .color-lch{ grid-template-columns:1fr 1fr; gap:10px; }
  .ct-muestras, .color-puntos{ gap:5px; }
  .soltar-lista{ grid-template-columns:1fr; }

  /* --- Las tres líneas de opinión de la ficha. Se leen mucho y en
         pantalla estrecha ganan aire; el detalle de abajo, más pequeño. --- */
  .linea-mercado, .linea-tasacion, .linea-comparacion, .linea-factor,
  .linea-porct, .linea-beneficio{ padding:12px 13px; font-size:13.5px; }
  .linea-mercado small, .linea-tasacion small, .linea-comparacion small{
    font-size:12px; line-height:1.65; }

  /* --- La calculadora --- */
  .resultado-tasacion{ grid-template-columns:1fr; gap:10px; }
  .elegir-color input[type=color]{ width:56px; height:44px; }

  /* --- Tareas. Las acciones bajan a su propia fila, a lo ancho. --- */
  .apuntar-linea{ flex-direction:column; }
  .apuntar-linea .btn{ width:100%; }
  .lista-tareas{ gap:8px; }
  .tarea{ padding:12px 13px; gap:11px; }
  .t-casilla{ width:40px; height:40px; font-size:18px; }
  .t-acciones{ padding-left:51px; gap:8px; }

  /* --- Papelera --- */
  .pf-foto{ width:54px; height:54px; }

  /* --- Paginación: los dos botones a lo ancho y la cuenta debajo. --- */
  .paginacion{ display:grid; grid-template-columns:1fr 1fr; gap:10px; }
  .paginacion .btn-ghost, .paginacion .desactivado{ text-align:center; }
  .pg-cuenta{ grid-column:1 / -1; order:-1; }

  /* --- Tablas. Las anchas ya hacen scroll dentro de su caja; se les
         quita el ancho mínimo de escritorio para que quepan más. --- */
  .tabla-scroll .tabla, .tabla-scroll .tabla-cambios{ min-width:520px; }
  .tabla th, .tabla td{ padding:10px 11px; font-size:13px; }

  /* --- Lo que se toca, con el pulgar ---------------------------
     En pantalla ancha se pulsa con un ratón y 32 px sobran. Con el
     dedo no: por debajo de 44 px se falla el clic y se acaba dando
     al de al lado, que en esta app puede ser un «Borrar». Se suben
     todos los botones pequeños solo en móvil, sin engordarlos en
     escritorio, donde estaban bien. */
  .mini, .btn-mini, .reaccion, .accion, .copiar-codigo,
  .t-acciones select, .ct-quitar{ min-height:44px; }
  .mini, .btn-mini{ padding:10px 14px; font-size:12.5px; }
  .t-casilla{ width:44px; height:44px; }
  .medio-acciones{ gap:8px; padding:10px; }
  .medio-acciones form{ flex:1; }
  .medio-acciones .mini{ width:100%; }
  .ct-quitar{ padding:0 10px; }
  .mas-filtros > summary, .apuntar-mas > summary,
  .nota-privada > summary{ min-height:44px; }

  /* --- Que nada se salga, pase lo que pase. Es la red de seguridad:
         una palabra larga o un código sin espacios movía la página. --- */
  body{ overflow-x:hidden; }
  code, .celda-piezas a, .color-origen{ overflow-wrap:anywhere; }
}

/* Móvil estrecho de verdad (iPhone SE y compañía). */
@media (max-width:400px){
  .acciones-cabecera{ grid-template-columns:1fr; }
  .caja-numeros, .barra-filtros-avanzada, .color-lch{ grid-template-columns:1fr; }
  .paginacion{ grid-template-columns:1fr; }
  /* Tres cifras en 340 px se leen apretadas; mejor dos arriba y una
     abajo, que la de en medio es «Coste total» y puede ser larga. */
  .stat-row{ grid-template-columns:1fr 1fr; }
  .stat:last-child{ grid-column:1 / -1; }
  .hero{ padding:20px 16px; }
  .hero h1{ font-size:23px; }
}

/* --- La tarjeta gris del cuentagotas (X-05) ------------------------------
   Mientras se está marcando, el botón se enciende para que quede claro que el
   siguiente clic va a la tarjeta y no a la piedra. */
.ct-gris{ margin-top:.4rem; }
.ct-gris.marcando{
  background:var(--burg-fondo); color:var(--sobre-burg); border-color:var(--burg-fondo);
}
.ct-muestras .ct-es-gris{ border-top:1px dashed var(--line); padding-top:.35rem;
  color:var(--muted); font-style:italic; }
.ct-etiqueta-calibrada{
  display:inline-flex; align-items:center; gap:.3rem;
  font-size:.78rem; padding:.1rem .45rem; border-radius:999px;
  background:var(--ok-chip); color:var(--ok); border:1px solid var(--ok-borde);
}

/* --- Las dos luces: cambio de color (X-06) -------------------------------
   Las dos lecturas van juntas y con una flecha entre medias a propósito: por
   separado son dos colores cualesquiera, y lo que vale es el salto. */
.dos-luces{
  margin:.9rem 0; padding:.8rem .9rem; border-radius:var(--radius);
  background:var(--superficie); border:1px solid var(--line);
}
.dos-luces h4{ margin:0 0 .6rem; font-size:.9rem; color:var(--muted);
  text-transform:uppercase; letter-spacing:.04em; }
.dos-luces.no-fiable{ background:var(--aviso-panel); border-color:var(--aviso-borde); }
.dl-parejas{ display:flex; align-items:center; gap:.9rem; flex-wrap:wrap; }
.dl-lectura{ display:grid; grid-template-columns:auto 1fr; gap:0 .5rem;
  align-items:center; }
.dl-tinta{ grid-row:1 / span 3; width:44px; height:44px; border-radius:10px;
  border:1px solid var(--line); }
.dl-luz{ font-weight:600; font-size:.85rem; }
.dl-hex{ font-family:ui-monospace, Menlo, Consolas, monospace; font-size:.8rem;
  color:var(--muted); }
.dl-voc{ font-size:.8rem; color:var(--muted); }
.dl-flecha{ font-size:1.4rem; color:var(--muted); }
.dl-veredicto{ margin:.7rem 0 .4rem; font-size:.9rem; line-height:1.5; }
.dl-veredicto p{ margin:0; }
.ct-lectura{ display:flex; gap:.5rem; align-items:flex-start; margin:.6rem 0;
  font-size:.85rem; line-height:1.45; color:var(--muted); }

@media (max-width:400px){
  /* En pantalla estrecha la flecha se pone de pie: dos lecturas apiladas con
     una flecha hacia el lado no se leen como un antes y un después. */
  .dl-parejas{ flex-direction:column; align-items:flex-start; gap:.5rem; }
  .dl-flecha{ transform:rotate(90deg); align-self:center; }
}

/* --- Tareas que nacen solas (G-05) --------------------------------------
   Se marcan para que nadie se pregunte quién las escribió. */
.t-automatica{
  display:inline-block; margin-left:.4rem; padding:.05rem .4rem;
  border-radius:999px; font-size:.72rem; font-weight:600; vertical-align:middle;
  background:var(--chip-fondo); color:var(--muted); cursor:help;
}

/* --- Acciones en lote en el inventario (C-07) ---------------------------- */
.bl-encender{ margin:.2rem 0 .8rem; font-size:.88rem; color:var(--muted); }
.bl-encender label{ display:inline-flex; align-items:center; gap:.45rem; cursor:pointer; }

.barra-lote{
  position:sticky; top:.5rem; z-index:20;
  display:flex; align-items:flex-end; gap:.7rem; flex-wrap:wrap;
  margin-bottom:.9rem; padding:.7rem .9rem; border-radius:var(--radius);
  background:var(--card); border:1px solid var(--burg);
  box-shadow:var(--shadow);
}
.bl-cuenta{ font-size:.9rem; color:var(--muted); white-space:nowrap; }
.bl-cuenta strong{ color:var(--burg); font-size:1.1rem; }
.bl-campo{ display:flex; flex-direction:column; gap:.2rem;
  font-size:.78rem; color:var(--muted); }
.bl-campo select, .bl-campo input{ min-width:11rem; }
.bl-valores{ display:contents; }
.bl-aviso{ font-size:.8rem; color:var(--aviso-tinta); padding-bottom:.55rem; }

/* La casilla de cada tarjeta va por encima de la foto, no dentro del enlace:
   una casilla dentro de un <a> te lleva a la ficha en vez de marcarla. */
.tp-envoltura{ position:relative; }
.tp-marca{
  position:absolute; top:.5rem; left:.5rem; z-index:2;
  display:grid; place-items:center; width:30px; height:30px;
  border-radius:8px; background:var(--card); border:1px solid var(--line);
  box-shadow:var(--shadow-sm); cursor:pointer;
}
.tp-envoltura:has([data-marca]:checked) .tarjeta-pieza{
  outline:2px solid var(--burg); outline-offset:2px;
}

@media (max-width:760px){
  .barra-lote{ position:static; }
  .bl-campo select, .bl-campo input{ min-width:0; width:100%; }
  .bl-campo{ flex:1 1 100%; }
}

/* --- Galería ordenable (C-06) -------------------------------------------- */
.galeria-form .medio{ position:relative; }
.medio-agarre{
  position:absolute; top:.35rem; left:.35rem; z-index:2;
  padding:.1rem .35rem; border-radius:6px; cursor:grab;
  background:var(--card); border:1px solid var(--line); color:var(--muted);
  font-size:.95rem; line-height:1.2; box-shadow:var(--shadow-sm);
}
.galeria-form .medio.se-arrastra{ opacity:.4; }
.medio-marca{ display:inline-grid; place-items:center; }
.medio-orden input{ width:3.4rem; padding:.15rem .3rem; text-align:center; }
/* Con arrastre, teclear la posición sobra. */
.se-puede-arrastrar .medio-orden{ display:none; }
.galeria-botones{
  display:flex; align-items:center; gap:.6rem; flex-wrap:wrap; margin-top:.7rem;
}
.galeria-ayuda{ font-size:.82rem; color:var(--muted); }
/* Las dos explicaciones existen a la vez y se turnan según lo que de verdad se
   pueda hacer: arrastrar o teclear. Si se turnaran desde JavaScript, girar el
   móvil dejaría el texto diciendo lo que no es. */
.se-puede-arrastrar .galeria-ayuda[data-ayuda-numeros]{ display:none; }

@media (max-width:760px){
  /* Arrastrar con el dedo pelea con el desplazamiento de la página, así que en
     el móvil manda el número: se teclea la posición y ya. */
  .se-puede-arrastrar .medio-orden{ display:block; }
  .medio-agarre{ display:none; }
  .se-puede-arrastrar .galeria-ayuda[data-ayuda-numeros]{ display:inline; }
  .se-puede-arrastrar .galeria-ayuda[data-ayuda-arrastrar]{ display:none; }
}

/* --- Cuadrícula o tabla (V-07) --------------------------------------------
   La cuadrícula enseña las piedras; la tabla las compara. El selector va en la
   barra de filtros, al lado de «Ordenar por», porque es lo mismo: decidir cómo
   se está mirando la lista. */
.selector-vista{
  display:inline-flex; margin-bottom:1px; border:1px solid var(--line);
  border-radius:10px; overflow:hidden; background:var(--card);
}
.sv-opcion{
  padding:.55rem .95rem; font-size:12.5px; font-weight:600; color:var(--muted);
  text-decoration:none; background:var(--card); transition:.15s;
  min-height:44px; display:inline-flex; align-items:center;
}
.sv-opcion + .sv-opcion{ border-left:1px solid var(--line); }
.sv-opcion:hover{ background:var(--superficie-2); color:var(--ink); }
.sv-opcion.active{ background:var(--burg-fondo); color:var(--sobre-burg); }

/* La tabla del inventario. Hereda de `.tabla`; lo de aquí es lo que la hace
   comparable: las cifras a la derecha y con la misma anchura de dígito, para
   poder recorrer una columna hacia abajo sin leer número por número. */
/* Filas apretadas: la tabla existe para que quepan muchas piezas a la vez, y
   con el relleno normal de `.tabla` cada una ocupaba casi cien píxeles — o sea,
   siete por pantalla, que es lo mismo que ya daba la cuadrícula. */
.tabla-inventario{ min-width:720px; }
.tabla-inventario td{ padding:7px 14px; }
.tabla-inventario th a{
  color:inherit; text-decoration:none; display:inline-flex; gap:.3rem;
  align-items:center; white-space:nowrap;
}
.tabla-inventario th a:hover{ color:var(--gold-soft); }
.tabla-inventario th.ti-num, .tabla-inventario td.ti-num{
  text-align:right; font-variant-numeric:tabular-nums;
}
.tabla-inventario th.ti-num a{ justify-content:flex-end; }
/* La columna por la que se está ordenando, marcada: en una tabla de ocho
   columnas, la flechita sola se pierde. */
.tabla-inventario th.ti-ordenada{ background:var(--burg-fondo-2); }
.ti-flecha{ color:var(--gold-soft); font-size:11px; }

.ti-marca-col{ width:2.6rem; text-align:center; }
/* `grid` y no `inline-grid`: en línea, la casilla se apoya en la línea base y
   arrastra consigo el hueco del descendente, que inflaba cada fila 29 px sin
   que nada lo pidiera. En el móvil vuelve a los 44 px, que es lo que ocupa un
   dedo; en un ratón sobra y lo que se quiere es que quepan piezas. */
/* El `margin:0` no es adorno: un `<label>` hereda los 14 px de arriba y abajo
   de la regla general de los formularios, y eso solo —28 px por fila— era lo
   que hacía que la tabla no fuera más compacta que la cuadrícula. */
.ti-marca{ display:grid; place-items:center; min-height:30px; margin:0;
  cursor:pointer; }

.ti-pieza{ display:flex; align-items:center; gap:.65rem; text-decoration:none;
  color:var(--ink); }
.ti-mini{
  flex:0 0 auto; width:34px; height:34px; border-radius:7px; overflow:hidden;
  background:var(--superficie-3); display:grid; place-items:center;
  color:var(--gold); font-size:15px;
}
.ti-mini img{ width:100%; height:100%; object-fit:cover; display:block; }
.ti-nombre strong{ display:block; font-weight:600; }
.ti-nombre small{ display:block; font-size:12px; color:var(--muted); }
.ti-pieza:hover .ti-nombre strong{ color:var(--burg); text-decoration:underline; }

.ti-color-celda{ white-space:nowrap; }
/* El mismo dato que el filete de la tarjeta, en redondo: el color medido de
   verdad, no el nombre que alguien escribió a mano. */
.ti-color{
  display:inline-block; width:16px; height:16px; border-radius:50%;
  border:1px solid var(--line); vertical-align:-3px; margin-right:.4rem;
}
.ti-color-txt{ font-size:12.5px; color:var(--muted); }
.ti-vacio{ color:var(--muted); }

@media (max-width:760px){
  /* En un móvil la tabla ya se desplaza de lado dentro de `.tabla-scroll`,
     pero hay dos columnas que no aportan nada apretadas: el nombre del matiz
     (queda el círculo, que es el dato) y la miniatura. */
  .ti-color-txt{ display:none; }
  .ti-mini{ width:30px; height:30px; }
  .ti-marca{ min-width:44px; min-height:44px; }
  .selector-vista{ flex:1 1 100%; }
  .sv-opcion{ flex:1; justify-content:center; }
  .tabla-inventario{ min-width:560px; }
}

/* --- Los iconos (V-03) -----------------------------------------------------
   Dibujos propios en vez de emoji. Los emoji los pinta cada sistema a su
   manera —tres urnas distintas en un iPhone, un Android y un Windows— y
   ninguna de las tres pega con el borgoña y el dorado.

   Se dimensionan en `em`, así que **heredan el tamaño de donde estén**: el
   mismo dibujo vale a 16 px en el menú y a 39 px en una tarjeta del panel sin
   una sola regla más. Y el color lo pone `currentColor`.

   `vector-effect:non-scaling-stroke` es lo que hace que el trazo no engorde al
   crecer el icono: sin él, el de una tarjeta saldría tres veces más gordo que
   el del menú y parecerían de dos juegos distintos. */
.hoja-iconos{ position:absolute; width:0; height:0; overflow:hidden; }
.icono{
  width:1.15em; height:1.15em; display:inline-block; vertical-align:-.19em;
  flex:0 0 auto; fill:none; stroke:currentColor; stroke-width:1.6;
  stroke-linecap:round; stroke-linejoin:round;
}
.icono path, .icono circle{ vector-effect:non-scaling-stroke; }

/* La lupa del buscador vivía como emoji con su propio color; ahora lo hereda
   del botón, que dentro de la barra borgoña no tenía ninguno. */
.buscador button{ color:var(--gold-soft); }
.buscador button:hover{ color:#fff; }

/* Ojo con tocar `display` de los huecos donde va un icono (`.nav-icono` y
   compañía): `.nav-icono` se apaga en escritorio y se enciende en el corte de
   1240 px, y una regla de aquí abajo se los comería a los dos por ir después.
   El icono es `inline-block`, que ya se centra solo en todos ellos. */

/* --- Las reglas de la sociedad (F-02) --------------------------------------
   Con qué se aprueba algo aquí sale del contrato de copropiedad, y la app
   tiene que **decirlo** en la propia votación: sin esa línea, dos socios miran
   el mismo marcador y entienden cosas distintas sobre si está decidido. */
.regla-voto{
  border:1px solid var(--line); border-left:3px solid var(--gold);
  border-radius:10px; padding:.7rem .9rem; margin:0 0 1.1rem;
  background:var(--superficie);
}
.rv-linea{ margin:0 0 .25rem; display:flex; gap:.55rem; align-items:baseline;
  flex-wrap:wrap; }
.rv-regla{ font-size:.82rem; color:var(--muted); }
.rv-cuenta{ margin:0; font-size:.88rem; }
/* Las que exigen unanimidad se marcan aparte: son cinco materias del contrato
   en las que el voto de calidad no vale, y confundirlas con una compra
   cualquiera es el error caro. */
.regla-voto.regla-unanimidad{ border-left-color:var(--burg); }
/* Sin quórum no es un aviso de error: es información. Pero tiene que verse,
   porque es justo lo que la gente da por hecho que no pasa. Va después del
   filete de unanimidad porque una votación lleva las dos clases a la vez y de
   las dos señales ésta es la urgente. */
.regla-voto.sin-quorum{
  border-left-color:var(--aviso-tinta); background:var(--aviso-panel);
}

/* Elegir una regla, o el régimen de una votación: cada opción con su porqué
   al lado. Es el mismo patrón que el selector de tema, y por lo mismo: nadie
   elige bien entre cuatro palabras sueltas. */
.elegir-regla, .elegir-regimen{ display:grid; gap:.6rem; }
.opcion-regla, .opcion-regimen{
  display:flex; gap:.7rem; align-items:flex-start; cursor:pointer;
  border:1px solid var(--line); border-radius:10px; padding:.75rem .9rem;
  background:var(--campo); transition:.15s; margin:0;
}
.opcion-regla:hover, .opcion-regimen:hover{ border-color:var(--gold); }
.opcion-regla.elegida, .opcion-regimen.elegida{
  border-color:var(--burg); background:var(--oro-panel);
}
.opcion-regla input, .opcion-regimen input{ margin-top:.25rem; }
.opcion-regla small, .opcion-regimen small{
  display:block; color:var(--muted); font-size:.83rem; margin-top:.15rem;
  font-weight:400;                  /* el <label> va en negrita y lo heredaba */
}
.opcion-regla .chip{ margin-left:.45rem; font-size:11px; }

.bloque-regla h3{ margin-top:0; }
.aviso-contrato{ border-left:3px solid var(--gold); }
.aviso-contrato p{ margin:.4rem 0; }
/* La regla dice «desempata el voto de calidad» y no lo tiene nadie: eso no es
   un empate, es una regla que no se puede aplicar. */
.aviso-roto{ border-left:3px solid var(--peligro-tinta); }
.aviso-roto h3{ margin-top:0; color:var(--peligro-tinta); }
.aviso-efecto{ border-left:3px solid var(--aviso-tinta); }
.aviso-efecto h3{ margin-top:0; }

@media (max-width:760px){
  .rv-linea{ gap:.3rem; }
  .opcion-regla, .opcion-regimen{ padding:.9rem; }
  .elegir-regla, .elegir-regimen{ gap:.5rem; }
}

/* --- El camino a la Fase 2 (F-16) ------------------------------------------
   Cruzar los 5.000 € de patrimonio obliga por contrato a constituir una
   sociedad mercantil. La app sabe ese número, así que lo enseña siempre en la
   contabilidad y lo saca al panel solo cuando ya conviene hablarlo. */
.fase2{
  background:var(--card); border:1px solid var(--line);
  border-left:3px solid var(--gold); border-radius:var(--radius);
  padding:1rem 1.15rem; margin:0 0 1.4rem; box-shadow:var(--shadow-sm);
}
.f2-cabecera{ display:flex; justify-content:space-between; align-items:baseline;
  gap:.8rem; flex-wrap:wrap; }
.f2-cabecera h3{ margin:0; font-size:1.05rem; }
.f2-cifra{ font-weight:600; font-variant-numeric:tabular-nums; }
.f2-cifra small{ color:var(--muted); font-weight:400; }
.f2-barra{ height:9px; border-radius:6px; background:var(--barra);
  overflow:hidden; margin:.7rem 0 .6rem; }
.f2-barra i{ display:block; height:100%; border-radius:6px;
  background:linear-gradient(90deg,var(--gold),var(--burg)); }
.f2-texto{ margin:0; font-size:.9rem; }
.f2-desglose{ margin:.45rem 0 0; font-size:.82rem; color:var(--muted); }
/* Que el equipo no esté contado todavía hay que decirlo: si no, el número
   parece completo y el aviso llegaría tarde por defecto. */
.f2-ojo{ display:block; margin-top:.2rem; font-style:italic; }

.fase2-cerca{ border-left-color:var(--aviso-tinta); background:var(--aviso-panel); }
.fase2-pasada{ border-left-color:var(--burg); background:var(--oro-panel); }
.fase2-pasada .f2-barra i{ background:var(--burg); }

/* El aviso del panel cuando ya se ha pasado: el mismo bloque de siempre, pero
   sin que se confunda con «tienes tres tareas». */
.aviso-pendiente.ap-urgente{ border-color:var(--burg); }

@media (max-width:760px){
  .f2-cabecera{ gap:.2rem; }
  .fase2{ padding:.9rem; }
}

/* El plazo de una votación (F-01), dentro del cartel de la regla: con qué se
   cuenta y hasta cuándo son la misma pregunta. */
.rv-plazo{ margin:.25rem 0 0; font-size:.86rem; color:var(--muted); }
.rv-plazo.rv-urge{ color:var(--aviso-tinta); }

/* --- Las cuotas mensuales (F-15) -------------------------------------------
   El contrato convierte tres impagos en causa de exclusión de un comunero, así
   que esta rejilla no es una comodidad contable: es lo que separa «se le pasó
   agosto» de un procedimiento contra un familiar. Los colores son suaves a
   propósito — informan, no acusan. */
.tabla-cuotas{ min-width:520px; }
/* La columna de los meses es cabecera, pero de segunda: con el borgoña de la
   fila de arriba compite con ella y el ojo no sabe dónde empieza la tabla. */
.tabla-cuotas th[scope=row]{
  text-align:left; font-weight:600; white-space:nowrap; text-transform:none;
  letter-spacing:0; font-size:14px; background:var(--superficie);
  color:var(--ink); border-top:1px solid var(--line);
}
.celda-cuota{ font-variant-numeric:tabular-nums; }
.cc-ok{ background:var(--ok-panel); color:var(--ok); font-weight:600; }
.cc-parcial{ background:var(--oro-panel); color:var(--oro-tinta); font-weight:600; }
.cc-falta{ background:var(--aviso-panel); color:var(--aviso-tinta); }
/* El mes en curso, mientras no se pase el día límite, no se juzga: marcarlo en
   rojo el día 2 sería marcar a quien va bien. */
.cuota-en-curso th[scope=row] .chip{ margin-left:.4rem; font-size:10.5px; }

.aviso-cuota{ border-left:3px solid var(--aviso-tinta); }
.aviso-cuota h3{ margin-top:0; }
.aviso-al-dia{ border-left:3px solid var(--ok); }
.aviso-al-dia h3{ margin-top:0; color:var(--ok); }

/* Los números del contrato, en Ajustes: en varias columnas si caben. */
.reglas-numeros{ display:grid; gap:1rem;
  grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); }

@media (max-width:760px){
  .tabla-cuotas{ min-width:440px; }
  .reglas-numeros{ grid-template-columns:1fr; }
}

/* El enlace al acta (F-03). Discreto pero con su explicación: «acta» no le
   dice a todo el mundo lo mismo, y conviene decir qué lleva dentro. */
.acta-enlace{ display:flex; align-items:center; gap:.7rem; flex-wrap:wrap;
  margin:1rem 0 0; }
.acta-enlace small{ color:var(--muted); font-size:.83rem; }

/* --- Registro de custodia (F-06) -------------------------------------------
   El contrato no contrata seguro y reparte el riesgo entre los cuatro, así que
   saber qué está fuera, con quién y desde cuándo es el único registro que hay
   si algo se pierde. Por eso lo que está fuera se marca, y no discretamente. */
.seccion-custodia h3{ margin-top:0; }
.custodia-ahora{ margin:0 0 .9rem; font-size:.95rem; }
.custodia-ahora.fuera{
  border-left:3px solid var(--aviso-tinta); background:var(--aviso-panel);
  padding:.6rem .8rem; border-radius:8px;
}
.cu-motivo{ color:var(--muted); font-style:italic; }
.cu-titulo{ margin:1.2rem 0 .5rem; font-size:.95rem; }
.cu-historial{ list-style:none; margin:0; padding:0; display:grid; gap:.4rem; }
.cu-historial li{
  display:flex; gap:.65rem; align-items:baseline; flex-wrap:wrap;
  font-size:.88rem; padding:.4rem .6rem; border-radius:8px;
  background:var(--superficie);
}
.cu-historial li.cu-abierta{ background:var(--aviso-panel); }
.cu-fechas{ color:var(--muted); font-variant-numeric:tabular-nums; white-space:nowrap; }
.cu-donde{ font-weight:600; }
.cu-quien{ color:var(--burg); }
.cu-historial small{ color:var(--muted); }
/* Una piedra que lleva tres meses en un laboratorio suele ser un olvido. */
.cu-tarda{ color:var(--aviso-tinta); font-weight:600; }

@media (max-width:760px){
  .cu-historial li{ gap:.3rem; }
  .seccion-custodia .form-linea .campo{ flex:1 1 100%; }
}

/* --- La mira del cuentagotas (X-01, rehecha para el móvil) -----------------
   Antes se tomaba el punto pinchando en la foto. Con un ratón iba bien; con un
   dedo, no: **el dedo tapa justo el sitio donde quieres poner el punto**, así
   que se apuntaba a ciegas. Y una muestra mal puesta no se nota, porque sale
   un color creíble y falso.

   Ahora se arrastra una mira y el punto se queda donde está ella, no donde
   está el dedo. La lupa enseña ampliado lo que hay debajo. */
.ct-mira{
  position:absolute; z-index:6; width:46px; height:46px;
  margin:-23px 0 0 -23px;          /* centrada en su punto */
  border-radius:50%; cursor:grab;
  touch-action:none;               /* arrastrar no debe mover la página */
  display:grid; place-items:center;
  background:rgba(255,255,255,.06);
  box-shadow:0 0 0 1px rgba(0,0,0,.45), 0 0 0 2px rgba(255,255,255,.75);
}
.ct-mira.agarrada{ cursor:grabbing; box-shadow:0 0 0 1px rgba(0,0,0,.5),
  0 0 0 3px var(--gold); }
.ct-mira:focus-visible{ outline:3px solid var(--gold); outline-offset:3px; }
/* Las dos líneas finas que marcan el punto exacto. El hueco del centro deja
   ver el píxel que se va a tomar. */
.ct-cruz{ position:absolute; inset:0; }
.ct-cruz::before, .ct-cruz::after{
  content:""; position:absolute; background:rgba(255,255,255,.9);
  box-shadow:0 0 2px rgba(0,0,0,.8);
}
.ct-cruz::before{ left:50%; top:2px; bottom:2px; width:1px; margin-left:-.5px; }
.ct-cruz::after{ top:50%; left:2px; right:2px; height:1px; margin-top:-.5px; }
/* El color que se va a tomar, en el centro de la mira: se ve antes de tomarlo. */
.ct-tinta-mira{
  width:14px; height:14px; border-radius:50%;
  box-shadow:0 0 0 2px rgba(255,255,255,.9), 0 0 0 3px rgba(0,0,0,.45);
}

.ct-lupa{
  position:absolute; z-index:7; width:96px; height:96px;
  margin:-84px 0 0 -48px;          /* encima de la mira, sin taparla */
  border-radius:12px; pointer-events:none;
  background:var(--superficie-3);
  box-shadow:0 0 0 2px rgba(255,255,255,.85), 0 6px 18px rgba(0,0,0,.45);
}
/* Cuando la mira está pegada al borde de arriba, la lupa se va debajo: si no,
   medir el borde superior de la piedra sería medir a ciegas otra vez. */
.ct-lupa.abajo{ margin-top:36px; }

.ct-anadir{ display:flex; align-items:center; gap:.6rem; margin-top:.5rem; }
.ct-hex{ font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:.85em;
  opacity:.85; }

@media (max-width:760px){
  /* Con el dedo, la mira se agarra peor: se hace más grande sin mover la cruz,
     que es lo que de verdad apunta. */
  .ct-mira{ width:56px; height:56px; margin:-28px 0 0 -28px; }
  .ct-lupa{ width:110px; height:110px; margin:-100px 0 0 -55px; }
  .ct-lupa.abajo{ margin-top:42px; }
  .ct-anadir{ width:100%; justify-content:center; }
}

/* --- La contabilidad por ejercicio (F-10) ----------------------------------
   El filtro solo toca los apuntes: la mitad de arriba de la hoja es una foto
   de ahora, no de un año. Por eso el selector va aquí abajo y no en la
   cabecera de la página. */
.barra-ejercicio{ margin:0 0 1rem; }
.ej-candado{ font-size:10px; text-transform:uppercase; letter-spacing:.06em;
  opacity:.75; margin-left:.3rem; }
.resumen-ejercicio{ margin-bottom:1rem; }
.cierre-ejercicio{
  border:1px solid var(--line); border-left:3px solid var(--gold);
  border-radius:var(--radius); padding:.9rem 1.1rem; margin:0 0 1.4rem;
  background:var(--superficie);
}
.cierre-ejercicio p{ margin:0 0 .7rem; font-size:.9rem; }
.cierre-ejercicio.esta-cerrado{ border-left-color:var(--burg); background:var(--oro-panel); }

@media (max-width:760px){
  .cierre-ejercicio{ padding:.8rem; }
  .cierre-ejercicio .form-linea .campo{ flex:1 1 100%; }
}

/* --- Traer una pieza a la calculadora -------------------------------------
   La calculadora nació para piedras que no son tuyas. Traer una del inventario
   contesta la otra mitad de la pregunta —«¿pagamos bien por ésta?»— sin volver
   a teclear siete campos que ya están guardados. */
.traer-pieza{ display:flex; align-items:flex-end; gap:.9rem; flex-wrap:wrap; }
.traer-pieza .campo{ flex:1 1 260px; margin:0; }
.traer-pieza .sub{ flex:1 1 100%; margin:.2rem 0 0; }
.viene-de{ margin:0 0 1rem; font-size:.9rem; color:var(--muted); }
.viene-de a{ color:var(--burg); }
/* Lo que costó, cuando se aleja mucho de la cuenta. */
.resultado-tasacion .rt-llamativo strong{ color:var(--aviso-tinta); }

@media (max-width:760px){
  .traer-pieza{ gap:.6rem; }
  .traer-pieza .campo, .traer-pieza .btn-ghost{ flex:1 1 100%; }
}

/* --- El IRPF de cada comunero (F-09) ---------------------------------------
   Lo primero de la página es que **esto es una estimación**: el IRPF de cada
   uno depende del resto de su base del ahorro, que la app no conoce. Sin
   decirlo bien alto, el número parecería una declaración. */
.aviso-estimacion{ border-left:3px solid var(--aviso-tinta);
  background:var(--aviso-panel); }
.aviso-estimacion h3{ margin-top:0; }
.aviso-estimacion p{ margin:0; }
.enlace-irpf{ display:flex; align-items:center; gap:.8rem; flex-wrap:wrap;
  margin:0 0 1.4rem; }
.enlace-irpf small{ color:var(--muted); font-size:.83rem; flex:1 1 260px; }

/* Los tramos, en Ajustes: una tabla pequeña de «hasta X € al Y %». */
.tramos-irpf{ display:grid; gap:.55rem; margin:.7rem 0 .5rem; }
.tramo{ display:flex; align-items:center; gap:.55rem; flex-wrap:wrap; }
.tramo .con-unidad{ flex:0 1 170px; }
.tramo-al{ color:var(--muted); font-size:.85rem; }

@media (max-width:760px){
  .tramos-irpf{ gap:.75rem; }
  .tramo .con-unidad{ flex:1 1 40%; }
  .enlace-irpf .btn-ghost{ width:100%; }
}

/* --- Menciones (G-04) ------------------------------------------------------
   `@Ana` en un texto. Se resalta **solo** cuando ese nombre es alguien: pintar
   un `@gmail` como si fuera una mención haría que la gente dejara de fiarse de
   las de verdad. */
.mencion{
  color:var(--burg); font-weight:600; background:var(--oro-panel);
  padding:.05em .3em; border-radius:5px;
}
.ayuda-mencion{ color:var(--muted); font-size:.82rem; }

@media (max-width:760px){
  .ayuda-mencion{ display:block; margin-top:.3rem; }
}

/* --- El precio final de una compra ------------------------------------------
   Una compra se vota con estimaciones y se apunta con estimaciones, porque es
   lo único que hay. Cuando llega la factura hay que poder corregirlo **sin
   bucear en una ficha de sesenta campos**, y que el apunte de contabilidad
   vaya detrás solo. */
.precio-final h3{ margin-top:0; }
.pf-comparacion{ margin:0 0 .9rem; font-size:.95rem; }
.pf-mas{ color:var(--aviso-tinta); font-weight:600; }
.pf-menos{ color:var(--ok); font-weight:600; }
.precio-final .form-linea .sub{ flex:1 1 100%; margin:.3rem 0 0; }

@media (max-width:760px){
  .precio-final .form-linea .campo{ flex:1 1 100%; }
}

/* --- La ficha en papel (V-10) ----------------------------------------------
   Existe como página aparte y no como un `@media print` de la ficha normal
   porque en un papel manda otra cosa: la foto grande, los datos que
   identifican la piedra y el QR que devuelve a la ficha. El historial, la
   discusión y el cuentagotas sobran.

   Se ve en pantalla como se va a ver en el papel: si hay que imprimir para
   saber cómo queda, nadie la usa. */
.papel-mandos{ display:flex; align-items:center; gap:.7rem; flex-wrap:wrap;
  margin:0 0 1.2rem; }
.papel-aviso{ font-size:.83rem; color:var(--muted); }

.hoja{
  background:#fff; color:#1e1a18; max-width:820px; margin:0 auto;
  padding:2.2rem 2.4rem; border:1px solid var(--line);
  border-radius:var(--radius); box-shadow:var(--shadow);
}
.hoja-cabecera{ display:flex; justify-content:space-between; align-items:flex-start;
  gap:1.5rem; border-bottom:2px solid #6d1a2e; padding-bottom:1rem; }
.hoja-marca{ margin:0; font-size:.72rem; letter-spacing:.09em; text-transform:uppercase;
  color:#8a807a; }
.hoja-cabecera h1{ margin:.2rem 0 .1rem; font-size:1.9rem; color:#6d1a2e; }
.hoja-cabecera h1 small{ display:block; font-family:'Inter',sans-serif; font-size:1rem;
  font-weight:400; color:#5c534e; }
.hoja-referencia{ margin:0; font-size:.8rem; color:#8a807a; font-variant-numeric:tabular-nums; }
.hoja-qr{ text-align:center; flex-shrink:0; }
.hoja-qr svg{ display:block; }
.hoja-qr small{ display:block; margin-top:.3rem; font-size:.62rem; color:#8a807a;
  max-width:120px; }

.hoja-cuerpo{ display:grid; grid-template-columns:minmax(0,38%) minmax(0,1fr);
  gap:1.6rem; margin-top:1.4rem; }
.hoja-foto img{ width:100%; border-radius:8px; display:block; }
.hoja-color{ display:flex; gap:.6rem; align-items:center; margin-top:.7rem;
  font-size:.85rem; }
.hoja-muestra{ width:34px; height:34px; border-radius:6px; flex-shrink:0;
  border:1px solid rgba(0,0,0,.15); }
.hoja-color small{ display:block; color:#8a807a; font-size:.72rem; }

.hoja-datos section{ break-inside:avoid; margin-bottom:1rem; }
.hoja-datos h2{ font-size:.72rem; letter-spacing:.09em; text-transform:uppercase;
  color:#6d1a2e; margin:0 0 .35rem; border-bottom:1px solid #e6ded6; padding-bottom:.2rem; }
.hoja-datos dl{ display:grid; grid-template-columns:auto 1fr; gap:.15rem .9rem;
  margin:0; font-size:.85rem; }
.hoja-datos dt{ color:#8a807a; }
.hoja-datos dd{ margin:0; }
.hoja-precio dl{ font-size:.95rem; font-weight:600; }

.hoja-pie{ margin-top:1.6rem; padding-top:.7rem; border-top:1px solid #e6ded6;
  font-size:.68rem; color:#8a807a; }

@media (max-width:760px){
  .hoja{ padding:1.2rem; }
  .hoja-cuerpo{ grid-template-columns:1fr; }
  .hoja-cabecera{ flex-direction:column; gap:.8rem; }
  .papel-aviso{ flex:1 1 100%; }
}

/* En el papel: solo la hoja, y sin sombras ni bordes que gastan tinta.
   **Va después del bloque de móvil a propósito**: una hoja A4 con márgenes
   mide unos 690 px de ancho en CSS —menos de 760— así que al imprimir se le
   aplicaban las reglas del móvil, la hoja salía a una columna y la foto se
   comía la primera página entera. Aquí no gana el `@media`, gana el orden. */
@media print{
  .papel-mandos{ display:none !important; }
  .hoja{ border:none; box-shadow:none; padding:0; max-width:none; }
  /* Sin esto sale una segunda hoja en blanco: el `<main>` del armazón lleva
     su relleno de siempre, y ese hueco basta para pasar de página. Una hoja
     en blanco de más en cada impresión es de las cosas que hacen que la gente
     deje de usar el botón. */
  main.container{ padding:0 !important; margin:0 !important; }
  body{ margin:0; }
  .hoja-pie{ margin-bottom:0; }
  .hoja-cuerpo{ display:grid; grid-template-columns:38% 1fr; gap:1.2rem; }
  .hoja-cabecera{ flex-direction:row; }
  .hoja-cabecera h1{ font-size:1.6rem; }
  /* Apretado para que una ficha completa —con precios y todo— quepa en **una
     hoja**. Una ficha que se va a dos páginas por tres líneas se imprime a dos
     caras o se tira media hoja, y las dos cosas molestan lo justo para dejar
     de imprimirla. */
  .hoja-foto img{ max-height:62mm; object-fit:cover; }
  .hoja-datos section{ margin-bottom:.55rem; }
  .hoja-datos dl{ font-size:.78rem; gap:.1rem .8rem; }
  .hoja-datos h2{ font-size:.66rem; margin-bottom:.25rem; }
  .hoja-precio dl{ font-size:.85rem; }
  .hoja-pie{ margin-top:.9rem; }
  @page{ margin:12mm; }
}

/* Seguir una pieza (G-07): «ésta me importa». El botón cambia de estado, que
   si no, no se sabe si ya la sigues. */
.btn-ghost.la-sigo{ border-color:var(--gold); color:var(--burg);
  background:var(--oro-panel); }
.btn-ghost.la-sigo .chip{ margin-left:.35rem; font-size:11px; }

/* --- Subtareas (G-10) ------------------------------------------------------
   «Levantar web y redes» no es una cosa: son cuatro. Ramificarla evita las dos
   salidas malas de siempre — una lista de veinte cosas sueltas donde no se ve
   qué va con qué, o una sola línea que lleva meses sin poder marcarse porque
   le falta un trozo.

   Los trozos van plegados salvo que se abra la tarea: una lista de tareas es
   para ver lo que falta de un vistazo, no un árbol desplegado. */
.t-trozos{ display:inline-block; margin-left:.45rem; font-size:11px; font-weight:700;
  padding:1px 7px; border-radius:20px; background:var(--chip-fondo);
  color:var(--muted); text-decoration:none; font-variant-numeric:tabular-nums; }
.t-trozos.completos{ background:var(--ok-chip); color:var(--ok); }
.t-ramificar{ font-size:.78rem; color:var(--muted); text-decoration:none;
  border-bottom:1px dotted var(--line); }
.t-ramificar:hover{ color:var(--burg); border-bottom-color:var(--burg); }

.subtareas{ list-style:none; margin:.5rem 0 0; padding:0 0 0 .2rem;
  border-left:2px solid var(--line); display:grid; gap:.15rem; }
.subtareas.plegada{ display:none; }
.subtarea{ display:flex; align-items:center; gap:.5rem; padding:.15rem .5rem;
  border-radius:8px; font-size:.9rem; }
.subtarea:hover{ background:var(--superficie-2); }
.subtarea.esta-hecha .st-titulo{ text-decoration:line-through; color:var(--muted); }
.st-titulo{ flex:1; }
.st-quien{ font-size:.78rem; color:var(--burg); }
.subtarea-nueva{ padding:.35rem .5rem; }
.subtarea-nueva input[type=text]{ width:auto; min-width:14rem; margin:0;
  font-size:.88rem; padding:.35rem .6rem; }

@media (max-width:760px){
  .subtareas{ margin-left:0; }
  .subtarea-nueva input[type=text]{ min-width:0; flex:1; }
  .subtarea-nueva .en-linea{ display:flex; gap:.4rem; width:100%; }
}

/* --- Los gráficos del panel (V-08) -----------------------------------------
   Una sola tinta en los dos, y a propósito: los tipos de gema **no tienen
   orden natural** —una turmalina no va «antes» que un zafiro— así que pintar
   cada barra de un color, o más oscura cuanto más grande, sería codificar dos
   veces lo que la longitud ya dice y gastar el único canal libre en nada.

   El color es `--burg`, que en claro es #6d1a2e y en oscuro #c9758c: los dos
   pasan el contraste contra su propio fondo. El dorado NO vale de tinta de
   dato en claro —se queda en 2,59:1— así que aquí no aparece. */
.rejilla-panel{ display:grid; gap:18px; grid-template-columns:repeat(auto-fit,minmax(320px,1fr));
  margin-bottom:1.6rem; }
.grafico h3{ margin:0 0 .15rem; }
.g-sub{ margin:0 0 1rem; font-size:.83rem; color:var(--muted); }

/* Barras. Finas y con el extremo redondeado; el carril, un paso por encima del
   fondo y nada más — la rejilla no compite con el dato. */
.barras{ list-style:none; margin:0; padding:0; display:grid; gap:.5rem; }
.barra-fila{ display:grid; grid-template-columns:minmax(4.5rem,8rem) 1fr auto;
  align-items:center; gap:.7rem; font-size:.86rem; border-radius:8px;
  padding:.15rem .25rem; }
.barra-fila:hover, .barra-fila:focus-visible{ background:var(--superficie-2); outline:none; }
.b-nombre{ color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.b-carril{ background:var(--barra); border-radius:4px; height:14px; overflow:hidden; }
.b-marca{ display:block; height:100%; background:var(--burg);
  border-radius:0 4px 4px 0; min-width:3px; }
.b-valor{ font-variant-numeric:tabular-nums; font-weight:600; white-space:nowrap; }
.b-valor small{ color:var(--muted); font-weight:400; margin-left:.25rem; }

/* La curva. 2 px de trazo, el relleno al 10%, y el punto final con su anillo
   del color del fondo para que se lea encima de la línea. */
.curva{ width:100%; height:120px; display:block; overflow:visible; }
.c-area{ fill:var(--burg); opacity:.10; stroke:none; }
.c-linea{ fill:none; stroke:var(--burg); stroke-width:2; stroke-linejoin:round;
  stroke-linecap:round; vector-effect:non-scaling-stroke; }
.c-punto{ fill:var(--burg); stroke:var(--card); stroke-width:2; opacity:0;
  transition:opacity .12s; cursor:pointer; }
.curva:hover .c-punto, .c-punto:focus{ opacity:1; }
.c-ultimo{ opacity:1; }
.c-extremos{ display:flex; justify-content:space-between; align-items:baseline;
  margin:.35rem 0 0; font-size:.8rem; color:var(--muted); }
.c-extremos strong{ color:var(--ink); font-size:1rem; font-variant-numeric:tabular-nums; }

/* El globo. Sale al pasar por encima y al enfocar con el teclado, y no guarda
   ningún dato que no esté ya escrito en la página. */
.globo{ position:fixed; z-index:80; pointer-events:none; max-width:15rem;
  background:var(--burg-fondo); color:var(--sobre-burg); font-size:.8rem;
  padding:.4rem .6rem; border-radius:8px; box-shadow:var(--shadow);
  transform:translate(-50%,-130%); }

.tira-fotos{ list-style:none; margin:0 0 1.6rem; padding:0; display:grid;
  grid-template-columns:repeat(auto-fill,minmax(110px,1fr)); gap:12px; }
.tira-fotos a{ display:block; text-decoration:none; color:var(--muted);
  font-size:.78rem; }
.tira-fotos img{ width:100%; aspect-ratio:1; object-fit:cover; border-radius:10px;
  display:block; border:1px solid var(--line); }
.tira-fotos span{ display:block; margin-top:.3rem; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.tira-fotos a:hover img{ border-color:var(--gold); }

@media (max-width:760px){
  .rejilla-panel{ grid-template-columns:1fr; }
  .barra-fila{ grid-template-columns:1fr auto; gap:.3rem .6rem; }
  .b-carril{ grid-column:1 / -1; order:3; }
  .tira-fotos{ grid-template-columns:repeat(auto-fill,minmax(88px,1fr)); }
}

/* --- El comparador (F-13) --------------------------------------------------
   La pregunta que contesta no es «cómo es esta piedra» sino en qué se
   diferencian, así que lo que se marca es la diferencia: quién gana en cada
   número, y las filas donde coinciden se pueden plegar. */
.elegir-comparar{ margin-bottom:1.2rem; }
.cc-columnas{ display:grid; gap:.7rem; margin:.5rem 0 1rem;
  grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); }
.cc-columnas .campo{ margin:0; }
.cc-columnas select{ width:100%; }

.cc-solo-diferencias{ margin:0 0 .9rem; }
.cc-solo-diferencias label{ display:flex; align-items:center; gap:.55rem;
  cursor:pointer; }
.cc-solo-diferencias small{ display:block; color:var(--muted); font-size:.82rem;
  margin-top:.2rem; }

/* Sin `overflow:visible` la columna pegajosa de abajo no se pega: un ancestro
   con overflow distinto de visible pasa a ser su contenedor, y la etiqueta se
   quedaría fija respecto a la tabla —o sea, se iría con el scroll—. El
   redondeo que `.tabla` conseguía con ese overflow ya lo pone `.tabla-scroll`. */
.comparativa{ min-width:520px; overflow:visible; }
/* La columna de las etiquetas se queda quieta al desplazar de lado. Sin esto,
   en un móvil se ve la tercera piedra sin saber ya de qué fila es —que es
   perder justo lo que se venía a hacer—. Lleva fondo opaco a propósito: es lo
   que pasa por encima de las celdas al desplazarse. */
.comparativa th[scope=row]{ text-align:left; text-transform:none; letter-spacing:0;
  font-size:.86rem; background:var(--superficie); color:var(--muted);
  font-weight:500; border-top:1px solid var(--line); white-space:nowrap;
  position:sticky; left:0; z-index:1; }
/* La fila de sección ocupa todo el ancho, así que pegarla entera no serviría
   de nada: lo que se queda quieto es su texto. */
.comparativa .cc-seccion th{ position:static; }
.comparativa .cc-seccion span{ position:sticky; left:14px; }
.comparativa th[scope=row] small{ display:block; font-size:.72rem; opacity:.8; }
.cc-etiqueta{ width:1%; }
.cc-seccion th{ background:var(--chip-fondo) !important; color:var(--burg) !important;
  font-weight:600 !important; text-transform:uppercase !important;
  font-size:.72rem !important; letter-spacing:.07em !important; }

.cc-cabecera{ display:flex; align-items:center; gap:.6rem; text-decoration:none;
  color:inherit; }
.cc-foto{ width:38px; height:38px; border-radius:8px; overflow:hidden; flex:0 0 auto;
  background:rgba(255,255,255,.15); display:grid; place-items:center; }
.cc-foto img{ width:100%; height:100%; object-fit:cover; display:block; }
.cc-nombre{ font-weight:600; }
.cc-nombre small{ display:block; font-weight:400; opacity:.85; }
.cc-color{ display:block; height:4px; border-radius:2px; margin-top:.45rem; }

/* Quién gana. Discreto: es una comparación, no un concurso — el fondo marca
   la celda y el texto se queda en tinta normal, que es lo único que se lee
   igual de bien en los dos temas. */
.cc-gana{ font-weight:700; color:var(--ink); background:var(--oro-panel);
  box-shadow:inset 3px 0 0 var(--gold); }

/* Plegar lo que coincide. Con transición: si desaparecieran de golpe, la tabla
   daría un salto y habría que buscar dónde se quedó uno. */
.comparativa tr[data-iguales="si"]{ transition:opacity .18s; }
.comparativa.solo-diferencias tr[data-iguales="si"]{ display:none; }

/* La distancia de color medida — lo que esta app sabe y una tabla de
   características no: «Azul» y «Azul» pueden ser dos colores. */
.distancias h3{ margin-top:0; }
.distancias ul{ list-style:none; margin:0 0 .7rem; padding:0; display:grid; gap:.5rem; }
.distancias li{ display:flex; align-items:center; gap:.7rem; flex-wrap:wrap; }
.d-muestras{ display:flex; flex-shrink:0; }
.d-tinta{ width:26px; height:26px; border:1px solid var(--line); }
.d-tinta:first-child{ border-radius:6px 0 0 6px; }
.d-tinta:last-child{ border-radius:0 6px 6px 0; border-left:none; }
.d-texto{ flex:1; font-size:.92rem; }
.d-delta{ font-variant-numeric:tabular-nums; color:var(--muted); font-size:.85rem; }

@media (max-width:760px){
  .comparativa{ min-width:440px; }
  .cc-foto{ width:30px; height:30px; }
  .cc-columnas{ grid-template-columns:1fr; }
  .d-texto{ flex:1 1 100%; }
  /* Cabe menos, así que la etiqueta parte en dos líneas antes que comerse el
     sitio de los datos, que son los que se comparan. */
  .comparativa th[scope=row]{ white-space:normal; max-width:9rem; }
}
.d-aviso{ flex:1 1 100%; font-size:.8rem; color:var(--muted);
  border-left:2px solid var(--gold); padding-left:.55rem; }

/* --- De dónde sale el euro (F-05) ------------------------------------------
   La cuenta entera, no solo el resultado: el resultado ya está en la ficha, y
   lo que hace falta saber dentro de un año es de dónde vino. */
.cambio-moneda{ background:var(--oro-panel); border:1px solid var(--oro-borde);
  border-radius:10px; padding:11px 14px; margin:0 0 1rem; }
.cm-cuenta{ display:block; font-variant-numeric:tabular-nums; font-weight:600; }
/* Sobre el panel dorado, `--muted` se queda en 3,4:1 y no llega: aquí el gris
   se hace con la tinta a media fuerza, que sí contrasta y sigue leyéndose
   como secundario. */
.cambio-moneda small{ display:block; color:var(--ink); opacity:.75;
  font-size:.82rem; margin-top:.25rem; }
.cm-aviso{ display:block; margin-top:.35rem; font-size:.88rem;
  border-left:3px solid var(--gold); padding-left:.6rem; }

@media (max-width:760px){
  .cm-cuenta{ font-size:.94rem; }
}
