/*
 * Sistema de diseño de la Suite IAN (sep-2026).
 * IBM Plex Sans para leer y Plex Mono para cifras y etiquetas; fondo cálido con
 * tarjetas blancas; un solo acento para los datos; radio 0 y sin sombras (marca).
 * Todo va con prefijo ian- para no chocar con el CSS propio de las pantallas que
 * aún no se han pasado a este sistema.
 */
:root {
  --ian-ground: #F6F6F4;
  --ian-surface: #FFFFFF;
  --ian-surface-2: #FAFAFA;
  --ian-line: #E4E4E4;
  --ian-line-soft: #EBEBEA;
  --ian-line-strong: #BDBDBD;
  --ian-text: #000000CC;
  --ian-text-2: #6B6B6B;
  --ian-text-3: #8A8A8A;
  --ian-ink: #000000;
  --ian-accent: #36549A;
  /* margen lateral (17-oct, Chucky: «aprovechar más el ancho en pantallas pequeñas»): 16 px en un portátil pequeño,
     32 px en una pantalla grande */
  --ian-lado: clamp(16px, 1.7vw, 32px);
  --ian-accent-soft: #EFF4FC;
  --ian-accent-strong: #253C74;
  --ian-online: #1896AD;
  --ian-ok: #16A34A;   --ian-ok-bg: #F0FDF4;     --ian-ok-bd: #BBF7D0;     --ian-ok-text: #15803D;
  --ian-warn: #D97706; --ian-warn-bg: #FFFBEB;   --ian-warn-bd: #FDE68A;   --ian-warn-text: #B45309;
  --ian-danger: #DC2626; --ian-danger-bg: #FEF2F2; --ian-danger-bd: #FECACA; --ian-danger-text: #B91C1C;
  --ian-sans: 'IBM Plex Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --ian-mono: 'IBM Plex Mono', ui-monospace, Menlo, monospace;
  /* Alto de la barra común: las pantallas de alto completo de los módulos lo descuentan */
  --ian-top-h: 56px;
}

/* ── Página ─────────────────────────────────────────────────────────────── */
body.ian { margin: 0; background: var(--ian-ground); color: var(--ian-text);
           font-family: var(--ian-sans); font-size: 13px; line-height: 1.5; }
body.ian a { color: var(--ian-ink); text-decoration: none; }
body.ian a:hover { color: var(--ian-accent); text-decoration: underline; }
.ian-main { max-width: 1680px; margin: 0 auto; padding: 32px var(--ian-lado) 56px; display: flex;
            flex-direction: column; gap: 28px; box-sizing: border-box; }

/* ── Barra superior común ───────────────────────────────────────────────── */
.ian-top { display: block; padding: 0 var(--ian-lado); background: var(--ian-surface); border-bottom: 1px solid var(--ian-line);
           box-sizing: border-box; font-family: var(--ian-sans); font-size: 13px; line-height: 1.5; color: var(--ian-text); }
/* Lote 2 (21-oct-2026): fila de aplicaciones + fila de secciones de la aplicación (.ian-subnav) */
.ian-top-f1 { display: flex; align-items: center; gap: 32px; height: 56px; }
body:has(.ian-top.con-sub) { --ian-top-h: 94px; }   /* 56 + 38 de las secciones: lo descuentan las pantallas de alto completo */
.ian-subnav { display: flex; gap: 22px; height: 38px; border-top: 1px solid var(--ian-line-soft); overflow-x: auto;
              scrollbar-width: none; }
.ian-subnav::-webkit-scrollbar { display: none; }
.ian-subnav a { display: flex; align-items: center; height: 100%; box-sizing: border-box; border-bottom: 2px solid transparent;
                font-size: 12.5px; color: var(--ian-text-2); white-space: nowrap; text-decoration: none !important; }
.ian-subnav a:hover { color: var(--ian-ink); }
.ian-subnav a.activa { color: var(--ian-ink); border-bottom-color: var(--ian-accent); }
.ian-solo-movil { display: none !important; }
/* Menú de la cuenta (el avatar, en el móvil) */
.ian-cuenta { position: relative; }
.ian-cuenta > summary { list-style: none; cursor: pointer; }
.ian-cuenta > summary::-webkit-details-marker { display: none; }
.ian-cuenta > div { position: absolute; right: 0; top: 40px; z-index: 960; min-width: 220px; background: var(--ian-surface);
                    border: 1px solid var(--ian-line); display: flex; flex-direction: column; }
.ian-cuenta > div > a { padding: 12px 14px; border-bottom: 1px solid var(--ian-line-soft); font-size: 13px; color: var(--ian-ink);
                        text-decoration: none !important; }
.ian-cuenta > div > a:last-child { border-bottom: 0; }
.ian-top .ian-logo { display: flex; align-items: center; }
.ian-top .ian-logo svg { width: 84px; height: auto; fill: #000; display: block; }
.ian-top .ian-nav { display: flex; gap: 26px; flex-grow: 1; height: 100%; }
.ian-top .ian-nav a { display: flex; align-items: center; height: 100%; box-sizing: border-box;
                 border-bottom: 2px solid transparent; color: var(--ian-text-2); font-weight: 500;
                 text-decoration: none !important; }
.ian-top .ian-nav a:hover { color: var(--ian-ink); }
.ian-top .ian-nav a.activa { color: var(--ian-ink); border-bottom-color: var(--ian-ink); }
.ian-top .ian-usuario { display: flex; align-items: center; gap: 18px; font-size: 12px; }
.ian-top .ian-usuario a { color: var(--ian-text-2); font-weight: 500; text-decoration: none !important; }
.ian-top .ian-usuario a:hover, .ian-top .ian-usuario a.activa { color: var(--ian-ink); }
.ian-top .ian-avatar { display: inline-flex; align-items: center; gap: 8px; color: var(--ian-text-2); }
.ian-top .ian-avatar span { width: 26px; height: 26px; border-radius: 50%; background: #EDEDEA;
                            display: inline-flex; align-items: center; justify-content: center;
                            font-family: var(--ian-mono); font-size: 11px; color: var(--ian-ink); }

/* Miga de pan de las pantallas que aún tienen su propio diseño dentro de la barra común */
.ian-migas { max-width: 1400px; margin: 0 auto; padding: 28px 40px 0; box-sizing: border-box; display: flex;
             align-items: baseline; gap: 10px; font-family: var(--ian-sans); font-size: 13px; color: var(--ian-text-2); }
.ian-migas a { color: var(--ian-text-2); text-decoration: none; }
.ian-migas a:hover { color: var(--ian-ink); text-decoration: underline; }
.ian-migas b { color: var(--ian-ink); font-size: 20px; font-weight: 500; }
@media (max-width: 720px) { .ian-migas { padding: 20px 16px 0; } }

/* ── Tablas ─────────────────────────────────────────────────────────────── */
.ian-tabla-caja { overflow-x: auto; margin: 0 -20px; }
.ian-tabla { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ian-tabla th { text-align: left; font-family: var(--ian-mono); font-size: 10.5px; font-weight: 500; letter-spacing: .06em;
                text-transform: uppercase; color: var(--ian-text-2); padding: 8px 20px; border-bottom: 1px solid var(--ian-line); vertical-align: bottom; }
.ian-tabla td { padding: 9px 20px; border-bottom: 1px solid var(--ian-line-soft); vertical-align: top; }
.ian-tabla tr:last-child td { border-bottom: none; }
.ian-tabla .n { text-align: right; font-family: var(--ian-mono); white-space: nowrap; }
.ian-tabla .mono { font-family: var(--ian-mono); white-space: nowrap; }

/* ── Lista de productos desplegable (foto, datos y detalle) ─────────────── */
.ian-prods { margin: 6px -20px 0; }
.ian-prod-cab, .ian-prod > summary { display: grid; grid-template-columns: 64px minmax(0, 1.4fr) minmax(0, 1.6fr) 110px 150px;
                                      gap: 16px; align-items: center; padding: 10px 20px; }
.ian-prod-cab { padding-block: 6px; font-family: var(--ian-mono); font-size: 10.5px; font-weight: 500; letter-spacing: .06em;
                text-transform: uppercase; color: var(--ian-text-2); border-bottom: 1px solid var(--ian-line); }
.ian-prod-cab .n, .ian-prod > summary .n { text-align: right; font-family: var(--ian-mono); }
.ian-prod { border-bottom: 1px solid var(--ian-line-soft); }
.ian-prod:last-child { border-bottom: none; }
.ian-prod > summary { cursor: pointer; list-style: none; }
.ian-prod > summary::-webkit-details-marker { display: none; }
.ian-prod > summary:hover { background: var(--ian-surface-2); }
.ian-prod[open] > summary { background: var(--ian-surface-2); }
.ian-prod > summary .txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ian-prod > summary .txt b { color: var(--ian-ink); font-weight: 500; }
.ian-prod > summary .txt span { color: var(--ian-text-2); font-size: 12px; overflow-wrap: anywhere; }
.ian-prod > .ian-tabla-caja { margin: 0; padding: 0 20px 14px 100px; }
.ian-prod .ian-tabla th, .ian-prod .ian-tabla td { padding-left: 0; }
/* Fotos de producto: verticales 2:3 como las de IAMNUE (1365×2048) y enteras, sin recortar (Chucky, 16-oct-2026) */
.ian-foto { position: relative; width: 40px; height: 60px; box-sizing: border-box; display: flex; align-items: center;
            justify-content: center; background: #fff; border: 1px solid var(--ian-line); }
.ian-foto > img { width: 100%; height: 100%; object-fit: contain; }
.ian-foto > img.grande { display: none; position: fixed; right: 40px; top: 50%; transform: translateY(-50%); width: 300px;
                         height: 450px; max-width: none; max-height: calc(100vh - 48px); object-fit: contain; background: #fff;
                         border: 1px solid var(--ian-line-strong); z-index: 20; pointer-events: none; }
/* Fija al lateral de la ventana: nunca se corta al final de la lista ni tapa el nombre del producto */
.ian-foto:hover > img.grande { display: block; }
.ian-foto .sin { font-family: var(--ian-mono); font-size: 9px; color: var(--ian-text-3); text-align: center; }
.ian-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.ian-chips i { font-style: normal; font-family: var(--ian-mono); font-size: 11px; padding: 1px 6px; border: 1px solid var(--ian-line);
               background: #fff; white-space: nowrap; }
.ian-chips i.mas { color: var(--ian-text-2); }
@media (max-width: 720px) {
  .ian-prod-cab { display: none; }
  .ian-prod > summary { grid-template-columns: 56px minmax(0, 1fr) auto; row-gap: 6px; }
  .ian-prod > summary .ian-chips { grid-column: 2 / span 2; }
  .ian-prod > summary > .n { grid-column: 3; grid-row: 1; align-self: start; }
  .ian-prod > summary .n:last-child { display: none; }
  .ian-prod > .ian-tabla-caja { padding-left: 20px; }
  .ian-foto:hover > img.grande { display: none; }
}

/* ── Finanzas ───────────────────────────────────────────────────────────── */
.fin-margen td small { color: var(--ian-text-2); font-size: 11px; }
.fin-margen td.parcial { background: #FFFDF5; }
.fin-margen td .sd, .fin-margen td.sin_dato { color: var(--ian-text-3); font-size: 11px; }
.fin-margen td small.fin-bajo { color: var(--ian-text-3); }
.fin-margen td small.fin-bajo.alto { color: #D97706; }
.fin-cierre { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px; margin-top: 10px; }
.fin-mes { display: flex; flex-direction: column; gap: 3px; padding: 10px 12px; border: 1px solid var(--ian-line); border-left-width: 3px; }
.fin-mes span { color: var(--ian-text-2); font-size: 12px; }
.fin-mes.ok { border-left-color: var(--ian-ok); }
.fin-mes.falta { border-left-color: var(--ian-warn); }
.fin-mes .ian-btn { align-self: flex-start; margin-top: 4px; }
/* Finanzas (lote 7a): la fila de periodo y de canal */
.fin-periodo { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center; }
.fin-periodo .mono { font-family: var(--ian-mono); margin-left: 6px; }
.fin-liq { display: flex; flex-direction: column; gap: 16px; }
.ian-tabla td.c-r, .ian-tabla td.c-r b { color: var(--ian-danger-text); }
.fin-gastos input.fin-g { width: 84px; text-align: right; font: inherit; font-family: var(--ian-mono); border: 0; border-bottom: 1px solid var(--ian-line); background: transparent; padding: 3px 0; }
.fin-gastos input.fin-g:focus { outline: none; border-bottom-color: var(--ian-ink); }
.ian-tabla tr.sel td { background: var(--ian-accent-soft); }
.fin-mes.curso { border-left-color: var(--ian-line-strong); }

.ian-tabs-simples { display: flex; gap: 22px; border-bottom: 1px solid var(--ian-line); }
.ian-tabs-simples a { padding: 8px 0; color: var(--ian-text-2); text-decoration: none !important; border-bottom: 2px solid transparent; font-weight: 500; }
.ian-tabs-simples a.activa { color: var(--ian-ink); border-bottom-color: var(--ian-ink); }

/* ── Texto ──────────────────────────────────────────────────────────────── */
.ian-label { font-family: var(--ian-mono); font-size: 11px; font-weight: 500; letter-spacing: .06em;
             text-transform: uppercase; color: var(--ian-text-2); }
.ian-h1 { margin: 0; font-size: 22px; font-weight: 500; color: var(--ian-ink); line-height: 1.25; }
.ian-h2 { margin: 0; font-size: 15px; font-weight: 500; color: var(--ian-ink); }
.ian-sub { margin: 0; color: var(--ian-text-2); }
.ian-cabecera { display: flex; flex-direction: column; gap: 14px; }
.ian-cabecera > div:first-child { display: flex; flex-direction: column; gap: 6px; }

/* ── Sello de frescura ──────────────────────────────────────────────────── */
.ian-sello { display: flex; flex-wrap: wrap; gap: 6px 18px; font-family: var(--ian-mono); font-size: 11px;
             color: var(--ian-text-2); }
.ian-sello span { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.ian-punto { width: 7px; height: 7px; border-radius: 50%; display: inline-block; flex-shrink: 0; background: var(--ian-text-3); }
.ian-punto.ok { background: var(--ian-ok); }
.ian-punto.warn { background: var(--ian-warn); }
.ian-punto.danger { background: var(--ian-danger); }

/* ── Tarjetas ───────────────────────────────────────────────────────────── */
.ian-card { background: var(--ian-surface); border: 1px solid var(--ian-line); padding: 20px;
            display: flex; flex-direction: column; gap: 12px; min-width: 0; box-sizing: border-box; }
.ian-grid { display: grid; gap: 16px; }
.ian-grid.c2 { grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); }
.ian-grid.c3 { grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.ian-grid.c4 { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }

/* KPI */
.ian-kpi { gap: 8px; }
.ian-kpi .v { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.ian-kpi .v b { font-family: var(--ian-mono); font-size: 28px; font-weight: 500; color: var(--ian-ink); line-height: 1.1; }
.ian-kpi .v span { color: var(--ian-text-2); }
.ian-kpi .n { color: var(--ian-text-2); font-size: 12px; }

/* Lista de avisos «Te toca» */
.ian-avisos { display: flex; flex-direction: column; border-top: 1px solid var(--ian-line); }
.ian-aviso { display: grid; grid-template-columns: 3px 104px minmax(0, 1fr) auto; gap: 14px; align-items: center;
             padding: 12px 16px 12px 0; border-bottom: 1px solid var(--ian-line-soft); }
.ian-aviso .barra { align-self: stretch; background: var(--ian-text-3); }
.ian-aviso.danger .barra { background: var(--ian-danger); }
.ian-aviso.warn .barra { background: var(--ian-warn); }
.ian-aviso .txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ian-aviso .txt b { color: var(--ian-ink); font-weight: 500; }
.ian-aviso .txt span { color: var(--ian-text-2); font-size: 12px; }
.ian-aviso a.accion { font-weight: 500; white-space: nowrap; }
.ian-aviso-acc { display: flex; align-items: center; gap: 12px; white-space: nowrap; }
.ian-aviso-ocultar { background: none; border: 0; padding: 2px 0; font: inherit; font-size: 11.5px; color: var(--ian-text-3); cursor: pointer; }
.ian-aviso-ocultar:hover, .ian-aviso-ocultar:focus-visible { color: var(--ian-ink); text-decoration: underline; }
.ian-ocultos { margin-top: 10px; font-size: 12px; color: var(--ian-text-2); }
.ian-ocultos summary { cursor: pointer; }
.ian-ocultos ul { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ian-ocultos li { display: flex; justify-content: space-between; gap: 12px; align-items: baseline; }
.ian-vacio { padding: 28px 20px; border: 1px dashed #D4D4D4; background: var(--ian-surface-2);
             color: var(--ian-text-2); display: flex; flex-direction: column; gap: 4px; }
.ian-vacio b { color: var(--ian-ink); font-weight: 500; }

/* Tarjeta de aplicación o sección */
.ian-app { text-decoration: none !important; }
.ian-app:hover { border-color: var(--ian-line-strong); }
.ian-app .nombre { font-size: 16px; font-weight: 600; color: var(--ian-ink); }
.ian-app .pregunta { color: var(--ian-ink); }
.ian-app .cifras { color: var(--ian-text-2); font-size: 12px; border-top: 1px solid var(--ian-line-soft); padding-top: 10px; }
.ian-app .ir { font-weight: 500; color: var(--ian-ink); }
.ian-app.apagada { background: var(--ian-surface-2); }
.ian-app.apagada .ir { color: var(--ian-text-2); }

/* Píldoras y avisos de página */
.ian-pill { display: inline-flex; align-items: center; gap: 6px; height: 20px; padding: 0 8px; font-family: var(--ian-mono);
            font-size: 11px; white-space: nowrap; border: 1px solid var(--ian-line); background: #F3F3F1; color: #4A4A4A; }
.ian-pill.ok { background: var(--ian-ok-bg); border-color: var(--ian-ok-bd); color: var(--ian-ok-text); }
.ian-pill.warn { background: var(--ian-warn-bg); border-color: var(--ian-warn-bd); color: var(--ian-warn-text); }
.ian-pill.danger { background: var(--ian-danger-bg); border-color: var(--ian-danger-bd); color: var(--ian-danger-text); }
.ian-nota { padding: 12px 16px; border-left: 3px solid var(--ian-accent); background: var(--ian-accent-soft);
            color: var(--ian-accent-strong); }

/* Estrecho: logo y usuario arriba, las aplicaciones en una segunda fila */
@media (max-width: 980px) {
  :root { --ian-top-h: 92px; }   /* 48 + 43 + borde */
  body:has(.ian-top.con-sub) { --ian-top-h: 130px; }
  .ian-top { padding: 0 20px; }
  .ian-top-f1 { flex-wrap: wrap; align-content: flex-start; gap: 0 16px; height: auto; }
  .ian-top .ian-logo { height: 48px; }
  .ian-top .ian-usuario { flex: 1 1 0; min-width: 0; height: 48px; gap: 14px; overflow-x: auto; }
  .ian-top .ian-usuario > :first-child { margin-left: auto; }   /* a la derecha; si no cabe, se desplaza */
  .ian-top .ian-usuario > * { flex-shrink: 0; white-space: nowrap; }
  .ian-top .ian-usuario .ian-avatar em { display: none; }
  .ian-top .ian-nav { order: 3; flex-basis: 100%; height: 43px; box-sizing: border-box; gap: 22px; overflow-x: auto;
                      border-top: 1px solid var(--ian-line-soft); }
  .ian-top .ian-nav a { white-space: nowrap; }
}
@media (max-width: 720px) {
  .ian-top { padding: 0 16px; }
  .ian-solo-movil { display: flex !important; }
  .ian-solo-ancho { display: none !important; }
  .ian-top .ian-usuario { overflow: visible; justify-content: flex-end; }   /* el avatar a la derecha (el primer enlace está oculto) */
  .ian-top .ian-nav a.ian-solo-movil { font-weight: 600; color: var(--ian-ink); }
  .ian-main { padding: 20px 16px 40px; }
  .ian-aviso { grid-template-columns: 3px minmax(0, 1fr); row-gap: 6px; }
  .ian-aviso .barra { grid-column: 1; grid-row: 1 / span 3; }
  .ian-aviso .ian-label, .ian-aviso .txt, .ian-aviso a.accion, .ian-aviso .ian-aviso-acc { grid-column: 2; }
  .ian-sello { justify-content: flex-start; }
}

/* ══ Piezas de edición (sep-2026) ════════════════════════════════════════
 * Botón, campo, diálogo de confirmación, aviso breve y tira de pasos.
 * La API JS va en /static/ian.js (IAN.confirmar, IAN.mensaje, IAN.aviso,
 * IAN.ocupado, IAN.errorCampo) y la referencia viva, en /admin/componentes. */

/* ── Botones ─────────────────────────────────────────────────────────────
 * .ian-btn = secundario · .principal (una acción por bloque) · .peligro (borrar
 * o deshacer) · .peque para filas de tabla. Desactivado: disabled o
 * aria-disabled="true". Ocupado: aria-busy="true" (lo pone IAN.ocupado). */
.ian-btn { position: relative; overflow: hidden; display: inline-flex; align-items: center; justify-content: center;
           gap: 8px; height: 34px; padding: 0 16px; box-sizing: border-box; border: 1px solid transparent;
           border-radius: 0; font-family: var(--ian-sans); font-size: 13px; font-weight: 500; line-height: 1;
           white-space: nowrap; cursor: pointer; text-decoration: none !important;
           -webkit-appearance: none; appearance: none; }
.ian-btn:focus-visible { outline: 2px solid var(--ian-accent); outline-offset: 2px; }
/* Secundario, que es el de por defecto. El :not() le da más peso que «body.ian a» */
.ian-btn:not(.principal):not(.peligro) { background: var(--ian-surface); border-color: var(--ian-line-strong);
                                         color: var(--ian-ink); }
.ian-btn:not(.principal):not(.peligro):hover { border-color: var(--ian-ink); color: var(--ian-ink); }
.ian-btn.principal { background: var(--ian-ink); border-color: var(--ian-ink); color: #FFFFFF; }
.ian-btn.principal:hover { background: #333333; border-color: #333333; color: #FFFFFF; }
.ian-btn.peligro { background: var(--ian-danger); border-color: var(--ian-danger); color: #FFFFFF; }
.ian-btn.peligro:hover { background: var(--ian-danger-text); border-color: var(--ian-danger-text); color: #FFFFFF; }
.ian-btn.peque { height: 28px; padding: 0 10px; font-size: 12px; }
.ian-btn:disabled:not([aria-busy="true"]), .ian-btn[aria-disabled="true"]:not([aria-busy="true"]) {
  background: #F3F3F1 !important; border-color: var(--ian-line) !important; color: var(--ian-text-3) !important;
  cursor: not-allowed; }
a.ian-btn[aria-disabled="true"] { pointer-events: none; }
/* Ocupado: conserva su color (se ve cuál está trabajando) y una línea recorre el borde de abajo */
.ian-btn[aria-busy="true"] { cursor: progress; }
.ian-btn[aria-busy="true"]::after { content: ""; position: absolute; left: 0; bottom: 0; width: 35%; height: 2px;
                                    background: currentColor; animation: ian-ocupado 1.1s linear infinite; }
@keyframes ian-ocupado { from { transform: translateX(-100%); } to { transform: translateX(290%); } }
.ian-acciones { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

/* ── Campos ──────────────────────────────────────────────────────────────
 * <div class="ian-campo"> con su <label>, el control .ian-input (input, select o
 * textarea), .ian-ayuda y .ian-error. El error lo marca IAN.errorCampo
 * (aria-invalid + aria-describedby). Un importe dice en la etiqueta si lleva IVA. */
.ian-campos { display: grid; gap: 20px 28px; }
.ian-campos.c2 { grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.ian-campos .ancho { grid-column: 1 / -1; }
.ian-campo { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.ian-campo > label { font-family: var(--ian-mono); font-size: 11px; font-weight: 500; letter-spacing: .06em;
                     text-transform: uppercase; color: var(--ian-text); }
.ian-campo > label .iva { font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--ian-text-2); }
.ian-input { width: 100%; height: 36px; box-sizing: border-box; margin: 0; padding: 8px 0;
             border: 0; border-bottom: 1px solid var(--ian-text-3); border-radius: 0; background: transparent;
             font-family: var(--ian-sans); font-size: 13px; line-height: 1.4; color: var(--ian-ink);
             outline: none; -webkit-appearance: none; appearance: none; }
.ian-input::placeholder { color: var(--ian-text-2); opacity: 1; }   /* text-3 no llega a 4,5:1 sobre blanco */
.ian-input:hover { border-bottom-color: var(--ian-text-2); }
.ian-input:focus { border-bottom: 2px solid var(--ian-ink); padding-bottom: 7px; }
.ian-input.cifra { font-family: var(--ian-mono); }
select.ian-input { padding-right: 24px; cursor: pointer; background-repeat: no-repeat; background-position: right 4px center;
                   background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%236B6B6B' stroke-width='1.4'/%3E%3C/svg%3E"); }
/* El textarea lleva caja entera: con solo la línea de abajo no se ve que admite varias líneas */
textarea.ian-input { height: auto; min-height: 88px; padding: 8px 10px; resize: vertical; line-height: 1.5;
                     border: 1px solid var(--ian-text-3); background: var(--ian-surface); }
textarea.ian-input:focus { border: 1px solid var(--ian-ink); padding: 8px 10px; outline: 1px solid var(--ian-ink);
                           outline-offset: -2px; }
.ian-input:disabled { color: var(--ian-text-3); border-bottom: 1px dashed var(--ian-line-strong); cursor: not-allowed; }
textarea.ian-input:disabled { border: 1px dashed var(--ian-line-strong); background: var(--ian-surface-2); }
.ian-input[aria-invalid="true"], .ian-campo.con-error .ian-input { border-bottom-color: var(--ian-danger); }
textarea.ian-input[aria-invalid="true"], .ian-campo.con-error textarea.ian-input { border-color: var(--ian-danger); }
.ian-ayuda { margin: 0; font-size: 12px; color: var(--ian-text-2); }
.ian-error { margin: 0; font-size: 12px; font-weight: 500; color: var(--ian-danger-text); }

/* ── Diálogo de confirmación (lo crean IAN.confirmar e IAN.mensaje) ─────── */
html.ian-sin-scroll { overflow: hidden; }
.ian-dialogo { box-sizing: border-box; width: min(460px, calc(100vw - 32px)); max-width: none;
               max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px); margin: auto; padding: 0;
               overflow: auto; border: 1px solid var(--ian-ink); border-radius: 0; background: var(--ian-surface);
               color: var(--ian-text); font-family: var(--ian-sans); font-size: 13px; line-height: 1.5; }
.ian-dialogo::backdrop { background: rgba(0, 0, 0, .4); }
.ian-dialogo.peligro { border-top: 4px solid var(--ian-danger); }
.ian-dialogo .cuerpo { display: flex; flex-direction: column; gap: 10px; padding: 22px 24px 20px; }
.ian-dialogo h2 { margin: 0; font-size: 16px; font-weight: 500; line-height: 1.3; color: var(--ian-ink); }
.ian-dialogo p { margin: 0; white-space: pre-line; }
.ian-dialogo ul { margin: 0; padding-left: 18px; }
.ian-dialogo .irreversible { padding: 8px 12px; border-left: 3px solid var(--ian-danger); background: var(--ian-danger-bg);
                             color: var(--ian-danger-text); font-weight: 500; }
.ian-dialogo .acciones { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; padding: 14px 24px;
                         border-top: 1px solid var(--ian-line); background: var(--ian-surface-2); }
@media (max-width: 520px) {
  .ian-dialogo .cuerpo { padding: 18px 18px 16px; }
  .ian-dialogo .acciones { flex-direction: column; padding: 12px 18px; }
  .ian-dialogo .acciones .ian-btn { width: 100%; height: 40px; }
}

/* ── Aviso breve (lo crea IAN.aviso) ─────────────────────────────────────
 * Abajo a la derecha. El tipo va también escrito (no solo el color). Los de error
 * se quedan hasta cerrarlos; el resto se va solo y se para con el ratón o el foco. */
.ian-toasts { position: fixed; right: 24px; bottom: 24px; z-index: 1000; display: flex; flex-direction: column;
              gap: 8px; width: min(400px, calc(100vw - 32px)); pointer-events: none; }
.ian-toast { pointer-events: auto; box-sizing: border-box; display: flex; align-items: flex-start; gap: 12px;
             padding: 11px 10px 11px 14px; border: 1px solid var(--ian-line-strong); border-left: 4px solid var(--ian-accent);
             background: var(--ian-surface); color: var(--ian-ink); font-family: var(--ian-sans); font-size: 13px;
             line-height: 1.45; }
.ian-toast .txt { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
.ian-toast .tipo { font-family: var(--ian-mono); font-size: 10.5px; font-weight: 500; letter-spacing: .06em;
                   text-transform: uppercase; color: var(--ian-text-2); }
.ian-toast.ok { border-left-color: var(--ian-ok); background: var(--ian-ok-bg); }
.ian-toast.ok .tipo { color: var(--ian-ok-text); }
.ian-toast.warn { border-left-color: var(--ian-warn); background: var(--ian-warn-bg); }
.ian-toast.warn .tipo { color: var(--ian-warn-text); }
.ian-toast.error { border-left-color: var(--ian-danger); background: var(--ian-danger-bg); }
.ian-toast.error .tipo { color: var(--ian-danger-text); }
.ian-toast .cerrar { flex: none; width: 26px; height: 26px; margin: -3px 0; padding: 0; border: 0; border-radius: 0;
                     background: transparent; color: var(--ian-text-2); font-size: 18px; line-height: 1; cursor: pointer; }
.ian-toast .cerrar:hover { color: var(--ian-ink); }
.ian-toast .cerrar:focus-visible { outline: 2px solid var(--ian-accent); outline-offset: 0; }
@keyframes ian-entra { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (prefers-reduced-motion: no-preference) { .ian-toast { animation: ian-entra .18s ease-out; } }
@media (prefers-reduced-motion: reduce) {
  .ian-btn[aria-busy="true"]::after { width: 100%; opacity: .5; animation: none; }
}
@media (max-width: 720px) {
  .ian-toasts { left: 16px; right: 16px; bottom: calc(16px + env(safe-area-inset-bottom, 0px)); width: auto; }
}

/* ── Tira de pasos ───────────────────────────────────────────────────────
 * <ol class="ian-pasos"> con un <li class="hecho|actual|pendiente"> por paso; el
 * actual lleva aria-current="step". Dentro, .paso (un <a> si lleva a algún
 * sitio) con .num, .estado, .nombre, .cifra y .detalle. El estado va escrito. */
.ian-pasos { list-style: none; margin: 0; padding: 0; display: grid; grid-auto-flow: column;
             grid-auto-columns: minmax(0, 1fr); background: var(--ian-surface); border: 1px solid var(--ian-line); }
.ian-pasos > li { display: flex; min-width: 0; border-top: 3px solid var(--paso, var(--ian-line)); }
.ian-pasos > li + li { border-left: 1px solid var(--ian-line-soft); }
.ian-pasos > li.hecho { --paso: var(--ian-ok); }
.ian-pasos > li.actual { --paso: var(--ian-accent); background: var(--ian-accent-soft); }
.ian-pasos > li > .paso { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; padding: 12px 16px 14px;
                          color: var(--ian-text); text-decoration: none !important; }
.ian-pasos > li > a.paso:hover { background: var(--ian-surface-2); color: var(--ian-text); }
.ian-pasos > li.actual > a.paso:hover { background: #E3EBF8; }
.ian-pasos > li > a.paso:focus-visible { outline: 2px solid var(--ian-accent); outline-offset: -2px; }
.ian-pasos .cab { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.ian-pasos .num { font-family: var(--ian-mono); font-size: 11px; color: var(--ian-text-2); }
.ian-pasos .estado { font-family: var(--ian-mono); font-size: 10.5px; font-weight: 500; letter-spacing: .06em;
                     text-transform: uppercase; white-space: nowrap; color: var(--ian-text-2); }
.ian-pasos > li.hecho .estado { color: var(--ian-ok-text); }
.ian-pasos > li.actual .estado { color: var(--ian-accent); }
.ian-pasos .nombre { font-weight: 500; color: var(--ian-ink); }
.ian-pasos .cifra { font-family: var(--ian-mono); font-size: 18px; font-weight: 500; line-height: 1.2; color: var(--ian-ink); }
.ian-pasos .cifra small { font-family: var(--ian-sans); font-size: 12px; font-weight: 400; color: var(--ian-text-2); }
.ian-pasos .detalle { font-size: 12px; color: var(--ian-text-2); }
.ian-pasos > li.pendiente .nombre, .ian-pasos > li.pendiente .cifra { color: var(--ian-text-2); }
@media (max-width: 720px) {
  .ian-pasos { grid-auto-flow: row; grid-auto-columns: auto; }
  .ian-pasos > li, .ian-pasos > li + li { border-top: 0; border-left: 3px solid var(--paso, var(--ian-line)); }
  .ian-pasos > li + li { border-top: 1px solid var(--ian-line-soft); }
}

/* ══ Piezas comunes (revisión de diseño, lote 1 · 21-oct-2026) ═══════════
 * Escala tipográfica, cabecera, «Hoy» y acción del día, cifras con comparación, filtros, menú «⋯», cajón,
 * lista de producto, calendario y gráficas. Referencia viva en /admin/componentes y reglas en
 * docs/revision-diseno/nivel-2.md («Tipografía y gráficas»). Cada pantalla las adopta en su lote
 * (docs/revision-diseno/nivel-4.md): hasta entonces no cambian nada de lo que ya se ve. */

/* ── Escala tipográfica única: no usar otros tamaños ─────────────────────── */
:root {
  --ian-t-h1: 22px;        /* título de página */
  --ian-t-h2: 15px;        /* título de bloque · cifra en una fila */
  --ian-t-texto: 13px;     /* texto, título de una acción, botón */
  --ian-t-fila: 12.5px;    /* filas de tabla y de lista */
  --ian-t-sec: 12px;       /* texto secundario */
  --ian-t-etiqueta: 11px;  /* etiqueta en mayúsculas, píldora, nota, fecha (Mono) */
  --ian-t-th: 10.5px;      /* cabecera de tabla (Mono) */
  --ian-t-kpi: 28px;       /* cifra KPI (Mono) */
  --ian-t-cifra: 24px;     /* cifra de ficha de canal, talla en el escáner (Mono) */
  --ian-t-eje: 10px;       /* ejes de gráfica (Mono) */
}
.ian-cifra { font-family: var(--ian-mono); font-variant-numeric: tabular-nums; }

/* ── Cabecera de página: miga y h1 a la izquierda; sello plegado y «?» a la derecha ── */
.ian-cab { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px 24px; flex-wrap: wrap; }
.ian-cab > .t { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ian-cab > .der { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }

/* Sello plegado: una línea («5 fuentes atrasadas ▾») que despliega cada fuente con su fecha */
.ian-sello-p { position: relative; font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-sello-p > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; padding: 4px 0; }
.ian-sello-p > summary::-webkit-details-marker { display: none; }
.ian-sello-p > summary::after { content: "▾"; }
.ian-sello-p[open] > summary::after { content: "▴"; }
.ian-sello-p > ul { position: absolute; right: 0; top: 100%; z-index: 30; margin: 4px 0 0; padding: 10px 14px; list-style: none;
                    background: var(--ian-surface); border: 1px solid var(--ian-line); display: flex; flex-direction: column;
                    gap: 4px; white-space: nowrap; }
.ian-sello-p li { display: flex; align-items: center; gap: 6px; }

/* «?» plegable: la explicación que no va en la pantalla */
.ian-q { position: relative; }
.ian-q > summary { list-style: none; cursor: pointer; width: 22px; height: 22px; display: inline-flex; align-items: center;
                   justify-content: center; border: 1px solid var(--ian-line-strong); background: var(--ian-surface);
                   font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-q > summary::-webkit-details-marker { display: none; }
.ian-q > div { position: absolute; right: 0; top: 28px; z-index: 30; width: min(360px, 80vw); box-sizing: border-box;
               padding: 12px 14px; background: var(--ian-surface); border: 1px solid var(--ian-line);
               font-size: var(--ian-t-sec); line-height: 1.5; color: var(--ian-text); }

/* ── «Hoy» y la acción del día ─────────────────────────────────────────────
 * Una acción: número · píldora y área · qué hacer y porqué en una línea · € con su base · un botón · «⋯».
 * .danger rojo (bloquea o se pierde venta) · .warn ámbar · sin clase, gris. .compacta, dentro de una tarjeta. */
.ian-hoy { display: flex; flex-direction: column; gap: 10px; }
.ian-hoy-cab { display: flex; align-items: baseline; gap: 6px 20px; flex-wrap: wrap; }
.ian-hoy-cab h2 { margin: 0; font-size: var(--ian-t-h2); font-weight: 500; color: var(--ian-ink); }
.ian-hoy-cab .res { font-family: var(--ian-mono); font-size: var(--ian-t-sec); color: var(--ian-text-2); }
.ian-hoy-cab .res b { font-size: var(--ian-t-h2); font-weight: 500; color: var(--ian-ink); }
.ian-accion { display: grid; grid-template-columns: 28px 150px minmax(0, 1fr) 170px 160px 34px; gap: 16px; align-items: center;
              background: var(--ian-surface); border: 1px solid var(--ian-line); border-left: 3px solid var(--ian-line-strong);
              padding: 14px 12px 14px 16px; }
.ian-accion.danger { border-left-color: var(--ian-danger); }
.ian-accion.warn { border-left-color: var(--ian-warn); }
.ian-accion > .n { font-family: var(--ian-mono); font-size: var(--ian-t-h2); color: var(--ian-text-3); }
.ian-accion > .tipo { display: flex; flex-direction: column; gap: 3px; align-items: flex-start; min-width: 0; }
.ian-accion > .tipo .area { font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); letter-spacing: .06em;
                            text-transform: uppercase; color: var(--ian-text-3); }
.ian-accion > .txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ian-accion > .txt b { font-size: var(--ian-t-texto); font-weight: 500; color: var(--ian-ink); }
.ian-accion > .txt span { font-size: var(--ian-t-sec); color: var(--ian-text-2); }
.ian-accion > .eur { font-family: var(--ian-mono); text-align: right; line-height: 1.25; }
.ian-accion > .eur b { display: block; font-size: var(--ian-t-h2); font-weight: 500; color: var(--ian-ink); }
.ian-accion > .eur span { font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-accion.compacta { grid-template-columns: 24px minmax(0, 1fr) auto; gap: 6px 12px; padding: 10px 12px; }
.ian-accion.compacta > .n { grid-row: 1 / span 3; align-self: start; }
.ian-accion.compacta > .tipo { grid-column: 2; flex-direction: row; align-items: center; gap: 8px; }
.ian-accion.compacta > .txt, .ian-accion.compacta > .eur { grid-column: 2; }
.ian-accion.compacta > .eur { text-align: left; }
.ian-accion.compacta > .eur b { display: inline; margin-right: 6px; }
.ian-accion.compacta > .bt { grid-column: 3; grid-row: 1 / span 3; align-self: center; }
.ian-accion:not(.compacta) > .bt .ian-btn { width: 100%; }   /* columna fija: los botones alinean entre filas */
.ian-accion.compacta > .eur:empty, .ian-accion.compacta > .ian-mas { display: none; }
.ian-plegados { display: flex; gap: 8px 20px; flex-wrap: wrap; font-size: var(--ian-t-sec); color: var(--ian-text-2); }
.ian-plegados > details { margin: 0; }
.ian-plegados > details > summary { cursor: pointer; color: var(--ian-ink); font-weight: 500; }
.ian-plegados > details[open] { flex-basis: 100%; }
.ian-plegados > details > .ian-hoy { margin-top: 10px; }

/* La nota del analista encima de una lista (el resumen de «Hoy»): .viejo si ya no cuadra con lo de debajo */
.ian-nota-analista { background: var(--ian-surface); border: 1px solid var(--ian-line); border-left: 3px solid var(--ian-ink);
                     padding: 12px 16px; display: flex; flex-direction: column; gap: 4px; line-height: 1.55; }
.ian-nota-analista .k { font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); font-weight: 500; letter-spacing: .06em;
                        text-transform: uppercase; color: var(--ian-text-2); }
.ian-nota-analista .t p { margin: 0; }
.ian-nota-analista[hidden] { display: none; }
.ian-nota-analista.viejo { border-left-color: var(--ian-line-strong); color: var(--ian-text-2); }

/* Inicio: el escáner, primero en el móvil; «Cómo va» */
.ian-ini-escanear { min-height: 44px; }
.ian-como-va { display: flex; flex-direction: column; gap: 10px; }
@media (max-width: 720px) { .ian-grid.c3.ian-cifras { grid-template-columns: minmax(0, 1fr) !important; } }   /* tres cifras: una columna en el móvil; cuatro, dos */

/* Menú «⋯»: Hecho, Mañana, Ocultar y lo que no es la acción principal */
.ian-mas { position: relative; }
.ian-mas > summary { list-style: none; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center;
                     cursor: pointer; color: var(--ian-text-2); font-size: 16px; border: 1px solid transparent; }
.ian-mas > summary::-webkit-details-marker { display: none; }
.ian-mas > summary:hover, .ian-mas[open] > summary { border-color: var(--ian-line); }
.ian-mas > summary:focus-visible { outline: 2px solid var(--ian-accent); outline-offset: 2px; }
.ian-mas > div { position: absolute; right: 0; top: 34px; z-index: 30; min-width: 170px; background: var(--ian-surface);
                 border: 1px solid var(--ian-line); display: flex; flex-direction: column; }
.ian-mas > div > button, .ian-mas > div > a { background: none; border: 0; border-bottom: 1px solid var(--ian-line-soft);
                 padding: 9px 12px; text-align: left; font: inherit; font-size: var(--ian-t-fila); color: var(--ian-ink);
                 cursor: pointer; text-decoration: none !important; white-space: nowrap; }
.ian-mas > div > :last-child { border-bottom: 0; }
.ian-mas > div > :hover { background: var(--ian-surface-2); }
@media (max-width: 980px) {
  .ian-accion:not(.compacta) { grid-template-columns: 24px minmax(0, 1fr) 34px; gap: 8px 10px;
                               grid-template-areas: "n tipo mas" "n txt txt" "n eur eur" "n bt bt"; }
  .ian-accion:not(.compacta) > .n { grid-area: n; align-self: start; }
  .ian-accion:not(.compacta) > .tipo { grid-area: tipo; flex-direction: row; align-items: center; gap: 8px; }
  .ian-accion:not(.compacta) > .txt { grid-area: txt; }
  .ian-accion:not(.compacta) > .eur { grid-area: eur; text-align: left; }
  .ian-accion:not(.compacta) > .eur b { display: inline; margin-right: 6px; }
  .ian-accion:not(.compacta) > .bt { grid-area: bt; }
  .ian-accion:not(.compacta) > .ian-mas { grid-area: mas; justify-self: end; }
}
@media (max-width: 720px) {
  .ian-accion:not(.compacta) > .bt .ian-btn { width: 100%; }
  /* compacta en el móvil: el botón debajo, que el texto tenga todo el ancho */
  .ian-accion.compacta { grid-template-columns: 24px minmax(0, 1fr); }
  .ian-accion.compacta > .bt { grid-column: 2; grid-row: auto; }
}

/* ── Cifras con comparación y tendencia (sobre .ian-kpi) ────────────────── */
.ian-kpi .cmp { font-family: var(--ian-mono); font-size: var(--ian-t-sec); color: var(--ian-text-2); }
.ian-kpi .cmp.sube { color: var(--ian-ok-text); }
.ian-kpi .cmp.baja { color: var(--ian-danger-text); }
.ian-kpi .ir { margin-top: auto; font-size: var(--ian-t-sec); font-weight: 500; color: var(--ian-ink); }
.ian-kpi.canal .v b { font-size: var(--ian-t-cifra); }
a.ian-kpi { text-decoration: none !important; }
a.ian-kpi:hover { border-color: var(--ian-line-strong); }
@media (max-width: 720px) {
  .ian-cifras { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; gap: 10px; }
  .ian-cifras .ian-kpi { padding: 14px; }
  .ian-cifras .ian-kpi .v b { font-size: 22px; }
}

/* ── Filtros (un solo comportamiento): botones con aria-pressed ─────────── */
.ian-filtros { display: flex; gap: 6px; flex-wrap: wrap; }
.ian-filtro { height: 28px; padding: 0 10px; display: inline-flex; align-items: center; gap: 6px; box-sizing: border-box;
              border: 1px solid var(--ian-line); background: var(--ian-surface); font: inherit; font-size: var(--ian-t-fila);
              color: var(--ian-text); cursor: pointer; white-space: nowrap; }
.ian-filtro:hover { border-color: var(--ian-line-strong); }
.ian-filtro[aria-pressed="true"] { background: var(--ian-ink); border-color: var(--ian-ink); color: #fff; }
.ian-filtro b { font-family: var(--ian-mono); font-weight: 500; }
.ian-filtro:focus-visible { outline: 2px solid var(--ian-accent); outline-offset: 2px; }
@media (max-width: 720px) { .ian-filtro { height: 40px; } }

/* ── Cajón: la ficha de algo (producto, persona, precio), siempre igual ─── */
.ian-velo { position: fixed; inset: 0; background: rgba(0, 0, 0, .18); z-index: 950; }
.ian-cajon { position: fixed; top: 0; right: 0; bottom: 0; z-index: 951; width: min(960px, 100vw); box-sizing: border-box;
             background: var(--ian-surface); border-left: 1px solid var(--ian-line); overflow-y: auto;
             padding: 22px 24px 40px; display: flex; flex-direction: column; gap: 16px; font-family: var(--ian-sans);
             font-size: var(--ian-t-texto); color: var(--ian-text); }
.ian-cajon-cab { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; }
.ian-cajon-cab h2 { margin: 0; font-size: 18px; font-weight: 500; color: var(--ian-ink); }
.ian-cajon-cab .sub { font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-cajon-cerrar { flex-shrink: 0; width: 34px; height: 34px; border: 1px solid var(--ian-line); background: var(--ian-surface);
                    cursor: pointer; font-size: 14px; color: var(--ian-ink); }
.ian-cajon .sec { border-top: 1px solid var(--ian-line-soft); padding-top: 12px; display: flex; flex-direction: column; gap: 8px;
                  min-width: 0; }
.ian-cajon .sec > h3 { margin: 0; font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); font-weight: 500;
                       letter-spacing: .06em; text-transform: uppercase; color: var(--ian-text-2); }
.ian-cajon .dos { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; }
@media (max-width: 720px) { .ian-cajon { padding: 16px; } .ian-cajon-cab { position: sticky; top: -16px; background: var(--ian-surface); padding-top: 4px; z-index: 1; } }

/* ── Lista de producto (la de «Buscar un producto»; IAN.lista la pinta) ── */
.ian-lp-caja { overflow-x: auto; margin: 0 -20px; }
.ian-lp { width: 100%; border-collapse: collapse; font-size: var(--ian-t-fila); }
.ian-lp th { text-align: left; font-family: var(--ian-mono); font-size: var(--ian-t-th); font-weight: 500; letter-spacing: .06em;
             text-transform: uppercase; color: var(--ian-text-2); padding: 8px 12px; border-bottom: 1px solid var(--ian-line);
             white-space: nowrap; vertical-align: bottom; }
.ian-lp th:first-child, .ian-lp td:first-child { padding-left: 20px; }
.ian-lp th:last-child, .ian-lp td:last-child { padding-right: 20px; }
.ian-lp td { padding: 9px 12px; border-bottom: 1px solid var(--ian-line-soft); vertical-align: middle; }
.ian-lp tr:last-child td { border-bottom: 0; }
.ian-lp .r { text-align: right; font-family: var(--ian-mono); white-space: nowrap; }
.ian-lp .ck { width: 20px; padding-right: 0; }
.ian-lp tbody tr[data-id] { cursor: pointer; }
.ian-lp tbody tr[data-id]:hover td { background: var(--ian-surface-2); }
.ian-lp tbody tr.sel td { background: var(--ian-accent-soft); }
.ian-lp-prod { display: flex; gap: 12px; align-items: center; min-width: 0; }
.ian-lp-prod b { display: block; color: var(--ian-ink); font-weight: 500; }
.ian-lp-prod span { font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-foto.p32 { width: 32px; height: 48px; flex-shrink: 0; }
.ian-tallas { display: flex; gap: 3px; flex-wrap: wrap; max-width: 270px; }
.ian-talla { min-width: 32px; height: 22px; padding: 0 5px; box-sizing: border-box; display: inline-flex; align-items: center;
             justify-content: center; font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); white-space: nowrap;
             border: 1px solid var(--ian-line); color: var(--ian-text-3); background: var(--ian-surface); }
.ian-talla.t { background: var(--ian-ink); border-color: var(--ian-ink); color: #fff; }          /* en tienda */
.ian-talla.a { border-color: var(--ian-accent); color: var(--ian-accent); background: var(--ian-accent-soft); font-weight: 500; } /* bajar del almacén */
.ian-talla.ta { background: var(--ian-ink); border-color: var(--ian-ink); color: #fff; box-shadow: inset 0 -3px 0 var(--ian-accent); } /* en los dos */
.ian-mix { display: inline-flex; width: 70px; height: 5px; background: var(--ian-line-soft); vertical-align: middle; }
.ian-mix i { display: block; height: 100%; }
.ian-mix .tienda { background: var(--ian-ink); } .ian-mix .online { background: var(--ian-online); }
.ian-mix .farfetch { background: var(--ian-accent); } .ian-mix .cettire { background: #7A93C9; }
.ian-mix .jente { background: #C9B27C; } .ian-mix .b2b { background: #9CA3AF; }
.ian-lote { display: flex; align-items: center; gap: 8px 10px; flex-wrap: wrap; background: var(--ian-accent-soft);
            border-left: 3px solid var(--ian-accent); padding: 10px 14px; font-size: var(--ian-t-fila); }
.ian-lote b { font-family: var(--ian-mono); font-weight: 500; }
.ian-lote .quitar { background: none; border: 0; font: inherit; font-size: var(--ian-t-sec); color: var(--ian-text-2);
                    cursor: pointer; text-decoration: underline; padding: 4px; }
@media (max-width: 720px) {
  .ian-lp thead { display: none; }
  .ian-lp, .ian-lp tbody, .ian-lp tr, .ian-lp td { display: block; width: 100%; box-sizing: border-box; }
  .ian-lp tbody tr { position: relative; padding: 12px 20px 12px 52px; border-bottom: 1px solid var(--ian-line-soft); }
  .ian-lp td, .ian-lp td:first-child, .ian-lp td:last-child { border: 0; padding: 3px 0; }
  .ian-lp td.ck { position: absolute; left: 20px; top: 16px; width: auto; }
  .ian-lp td.r { text-align: left; }
  .ian-lp td[data-l]::before { content: attr(data-l); display: inline-block; min-width: 72px; font-family: var(--ian-mono);
                               font-size: var(--ian-t-etiqueta); text-transform: uppercase; letter-spacing: .06em; color: var(--ian-text-3); }
  .ian-lote { position: sticky; bottom: 0; z-index: 5; }
}

/* ── Calendario (mes o semana) ──────────────────────────────────────────── */
.ian-cal { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 1px; background: var(--ian-line-soft);
           border: 1px solid var(--ian-line-soft); }
.ian-cal > .cab { background: var(--ian-surface-2); padding: 6px; text-align: center; font-family: var(--ian-mono);
                  font-size: var(--ian-t-etiqueta); letter-spacing: .06em; text-transform: uppercase; color: var(--ian-text-2); }
.ian-cal > .dia { background: var(--ian-surface); min-height: 72px; padding: 6px; display: flex; flex-direction: column; gap: 3px;
                  font-size: var(--ian-t-sec); min-width: 0; }
.ian-cal > .dia .num { font-family: var(--ian-mono); font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); }
.ian-cal > .dia.hoy .num { color: var(--ian-accent); font-weight: 600; }
.ian-cal > .dia.fuera { background: var(--ian-surface-2); color: var(--ian-text-3); }
.ian-cal > button.dia { border: 0; text-align: left; font: inherit; cursor: pointer; }
.ian-cal > button.dia:hover { background: var(--ian-surface-2); }
.ian-cal .marca { display: block; padding: 1px 5px; font-size: var(--ian-t-etiqueta); white-space: nowrap; overflow: hidden;
                  text-overflow: ellipsis; background: var(--ian-accent-soft); border-left: 2px solid var(--ian-accent); color: var(--ian-ink); }
.ian-cal .marca.ok { background: var(--ian-ok-bg); border-left-color: var(--ian-ok); }
.ian-cal .marca.warn { background: var(--ian-warn-bg); border-left-color: var(--ian-warn); }
.ian-cal .marca.danger { background: var(--ian-danger-bg); border-left-color: var(--ian-danger); }
@media (max-width: 720px) { .ian-cal > .dia { min-height: 48px; } }

/* ── Gráficas (graficas.js · IANGraficas.monta): al ancho real del sitio, nunca estiradas ── */
.ian-graf { width: 100%; min-width: 0; }
.ian-graf svg { display: block; }
.ian-graf .gr-ley, .ian-ley { display: flex; flex-wrap: wrap; gap: 12px; font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); margin-top: 6px; }
.ian-graf .gr-ley i, .ian-ley i { display: inline-block; width: 10px; height: 10px; margin-right: 5px; vertical-align: -1px; }
.ian-graf .gr-nota { font-size: var(--ian-t-etiqueta); color: var(--ian-text-2); margin: 6px 0 0; }
.ian-graf .gr-tabla { overflow-x: auto; }
