/* styles.css — Emabel Finanzas.
   Shell (topbar + sidebar colapsable) tomado del mismo lenguaje visual que SuperAdmin
   (workers/sadm/src/index.js, bloque "SHELL EMABEL v1"): tema oscuro, acento naranja,
   sidebar de 56px que se expande al hover, breakpoint a barra inferior en móvil. */

/* Base tipográfica en 15px (en vez del 16px del navegador): todo font-size del archivo
   está en rem, así que esto baja la letra ~6.25% de punta a punta sin tocar declaración
   por declaración (Patricio, 10-sep-2026: "levemente más pequeñas, pero muy poco").
   padding/margin/gap/border-radius y las variables de layout (--sb, --sb-open, --topbar)
   se quedan en px a propósito: solo la letra baja, las cajas no se mueven. */
html { font-size: 15px; }

:root {
  color-scheme: dark;
  --acc: #fb923c;
  --acc-soft: #fdba74;
  --bg: #0c0c0e;
  --bg2: #121215;
  --panel: #16161a;
  --panel2: #121215;
  --border: #2a2a30;
  --border-soft: #222226;
  --text: #eef2f6;
  --muted: #9a9aa2;
  --muted2: #6f6f78;
  --verde: #86efac;
  --rojo: #f87171;
  --sb: 56px;
  --sb-open: 208px;
  --topbar: 48px;
  /* Curva propia para las transiciones de interacción (botones, chips, filas): salida
     rápida y llegada suave, más sobria que el ease-out plano por defecto. */
  --ease: cubic-bezier(.2, .7, .3, 1);
}
* { box-sizing: border-box; }
body {
  margin: 0;
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  font-feature-settings: "cv11", "ss01";
  -webkit-font-smoothing: antialiased;
  background: var(--bg);
  color: var(--text);
  line-height: 1.55;
  min-height: 100vh;
}
a { color: inherit; }
.hidden { display: none !important; }
button { font: inherit; }

/* ---------- topbar ---------- */
.top {
  display: flex; align-items: center; gap: 10px; height: var(--topbar);
  padding: 0 16px 0 0; border-bottom: 1px solid var(--border-soft);
  position: fixed; top: 0; left: 0; right: 0; background: var(--bg2); z-index: 30;
}
.top .marca { display: flex; align-items: center; gap: 0; flex: 0 0 auto; }
.top .marca .cubo {
  width: var(--sb); height: var(--topbar);
  display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.top .marca .cubo svg { width: 22px; height: 22px; display: block; }
/* El emblema real (PNG del render 3D) sustituye al SVG dibujado: mismo símbolo que la app y el
   favicon. Un poco mayor que el svg porque el hexágono lleva aire propio dentro del PNG. */
.top .marca .cubo .cubo-img { width: 26px; height: 26px; display: block; object-fit: contain; }
.top .marca .rot { display: flex; flex-direction: column; line-height: 1.15; }
.top .marca .rot b { font-size: .8438rem; font-weight: 700; letter-spacing: .2px; color: var(--text); }
.top .sub { font-size: .6563rem; color: var(--muted2); font-weight: 500; letter-spacing: .1px; }
.top .sp { flex: 1; }
.top .who { font-size: .75rem; color: var(--muted); margin-right: 12px; }

/* ---------- sidebar ---------- */
.sb {
  position: fixed; top: var(--topbar); left: 0; bottom: 0; width: var(--sb);
  background: var(--bg2); border-right: 1px solid var(--border-soft);
  display: flex; flex-direction: column; padding: 8px 0; z-index: 40;
  transition: width .16s ease; overflow: hidden;
}
.sb:hover { width: var(--sb-open); box-shadow: 14px 0 40px -14px #000c; }
.sb-item {
  display: flex; align-items: center; gap: 0; height: 38px; margin: 1px 8px; padding: 0;
  border-radius: 8px; cursor: pointer; color: var(--muted); border: 0; background: transparent;
  width: calc(100% - 16px); text-align: left; transition: background .12s var(--ease), color .12s var(--ease);
  white-space: nowrap; text-decoration: none;
}
.sb-item .ic { width: 40px; flex: 0 0 40px; display: flex; align-items: center; justify-content: center; }
.sb-item .ic svg { width: 17px; height: 17px; display: block; }
.sb-item .tx { font-size: .8125rem; font-weight: 500; opacity: 0; transition: opacity .13s; pointer-events: none; }
.sb:hover .sb-item .tx { opacity: 1; }
.sb-item:hover { background: #ffffff0a; color: var(--text); }
.sb-item.activo { background: #fb923c14; color: var(--acc-soft); }
.sb-item.activo .tx { font-weight: 600; }
.sb-item:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }
.sb-sep { height: 1px; background: var(--border-soft); margin: 8px 12px; }
.sb-sp { flex: 1; }

/* ---------- chevron de "Clientes" (pliega/despliega el sub-menú) ---------- */
/* margin-left:auto lo empuja al borde derecho del ítem: sin esto el clic en el CENTRO
   geométrico del <a> (donde un usuario clickearía por defecto) cae sobre el chevron en
   vez de navegar, porque .tx no ocupa todo el ancho disponible (bug detectado con
   Playwright: elementFromPoint en el centro del <a> devolvía el <svg> del chevron). */
.sb-chevron {
  flex: 0 0 auto; width: 20px; height: 20px; margin-left: auto; margin-right: 6px; display: flex;
  align-items: center; justify-content: center; opacity: 0; transition: opacity .13s, transform .18s;
  border-radius: 5px;
}
.sb:hover .sb-item .sb-chevron { opacity: .8; }
.sb-chevron:hover { opacity: 1 !important; background: #ffffff10; }
.sb-chevron svg { width: 13px; height: 13px; display: block; }
.sb-chevron.cerrado { transform: rotate(-90deg); }
.sb-chevron.hidden { display: none; }

/* ---------- sub-items de clientes bajo "Clientes" ---------- */
.sb-sub {
  max-height: 0; opacity: 0; overflow: hidden; margin: 0 8px 0 24px; padding-left: 15px;
  border-left: 1px solid var(--border-soft); display: flex; flex-direction: column; gap: 1px;
  transition: max-height .18s ease, opacity .18s ease, margin .18s ease;
}
.sb-sub.abierto { max-height: 320px; opacity: 1; margin: 2px 8px 6px 24px; }
.sb-sub-item {
  display: block; height: 30px; line-height: 30px; padding: 0 8px; border-radius: 6px;
  color: var(--muted); font-size: .7813rem; font-weight: 500; text-decoration: none; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; transition: color .12s var(--ease), background .12s var(--ease);
}
/* Los sub-items están SIEMPRE visibles y clicables: Patricio los quiere desplegados para
   seleccionar un cliente tras otro, no revelados al pasar el mouse (10-sep-2026). */
.sb-sub-item:hover { background: #ffffff0a; color: var(--text); }
.sb-sub-item.activo { background: #fb923c14; color: var(--acc-soft); font-weight: 600; }
.sb-sub-item:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }

/* ---------- área de contenido ---------- */
/* Patricio, criterio de diseño para apps internas (09-sep-2026): la app ocupa TODA la
   pantalla, sin franjas laterales vacías ni contenedores centrados con márgenes muertos.
   El contenido se estira al ancho disponible; las grillas de tarjetas/tablas hacen el
   trabajo de no verse gigantes en pantallas anchas (auto-fill con minmax). */
.shell { padding-left: var(--sb); padding-top: var(--topbar); }
.wrap { width: 100%; padding: 0 28px 90px; min-width: 0; }

@media (max-width: 720px) {
  .sb {
    top: auto; bottom: 0; right: 0; width: 100%; height: 56px; flex-direction: row;
    border-right: 0; border-top: 1px solid var(--border-soft); padding: 0;
    /* flex-start, no space-around (corrección 24-sep-2026, al sumar el ítem Consumo):
       con 8 ítems y .sb-item en flex:1 0 auto, cuando SÍ caben todos space-around y
       flex-start se ven igual (llenan el ancho parejo); cuando NO caben, space-around
       se comporta como centrado -- los ítems quedan cortados por los dos bordes y el
       primero no se alcanza haciendo scroll a la izquierda. flex-start los deja partir
       desde el borde izquierdo, así el scroll horizontal de ESTA barra (overflow-x:auto,
       no la página) siempre llega al primer y al último ítem. */
    justify-content: flex-start; overflow-x: auto;
  }
  .sb:hover { width: 100%; box-shadow: none; }
  .sb-item { flex-direction: column; justify-content: center; gap: 2px; height: 100%; margin: 0; width: auto; flex: 1 0 auto; padding: 0 6px; }
  .sb-item .ic { width: auto; flex: none; }
  .sb-item .ic svg { width: 18px; height: 18px; }
  /* 9px se queda fijo en px (no en rem): ya es diminuto en la barra inferior móvil,
     bajarlo más lo vuelve ilegible. */
  .sb-item .tx { opacity: 1; font-size: 9px; }
  .sb-sep, .sb-sp { display: none; }
  /* Sin espacio vertical para un sub-menú en la barra inferior: en Clientes se navega
     directo a la vista Clientes (que sigue listando todas las empresas), como hoy. */
  .sb-chevron, .sb-sub { display: none; }
  .shell { padding-left: 0; padding-bottom: 56px; }
  .wrap { padding: 0 14px 40px; }
  .top { padding: 0 12px; }
  .top .who { display: none; }
  .top .marca .rot { display: none; }
  .top .marca .cubo { width: 40px; }
}

/* ---------- botón hamburguesa (móvil, abre/cierra menú si hiciera falta) ---------- */
.btn-ghost {
  appearance: none; background: transparent; border: 1px solid var(--border); color: var(--muted);
  font-size: .7813rem; padding: 7px 13px; border-radius: 8px; cursor: pointer; white-space: nowrap;
  transition: border-color .15s var(--ease), color .15s var(--ease), background .15s var(--ease), transform .1s var(--ease);
}
.btn-ghost:hover { border-color: #fb923c66; color: var(--acc-soft); background: #fb923c0f; }
.btn-ghost:active { transform: translateY(1px); }
.btn-ghost:focus-visible { outline: 2px solid var(--acc); outline-offset: 2px; }
.btn-primario {
  appearance: none; background: linear-gradient(180deg, #fdaa5c, #fb923c); border: 0; color: #1a0e02;
  font-size: .8125rem; font-weight: 700; padding: 9px 16px; border-radius: 9px; cursor: pointer;
  transition: filter .15s var(--ease), transform .15s var(--ease), box-shadow .15s var(--ease);
}
.btn-primario:hover { filter: brightness(1.06); transform: translateY(-1px); box-shadow: 0 6px 16px -8px #fb923c80; }
.btn-primario:active { transform: translateY(1px); box-shadow: none; }
.btn-primario:disabled { opacity: .5; cursor: default; }
.btn-primario:focus-visible { outline: 2px solid var(--acc-soft); outline-offset: 2px; }

/* ---------- login ---------- */
.login-shell { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 32px 16px; }
.login-card {
  width: 100%; max-width: 380px; background: linear-gradient(180deg, #1b1b20f2, #121215f5);
  border: 1px solid #ffffff10; border-radius: 24px; padding: 40px 32px;
  box-shadow: 0 30px 80px -24px #000c; text-align: center;
}
.login-card .cubo-login { width: 44px; height: 44px; margin: 0 auto 18px; display: flex; align-items: center; justify-content: center; }
.login-card .cubo-login svg { width: 30px; height: 30px; }
.login-card .cubo-login .cubo-img { width: 44px; height: 44px; display: block; object-fit: contain; }
.login-card h1 { font-size: 1.1875rem; margin: 0 0 6px; font-weight: 700; }
.login-card .muted { color: var(--muted); font-size: .8438rem; margin: 0 0 26px; }
.btn-google {
  display: flex; align-items: center; justify-content: center; gap: 10px; width: 100%; padding: 12px;
  background: #1a1a1e; border: 1px solid #33333a; border-radius: 10px; color: #eef2f6; font-size: .875rem;
  font-weight: 600; cursor: pointer; text-decoration: none; box-sizing: border-box;
  transition: border-color .15s var(--ease), background .15s var(--ease), transform .1s var(--ease);
}
.btn-google:hover { border-color: #4b4b54; background: #202024; }
.btn-google:active { transform: translateY(1px); }
.btn-google:focus-visible { outline: 2px solid var(--acc); outline-offset: 2px; }
.err { color: var(--rojo); font-size: .7813rem; margin-top: 16px; min-height: 14px; font-weight: 500; }
.privada-card { text-align: center; }
.privada-card p { color: var(--muted); font-size: .875rem; margin: 8px 0 24px; }

/* ---------- hero de sección ---------- */
.hero { padding: 34px 0 6px; }
.hero h1 { font-size: 1.25rem; margin: 0 0 4px; font-weight: 600; letter-spacing: -.35px; }
.hero p { color: var(--muted); font-size: .8125rem; margin: 0; }

/* ---------- tarjetas resumen ---------- */
.tarjetas { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 12px; margin: 20px 0; }
.tarjeta { border: 1px solid var(--border); border-radius: 13px; background: var(--panel2); padding: 17px 16px; }
.tarjeta .tt { font-size: .6875rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; margin: 0 0 8px; }
.tarjeta .vv { font-size: 1.375rem; font-weight: 700; color: #fff; letter-spacing: -.4px; }
.tarjeta .vv.acc { color: var(--acc-soft); }
.tarjeta .vv.verde { color: var(--verde); }
.tarjeta .sub { font-size: .7188rem; color: var(--muted2); margin-top: 6px; }

/* ---------- secciones / bloques ---------- */
.bloque { margin: 30px 0; }
.bloque h2 { font-size: .9375rem; font-weight: 700; margin: 0 0 12px; color: var(--text); }
.bloque .bloque-sub { font-size: .7813rem; color: var(--muted); margin: -8px 0 14px; }

/* ---------- tablas ---------- */
.tabla-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; border: 1px solid var(--border); border-radius: 12px; background: var(--panel); }
table { width: 100%; border-collapse: collapse; min-width: 520px; }
th { text-align: left; font-size: .6875rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; padding: 11px 13px; border-bottom: 1px solid var(--border); white-space: nowrap; }
td { padding: 12px 13px; border-bottom: 1px solid var(--border-soft); font-size: .8438rem; vertical-align: middle; }
tr:last-child td { border-bottom: 0; }
/* Hover muy tenue para seguir la línea con el ojo en tablas largas (Plan de HyC, 8 filas). */
tr:hover td { background: #ffffff05; transition: background .12s var(--ease); }
td.num { text-align: right; font-variant-numeric: tabular-nums; }
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: .7813rem; }

/* fila chica de desglose de pago debajo de un documento (ver filasPagosDeDocumento) */
tr.fila-pago-doc td { padding: 6px 13px 6px 26px; font-size: .75rem; background: #ffffff03; }
tr.fila-pago-doc td.sub-detalle { color: var(--muted); }

/* ---------- chips de estado ---------- */
/* Borde sutil del mismo tono del texto (≈30% opacidad, notación hex de 8 dígitos como
   el resto del archivo) en vez de solo relleno: se ve más fino. */
.chip { font-size: .6875rem; font-weight: 700; padding: 4px 10px; border-radius: 20px; white-space: nowrap; display: inline-block; border: 1px solid transparent; }
.chip.pagada { background: #14331f; color: var(--verde); border-color: #86efac4d; }
.chip.saldo { background: #2c2410; color: #fbbf24; border-color: #fbbf244d; }
.chip.pendiente { background: #331414; color: var(--rojo); border-color: #f871714d; }
.chip.vigente { background: #14331f; color: var(--verde); border-color: #86efac4d; }
.chip.pausado { background: #232328; color: var(--muted); border-color: #9a9aa24d; }
.chip.terminado { background: #1c1c21; color: var(--muted2); border-color: #6f6f784d; }
.chip.por_definir { background: #2c2410; color: #fbbf24; border-color: #fbbf244d; }
.chip.confirmar { background: #2c2410; color: #fbbf24; border-color: #fbbf244d; }
.chip.condonado { background: #232328; color: var(--muted); border-color: #9a9aa24d; }
.chip.consideracion { background: #1c2430; color: #93c5fd; border-color: #93c5fd4d; }

/* ---------- estado vacío ---------- */
.vacio { text-align: center; padding: 46px 20px; color: var(--muted); font-size: .8438rem; }
/* 26px se queda en px: es un ícono/emoji decorativo, no texto de lectura. */
.vacio .ic-vacio { font-size: 26px; margin-bottom: 10px; opacity: .5; }

/* ---------- tarjetas de clientes ---------- */
.clientes-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; margin: 18px 0; }
.cliente-card { border: 1px solid var(--border); border-radius: 14px; background: var(--panel2); padding: 18px; }
.cliente-card .cc-avatar {
  width: 34px; height: 34px; border-radius: 9px; margin-bottom: 11px; background: #fb923c1f;
  color: var(--acc-soft); display: flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 700;
}
.cliente-card .cc-name { font-size: .9375rem; font-weight: 700; color: #fff; margin-bottom: 2px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.cliente-card .cc-considera { font-weight: 700; text-decoration: none; }
.cliente-card .cc-sub { font-size: .75rem; color: var(--muted2); margin-bottom: 14px; }
.cliente-card .cc-fila { display: flex; justify-content: space-between; font-size: .7813rem; color: var(--muted); padding: 5px 0; border-top: 1px solid var(--border-soft); }
.cliente-card .cc-fila b { color: var(--text); font-weight: 600; }
.cliente-card .cc-acciones { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 14px; }
.cliente-card .cc-acciones a, .cliente-card .cc-acciones button { flex: 1 1 auto; text-align: center; }

/* ---------- modal simple ---------- */
.modal-fondo {
  position: fixed; inset: 0; background: #000a; z-index: 80; display: flex; align-items: center;
  justify-content: center; padding: 20px;
}
.modal-fondo.hidden { display: none; }
.modal-caja { width: 100%; max-width: 460px; background: var(--panel); border: 1px solid var(--border); border-radius: 16px; padding: 24px; }
.modal-caja h3 { margin: 0 0 12px; font-size: .9375rem; }
.modal-caja textarea {
  width: 100%; min-height: 130px; background: var(--panel2); border: 1px solid var(--border); border-radius: 10px;
  color: var(--text); font-size: .8125rem; padding: 12px; resize: vertical; font-family: inherit; line-height: 1.5;
}
.modal-acciones { display: flex; gap: 10px; margin-top: 16px; justify-content: flex-end; }

/* ---------- formulario nota ---------- */
.form-nota { display: flex; flex-direction: column; gap: 10px; margin-top: 14px; }
.form-nota textarea {
  width: 100%; min-height: 80px; background: var(--panel2); border: 1px solid var(--border); border-radius: 10px;
  color: var(--text); font-size: .8438rem; padding: 12px; resize: vertical; font-family: inherit; line-height: 1.5;
}

/* ---------- filtros (facturas/pagos) ---------- */
.filtros { display: flex; gap: 10px; margin: 18px 0; flex-wrap: wrap; }
.filtros select, .filtros input {
  padding: 10px 14px; background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
  color: #fff; font-size: .8438rem;
}

/* ---------- gráfico de área SVG ("líneas de montañas", Patricio 10-sep-2026) ---------- */
/* Antes era de barras; ver graficoArea()/pathMonotono() en app.js para la curva
   (splines cúbicas monótonas, sin librería) y el degradado del relleno. */
.grafico-wrap { border: 1px solid var(--border); border-radius: 13px; background: var(--panel2); padding: 20px; }
.grafico-wrap svg { display: block; width: 100%; height: auto; }
.grafico-eje { font-size: .625rem; fill: var(--muted2); }
.grafico-valor { font-size: .6875rem; fill: var(--muted); font-weight: 600; }
.grafico-linea { stroke: #fb923c; stroke-width: 2; stroke-linejoin: round; stroke-linecap: round; }
.grafico-punto { fill: #fb923c; stroke: var(--panel2); stroke-width: 1.5; }
.grafico-base { stroke: var(--border-soft); stroke-width: 1; }
.grafico-ref { stroke: var(--border-soft); stroke-width: 1; stroke-dasharray: 3 4; opacity: .55; }
/* En anchos angostos (celular) los 8 puntos quedan más juntos: las etiquetas de valor
   ("1.1M", "278k") se acortan un poco para que dos meses consecutivos con datos no se
   encimen; los nombres de mes (3 letras) ya entran holgados y no necesitan ajuste. */
@media (max-width: 480px) {
  .grafico-valor { font-size: .625rem; }
}

/* ---------- detalle de cliente: encabezado ---------- */
.cliente-encabezado { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.cliente-encabezado .ce-avatar {
  width: 46px; height: 46px; border-radius: 12px; background: #fb923c1f; color: var(--acc-soft);
  display: flex; align-items: center; justify-content: center; font-size: 1rem; font-weight: 700; flex: 0 0 auto;
}
.cliente-encabezado h1 { font-size: 1.1875rem; margin: 0; }
.cliente-encabezado .ce-sub { font-size: .7813rem; color: var(--muted); margin-top: 3px; }

/* ---------- pestañas del detalle de cliente ---------- */
/* Sticky bajo la topbar fija (var(--topbar)): al hacer scroll en una pestaña larga
   (Facturas de HyC, por ejemplo) la barra queda a la vista. overflow-x:auto en vez de
   wrap para que en celular se deslice horizontal en lugar de romper el layout (Patricio,
   10-sep-2026). scrollbar oculta pero sigue siendo desplazable con el dedo/rueda. */
.tabs-cliente {
  display: flex; gap: 4px; margin: 22px 0 0; border-bottom: 1px solid var(--border-soft);
  position: sticky; top: var(--topbar); background: var(--bg); z-index: 20;
  overflow-x: auto; scrollbar-width: none;
}
.tabs-cliente::-webkit-scrollbar { display: none; }
.tab-cliente {
  display: flex; align-items: center; gap: 6px; padding: 11px 14px; font-size: .8125rem; font-weight: 600;
  color: var(--muted); text-decoration: none; white-space: nowrap; border-bottom: 2px solid transparent;
  transition: color .12s var(--ease), border-color .12s var(--ease);
}
.tab-cliente:hover { color: var(--text); }
.tab-cliente.activa { color: var(--acc-soft); border-bottom-color: var(--acc); }
.tab-cliente.vacia { color: var(--muted2); }
.tab-cliente.vacia:hover { color: var(--muted); }
.tab-cliente:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }
.tab-cuenta {
  font-size: .6875rem; font-weight: 700; color: var(--muted2); background: #ffffff0d;
  border-radius: 20px; padding: 1px 7px; line-height: 1.4;
}
.tab-cliente.activa .tab-cuenta { color: var(--acc-soft); background: #fb923c1f; }
#panelCliente .bloque:first-child { margin-top: 22px; }
.panel-acciones { margin-top: 4px; }

.decision-item { border-top: 1px solid var(--border-soft); padding: 12px 0; }
.decision-item:first-child { border-top: 0; }
.decision-item .di-fecha { font-size: .6875rem; color: var(--muted2); font-weight: 600; margin-bottom: 3px; }
.decision-item .di-texto { font-size: .8438rem; color: var(--text); }
.decision-item .di-fuente { font-size: .6875rem; color: var(--muted2); margin-top: 3px; font-style: italic; }

.propuesta-item { border: 1px solid #fbbf2440; background: #2c241012; border-radius: 11px; padding: 13px 15px; margin-bottom: 10px; }
.propuesta-item .pi-top { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.propuesta-item .pi-monto { font-size: .9375rem; font-weight: 700; color: #fbbf24; }
.propuesta-item .pi-detalle { font-size: .75rem; color: var(--muted); margin-top: 4px; }

.equipo-placeholder { text-align: center; padding: 70px 20px; color: var(--muted); }
/* 30px se queda en px: es un ícono/emoji decorativo, no texto de lectura. */
.equipo-placeholder .ep-ic { font-size: 30px; margin-bottom: 14px; opacity: .5; }
.equipo-placeholder h2 { font-size: 1rem; color: var(--text); margin: 0 0 8px; }

.toast {
  position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); background: var(--panel);
  border: 1px solid var(--border); color: var(--text); padding: 11px 18px; border-radius: 10px; font-size: .8125rem;
  box-shadow: 0 14px 34px -14px #000d; z-index: 90; opacity: 0; pointer-events: none; transition: opacity .18s, transform .18s;
}
.toast.mostrar { opacity: 1; transform: translateX(-50%) translateY(-6px); }

@media (max-width: 480px) {
  .tarjetas { grid-template-columns: 1fr 1fr; }
  .clientes-grid { grid-template-columns: 1fr; }
}

/* ---------- accesibilidad: sin movimiento para quien lo pide ---------- */
/* Anula transiciones y transforms de INTERACCIÓN (botones, pestañas, chips, filas, sidebar).
   No toca el transform de posicionamiento base del .toast (translateX(-50%): es layout,
   no animación) ni el de .sb-chevron.cerrado (rotación fija, no una transición en curso). */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
  }
  .btn-ghost:hover, .btn-ghost:active,
  .btn-primario:hover, .btn-primario:active,
  .btn-google:active,
  .sb-item:hover, .sb-sub-item:hover {
    transform: none !important;
  }
}

/* ---------- Equipo ---------- */
/* La sección Equipo (colaboradores de Patricio y lo que se les ha pagado, 10-sep-2026)
   reutiliza a propósito las clases ya existentes de Clientes: la tarjeta de la vista lista
   (.clientes-grid/.cliente-card/.cc-*), las tarjetas de totales del detalle (.tarjetas/
   .tarjeta/.vv), las pestañas del detalle (.tabs-cliente/.tab-cliente) y los chips de
   estado (.chip.pagada/.chip.confirmar). Mismo lenguaje visual, cero declaraciones nuevas
   necesarias — este bloque queda como constancia de esa decisión, no porque falte algo.
   .equipo-placeholder (arriba) queda sin uso: era el placeholder que esta sección
   reemplaza; no se borra para no tocar una regla fuera de este bloque. */

/* ---------- Cubo girando (3D real) ---------- */
/* Patricio, 10-sep-2026 (textual, primer pedido): "el cubo, ese mismo cubo, pero dando
   vueltas... en ese mismo tamaño... el cubo solamente, no el marco naranja". Textual
   (segundo pedido, mismo día): "tiene que ser optimizado según el emabel.cl... toma el
   mismo código, mételo ahí". Pasó de sprite CSS de 48 cuadros a WebGL real (cubo3d.js,
   el mismo componente 3D de la landing) -- MISMO tamaño visual que antes (26px). El
   canvas lo crea/destruye JS; acá solo se fija el tamaño del contenedor para que el
   layout no salte mientras el módulo carga. Las pantallas de login NO cambian: siguen
   con el emblema completo estático (.cubo-login .cubo-img). */
.top .marca .cubo canvas { display: block; width: 44px; height: 44px; }

/* ---------- Edición y archivado ---------- */
/* Control de edición sobre finanzas (Patricio, 10-sep-2026): botones lápiz/archivar en
   cada fila editable, modal genérico de edición, diálogo de archivar con motivo
   obligatorio, y la lista atenuada de "Mostrar archivados". Reutiliza a propósito
   .modal-fondo/.modal-caja/.modal-acciones (ya definidos arriba, para "Mensaje para
   WhatsApp") y .cliente-card/.clientes-grid para la tarjeta de cliente archivado: mismo
   lenguaje visual, sin declarar de nuevo lo que ya existe. */

.hero-fila { display: flex; align-items: flex-end; justify-content: space-between; gap: 14px; flex-wrap: wrap; }

.toggle-archivados {
  display: flex; align-items: center; gap: 7px; font-size: .7813rem; color: var(--muted);
  cursor: pointer; user-select: none; padding-bottom: 6px;
}
.toggle-archivados input { accent-color: var(--acc); cursor: pointer; }

/* Botón chico solo-ícono (lápiz/archivar) junto a un nombre o al final de una fila de
   tabla: mismo trazo de línea (currentColor, stroke-width 1.6) que ICONOS/ICONO_CHEVRON. */
.btn-icono {
  appearance: none; background: transparent; border: 0; color: var(--muted2); padding: 3px;
  border-radius: 6px; cursor: pointer; display: inline-flex; align-items: center; transition: .12s;
  vertical-align: middle;
}
.btn-icono:hover { color: var(--acc-soft); background: #fb923c14; }
.btn-icono svg { display: block; }
td.col-acciones { white-space: nowrap; text-align: right; width: 1%; }

.cliente-card-archivado { opacity: .6; }
.archivado-motivo { font-size: .7188rem; color: var(--muted2); margin: 4px 0 0; font-style: italic; }

.lista-archivados { margin-top: 14px; border-top: 1px dashed var(--border); padding-top: 12px; }
.archivado-fila {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 12px;
  padding: 9px 0; opacity: .65; font-size: .8125rem;
}
.archivado-fila:not(:last-child) { border-bottom: 1px solid var(--border-soft); }

/* ---------- campos del modal de edición ---------- */
/* Este modal puede llevar hasta 6 campos (más que el de WhatsApp, que es solo un
   textarea): en pantallas bajas (celular horizontal, notebook con zoom) el formulario
   completo no entra sin scroll. max-height + overflow-y acotados a #modalEditar, sin
   tocar la regla genérica .modal-caja que usa el modal de "Mensaje para WhatsApp". */
#modalEditar .modal-caja { max-height: calc(100vh - 40px); overflow-y: auto; }
.campo-editar { display: flex; flex-direction: column; gap: 5px; margin-bottom: 12px; font-size: .8125rem; color: var(--muted); }
.campo-editar input, .campo-editar select {
  padding: 9px 12px; background: var(--panel2); border: 1px solid var(--border); border-radius: 9px;
  color: var(--text); font-size: .8438rem; font-family: inherit;
}
.campo-editar textarea {
  width: 100%; min-height: 70px; background: var(--panel2); border: 1px solid var(--border); border-radius: 9px;
  color: var(--text); font-size: .8438rem; padding: 10px 12px; resize: vertical; font-family: inherit; line-height: 1.5;
  box-sizing: border-box;
}
.campo-error { color: var(--rojo); font-size: .7188rem; min-height: 12px; }

.checkbox-cascada {
  display: flex; align-items: flex-start; gap: 8px; font-size: .8125rem; color: var(--text);
  margin: 10px 0 4px; cursor: pointer;
}
.checkbox-cascada input { accent-color: var(--acc); cursor: pointer; margin-top: 2px; }

.btn-primario.btn-peligro { background: linear-gradient(180deg, #f87171, #ef4444); color: #1a0202; }
.btn-primario.btn-peligro:hover { filter: brightness(1.06); }

/* ---------- Equipo: edición y archivado de colaboradores/pagos ---------- */
/* Extensión del bloque "Edición y archivado" de arriba a la ficha de colaborador
   (10-sep-2026, Patricio: "en Sebastián Gutiérrez todavía no puedo" editar). Reutiliza
   .campo-editar/.modal-caja/.btn-icono ya definidos; lo único nuevo es el aviso NO
   bloqueante de descuadre bruto/retención/líquido de un pago (nunca un error, solo
   contexto -- ver avisoIncoherenciaPago en app.js) y un margen para el botón
   "Recalcular desde la base" dentro del modal de edición. */
#contenedorRecalcular { margin: 2px 0 14px; }
.aviso-incoherencia {
  font-size: .7813rem; color: #fbbf24; background: #2c241012; border: 1px solid #fbbf2440;
  border-radius: 9px; padding: 10px 12px; margin: 0 0 14px;
}
.aviso-incoherencia.hidden { display: none; }
/* La ficha de un colaborador reusa .cliente-encabezado h1 (mismo bloque que el nombre de
   cliente): el lápiz queda inline junto al nombre, alineado con .btn-icono existente. */
.cliente-encabezado h1 { display: flex; align-items: center; gap: 8px; }

/* ---------- Impuestos (20-sep-2026) ---------- */
/* Reusa a propósito .tarjetas/.tarjeta/.vv (tarjetas de resumen), .tabla-wrap/table/.chip
   (tabla de declaraciones, mismo lenguaje que Facturas/Pagos), .propuesta-item (aviso de
   declaración pendiente, igual que las propuestas de pago del Resumen) y .hero-fila/
   .toggle-archivados/.lista-archivados (mismo toggle "Mostrar archivados" que Equipo).
   Lo único nuevo es la fila expandible con el detalle de una declaración: no había un
   patrón previo de fila que se abre/cierra en esta app (fila-pago-doc siempre está
   visible, no se pliega). */

/* La fila principal se ve clickeable (cursor + foco visible por teclado, ya que lleva
   tabindex/role="button" en app.js) sin dejar de verse como una fila de tabla normal. */
tr.fila-declaracion { cursor: pointer; }
tr.fila-declaracion:focus-visible { outline: 2px solid var(--acc); outline-offset: -2px; }

/* Fila de detalle: oculta por defecto (display:none, no solo altura 0 -- más simple que
   animar una tabla, y esta app no anima aperturas de detalle en ningún otro lado). */
tr.fila-declaracion-detalle { display: none; }
tr.fila-declaracion-detalle.abierta { display: table-row; }
tr.fila-declaracion-detalle td { padding: 14px 13px 16px; background: #ffffff03; border-bottom: 1px solid var(--border-soft); }

/* El detalle vive dentro de una tabla de 10 columnas con scroll horizontal: si hereda el
   ancho de la tabla (870px en un teléfono de 390), las etiquetas quedan a la izquierda y los
   VALORES fuera de la vista. Se amarra al ancho VISIBLE del contenedor con scroll: sticky a
   su izquierda y nunca más ancho que él (100cqw menos el padding de la celda, 13px por lado).
   Se mide contra el CONTENEDOR y no contra la pantalla (100vw) porque a 768px el menú lateral
   vuelve a modo escritorio y 100vw no lo descuenta: el detalle se salía 57px (medido).
   container-type va SOLO en el envoltorio de esta tabla, no en .tabla-wrap, que es compartido.
   El tope de 720px es para escritorio: etiqueta y valor a 1.200px de distancia no se leen. */
.tabla-wrap-declaraciones { container-type: inline-size; }
.detalle-declaracion {
  display: flex; flex-direction: column; gap: 8px;
  position: sticky; left: 13px;
  width: min(100%, calc(100cqw - 26px)); max-width: 720px;
  white-space: normal;
}
.dd-fila { display: flex; justify-content: space-between; gap: 14px; font-size: .7813rem; color: var(--muted); flex-wrap: wrap; }
.dd-fila b { color: var(--text); font-weight: 600; text-align: right; }
.dd-fila.dd-notas b { text-align: left; font-weight: 500; }
.dd-codigos { font-size: .7813rem; color: var(--muted); margin-top: 4px; padding-top: 8px; border-top: 1px dashed var(--border-soft); }
.dd-codigos-lista { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 6px; }
.dd-codigos-lista span { color: var(--text); font-variant-numeric: tabular-nums; }

/* A 390px la tabla de Declaraciones tiene 10 columnas: el mismo recurso de Facturas/Pagos
   (tabla-wrap con overflow-x:auto) ya resuelve el desborde con scroll horizontal contenido,
   sin declarar nada nuevo -- se deja esta nota para que quede constancia de la decisión. */

/* Certificado de una declaración: "Ver" junto al folio (escritorio) y las acciones arriba
   del detalle (celular: ahí el folio queda a la derecha del scroll de la tabla, fuera de la
   vista, y lo primero que se ve al abrir la fila tiene que ser cómo abrir el documento). */
.celda-folio { white-space: nowrap; }
.btn-ver-doc {
  margin-left: 8px; padding: 2px 9px; font: inherit; font-size: .75rem; font-weight: 600;
  color: var(--acc-soft); background: #fb923c14; border: 1px solid #fb923c33; border-radius: 999px; cursor: pointer;
}
.btn-ver-doc:hover { background: #fb923c24; }
.btn-ver-doc:focus-visible { outline: 2px solid var(--acc); outline-offset: 1px; }
.btn-ver-doc:disabled { opacity: .5; cursor: progress; }
.dd-documento { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; padding-bottom: 10px; margin-bottom: 2px; border-bottom: 1px dashed var(--border-soft); }
.dd-documento-nota { font-size: .75rem; color: var(--muted); }

/* ---------- Consumo (24-sep-2026): voz y tokens por proyecto ---------- */
/* Reusa a propósito .hero/.hero-fila, .tarjetas/.tarjeta (.tt/.vv/.verde/.acc), .bloque,
   .tabla-wrap, .chip, .filtros, .vacio, .toast, .btn-ghost, .mono y .propuesta-item/
   .pi-top/.pi-detalle (para cada aviso, igual que las propuestas de pago del Resumen).
   Lo único nuevo: la barra de progreso de minutos, la fila de selectores (Proyecto/Mes)
   con su etiqueta, y el detalle del borrador -- selects y botón "Copiar" con al menos
   40px de alto en celular (pedido explícito de la spec). */

.fila-selectores { gap: 14px; }
.selector-campo { display: flex; flex-direction: column; gap: 5px; min-width: 180px; flex: 1 1 180px; }
.selector-campo span { font-size: .6875rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; }
.selector-campo select { min-height: 40px; }

.barra-consumo { height: 8px; border-radius: 999px; background: #ffffff14; overflow: hidden; margin: 10px 0 6px; }
.barra-consumo-relleno { height: 100%; border-radius: 999px; background: var(--acc); transition: width .2s var(--ease); }
.barra-consumo.alerta .barra-consumo-relleno { background: #fbbf24; }
.barra-consumo.agotado .barra-consumo-relleno { background: var(--rojo); }

.aviso-borrador { margin-top: 8px; }
.aviso-borrador summary { cursor: pointer; font-size: .7813rem; color: var(--acc-soft); font-weight: 600; }
.aviso-borrador summary:focus-visible { outline: 2px solid var(--acc); outline-offset: 2px; }
.aviso-borrador-texto { white-space: pre-wrap; font-size: .8125rem; color: var(--text); background: var(--panel2); border: 1px solid var(--border); border-radius: 10px; padding: 12px; margin: 8px 0; }
.aviso-borrador-motivo { font-size: .75rem; color: var(--muted2); margin: 6px 0 0; font-style: italic; }
.btn-copiar-borrador { min-height: 40px; padding: 9px 16px; }

/* Línea "Tope de seguridad..." bajo el chip de Estado: NO reusa .bloque-sub (margin-top
   negativo, pensado para ir pegada a un <h2>) porque acá queda debajo de un <span class=
   "chip">, y el margen negativo la montaba encima del chip (corrección 24-sep-2026,
   detectada por la cabeza en las capturas). Espaciado propio, sin negativo. */
.estado-tope { font-size: .7813rem; color: var(--muted); margin: 10px 0 0; }
/* ---------- Publicidad: una tarjeta por línea de gasto ---------- */
.pub-lineas { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); gap: 16px; margin: 20px 0; align-items: start; }
.pub-linea { border: 1px solid var(--border); border-radius: 13px; background: var(--panel2); padding: 18px 18px 16px; min-width: 0; }
.pub-cab { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
.pub-cab-tit { min-width: 0; }
.pub-cab h2 { font-size: 1rem; font-weight: 700; margin: 0 0 2px; overflow-wrap: anywhere; }
.pub-cab p { color: var(--muted); font-size: .7813rem; margin: 0; }
.pub-fechas { color: var(--muted2); font-size: .75rem; margin: 8px 0 14px; }
.pub-tope-num { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin-bottom: 8px; }
.pub-tope-num .vv { font-size: 1.5rem; font-weight: 700; letter-spacing: -.4px; color: #fff; }
.pub-tope-num .de { color: var(--muted); font-size: .8125rem; }
.pub-tope-num .vv.verde { color: var(--verde); }
.pub-tope-num .vv.ambar { color: #fbbf24; }
.pub-tope-num .vv.rojo { color: var(--rojo); }
.pub-barra-tope { position: relative; height: 10px; border-radius: 6px; background: #ffffff0f; overflow: hidden; }
.pub-relleno { height: 100%; border-radius: 6px; background: var(--muted2); transition: width .3s var(--ease); }
.pub-relleno.verde { background: #4ade80; }
.pub-relleno.ambar { background: #fbbf24; }
.pub-relleno.rojo { background: var(--rojo); }
.pub-marca { position: absolute; top: 0; bottom: 0; width: 1px; background: #ffffff40; }
.pub-marca-pausa { background: #f8717199; }
.pub-tope-pie { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 4px 12px; margin-top: 8px; font-size: .75rem; color: var(--muted); }
.pub-tope-pie b { color: var(--text); font-weight: 600; }
.pub-leyenda { color: var(--muted2); }
.pub-kpis { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px 12px; margin: 18px 0 6px; padding-top: 16px; border-top: 1px solid var(--border-soft); }
.pub-kpis .tt { font-size: .6875rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; margin: 0 0 4px; }
.pub-kpis .kv { font-size: 1.125rem; font-weight: 700; color: #fff; letter-spacing: -.3px; }
.pub-kpis .sub { font-size: .7188rem; color: var(--muted2); margin: 3px 0 0; }
.pub-sub-tit { font-size: .75rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; margin: 16px 0 8px; }
.pub-grafico { display: block; width: 100%; height: 72px; }
.pub-barra { fill: var(--acc); }
.pub-barra-cero { fill: #ffffff1a; }
.pub-grafico-ejes { display: flex; justify-content: space-between; gap: 8px; font-size: .6875rem; color: var(--muted2); margin: 4px 0 10px; }
.pub-sin-datos { border: 1px dashed var(--border); border-radius: 10px; color: var(--muted2); font-size: .8125rem; text-align: center; padding: 22px 12px; margin-bottom: 10px; }
.pub-tabla table { min-width: 0; }
.pub-pie { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 14px 24px; border: 1px solid var(--border); border-radius: 13px; background: var(--panel2); padding: 16px 18px; margin: 4px 0 20px; }
.pub-cuenta { flex: 1 1 280px; min-width: 0; }
.pub-cuenta .tt { font-size: .6875rem; text-transform: uppercase; letter-spacing: .4px; color: var(--muted2); font-weight: 700; margin: 0 0 8px; }
.pub-actualizado { color: var(--muted); font-size: .75rem; margin: 0; }
.pub-tabla th:nth-child(n+2) { text-align: right; }
/* 8 ítems en la barra inferior: sin este ajuste «Publicidad» quedaba cortado al borde */
@media (max-width: 480px) { .sb-item { padding: 0 3px; } }
