/* GENERADO por scripts/leadz-generar-vistas.mjs desde leadz-dz-acceso-estilos.js#CSS_DZ_ACCESO + leadz-entrada.js#CSS_ENTRADA (vista entrada, css). No se edita a mano. */
/* Tokens del DS: primitivos y semánticos universales.
   Generado por generador/generar.mjs desde tokens/*.json. No se edita a mano: se cambia la fuente y se regenera. */
@layer reset, dz.tokens, dz.base, dz.componentes;
@layer dz.tokens {
  :root {
    color-scheme: light;
    --c-gris-0: #ffffff;
    --c-gris-20: #fafafa;
    --c-gris-43: #f4f4f4;
    --c-gris-47: #f3f3f3;
    --c-gris-71: #ededed;
    --c-gris-86: #e9e9e9;
    --c-gris-98: #e6e6e6;
    --c-gris-106: #e4e4e4;
    --c-gris-137: #dcdcdc;
    --c-gris-149: #d9d9d9;
    --c-gris-176: #d2d2d2;
    --c-gris-188: #cfcfcf;
    --c-gris-310: #b0b0b0;
    --c-gris-404: #989898;
    --c-gris-451: #8c8c8c;
    --c-gris-537: #767676;
    --c-gris-580: #6b6b6b;
    --c-gris-608: #646464;
    --c-gris-647: #5a5a5a;
    --c-gris-733: #444444;
    --c-gris-753: #3f3f3f;
    --c-gris-773: #3a3a3a;
    --c-gris-827: #2c2c2c;
    --c-gris-835: #2a2a2a;
    --c-gris-851: #262626;
    --c-gris-859: #242424;
    --c-gris-867: #222222;
    --c-gris-886: #1d1d1d;
    --c-gris-914: #161616;
    --c-gris-922: #141414;
    --c-gris-961: #0a0a0a;
    --c-gris-1000: #000000;
    --c-negro-5: rgba(0,0,0,.05);
    --c-tinta-suave-6: rgba(10,10,10,.06);
    --c-negro-7: rgba(0,0,0,.07);
    --c-negro-12: rgba(0,0,0,.12);
    --c-negro-18: rgba(0,0,0,.18);
    --c-negro-40: rgba(0,0,0,.4);
    --c-negro-42: rgba(0,0,0,.42);
    --c-negro-46: rgba(0,0,0,.46);
    --c-negro-44: rgba(0,0,0,.44);
    --c-negro-55: rgba(0,0,0,.55);
    --c-negro-58: rgba(0,0,0,.58);
    --c-negro-60: rgba(0,0,0,.6);
    --c-negro-suave-46: rgba(10,10,10,.46);
    --c-blanco-5: rgba(255,255,255,.05);
    --c-blanco-6: rgba(255,255,255,.06);
    --c-blanco-8: rgba(255,255,255,.08);
    --c-blanco-13: rgba(255,255,255,.13);
    --c-blanco-20: rgba(255,255,255,.2);
    --c-blanco-34: rgba(255,255,255,.34);
    --c-blanco-37: rgba(255,255,255,.37);
    --c-blanco-36: rgba(255,255,255,.36);
    --c-blanco-45: rgba(255,255,255,.45);
    --c-tinta-azul-8: rgba(16,24,40,.08);
    --c-tinta-azul-20: rgba(16,24,40,.2);
    --c-azul-50-19: oklch(50% 0.19 262);
    --c-azul-58-3: oklch(58% 0.03 262);
    --c-azul-62-17: oklch(62% 0.17 262);
    --c-azul-66-3: oklch(66% 0.03 262);
    --c-verde-26-4: oklch(26% 0.04 178);
    --c-verde-40-10: oklch(40% 0.10 172);
    --c-verde-50-12: oklch(50% 0.12 172);
    --c-verde-74-12: oklch(74% 0.12 178);
    --c-verde-94-4: oklch(94% 0.04 172);
    --c-ambar-28-6: oklch(28% 0.06 75);
    --c-ambar-46-11: oklch(46% 0.11 70);
    --c-ambar-62-14: oklch(62% 0.14 70);
    --c-ambar-62-15: oklch(62% 0.15 70);
    --c-ambar-78-12: oklch(78% 0.12 75);
    --c-ambar-78-14: oklch(78% 0.14 75);
    --c-ambar-95-6: oklch(95% 0.06 80);
    --c-rojo-16-5: oklch(16% 0.05 25);
    --c-rojo-27-6: oklch(27% 0.06 25);
    --c-rojo-46-17: oklch(46% 0.17 25);
    --c-rojo-53-19: oklch(53% 0.19 25);
    --c-rojo-66-15: oklch(66% 0.15 25);
    --c-rojo-72-16: oklch(72% 0.16 25);
    --c-rojo-95-4: oklch(95% 0.04 25);
    --c-llamar-50-13: oklch(50% 0.13 150);
    --c-llamar-66-12: oklch(66% 0.12 150);
    --c-wa-16-6: oklch(16% 0.06 150);
    --c-wa-54-16: oklch(54% 0.16 150);
    --c-wa-74-16: oklch(74% 0.16 146);
    --c-azul-94-3: oklch(94% 0.03 262);
    --c-azul-40-9: oklch(40% 0.09 262);
    --c-azul-32-5: oklch(32% 0.05 262);
    --c-azul-86-6: oklch(86% 0.06 262);
    --c-verde-94-3: oklch(94% 0.03 150);
    --c-verde-40-9: oklch(40% 0.09 150);
    --c-verde-32-5: oklch(32% 0.05 150);
    --c-verde-86-6: oklch(86% 0.06 150);
    --c-ambar-94-3: oklch(94% 0.03 75);
    --c-ambar-40-9: oklch(40% 0.09 75);
    --c-ambar-32-5: oklch(32% 0.05 75);
    --c-ambar-86-6: oklch(86% 0.06 75);
    --c-rosa-94-3: oklch(94% 0.03 350);
    --c-rosa-40-9: oklch(40% 0.09 350);
    --c-rosa-32-5: oklch(32% 0.05 350);
    --c-rosa-86-6: oklch(86% 0.06 350);
    --c-violeta-94-3: oklch(94% 0.03 300);
    --c-violeta-40-9: oklch(40% 0.09 300);
    --c-violeta-32-5: oklch(32% 0.05 300);
    --c-violeta-86-6: oklch(86% 0.06 300);
    --c-turquesa-94-3: oklch(94% 0.03 195);
    --c-turquesa-40-9: oklch(40% 0.09 195);
    --c-turquesa-32-5: oklch(32% 0.05 195);
    --c-turquesa-86-6: oklch(86% 0.06 195);
    --medida: 72ch;
    --font: 'Inter', 'Inter fallback', system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif;
    --mono-code: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
    --lh-1: 1.2;
    --lh-2: 1.35;
    --lh-3: 1.5;
    --font-datos: var(--font);
    --fs-1: 12px;
    --fs-2: 14px;
    --fs-3: var(--fs-2);
    --fs-4: 16px;
    --fs-5: 18px;
    --fs-6: 22px;
    --fs-7: 28px;
    --ico-1: 16px;
    --ico-2: 16px;
    --ico-3: 20px;
    --ico-boton: 18px;
    --ico-boton-solo: 18px;
    --ico-4: 24px;
    --ico-5: var(--ico-4);
    --op-off: .45;
    --r-1: 4px;
    --r-2: 8px;
    --r-3: 12px;
    --r-4: 18px;
    --s-1: 4px;
    --s-2: 8px;
    --s-3: 12px;
    --s-4: 16px;
    --s-5: 20px;
    --s-6: 24px;
    --s-7: 32px;
    --s-8: 48px;
    --dur-1: 120ms;
    --dur-2: 200ms;
    --dur-3: 320ms;
    --ease-out: cubic-bezier(.2, 0, 0, 1);
    --ease-enfasis: cubic-bezier(.16, 1, .3, 1);
    --ease-velo: cubic-bezier(.4, 0, .2, 1);
    --dur-4: 400ms;
    --dur-respira: 900ms;
    --dur-rapida: var(--dur-1);
    --dur-base: var(--dur-2);
    --dur-media: var(--dur-3);
    --dur-lenta: var(--dur-4);
    --ease-sale: var(--ease-out);
    --z-sticky: 5;
    --z-drawer: 30;
    --z-dropdown: 40;
    --z-fab: 50;
    --z-modal: 100;
    --z-toast: 9500;
    --z-hoja: 9000;
    --z-base: 1;
    --z-cajon-velo: 55;
    --z-cajon: 60;
    --z-bloqueo: 10001;
    --z-velo-entrada: 10002;
    --r-chip: 999px;
    --r-control: var(--r-2);
    --r-input: var(--r-2);
    --r-btn: 999px;
    --r-card: var(--r-3);
    --r-pill: 999px;
    --h-control: 38px;
    --h-control-sm: 30px;
    --h-control-xs: 28px;
    --h-barra: 36px;
    --h-tactil: 44px;
    --h-mini: 24px;
    --h-chip: 26px;
    --h-btn-ico: 32px;
    --h-filtro: 34px;
    --h-fila: 40px;
    --h-fila-2: 54px;
    --h-mov: 48px;
    --aro: 0 0 0 2px var(--surface);
    --shadow-sm: none;
    --shadow-md: 0 10px 28px -14px var(--c-negro-18), 0 0 0 1px var(--c-negro-5);
    --ring: 0 0 0 1.5px var(--focus);
    --ring-soft: 0 0 0 1.5px color-mix(in oklch, var(--focus) 70%, transparent);
    --ring-inset: inset 0 0 0 1.5px var(--focus);
    --accent-breath: color-mix(in oklch, var(--focus) 70%, transparent);
    --ring-0: 0 0 0 0 var(--focus);
    --bg: var(--c-gris-43);
    --surface: var(--c-gris-20);
    --surface-2: var(--c-gris-71);
    --surface-3: var(--c-gris-106);
    --field: var(--c-gris-0);
    --surface-anidada: var(--c-gris-47);
    --border: var(--c-negro-7);
    --line-2: var(--c-negro-12);
    --border-control: var(--c-negro-46);
    --field-line: var(--c-negro-46);
    --hairline: var(--c-tinta-azul-8);
    --text: var(--c-gris-835);
    --text-2: var(--c-gris-647);
    --text-muted: var(--c-gris-608);
    --link-hover: var(--text);
    --tinta-firma: var(--c-gris-961);
    --accent: var(--c-gris-137);
    --accent-hover: var(--c-gris-176);
    --accent-soft: var(--c-gris-71);
    --accent-text: var(--c-gris-753);
    --ink-on-accent: var(--c-gris-835);
    --accent-control: var(--c-gris-647);
    --switch-on: var(--text);
    --hover-bg: var(--c-gris-43);
    --sel-bg: var(--surface-2);
    --sel-text: var(--text);
    --sel-line: var(--line-2);
    --chip-on-bg: var(--text);
    --chip-on-text: var(--bg);
    --pri-bg: var(--c-gris-137);
    --pri-bg-hover: var(--c-gris-176);
    --pri-line: color-mix(in oklch, var(--text) 55%, transparent);
    --focus: var(--c-gris-580);
    --ok: var(--c-verde-50-12);
    --ok-soft: var(--c-verde-94-4);
    --ok-text: var(--c-verde-40-10);
    --warn: var(--c-ambar-62-15);
    --warn-soft: var(--c-ambar-95-6);
    --warn-text: var(--c-ambar-46-11);
    --bad: var(--c-rojo-53-19);
    --bad-soft: var(--c-rojo-95-4);
    --bad-text: var(--c-rojo-46-17);
    --ink-on-bad: var(--c-gris-0);
    --llamar-bg: var(--c-llamar-50-13);
    --ink-on-llamar: var(--c-gris-0);
    --colgar-bg: var(--c-rojo-53-19);
    --ink-on-colgar: var(--c-gris-0);
    --mascara-opaca: var(--c-gris-1000);
    --velo: var(--c-negro-suave-46);
    --velo-blur: 14px;
    --dato-1: var(--text);
    --dato-2: var(--text-muted);
    --dato-relleno: var(--accent-control);
    --dato-relleno-2: var(--c-gris-451);
    --dato-intervalo: var(--text);
    --dato-banda: color-mix(in oklch, var(--text-muted) 16%, transparent);
    --dato-umbral: var(--text-muted);
    --dato-rango-1: var(--c-gris-188);
    --dato-rango-2: var(--c-gris-106);
    --dato-rango-3: var(--c-gris-47);
    --dato-escala-1: var(--c-gris-71);
    --dato-escala-2: var(--c-gris-176);
    --dato-escala-3: var(--c-gris-310);
    --dato-escala-4: var(--c-gris-580);
    --dato-escala-5: var(--c-gris-835);
    --dato-escala-tinta-alta: var(--c-gris-20);
    --cascaron-top: 52px;
    --cascaron-bar: 60px;
    --cascaron-side: 232px;
    --cascaron-side-mini: 64px;
    --avatar-fondo-1: var(--c-azul-94-3);
    --avatar-texto-1: var(--c-azul-40-9);
    --avatar-fondo-2: var(--c-verde-94-3);
    --avatar-texto-2: var(--c-verde-40-9);
    --avatar-fondo-3: var(--c-ambar-94-3);
    --avatar-texto-3: var(--c-ambar-40-9);
    --avatar-fondo-4: var(--c-rosa-94-3);
    --avatar-texto-4: var(--c-rosa-40-9);
    --avatar-fondo-5: var(--c-violeta-94-3);
    --avatar-texto-5: var(--c-violeta-40-9);
    --avatar-fondo-6: var(--c-turquesa-94-3);
    --avatar-texto-6: var(--c-turquesa-40-9);
    --w-modal: 440px;
    --w-telefono: 380px;
    --w-enfoque: 1120px;
    --tecla: 76px;
    --h-boton-llamada: 56px;
    --w-modal-ancho: 760px;
    --w-hoja: 560px;
    --w-menu: 232px;
    --w-cajon: 392px;
    --w-cajon-ancho: 660px;
    --w-popover: 280px;
    --w-calendario: 314px;
    --w-toast: 560px;
    --w-globo: 260px;
    --w-globo-lista: 320px;
    --w-avisos: 360px;
    --w-comandos: 640px;
    --comandos-top: max(var(--s-8), 12vh);
    --comandos-alto: min(560px, calc(100dvh - var(--comandos-top) - var(--s-4)));
    --mosaico: 76px;
    --avatar: 28px;
    --vacio-aro: 72px;
    --vacio-glifo: 40px;
    --ilus-tam-chico: 96px;
    --ilus-tam: 128px;
    --ilus-tam-grande: 160px;
    --contador: 20px;
    --punto: 8px;
    --punto-chip: 6px;
    --w-sub: 220px;
    --w-celda: 220px;
    --w-cifra: 180px;
    --w-lectura: 72ch;
    --page-pad: var(--s-6);
    --w-tendencia: 120px;
    --h-tendencia: 32px;
    --motivo-linea: var(--c-tinta-suave-6);
    --motivo-grosor: 1px;
    --motivo-paso: 26px;
    --motivo-angulo: 115deg;
  }
  [data-ds-theme="light"] {
    color-scheme: light;
    --shadow-sm: none;
    --shadow-md: 0 10px 28px -14px var(--c-negro-18), 0 0 0 1px var(--c-negro-5);
    --bg: var(--c-gris-43);
    --surface: var(--c-gris-20);
    --surface-2: var(--c-gris-71);
    --surface-3: var(--c-gris-106);
    --field: var(--c-gris-0);
    --surface-anidada: var(--c-gris-47);
    --border: var(--c-negro-7);
    --line-2: var(--c-negro-12);
    --border-control: var(--c-negro-46);
    --field-line: var(--c-negro-46);
    --hairline: var(--c-tinta-azul-8);
    --text: var(--c-gris-835);
    --text-2: var(--c-gris-647);
    --text-muted: var(--c-gris-608);
    --link-hover: var(--text);
    --tinta-firma: var(--c-gris-961);
    --accent: var(--c-gris-137);
    --accent-hover: var(--c-gris-176);
    --accent-soft: var(--c-gris-71);
    --accent-text: var(--c-gris-753);
    --ink-on-accent: var(--c-gris-835);
    --accent-control: var(--c-gris-647);
    --switch-on: var(--text);
    --hover-bg: var(--c-gris-43);
    --sel-bg: var(--surface-2);
    --sel-text: var(--text);
    --sel-line: var(--line-2);
    --chip-on-bg: var(--text);
    --chip-on-text: var(--bg);
    --pri-bg: var(--c-gris-137);
    --pri-bg-hover: var(--c-gris-176);
    --focus: var(--c-gris-580);
    --ok: var(--c-verde-50-12);
    --ok-soft: var(--c-verde-94-4);
    --ok-text: var(--c-verde-40-10);
    --warn: var(--c-ambar-62-15);
    --warn-soft: var(--c-ambar-95-6);
    --warn-text: var(--c-ambar-46-11);
    --bad: var(--c-rojo-53-19);
    --bad-soft: var(--c-rojo-95-4);
    --bad-text: var(--c-rojo-46-17);
    --ink-on-bad: var(--c-gris-0);
    --llamar-bg: var(--c-llamar-50-13);
    --ink-on-llamar: var(--c-gris-0);
    --colgar-bg: var(--c-rojo-53-19);
    --ink-on-colgar: var(--c-gris-0);
    --velo: var(--c-negro-suave-46);
    --dato-1: var(--text);
    --dato-2: var(--text-muted);
    --dato-relleno: var(--accent-control);
    --dato-relleno-2: var(--c-gris-451);
    --dato-intervalo: var(--text);
    --dato-banda: color-mix(in oklch, var(--text-muted) 16%, transparent);
    --dato-umbral: var(--text-muted);
    --dato-rango-1: var(--c-gris-188);
    --dato-rango-2: var(--c-gris-106);
    --dato-rango-3: var(--c-gris-47);
    --dato-escala-1: var(--c-gris-71);
    --dato-escala-2: var(--c-gris-176);
    --dato-escala-3: var(--c-gris-310);
    --dato-escala-4: var(--c-gris-580);
    --dato-escala-5: var(--c-gris-835);
    --dato-escala-tinta-alta: var(--c-gris-20);
    --avatar-fondo-1: var(--c-azul-94-3);
    --avatar-texto-1: var(--c-azul-40-9);
    --avatar-fondo-2: var(--c-verde-94-3);
    --avatar-texto-2: var(--c-verde-40-9);
    --avatar-fondo-3: var(--c-ambar-94-3);
    --avatar-texto-3: var(--c-ambar-40-9);
    --avatar-fondo-4: var(--c-rosa-94-3);
    --avatar-texto-4: var(--c-rosa-40-9);
    --avatar-fondo-5: var(--c-violeta-94-3);
    --avatar-texto-5: var(--c-violeta-40-9);
    --avatar-fondo-6: var(--c-turquesa-94-3);
    --avatar-texto-6: var(--c-turquesa-40-9);
    --motivo-linea: var(--c-tinta-suave-6);
  }
  [data-ds-theme="dark"] {
    color-scheme: dark;
    --shadow-sm: 0 1px 2px var(--c-negro-40);
    --shadow-md: 0 12px 28px -14px var(--c-negro-60), 0 0 0 1px var(--c-blanco-5);
    --bg: var(--c-gris-914);
    --surface: var(--c-gris-886);
    --surface-2: var(--c-gris-859);
    --surface-3: var(--c-gris-827);
    --field: var(--c-gris-922);
    --surface-anidada: var(--c-gris-867);
    --border: var(--c-blanco-8);
    --line-2: var(--c-blanco-13);
    --border-control: var(--c-blanco-37);
    --field-line: var(--c-blanco-37);
    --hairline: var(--c-blanco-8);
    --text: var(--c-gris-98);
    --text-2: var(--c-gris-310);
    --text-muted: var(--c-gris-404);
    --link-hover: var(--text);
    --tinta-firma: var(--c-gris-0);
    --accent: var(--c-gris-773);
    --accent-hover: var(--c-gris-733);
    --accent-soft: var(--c-gris-859);
    --accent-text: var(--c-gris-188);
    --ink-on-accent: var(--c-gris-98);
    --accent-control: var(--c-gris-310);
    --switch-on: var(--text);
    --hover-bg: var(--surface-2);
    --sel-bg: var(--surface-3);
    --sel-text: var(--text);
    --sel-line: var(--line-2);
    --chip-on-bg: var(--text);
    --chip-on-text: var(--bg);
    --pri-bg: var(--c-gris-773);
    --pri-bg-hover: var(--c-gris-733);
    --focus: var(--c-gris-451);
    --ok: var(--c-verde-74-12);
    --ok-soft: var(--c-verde-26-4);
    --ok-text: var(--ok);
    --warn: var(--c-ambar-78-14);
    --warn-soft: var(--c-ambar-28-6);
    --warn-text: var(--warn);
    --bad: var(--c-rojo-72-16);
    --bad-soft: var(--c-rojo-27-6);
    --bad-text: var(--bad);
    --ink-on-bad: var(--c-rojo-16-5);
    --llamar-bg: var(--c-llamar-66-12);
    --ink-on-llamar: var(--c-wa-16-6);
    --colgar-bg: var(--c-rojo-66-15);
    --ink-on-colgar: var(--c-rojo-16-5);
    --velo: var(--c-negro-58);
    --dato-1: var(--text);
    --dato-2: var(--text-muted);
    --dato-relleno: var(--accent-control);
    --dato-relleno-2: var(--c-gris-537);
    --dato-intervalo: var(--text);
    --dato-banda: color-mix(in oklch, var(--text-muted) 22%, transparent);
    --dato-umbral: var(--text-muted);
    --dato-rango-1: var(--c-gris-773);
    --dato-rango-2: var(--c-gris-827);
    --dato-rango-3: var(--c-gris-859);
    --dato-escala-1: var(--c-gris-859);
    --dato-escala-2: var(--c-gris-773);
    --dato-escala-3: var(--c-gris-647);
    --dato-escala-4: var(--c-gris-310);
    --dato-escala-5: var(--c-gris-98);
    --dato-escala-tinta-alta: var(--c-gris-914);
    --avatar-fondo-1: var(--c-azul-32-5);
    --avatar-texto-1: var(--c-azul-86-6);
    --avatar-fondo-2: var(--c-verde-32-5);
    --avatar-texto-2: var(--c-verde-86-6);
    --avatar-fondo-3: var(--c-ambar-32-5);
    --avatar-texto-3: var(--c-ambar-86-6);
    --avatar-fondo-4: var(--c-rosa-32-5);
    --avatar-texto-4: var(--c-rosa-86-6);
    --avatar-fondo-5: var(--c-violeta-32-5);
    --avatar-texto-5: var(--c-violeta-86-6);
    --avatar-fondo-6: var(--c-turquesa-32-5);
    --avatar-texto-6: var(--c-turquesa-86-6);
    --motivo-linea: var(--c-blanco-6);
  }
  @media (prefers-contrast: more) {
    :root:root {
      --border: var(--border-control);
      --line-2: var(--border-control);
      --border-control: var(--c-negro-55);
      --field-line: var(--c-negro-55);
      --hairline: var(--c-tinta-azul-20);
      --text-muted: var(--text-2);
    }
    :root[data-ds-theme="dark"] {
      --border-control: var(--c-blanco-45);
      --field-line: var(--c-blanco-45);
      --hairline: var(--c-blanco-20);
    }
  }
  @media (pointer: coarse) {
    :root:root {
      --ico-2: 20px;
      --ico-boton: 20px;
      --ico-boton-solo: 22px;
      --h-control: 44px;
      --h-control-sm: 44px;
    }
  }
  @media (max-width: 820px) {
    :root:root {
      --cascaron-top: 48px;
      --page-pad: var(--s-4);
    }
  }
}
/* Tema leadz. Va después de tokens.css.
   Generado por generador/generar.mjs desde tokens/*.json. No se edita a mano: se cambia la fuente y se regenera. */
@layer reset, dz.tokens, dz.base, dz.componentes;
@layer dz.tokens {
  :root {
    --bb-out: var(--c-gris-149);
    --hilo-bg: var(--surface-2);
    --hilo-in: var(--surface);
    --hilo-in-line: var(--border);
    --hilo-out: var(--bb-out);
    --hilo-out-text: var(--text);
    --hilo-meta: var(--text-muted);
    --hilo-meta-on: var(--accent-text);
    --wa: var(--c-wa-54-16);
    --ink-on-wa: var(--c-gris-0);
    --st-l: 50%;
    --st-c: .14;
    --st1: var(--c-azul-58-3);
    --st2: oklch(var(--st-l) var(--st-c) 236);
    --st3: oklch(var(--st-l) 0.12 200);
    --st4: oklch(var(--st-l) 0.14 300);
    --st5: var(--c-ambar-62-14);
    --st-won: var(--ok);
    --st-lost: var(--bad);
    --brand: var(--c-azul-50-19);
    --ink-on-brand: var(--c-gris-0);
    --acento-correo: var(--brand);
    --muestra-claro: var(--c-gris-43);
    --muestra-oscuro: var(--c-gris-914);
  }
  [data-ds-theme="light"] {
    --bb-out: var(--c-gris-149);
    --hilo-bg: var(--surface-2);
    --hilo-in: var(--surface);
    --hilo-in-line: var(--border);
    --hilo-out: var(--bb-out);
    --hilo-out-text: var(--text);
    --hilo-meta: var(--text-muted);
    --hilo-meta-on: var(--accent-text);
    --wa: var(--c-wa-54-16);
    --ink-on-wa: var(--c-gris-0);
    --st-l: 50%;
    --st1: var(--c-azul-58-3);
    --st2: oklch(var(--st-l) var(--st-c) 236);
    --st3: oklch(var(--st-l) 0.12 200);
    --st4: oklch(var(--st-l) 0.14 300);
    --st5: var(--c-ambar-62-14);
    --st-won: var(--ok);
    --st-lost: var(--bad);
    --brand: var(--c-azul-50-19);
    --acento-correo: var(--brand);
  }
  [data-ds-theme="dark"] {
    --bb-out: var(--c-gris-835);
    --hilo-bg: var(--bg);
    --hilo-in: var(--surface);
    --hilo-in-line: var(--border);
    --hilo-out: var(--bb-out);
    --hilo-out-text: var(--text);
    --hilo-meta: var(--text-2);
    --hilo-meta-on: var(--accent-text);
    --wa: var(--c-wa-74-16);
    --ink-on-wa: var(--c-wa-16-6);
    --st-l: 72%;
    --st1: var(--c-azul-66-3);
    --st2: oklch(var(--st-l) 0.13 236);
    --st3: oklch(var(--st-l) 0.11 200);
    --st4: oklch(var(--st-l) 0.12 300);
    --st5: var(--c-ambar-78-12);
    --st-won: var(--ok);
    --st-lost: var(--bad);
    --brand: var(--c-azul-62-17);
    --acento-correo: var(--brand);
  }
}
@layer dz.tokens {
  :root {
    --h-fija-30: 30px;
    --h-fija-38: 38px;
    --ico-12: 12px;
    --ico-13: 13px;
    --ico-14: 14px;
    --ico-15: 15px;
    --ico-17: 17px;
    --ico-18: 18px;
    --ico-22: 22px;
    --ico-28: 28px;
    --comandos-top: calc(var(--cascaron-top) + var(--s-3));
    --z-sf: 390;
    --z-softphone-curso: 9100;
    --z-sf-velo: 400;
  }
}
/* Base del DS. Declara el orden de capas del paquete y lo obligatorio en todo consumidor:
   los selectores de tipo del producto van dentro de @layer reset (ADR-7). Aquí no hay !important
   salvo en forced-colors, en movimiento reducido y en [hidden], donde la accesibilidad del paquete manda a propósito. */
@layer reset, dz.tokens, dz.base, dz.componentes;

/* ── reset: selectores de tipo. Va en su capa para que nunca pise a un componente. */
@layer reset {
  *, ::before, ::after { box-sizing: border-box; }
  html, body { margin: 0; padding: 0; }
  /* OPT-IN. Heredar tipografía y color en los controles NO es universal: cambia el texto de todo botón sin estilo propio, el de los
     placeholders y el alto de un textarea, y un producto con CSS propio (LeadZ) tuvo que revertirlo con un puente. Por eso solo
     aplica donde el producto lo pide: una clase dz-reset-controles en un ancestro (por ejemplo html) o dz-hereda en el control. */
  :where(.dz-reset-controles) :is(button, input, select, textarea), :is(button, input, select, textarea):where(.dz-hereda) { font: inherit; color: inherit; letter-spacing: inherit; }
  /* OPT-IN, igual que la herencia de los controles. Un producto con HTML sin clases se apoya en el margen del navegador de h1 a h6, p,
     figure, blockquote, ul y ol (LeadZ perdía entre 14 y 40 px en cuatro secciones de Ajustes con la regla universal). Solo aplica donde
     el producto lo pide: una clase dz-reset-texto en un ancestro (por ejemplo html) o dz-sin-margen en el elemento. Las piezas del DS
     que llevan un p o un h2 dentro ya fijan su propio margen, así que no dependen de esto. */
  :where(.dz-reset-texto) :is(h1, h2, h3, h4, h5, h6, p, figure, blockquote), :is(h1, h2, h3, h4, h5, h6, p, figure, blockquote):where(.dz-sin-margen) { margin: 0; }
  :where(.dz-reset-texto) :is(ul, ol), :is(ul, ol):where(.dz-sin-margen) { margin: 0; padding: 0; }
  a { color: inherit; text-decoration: none; }
  table { border-collapse: separate; border-spacing: 0; }
  img, video { max-width: 100%; height: auto; }
  code, pre, samp, kbd { font-family: var(--mono-code); }
}

@layer dz.base {
  /* Un elemento con hidden no se ve ni está en el árbol de accesibilidad. Sin esto, cualquier componente que declare display (todos los flex y grid)
     pisa el display:none del navegador y el atributo no hace nada. !important en una capa anterior gana a los componentes y al CSS del producto sin capa;
     until-found conserva su comportamiento nativo (buscar en la página). */
  [hidden]:not([hidden="until-found"]) { display: none !important; }
  html {
    background: var(--bg);
    scrollbar-color: var(--line-2) transparent;
    accent-color: var(--accent-control);
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
    -webkit-tap-highlight-color: transparent;
    scroll-padding-top: calc(var(--cascaron-top, 0px) + var(--s-2));
  }
  body {
    background: var(--bg);
    color: var(--text);
    font-family: var(--font);
    font-size: var(--fs-3);
    line-height: var(--lh-3);
    -webkit-font-smoothing: antialiased;
  }

  /* Caret y selección en --accent-control. --accent es un gris de relleno: el caret en --accent medía 1.3:1 en claro
     y 1.6:1 en oscuro sobre el campo (invisible). --accent-control pasa 3:1 en los dos temas; el valor medido está
     en contraste.json (caret-sobre-campo, seleccion-de-texto-sobre-campo). El caret se declara también en el control
     para ganar a cualquier caret-color heredado del cuerpo. */
  body, :where(input, textarea, select, [contenteditable]:not([contenteditable="false"])) { caret-color: var(--accent-control); }
  ::selection { background: color-mix(in oklch, var(--accent-control) 32%, transparent); }
  ::placeholder { color: var(--text-muted); opacity: 1; }

  /* Foco: una línea de 1.5 px en --focus que entra una vez y queda fija. :where() la deja en especificidad 0 para que
     cualquier componente gane sin pelear. El anillo vive en :focus-visible: el foco por ratón no lo dispara. */
  :focus { outline: none; }
  :where(a, button, summary, select, textarea, input[type="checkbox"], input[type="radio"], [tabindex]):focus-visible { outline: none; box-shadow: var(--ring); }
  /* Las dos entradas de los paneles, declaradas una sola vez (ACB-128): dzEntra es dz-entra del token (sube 8 px, --s-2) y dzEntraDesdeArriba es la de un panel anclado bajo su disparador (baja 4 px, --s-1). componentes.css no carga movimiento.css, por eso viven aquí y una prueba vigila que valgan lo mismo que --mov-dist-1 y --mov-dist-2. */
  @keyframes dzEntra { from { opacity: 0; transform: translateY(var(--s-2)); } }
  @keyframes dzEntraDesdeArriba { from { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); } }
  @keyframes dzAro { from { box-shadow: var(--ring-0); } }
  :focus-visible { animation: dzAro var(--dur-2) var(--ease-out); }
  /* WebKit no pinta box-shadow sobre un checkbox o radio nativo: contorno propio. */
  input[type="checkbox"]:focus-visible, input[type="radio"]:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; box-shadow: none; }

  /* Enlace de texto: acento sin subrayar, en reposo y en hover; en hover cambia al tono hover. */
  a:where(:not([class])) { color: var(--accent-text); font-weight: 500; text-decoration: none; }
  @media (hover: hover) { a:where(:not([class])):hover { color: var(--link-hover); } }

  /* Cifras alineadas en tablas, horas y salidas. */
  :where(table, time, output, [data-dz-cifra]) { font-variant-numeric: tabular-nums; }

  /* Sin zoom de doble toque en controles; con puntero grueso los campos van a 16 px o Safari de iPhone hace zoom al enfocar. */
  :where(a, button, summary, label, select, [role="button"]) { touch-action: manipulation; }
  @media (pointer: coarse) {
    :where(input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]), select, textarea) { font-size: 16px; }
  }

  /* Barras de desplazamiento: color por scrollbar-color (heredado a todo contenedor); respaldo para WebKit sin soporte. */
  @supports not (scrollbar-color: auto) {
    ::-webkit-scrollbar { width: 10px; height: 10px; }
    ::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: var(--r-pill); border: 2px solid transparent; background-clip: content-box; }
    ::-webkit-scrollbar-track { background: transparent; }
  }

  /* Colores forzados (Windows): borra las sombras y el foco vive en box-shadow, así que se le da contorno real; el estado
     elegido, que en el tema vive en el relleno, lleva borde en Highlight. !important solo aquí y en movimiento reducido. */
  @media (forced-colors: active) {
    :focus-visible { outline: 2px solid CanvasText !important; outline-offset: 2px; }
    [aria-pressed="true"], [aria-selected="true"][role="tab"], [aria-current]:not([aria-current="false"]) { outline: 2px solid Highlight !important; outline-offset: -2px; }
    /* Un icono con color de autor (destinos del cascarón, pestañas, leyendas, reglas) no se fuerza solo: el svg conserva su var(--...) sobre el Canvas y
       puede quedar a 1.46:1. Hereda el color ya forzado de su contenedor (ICB-65, ICB-71, ICB-225). */
    .dz-ico { color: inherit !important; }
  }

  /* Movimiento reducido: nada anima en bucle; lo que entra, aparece. */
  @media (prefers-reduced-motion: reduce) {
    *, ::before, ::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      animation-delay: 0s !important;
      transition-delay: 0s !important;
      scroll-behavior: auto !important;
    }
  }

  /* Superficie modal abierta (modal, hoja, cajón, cascarón): la página de atrás no se desplaza. comportamiento/capas pone el atributo y
     mide la barra de desplazamiento en --dz-barra, para que el contenido no salte al desaparecer. */
  html[data-dz-bloqueo] { padding-right: var(--dz-barra, 0px); }
  html[data-dz-bloqueo], html[data-dz-bloqueo] body { overflow: hidden; overscroll-behavior: none; }
}

/* Tamaño de <Icono tam="1..5">: por clase, nunca en línea, para que el CSS del producto (sin capa) gane siempre. */
@layer dz.componentes {
  .dz-ico--1 { width: var(--ico-1); height: var(--ico-1); }
  .dz-ico--2 { width: var(--ico-2); height: var(--ico-2); }
  .dz-ico--3 { width: var(--ico-3); height: var(--ico-3); }
  .dz-ico--4 { width: var(--ico-4); height: var(--ico-4); }
  .dz-ico--5 { width: var(--ico-5); height: var(--ico-5); }
}
/* Piezas del DS: CSS agnóstico en @layer dz.componentes. Generado por generador/generar.mjs desde generador/fuentes y registro/. No se edita a mano: se cambia la fuente y se regenera. */
@layer reset, dz.tokens, dz.base, dz.componentes;
/* Avatar: la persona en un círculo de --avatar (24, 28, 42 o 56). Foto encima de las iniciales; si la foto falla, montarAvatar la oculta (data-dz-fallo).
   El color de las iniciales sale de seis pares de tokens (--avatar-fondo-N y --avatar-texto-N, más de 4.5:1 en claro y oscuro): decora, el nombre va en el texto.
   La presencia es un punto con forma propia (lleno, con barra, con hueco) y un texto para lector de pantalla: el color nunca va solo. */
@layer dz.componentes {
  .dz-avatar {
    --dz-avatar-tam: var(--avatar);
    --dz-avatar-fondo: var(--surface-3);
    --dz-avatar-texto: var(--text-2);
    --dz-presencia-tam: var(--punto);
    position: relative;
    display: inline-grid;
    flex: none;
    place-items: center;
    inline-size: var(--dz-avatar-tam);
    block-size: var(--dz-avatar-tam);
    border-radius: 50%;
    background: var(--dz-avatar-fondo);
    color: var(--dz-avatar-texto);
    font-size: var(--fs-1);
    font-weight: 600;
    line-height: 1;
    white-space: nowrap;
    user-select: none;
  }
  .dz-avatar__iniciales { display: inline-grid; place-items: center; max-inline-size: 100%; overflow: hidden; border-radius: inherit; }
  .dz-avatar__iniciales svg { inline-size: var(--ico-1); block-size: var(--ico-1); flex: none; }
  .dz-avatar__img { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; border-radius: inherit; object-fit: cover; }
  .dz-avatar[data-dz-fallo] .dz-avatar__img { display: none; }

  .dz-avatar--sm { --dz-avatar-tam: var(--h-mini); }
  .dz-avatar--lg { --dz-avatar-tam: calc(var(--avatar) * 1.5); --dz-presencia-tam: calc(var(--punto) * 1.5); font-size: var(--fs-4); }
  .dz-avatar--xl { --dz-avatar-tam: calc(var(--avatar) * 2); --dz-presencia-tam: calc(var(--punto) * 1.5); font-size: var(--fs-6); }
  .dz-avatar--lg .dz-avatar__iniciales svg,
  .dz-avatar--xl .dz-avatar__iniciales svg { inline-size: var(--ico-3); block-size: var(--ico-3); }

  .dz-avatar--tono-1 { --dz-avatar-fondo: var(--avatar-fondo-1); --dz-avatar-texto: var(--avatar-texto-1); }
  .dz-avatar--tono-2 { --dz-avatar-fondo: var(--avatar-fondo-2); --dz-avatar-texto: var(--avatar-texto-2); }
  .dz-avatar--tono-3 { --dz-avatar-fondo: var(--avatar-fondo-3); --dz-avatar-texto: var(--avatar-texto-3); }
  .dz-avatar--tono-4 { --dz-avatar-fondo: var(--avatar-fondo-4); --dz-avatar-texto: var(--avatar-texto-4); }
  .dz-avatar--tono-5 { --dz-avatar-fondo: var(--avatar-fondo-5); --dz-avatar-texto: var(--avatar-texto-5); }
  .dz-avatar--tono-6 { --dz-avatar-fondo: var(--avatar-fondo-6); --dz-avatar-texto: var(--avatar-texto-6); }

  /* Presencia: abajo a la derecha, con un anillo del color de la superficie para despegarla de la foto. */
  .dz-avatar__presencia {
    position: absolute;
    z-index: 1;
    inset-inline-end: 0;
    inset-block-end: 0;
    inline-size: var(--dz-presencia-tam);
    block-size: var(--dz-presencia-tam);
    border-radius: 50%;
    background: var(--ok);
    box-shadow: 0 0 0 2px var(--dz-avatar-anillo, var(--surface));
  }
  .dz-avatar__presencia[data-dz-presencia="ocupado"] { background: var(--bad); }
  .dz-avatar__presencia[data-dz-presencia="ocupado"]::after { content: ""; position: absolute; inset: 40% 22%; border-radius: 1px; background: var(--dz-avatar-anillo, var(--surface)); }
  .dz-avatar__presencia[data-dz-presencia="llamada"] { background: var(--accent-control); }
  .dz-avatar__presencia[data-dz-presencia="llamada"]::after { content: ""; position: absolute; inset: 28%; border-radius: 50%; background: var(--dz-avatar-anillo, var(--surface)); }
  .dz-avatar__presencia-texto { position: absolute; inline-size: 1px; block-size: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

  @media (forced-colors: active) {
    .dz-avatar { border: 1px solid currentColor; }
    .dz-avatar__presencia { border: 1px solid currentColor; }
  }
}

/* Ayuda en lista: de tres a cinco renglones, uno por pregunta que contesta. En la <dl> va en dos columnas alineadas por subgrid: la palabra
   clave (dt) a la izquierda y la respuesta (dd) a la derecha, con hairline continuo entre renglones, y las dos se alinean por la línea base:
   con una sola línea quedan al centro de la fila y con varias la clave queda a la altura de la primera línea de la respuesta. Sin viñetas y
   nunca un párrafo. Las casillas por defecto son «Mide», «No incluye» y «Detalle» (23-oct-2026).
   Armada (25-oct-2026, propuesta C «Marginal» de Alejandro López Ulloa): segunda superficie sin borde, como el aviso pero neutra, con un
   icono de Lucide en el margen a la altura del primer renglón. Sin la marca (<dl class="dz-ayuda">) queda la lista sin caja; un <p> o <div>
   con la clase (marcado de LeadZ) se queda en línea: clave en negrita y texto detrás. */
@layer dz.componentes {
  .dz-ayuda { display: grid; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-ayuda__renglon { padding: var(--s-1) 0; border-top: 1px solid var(--border); text-wrap: pretty; }
  .dz-ayuda__renglon:first-child { padding-top: 0; border-top: 0; }
  .dz-ayuda__renglon:last-child { padding-bottom: 0; }
  .dz-ayuda__clave { display: inline; margin-right: var(--s-1); font-weight: 600; color: var(--text); }
  .dz-ayuda__texto { display: inline; margin: 0; }
  /* La lista: la <dl> de la pieza sola (dl.dz-ayuda) o dentro del panel (dl.dz-ayuda__lista). Margen 0 porque el navegador trae el suyo. */
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) { margin: 0; display: grid; grid-template-columns: fit-content(9em) minmax(0, 1fr); }
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) > .dz-ayuda__renglon { display: grid; grid-column: 1 / -1; grid-template-columns: subgrid; column-gap: var(--s-3); align-items: baseline; padding-block: var(--s-2); }
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) > .dz-ayuda__renglon:first-child { padding-top: 0; }
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) > .dz-ayuda__renglon:last-child { padding-bottom: 0; }
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) .dz-ayuda__clave { display: block; margin: 0; }
  :is(dl.dz-ayuda, dl.dz-ayuda__lista) .dz-ayuda__texto { display: block; min-width: 0; }

  /* Panel: segunda superficie sin borde, radio de control, marca en el margen y cuerpo al lado. */
  .dz-ayuda:has(> .dz-ayuda__cuerpo) { grid-template-columns: var(--ico-2) minmax(0, 1fr); column-gap: var(--s-3); padding: var(--s-3) var(--s-4); border-radius: var(--r-control); background: var(--surface-2); }
  /* La marca mide una línea del renglón de alto y centra el icono en ella; con título, una línea del título. */
  .dz-ayuda__marca { display: inline-grid; place-items: center; width: var(--ico-2); height: calc(var(--lh-3) * 1em); color: var(--text-2); }
  .dz-ayuda:has(> .dz-ayuda__cuerpo > .dz-ayuda__titulo) > .dz-ayuda__marca { height: calc(var(--lh-2) * 1em); }
  .dz-ayuda__icono { width: var(--ico-2); height: var(--ico-2); }
  .dz-ayuda__cuerpo { display: grid; gap: var(--s-2); min-width: 0; }
  .dz-ayuda__titulo { margin: 0; min-width: 0; font-size: var(--fs-3); font-weight: 600; line-height: var(--lh-2); color: var(--text); }
  /* Dentro de una tarjeta: superficie anidada con hairline (nunca la misma superficie dentro de la misma superficie). */
  .dz-tarjeta .dz-ayuda:has(> .dz-ayuda__cuerpo) { background: var(--surface-anidada); border: 1px solid var(--hairline); }
  /* Globo: superficie con hairline y sombra; con cuerpo conserva la marca. */
  .dz-ayuda--globo { padding: var(--s-3) var(--s-4); border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--surface); box-shadow: var(--shadow-md); }
  .dz-ayuda--globo:has(> .dz-ayuda__cuerpo) { border-radius: var(--r-card); background: var(--surface); }
  /* Plano: marca y lista sin caja, para ir bajo un campo o en una fila de ajustes. */
  .dz-ayuda--plano:has(> .dz-ayuda__cuerpo), .dz-tarjeta .dz-ayuda--plano:has(> .dz-ayuda__cuerpo) { padding: 0; border: 0; border-radius: 0; background: transparent; }

  /* Teléfono (corte movil): una columna, la clave encima y la respuesta debajo a todo lo ancho. Vale para la lista sola y para el panel. */
  @media (max-width: 560px) {
    :is(dl.dz-ayuda, dl.dz-ayuda__lista), :is(dl.dz-ayuda, dl.dz-ayuda__lista) > .dz-ayuda__renglon { grid-template-columns: minmax(0, 1fr); }
  }
  /* Sin subgrid: la misma forma de una columna. El renglón sigue siendo grid y un hijo de grid se bloquifica, así que no se intenta un
     display en línea: queda la columna única. */
  @supports not (grid-template-columns: subgrid) {
    :is(dl.dz-ayuda, dl.dz-ayuda__lista), :is(dl.dz-ayuda, dl.dz-ayuda__lista) > .dz-ayuda__renglon { grid-template-columns: minmax(0, 1fr); }
  }
}

/* Banda de práctica: un renglón de aviso suave con icono (nunca solo color) que dice que los datos son ficticios; o el chip "Lead de práctica" que
   acompaña al nombre de un lead de práctica. Aviso, no alarma: relleno suave del tono de aviso, sin borde y sin sombra. */
@layer dz.componentes {
  .dz-banda-practica:not(.dz-banda-practica--chip) { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); min-height: var(--h-control); padding: var(--s-2) var(--s-4); border-radius: var(--r-control); background: var(--warn-soft); color: var(--warn-text); font-size: var(--fs-2); line-height: var(--lh-2); }
  .dz-banda-practica__marca { display: inline-grid; place-items: center; flex: none; width: var(--ico-3); height: var(--ico-3); }
  .dz-banda-practica__marca svg { width: var(--ico-3); height: var(--ico-3); }
  .dz-banda-practica__texto { flex: 1 1 var(--w-sub); min-width: 0; margin: 0; text-wrap: pretty; }
  .dz-banda-practica__clave { font-weight: 600; }
  .dz-banda-practica__acciones { display: flex; flex: none; flex-wrap: wrap; gap: var(--s-2); margin-left: auto; }
  /* El chip: el mismo chip de aviso con un poco más de cuerpo, para que se lea junto a un nombre de 28 px. */
  .dz-banda-practica--chip { font-weight: 500; }
  .dz-banda-practica.dz-banda-practica--mini { height: var(--h-mini); }
}

/* Botón (como el .zbtn de LeadZ: sin position, min-width, line-height ni justify-content propios; sin piso de min-height: LeadZ solo pone 24 px dentro de main y su propia regla lo hace, y --h-control-sm ya mide 30). Píldora a --h-control. Base = secundario (superficie con borde de control); primario en gris elevado con borde --pri-line;
   fantasma sin borde para lo terciario; peligro con el tono de error, nunca rojo macizo. Un primario por zona. Aspecto de LeadZ. */
@layer dz.componentes {
  .dz-boton {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-dens-control, var(--h-control));
    padding: 0 var(--s-4);
    border-radius: var(--r-btn);
    border: 1px solid var(--border-control);
    background: var(--surface-2);
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    white-space: nowrap;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  /* El glifo crece con el lado del botón (ICB-270): 16 en el chico (30 a 32), 18 en el estándar (38) y, con el dedo, 20 con rótulo y 22 sin él (44 a 48). */
  .dz-boton svg { width: var(--ico-boton); height: var(--ico-boton); flex: none; }
  @media (hover: hover) {
    .dz-boton:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--surface-3); color: var(--text); }
  }
  .dz-boton[data-ds-estado="hover"]:not(:disabled) { background: var(--surface-3); color: var(--text); }
  .dz-boton:active:not(:disabled):not([aria-disabled="true"]),
  .dz-boton[data-ds-estado="activo"]:not(:disabled) { background: var(--surface-3); transform: translateY(1px) scale(.98); }
  .dz-boton:focus-visible,
  .dz-boton[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-boton:disabled,
  .dz-boton[aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; transform: none; }

  .dz-boton--primario { background: var(--pri-bg); border-color: var(--pri-line); color: var(--text); }
  @media (hover: hover) {
    .dz-boton--primario:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--pri-bg-hover); border-color: var(--pri-line); color: var(--text); }
  }
  .dz-boton--primario[data-ds-estado="hover"]:not(:disabled),
  .dz-boton--primario:active:not(:disabled):not([aria-disabled="true"]),
  .dz-boton--primario[data-ds-estado="activo"]:not(:disabled) { background: var(--pri-bg-hover); border-color: var(--pri-line); color: var(--text); }
  /* Sin borde cuando está desactivado: el borde es la señal de que se puede apretar. */
  .dz-boton--primario:disabled,
  .dz-boton--primario[aria-disabled="true"] { border-color: transparent; }

  .dz-boton--fantasma { background: transparent; border-color: transparent; color: var(--text-2); }
  @media (hover: hover) {
    .dz-boton--fantasma:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--surface-2); color: var(--text); }
  }
  .dz-boton--fantasma[data-ds-estado="hover"]:not(:disabled) { background: var(--surface-2); color: var(--text); }
  .dz-boton--fantasma[aria-pressed="true"] { background: var(--sel-bg); color: var(--sel-text); }

  .dz-boton--peligro { background: var(--surface); border-color: var(--bad); color: var(--bad-text); }
  @media (hover: hover) {
    .dz-boton--peligro:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--bad-soft); border-color: var(--bad-soft); color: var(--bad-text); }
  }
  .dz-boton--peligro[data-ds-estado="hover"]:not(:disabled),
  .dz-boton--peligro:active:not(:disabled):not([aria-disabled="true"]),
  .dz-boton--peligro[data-ds-estado="activo"]:not(:disabled) { background: var(--bad-soft); border-color: var(--bad-soft); color: var(--bad-text); }

  /* Llamar y colgar (2.3.0): las dos acciones de una llamada, en verde calmado y en rojo, cada una con su tinta. El verde no es un éxito ni el rojo un error: son los tokens de la llamada. */
  .dz-boton--llamar { background: var(--llamar-bg); border-color: var(--llamar-bg); color: var(--ink-on-llamar); }
  .dz-boton--colgar { background: var(--colgar-bg); border-color: var(--colgar-bg); color: var(--ink-on-colgar); }
  @media (hover: hover) {
    .dz-boton--llamar:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--llamar-bg); border-color: var(--llamar-bg); color: var(--ink-on-llamar); filter: brightness(1.08); }
    .dz-boton--colgar:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--colgar-bg); border-color: var(--colgar-bg); color: var(--ink-on-colgar); filter: brightness(1.08); }
  }
  .dz-boton--llamar[data-ds-estado="hover"]:not(:disabled), .dz-boton--llamar:active:not(:disabled):not([aria-disabled="true"]), .dz-boton--llamar[data-ds-estado="activo"]:not(:disabled) { background: var(--llamar-bg); border-color: var(--llamar-bg); color: var(--ink-on-llamar); filter: brightness(1.08); }
  .dz-boton--colgar[data-ds-estado="hover"]:not(:disabled), .dz-boton--colgar:active:not(:disabled):not([aria-disabled="true"]), .dz-boton--colgar[data-ds-estado="activo"]:not(:disabled) { background: var(--colgar-bg); border-color: var(--colgar-bg); color: var(--ink-on-colgar); filter: brightness(1.08); }
  /* Sin número a quien llamar el botón se apaga a gris neutro: un verde pálido se leería como un estado de éxito. */
  .dz-boton--llamar:disabled, .dz-boton--llamar[aria-disabled="true"] { background: var(--surface-2); border-color: var(--border-control); color: var(--text-muted); }
  @media (forced-colors: active) {
    .dz-boton--llamar, .dz-boton--colgar { border-color: ButtonText; forced-color-adjust: none; background: ButtonFace; color: ButtonText; }
  }

  /* Par chico: va con campo chico, nunca un chico junto a uno normal en la misma fila. */
  .dz-boton--chico { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0 var(--s-3); }
  .dz-boton--chico svg { width: var(--ico-2); height: var(--ico-2); }
  /* Solo icono: cuadrado del alto del control. Lleva aria-label. */
  .dz-boton--icono { width: var(--h-control); padding: 0; justify-content: center; }
  .dz-boton--icono svg { width: var(--dz-dens-ico-solo, var(--ico-boton-solo)); height: var(--dz-dens-ico-solo, var(--ico-boton-solo)); }
  .dz-boton--icono.dz-boton--chico { width: var(--h-control-sm); }
  .dz-boton--icono.dz-boton--chico svg { width: var(--ico-2); height: var(--ico-2); }
  @media (pointer: coarse) {
    .dz-boton--icono.dz-boton--chico svg { width: var(--ico-boton-solo); height: var(--ico-boton-solo); }
  }

  /* Cargando (1 a 10 s): el botón queda ocupado con su reloj y el rótulo dice qué pasa. */
  .dz-boton--cargando,
  .dz-boton[aria-busy="true"] { pointer-events: none; }
  .dz-boton--cargando::before,
  .dz-boton[aria-busy="true"]::before {
    content: "";
    width: var(--ico-1);
    height: var(--ico-1);
    flex: none;
    border-radius: 50%;
    border: 2px solid currentColor;
    border-right-color: transparent;
    animation: dzGira calc(var(--dur-4) * 2) linear infinite;
  }
  .dz-boton--cargando > svg,
  .dz-boton[aria-busy="true"] > svg { display: none; }
  @keyframes dzGira { to { transform: rotate(360deg); } }
  /* Con movimiento reducido el anillo que gira pasa a tres puntos quietos ("..."): el rótulo y aria-busy siguen diciendo qué pasa. */
  @media (prefers-reduced-motion: reduce) {
    .dz-boton--cargando::before,
    .dz-boton[aria-busy="true"]::before {
      content: "\2026";
      width: auto;
      height: auto;
      border: 0;
      border-radius: 0;
      animation: none;
      line-height: 1;
    }
  }
}

/* Campo: etiqueta, control, ayuda y error. El borde de reposo --field-line SE CONSERVA al enfocar y el anillo se suma por fuera
   (decisión de Alex, 17-oct): al enfocar, el borde nunca pasa a --focus. Con puntero grueso el texto sube a 16 para que Safari no haga zoom.
   Lo que no se edita: DESHABILITADO baja el control entero a --op-off (PCB-37, no lo pinta de gris) y SOLO LECTURA no atenúa nada, pierde el borde de control activo (queda
   el de línea suave, --border) y conserva el foco y el valor copiable. En los dos la razón es la primera línea de ayuda (PCB-1711, UCB-144) y el candado, solo si el bloqueo es
   por permiso o plan, va junto a la etiqueta (PCB-1181). */
@layer dz.componentes {
  .dz-campo { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
  .dz-campo__etiqueta { font-size: var(--fs-1); font-weight: 500; color: var(--text-2); }
  .dz-campo__etiqueta--oculta { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  /* El asterisco no es un error: va en el color de la etiqueta; el rojo es del error real. Si casi todo es obligatorio se rotula lo opcional. */
  .dz-campo__obligatorio { color: var(--text-2); }
  .dz-campo__ayuda { margin: 0; font-size: var(--fs-1); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-campo__razon { color: var(--text-2); }
  /* El candado de un bloqueo por permiso o plan: decorativo, a 16 px, pegado al texto de la etiqueta. */
  .dz-campo__candado { display: inline-block; vertical-align: text-bottom; margin-inline-start: var(--s-1); color: var(--text-muted); }
  .dz-campo__error { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--bad-text); }

  .dz-campo__control {
    width: 100%;
    height: var(--dz-dens-control, var(--h-control));
    padding: var(--dz-dens-campo-py, var(--s-2)) var(--s-3);
    border-radius: var(--r-input);
    border: 1px solid var(--field-line);
    background: var(--field);
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-2);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  .dz-campo__control::placeholder { color: var(--text-muted); opacity: 1; }
  @media (hover: hover) {
    .dz-campo__control:hover:not(:disabled):not(:focus):not([readonly]) { border-color: var(--text-muted); }
  }
  .dz-campo__control[data-ds-estado="hover"]:not(:disabled):not([readonly]) { border-color: var(--text-muted); }
  .dz-campo__control:focus,
  .dz-campo__control:focus-visible,
  .dz-campo__control[data-ds-estado="foco"] { outline: none; border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-campo__control:disabled { opacity: var(--op-off); cursor: not-allowed; }
  /* Solo lectura: el borde de línea suave en vez del de control activo, sin fondo de campo; al enfocar solo se suma el anillo y el valor se puede seleccionar y copiar. */
  .dz-campo__control[readonly],
  .dz-campo__control[readonly]:hover,
  .dz-campo__control[readonly]:focus,
  .dz-campo__control[readonly]:focus-visible,
  .dz-campo__control[readonly][data-ds-estado] { border-color: var(--border); background: transparent; cursor: default; }
  .dz-campo--invalido .dz-campo__control,
  .dz-campo__control[aria-invalid="true"] { border-color: var(--bad); }
  /* El error gana al hover de reposo y al hover enseñado: con el puntero encima el borde sigue en rojo. */
  .dz-campo--invalido .dz-campo__control:hover:not(:disabled):not(:focus),
  .dz-campo__control[aria-invalid="true"]:hover:not(:disabled):not(:focus),
  .dz-campo--invalido .dz-campo__control[data-ds-estado="hover"]:not(:disabled),
  .dz-campo__control[aria-invalid="true"][data-ds-estado="hover"]:not(:disabled) { border-color: var(--bad); }

  .dz-campo__control--area { height: auto; line-height: var(--lh-3); resize: vertical; }
  /* Selector: sin la flecha nativa del navegador (que no sigue el tema ni el tamaño), con el chevron de Lucide en una envoltura. El chevron no
     recibe el puntero: el clic cae en el <select>. */
  .dz-campo__selector { position: relative; display: flex; align-items: center; }
  .dz-campo__control--selector { appearance: none; -webkit-appearance: none; padding-right: var(--s-6); cursor: pointer; }
  .dz-campo__chevron { position: absolute; right: var(--s-3); flex: none; color: var(--text-muted); pointer-events: none; }
  .dz-campo__control--selector:disabled + .dz-campo__chevron { opacity: var(--op-off); }

  /* Par chico, para la fila densa con boton--chico. En el contenedor (dz-campo--chico) o directo en el control (dz-campo__control--chico), que es
     como lo escribe LeadZ en un campo suelto (.zinput--sm): mismas medidas, sin pedir el contenedor. */
  .dz-campo--chico .dz-campo__control,
  .dz-campo__control--chico { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding-top: 0; padding-bottom: 0; padding-left: var(--s-2); }

  @media (pointer: coarse) {
    .dz-campo__control { font-size: var(--fs-4); }
  }
  /* El selector con el menú del sistema de diseño (2.3.0). Un <select> nativo abre el menú del sistema operativo, que no es el lenguaje del DS. Con appearance: base-select el navegador deja
     estilar el campo y su menú (::picker): el panel es el del menú del DS (hairline, radio de tarjeta, sombra media) y las opciones las de la lista del combobox (fila, fondo de selección, la
     elegida en peso 500). Sigue siendo un <select>: teclado, formulario, change y lectores de pantalla intactos. Donde el navegador no lo soporta (Safari, Firefox) queda el campo de siempre,
     con su chevron dibujado. */
  @supports (appearance: base-select) {
    .dz-campo__control--selector, .dz-campo__control--selector::picker(select) { appearance: base-select; }
    .dz-campo__control--selector { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); padding: 0 var(--s-3); background-image: none; }
    .dz-campo__control--selector + .dz-campo__chevron { display: none; }
    .dz-campo__control--selector::picker-icon {
      content: "";
      width: var(--ico-1);
      height: var(--ico-1);
      flex: none;
      background: currentColor;
      color: var(--text-muted);
      transition: rotate var(--dur-1) var(--ease-out);
      -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
      mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
    }
    .dz-campo__control--selector:open::picker-icon { rotate: 180deg; }
    .dz-campo__control--selector::picker(select) { box-sizing: border-box; min-width: anchor-size(width); margin-block: var(--s-1); position-area: block-end span-inline-end; position-try-fallbacks: flip-block; padding: var(--s-1); border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--surface); color: var(--text); box-shadow: var(--shadow-md); }
    .dz-campo__control--selector option { display: flex; align-items: center; gap: var(--s-2); min-height: var(--h-fila); padding: 0 var(--s-2); border-radius: var(--r-control); color: var(--text); font-size: var(--fs-3); cursor: pointer; }
    .dz-campo__control--selector option:hover, .dz-campo__control--selector option:focus-visible { background: var(--sel-bg); color: var(--sel-text); outline: none; }
    .dz-campo__control--selector option:checked { font-weight: 500; }
    .dz-campo__control--selector option::checkmark { order: 1; margin-left: auto; color: var(--text-2); }
    @media (pointer: coarse) { .dz-campo__control--selector option { min-height: var(--h-tactil); } }
  }
}

/* Campo compuesto: contenedor con borde (icono, sufijo, botones) y un <input> sin borde dentro. El anillo de foco y el borde de acento
   van en el CONTENEDOR con :focus-within; el input interno lleva outline: none y box-shadow: none. Dos rectángulos concéntricos leen
   como error. La etiqueta, la ayuda y el error son los de campo (usa: campo). */
@layer dz.componentes {
  .dz-campo-compuesto {
    display: flex;
    align-items: center;
    height: var(--dz-dens-control, var(--h-control));
    border-radius: var(--r-input);
    border: 1px solid var(--field-line);
    background: var(--field);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  /* Separación, relleno lateral y color del contenedor solo cuando el campo usa el control del DS. Un campo compuesto con input o select
     propios (el signo de monto, el prefijo de WhatsApp de LeadZ) pone los suyos: antes el DS los declaraba siempre y LeadZ los revertía. */
  .dz-campo-compuesto:where(:has(> .dz-campo-compuesto__control)) {
    gap: var(--s-2);
    padding: 0 var(--s-3);
    color: var(--text-muted);
  }
  .dz-campo-compuesto__icono { width: var(--ico-2); height: var(--ico-2); flex: none; }
  @media (hover: hover) {
    .dz-campo-compuesto:hover:not(:focus-within):not(:has(:disabled)):not(.dz-campo-compuesto--lectura) { border-color: var(--text-muted); }
  }
  .dz-campo-compuesto[data-ds-estado="hover"] { border-color: var(--text-muted); }
  /* Un solo anillo: si el foco cae en un botón dentro del campo, el botón pinta el suyo y el contenedor apaga el propio. */
  .dz-campo-compuesto:focus-within:not(:has(> .dz-boton:focus)),
  .dz-campo-compuesto[data-ds-estado="foco"] { border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-campo-compuesto--invalido,
  .dz-campo-compuesto:has([aria-invalid="true"]) { border-color: var(--bad); }
  /* El error gana al hover de reposo y al hover enseñado: con el puntero encima el borde sigue en rojo. */
  .dz-campo-compuesto--invalido:hover:not(:focus-within):not(:has(:disabled)),
  .dz-campo-compuesto:has([aria-invalid="true"]):hover:not(:focus-within):not(:has(:disabled)),
  .dz-campo-compuesto--invalido[data-ds-estado="hover"],
  .dz-campo-compuesto:has([aria-invalid="true"])[data-ds-estado="hover"] { border-color: var(--bad); }
  /* Deshabilitado: el contorno entero, con su icono y su sufijo, a --op-off (no un gris). Solo lo apaga su propio input: un botón o un día del calendario deshabilitado dentro no lo apaga. */
  .dz-campo-compuesto:has(> .dz-campo-compuesto__control:disabled) { opacity: var(--op-off); cursor: not-allowed; }
  /* Solo lectura: borde de línea suave y sin fondo de campo; al enfocar solo se suma el anillo, el borde no se oscurece. */
  .dz-campo-compuesto--lectura,
  .dz-campo-compuesto--lectura:focus-within:not(:has(> .dz-boton:focus)),
  .dz-campo-compuesto--lectura[data-ds-estado] { border-color: var(--border); background: transparent; }
  .dz-campo-compuesto--lectura .dz-campo-compuesto__control { cursor: default; }

  .dz-campo-compuesto__control {
    flex: 1;
    min-width: 0;
    height: 100%;
    padding: 0;
    background: transparent;
    border: 0;
    outline: none;
    box-shadow: none;
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-2);
    text-overflow: ellipsis;
  }
  .dz-campo-compuesto__control:focus,
  .dz-campo-compuesto__control:focus-visible { outline: none; box-shadow: none; animation: none; }
  .dz-campo-compuesto__control:disabled { cursor: not-allowed; }
  .dz-campo-compuesto__control::placeholder { color: var(--text-muted); opacity: 1; }
  /* Sin la equis ni la lupa nativas del type=search: el campo compuesto ya trae las suyas. */
  .dz-campo-compuesto__control[type="search"] { appearance: none; -webkit-appearance: none; }
  .dz-campo-compuesto__control[type="search"]::-webkit-search-decoration,
  .dz-campo-compuesto__control[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; appearance: none; }
  .dz-campo-compuesto__sufijo { flex: none; font-size: var(--fs-2); color: var(--text-muted); }
  /* Botones chicos dentro del campo (revelar, copiar): a ras del borde derecho. */
  .dz-campo-compuesto > .dz-boton:last-child { margin-right: calc(var(--s-2) * -1); }

  .dz-campo-compuesto--chico { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0 var(--s-2); }
  .dz-campo-compuesto--chico .dz-campo-compuesto__icono { width: var(--ico-2); height: var(--ico-2); }

  @media (pointer: coarse) {
    .dz-campo-compuesto__control { font-size: var(--fs-4); }
  }
}

/* Casilla y radio. La pieza del DS emite el input nativo dentro de su caja (dz-casilla__caja) y ahí se pinta con caja propia (Alex,
   23-oct-2026): 20 px, borde de 1,5 px en --text-muted (≥ 3:1 contra --bg, --surface y --field en los dos temas), marcada en
   --accent-control con el check de Lucide encima en --bg. El input sigue siendo nativo (semántica, teclado, formularios).
   La clase dz-casilla__control sobre un <input> que el producto ya tenga, sin la caja, conserva el glifo del navegador con su tamaño y
   sus márgenes (lo que pinta LeadZ, la fundación: 13 px, margen 3 3 3 4) y solo le da color, foco y cursor; --dz-casilla-tam lo ajusta.
   La etiqueta es el área que se toca: 24 px mínimo, 44 con puntero grueso. En forced-colors vuelve el control del sistema. */
@layer dz.componentes {
  .dz-casilla {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--s-6);
    font-size: var(--fs-2);
    color: var(--text);
    cursor: pointer;
  }
  .dz-casilla__texto { line-height: var(--lh-2); }
  /* Rótulo solo para el lector (casilla de fila): el área que se toca sigue siendo la etiqueta entera. */
  .dz-casilla__texto--oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-casilla__control { width: var(--dz-casilla-tam, auto); height: var(--dz-casilla-tam, auto); accent-color: var(--accent-control); cursor: pointer; }
  .dz-casilla__control:disabled { cursor: not-allowed; }
  .dz-casilla:has(:disabled) { cursor: not-allowed; }
  .dz-casilla:has(:disabled) .dz-casilla__texto { opacity: var(--op-off); }
  .dz-casilla__control:focus-visible,
  .dz-casilla[data-ds-estado="foco"] .dz-casilla__control { outline: 2px solid var(--focus); outline-offset: 2px; box-shadow: none; }

  .dz-casilla__caja {
    display: inline-grid;
    flex: none;
    place-items: center;
    width: var(--dz-casilla-tam, var(--s-5));
    height: var(--dz-casilla-tam, var(--s-5));
  }
  .dz-casilla__caja > * { grid-area: 1 / 1; }
  .dz-casilla__caja > .dz-casilla__control {
    appearance: none;
    -webkit-appearance: none;
    margin: 0;
    width: 100%;
    height: 100%;
    border: 1.5px solid var(--text-muted);
    border-radius: var(--r-1);
    background: var(--field);
    transition: background-color var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
  }
  .dz-casilla--radio .dz-casilla__caja > .dz-casilla__control { border-radius: 50%; }
  .dz-casilla:hover .dz-casilla__caja > .dz-casilla__control:not(:disabled) { border-color: var(--text-2); }
  .dz-casilla__caja > .dz-casilla__control:checked,
  .dz-casilla__caja > .dz-casilla__control[data-indeterminado] { background: var(--accent-control); border-color: var(--accent-control); }
  .dz-casilla--radio .dz-casilla__caja > .dz-casilla__control:checked,
  .dz-casilla--radio .dz-casilla__caja > .dz-casilla__control:checked:focus-visible {
    background: var(--field);
    box-shadow: inset 0 0 0 var(--s-1) var(--field), inset 0 0 0 var(--s-5) var(--accent-control);
  }
  .dz-casilla__caja > .dz-casilla__control[aria-invalid="true"] { border-color: var(--bad); }
  .dz-casilla__marca { pointer-events: none; color: var(--bg); stroke-width: 3; opacity: 0; width: var(--ico-1); height: var(--ico-1); }
  .dz-casilla__control:checked:not([data-indeterminado]) ~ .dz-casilla__marca:not(.dz-casilla__mixta),
  .dz-casilla__control[data-indeterminado] ~ .dz-casilla__mixta { opacity: 1; }
  .dz-casilla:has(:disabled) .dz-casilla__caja { opacity: var(--op-off); }
  @media (pointer: coarse) {
    .dz-casilla { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-casilla__caja > .dz-casilla__control { transition: none; }
  }
  @media (forced-colors: active) {
    .dz-casilla__caja > .dz-casilla__control { appearance: auto; -webkit-appearance: auto; border: 0; background: none; box-shadow: none; }
    .dz-casilla__marca { display: none; }
  }
}

/* Chip: píldora de --h-chip, relleno suave y texto en 500. Con punto de color cuando el chip es un estado: el color nunca va solo.
   Con presionado es un botón de dos estados; encendido, tinta invertida. */
@layer dz.componentes {
  .dz-chip {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-dens-chip, var(--h-chip));
    padding: 0 var(--s-2);
    border-radius: var(--r-chip);
    border: 0;
    background: var(--surface-2);
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-1);
    font-weight: 500;
    white-space: nowrap;
  }
  .dz-chip__punto { width: var(--punto-chip); height: var(--punto-chip); border-radius: 50%; background: currentColor; flex: none; margin-inline-end: calc(var(--s-1) * -1); }
  .dz-chip svg { width: var(--ico-1); height: var(--ico-1); flex: none; }
  /* El glifo y su rótulo a 8 (--s-2, ICB-118: 6 a 8). El punto de estado no es un glifo y conserva sus 4: el margen negativo devuelve lo que sobra. */
  .dz-chip--fuerte { background: var(--chip-on-bg); color: var(--chip-on-text); }
  .dz-chip--peligro { background: var(--bad-soft); color: var(--bad-text); }
  .dz-chip--ok { background: var(--ok-soft); color: var(--ok-text); }
  .dz-chip--aviso { background: var(--warn-soft); color: var(--warn-text); }

  .dz-chip--accion { cursor: pointer; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
  @media (hover: hover) {
    .dz-chip--accion:hover:not(:disabled):not([aria-pressed="true"]) { background: var(--surface-3); color: var(--text); }
  }
  .dz-chip--accion[data-ds-estado="hover"] { background: var(--surface-3); color: var(--text); }
  .dz-chip--accion[aria-pressed="true"] { background: var(--chip-on-bg); color: var(--chip-on-text); }
  .dz-chip--accion:focus-visible,
  .dz-chip--accion[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-chip--accion:disabled { opacity: var(--op-off); cursor: not-allowed; }
  /* Con el dedo el chip botón (el de dos estados) sube a --h-tactil; el chip que solo informa no se toca y conserva --h-chip. */
  @media (pointer: coarse) {
    .dz-chip--accion { height: var(--h-tactil); padding: 0 var(--s-3); }
  }
  /* En colores forzados el relleno desaparece y el chip botón dejaba de parecer botón: borde de sistema, y el encendido con el par Highlight (PCB-240). */
  @media (forced-colors: active) {
    .dz-chip--accion { border: 1px solid ButtonText; }
    .dz-chip--accion[aria-pressed="true"] { background: Highlight; color: HighlightText; border-color: HighlightText; forced-color-adjust: none; }
  }
}

/* Contador: inversión de tinta, nunca color. Cuando no hay pendientes el elemento no existe. */
@layer dz.componentes {
  .dz-contador {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: var(--contador);
    height: var(--contador);
    padding: 0 var(--s-1);
    border-radius: var(--r-pill);
    background: var(--text);
    color: var(--bg);
    font-size: var(--fs-1);
    font-weight: 600;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    flex: none;
  }
  .dz-contador--suave { background: var(--surface-2); color: var(--text-2); font-weight: 500; }
}

/* Endoso de la marca madre, «powered by» y su logo oficial en una línea. El logo mide 16 px de alto (--ico-1), que es el mínimo, y su ancho sale de la proporción
   de 6 a 1 del dibujo (alto fijo, ancho auto). La tinta es solo --tinta-firma: positivo sobre claro y negativo sobre oscuro, sin tercer color. El área de respeto es el
   ancho de una «Z» del logo (32,1 de sus 39 unidades de alto, o sea .82 del alto) a cada lado, arriba y abajo: va como relleno de la pieza y también separa el texto del logo.
   Colores forzados: el logo toma el color del texto del sistema. */
@layer dz.componentes {
  .dz-endoso {
    --dz-endoso-alto: var(--ico-1);
    --dz-endoso-respeto: calc(var(--dz-endoso-alto) * .82);
    display: inline-flex;
    align-items: center;
    gap: var(--dz-endoso-respeto);
    padding: var(--dz-endoso-respeto);
    color: var(--tinta-firma);
    font-size: var(--fs-1);
    line-height: 1;
    white-space: nowrap;
  }
  .dz-endoso__texto { color: var(--text-2); }
  .dz-endoso__logo { display: block; flex: none; width: auto; height: var(--dz-endoso-alto); }
  /* La barra (2.3.0): una franja fija al pie de la ventana, centrada, traslúcida y con el fondo desenfocado detrás. El área de respeto sigue siendo la de una «Z». El vidrio es la copia
     del fondo animado para WebKit: va detrás del texto y del logo y no recibe el puntero. */
  .dz-endoso--barra {
    --dz-endoso-respeto: var(--s-3);
    position: fixed;
    inset: auto 0 0;
    z-index: var(--z-base);
    justify-content: center;
    box-sizing: border-box;
    height: calc(var(--h-mov) + var(--s-1) + env(safe-area-inset-bottom));
    padding: 0 0 env(safe-area-inset-bottom);
    overflow: hidden;
    border-top: 1px solid var(--border);
    background: color-mix(in oklch, var(--text) 1.2%, transparent);
    -webkit-backdrop-filter: blur(var(--velo-blur));
    backdrop-filter: blur(var(--velo-blur));
    pointer-events: none;
  }
  .dz-endoso--barra .dz-endoso__texto { text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); }
  .dz-endoso__vidrio { position: absolute; inset: 0; z-index: -1; width: 100%; height: 100%; filter: blur(var(--s-3)) saturate(130%); transform: scale(1.04); pointer-events: none; }
}

/* Enlace de texto: se puede poner sobre cualquier <a> que ya esté en una frase (es en línea y no cambia el renglón).
   Color de acento sin subrayar, ni en reposo ni en hover; en hover cambia al tono hover junto con su icono.
   Flecha horizontal a la derecha si lleva a otra pantalla; la diagonal se reserva para abrir fuera del producto. */
@layer dz.componentes {
  /* En línea: parte renglón con la frase y no cambia su altura. La flecha es un icono en línea pegado a la última palabra. */
  .dz-enlace {
    display: inline;
    color: var(--accent-text);
    font-weight: 500;
    text-decoration: none;
    cursor: pointer;
    transition: color var(--dur-1) var(--ease-out);
  }
  /* Suelto (al pie de una tarjeta, de un aviso o en una celda, fuera de una frase): mide --h-mini con puntero fino y --h-tactil con el dedo; dentro de una frase WCAG 2.5.8 lo exime. */
  .dz-enlace--suelto { display: inline-flex; align-items: center; gap: var(--s-2); min-height: var(--h-mini); }
  @media (pointer: coarse) {
    .dz-enlace--suelto { min-height: var(--h-tactil); }
  }
  .dz-enlace svg { display: inline; width: var(--ico-1); height: var(--ico-1); vertical-align: -.15em; }
  @media (hover: hover) {
    .dz-enlace:hover { color: var(--link-hover); text-decoration: none; }
  }
  .dz-enlace[data-ds-estado="hover"] { color: var(--link-hover); }
  .dz-enlace:focus-visible,
  .dz-enlace[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); border-radius: var(--r-1); }
}

/* Esqueleto: conserva la forma de lo que viene. Forma y ancho son modificadores discretos, nunca atributos de estilo en línea. Con movimiento reducido queda quieto. */
@layer dz.componentes {
  .dz-esqueleto {
    display: block;
    width: 100%;
    border-radius: var(--r-control);
    position: relative;
    overflow: hidden;
    background: var(--surface-2);
  }
  /* El brillo es una capa que se desliza con transform (propiedad de composición, no de pintado) en un ciclo de 1,44 s (de 1 a 1,6 s). */
  .dz-esqueleto::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, transparent 0%, var(--surface-3) 50%, transparent 100%);
    transform: translateX(-100%);
    animation: dzBrilla calc(var(--dur-respira) * 1.6) linear infinite;
  }
  .dz-esqueleto--linea { height: var(--s-3); }
  .dz-esqueleto--titulo { height: var(--s-5); }
  .dz-esqueleto--bloque { height: calc(var(--h-fila) * 3); }
  .dz-esqueleto--circulo { width: var(--avatar); height: var(--avatar); border-radius: 50%; flex: none; }
  .dz-esqueleto--tres-cuartos { width: 75%; }
  .dz-esqueleto--mitad { width: 50%; }
  .dz-esqueleto--cuarto { width: 25%; }
  @keyframes dzBrilla { to { transform: translateX(100%); } }
  @media (prefers-reduced-motion: reduce) {
    .dz-esqueleto::after { animation: none; display: none; }
  }
}

/* Ilustración de estado: SVG de línea, lienzo de 96, trazo 3.5 redondo en currentColor (tinta --text-2), un tono más suave para lo accesorio y el acento
   (--accent-control) como único color. Sin relleno, degradado ni sombra. El tamaño es un modificador discreto; el dibujo escala entero. */
@layer dz.componentes {
  .dz-ilustracion { display: block; flex: none; width: var(--ilus-tam); height: var(--ilus-tam); color: var(--text-2); }
  .dz-ilustracion--chico { width: var(--ilus-tam-chico); height: var(--ilus-tam-chico); }
  .dz-ilustracion--grande { width: var(--ilus-tam-grande); height: var(--ilus-tam-grande); }
  .dz-ilustracion__acento { stroke: var(--accent-control); }
  .dz-ilustracion__tenue { stroke: var(--text-muted); }
  /* Línea discontinua delgada (Alex, 23-oct-2026): la mitad del trazo, rayas cortas de punta recta; con punta redonda y trazo 3.5 se leían como
     cuentas gruesas. */
  .dz-ilustracion__discontinuo { stroke-width: 1.75; stroke-linecap: butt; stroke-dasharray: 4 3; }
}

/* Imagen: el marco reserva su relación de aspecto antes de que llegue el archivo (sin salto de diseño). Cubre el marco por omisión; --contener la muestra
   entera. Cargando: fondo de superficie. Error: bloque centrado con icono y aviso. Lo dinámico (--cargando, --error) son clases que pone montarImagen. */
@layer dz.componentes {
  .dz-imagen { display: block; margin: 0; min-width: 0; }
  .dz-imagen__marco {
    position: relative;
    overflow: hidden;
    aspect-ratio: 16 / 9;
    border: 1px solid var(--line-2);
    border-radius: var(--r-card);
    background: var(--surface-2);
  }
  .dz-imagen--1x1 .dz-imagen__marco { aspect-ratio: 1 / 1; }
  .dz-imagen--4x3 .dz-imagen__marco { aspect-ratio: 4 / 3; }
  .dz-imagen--3x2 .dz-imagen__marco { aspect-ratio: 3 / 2; }
  .dz-imagen--16x9 .dz-imagen__marco { aspect-ratio: 16 / 9; }
  .dz-imagen--21x9 .dz-imagen__marco { aspect-ratio: 21 / 9; }
  .dz-imagen--3x4 .dz-imagen__marco { aspect-ratio: 3 / 4; }
  .dz-imagen__img { display: block; width: 100%; height: 100%; object-fit: cover; }
  .dz-imagen--contener .dz-imagen__img { object-fit: contain; }
  .dz-imagen--cargando .dz-imagen__img { opacity: 0; }
  .dz-imagen--error .dz-imagen__marco { border-style: dashed; border-color: var(--border-control); }
  .dz-imagen__img { transition: opacity var(--dur-2) var(--ease-out); }
  .dz-imagen__error {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--s-2);
    padding: var(--s-3);
    text-align: center;
    color: var(--text-2);
    font-size: var(--fs-2);
    line-height: var(--lh-2);
  }
  .dz-imagen__icono { width: var(--ico-4); height: var(--ico-4); }
  .dz-imagen__aviso { text-wrap: balance; }
  /* Rótulo dentro de la imagen: capa de contraste a negro al 60 % detrás de todo el texto (sobre blanco puro deja 5,7:1, PCB-88 y PCB-1897) y
     desvanecida solo en el relleno de arriba, para que la foto siga leyéndose. El degradado no puede aclararse detrás de la primera línea:
     el 24-oct dejaba el título de dos líneas a 1,8:1 sobre una foto blanca. Igual en claro y en oscuro: va sobre la foto, no sobre la página. */
  .dz-imagen__rotulo {
    position: absolute;
    inset: auto 0 0;
    display: flex;
    flex-direction: column;
    gap: var(--s-1);
    padding: var(--s-8) var(--s-4) var(--s-4);
    background: linear-gradient(to top, var(--c-negro-60) 0, var(--c-negro-60) calc(100% - var(--s-8)), transparent 100%);
    color: var(--c-gris-0);
    pointer-events: none;
  }
  .dz-imagen__titulo { font-size: var(--fs-4); font-weight: 500; line-height: var(--lh-2); text-wrap: balance; }
  .dz-imagen__detalle { font-size: var(--fs-2); line-height: var(--lh-2); }
  .dz-imagen__leyenda { margin-top: var(--s-2); font-size: var(--fs-2); line-height: var(--lh-2); color: var(--text-2); }
}

/* Interruptor: booleano de efecto inmediato, monocromático (el encendido es --switch-on; el verde queda para éxito). El <input> nativo
   es el control visible y se dibuja a sí mismo: appearance none, la pista es su fondo y borde, la perilla es su ::after. No hay pista
   hermana ni input oculto, así que la clase dz-interruptor__control se puede poner sobre el <input> que un producto ya tiene (con o
   sin el contenedor dz-interruptor) y su comportamiento no cambia. El anillo de foco va en el contorno de la pista, que es el input.
   Área de 24 de alto con puntero fino y 44 con el dedo. */
@layer dz.componentes {
  .dz-interruptor {
    display: inline-flex;
    align-items: center;
    gap: var(--s-3);
    min-height: var(--s-6);
    font-size: var(--fs-2);
    color: var(--text);
    cursor: pointer;
  }
  .dz-interruptor__control {
    -webkit-appearance: none;
    appearance: none;
    position: relative;
    box-sizing: border-box;
    vertical-align: middle;
    width: calc(var(--s-7) + 2px);
    height: var(--contador);
    margin: 0;
    padding: 0;
    border-radius: var(--r-pill);
    background: var(--surface-3);
    border: 1px solid var(--border-control);
    outline: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
  }
  /* En el contenedor del DS la pista no se encoge (LeadZ lo fija por contexto con .lz-cta__sw .zswitch). */
  .dz-interruptor > .dz-interruptor__control { flex: none; }
  /* Área táctil de la pista (la que tiene LeadZ): 3 px arriba y abajo y 4 a los lados con puntero fino; 44 de alto con el dedo. */
  .dz-interruptor__control::before { content: ""; position: absolute; inset: -3px calc(var(--s-1) * -1); box-sizing: content-box; }
  @media (pointer: coarse) {
    .dz-interruptor__control::before { inset: calc(-1 * ((var(--h-tactil) - var(--contador)) / 2 + 1px)) calc(var(--s-1) * -1); }
  }
  .dz-interruptor__control::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: calc(var(--contador) - var(--s-1) - 2px);
    height: calc(var(--contador) - var(--s-1) - 2px);
    border-radius: 50%;
    background: var(--surface);
    box-sizing: content-box;
    box-shadow: 0 0 0 1px var(--border-control);
    transition: transform var(--dur-1) var(--ease-out);
  }
  .dz-interruptor__control:active::after { width: calc(var(--contador) - 2px); }
  .dz-interruptor__control:checked { background: var(--switch-on); border-color: var(--switch-on); }
  .dz-interruptor__control:checked::after { transform: translateX(calc(var(--s-3) + 2px)); background: var(--surface); box-shadow: none; }
  @media (hover: hover) {
    .dz-interruptor__control:hover:not(:disabled):not(:checked) { border-color: var(--text-muted); }
  }
  .dz-interruptor[data-ds-estado="hover"] .dz-interruptor__control:not(:checked) { border-color: var(--text-muted); }
  .dz-interruptor__control:focus-visible,
  .dz-interruptor[data-ds-estado="foco"] .dz-interruptor__control { outline: none; box-shadow: var(--ring); }
  .dz-interruptor__control:disabled,
  .dz-interruptor__control:disabled ~ .dz-interruptor__texto { opacity: var(--op-off); }
  .dz-interruptor__control:disabled { cursor: not-allowed; }
  .dz-interruptor:has(:disabled) { cursor: not-allowed; }
  .dz-interruptor__texto { display: flex; flex-direction: column; gap: var(--s-1); }
  .dz-interruptor__ayuda { font-size: var(--fs-1); color: var(--text-muted); }
  @media (pointer: coarse) {
    .dz-interruptor { min-height: var(--h-tactil); }
  }
  /* Alto contraste de Windows: el estado vive en el borde y en colores del sistema. */
  @media (forced-colors: active) {
    .dz-interruptor__control { border-color: ButtonText; }
    .dz-interruptor__control::after { background: ButtonText; border: 1px solid ButtonText; box-shadow: none; }
    .dz-interruptor__control:checked { forced-color-adjust: none; background: Highlight; border-color: Highlight; }
    .dz-interruptor__control:checked::after { background: HighlightText; border-color: HighlightText; }
  }
}

/* Kbd: una tecla o un atajo en una caja chica (el «/» del buscador de filtros, «⌘ S»). Las teclas de un atajo van unidas por un «+». */
@layer dz.componentes {
  .dz-kbd {
    display: inline-grid;
    place-items: center;
    min-width: var(--contador);
    height: var(--contador);
    padding: 0 var(--s-1);
    font-family: var(--font);
    font-size: var(--fs-1);
    line-height: 1;
    color: var(--text-2);
    background: var(--surface-2);
    border: 1px solid var(--line-2);
    border-radius: var(--r-1);
    white-space: nowrap;
  }
  .dz-kbd svg { display: block; width: var(--ico-1); height: var(--ico-1); }
  .dz-kbd__grupo { display: inline-flex; align-items: center; gap: 2px; flex: none; }
  .dz-kbd__voz { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .dz-kbd__mas { font-size: var(--fs-1); color: var(--text-muted); }
  @media (forced-colors: active) {
    .dz-kbd { border-color: ButtonText; background: ButtonFace; color: ButtonText; }
  }
}

/* Marca de IA: el chip «Generado por IA» (el del DS, con el icono sparkles) y, si una persona revisó, quién y qué hizo, en texto atenuado. Sin estados de carga ni de error:
   es texto. Envuelve en el segundo renglón si no cabe y el chip conserva su altura. */
@layer dz.componentes {
  .dz-marca-ia { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); min-width: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-marca-ia__quien { font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
}

/* Motivo: la capa decorativa de marca. Rayas diagonales de una línea que viven DETRÁS del contenido, nunca sobre una tarjeta. Solo CSS: sin imagen, sin JS,
   sin movimiento (queda quieto, así que cumple WCAG 2.2.2 y el movimiento reducido sin más). El contenedor que lo aloja es position: relative con isolation: isolate,
   para que la capa quede detrás de su contenido y no detrás de la página. Con colores forzados y al imprimir desaparece. */
@layer dz.componentes {
  .dz-motivo {
    position: absolute;
    inset: 0;
    z-index: calc(var(--z-base) * -1);
    overflow: hidden;
    pointer-events: none;
  }
  .dz-motivo--rayas {
    background-image: repeating-linear-gradient(
      var(--motivo-angulo),
      var(--motivo-linea) 0,
      var(--motivo-linea) var(--motivo-grosor),
      transparent var(--motivo-grosor),
      transparent var(--motivo-paso)
    );
  }
  /* Nunca sobre tarjetas (guía de marca): dentro de una tarjeta el motivo no se pinta, aunque alguien lo ponga ahí. */
  .dz-tarjeta .dz-motivo { display: none; }
  @media (forced-colors: active) {
    .dz-motivo { display: none; }
  }
  @media print {
    .dz-motivo { display: none; }
  }
}

/* Pila: apila sus hijos con un espacio de la escala (--s-1 a --s-8, 4 por omisión). Columna por omisión, con los hijos a todo el ancho;
   dz-pila--fila los pone en una fila que parte renglón. Sin márgenes en los hijos: el espacio es el gap de la pila, así que un hijo
   que se quita no deja un hueco y uno que se agrega no pide margen. */
@layer dz.componentes {
  .dz-pila { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
  .dz-pila--1 { gap: var(--s-1); }
  .dz-pila--2 { gap: var(--s-2); }
  .dz-pila--3 { gap: var(--s-3); }
  .dz-pila--5 { gap: var(--s-5); }
  .dz-pila--6 { gap: var(--s-6); }
  .dz-pila--7 { gap: var(--s-7); }
  .dz-pila--8 { gap: var(--s-8); }
  .dz-pila--fila { flex-direction: row; flex-wrap: wrap; align-items: center; }
  .dz-pila--inicio { align-items: flex-start; }
  .dz-pila--centro { align-items: center; }
  .dz-pila--fin { align-items: flex-end; }
  .dz-pila > * { min-width: 0; }
  /* Lo que mide lo que dice (un botón, una casilla, un chip) no se estira a todo el ancho de la columna; los campos, tarjetas y tablas sí. */
  .dz-pila:not(.dz-pila--fila):not(.dz-pila--inicio):not(.dz-pila--centro):not(.dz-pila--fin) > :is(.dz-boton, .dz-casilla, .dz-interruptor, .dz-control-segmentado, .dz-chip, .dz-menu) { align-self: flex-start; }
}

/* Barra de progreso: pista de --surface-3 y relleno en tinta de control; el tono (ok, aviso, error) cambia el relleno (el aviso usa el ámbar de texto, que pasa 3:1 contra la pista) y añade un renglón con icono y texto, nunca solo
   color. Tres tamaños de pista (4, 8 y 12 px por la escala). Indeterminada: una franja que corre con transform; con movimiento reducido se queda quieta, ocupa
   toda la pista y baja de intensidad, y el texto «Cargando» sigue a la vista. Documentado: el progreso suelto de velo-entrada y de zona-carga puede adoptar esta pieza. */
@layer dz.componentes {
  .dz-progreso {
    --progreso-relleno: var(--accent-control);
    --progreso-alto: var(--s-2);
    display: flex;
    flex-direction: column;
    gap: var(--s-2);
    width: 100%;
    min-width: 0;
    color: var(--text-2);
    font-size: var(--fs-2);
    line-height: var(--lh-2);
  }
  .dz-progreso--chico { --progreso-alto: var(--s-1); }
  .dz-progreso--grande { --progreso-alto: var(--s-3); }
  .dz-progreso--ok { --progreso-relleno: var(--ok); }
  .dz-progreso--aviso { --progreso-relleno: var(--warn-text); }
  .dz-progreso--error { --progreso-relleno: var(--bad); }
  .dz-progreso__cabecera { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-3); min-width: 0; }
  .dz-progreso__etiqueta { min-width: 0; font-weight: 500; color: var(--text); }
  .dz-progreso__valor { flex: none; font-variant-numeric: tabular-nums; color: var(--text-2); }
  .dz-progreso--indeterminada .dz-progreso__valor { color: var(--text-muted); }
  .dz-progreso__pista { position: relative; display: block; height: var(--progreso-alto); border-radius: var(--r-pill); overflow: hidden; background: var(--surface-3); }
  .dz-progreso__barra {
    -webkit-appearance: none;
    appearance: none;
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
    border-radius: var(--r-pill);
    background: transparent;
    color: var(--progreso-relleno);
    overflow: hidden;
  }
  .dz-progreso__barra::-webkit-progress-bar { background: transparent; border-radius: var(--r-pill); }
  .dz-progreso__barra::-webkit-progress-value { background: var(--progreso-relleno); border-radius: var(--r-pill); transition: width var(--dur-3) var(--ease-out); }
  .dz-progreso__barra::-moz-progress-bar { background: var(--progreso-relleno); border-radius: var(--r-pill); }
  .dz-progreso__ir {
    position: absolute;
    inset-block: 0;
    inset-inline-start: 0;
    width: 40%;
    border-radius: var(--r-pill);
    background: var(--progreso-relleno);
    transform: translateX(-100%);
    animation: dzProgresoCorre calc(var(--dur-respira) * 1.6) var(--ease-velo) infinite;
  }
  @keyframes dzProgresoCorre { to { transform: translateX(250%); } }
  .dz-progreso__estado { display: flex; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-1); font-weight: 500; color: var(--text-2); }
  .dz-progreso__icono { flex: none; width: var(--ico-1); height: var(--ico-1); }
  .dz-progreso--ok .dz-progreso__estado { color: var(--ok-text); }
  .dz-progreso--aviso .dz-progreso__estado { color: var(--warn-text); }
  .dz-progreso--error .dz-progreso__estado { color: var(--bad-text); }
  /* Colores forzados: pista y relleno son fondos y el modo los anula; el contorno de la pista y el relleno en colores del sistema los devuelven. */
  @media (forced-colors: active) {
    .dz-progreso__pista { border: 1px solid CanvasText; }
    .dz-progreso__barra::-webkit-progress-value,
    .dz-progreso__ir { background: Highlight; forced-color-adjust: none; }
    .dz-progreso__barra::-moz-progress-bar { background: Highlight; forced-color-adjust: none; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-progreso__barra::-webkit-progress-value { transition: none; }
    .dz-progreso__ir { animation: none; transform: none; width: 100%; opacity: .4; }
  }
}

/* Rótulo de sección: mono de 12 px en mayúsculas con aire entre letras. Tinta apagada por omisión; tinta y acento suben el tono. */
@layer dz.componentes {
  .dz-rotulo-seccion { margin: 0; font-family: var(--mono-code); font-size: var(--fs-1); font-weight: 500; line-height: var(--lh-2); letter-spacing: .08em; text-transform: uppercase; color: var(--text-muted); }
  .dz-rotulo-seccion--tinta { color: var(--text); }
  .dz-rotulo-seccion--acento { color: var(--accent-text); }
}

/* Tendencia (átomo): la forma de una serie corta junto a una cifra. Sin texto dentro, así que no necesita escalar: mide lo mismo a 280 que a 1280.
   Línea en --dato-2 y punto final en --dato-1 con un aro de superficie; la referencia (meta, umbral, periodo anterior) es un punteado en --dato-umbral (3:1 contra la superficie). */
@layer dz.componentes {
  .dz-tendencia { display: block; width: var(--w-tendencia); max-width: 100%; height: var(--h-tendencia); overflow: visible; }
  .dz-tendencia__linea { fill: none; stroke: var(--dato-2); stroke-width: 1.5; stroke-linejoin: round; stroke-linecap: round; }
  .dz-tendencia__referencia { fill: none; stroke: var(--dato-umbral); stroke-width: 1; stroke-dasharray: 2 3; }
  .dz-tendencia__punto { fill: var(--dato-1); stroke: var(--surface); stroke-width: 2; }
  /* En una celda de tabla (DCB-69): a la altura de la fila, en línea con el número. */
  .dz-tabla__celda .dz-tendencia { display: inline-block; width: calc(var(--s-8) * 2); height: var(--s-5); vertical-align: middle; }
  @media (forced-colors: active) {
    .dz-tendencia__linea, .dz-tendencia__referencia { stroke: CanvasText; }
    .dz-tendencia__punto { fill: CanvasText; stroke: Canvas; }
  }
}

/* Acordeón: secciones en una caja con hairline entre una y otra. La cabecera mide --h-tactil siempre; el chevron gira 90 grados al abrir y, con movimiento
   reducido, no gira. El resumen de la sección cerrada se va al abrir. El foco es un anillo hacia adentro en el contorno de la cabecera, que sigue el radio de la caja. */
@layer dz.componentes {
  .dz-acordeon { interpolate-size: allow-keywords; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-acordeon--plano { border-color: transparent; background: transparent; }
  .dz-acordeon__item + .dz-acordeon__item { border-top: 1px solid var(--border); }
  .dz-acordeon--plano .dz-acordeon__item + .dz-acordeon__item { border-top-color: var(--hairline); }
  .dz-acordeon__item:first-child > .dz-acordeon__cabecera { border-start-start-radius: calc(var(--r-card) - 1px); border-start-end-radius: calc(var(--r-card) - 1px); }
  .dz-acordeon__item:last-child:not([open]) > .dz-acordeon__cabecera { border-end-start-radius: calc(var(--r-card) - 1px); border-end-end-radius: calc(var(--r-card) - 1px); }
  .dz-acordeon__cabecera {
    list-style: none;
    display: flex;
    align-items: center;
    gap: var(--s-3);
    min-block-size: var(--dz-dens-fila, var(--h-tactil));
    padding: 0 var(--s-4);
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out);
  }
  .dz-acordeon__cabecera::-webkit-details-marker { display: none; }
  @media (hover: hover) {
    .dz-acordeon__cabecera:hover { background: var(--surface-2); }
  }
  .dz-acordeon__cabecera[data-ds-estado="hover"] { background: var(--surface-2); }
  .dz-acordeon__cabecera:focus-visible,
  .dz-acordeon__cabecera[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring-inset); }
  .dz-acordeon__titulo { min-inline-size: 0; font-size: var(--fs-3); font-weight: 600; color: var(--text-2); }
  .dz-acordeon__item[open] > .dz-acordeon__cabecera .dz-acordeon__titulo { color: var(--text); }
  .dz-acordeon__resumen { flex: 1; min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: end; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-acordeon__item[open] .dz-acordeon__resumen { display: none; }
  .dz-acordeon__chevron { flex: none; margin-inline-start: auto; color: var(--text-muted); transition: transform var(--dur-2) var(--ease-out); } /* gira lo que tarda el panel que acompaña (::details-content, --dur-2) */
  .dz-acordeon__item[open] > .dz-acordeon__cabecera .dz-acordeon__chevron { transform: rotate(90deg); }
  .dz-acordeon__cuerpo { padding: var(--s-3) var(--s-4) var(--s-4); border-top: 1px solid var(--hairline); }
  .dz-acordeon--plano .dz-acordeon__cuerpo { padding-inline: 0; border-top-color: transparent; }
  @supports selector(::details-content) {
    .dz-acordeon__item::details-content { block-size: 0; overflow: clip; transition: block-size var(--dur-2) var(--ease-out), content-visibility var(--dur-2) allow-discrete; }
    .dz-acordeon__item[open]::details-content { block-size: auto; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-acordeon__chevron { transition: none; }
    .dz-acordeon__item::details-content { transition: none; }
  }
}

/* Adeudo y cobro, neutra (P9): monto en MXN, fecha de vencimiento, estado y acción. Sin marcas de tarjeta ni de pasarela. El estado va con icono y palabra,
   nunca solo con color. Tarjeta por omisión; --barra es la franja de una línea del aviso de adeudo (mide lo mismo que la de LeadZ salvo lo escrito en la
   prueba estilos-contra-leadz). La posición (sticky, arriba de la pantalla) la pone el producto. */
@layer dz.componentes {
  .dz-adeudo-cobro {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-4) var(--s-5);
    padding: var(--s-4) var(--s-5);
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
  }
  .dz-adeudo-cobro--vencido { border-color: var(--bad); }
  .dz-adeudo-cobro__cuerpo { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-adeudo-cobro__concepto { margin: 0; font-size: var(--fs-2); line-height: var(--lh-2); color: var(--text-2); }
  .dz-adeudo-cobro__monto { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s-2); margin: 0; }
  .dz-adeudo-cobro__cifra { font-size: var(--fs-7); font-weight: 600; line-height: var(--lh-1); font-variant-numeric: tabular-nums; }
  .dz-adeudo-cobro__moneda { font-size: var(--fs-2); font-weight: 500; color: var(--text-2); }
  .dz-adeudo-cobro__fecha { margin: 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); }
  .dz-adeudo-cobro__lado { display: grid; justify-items: start; gap: var(--s-3); }
  .dz-adeudo-cobro__estado {
    display: inline-flex;
    align-items: center;
    gap: var(--s-1);
    height: var(--dz-dens-chip, var(--h-chip));
    padding: 0 var(--s-2);
    border: 1px solid var(--border-control);
    border-radius: var(--r-chip);
    font-size: var(--fs-1);
    font-weight: 500;
    color: var(--text-2);
  }
  .dz-adeudo-cobro--pendiente .dz-adeudo-cobro__estado { border-color: var(--border-control); background: var(--surface-2); }
  .dz-adeudo-cobro--por-vencer .dz-adeudo-cobro__estado { border-color: var(--warn); background: var(--warn-soft); color: var(--warn-text); }
  .dz-adeudo-cobro--vencido .dz-adeudo-cobro__estado { border-color: var(--bad); background: var(--bad-soft); color: var(--bad-text); }
  .dz-adeudo-cobro--pagado .dz-adeudo-cobro__estado { border-color: var(--ok); background: var(--ok-soft); color: var(--ok-text); }
  .dz-adeudo-cobro__mensaje { overflow-wrap: anywhere; }
  .dz-adeudo-cobro__accion { display: flex; flex-wrap: wrap; gap: var(--s-2); }

  /* Franja de una línea: el mensaje y una salida. Mismos valores que #lz-adeudo salvo el relleno vertical (8, de la escala) y el tamaño de letra (14, el de la escala). */
  .dz-adeudo-cobro--barra {
    display: block;
    flex-wrap: nowrap;
    align-items: normal;
    justify-content: normal;
    gap: 0;
    box-sizing: border-box;
    min-height: var(--dz-dens-control, var(--h-control));
    padding: var(--s-2) var(--s-4);
    border: 0;
    border-bottom: 1px solid var(--warn);
    border-radius: 0;
    background: var(--warn-soft);
    color: var(--warn-text);
    font-family: var(--font);
    font-size: var(--fs-2);
    font-weight: 500;
    line-height: var(--lh-2);
    text-align: center;
  }
  .dz-adeudo-cobro--barra.dz-adeudo-cobro--por-vencer { font-weight: 600; border-bottom-width: 2px; }
  .dz-adeudo-cobro--barra.dz-adeudo-cobro--vencido { font-weight: 600; border-bottom: 2px solid var(--bad); background: var(--bad-soft); color: var(--bad-text); }
  .dz-adeudo-cobro--barra.dz-adeudo-cobro--pagado { border-bottom-color: var(--ok); background: var(--ok-soft); color: var(--ok-text); }
  .dz-adeudo-cobro--barra .dz-enlace { margin-left: var(--s-3); font-weight: 600; }
  .dz-adeudo-cobro--barra.dz-adeudo-cobro--vencido .dz-enlace { color: var(--bad-text); }
}

/* Aviso dentro de una tarjeta o modal (dirección «Regleta», elegida por Alex el 23-oct-2026 entre cuatro de Fable): fondo de segunda
   superficie sin borde, regleta de tono al borde de inicio e icono del tono. El tono se dice con regleta, icono y texto (nunca solo color);
   el cuerpo es neutro y el enlace conserva su acento en todos los tonos. Las marcas usan los tokens *-text, que pasan 3:1 en claro y oscuro;
   informativo toma el gris de control (--accent-control); --brand no pinta controles ni avisos. Nunca borde de tono (tarjeta dentro de tarjeta) ni píldora.
   --en-linea es el aviso de formulario: sin caja, icono y mensaje en el color del tono, para ir bajo un campo o en una fila de ajustes.
   Un .dz-aviso con texto suelto (sin las partes de la pieza) se queda como el .zaviso de LeadZ: borde de 1 px del tono y texto del tono. */
@layer dz.componentes {
  .dz-aviso {
    --aviso-marca: var(--text-muted);
    padding: var(--s-2) var(--s-3);
    border: 1px solid var(--border);
    border-radius: var(--r-control);
    background: transparent;
    font-size: var(--fs-2);
    line-height: var(--lh-3);
  }
  .dz-aviso:not(:has(> .dz-aviso__cuerpo)).dz-aviso--informativo { border-color: var(--accent); color: var(--accent-text); }
  .dz-aviso:not(:has(> .dz-aviso__cuerpo)).dz-aviso--advertencia { border-color: var(--warn); color: var(--warn-text); }
  .dz-aviso:not(:has(> .dz-aviso__cuerpo)).dz-aviso--error { border-color: var(--bad-soft); background: var(--bad-soft); color: var(--bad-text); }
  .dz-aviso:not(:has(> .dz-aviso__cuerpo)).dz-aviso--ok { border-color: var(--ok); color: var(--ok-text); }

  /* La pieza armada (icono y cuerpo): segunda superficie, regleta e icono del tono. */
  .dz-aviso:has(> .dz-aviso__cuerpo) {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: var(--s-3);
    padding: var(--s-3) var(--s-4);
    border: 0;
    background: var(--surface-2);
    color: var(--text-2);
    overflow: clip;
  }
  /* Regleta: 4 px (--s-1) al borde de inicio, recortada por el radio de la pieza. */
  .dz-aviso:has(> .dz-aviso__cuerpo)::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; width: var(--s-1); background: var(--aviso-marca); }
  /* El icono mide una línea de alto para centrarse en el primer renglón, con una línea o con título y texto. */
  .dz-aviso__marca { display: inline-grid; place-items: center; flex: none; width: var(--ico-2); height: calc(var(--lh-3) * 1em); color: var(--aviso-marca); }
  .dz-aviso__icono { width: var(--ico-2); height: var(--ico-2); }
  .dz-aviso__cuerpo { display: flex; flex: 1; flex-direction: column; gap: var(--s-1); min-width: 0; }
  .dz-aviso__titulo { margin: 0; font-weight: 600; color: var(--text); }
  .dz-aviso__texto { margin: 0; }
  /* Sin título, el texto es el mensaje y va en el color principal. */
  .dz-aviso__texto:first-child { color: var(--text); }
  /* Pie: los botones (Reintentar como primario chico en un error) y el enlace con flecha. Un botón secundario se levanta con la superficie
     base para no perderse en la segunda superficie. */
  .dz-aviso__pie { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-4); margin-block-start: var(--s-1); }
  .dz-aviso__pie .dz-boton:not(.dz-boton--primario) { background: var(--surface); }
  .dz-aviso--informativo { --aviso-marca: var(--accent-control); }
  .dz-aviso--advertencia { --aviso-marca: var(--warn-text); }
  .dz-aviso--error { --aviso-marca: var(--bad-text); }
  .dz-aviso--ok { --aviso-marca: var(--ok-text); }

  /* En línea: sin caja ni regleta; el título y el mensaje toman el tono, el texto largo queda neutro. */
  .dz-aviso--en-linea:has(> .dz-aviso__cuerpo) { gap: var(--s-2); padding: 0; border-radius: 0; background: transparent; overflow: visible; }
  .dz-aviso--en-linea:has(> .dz-aviso__cuerpo)::before { content: none; }
  .dz-aviso--en-linea .dz-aviso__titulo,
  .dz-aviso--en-linea .dz-aviso__texto:first-child { color: var(--aviso-marca); }
  .dz-aviso--en-linea .dz-aviso__pie .dz-boton:not(.dz-boton--primario) { background: transparent; }
  /* El botón fantasma se descuelga su propio relleno para que su glifo quede en la columna del texto. */
  .dz-aviso--en-linea .dz-aviso__pie .dz-boton--fantasma { margin-inline-start: calc(var(--s-3) * -1); }

  /* Colores forzados: el fondo desaparece, así que la forma la da el borde y la regleta pasa a ser un borde grueso. */
  @media (forced-colors: active) {
    .dz-aviso:has(> .dz-aviso__cuerpo) { border: 1px solid CanvasText; border-inline-start-width: var(--s-1); }
    .dz-aviso:has(> .dz-aviso__cuerpo)::before { display: none; }
    .dz-aviso--en-linea:has(> .dz-aviso__cuerpo) { border: 0; }
  }
}

/* Aviso de borrador: un aviso informativo del DS (icono de historial, regleta de acento) con «Recuperar» y «Descartar» en su pie. Sale con hidden y
   el comportamiento lo muestra solo cuando hay un borrador distinto de lo que el formulario trae. Va arriba del formulario, con el aire de un bloque; la fecha y hora van en cifras tabulares. */
@layer dz.componentes {
  .dz-aviso-borrador { margin-block-end: var(--s-4); }
  .dz-aviso-borrador__fecha { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--text); }
}

/* Barra de lote: superficie flotante con hairline y sombra, pegada arriba de la tabla (sticky) mientras hay filas seleccionadas. Ocupa su
   sitio siempre (sin selección, invisible): si solo ocupara flujo al aparecer empujaría la tabla bajo el puntero. La cuenta lleva la cifra
   tabular para que no baile al marcar. La acción destructiva es el botón de peligro y nombra la cuenta. A 560 px o menos pasa a barra fija
   abajo (de borde a borde, con el área segura del teléfono) y sin selección no ocupa nada, con todos los objetivos de 44 px; dentro del
   cascarón se apoya sobre su barra inferior. Lo que queda bajo una barra fija se resuelve en el contenedor que desplaza: el comportamiento
   lo marca con data-dz-reserva y le pone --dz-barra-lote-alto (el alto medido de la barra): un espacio al final del contenido y el
   scroll-padding, para que ni el final de la página ni el foco queden bajo la barra. --dz-barra-lote-arriba separa la barra del borde
   superior si hay una cabecera pegada. */
@layer dz.componentes {
  .dz-barra-lote {
    position: sticky;
    top: var(--dz-barra-lote-arriba, 0);
    z-index: var(--z-sticky);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--s-2) var(--s-3);
    margin-bottom: var(--s-2);
    padding: var(--s-2) var(--s-3);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: var(--shadow-md);
    color: var(--text);
    font-size: var(--fs-3);
    transition: opacity var(--dur-2) var(--ease-out), transform var(--dur-2) var(--ease-out), visibility 0s;
  }
  /* Entra y sale en vez de aparecer de golpe (ACB-8, ACB-12): en escritorio se funde en su sitio, que ya está reservado; en teléfono sube y baja desde el borde (abajo). Sale más corto que entra y con la curva de lo que se va. */
  .dz-barra-lote[data-dz-vacia] { visibility: hidden; opacity: 0; transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale), visibility 0s linear var(--dur-1); }
  /* El espécimen vacío no reserva el hueco de la barra: la ficha enseña la barra cuando hay selección y no un vacío sin contenido. */
  .dz-barra-lote[data-dz-vacia][data-dz-muestra] { display: none; }
  .dz-barra-lote__cuenta { margin: 0; font-weight: 500; white-space: nowrap; }
  .dz-barra-lote__cifra { font-variant-numeric: tabular-nums; }
  .dz-barra-lote__unidad { font-weight: 400; color: var(--text-2); }
  /* Dos pasos para «todos» (PCB-673): la barra ofrece seleccionar lo cargado y después todo lo que cumple el filtro. */
  .dz-barra-lote__todo { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-barra-lote__todo[hidden] { display: none; }
  .dz-barra-lote__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-barra-lote__quitar { margin-inline-start: auto; }
  @media (max-width: 560px) {
    .dz-barra-lote {
      position: fixed;
      inset-inline: 0;
      top: auto;
      bottom: env(safe-area-inset-bottom);
      z-index: var(--z-drawer);
      margin: 0;
      padding: var(--s-2) var(--s-4);
      border-width: 1px 0 0;
      border-radius: var(--r-card) var(--r-card) 0 0;
    }
    :root:has(.dz-cascaron:not(.dz-cascaron--incrustado)) .dz-barra-lote { bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom)); }
    .dz-barra-lote { transition: opacity var(--dur-2) var(--ease-out), transform var(--dur-2) var(--ease-out), display var(--dur-2) allow-discrete; }
    .dz-barra-lote[data-dz-vacia] { display: none; transform: translateY(100%); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale), display var(--dur-1) allow-discrete; }
    @starting-style { .dz-barra-lote:not([data-dz-vacia]):not([data-dz-muestra]) { opacity: 0; transform: translateY(100%); } }
    [data-dz-reserva] { scroll-padding-bottom: var(--dz-barra-lote-alto, 0); }
    [data-dz-reserva]::after { content: ""; display: block; height: var(--dz-barra-lote-alto, 0); }
    /* El espécimen (data-dz-muestra) se queda en flujo: fija, taparía la página que lo enseña. */
    .dz-barra-lote[data-dz-muestra] { position: static; border-width: 1px; border-radius: var(--r-card); }
    .dz-barra-lote .dz-boton { min-height: var(--h-tactil); }
    .dz-barra-lote__cuenta { display: flex; align-items: center; gap: var(--s-1); min-height: var(--h-tactil); }
    .dz-barra-lote__acciones { flex: 1 0 100%; order: 3; }
    .dz-barra-lote__accion { flex: 1 1 auto; justify-content: center; }
  }
  /* Con movimiento reducido solo hay fundido: la barra no sube ni baja (ni en escritorio ni en teléfono). */
  @media (prefers-reduced-motion: reduce) {
    .dz-barra-lote[data-dz-vacia] { transform: none; }
    @starting-style { .dz-barra-lote:not([data-dz-vacia]):not([data-dz-muestra]) { transform: none; } }
  }
}

/* Borrador de IA: un texto generado que va a salir. Borde punteado y superficie anidada mientras nadie lo firma; enviado pasa a borde continuo y superficie normal.
   Distinto del aviso de borrador (que recupera lo que la persona escribió en un formulario). El texto conserva sus saltos de línea. Regenerar cambia el texto por tres
   esqueletos con su forma y deja «Detener» como única acción. La tarjeta es contenedor: bajo 560 px de ancho propio, la acción principal ocupa el renglón. */
@layer dz.componentes {
  .dz-borrador-ia { container-type: inline-size; display: grid; gap: var(--s-3); min-width: 0; padding: var(--s-3) var(--s-4); border: 1px dashed var(--border-control); border-radius: var(--r-card); background: var(--surface-anidada); color: var(--text); }
  .dz-borrador-ia__cab { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); }
  .dz-borrador-ia__estado { display: inline-flex; align-items: center; }
  .dz-borrador-ia__titulo { font-size: var(--fs-2); font-weight: 500; color: var(--text-2); }
  .dz-borrador-ia__texto { font-size: var(--fs-3); line-height: var(--lh-3); white-space: pre-line; overflow-wrap: anywhere; }
  .dz-borrador-ia__texto p { margin: 0; }
  .dz-borrador-ia__texto[hidden],
  .dz-borrador-ia__edicion[hidden],
  .dz-borrador-ia__espera[hidden],
  .dz-borrador-ia__acciones[hidden] { display: none; }
  .dz-borrador-ia__espera { display: grid; gap: var(--s-2); }
  .dz-borrador-ia__porque { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-borrador-ia__porque b { font-weight: 500; color: var(--text-2); }
  .dz-borrador-ia__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-borrador-ia__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-borrador-ia[data-dz-estado="enviado"] { border-style: solid; border-color: var(--border); background: var(--surface); }
  .dz-borrador-ia[data-dz-estado="descartado"] .dz-borrador-ia__texto { color: var(--text-muted); text-decoration: line-through; text-decoration-color: var(--line-2); }
  @container (max-width: 560px) {
    .dz-borrador-ia__acciones > .dz-boton--primario { flex: 1 1 100%; justify-content: center; }
    .dz-borrador-ia__acciones > .dz-boton:not(.dz-boton--primario) { flex: 1 1 auto; justify-content: center; }
  }
  @media (forced-colors: active) { .dz-borrador-ia { border-color: CanvasText; } }
}

/* Cabecera de página: un título de --fs-6 en 500 con la cifra al lado, la línea de apoyo debajo y las acciones a la derecha, en un mismo eje. */
@layer dz.componentes {
  .dz-cabecera-pagina { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); flex-wrap: wrap; }
  .dz-cabecera-pagina__titulos { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
  .dz-cabecera-pagina__fila { display: flex; align-items: baseline; gap: var(--s-3); min-width: 0; }
  .dz-cabecera-pagina__titulo { margin: 0; font-size: var(--fs-6); font-weight: 500; letter-spacing: -.02em; line-height: var(--lh-1); overflow-wrap: anywhere; }
  .dz-cabecera-pagina__cifra { font-size: var(--fs-2); color: var(--text-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
  .dz-cabecera-pagina__apoyo { margin: 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-wrap: balance; }
  .dz-cabecera-pagina__acciones { display: inline-flex; align-items: center; gap: var(--s-2); flex-wrap: wrap; }
}

/* Campo de fecha: un campo compuesto con el botón del calendario dentro, a ras del borde derecho (usa: campo, campo-compuesto, popover, calendario). El anillo de foco es
   uno solo: si el foco cae en el botón, el botón pinta el suyo y el contorno apaga el propio. Con el dedo el botón mide --h-tactil de ancho y su área llega a 44 de alto sin
   crecer el campo. */
@layer dz.componentes {
  .dz-campo-fecha__popover { flex: none; margin-right: calc(var(--s-2) * -1); }
  .dz-campo-fecha__popover .dz-popover__disparador { position: relative; width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0; justify-content: center; }
  .dz-campo-fecha .dz-campo-compuesto--chico .dz-campo-fecha__popover .dz-popover__disparador { width: var(--h-mini); height: var(--h-mini); }
  .dz-campo-fecha .dz-campo-compuesto:focus-within:has(.dz-popover__disparador:focus-visible) { box-shadow: none; }
  @media (pointer: coarse) {
    .dz-campo-fecha__popover .dz-popover__disparador { width: var(--h-tactil); }
    /* La variante chica no baja de --h-tactil con el dedo: esta regla gana en especificidad a la de 24 px de arriba. */
    .dz-campo-fecha .dz-campo-compuesto--chico .dz-campo-fecha__popover .dz-popover__disparador { width: var(--h-tactil); height: var(--h-tactil); }
    .dz-campo-fecha .dz-campo-compuesto--chico .dz-campo-fecha__popover .dz-popover__disparador::after { inset: 0; }
    .dz-campo-fecha__popover .dz-popover__disparador::after { content: ""; position: absolute; inset: calc((var(--h-control-sm) - var(--h-tactil)) / 2 - 1px) 0; }
  }
}

/* Campo de hora: el combobox del DS con la zona horaria dicha debajo (usa: campo, combobox). La zona va siempre visible: una cita en la agenda es a la hora de la oficina,
   no a la del aparato de quien la mira. */
@layer dz.componentes {
  .dz-campo-hora { gap: var(--s-1); }
  .dz-campo-hora__zona { display: flex; align-items: center; gap: var(--s-1); }
  .dz-campo-hora__globo { flex: none; }
  /* El borde de error no se pierde al pasar el puntero: el hover del combobox pinta el borde neutro con más especificidad. */
  .dz-campo-hora .dz-combobox--invalido .dz-combobox__campo:hover:not(:focus-within):not(:has(:disabled)) { border-color: var(--bad); }
}

/* Campo de moneda: un campo compuesto con el «$» delante y la moneda de sufijo (usa: campo, campo-compuesto). Las cifras van tabulares para que los miles y los centavos
   caigan en columna entre un campo y el de abajo. El «$» se atenúa en reposo y toma la tinta cuando el campo tiene el foco; el foco en sí lo pinta el contorno del
   campo compuesto, nunca el input. */
@layer dz.componentes {
  .dz-campo-moneda .dz-campo-compuesto__control { font-variant-numeric: tabular-nums; }
  .dz-campo-moneda__prefijo { flex: none; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; transition: color var(--dur-1) var(--ease-out); }
  .dz-campo-moneda .dz-campo-compuesto:focus-within .dz-campo-moneda__prefijo { color: var(--text); }
}

/* Campo de teléfono: un campo compuesto con la marcación del país delante, fija (+52) o con un selector de país dentro del borde (usa: campo, campo-compuesto). Las cifras
   van tabulares. El selector no pinta anillo propio: el foco lo lleva el contorno del campo. Con el dedo mide --h-tactil de alto sin crecer el campo. */
@layer dz.componentes {
  .dz-campo-telefono .dz-campo-compuesto__control { font-variant-numeric: tabular-nums; }
  .dz-campo-telefono__prefijo { flex: none; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-campo-telefono__pais {
    flex: none;
    height: 100%;
    margin: 0 calc(var(--s-1) * -1) 0 calc(var(--s-1) * -1);
    padding: 0 var(--s-1);
    border: 0;
    border-radius: var(--r-1);
    outline: none;
    box-shadow: none;
    background: transparent;
    color: var(--text-muted);
    font: inherit;
    font-size: var(--fs-2);
    font-variant-numeric: tabular-nums;
    cursor: pointer;
  }
  .dz-campo-telefono__pais:focus,
  .dz-campo-telefono__pais:focus-visible { outline: none; box-shadow: none; animation: none; }
  .dz-campo-telefono__pais:disabled { cursor: not-allowed; }
  @media (pointer: coarse) {
    .dz-campo-telefono__pais { height: var(--h-tactil); font-size: var(--fs-4); }
  }
}

/* Chips de entrada: selección múltiple con etiquetas dentro del borde del campo. La raíz es un campo (etiqueta, ayuda y error son los de campo) y el contenedor con
   borde es un campo-compuesto: borde, hover, foco en el contorno con :focus-within, inválido y deshabilitado son suyos; el input interno no lleva anillo. Cada elegido
   es un chip con su botón de quitar. Con filas="1" el campo mide --h-control y lo que no cabe se cuenta en «+N». La lista de sugerencias es el panel del combobox
   (usa: combobox), con el mismo hairline, sombra y renglones; aquí solo se ancla al campo. Un solo anillo: si el foco está en un chip o en «+N», el chip pinta el suyo
   y el contenedor apaga el propio. */
@layer dz.componentes {
  .dz-chips-entrada .dz-campo__etiqueta { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s-2); }
  .dz-chips-entrada__cuenta { font-weight: 400; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-chips-entrada__cuenta--tope { color: var(--text-2); font-weight: 500; }
  .dz-chips-entrada__ancla { position: relative; }
  .dz-chips-entrada__valores { display: none; }
  .dz-chips-entrada .dz-campo__error:empty { display: none; }

  /* El campo crece con los chips: alto mínimo de --h-control (44 en táctil) y el relleno vertical sale de lo que le sobra al chip. */
  .dz-chips-entrada .dz-chips-entrada__campo {
    position: relative;
    height: auto;
    min-height: var(--dz-dens-control, var(--h-control));
    align-items: flex-start;
    gap: var(--s-1);
    padding: calc((var(--h-control) - var(--h-chip) - 2px) / 2) var(--s-2) calc((var(--h-control) - var(--h-chip) - 2px) / 2) var(--s-3);
    color: var(--text-muted);
  }
  .dz-chips-entrada .dz-chips-entrada__campo > .dz-campo-compuesto__icono { height: var(--dz-dens-chip, var(--h-chip)); }
  .dz-chips-entrada--chico .dz-chips-entrada__campo {
    min-height: var(--dz-dens-control-sm, var(--h-control-sm));
    padding: calc((var(--h-control-sm) - var(--h-chip) - 2px) / 2) var(--s-2);
  }
  .dz-chips-entrada--chico .dz-chips-entrada__campo > .dz-campo-compuesto__icono { width: var(--ico-1); height: var(--dz-dens-chip, var(--h-chip)); }
  .dz-chips-entrada__lista { display: flex; flex-wrap: wrap; align-items: center; flex: 1 1 auto; min-width: 0; margin: 0; padding: 0; list-style: none; gap: var(--s-1); }
  .dz-chips-entrada__celda { flex: 1 1 calc(var(--s-8) * 2); min-width: calc(var(--s-8) * 2); display: flex; align-items: center; height: var(--dz-dens-chip, var(--h-chip)); }
  .dz-chips-entrada__celda[hidden],
  .dz-chips-entrada__chip[hidden] { display: none; }
  .dz-chips-entrada__control { height: var(--dz-dens-chip, var(--h-chip)); font-size: var(--fs-2); color: var(--text); }
  .dz-chips-entrada__control:read-only { cursor: default; }

  /* Un solo anillo: con el foco en un chip (flechas) o en «+N», el contenedor apaga el suyo. */
  .dz-chips-entrada .dz-chips-entrada__campo:focus-within:has(.dz-chips-entrada__quitar:focus-visible, button.dz-chips-entrada__mas:focus-visible) { box-shadow: none; }

  /* El chip es un dz-chip (26 px, --surface-2, --text-2, 500). El botón va a ras del borde derecho; en táctil su área crece a 44 por un pseudo-elemento, sin engordar el chip. */
  .dz-chips-entrada__chip { gap: var(--s-1); padding-right: 2px; max-width: 100%; }
  /* Lo puso una regla y no una persona: contorno en vez de relleno. */
  .dz-chips-entrada__chip--regla { background: transparent; box-shadow: inset 0 0 0 1px var(--line-2); }
  /* El adorno al frente del chip: avatar o icono. El avatar queda concéntrico con la píldora (2 de aire arriba y abajo) y el chip le cede el relleno izquierdo. */
  .dz-chips-entrada__lider { flex: none; display: inline-flex; align-items: center; justify-content: center; }
  .dz-chips-entrada__lider > svg { inline-size: var(--ico-1); block-size: var(--ico-1); }
  .dz-chips-entrada__lider .dz-avatar { --dz-avatar-tam: calc(var(--h-chip) - var(--s-1)); font-size: var(--fs-1); letter-spacing: -.02em; }
  .dz-chips-entrada__chip:has(> .dz-chips-entrada__lider .dz-avatar) { padding-left: calc(var(--s-1) / 2); }
  .dz-chips-entrada__texto { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
  .dz-chips-entrada__quitar {
    position: relative;
    flex: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--h-mini);
    height: var(--h-mini);
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: transparent;
    color: inherit;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-chips-entrada__x { flex: none; }
  @media (hover: hover) { .dz-chips-entrada__quitar:hover { background: var(--surface-3); color: var(--text); } }
  /* El anillo lo pinta el chip entero, no la equis: la equis es chica y el anillo la cercaría. */
  .dz-chips-entrada__quitar:focus-visible { outline: none; box-shadow: none; animation: none; }
  .dz-chips-entrada__chip:has(.dz-chips-entrada__quitar:focus-visible),
  .dz-chips-entrada__chip--regla:has(.dz-chips-entrada__quitar:focus-visible) { box-shadow: var(--ring); color: var(--text); }

  /* «+N»: píldora punteada del tamaño del chip; abre la lista con lo elegido marcado. */
  .dz-chips-entrada__celda--mas { flex: none; min-width: 0; }
  .dz-chips-entrada__mas {
    position: relative;
    flex: none;
    display: inline-flex;
    align-items: center;
    height: var(--dz-dens-chip, var(--h-chip));
    padding: 0 var(--s-2);
    border: 1px dashed var(--border-control);
    border-radius: var(--r-chip);
    background: transparent;
    color: var(--text-2);
    font: inherit;
    font-size: var(--fs-1);
    font-weight: 500;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
  }
  @media (hover: hover) { button.dz-chips-entrada__mas:hover { background: var(--surface-2); color: var(--text); } }
  .dz-chips-entrada__mas:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-chips-entrada__mas[aria-expanded="true"] { background: var(--sel-bg); color: var(--sel-text); border-color: transparent; }

  /* Con filas="1": una sola fila de --h-control; el comportamiento esconde desde el último lo que no cabe. El margen negativo deja sitio al anillo del primer chip dentro del recorte y contain: inline-size evita que los chips sin envolver ensanchen a quien contiene el campo. */
  .dz-chips-entrada[data-dz-filas="1"] .dz-chips-entrada__campo { height: var(--dz-dens-control, var(--h-control)); min-height: 0; padding-top: 0; padding-bottom: 0; align-items: center; }
  .dz-chips-entrada--chico[data-dz-filas="1"] .dz-chips-entrada__campo { height: var(--dz-dens-control-sm, var(--h-control-sm)); }
  .dz-chips-entrada[data-dz-filas="1"] .dz-chips-entrada__lista { flex-wrap: nowrap; overflow-x: clip; overflow-y: visible; contain: inline-size; padding: 0 2px; margin: 0 -2px; }
  .dz-chips-entrada[data-dz-filas="1"] .dz-chips-entrada__chip { flex: none; max-width: calc(var(--s-8) * 4); }
  .dz-chips-entrada[data-dz-filas="1"] .dz-chips-entrada__celda { flex: 1 1 calc(var(--s-8) + var(--s-4)); min-width: calc(var(--s-8) + var(--s-4)); }
  .dz-chips-entrada[data-dz-filas="1"] .dz-chips-entrada__celda--mas { flex: none; min-width: 0; }

  /* La lista es el panel del combobox, anclado al campo: se voltea con data-dz-lado y, pintada en su sitio, ocupa lugar en el flujo. */
  .dz-chips-entrada[data-dz-lado="arriba"] .dz-combobox__panel { top: auto; bottom: calc(100% + var(--s-1)); }
  .dz-chips-entrada[data-dz-muestra] .dz-combobox__panel { position: static; margin-top: var(--s-1); animation: none; }

  .dz-chips-entrada__campo:has(:disabled) .dz-chips-entrada__chip { opacity: var(--op-off); }
  .dz-chips-entrada__campo:has(:disabled) .dz-chips-entrada__quitar { pointer-events: none; }

  /* Lectura: sin borde ni fondo; los chips y «+N» se leen como texto. */
  .dz-chips-entrada--lectura .dz-chips-entrada__campo,
  .dz-chips-entrada--lectura .dz-chips-entrada__campo:hover:not(:focus-within):not(:has(:disabled)) { border-color: transparent; background: transparent; padding-left: 0; }
  .dz-chips-entrada--lectura .dz-chips-entrada__mas { padding: 0 var(--s-1); border: 0; cursor: default; }

  @media (pointer: coarse) {
    .dz-chips-entrada__control { font-size: var(--fs-4); }
    .dz-chips-entrada__quitar::before { content: ""; position: absolute; inset: calc(var(--s-2) * -1.25); }
    button.dz-chips-entrada__mas::before { content: ""; position: absolute; inset: calc(var(--s-1) * -2.5) calc(var(--s-1) * -2); }
  }
  @media (forced-colors: active) {
    .dz-chips-entrada__chip:has(.dz-chips-entrada__quitar:focus-visible) { outline: 2px solid Highlight; }
    .dz-chips-entrada__chip--regla { border: 1px solid CanvasText; }
    .dz-chips-entrada__mas:focus-visible { outline: 2px solid Highlight; }
  }
}

/* Combobox: selector con búsqueda. Etiqueta, ayuda y error son los de campo (usa: campo). El contenedor lleva el borde y el anillo de foco va en su
   contorno con :focus-within; el input interno no lleva anillo (dos rectángulos concéntricos leen como error). La lista flota bajo el campo con hairline
   y sombra, se voltea hacia arriba (data-dz-lado="arriba") si abajo no cabe y, en teléfono o con puntero grueso, sus opciones miden --h-tactil.
   La opción activa la pinta una clase porque el foco real sigue en el input (aria-activedescendant); lo elegido lo dice aria-selected y su marca. */
@layer dz.componentes {
  .dz-combobox__ancla { position: relative; }
  .dz-combobox__campo {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-dens-control, var(--h-control));
    padding: 0 var(--s-1) 0 var(--s-3);
    border-radius: var(--r-input);
    border: 1px solid var(--field-line);
    background: var(--field);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) {
    .dz-combobox__campo:hover:not(:focus-within):not(:has(:disabled)) { border-color: var(--text-muted); }
  }
  .dz-combobox__campo[data-ds-estado="hover"]:not(:focus-within):not(:has(:disabled)) { border-color: var(--text-muted); }
  .dz-combobox__campo:focus-within,
  .dz-combobox__campo[data-ds-estado="foco"] { border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-combobox--invalido .dz-combobox__campo,
  .dz-combobox__campo:has([aria-invalid="true"]) { border-color: var(--bad); }
  /* El error gana al hover de reposo y al hover enseñado: con el puntero encima el borde sigue en rojo. */
  .dz-combobox--invalido .dz-combobox__campo:hover:not(:focus-within):not(:has(:disabled)),
  .dz-combobox__campo:has([aria-invalid="true"]):hover:not(:focus-within):not(:has(:disabled)),
  .dz-combobox--invalido .dz-combobox__campo[data-ds-estado="hover"]:not(:focus-within):not(:has(:disabled)),
  .dz-combobox__campo:has([aria-invalid="true"])[data-ds-estado="hover"]:not(:focus-within):not(:has(:disabled)) { border-color: var(--bad); }
  /* Deshabilitado: el campo entero, con su chevron, a --op-off (PCB-37). Solo lectura: borde de línea suave, sin fondo de campo y sin chevron; el foco suma el anillo. */
  .dz-combobox__campo:has(> .dz-combobox__control:disabled) { opacity: var(--op-off); cursor: not-allowed; }
  .dz-combobox--lectura .dz-combobox__campo,
  .dz-combobox--lectura .dz-combobox__campo:hover:not(:focus-within),
  .dz-combobox--lectura .dz-combobox__campo:focus-within,
  .dz-combobox--lectura .dz-combobox__campo[data-ds-estado] { border-color: var(--border); background: transparent; padding-right: var(--s-3); }
  .dz-combobox--lectura .dz-combobox__control { cursor: default; }
  .dz-combobox--chico .dz-combobox__campo { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding-left: var(--s-2); }

  .dz-combobox--deshabilitado .dz-campo__etiqueta { cursor: not-allowed; }

  .dz-combobox__control {
    flex: 1;
    min-width: 0;
    height: 100%;
    padding: 0;
    background: transparent;
    border: 0;
    outline: none;
    box-shadow: none;
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-2);
    text-overflow: ellipsis;
  }
  .dz-combobox__control:focus,
  .dz-combobox__control:focus-visible { outline: none; box-shadow: none; animation: none; }
  .dz-combobox__control:disabled { cursor: not-allowed; }
  .dz-combobox__control::placeholder { color: var(--text-muted); opacity: 1; }
  .dz-combobox__control[type="search"]::-webkit-search-cancel-button { appearance: none; -webkit-appearance: none; }

  /* El chevron abre y cierra la lista con el puntero; el teclado ya tiene la flecha abajo, así que no entra en la secuencia de Tab. */
  .dz-combobox__disparador {
    flex: none;
    display: inline-grid;
    place-items: center;
    width: var(--h-btn-ico);
    height: var(--dz-dens-btn-ico, var(--h-btn-ico));
    padding: 0;
    border: 0;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text-muted);
    cursor: pointer;
  }
  .dz-combobox--chico .dz-combobox__disparador { width: var(--dz-dens-control-xs, var(--h-control-xs)); height: var(--dz-dens-control-xs, var(--h-control-xs)); }
  .dz-combobox__disparador:disabled { cursor: not-allowed; }
  .dz-combobox__disparador:focus-visible { outline: none; }
  .dz-combobox__chevron { transition: transform var(--dur-1) var(--ease-out); }
  .dz-combobox__control[aria-expanded="true"] ~ .dz-combobox__disparador .dz-combobox__chevron { transform: rotate(180deg); }

  .dz-combobox__panel {
    position: absolute;
    top: calc(100% + var(--s-1));
    left: 0;
    right: 0;
    z-index: var(--z-dropdown);
    padding: var(--s-1);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    font-size: var(--fs-2);
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-combobox__panel[hidden] { display: none; }
  /* Sale como entra, más corto y sin escala (ACB-12): se funde y sube a su disparador en --dur-1 y solo después se esconde. Sin puntero mientras sale. */
  .dz-combobox__panel[data-dz-saliendo] { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale); pointer-events: none; }
  .dz-combobox[data-dz-lado="arriba"] .dz-combobox__panel[data-dz-saliendo] { transform: translateY(var(--s-1)); }
  .dz-combobox[data-dz-lado="arriba"] .dz-combobox__panel { top: auto; bottom: calc(100% + var(--s-1)); }
  /* En su sitio (ficha o captura) el panel ocupa lugar en el flujo, para no taparle el espécimen de abajo. */
  .dz-combobox[data-dz-muestra] .dz-combobox__panel { position: static; margin-top: var(--s-1); animation: none; }

  .dz-combobox__lista { max-height: calc(var(--h-fila) * 6.5); overflow-y: auto; overscroll-behavior: contain; }
  .dz-combobox__lista[hidden] { display: none; }
  .dz-combobox__grupo + .dz-combobox__grupo { margin-top: var(--s-1); padding-top: var(--s-1); border-top: 1px solid var(--hairline); }
  .dz-combobox__grupo-titulo { padding: var(--s-2) var(--s-2) var(--s-1); font-size: var(--fs-1); font-weight: 500; color: var(--text-muted); }

  .dz-combobox__opcion {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--dz-dens-fila, var(--h-fila));
    padding: 0 var(--s-2);
    border-radius: var(--r-control);
    color: var(--text);
    cursor: pointer;
  }
  /* La activa es el único indicador de qué elegirá Enter (el foco real sigue en el input): fondo de selección y aro interior con --focus, que pasa 3:1 contra el panel. */
  .dz-combobox__opcion--activa { background: var(--sel-bg); color: var(--sel-text); box-shadow: var(--ring-inset); }
  .dz-combobox__opcion[aria-selected="true"] .dz-combobox__texto { font-weight: 500; }
  .dz-combobox__opcion[aria-disabled="true"] { color: var(--text-muted); opacity: var(--op-off); cursor: not-allowed; }
  .dz-combobox__texto { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-combobox__detalle { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-1); color: var(--text-muted); }
  /* El adorno al frente de la opción: un avatar chico (usa: avatar) o un icono. Decorativo; el nombre está en el texto. */
  .dz-combobox__lider { flex: none; display: inline-flex; align-items: center; justify-content: center; color: var(--text-2); }
  .dz-combobox__lider > svg { inline-size: var(--ico-1); block-size: var(--ico-1); }
  .dz-combobox__opcion[aria-disabled="true"] .dz-combobox__lider { opacity: var(--op-off); }
  .dz-combobox__check { flex: none; margin-left: auto; visibility: hidden; color: var(--text-2); }
  .dz-combobox__opcion[aria-selected="true"] > .dz-combobox__check { visibility: visible; }
  .dz-combobox__opcion--crear { color: var(--accent-text); font-weight: 500; }
  .dz-combobox__opcion--crear > .dz-combobox__mas { order: -1; margin-left: 0; visibility: visible; }
  /* La coincidencia se marca con peso y tinta plena, sin caja: una caja de fondo a media palabra se lee como mancha (Alex, 24-oct-2026). */
  .dz-combobox__marca-texto { padding: 0; background: none; color: var(--text); font-weight: 500; }

  .dz-combobox__vacio { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2); padding: var(--s-3) var(--s-2); }
  .dz-combobox__vacio[hidden] { display: none; }
  .dz-combobox__vacio-texto { margin: 0; min-width: 0; overflow-wrap: anywhere; color: var(--text-2); }
  .dz-combobox__salida {
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--accent-text);
    font: inherit;
    font-weight: 500;
    cursor: pointer;
  }
  @media (hover: hover) { .dz-combobox__salida:hover { color: var(--link-hover); } }
  .dz-combobox__salida:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--r-1); }

  .dz-combobox__cargando { display: grid; gap: var(--s-3); padding: var(--s-3) var(--s-2); }
  .dz-combobox__cargando[hidden] { display: none; }

  .dz-combobox__valores,
  .dz-combobox__molde[hidden] { display: none; }
  .dz-combobox__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

  @media (pointer: coarse), (max-width: 560px) {
    .dz-combobox__opcion { min-height: var(--h-tactil); }
    .dz-combobox__disparador { width: var(--h-tactil); height: 100%; }
    /* El campo chico mide --h-tactil con el dedo y su borde se come 2 px del interior: el disparador lo cubre entero para que el blanco llegue a 44. */
    .dz-combobox--chico .dz-combobox__disparador { width: var(--h-tactil); height: var(--h-tactil); margin-block: -1px; }
    .dz-combobox__salida { display: inline-flex; align-items: center; min-height: var(--h-tactil); }
  }
  @media (pointer: coarse) {
    .dz-combobox__control { font-size: var(--fs-4); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-combobox__panel { animation: none; }
    .dz-combobox__chevron { transition: none; }
  }
  @media (prefers-contrast: more) {
    .dz-combobox__opcion--activa { box-shadow: none; outline: 2px solid var(--text); outline-offset: -2px; }
  }
  @media (forced-colors: active) {
    .dz-combobox__opcion--activa { outline: 2px solid Highlight; outline-offset: -2px; }
    .dz-combobox__marca-texto { forced-color-adjust: none; background: Mark; color: MarkText; }
  }
}

/* Condición: una condición del filtro leída como oración, [campo] [operador] [valor]. En la hoja avanzada va en una rejilla de tres columnas con el valor en una
   segunda fila; en el popover (variante --valor) el campo ya está elegido y solo quedan operador y valor. A 560 o menos, campo y quitar, luego operador, luego valor. */
@layer dz.componentes {
  .dz-condicion { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: var(--s-2); align-items: end; }
  .dz-condicion__valor { grid-column: 1 / -1; min-width: 0; }
  .dz-condicion--valor { grid-template-columns: minmax(0, 1fr); align-items: end; }
  .dz-condicion--valor .dz-condicion__valor { grid-column: auto; }
  .dz-condicion__entre { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); gap: var(--s-1); align-items: center; }
  .dz-condicion__entre--uno { grid-template-columns: minmax(0, 1fr); }
  .dz-condicion__entre > .dz-campo-compuesto { min-width: 0; }
  .dz-condicion__entre .dz-campo-compuesto__control { min-width: 0; }
  .dz-condicion__entre > span { font-size: var(--fs-1); color: var(--text-muted); text-align: center; }
  .dz-condicion__nota { font-weight: 400; color: var(--text-muted); }
  .dz-condicion__error { grid-column: 1 / -1; margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--bad-text); }
  .dz-condicion__quitar { align-self: end; }
  @media (max-width: 560px) {
    .dz-condicion { grid-template-columns: 1fr auto; }
    .dz-condicion > :nth-child(1) { grid-column: 1; }
    .dz-condicion > :nth-child(2) { grid-column: 1 / -1; }
    .dz-condicion__quitar { grid-column: 2; grid-row: 1; justify-self: end; }
    .dz-condicion--valor { grid-template-columns: 1fr; }
  }
}

/* Control segmentado: píldora con hairline y opciones del alto --h-control-xs; la activa va en --sel-bg. Aspecto del conmutador de vista de LeadZ.
   Opción de botón (aria-pressed), de enlace (aria-current) o de radio nativo. En el modo radio el DS NO pone caja propia al contenedor
   (sin relleno, borde, radio ni ancho máximo): el producto ya tiene la suya, como LeadZ en Mi cuenta, y quien quiere la píldora suma
   dz-control-segmentado--contorno. El <input> es el de siempre, nativo e invisible sobre la opción (absolute, inset 0, opacity 0, como lo
   pinta LeadZ); la opción pinta el estado con :has(), así que sirve sobre un <label><input type="radio">texto</label> que el producto ya tenga. */
@layer dz.componentes {
  .dz-control-segmentado {
    display: inline-flex;
    gap: var(--s-1);
    padding: 3px;
    border: 1px solid var(--border);
    border-radius: var(--r-pill);
    max-width: 100%;
    /* Seis opciones no caben en 390: la pastilla se desplaza sobre su propio eje en vez de dejar que la última sobresalga del borde. */
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scrollbar-width: none;
  }
  .dz-control-segmentado::-webkit-scrollbar { display: none; }
  .dz-control-segmentado__opcion { flex: none; }
  /* Radios: sin caja propia. La píldora es opt-in con --contorno. */
  .dz-control-segmentado:has(> .dz-control-segmentado__opcion > .dz-control-segmentado__radio):not(.dz-control-segmentado--contorno) {
    padding: 0;
    border: 0;
    border-radius: 0;
    max-width: none;
    overflow: visible;
  }
  .dz-control-segmentado__opcion {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-dens-control-xs, var(--h-control-xs));
    padding: 0 var(--s-3);
    border: 0;
    border-radius: var(--r-chip);
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    white-space: nowrap;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-control-segmentado__opcion svg { width: var(--ico-1); height: var(--ico-1); flex: none; }
  @media (hover: hover) {
    .dz-control-segmentado__opcion:hover { background: var(--hover-bg); color: var(--text); }
  }
  .dz-control-segmentado__opcion[data-ds-estado="hover"] { background: var(--hover-bg); color: var(--text); }
  .dz-control-segmentado__opcion[aria-pressed="true"],
  .dz-control-segmentado__opcion[aria-current="page"] { background: var(--sel-bg); color: var(--sel-text); }
  .dz-control-segmentado__opcion:focus-visible,
  .dz-control-segmentado__opcion[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  @media (pointer: coarse) {
    .dz-control-segmentado__opcion { height: var(--h-tactil); }
  }
  /* En teléfono el relleno de cada opción baja a --s-2: seis opciones caben en 390 (corte del sistema, 560) sin que la última sobresalga del borde de la pastilla. */
  @media (max-width: 560px) {
    .dz-control-segmentado__opcion { padding-inline: var(--s-2); }
  }

  /* Modo radio: la opción es el <label> y pinta su estado con :has(); el radio nativo llena la opción, invisible, y recibe el clic y el teclado. */
  .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio) { position: relative; }
  .dz-control-segmentado__radio {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    opacity: 0;
    cursor: pointer;
  }
  .dz-control-segmentado__texto { display: inline-flex; align-items: center; gap: var(--s-2); }
  .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:checked) { background: var(--sel-bg); color: var(--sel-text); }
  @media (hover: hover) {
    .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio):hover { background: transparent; }
    .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:not(:checked):not(:disabled)):hover { background: var(--hover-bg); }
    .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:checked):hover { background: var(--sel-bg); }
  }
  .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:focus-visible) { box-shadow: var(--ring); }
  .dz-control-segmentado__radio:focus-visible { outline: none; box-shadow: none; }
  .dz-control-segmentado__radio:disabled { cursor: not-allowed; }
  .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:disabled) { opacity: var(--op-off); cursor: not-allowed; }
  /* Alto contraste de Windows: el elegido se pinta con Highlight. */
  @media (forced-colors: active) {
    .dz-control-segmentado__opcion:has(> .dz-control-segmentado__radio:checked) { forced-color-adjust: none; background: Highlight; color: HighlightText; }
  }
}

/* Detalle clave-valor: rótulo chico arriba, valor y acciones en un eje, hairline entre filas. */
@layer dz.componentes {
  .dz-detalle { display: flex; flex-direction: column; margin: 0; }
  .dz-detalle__fila { display: flex; flex-direction: column; gap: var(--s-1); padding: var(--s-3) 0; border-bottom: 1px solid var(--border); }
  .dz-detalle__fila:last-child { border-bottom: 0; }
  .dz-detalle__rotulo { font-size: var(--fs-1); font-weight: 500; color: var(--text-2); }
  .dz-detalle__dato { margin: 0; min-height: var(--dz-dens-control-sm, var(--h-control-sm)); display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); font-size: var(--fs-3); }
  .dz-detalle__valor { min-width: 0; overflow-wrap: anywhere; }
  .dz-detalle__acciones { display: inline-flex; align-items: center; gap: var(--s-2); flex: none; }
  .dz-detalle__nota { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
}

/* Facetas con conteos: el contenido del popover «+ Filtro». Buscador arriba, lista de casillas con la cuenta a la derecha y pie con la cuenta de resultados.
   A 560 de ancho o menos el popover que las contiene es una hoja inferior (PCB-607): sube desde abajo, con el velo detrás, y se desplaza sola si es larga. */
@layer dz.componentes {
  .dz-facetas { display: grid; gap: var(--s-2); min-width: min(var(--w-avisos), calc(100vw - var(--s-4) * 2)); }
  .dz-facetas__titulo { display: flex; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-2); font-weight: 600; }
  .dz-facetas__volver { margin-left: calc(var(--s-2) * -1); }
  .dz-facetas__lista { display: grid; max-height: calc(var(--h-fila) * 7); margin: 0; padding: 0; overflow-y: auto; overscroll-behavior: contain; list-style: none; }
  .dz-facetas__opcion { display: flex; align-items: center; gap: var(--s-2); min-height: var(--dz-dens-barra, var(--h-barra)); padding: 0 var(--s-1); border-radius: var(--r-control); }
  .dz-facetas__opcion[hidden] { display: none; }
  @media (hover: hover) { .dz-facetas__opcion:hover { background: var(--hover-bg); } }
  .dz-facetas__opcion .dz-casilla { flex: 1 1 auto; min-width: 0; min-height: var(--dz-dens-barra, var(--h-barra)); }
  .dz-facetas__opcion .dz-casilla__texto { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-facetas__cuenta { flex: none; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  /* Un valor sin filas se puede elegir (el conteo cambia con lo demás que se marque), así que no es un control apagado: el rótulo baja a --text-2, que sigue
     pasando 4,5:1, y la cuenta «0» ya lo dice. La opacidad bajaba a 2,59:1 en claro y se quedaba en forced-colors (PCB-170). */
  .dz-facetas__opcion[data-dz-cero] .dz-casilla__texto { color: var(--text-2); }
  .dz-facetas__campos { display: grid; gap: var(--s-1); max-height: calc(var(--h-fila) * 8); margin: 0; padding: 0; overflow-y: auto; list-style: none; }
  .dz-facetas__campos li[hidden] { display: none; }
  .dz-facetas__campo { display: flex; align-items: center; gap: var(--s-2); width: 100%; min-height: var(--dz-dens-barra, var(--h-barra)); padding: 0 var(--s-2); border: 0; border-radius: var(--r-control); background: transparent; color: var(--text); font: inherit; font-size: var(--fs-2); font-weight: 500; text-align: left; cursor: pointer; }
  .dz-facetas__campo svg { color: var(--text-muted); flex: none; }
  .dz-facetas__campo small { margin-left: auto; font-size: var(--fs-1); font-weight: 400; color: var(--text-muted); }
  @media (hover: hover) { .dz-facetas__campo:hover { background: var(--hover-bg); } }
  .dz-facetas__campo:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-facetas__grupo { display: grid; gap: var(--s-1); min-width: 0; margin: 0; padding: 0; border: 0; }
  .dz-facetas__pie { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); padding-top: var(--s-2); border-top: 1px solid var(--hairline); }
  .dz-facetas__pie > :last-child { margin-left: auto; }
  .dz-facetas__pie > .dz-facetas__cuenta + .dz-boton { margin-left: auto; }
  .dz-facetas__nota { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  @media (pointer: coarse) { .dz-facetas__opcion, .dz-facetas__campo, .dz-facetas__opcion .dz-casilla { min-height: var(--h-tactil); } }

  /* A 390: hoja inferior. El panel del popover se fija abajo, a todo el ancho, con el velo de su propia sombra. Es el mismo panel y el mismo comportamiento
     (Esc, clic fuera, foco de vuelta); solo cambia dónde está. */
  @media (max-width: 560px) {
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) {
      position: fixed;
      inset: auto 0 var(--dz-teclado, 0) 0;
      z-index: var(--z-hoja);
      min-width: 0;
      max-width: none;
      max-height: 85vh;
      max-height: 85dvh;
      overflow-y: auto;
      overscroll-behavior: contain;
      translate: none;
      padding: var(--s-4) var(--s-4) calc(var(--s-4) + env(safe-area-inset-bottom));
      border-width: 1px 0 0;
      border-radius: var(--r-card) var(--r-card) 0 0;
      box-shadow: 0 0 0 100vmax color-mix(in oklch, var(--text) 30%, transparent), var(--shadow-md);
      animation: dzFacetasHoja var(--dur-3) var(--ease-enfasis);
    }
    [data-ds-theme="dark"] :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) { box-shadow: 0 0 0 100vmax color-mix(in oklch, var(--bg) 55%, transparent), var(--shadow-md); }
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas)[data-dz-saliendo] { opacity: 0; transform: translateY(var(--s-6)); }
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) > .dz-facetas { min-width: 0; }
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) .dz-facetas__lista { max-height: calc(var(--h-tactil) * 6); }
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) .dz-facetas__pie { position: sticky; bottom: calc((var(--s-4) + env(safe-area-inset-bottom)) * -1); margin-bottom: calc((var(--s-4) + env(safe-area-inset-bottom)) * -1); padding-bottom: calc(var(--s-4) + env(safe-area-inset-bottom)); background: var(--surface); }
    :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) .dz-facetas__pie > .dz-boton { min-height: var(--h-tactil); }
  }
  @keyframes dzFacetasHoja { from { transform: translateY(100%); } }
  @media (prefers-reduced-motion: reduce) { :is(.dz-popover .dz-popover__panel, .dz-popover__panel[data-dz-flotante]):has(> .dz-facetas) { animation: none; } }
}

/* Filtro: la chapa de una condición activa. Campo atenuado, operador, valor en 500 y la x a ras del borde. Son dos botones, editar y quitar, nunca uno solo.
   El grupo avanzado lleva el borde discontinuo. Con el dedo mide --h-tactil y la x amplía su zona sin crecer a la vista. */
@layer dz.componentes {
  .dz-filtro {
    display: inline-flex;
    align-items: center;
    gap: var(--s-1);
    height: var(--dz-dens-control-sm, var(--h-control-sm));
    max-width: 100%;
    padding: 0 2px 0 var(--s-3);
    border: 1px solid var(--line-2);
    border-radius: var(--r-chip);
    background: var(--surface);
    color: var(--text);
    font-size: var(--fs-2);
  }
  .dz-filtro__editar { display: inline-flex; align-items: center; gap: var(--s-1); min-width: 0; height: 100%; padding: 0; border: 0; background: transparent; color: inherit; font: inherit; cursor: pointer; }
  .dz-filtro__campo { color: var(--text-muted); white-space: nowrap; }
  .dz-filtro__op { color: var(--text-2); white-space: nowrap; }
  .dz-filtro__valor { font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-filtro__editar:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--r-1); }
  .dz-filtro__quitar { width: var(--h-mini); height: var(--h-mini); flex: none; }
  .dz-filtro__quitar svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-filtro--grupo { border-style: dashed; }
  @media (pointer: coarse) {
    .dz-filtro { height: var(--h-tactil); }
    .dz-filtro__editar { min-height: var(--h-tactil); min-width: var(--h-tactil); }
    .dz-filtro__quitar { position: relative; width: var(--h-btn-ico); height: var(--h-btn-ico); }
    .dz-filtro__quitar::before { content: ""; position: absolute; inset: calc((var(--h-tactil) - var(--h-btn-ico)) / -2); }
  }
}

/* Filtros: buscador, selectores y chips en una fila, en el par chico (campos y botones de --h-control-sm, nunca uno chico junto a uno
   normal). Usa: campo, campo-compuesto, chip. */
@layer dz.componentes {
  .dz-filtros { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); margin: 0; }
  .dz-filtros__inicio { display: inline-flex; align-items: center; gap: var(--s-2); min-width: 0; }
  .dz-filtros__busqueda { flex: 1 1 var(--w-sub); min-width: 0; max-width: var(--w-lectura); }
  .dz-filtros__selector { flex: 0 1 var(--w-sub); min-width: 0; }
  .dz-filtros__chips { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-1); }
  .dz-filtros__acciones { display: inline-flex; align-items: center; gap: var(--s-2); margin-left: auto; }
  /* La cuenta de resultados (aria-live): «1,284 leads», en cifras tabulares. */
  .dz-filtros__cuenta { margin: 0; font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
  .dz-filtros__cuenta b { font-weight: 600; color: var(--text); }
  @media (max-width: 560px) {
    .dz-filtros__busqueda,
    .dz-filtros__selector { flex: 1 1 100%; max-width: none; }
    .dz-filtros__acciones { margin-left: 0; }
  }
}

/* Galería: la lámina (una "imagen" con la relación reservada) con flechas, contador y «Ampliar», y debajo la tira de miniaturas que la gobierna. La miniatura
   elegida lleva borde de tinta con un interior de 1 px; el foco suma el anillo. Con el dedo la tira se desplaza con scroll-snap y las flechas miden 44. Los
   botones que flotan sobre la foto van en superficie al 88 % con hairline, iguales en claro y en oscuro (la foto manda, no la página). */
@layer dz.componentes {
  .dz-galeria { display: grid; gap: var(--s-2); min-width: 0; }
  .dz-galeria--cargando { pointer-events: none; }
  .dz-galeria--vacia { display: block; }
  .dz-galeria__lamina { position: relative; min-width: 0; }
  .dz-galeria__lamina .dz-imagen { margin: 0; }
  .dz-galeria__abrir { position: absolute; inset: 0; width: 100%; margin: 0; padding: 0; border: 0; border-radius: var(--r-card); background: transparent; cursor: zoom-in; }
  .dz-galeria__flecha,
  .dz-galeria__ampliar,
  .dz-galeria__contador { position: absolute; z-index: var(--z-base); background: color-mix(in oklch, var(--surface) 88%, transparent); border-color: var(--hairline); color: var(--text); }
  .dz-galeria__flecha { top: 50%; transform: translateY(-50%); }
  .dz-galeria__flecha--ant { left: var(--s-2); }
  .dz-galeria__flecha--sig { right: var(--s-2); }
  .dz-galeria__ampliar { top: var(--s-2); right: var(--s-2); }
  .dz-galeria__contador { left: var(--s-2); bottom: var(--s-2); font-variant-numeric: tabular-nums; }
  .dz-galeria__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

  .dz-galeria__miniaturas { display: flex; gap: var(--s-2); margin: 0; padding: var(--s-1); overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: thin; scroll-snap-type: x proximity; }
  .dz-galeria__miniatura { flex: none; width: calc(var(--h-fila-2) + var(--s-5)); aspect-ratio: 3 / 2; padding: 0; margin: 0; border: 1px solid var(--line-2); border-radius: var(--r-control); background: var(--surface-2); overflow: hidden; cursor: pointer; scroll-snap-align: start; }
  .dz-galeria__miniatura img { display: block; width: 100%; height: 100%; object-fit: cover; }
  @media (hover: hover) { .dz-galeria__miniatura:hover { border-color: var(--border-control); } }
  .dz-galeria__miniatura[data-ds-estado="hover"] { border-color: var(--border-control); }
  .dz-galeria__miniatura[data-ds-estado="foco"] { box-shadow: var(--ring); }
  .dz-galeria__miniatura[aria-selected="true"] { border-color: var(--text); box-shadow: inset 0 0 0 1px var(--text); }
  .dz-galeria__miniatura:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-galeria__miniatura[aria-selected="true"]:focus-visible { box-shadow: var(--ring), inset 0 0 0 1px var(--text); }
  /* Con el dedo la miniatura mide 44 de alto como mínimo (de ahí el ancho, que sigue la relación). */
  @media (pointer: coarse) { .dz-galeria__miniatura { width: calc(var(--h-tactil) * 3 / 2); } }
  .dz-galeria__miniaturas--esqueleto { overflow: hidden; }
  /* Los esqueletos se encogen para caber en el ancho (la tira real se desplaza, el esqueleto no): ninguno queda fuera de pantalla a 390 px. */
  .dz-galeria__esqueleto { flex: 0 1 calc(var(--h-fila-2) + var(--s-5)); min-width: 0; height: auto; aspect-ratio: 3 / 2; }
  @media (pointer: coarse) { .dz-galeria__esqueleto { flex-basis: calc(var(--h-tactil) * 3 / 2); } }
  .dz-galeria__vacio { border: 1px dashed var(--border-control); border-radius: var(--r-card); }
}

/* Grupo de avatares: las personas encimadas (anillo del color de la superficie entre una y otra) y «+N», que abre la lista de quienes no caben.
   El «+N» mide lo que el avatar de su tamaño; con el dedo, su área táctil llega a --h-tactil sin crecer el dibujo. */
@layer dz.componentes {
  .dz-grupo-avatares { --dz-grupo-tam: var(--avatar); --dz-grupo-solape: calc(var(--dz-grupo-tam) * 0.15); display: inline-flex; align-items: center; min-inline-size: 0; }
  .dz-grupo-avatares--sm { --dz-grupo-tam: var(--h-mini); }
  .dz-grupo-avatares--lg { --dz-grupo-tam: calc(var(--avatar) * 1.5); }
  .dz-grupo-avatares--xl { --dz-grupo-tam: calc(var(--avatar) * 2); }
  .dz-grupo-avatares__item,
  .dz-grupo-avatares__resto { position: relative; display: inline-flex; flex: none; border-radius: 50%; box-shadow: 0 0 0 2px var(--dz-grupo-fondo, var(--surface)); }
  .dz-grupo-avatares__item + .dz-grupo-avatares__item,
  .dz-grupo-avatares__item + .dz-grupo-avatares__resto { margin-inline-start: calc(-1 * var(--dz-grupo-solape)); }
  .dz-grupo-avatares__mas {
    list-style: none;
    display: inline-grid;
    place-items: center;
    inline-size: var(--dz-grupo-tam);
    block-size: var(--dz-grupo-tam);
    border-radius: 50%;
    background: var(--surface-3);
    color: var(--text-2);
    font-size: var(--fs-1);
    font-weight: 600;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-grupo-avatares__mas::-webkit-details-marker { display: none; }
  .dz-grupo-avatares--lg .dz-grupo-avatares__mas { font-size: var(--fs-4); }
  .dz-grupo-avatares--xl .dz-grupo-avatares__mas { font-size: var(--fs-6); }
  @media (hover: hover) {
    .dz-grupo-avatares__mas:hover,
    .dz-grupo-avatares__resto[open] > .dz-grupo-avatares__mas { background: var(--surface-2); color: var(--text); }
  }
  .dz-grupo-avatares__mas[data-ds-estado="hover"] { background: var(--surface-2); color: var(--text); }
  .dz-grupo-avatares__mas:focus-visible,
  .dz-grupo-avatares__mas[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-grupo-avatares__lista {
    position: absolute;
    inset-block-start: calc(100% + var(--s-1));
    inset-inline-start: 0;
    z-index: var(--z-dropdown);
    display: grid;
    gap: var(--s-1);
    min-inline-size: var(--w-sub);
    max-block-size: var(--w-sub);
    overflow-y: auto;
    margin: 0;
    padding: var(--s-1);
    list-style: none;
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: var(--shadow-md);
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-grupo-avatares__persona { display: flex; align-items: center; gap: var(--s-2); min-block-size: var(--dz-dens-barra, var(--h-barra)); padding: 0 var(--s-2); }
  .dz-grupo-avatares__nombre { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-2); color: var(--text); }
  @media (pointer: coarse) {
    .dz-grupo-avatares__persona { min-block-size: var(--h-tactil); }
    .dz-grupo-avatares__mas { position: relative; }
    .dz-grupo-avatares__mas::after { content: ""; position: absolute; inset: min(0px, calc((var(--dz-grupo-tam) - var(--h-tactil)) / 2)); }
  }
}

/* Cabecera de estado de una línea: título con glifo (opcional) y debajo, en una línea, el punto, el nombre de la línea y su estado. El punto lleva el color del estado
   pero el estado siempre se lee escrito; «llamando» late y con movimiento reducido el latido se apaga. Al final, un cerrar o lo que ponga el producto. */
@layer dz.componentes {
  .dz-linea-estado { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); min-width: 0; }
  .dz-linea-estado__cuerpo { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-linea-estado__titulo { display: flex; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-4); font-weight: 600; letter-spacing: -.01em; line-height: var(--lh-1); }
  .dz-linea-estado__titulo svg { width: var(--ico-3); height: var(--ico-3); flex: none; color: var(--text-2); }
  .dz-linea-estado__linea { display: flex; align-items: center; gap: var(--s-2); min-width: 0; margin: 0; font-size: var(--fs-2); font-weight: 500; line-height: var(--lh-2); color: var(--text); white-space: nowrap; }
  .dz-linea-estado__punto { width: var(--punto); height: var(--punto); flex: none; border-radius: 50%; background: var(--ok); }
  .dz-linea-estado__nombre { overflow: hidden; text-overflow: ellipsis; }
  .dz-linea-estado__sep { color: var(--text-muted); }
  .dz-linea-estado__texto { color: var(--text-2); font-weight: 400; overflow: hidden; text-overflow: ellipsis; }
  .dz-linea-estado--aviso .dz-linea-estado__punto { background: var(--warn); }
  .dz-linea-estado--apagado .dz-linea-estado__punto { background: var(--text-muted); }
  .dz-linea-estado--llamando .dz-linea-estado__punto { animation: dz-linea-estado-late var(--dur-respira) var(--ease-out) infinite; }
  @keyframes dz-linea-estado-late { 50% { opacity: .3; } }
  .dz-linea-estado__fin { display: flex; align-items: center; gap: var(--s-2); flex: none; }
  @media (prefers-reduced-motion: reduce) { .dz-linea-estado--llamando .dz-linea-estado__punto { animation: none; } }
  @media (forced-colors: active) { .dz-linea-estado__punto { background: CanvasText; forced-color-adjust: none; } }
}

/* Lista de filas (registros): cabecera de columnas atenuada y filas de --h-fila-tabla (o --h-fila) con hover redondeado; la activa va en
   --sel-bg y la marcada en --surface-2. Las columnas son un modificador discreto: 2, 3 o 4. En teléfono las celdas opcional se esconden.
   Ranuras de la fila: antes (fuera del botón principal), inicio (dentro, antes del texto) y acciones (aparecen al pasar o enfocar con
   puntero fino; con el dedo no hay "pasar" y Safari no enfoca un botón al tocarlo, así que en táctil van siempre visibles, en su propio
   renglón al final de la fila). */
@layer dz.componentes {
  .dz-lista-filas { --dz-columnas: minmax(0, 1fr) auto; display: flex; flex-direction: column; gap: 2px; }
  .dz-lista-filas--2 { --dz-columnas: minmax(0, 1fr) auto; }
  .dz-lista-filas--3 { --dz-columnas: minmax(0, 1fr) var(--w-sub) calc(var(--w-cifra) / 2); }
  .dz-lista-filas--4 { --dz-columnas: minmax(0, 1fr) var(--w-sub) var(--w-cifra) calc(var(--w-cifra) / 2); }
  .dz-lista-filas__cabecera,
  .dz-lista-filas__fila { display: grid; grid-template-columns: var(--dz-columnas); align-items: center; gap: var(--s-3); padding: 0 var(--s-3); }
  .dz-lista-filas__cabecera { min-height: var(--s-7); }
  .dz-lista-filas__titulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-2); font-weight: 500; color: var(--text-muted); }
  .dz-lista-filas--3 > * > :last-child,
  .dz-lista-filas--4 > * > :last-child { justify-content: flex-end; text-align: right; }
  .dz-lista-filas__titulo.dz-lista-filas__numerica { text-align: right; }
  .dz-lista-filas__celda.dz-lista-filas__numerica { justify-content: flex-end; text-align: right; }
  .dz-lista-filas__fila { position: relative; min-height: var(--dz-dens-fila, var(--h-fila-tabla, var(--h-fila))); border-radius: var(--r-input); transition: background var(--dur-1) var(--ease-out); }
  @media (hover: hover) {
    .dz-lista-filas__fila:hover { background: var(--hover-bg); }
  }
  /* Con línea secundaria la fila es una variante declarada (--doble) y mide --h-fila-2 (nunca menos que sus dos líneas); sin ella, --h-fila. */
  .dz-lista-filas__fila--doble { min-height: max(var(--dz-dens-fila, var(--h-fila-tabla, var(--h-fila-2))), calc(var(--lh-2) * 2 + var(--dz-dens-pad, var(--s-2)) * 2)); }
  .dz-lista-filas__fila[data-ds-estado="hover"] { background: var(--hover-bg); }
  .dz-lista-filas__fila[aria-current="true"] { background: var(--sel-bg); }
  .dz-lista-filas__fila--marcada { background: var(--surface-2); }
  /* El anillo de la fila solo cuando el foco está en el botón principal, que no pinta el suyo. */
  .dz-lista-filas__fila:has(.dz-lista-filas__principal:focus-visible),
  .dz-lista-filas__fila[data-ds-estado="foco"] { box-shadow: var(--ring-inset); }
  .dz-lista-filas__celda { min-width: 0; display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-lista-filas__principal {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: var(--s-3);
    padding: var(--s-2) 0;
    background: transparent;
    border: 0;
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-3);
    text-align: left;
    cursor: pointer;
  }
  .dz-lista-filas__principal:focus-visible { outline: none; box-shadow: none; animation: none; }
  .dz-lista-filas__texto { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: var(--lh-2); }
  .dz-lista-filas__nombre { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
  .dz-lista-filas__secundario { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-2); color: var(--text-2); }
  .dz-lista-filas__antes,
  .dz-lista-filas__inicio { flex: none; display: inline-flex; align-items: center; }
  .dz-lista-filas__acciones {
    position: absolute;
    top: 50%;
    right: var(--s-2);
    transform: translateY(-50%);
    display: inline-flex;
    align-items: center;
    gap: var(--s-1);
    padding-left: var(--s-3);
    background: linear-gradient(to right, transparent, var(--hover-bg) var(--s-3));
    border-radius: var(--r-input);
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--dur-1) var(--ease-out);
  }
  /* Táctil: sin hover las acciones no se alcanzan. Se muestran siempre y salen de encima de las celdas: un renglón propio a la derecha. */
  @media (hover: none), (pointer: coarse) {
    .dz-lista-filas__acciones { position: static; transform: none; grid-column: 1 / -1; justify-self: end; padding: 0 0 var(--s-2); background: none; opacity: 1; pointer-events: auto; }
    .dz-lista-filas__principal { min-height: var(--h-tactil); }
  }
  .dz-lista-filas__fila:focus-within > .dz-lista-filas__acciones,
  .dz-lista-filas__fila[data-ds-estado="hover"] > .dz-lista-filas__acciones { opacity: 1; pointer-events: auto; }
  @media (hover: hover) {
    .dz-lista-filas__fila:hover > .dz-lista-filas__acciones { opacity: 1; pointer-events: auto; }
  }
  /* La lista responde al ancho de SU contenedor, no al de la ventana: en un panel angosto de escritorio también se queda con lo que cabe. */
  .dz-lista-filas { container-type: inline-size; }
  @container (max-width: 560px) {
    .dz-lista-filas__cabecera,
    .dz-lista-filas__fila { grid-template-columns: minmax(0, 1fr) auto; }
    .dz-lista-filas__opcional { display: none; }
  }
}

/* Menú colgado (details): el disparador es el summary, el panel lleva hairline, radio de tarjeta y sombra. En teléfono se pega bajo la
   barra superior. Un menú abierto a la vez, Esc devuelve el foco y las flechas recorren: es comportamiento del producto, no de este CSS. */
@layer dz.componentes {
  .dz-menu { position: relative; display: inline-block; }
  .dz-menu__disparador {
    list-style: none;
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-dens-control, var(--h-control));
    padding: 0 var(--s-3);
    border-radius: var(--r-btn);
    color: var(--text-2);
    font-size: var(--fs-2);
    font-weight: 500;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-menu__disparador svg { width: var(--ico-2); height: var(--ico-2); flex: none; }
  @media (hover: hover) {
    .dz-menu__disparador:hover,
    .dz-menu[open] > .dz-menu__disparador { background: var(--surface-2); color: var(--text); }
  }
  .dz-menu__disparador::-webkit-details-marker { display: none; }
  .dz-menu__disparador:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--r-btn); }
  .dz-menu__panel {
    position: absolute;
    top: calc(100% + var(--s-1));
    right: 0;
    z-index: var(--z-dropdown);
    min-width: var(--w-menu);
    padding: var(--s-1);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: var(--shadow-md);
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-menu__panel--izquierda { right: auto; left: 0; }
  /* Espécimen con el panel abierto (data-dz-muestra): el menú cuelga de su disparador en el flujo, sin flotar sobre la página. Lo define el paquete y no el sitio, para que la ficha pinte lo mismo que el paquete solo. */
  .dz-menu[data-dz-muestra] { display: inline-flex; flex-direction: column; align-items: flex-end; max-width: 100%; }
  .dz-menu[data-dz-muestra]:has(.dz-menu__panel--izquierda) { align-items: flex-start; }
  .dz-menu[data-dz-muestra] .dz-menu__panel { position: static; max-width: 100%; margin-top: var(--s-1); }
  /* En la capa del documento (comportamiento/flotante) el panel se ancla a la ventana: ni el overflow de una fila de pestañas lo recorta ni la barra fija lo tapa. */
  .dz-menu__panel[data-dz-flotante] { position: fixed; inset: auto; top: var(--dz-flot-y, 0); left: var(--dz-flot-x, 0); margin: 0; width: auto; height: auto; overflow: visible; color: var(--text); }
  .dz-menu__panel[data-dz-flotante][data-dz-saliendo] { opacity: 0; transition: opacity var(--dur-1) var(--ease-sale); }
  /* Salida: al cerrar, el panel se funde en --dur-1 en vez de desaparecer de golpe. Abierto no pasa por transición (la entrada ya la hace dzEntra).
     Sin ::details-content (navegadores viejos) cierra de golpe, como antes. */
  @supports selector(::details-content) {
    .dz-menu::details-content { opacity: 0; transition: opacity var(--dur-1) var(--ease-sale), content-visibility var(--dur-1) allow-discrete; }
    .dz-menu[open]::details-content { opacity: 1; transition: none; }
  }
  .dz-menu__cabecera { min-width: 0; margin-bottom: var(--s-1); padding: var(--s-2); border-bottom: 1px solid var(--hairline); }
  .dz-menu__titulo { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-2); font-weight: 600; }
  .dz-menu__nota { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-menu__item {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    width: 100%;
    min-height: var(--dz-dens-item, var(--h-barra));
    padding: 0 var(--s-2);
    border: 0;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    text-align: left;
    text-decoration: none;
    cursor: pointer;
  }
  .dz-menu__item svg { width: var(--ico-2); height: var(--ico-2); flex: none; color: var(--text-muted); }
  @media (hover: hover) {
    .dz-menu__item:hover:not(:disabled) { background: var(--hover-bg); color: var(--text); }
  }
  .dz-menu__item[data-ds-estado="hover"] { background: var(--hover-bg); color: var(--text); }
  .dz-menu__item:focus-visible,
  .dz-menu__item[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-menu__item:disabled { opacity: var(--op-off); cursor: not-allowed; }
  .dz-menu__item--peligro,
  .dz-menu__item--peligro svg { color: var(--bad-text); }
  .dz-menu__separador { height: 1px; margin: var(--s-1) 0; background: var(--hairline); }
  @media (pointer: coarse) {
    .dz-menu__item { min-height: var(--h-tactil); }
  }
  @media (max-width: 820px) {
    .dz-menu__panel { position: fixed; left: var(--s-2); right: var(--s-2); top: calc(var(--cascaron-top) + env(safe-area-inset-top) + var(--s-1)); min-width: 0; }
    .dz-menu__panel[data-dz-flotante][data-dz-pegado] { inset: auto var(--s-2) auto var(--s-2); top: calc(var(--cascaron-top) + env(safe-area-inset-top) + var(--s-1)); min-width: 0; }
  }
}

/* Menú flotante (contextual): el panel del menú del DS (hairline, radio de tarjeta, sombra, los renglones de dz-menu__item), suelto y fijo donde se
   pidió: bajo el «⋯» alineado a su derecha, o en el puntero. Siempre dentro de la ventana (el comportamiento lo voltea a la izquierda o hacia arriba).
   Con el dedo, o a 560 px o menos, sale como hoja inferior: pegada abajo, con su asa, renglones de --h-tactil y sin la columna de atajos. Los atajos
   son teclas (el átomo "kbd") pegadas a la derecha del renglón. Entrada corta y salida con la curva de lo que se va; con movimiento reducido no hay animación. */
@layer dz.componentes {
  .dz-menu-flotante__contenedor { display: contents; }
  .dz-menu-flotante {
    position: fixed;
    z-index: var(--z-dropdown);
    min-width: var(--w-menu);
    max-width: min(var(--w-avisos), calc(100vw - var(--s-4) * 2));
    padding: var(--s-1);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: var(--shadow-md);
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-menu-flotante[hidden] { display: none; }
  .dz-menu-flotante:focus-visible { outline: none; }
  .dz-menu-flotante[data-dz-saliendo] { opacity: 0; transition: opacity var(--dur-1) var(--ease-sale); }
  /* El espécimen vive en el flujo de la página y no se anima. */
  .dz-menu-flotante--muestra { position: static; animation: none; width: max-content; }
  .dz-menu-flotante .dz-menu__item { gap: var(--s-3); }
  .dz-menu-flotante .dz-menu__item[aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; }
  @media (hover: hover) {
    .dz-menu-flotante .dz-menu__item:hover:not([aria-disabled="true"]) { background: var(--hover-bg); color: var(--text); }
    .dz-menu-flotante .dz-menu__item[aria-disabled="true"]:hover { background: transparent; }
  }
  .dz-menu-flotante__atajo { display: inline-flex; align-items: center; gap: 2px; margin-left: auto; padding-left: var(--s-3); flex: none; }
  .dz-menu-flotante__cuenta { display: flex; align-items: center; gap: var(--s-2); }
  .dz-menu-flotante__cuenta svg { flex: none; color: var(--text-muted); }
  .dz-menu-flotante__oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  /* Hoja inferior: con el dedo, el menú pegado abajo con su asa de arrastre dibujada. */
  .dz-menu-flotante--hoja:not(.dz-menu-flotante--muestra) {
    left: 0;
    right: 0;
    top: auto;
    bottom: 0;
    max-width: none;
    padding: var(--s-2) var(--s-2) calc(var(--s-2) + env(safe-area-inset-bottom));
    border-width: 1px 0 0;
    border-radius: var(--r-card) var(--r-card) 0 0;
    animation: dzEntra var(--dur-2) var(--ease-out);
  }
  .dz-menu-flotante--hoja::before { content: ""; display: block; width: var(--s-8); height: var(--s-1); margin: 0 auto var(--s-2); border-radius: var(--r-pill); background: var(--border-control); }
  .dz-menu-flotante--hoja .dz-menu__item { min-height: var(--h-tactil); }
  .dz-menu-flotante--hoja .dz-menu-flotante__atajo { display: none; }
  .dz-menu-flotante--hoja[data-dz-saliendo]:not(.dz-menu-flotante--muestra) { transform: translateY(100%); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-2) var(--ease-sale); }
  .dz-menu-flotante__velo { position: fixed; inset: 0; z-index: calc(var(--z-dropdown) - 1); background: transparent; }
  .dz-menu-flotante__velo--hoja { background: var(--velo); }
  .dz-menu-flotante__velo[hidden] { display: none; }
  @media (pointer: coarse) {
    .dz-menu-flotante .dz-menu__item { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-menu-flotante, .dz-menu-flotante--hoja:not(.dz-menu-flotante--muestra) { animation: none; }
    .dz-menu-flotante[data-dz-saliendo], .dz-menu-flotante--hoja[data-dz-saliendo]:not(.dz-menu-flotante--muestra) { transition: none; transform: none; }
  }
}

/* Migas: la lista en una fila, separada por el chevron de Lucide. Hasta 560 de ancho de la propia pieza se ocultan los niveles intermedios y sale el «…»
   con el menú de los anteriores. El enlace es una píldora de --h-chip (44 con el dedo); el nivel actual no es enlace y se trunca si no cabe. */
@layer dz.componentes {
  .dz-migas { container: dz-migas / inline-size; display: block; inline-size: 100%; min-inline-size: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-migas__lista { display: flex; align-items: center; flex-wrap: wrap; gap: 0 var(--s-1); min-inline-size: 0; margin: 0; padding: 0; list-style: none; }
  .dz-migas__item { display: inline-flex; flex: 0 1 auto; align-items: center; gap: var(--s-1); min-inline-size: 0; }
  .dz-migas__item--menu { display: none; }
  .dz-migas__separador { flex: none; color: var(--text-muted); }
  .dz-migas__enlace,
  .dz-migas__actual {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    min-inline-size: 0;
    block-size: var(--dz-dens-chip, var(--h-chip));
    padding: 0 var(--s-2);
    border-radius: var(--r-pill);
    font-weight: 500;
    white-space: nowrap;
  }
  .dz-migas__enlace svg { inline-size: var(--ico-1); block-size: var(--ico-1); flex: none; }
  .dz-migas__enlace { color: var(--text-muted); text-decoration: none; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
  @media (hover: hover) {
    .dz-migas__enlace:hover { background: var(--surface-2); color: var(--text); }
  }
  .dz-migas__enlace[data-ds-estado="hover"] { background: var(--surface-2); color: var(--text); }
  .dz-migas__enlace:focus-visible,
  .dz-migas__enlace[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-migas__actual { overflow: hidden; text-overflow: ellipsis; color: var(--text); }
  .dz-migas__oculto { position: absolute; inline-size: 1px; block-size: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-migas__menu .dz-menu__disparador { block-size: var(--dz-dens-chip, var(--h-chip)); padding: 0 var(--s-2); color: var(--text-muted); }
  .dz-migas__menu .dz-menu__disparador > svg:last-child { display: none; }
  @container dz-migas (max-width: 560px) {
    .dz-migas__item--plegable { display: none; }
    .dz-migas__item--menu { display: inline-flex; }
  }
  @media (pointer: coarse) {
    .dz-migas__enlace,
    .dz-migas__actual,
    .dz-migas__menu .dz-menu__disparador { min-block-size: var(--h-tactil); }
    .dz-migas__menu .dz-menu__disparador { min-inline-size: var(--h-tactil); justify-content: center; }
  }
}

/* Página de error dentro del cascarón: el vacío ilustrado en grande, la referencia copiable y la salida a soporte, centrados. La referencia es texto seleccionable en monoespaciada
   con su botón Copiar. El título recibe el foco al montarse (programático), así que no lleva anillo: no es un control. */
@layer dz.componentes {
  .dz-pagina-error { display: grid; justify-items: center; gap: var(--s-2); padding-block: var(--s-6); }
  .dz-pagina-error .dz-vacio-ilustrado { padding-block: var(--s-4) var(--s-3); }
  .dz-pagina-error .dz-vacio-ilustrado__titulo:focus,
  .dz-pagina-error .dz-vacio-ilustrado__titulo:focus-visible { outline: none; box-shadow: none; }
  .dz-pagina-error__referencia { margin: 0; display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--s-2); font-size: var(--fs-2); color: var(--text-muted); }
  .dz-pagina-error__codigo { font-family: var(--mono-code); font-size: var(--fs-2); color: var(--text); user-select: all; }
  .dz-pagina-error__ayuda { margin: 0; font-size: var(--fs-2); color: var(--text-muted); text-align: center; text-wrap: balance; }
}

/* Paginador: a la izquierda dónde estás («Mostrando 1 a 25 de 312», «Página 3 de 13»), a la derecha el selector de tamaño y los controles. Todo en cifras tabulares.
   La página actual es tinta invertida (como un chip encendido). Hasta 560 de ancho de la propia pieza queda Anterior, «X de N» y Siguiente, de --h-tactil. */
@layer dz.componentes {
  .dz-paginador {
    container: dz-paginador / inline-size;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-3) var(--s-4);
    inline-size: 100%;
    min-inline-size: 0;
    font-size: var(--fs-2);
    font-variant-numeric: tabular-nums;
    color: var(--text-2);
  }
  .dz-paginador__info { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-4); margin-inline-end: auto; }
  .dz-paginador__rango,
  .dz-paginador__pagina { margin: 0; }
  .dz-paginador__rango b,
  .dz-paginador__pagina b { font-weight: 600; color: var(--text); }
  .dz-paginador__tamano { display: flex; align-items: center; }
  .dz-paginador__tamano > div { display: flex; flex-direction: row; align-items: center; gap: var(--s-2); }
  .dz-paginador__lista { display: flex; align-items: center; gap: var(--s-1); margin: 0 0 0 auto; padding: 0; list-style: none; }
  .dz-paginador__item { display: flex; align-items: center; }
  .dz-paginador__item--compacto { display: none; }
  .dz-paginador__numero,
  .dz-paginador__flecha {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--s-1);
    min-inline-size: var(--h-btn-ico);
    block-size: var(--dz-dens-btn-ico, var(--h-btn-ico));
    padding: 0 var(--s-2);
    border: 0;
    border-radius: var(--r-btn);
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    line-height: 1;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-paginador__flecha { padding: 0 var(--s-3); }
  .dz-paginador__flecha svg { flex: none; }
  .dz-paginador__texto { white-space: nowrap; }
  @media (hover: hover) {
    .dz-paginador__numero:hover:not([aria-current]),
    .dz-paginador__flecha:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--surface-2); color: var(--text); }
  }
  .dz-paginador__numero[aria-current="page"] { background: var(--chip-on-bg); color: var(--chip-on-text); cursor: default; }
  .dz-paginador__numero[data-ds-estado="hover"]:not([aria-current]),
  .dz-paginador__flecha[data-ds-estado="hover"]:not(:disabled):not([aria-disabled="true"]) { background: var(--surface-2); color: var(--text); }
  .dz-paginador__numero:focus-visible,
  .dz-paginador__flecha:focus-visible,
  .dz-paginador__numero[data-ds-estado="foco"],
  .dz-paginador__flecha[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-paginador__flecha:disabled,
  .dz-paginador__flecha[aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; }
  .dz-paginador__elipsis { display: inline-grid; place-items: center; min-inline-size: var(--h-btn-ico); color: var(--text-muted); }
  .dz-paginador__compacto { padding: 0 var(--s-2); color: var(--text); font-weight: 500; white-space: nowrap; }
  .dz-paginador__oculto { position: absolute; inline-size: 1px; block-size: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  @container dz-paginador (max-width: 560px) {
    .dz-paginador__info,
    .dz-paginador__tamano,
    .dz-paginador__item--numero { display: none; }
    .dz-paginador__item--compacto { display: flex; }
    .dz-paginador__lista { inline-size: 100%; justify-content: space-between; }
    .dz-paginador__flecha { min-block-size: var(--h-tactil); }
  }
  @media (pointer: coarse) {
    .dz-paginador__numero,
    .dz-paginador__flecha { min-inline-size: var(--h-tactil); min-block-size: var(--h-tactil); }
  }
}

/* Pasos (stepper): marca de 28 px por paso (número, palomita o alerta), línea de unión y cuerpo con título, estado en texto y descripción. El estado vive en
   data-dz-estado (hecho, actual, pendiente, error) y el paso actual lleva aria-current="step". Hecho = relleno de la tinta de control con palomita; actual = anillo de
   tinta con el número; pendiente = contorno tenue; error = alerta en el rojo del sistema. Nunca solo color: cada estado también trae su texto.
   Vertical: columna con la línea al lado de la marca. Horizontal: fila; con --colapsa, bajo 560 px deja solo el paso del resumen (el actual) y el resumen «Paso 2 de 4». */
@layer dz.componentes {
  .dz-pasos { display: flex; flex-direction: column; gap: var(--s-3); width: 100%; min-width: 0; }
  .dz-pasos__resumen { display: none; margin: 0; font-size: var(--fs-2); font-weight: 600; color: var(--text); }
  .dz-pasos__lista { position: relative; display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; }
  .dz-pasos__paso {
    display: grid;
    grid-template-columns: var(--h-control-xs) minmax(0, 1fr);
    grid-template-rows: var(--h-control-xs) minmax(var(--s-4), 1fr);
    column-gap: var(--s-3);
    min-width: 0;
  }
  .dz-pasos__marca {
    grid-column: 1;
    grid-row: 1;
    display: inline-grid;
    place-items: center;
    width: var(--h-control-xs);
    height: var(--h-control-xs);
    box-sizing: border-box;
    border: 1px solid var(--border-control);
    border-radius: var(--r-pill);
    background: transparent;
    color: var(--text-2);
    font-size: var(--fs-1);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    line-height: 1;
  }
  .dz-pasos__icono { width: var(--ico-1); height: var(--ico-1); }
  .dz-pasos__linea { grid-column: 1; grid-row: 2; justify-self: center; width: 1px; min-height: var(--s-4); margin-block: var(--s-1); background: var(--border-control); }
  .dz-pasos__cuerpo { grid-column: 2; grid-row: 1 / span 2; display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding-bottom: var(--s-4); }
  .dz-pasos__paso:last-child .dz-pasos__cuerpo { padding-bottom: 0; }
  .dz-pasos__titulo { padding-top: var(--s-1); font-size: var(--fs-3); font-weight: 600; line-height: var(--lh-2); color: var(--text); overflow-wrap: anywhere; }
  .dz-pasos__estado { font-size: var(--fs-1); font-weight: 500; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
  .dz-pasos__descripcion { font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); overflow-wrap: anywhere; }
  .dz-pasos__paso[data-dz-estado="hecho"] .dz-pasos__marca { border-color: var(--accent-control); background: var(--accent-control); color: var(--bg); }
  .dz-pasos__paso[data-dz-estado="hecho"] .dz-pasos__linea { background: var(--accent-control); }
  .dz-pasos__paso[data-dz-estado="actual"] .dz-pasos__marca { border-width: 2px; border-color: var(--text); background: var(--bg); color: var(--text); }
  .dz-pasos__paso[data-dz-estado="actual"] .dz-pasos__estado { color: var(--text); }
  .dz-pasos__paso[data-dz-estado="pendiente"] .dz-pasos__titulo { color: var(--text-2); font-weight: 500; }
  .dz-pasos__paso[data-dz-estado="error"] .dz-pasos__marca { border-color: var(--bad-text); background: var(--bad-soft); color: var(--bad-text); }
  .dz-pasos__paso[data-dz-estado="error"] .dz-pasos__estado { color: var(--bad-text); }

  /* Horizontal: la marca y su línea van en una fila y el cuerpo debajo; cada paso reparte el ancho por igual. */
  .dz-pasos--horizontal .dz-pasos__lista { flex-direction: row; gap: var(--s-3); }
  .dz-pasos--horizontal .dz-pasos__paso { flex: 1 1 0; grid-template-columns: var(--h-control-xs) minmax(0, 1fr); grid-template-rows: var(--h-control-xs) auto; column-gap: var(--s-2); }
  .dz-pasos--horizontal .dz-pasos__linea { grid-column: 2; grid-row: 1; align-self: center; justify-self: stretch; width: auto; min-height: 0; height: 1px; margin: 0; }
  .dz-pasos--horizontal .dz-pasos__cuerpo { grid-column: 1 / span 2; grid-row: 2; padding: var(--s-2) 0 0; }
  .dz-pasos--horizontal .dz-pasos__paso:last-child { flex: 0 1 auto; }

  /* Colapso: bajo 560 px la lista se queda solo con el paso actual (los demás se recortan a la vista pero siguen en el árbol de accesibilidad) y el resumen dice dónde va. */
  @media (max-width: 560px) {
    .dz-pasos--colapsa .dz-pasos__resumen { display: block; }
    .dz-pasos--colapsa .dz-pasos__paso:not([data-dz-resumen]) { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-pasos--colapsa .dz-pasos__paso[data-dz-resumen] { flex: 1 1 auto; }
    .dz-pasos--colapsa .dz-pasos__paso[data-dz-resumen] .dz-pasos__linea { display: none; }
  }
}

/* Pestañas horizontales (APG tabs): fila con filete inferior; la activa lleva un filete de 2 px y la tinta del texto, igual que la variante horizontal de las
   pestañas verticales. Si no caben, la fila se desplaza sin partir ninguna pestaña (nowrap, flex none) y, a 390 px y en cualquier ancho corto, dos
   sombras en los bordes avisan de lo que queda fuera: el comportamiento marca el marco con data-dz-desborde (inicio, fin, ambos). Cada producto fija el color de
   las sombras con --dz-pestanas-fondo cuando la fila va sobre una superficie que no es --bg. */
@layer dz.componentes {
  .dz-pestanas { display: flex; flex-direction: column; gap: var(--s-4); width: 100%; min-width: 0; }
  .dz-pestanas__marco { position: relative; min-width: 0; border-bottom: 1px solid var(--border); }
  .dz-pestanas__lista {
    display: flex;
    gap: var(--s-1);
    overflow-x: auto;
    overflow-y: hidden;
    overscroll-behavior-x: contain;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .dz-pestanas__lista::-webkit-scrollbar { display: none; }
  .dz-pestanas__pestana {
    display: inline-flex;
    flex: none;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--dz-dens-control, var(--h-control));
    margin-bottom: -1px;
    padding: var(--dz-dens-pad, var(--s-2)) var(--s-2);
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: var(--r-control) var(--r-control) 0 0;
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-3);
    font-weight: 500;
    line-height: var(--lh-2);
    white-space: nowrap;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-pestanas__icono { width: var(--ico-1); height: var(--ico-1); flex: none; color: var(--text-muted); }
  .dz-pestanas__texto { min-width: 0; }
  .dz-pestanas__contador { flex: none; }
  @media (hover: hover) {
    .dz-pestanas__pestana:hover { background: var(--hover-bg); color: var(--text); }
  }
  .dz-pestanas__pestana[data-ds-estado="hover"] { background: var(--hover-bg); color: var(--text); }
  .dz-pestanas__pestana[aria-selected="true"], .dz-pestanas__pestana[aria-current="page"] { border-bottom-color: var(--sel-text); color: var(--text); }
  .dz-pestanas__pestana[aria-selected="true"] .dz-pestanas__icono, .dz-pestanas__pestana[aria-current="page"] .dz-pestanas__icono { color: var(--text); }
  .dz-pestanas__pestana[aria-current="page"] .dz-pestanas__contador { background: var(--surface-3); color: var(--text); }
  .dz-pestanas--enlaces .dz-pestanas__pestana { text-decoration: none; }
  .dz-pestanas__pestana:focus-visible,
  .dz-pestanas__pestana[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring-inset); }
  .dz-pestanas__sombra-inicio, .dz-pestanas__sombra-fin {
    position: absolute;
    inset-block: 0;
    width: var(--s-7);
    pointer-events: none;
    opacity: 0;
    transition: opacity var(--dur-2) var(--ease-out);
  }
  .dz-pestanas__sombra-inicio { inset-inline-start: 0; background: linear-gradient(to right, var(--dz-pestanas-fondo, var(--bg)), transparent); }
  .dz-pestanas__sombra-fin { inset-inline-end: 0; background: linear-gradient(to left, var(--dz-pestanas-fondo, var(--bg)), transparent); }
  .dz-pestanas__marco[data-dz-desborde="inicio"] .dz-pestanas__sombra-inicio,
  .dz-pestanas__marco[data-dz-desborde="fin"] .dz-pestanas__sombra-fin,
  .dz-pestanas__marco[data-dz-desborde="ambos"] .dz-pestanas__sombra-inicio,
  .dz-pestanas__marco[data-dz-desborde="ambos"] .dz-pestanas__sombra-fin { opacity: 1; }
  .dz-pestanas__panel { min-width: 0; border-radius: var(--r-control); }
  .dz-pestanas__panel:focus-visible { outline: none; box-shadow: var(--ring); }
  @media (pointer: coarse) {
    .dz-pestanas__pestana { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-pestanas__pestana, .dz-pestanas__sombra-inicio, .dz-pestanas__sombra-fin { transition: none; }
  }
}

/* Pestañas verticales: columna de --w-sub con renglones del alto de un botón; la activa va en --sel-bg. Aspecto del índice de segunda
   columna de LeadZ. Debajo de 820 px se vuelve una fila que se desplaza, sin partir las pestañas.
   Con muchas entradas no crece más que la ventana: tope de alto (la ventana menos el cascarón) y desplazamiento propio, para que elegir
   la última pestaña no baje toda la página. Un producto con otro marco fija el tope con --dz-pestanas-alto. */
@layer dz.componentes {
  .dz-pestanas-verticales {
    display: flex;
    flex-direction: column;
    gap: var(--s-1);
    width: var(--w-sub);
    max-width: 100%;
    flex: none;
    max-height: var(--dz-pestanas-alto, calc(100vh - var(--cascaron-top) - var(--s-6)));
    max-height: var(--dz-pestanas-alto, calc(100dvh - var(--cascaron-top) - var(--s-6)));
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-gutter: stable;
  }
  .dz-pestanas-verticales__grupo {
    margin: var(--s-2) 0 0;
    padding: var(--s-3) var(--s-2) var(--s-1);
    border-top: 1px solid var(--border);
    font-size: var(--fs-1);
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--text-muted);
  }
  .dz-pestanas-verticales__grupo:first-child { margin-top: 0; padding-top: var(--s-1); border-top: 0; }
  .dz-pestanas-verticales__pestana {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    width: 100%;
    min-height: var(--dz-dens-control, var(--h-control));
    padding: var(--dz-dens-pad, var(--s-2)) var(--s-2);
    border: 0;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-3);
    font-weight: 500;
    line-height: var(--lh-2);
    text-align: left;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-pestanas-verticales__icono { width: var(--ico-1); height: var(--ico-1); flex: none; color: var(--text-muted); }
  .dz-pestanas-verticales__texto { flex: 1; min-width: 0; }
  .dz-pestanas-verticales__nota { display: block; margin-top: 1px; font-size: var(--fs-1); font-weight: 400; color: var(--text-muted); }
  .dz-pestanas-verticales__contador { margin-left: auto; }
  @media (hover: hover) {
    .dz-pestanas-verticales__pestana:hover { background: var(--hover-bg); color: var(--text); }
  }
  .dz-pestanas-verticales__pestana[data-ds-estado="hover"] { background: var(--hover-bg); color: var(--text); }
  .dz-pestanas-verticales__pestana[aria-selected="true"],
  .dz-pestanas-verticales__pestana[aria-current="page"] { background: var(--sel-bg); color: var(--sel-text); }
  .dz-pestanas-verticales__pestana[aria-selected="true"] .dz-pestanas-verticales__icono,
  .dz-pestanas-verticales__pestana[aria-current="page"] .dz-pestanas-verticales__icono,
  .dz-pestanas-verticales__pestana[aria-selected="true"] .dz-pestanas-verticales__nota,
  .dz-pestanas-verticales__pestana[aria-current="page"] .dz-pestanas-verticales__nota { color: var(--sel-text); }
  .dz-pestanas-verticales__pestana:focus-visible,
  .dz-pestanas-verticales__pestana[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring-inset); }
  @media (pointer: coarse) {
    .dz-pestanas-verticales__pestana { min-height: var(--h-tactil); }
  }
  /* Variante horizontal: fila con filete inferior; la pestaña activa se marca con un filete de 2 px del color de selección, sin relleno. */
  .dz-pestanas-verticales--horizontal {
    flex-direction: row;
    width: 100%;
    max-height: none;
    overflow-x: auto;
    overflow-y: hidden;
    scrollbar-gutter: auto;
    gap: var(--s-1);
    border-bottom: 1px solid var(--border);
  }
  .dz-pestanas-verticales--horizontal .dz-pestanas-verticales__pestana {
    width: auto;
    flex: none;
    white-space: nowrap;
    border-radius: var(--r-control) var(--r-control) 0 0;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
  }
  .dz-pestanas-verticales--horizontal .dz-pestanas-verticales__pestana[aria-selected="true"],
  .dz-pestanas-verticales--horizontal .dz-pestanas-verticales__pestana[aria-current="page"] { background: transparent; border-bottom-color: var(--sel-text); color: var(--text); }
  .dz-pestanas-verticales--horizontal .dz-pestanas-verticales__pestana[aria-selected="true"] .dz-pestanas-verticales__icono,
  .dz-pestanas-verticales--horizontal .dz-pestanas-verticales__pestana[aria-current="page"] .dz-pestanas-verticales__icono { color: var(--text); }
  @media (max-width: 820px) {
    .dz-pestanas-verticales { flex-direction: row; width: 100%; max-height: none; overflow-x: auto; overflow-y: hidden; gap: var(--s-1); padding-bottom: var(--s-1); }
    .dz-pestanas-verticales__pestana { width: auto; flex: none; white-space: nowrap; }
    .dz-pestanas-verticales__grupo { display: none; }
  }
}

/* Pie de guardar: el estado dicho con texto (el color solo acompaña) y las acciones a su lado. Aspecto del pie de guardado de LeadZ. */
@layer dz.componentes {
  .dz-pie-guardar { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2) var(--s-3); margin-top: var(--s-4); }
  .dz-pie-guardar__estado { font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-pie-guardar__estado[data-estado="sucio"] { color: var(--warn-text); }
  .dz-pie-guardar__estado[data-estado="guardado"] { color: var(--ok-text); }
  .dz-pie-guardar__estado[data-estado="error"] { color: var(--bad-text); }
  .dz-pie-guardar__acciones { display: inline-flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); margin-left: auto; }
  /* Pegado al borde inferior de su contenedor con desplazamiento. */
  .dz-pie-guardar--pegado { position: sticky; bottom: var(--dz-teclado, 0); z-index: var(--z-sticky); margin-top: 0; padding: var(--s-3) 0 calc(var(--s-3) + env(safe-area-inset-bottom)); border-top: 1px solid var(--border); background: var(--bg); }
}

/* Posponer («Recuérdame»): la lista corta de atajos, cada uno con su fila de --h-fila (--h-tactil con el dedo), hairline entre filas y la hora o el día resultante a la derecha en
   cifras tabulares; «Personalizado» abre debajo la fecha y la hora con los campos del DS (usa: boton, campo-fecha, campo-hora). Sin caja propia: vive en la hoja, el modal o la
   página que la aloja. */
@layer dz.componentes {
  .dz-posponer { display: grid; gap: var(--s-2); width: 100%; max-width: var(--w-popover); color: var(--text); font-size: var(--fs-2); }
  .dz-posponer__titulo { margin: 0; font-size: var(--fs-2); font-weight: 500; color: var(--text-2); }
  .dz-posponer__razon { margin: 0; }
  .dz-posponer__personalizado .dz-campo__razon { display: none; } /* la razón ya se dijo arriba; el campo la sigue anunciando por aria-describedby */
  .dz-posponer__atajos { display: grid; border-top: 1px solid var(--hairline); }
  .dz-posponer__atajo {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-3);
    min-height: var(--dz-dens-fila, var(--h-fila));
    padding: 0 var(--s-2);
    border: 0;
    border-bottom: 1px solid var(--hairline);
    background: transparent;
    color: var(--text);
    font: inherit;
    text-align: left;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) {
    .dz-posponer__atajo:hover:not(:disabled) { background: var(--hover-bg); }
  }
  .dz-posponer__atajo[data-ds-estado="hover"]:not(:disabled) { background: var(--hover-bg); }
  .dz-posponer__atajo:focus-visible,
  .dz-posponer__atajo[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring-inset); }
  .dz-posponer__atajo:disabled { opacity: var(--op-off); cursor: not-allowed; }
  .dz-posponer__texto { min-width: 0; }
  .dz-posponer__detalle { flex: none; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-posponer__chevron { flex: none; color: var(--text-muted); transition: transform var(--dur-1) var(--ease-out); }
  .dz-posponer__atajo[aria-expanded="true"] .dz-posponer__chevron { transform: rotate(180deg); }
  .dz-posponer__personalizado { display: grid; gap: var(--s-3); padding: var(--s-3) var(--s-2) 0; animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out); }
  /* Sale como entra (ACB-12): se funde y sube un poco en --dur-1 y solo después se esconde. Sin puntero mientras sale. */
  .dz-posponer__personalizado[data-dz-saliendo] { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale); pointer-events: none; }
  .dz-posponer[data-dz-muestra] .dz-posponer__personalizado { animation: none; }
  .dz-posponer__pie { display: flex; justify-content: flex-end; gap: var(--s-2); }
  @media (pointer: coarse) {
    .dz-posponer__atajo { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-posponer__atajo,
    .dz-posponer__chevron { transition: none; }
    .dz-posponer__personalizado { animation: none; }
  }
}

/* Rango: el deslizador de un rango numérico. Histograma de conteos, pista con banda, dos asas nativas encimadas y dos campos equivalentes. Es un fieldset de verdad
   (leyenda, grupo): sin container-type, que Chromium no respeta en fieldset; los campos se envuelven solos por flex. La pista mide --h-tactil y el área que se toca
   es la pista entera, no el pulgar (PCB-430). */
@layer dz.componentes {
  .dz-rango { display: grid; gap: var(--s-2); min-width: 0; margin: 0; padding: 0; border: 0; }
  .dz-rango:disabled { opacity: var(--op-off); }
  .dz-rango__leyenda { padding: 0; font-size: var(--fs-1); font-weight: 500; color: var(--text-2); }
  .dz-rango__razon { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-rango__valor { margin: 0; font-size: var(--fs-3); font-weight: 500; color: var(--text); font-variant-numeric: tabular-nums; }
  .dz-rango__histo { display: flex; align-items: flex-end; gap: 1px; height: var(--s-7); margin: 0 calc(var(--s-3) - 1px); }
  .dz-rango__barra { flex: 1 1 0; height: 6%; min-height: 2px; border-radius: 1px 1px 0 0; background: var(--surface-3); transition: background var(--dur-1) var(--ease-out); }
  .dz-rango__barra[data-dz-dentro] { background: var(--accent-control); }
  /* La altura es un nivel de 1 a 20 (de 5 en 5 %): sin estilos en línea y sin medir en el servidor. Sin nivel (cargando) queda a 6 %; con 0, a 2 px. */
  .dz-rango__barra[data-dz-alto="0"] { height: 2px; }
  .dz-rango__barra[data-dz-alto="1"] { height: 5%; }
  .dz-rango__barra[data-dz-alto="2"] { height: 10%; }
  .dz-rango__barra[data-dz-alto="3"] { height: 15%; }
  .dz-rango__barra[data-dz-alto="4"] { height: 20%; }
  .dz-rango__barra[data-dz-alto="5"] { height: 25%; }
  .dz-rango__barra[data-dz-alto="6"] { height: 30%; }
  .dz-rango__barra[data-dz-alto="7"] { height: 35%; }
  .dz-rango__barra[data-dz-alto="8"] { height: 40%; }
  .dz-rango__barra[data-dz-alto="9"] { height: 45%; }
  .dz-rango__barra[data-dz-alto="10"] { height: 50%; }
  .dz-rango__barra[data-dz-alto="11"] { height: 55%; }
  .dz-rango__barra[data-dz-alto="12"] { height: 60%; }
  .dz-rango__barra[data-dz-alto="13"] { height: 65%; }
  .dz-rango__barra[data-dz-alto="14"] { height: 70%; }
  .dz-rango__barra[data-dz-alto="15"] { height: 75%; }
  .dz-rango__barra[data-dz-alto="16"] { height: 80%; }
  .dz-rango__barra[data-dz-alto="17"] { height: 85%; }
  .dz-rango__barra[data-dz-alto="18"] { height: 90%; }
  .dz-rango__barra[data-dz-alto="19"] { height: 95%; }
  .dz-rango__barra[data-dz-alto="20"] { height: 100%; }
  /* Mientras llega el histograma, las barras quedan a altura fija (6 %) y las asas ya operan. */
  .dz-rango__histo--cargando .dz-rango__barra { height: 6%; }
  .dz-rango__pista { position: relative; height: var(--h-tactil); }
  .dz-rango__riel { position: absolute; left: var(--s-3); right: var(--s-3); top: 50%; height: var(--s-1); margin-top: calc(var(--s-1) / -2); border-radius: var(--r-pill); background: var(--line-2); }
  .dz-rango__banda { position: absolute; top: 0; bottom: 0; left: var(--dz-a, 0%); right: calc(100% - var(--dz-b, 100%)); border-radius: var(--r-pill); background: var(--accent-control); }
  /* Las dos asas son <input type="range"> de verdad, encimados: el riel nativo no se pinta (solo recibe el pulgar el puntero) y el pulgar es la caja del DS. */
  .dz-rango__asa { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0; background: transparent; appearance: none; -webkit-appearance: none; pointer-events: none; }
  .dz-rango__asa::-webkit-slider-runnable-track { height: 100%; background: transparent; }
  .dz-rango__asa::-moz-range-track { height: 100%; background: transparent; }
  .dz-rango__asa::-webkit-slider-thumb { appearance: none; -webkit-appearance: none; pointer-events: auto; width: var(--s-6); height: var(--s-6); margin-top: calc((var(--h-tactil) - var(--s-6)) / 2); border: 1.5px solid var(--text-muted); border-radius: 50%; background: var(--field); box-shadow: var(--shadow-sm); cursor: grab; transition: border-color var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out); }
  .dz-rango__asa::-moz-range-thumb { pointer-events: auto; width: var(--s-6); height: var(--s-6); border: 1.5px solid var(--text-muted); border-radius: 50%; background: var(--field); box-shadow: var(--shadow-sm); cursor: grab; }
  .dz-rango__asa:active::-webkit-slider-thumb { cursor: grabbing; transform: scale(1.08); border-color: var(--text-2); }
  .dz-rango__asa:focus { outline: none; }
  .dz-rango__asa:focus-visible { box-shadow: none; animation: none; }
  .dz-rango__asa:focus-visible::-webkit-slider-thumb { outline: 2px solid var(--focus); outline-offset: 2px; border-color: var(--focus); }
  .dz-rango__asa:focus-visible::-moz-range-thumb { outline: 2px solid var(--focus); outline-offset: 2px; border-color: var(--focus); }
  .dz-rango__asa:disabled::-webkit-slider-thumb { cursor: not-allowed; }
  /* El asa que se movió al final queda encima para poder volver a tomarla cuando las dos se juntan (PCB-429). */
  .dz-rango__asa[data-dz-encima] { z-index: 1; }
  .dz-rango__extremos { display: flex; justify-content: space-between; margin: calc(var(--s-2) * -1) var(--s-3) 0; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-rango__campos { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: flex-end; }
  .dz-rango__campos > .dz-campo { flex: 1 1 var(--w-cifra); min-width: 0; }
  .dz-rango__campos .dz-campo-compuesto__control { font-variant-numeric: tabular-nums; text-align: right; }
  .dz-rango__atajos { display: flex; flex-wrap: wrap; gap: var(--s-1); }
  .dz-rango__error { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--bad-text); }
  .dz-rango__error:empty { display: none; }
  .dz-rango__nota { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-rango__nota:empty { display: none; }
  @media (forced-colors: active) {
    .dz-rango__banda { background: Highlight; }
    .dz-rango__barra[data-dz-dentro] { background: Highlight; }
    .dz-rango__asa::-webkit-slider-thumb { border-color: ButtonText; background: ButtonFace; }
    .dz-rango__asa::-moz-range-thumb { border-color: ButtonText; background: ButtonFace; }
  }
}

/* Densidad elegida por la persona. Cómoda es la de siempre; compacta achica filas, controles y espaciados con tokens que ya existen. La elección vive en
   el atributo data-ds-densidad de un contenedor (<html> o una región) y este archivo la traduce a variables --dz-dens-* que heredan, así la región más
   cercana manda (una región cómoda dentro de una página compacta vuelve a la medida de siempre). Todas las piezas con controles, filas o celdas
   leen esas variables con su medida de siempre como respaldo; sin el atributo no cambia nada. La escala de la compacta, de mayor a menor:
   control 30 · control-sm 28 · barra 30 · fila 36 · item 30 · chip 24 · btn-ico 28 · control-xs 24 (nunca bajo --h-mini, el mínimo con puntero fino). El glifo de un botón de solo icono baja de 18 a 16 con ella (ICB-270).
   Con el dedo (pointer: coarse) NADA se achica: las variables solo existen con puntero fino, así que el blanco de 44 px (h-tactil) nunca baja y la
   nota del selector lo dice. El selector es un control segmentado de dos opciones con su etiqueta; el modo compacto vale aunque no haya selector. */
@layer dz.componentes {
  .dz-selector-densidad { display: inline-flex; align-items: center; flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-selector-densidad__etiqueta { font-size: var(--fs-2); color: var(--text-muted); }
  /* La nota solo aplica donde la densidad no hace nada: con el dedo. */
  .dz-selector-densidad__nota { display: none; flex-basis: 100%; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  @media (pointer: coarse) {
    .dz-selector-densidad__nota { display: block; }
  }

  @media (pointer: fine) {
    [data-ds-densidad="compacta"] {
      --dz-dens-fila: var(--h-barra);
      --dz-dens-pad: var(--s-1);
      --dz-dens-item: var(--h-control-sm);
      --dz-dens-control: var(--h-control-sm);
      --dz-dens-campo-py: var(--s-1);
      --dz-dens-control-sm: var(--h-control-xs);
      --dz-dens-control-xs: var(--h-mini);
      --dz-dens-barra: var(--h-control-sm);
      --dz-dens-chip: var(--h-mini);
      --dz-dens-btn-ico: var(--h-control-xs);
      --dz-dens-ico-solo: var(--ico-2);
    }
    /* Una región cómoda dentro de una compacta suelta las variables: las piezas vuelven a su medida de siempre. */
    [data-ds-densidad="comoda"] {
      --dz-dens-fila: initial;
      --dz-dens-pad: initial;
      --dz-dens-item: initial;
      --dz-dens-control: initial;
      --dz-dens-campo-py: initial;
      --dz-dens-control-sm: initial;
      --dz-dens-control-xs: initial;
      --dz-dens-barra: initial;
      --dz-dens-chip: initial;
      --dz-dens-btn-ico: initial;
      --dz-dens-ico-solo: initial;
    }
  }
}

/* Sugerencia de IA: una tarjeta con hairline (una superficie, un borde) que propone un valor para un campo. Arriba la marca de IA, el campo y el menú para reportar un
   problema; en medio el texto propuesto (texto inerte, nunca marcado), el «por qué» con sus fuentes y, abajo, aceptar, editar y descartar. Aceptada baja a la
   superficie anidada y deja Deshacer; descartada tacha el texto. La tarjeta es contenedor: bajo 560 px de ancho propio, Aceptar ocupa el renglón completo. Las
   fuentes son chips-enlace al registro (llamada, mensaje), que con el dedo suben a la altura táctil. */
@layer dz.componentes {
  .dz-sugerencia-ia { container-type: inline-size; display: grid; gap: var(--s-3); min-width: 0; padding: var(--s-3) var(--s-4); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); color: var(--text); }
  .dz-sugerencia-ia__cab { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); min-height: var(--h-control-sm); }
  .dz-sugerencia-ia__campo { font-size: var(--fs-2); font-weight: 500; color: var(--text-2); }
  .dz-sugerencia-ia__menu { margin-inline-start: auto; }
  .dz-sugerencia-ia__menu > .dz-menu__disparador { width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0; justify-content: center; color: var(--text-muted); }
  .dz-sugerencia-ia__menu > .dz-menu__disparador > svg:last-child { display: none; }
  .dz-sugerencia-ia__oculto,
  .dz-sugerencia-ia__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-sugerencia-ia__cuerpo { font-size: var(--fs-3); line-height: var(--lh-3); overflow-wrap: anywhere; white-space: pre-line; }
  .dz-sugerencia-ia__cuerpo p { margin: 0; }
  .dz-sugerencia-ia__porque { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-sugerencia-ia__porque b { font-weight: 500; color: var(--text-2); }
  .dz-sugerencia-ia__fuente { text-decoration: none; cursor: pointer; transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
  @media (hover: hover) { .dz-sugerencia-ia__fuente:hover { background: var(--surface-3); color: var(--text); } }
  .dz-sugerencia-ia__fuente[data-ds-estado="hover"] { background: var(--surface-3); color: var(--text); }
  .dz-sugerencia-ia__fuente:focus-visible,
  .dz-sugerencia-ia__fuente[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-sugerencia-ia__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-sugerencia-ia__acciones[hidden],
  .dz-sugerencia-ia__edicion[hidden],
  .dz-sugerencia-ia__listo[hidden] { display: none; }
  .dz-sugerencia-ia__mas { align-self: center; }
  .dz-sugerencia-ia__mas > .dz-menu__disparador { background: var(--surface); border: 1px solid var(--border-control); }
  .dz-sugerencia-ia__listo { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); font-size: var(--fs-2); color: var(--text-2); }
  .dz-sugerencia-ia__ok { flex: none; color: var(--ok-text); }
  .dz-sugerencia-ia__no { display: none; flex: none; color: var(--text-muted); }
  .dz-sugerencia-ia__listo > span { flex: 1 1 12ch; min-width: 0; }
  .dz-sugerencia-ia[data-dz-estado="aceptada"] { background: var(--surface-anidada); }
  .dz-sugerencia-ia[data-dz-estado="aceptada"] .dz-sugerencia-ia__cuerpo { color: var(--text-2); }
  .dz-sugerencia-ia[data-dz-estado="descartada"] .dz-sugerencia-ia__cuerpo { color: var(--text-muted); text-decoration: line-through; text-decoration-color: var(--line-2); }
  .dz-sugerencia-ia[data-dz-estado="descartada"] .dz-sugerencia-ia__ok { display: none; }
  .dz-sugerencia-ia[data-dz-estado="descartada"] .dz-sugerencia-ia__no { display: inline-block; }
  .dz-sugerencia-ia__edicion { display: grid; gap: var(--s-2); }
  @media (pointer: coarse) { .dz-sugerencia-ia__fuente { height: var(--h-tactil); padding: 0 var(--s-3); } }
  @container (max-width: 560px) {
    .dz-sugerencia-ia__acciones > .dz-boton--primario { flex: 1 1 100%; justify-content: center; }
    .dz-sugerencia-ia__acciones > .dz-boton:not(.dz-boton--primario) { flex: 1 1 auto; justify-content: center; }
  }
  @media (forced-colors: active) { .dz-sugerencia-ia { border: 1px solid CanvasText; } .dz-sugerencia-ia__fuente { border: 1px solid LinkText; } }
}

/* Tabla de datos: cabecera en mono mayúscula sobre una línea firme, filas separadas solo por hairline horizontal, celdas centradas en
   vertical, cifras tabulares a la derecha. Sin cebra ni fondos. Bordes SEPARADOS con espaciado 0: con collapse Safari pinta más
   brillante el borde bajo la primera columna. La región se desplaza sin romper la página.
   Variante apilada (dz-tabla--apilada): en un contenedor de menos de 560 px de ancho (el de la región, no el de la ventana) cada fila
   es una tarjeta de pares etiqueta y valor, y la cabecera sigue ahí solo para lectores de pantalla.
   Orden (dz-tabla__orden): el título de la columna es un botón sin cromo y la flecha de Lucide aparece al apuntar o enfocar, y se queda en la
   columna ordenada, hacia abajo en descendente y girada hacia arriba en ascendente (como el orden por columna de LeadZ). Selección
   (dz-tabla__seleccion): columna de casilla por fila, la fila marcada toma --sel-bg y --sel-text; la casilla llena toda la celda para que el área
   que se toca sea la celda y no solo la caja de 20 px. */
@layer dz.componentes {
  .dz-tabla__region { max-width: 100%; overflow-x: auto; }
  /* Indicador de scroll horizontal (DCB-259): el borde con más contenido se desvanece y deja de hacerlo al llegar al final. Dos longitudes
     animadas por la posición de scroll de la propia región; sin desborde la línea de tiempo no corre y no se desvanece nada. Donde el
     navegador no trae animation-timeline la tabla queda como estaba. */
  @property --dz-vela-i { syntax: "<length>"; inherits: false; initial-value: 0px; }
  @property --dz-vela-d { syntax: "<length>"; inherits: false; initial-value: 0px; }
  @keyframes dz-tabla-vela-i { from { --dz-vela-i: 0px; } to { --dz-vela-i: var(--s-6); } }
  @keyframes dz-tabla-vela-d { from { --dz-vela-d: var(--s-6); } to { --dz-vela-d: 0px; } }
  @supports (animation-timeline: scroll(self inline)) {
    .dz-tabla__region {
      mask-image: linear-gradient(to right, transparent, currentcolor var(--dz-vela-i), currentcolor calc(100% - var(--dz-vela-d)), transparent);
      animation: dz-tabla-vela-i linear both, dz-tabla-vela-d linear both;
      animation-timeline: scroll(self inline), scroll(self inline);
      animation-range: 0 var(--s-6), calc(100% - var(--s-6)) 100%;
    }
  }
  /* Encabezado fijo: con altura máxima la región desplaza en vertical y la fila de títulos se queda arriba. */
  .dz-tabla__region--fija { max-height: calc(var(--h-fila) * 8); overflow-y: auto; }
  .dz-tabla__region--fija .dz-tabla__titulo { position: sticky; top: 0; z-index: 1; background: var(--surface); }
  /* Solo la apilada mide a su región: contener el ancho obliga a la región a tener ancho propio (en un padre flex que se ajusta al contenido, 0). */
  .dz-tabla__region:has(> .dz-tabla--apilada) { container-type: inline-size; }
  .dz-tabla__region:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-tabla { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--fs-3); color: var(--text); }
  .dz-tabla__leyenda { padding: 0 0 var(--s-1); text-align: left; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-tabla__titulo {
    height: var(--dz-dens-barra, var(--h-barra));
    padding: 0 var(--s-2);
    border-bottom: 1px solid var(--border);
    text-align: left;
    vertical-align: middle;
    white-space: nowrap;
    font-family: var(--mono-code);
    font-size: var(--fs-1);
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--text-muted);
  }
  .dz-tabla__orden {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--dz-dens-btn-ico, var(--h-btn-ico));
    margin: 0 calc(var(--s-1) * -1);
    padding: 0 var(--s-1);
    border: 0;
    border-radius: var(--r-chip);
    background: transparent;
    color: inherit;
    font: inherit;
    letter-spacing: inherit;
    text-transform: inherit;
    white-space: nowrap;
    cursor: pointer;
  }
  .dz-tabla__titulo--ordenable { user-select: none; }
  .dz-tabla__titulo--numero .dz-tabla__orden { flex-direction: row-reverse; }
  .dz-tabla__flecha { flex: none; opacity: 0; transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out); }
  .dz-tabla__titulo[aria-sort="ascending"] .dz-tabla__flecha { transform: rotate(180deg); }
  .dz-tabla__titulo[aria-sort="ascending"] .dz-tabla__flecha,
  .dz-tabla__titulo[aria-sort="descending"] .dz-tabla__flecha { opacity: 1; }
  .dz-tabla__titulo[aria-sort="ascending"] .dz-tabla__orden,
  .dz-tabla__titulo[aria-sort="descending"] .dz-tabla__orden { color: var(--text); }
  @media (hover: hover) {
    .dz-tabla__orden:hover { color: var(--text); }
    .dz-tabla__orden:hover .dz-tabla__flecha { opacity: .6; }
    .dz-tabla__titulo[aria-sort="ascending"] .dz-tabla__orden:hover .dz-tabla__flecha,
    .dz-tabla__titulo[aria-sort="descending"] .dz-tabla__orden:hover .dz-tabla__flecha { opacity: 1; }
  }
  @media (hover: none) {
    .dz-tabla__flecha { opacity: .6; }
    .dz-tabla__titulo[aria-sort="ascending"] .dz-tabla__flecha,
    .dz-tabla__titulo[aria-sort="descending"] .dz-tabla__flecha { opacity: 1; }
  }
  .dz-tabla__orden:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-tabla__orden:focus-visible .dz-tabla__flecha { opacity: 1; }
  @media (pointer: coarse) {
    .dz-tabla__orden { min-height: var(--h-tactil); }
  }
  .dz-tabla__celda {
    height: var(--dz-dens-fila, var(--h-fila));
    padding: var(--dz-dens-pad, var(--s-2)) var(--s-2);
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
    font-variant-numeric: tabular-nums;
  }
  .dz-tabla__titulo--numero,
  .dz-tabla__celda--numero { text-align: right; }
  /* La última fila no lleva separador: el borde de la tarjeta ya cierra la tabla. */
  .dz-tabla > tbody > tr:last-child > .dz-tabla__celda { border-bottom: 0; }
  .dz-tabla > tfoot > tr > .dz-tabla__celda { border-top: 1px solid var(--line-2); border-bottom: 0; font-weight: 600; }
  .dz-tabla:has(> tfoot) > tbody > tr:last-child > .dz-tabla__celda { border-bottom: 0; }
  @media (hover: hover) {
    .dz-tabla__fila:hover > .dz-tabla__celda { background: var(--surface-2); }
  }
  .dz-tabla__fila[data-ds-estado="hover"] > .dz-tabla__celda { background: var(--surface-2); }
  .dz-tabla__fila[aria-selected="true"] > .dz-tabla__celda { background: var(--sel-bg); color: var(--sel-text); border-bottom-color: var(--sel-line); }
  /* La fila marcada se distingue del hover (en claro los dos fondos son el mismo gris): una marca del color del texto al borde izquierdo, como en LeadZ. */
  .dz-tabla__fila[aria-selected="true"] > .dz-tabla__seleccion { box-shadow: inset var(--s-1) 0 0 var(--sel-text); }
  .dz-tabla__controles { display: none; }
  .dz-tabla__seleccion { width: var(--s-8); padding: 0; text-align: center; user-select: none; }
  .dz-tabla__seleccion.dz-tabla__celda, .dz-tabla__seleccion.dz-tabla__titulo { padding: 0; }
  /* El blanco de 44 px de la casilla (cabecera y filas) lo da un ::before invisible centrado en ella: la casilla no se mueve de su eje ni se le quita el relleno a la celda. */
  .dz-tabla__seleccion .dz-casilla__caja { position: relative; isolation: isolate; }
  .dz-tabla__seleccion .dz-casilla__caja::before { content: ""; position: absolute; top: 50%; left: 50%; width: var(--h-tactil); height: var(--h-tactil); transform: translate(-50%, -50%); z-index: calc(var(--z-base) * -1); }
  .dz-tabla__casilla { display: flex; justify-content: center; width: 100%; min-height: var(--dz-dens-fila, var(--h-fila)); }
  @media (pointer: coarse) {
    .dz-tabla__casilla { min-height: var(--h-tactil); }
    /* La columna también mide --h-tactil de ancho: la casilla es un blanco de 44 x 44 y no de 28 x 44. */
    .dz-tabla__seleccion { width: var(--h-tactil); min-width: var(--h-tactil); }
  }
  /* «·» (sin dato): apagado, distinto de un 0 (DCB-74); el texto «Sin dato» lo oye quien no lo ve. */
  .dz-tabla__sin-dato { color: var(--text-muted); }
  .dz-tabla__oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .dz-tabla__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  @container (max-width: 560px) {
    .dz-tabla__controles { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2) var(--s-3); padding: 0 var(--s-2) var(--s-2); }
    .dz-tabla__casilla-todas { flex: none; }
    .dz-tabla__orden-por { flex: 1 1 auto; min-width: 0; }
    .dz-tabla--apilada,
    .dz-tabla--apilada > tbody,
    .dz-tabla--apilada > tfoot { display: block; width: 100%; }
    .dz-tabla--apilada > thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-tabla--apilada .dz-tabla__fila,
    .dz-tabla--apilada > tfoot > tr { display: block; padding: var(--s-1) 0; border-bottom: 1px solid var(--border); }
    .dz-tabla--apilada > tbody > tr:last-child { border-bottom: 0; }
    .dz-tabla--apilada .dz-tabla__celda {
      display: grid;
      grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
      align-items: baseline;
      gap: var(--s-2);
      height: auto;
      padding: var(--s-1) var(--s-2);
      border: 0;
      text-align: left;
    }
    .dz-tabla--apilada .dz-tabla__celda::before {
      content: attr(data-etiqueta);
      font-family: var(--mono-code);
      font-size: var(--fs-1);
      font-weight: 600;
      letter-spacing: .05em;
      text-transform: uppercase;
      color: var(--text-muted);
    }
    .dz-tabla--apilada .dz-tabla__celda--numero { text-align: left; }
    .dz-tabla--apilada .dz-tabla__seleccion { display: block; width: auto; padding: var(--s-1) var(--s-2); text-align: left; }
    .dz-tabla--apilada .dz-tabla__seleccion::before { content: none; }
    .dz-tabla--apilada .dz-tabla__casilla { justify-content: flex-start; }
  }
}

/* Tarjeta: hairline, radio de tarjeta y superficie, sin sombra (el DS quieto de LeadZ). Lo que vive DENTRO de una tarjeta va en
   --surface-anidada con hairline y radio de control. Nunca tarjeta dentro de tarjeta con la misma superficie. */
@layer dz.componentes {
  .dz-tarjeta { padding: var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); box-shadow: none; }
  .dz-tarjeta--anidada,
  .dz-tarjeta .dz-tarjeta { padding: var(--s-3) var(--s-4); border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--surface-anidada); box-shadow: none; }
  .dz-tarjeta__titulo { margin: 0 0 var(--s-3); font-size: var(--fs-3); font-weight: 500; letter-spacing: -.012em; color: var(--text-2); }
  .dz-tarjeta__cuerpo { font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text); }
  .dz-tarjeta__pie { margin-top: var(--s-4); padding-top: var(--s-3); border-top: 1px solid var(--border); display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2); }
}

/* Tarjeta de enfoque: un lead, una tarea. Es una tarjeta del sistema (hairline, radio de tarjeta) con el nombre grande, la calificación en barra con su número, la tarea
   de hoy, el guion en una superficie anidada y las acciones con su atajo de una letra al lado del rótulo. El atajo se ve (kbd) y se declara (aria-keyshortcuts). */
@layer dz.componentes {
  .dz-tarjeta-enfoque { display: grid; gap: var(--s-4); container: dz-tarjeta-enfoque / inline-size; }
  .dz-tarjeta-enfoque__cabeza { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--s-3) var(--s-4); }
  .dz-tarjeta-enfoque__quien { display: flex; align-items: flex-start; gap: var(--s-3); min-width: 0; }
  .dz-tarjeta-enfoque__datos { display: grid; justify-items: start; gap: var(--s-1); min-width: 0; }
  .dz-tarjeta-enfoque__nombre { margin: 0; font-size: var(--fs-7); font-weight: 600; letter-spacing: -.02em; line-height: var(--lh-1); overflow-wrap: anywhere; }
  .dz-tarjeta-enfoque__nombre:focus-visible { outline: none; box-shadow: none; }
  .dz-tarjeta-enfoque__sub { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-tarjeta-enfoque__califica { display: grid; grid-template-columns: auto 1fr; column-gap: var(--s-2); align-items: baseline; min-width: var(--w-cifra); }
  .dz-tarjeta-enfoque__califica-n { font-size: var(--fs-6); font-weight: 600; font-variant-numeric: tabular-nums; line-height: 1; }
  .dz-tarjeta-enfoque__califica-l { font-size: var(--fs-1); color: var(--text-muted); }
  .dz-tarjeta-enfoque__barra {
    -webkit-appearance: none;
    appearance: none;
    grid-column: 1 / -1;
    display: block;
    width: 100%;
    height: var(--s-1);
    margin-top: var(--s-2);
    border: 0;
    border-radius: var(--r-pill);
    background: var(--surface-3);
    color: var(--accent-control);
    overflow: hidden;
  }
  .dz-tarjeta-enfoque__barra::-webkit-progress-bar { background: transparent; border-radius: var(--r-pill); }
  .dz-tarjeta-enfoque__barra::-webkit-progress-value { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-tarjeta-enfoque__barra::-moz-progress-bar { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-tarjeta-enfoque__califica--ok .dz-tarjeta-enfoque__califica-n { color: var(--ok-text); }
  .dz-tarjeta-enfoque__califica--aviso .dz-tarjeta-enfoque__califica-n { color: var(--warn-text); }
  .dz-tarjeta-enfoque__tarea { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-2); }
  .dz-tarjeta-enfoque__cuando { color: var(--text-muted); }
  .dz-tarjeta-enfoque__guion { padding: var(--s-4); border-radius: var(--r-card); background: var(--surface-anidada); }
  .dz-tarjeta-enfoque__guion-clave { margin: 0 0 var(--s-1); font-size: var(--fs-1); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); }
  .dz-tarjeta-enfoque__guion-texto { margin: 0; font-size: var(--fs-5); line-height: var(--lh-2); }
  .dz-tarjeta-enfoque__guion-meta { margin: var(--s-2) 0 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-tarjeta-enfoque__origen { margin: 0; }
  .dz-tarjeta-enfoque__origen dt { margin-bottom: var(--s-1); font-size: var(--fs-1); font-weight: 600; color: var(--text-muted); }
  .dz-tarjeta-enfoque__origen dd { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-2); }
  .dz-tarjeta-enfoque__nota { color: var(--text-muted); }
  .dz-tarjeta-enfoque__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-tarjeta-enfoque__accion--primaria { margin-left: auto; }
  .dz-tarjeta-enfoque__atajo { display: inline-grid; place-items: center; min-width: 1.6em; height: 1.5em; margin-left: var(--s-2); padding: 0 .4em; border: 1px solid var(--line-2); border-bottom-width: 2px; border-radius: var(--r-1); background: var(--surface); color: var(--text-2); font-family: var(--font); font-size: .85em; font-weight: 500; line-height: 1; }
  .dz-tarjeta-enfoque__pie { display: flex; flex-wrap: wrap; gap: var(--s-4); padding-top: var(--s-3); border-top: 1px solid var(--hairline); }
  @container dz-tarjeta-enfoque (max-width: 560px) {
    .dz-tarjeta-enfoque__nombre { font-size: var(--fs-6); }
    .dz-tarjeta-enfoque__accion--primaria { flex: 1 1 100%; justify-content: center; margin-left: 0; }
    .dz-tarjeta-enfoque__califica { flex: 1 1 100%; }
  }
  /* Con el dedo no hay teclado: el atajo no enseña nada y se quita; los botones suben a 44 px por su propia pieza. */
  @media (pointer: coarse) { .dz-tarjeta-enfoque__atajo { display: none; } }
}

/* Mitad del toque: tarjeta del sistema con el círculo del paso (número o check), su rótulo en mono, el cuerpo, un solo primario y el pie. La que toca lleva el contorno de control;
   la que espera baja de tono. Con el teléfono la que toca pega su primario al fondo, sobre la barra de abajo. */
@layer dz.componentes {
  .dz-toque-mitad { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; padding: var(--s-6) var(--s-7); }
  .dz-toque-mitad--ahora { border-color: var(--border-control); }
  .dz-toque-mitad--hecha .dz-toque-mitad__meta { color: var(--text-2); }
  .dz-toque-mitad__cab { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--s-1) var(--s-4); }
  .dz-toque-mitad__titulo { display: inline-flex; align-items: center; gap: var(--s-3); }
  .dz-toque-mitad__n {
    display: inline-grid;
    place-items: center;
    flex: none;
    box-sizing: border-box;
    width: var(--h-control-xs);
    height: var(--h-control-xs);
    border: 1.5px solid var(--border-control);
    border-radius: 50%;
    font-family: var(--font);
    font-size: var(--fs-2);
    font-weight: 600;
    letter-spacing: 0;
    color: var(--text);
  }
  .dz-toque-mitad__n--ok { border-color: var(--text); background: var(--text); color: var(--bg); }
  .dz-toque-mitad__n svg { width: var(--ico-1); height: var(--ico-1); stroke-width: 2.5; }
  .dz-toque-mitad__meta { font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-toque-mitad__mensaje { padding: var(--s-3) var(--s-4); border-radius: var(--r-control); background: var(--surface-anidada); font-size: var(--fs-4); line-height: 1.55; color: var(--text); white-space: pre-line; overflow-wrap: anywhere; }
  .dz-toque-mitad--espera .dz-toque-mitad__mensaje { color: var(--text-2); }
  .dz-toque-mitad__cuerpo { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
  .dz-toque-mitad__primario { display: flex; flex-direction: column; gap: var(--s-2); margin-top: auto; }
  .dz-toque-mitad__primario > .dz-boton { width: 100%; height: max(var(--h-mov), var(--h-control)); justify-content: center; font-size: var(--fs-4); font-weight: 600; }
  .dz-toque-mitad__pie { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--s-1) var(--s-3); margin-top: auto; }
  .dz-toque-mitad__primario + .dz-toque-mitad__pie { margin-top: 0; }
  @media (max-width: 820px) {
    .dz-toque-mitad { gap: var(--s-3); padding: var(--s-4); }
    /* El primario de la mitad que toca se pega al fondo, sobre la barra de abajo, y el dedo lo alcanza sin desplazarse. */
    .dz-toque-mitad--ahora .dz-toque-mitad__primario { position: sticky; bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom)); z-index: var(--z-sticky); margin: 0 calc(var(--s-4) * -1); padding: var(--s-2) var(--s-4); background: var(--surface); box-shadow: 0 -1px 0 var(--hairline); }
  }
  /* Con el teléfono en horizontal o con la letra grande un primario pegado taparía casi todo: ahí se desplaza con la página. */
  @media (max-width: 820px) and (max-height: 540px) { .dz-toque-mitad--ahora .dz-toque-mitad__primario { position: static; } }
}

/* Vacío: icono en aro de --vacio-aro, título, texto y acción (16, 8 y 20 de aire). Sin caja ni borde discontinuo: el vacío vive en la
   página. El texto va sin tope de ancho y balanceado. El aro es la referencia de las ondas de movimiento.css; título, texto y acción van
   por encima de ellas. */
@layer dz.componentes {
  .dz-vacio { display: grid; justify-items: center; gap: 0; padding: var(--s-7) var(--s-5); text-align: center; }
  .dz-vacio__aro {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--vacio-aro);
    height: var(--vacio-aro);
    margin-bottom: var(--s-4);
    position: relative;
    border-radius: 50%;
    border: 1px solid var(--line-2);
    background: var(--surface-2);
    color: var(--text-2);
  }
  .dz-vacio__icono { width: var(--vacio-glifo); height: var(--vacio-glifo); }
  /* El glifo va relleno a tono suave con su trazo encima (Alex, 23-oct-2026): solo el contorno no lucía. El relleno va en los trazos y no en el
     <svg>, que lleva fill="none" de Lucide; así sirve con cualquier glifo sin redibujarlo. */
  .dz-vacio__icono > * { fill: currentColor; fill-opacity: .3; }
  .dz-vacio__titulo { margin: 0; max-width: 100%; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: 0; }
  .dz-vacio__texto { margin: var(--s-2) 0 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-wrap: balance; }
  .dz-vacio__titulo, .dz-vacio__texto, .dz-vacio__accion { position: relative; z-index: 1; }
  .dz-vacio__accion { margin-top: var(--s-5); display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); }
  /* Cuando el vacío viene de un filtro: debajo, qué quitar y cuántas filas devuelve cada salida (PCB-693, UCB-59). */
  .dz-vacio__salidas { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); margin-top: var(--s-4); }
  .dz-vacio__cuenta { color: var(--text-muted); font-variant-numeric: tabular-nums; }
}

/* Vacío ilustrado: una de las ocho ilustraciones de estado, título, texto y una acción (16, 8 y 20 de aire). Igual que el vacío: vive en la página, sin caja. */
@layer dz.componentes {
  .dz-vacio-ilustrado { display: grid; justify-items: center; gap: 0; padding: var(--s-7) var(--s-5); text-align: center; }
  .dz-vacio-ilustrado__dibujo { margin-bottom: var(--s-4); }
  .dz-vacio-ilustrado__titulo { margin: 0; max-width: 100%; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: 0; }
  .dz-vacio-ilustrado__texto { margin: var(--s-2) 0 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-wrap: balance; }
  .dz-vacio-ilustrado__accion { margin-top: var(--s-5); display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); }
}

/* Vistas guardadas, v2 (desde 2.2.0): las vistas son pestañas (la pieza pestanas), todas con el mismo tratamiento; la activa lleva un filete de 2 px y la tinta
   del texto (dos señales, no solo color), un solo menú «⋯» dentro de su filete, y lo «sin guardar» sale del nombre y vive al final de la fila en dz-vistas__estado
   (texto, «Guardar vista» y «Restablecer»). El menú y el popover de guardar salen a la capa del documento al abrir (comportamiento/flotante): la lista de pestañas
   se desplaza con overflow y recortaría un panel absoluto. La variante de chips (vistasComo: 'chips') queda como retiro con aviso hasta la siguiente mayor:
   una tira de chips de dos estados con un menú por vista, que son los del DS (dz-chip--accion) en el par chico; con el dedo miden --h-tactil. */
@layer dz.componentes {
  .dz-vistas { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-1); min-width: 0; }
  .dz-vistas__lista { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-1); margin: 0; padding: 0; list-style: none; }
  .dz-vistas__vista { position: relative; display: inline-flex; align-items: center; }
  .dz-vistas__chip { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0 var(--s-3); font-size: var(--fs-2); }
  .dz-vistas__chip svg { width: var(--ico-1); height: var(--ico-1); color: inherit; opacity: .8; }
  /* La vista activa con filtros cambiados lo dice en el propio chip, con texto: no un asterisco ni un punto. */
  .dz-vistas__sucio { font-weight: 400; opacity: .8; }
  .dz-vistas__menu { width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); margin-left: calc(var(--s-1) * -1); }
  .dz-vistas__menu svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-vistas__separador { width: 1px; height: var(--s-5); margin: 0 var(--s-1); background: var(--line-2); }
  .dz-vistas__oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  @media (pointer: coarse) {
    .dz-vistas__chip, .dz-vistas__menu { height: var(--h-tactil); }
    .dz-vistas__menu { width: var(--h-tactil); }
    .dz-vistas__opciones > .dz-menu__disparador, .dz-vistas__hueco { height: var(--h-tactil); }
    .dz-vistas__opciones > .dz-menu__disparador { width: var(--h-tactil); }
    .dz-vistas__hueco { width: var(--h-tactil); }
  }

  /* ───────── v2: pestañas (la raíz es .dz-vistas.dz-vistas--pestanas) */
  .dz-vistas--pestanas { flex-wrap: nowrap; align-items: flex-end; gap: var(--s-3); border-bottom: 1px solid var(--border); }
  .dz-vistas--pestanas > .dz-pestanas { flex: 1 1 auto; width: auto; min-width: 0; }
  .dz-vistas--pestanas .dz-pestanas__marco { border-bottom: 0; }
  /* El filete lo lleva la vista entera (pestaña y «⋯» juntos), no solo la pestaña: así el menú queda dentro del filete de la activa. */
  .dz-vistas--pestanas .dz-vistas__vista { flex: none; margin-bottom: -1px; border-bottom: 2px solid transparent; }
  .dz-vistas--pestanas .dz-vistas__vista[data-dz-activa] { border-bottom-color: var(--sel-text); }
  .dz-vistas--pestanas .dz-vistas__vista .dz-pestanas__pestana { margin-bottom: 0; border-bottom: 0; }
  .dz-vistas--pestanas .dz-vistas__vista[data-dz-activa] .dz-pestanas__pestana,
  .dz-vistas--pestanas .dz-vistas__vista[data-dz-activa] .dz-pestanas__icono { color: var(--text); }
  /* El hueco que deja la activa para el «⋯»: el filete la cubre completa. El botón vive en una capa aparte (un tablist solo tiene pestañas), encima del hueco. */
  .dz-vistas__hueco { flex: none; width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); margin-left: calc(var(--s-1) * -1); }
  .dz-vistas__capa { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
  .dz-vistas__opciones { position: absolute; top: var(--dz-op-y, 0); left: var(--dz-op-x, auto); right: auto; pointer-events: auto; }
  .dz-vistas__opciones > .dz-menu__disparador { justify-content: center; width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0; color: var(--text-2); }
  .dz-vistas__opciones > .dz-menu__disparador svg { width: var(--ico-1); height: var(--ico-1); }
  /* Bajo 820 px el menú es una hoja de lado a lado (menu.css, min-width 0): un mínimo propio la dejaba, con el panel cerrado dentro de su <details>, a 232 px fuera de la ventana. */
  @media (min-width: 821px) { .dz-vistas__panel { min-width: min(var(--w-menu), calc(100vw - var(--s-4) * 2)); } }
  /* Un renglón apagado dice por qué y sigue recibiendo el foco con las flechas, para que su razón se lea (UCB-144). */
  .dz-vistas__panel .dz-menu__item[aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; }
  .dz-vistas--pestanas > .dz-vistas__estado { flex: none; padding-bottom: var(--s-1); }

  /* ───────── v2: lo «sin guardar», al final de la fila, con sus dos salidas */
  .dz-vistas__estado { display: inline-flex; align-items: center; flex-wrap: wrap; gap: var(--s-1) var(--s-2); min-width: 0; }
  .dz-vistas__estado[hidden] { display: none; }
  .dz-vistas__estado-texto { font-size: var(--fs-2); color: var(--text-2); white-space: nowrap; }
  .dz-vistas__estado .dz-popover { display: inline-flex; }

  @media (max-width: 560px) {
    /* A 390 las pestañas ocupan todo el ancho y el estado baja a su propia fila, con hairline arriba. */
    .dz-vistas--pestanas { flex-wrap: wrap; align-items: stretch; gap: 0; }
    .dz-vistas--pestanas > .dz-pestanas { flex-basis: 100%; }
    .dz-vistas--pestanas > .dz-vistas__estado { flex-basis: 100%; padding: var(--s-2) 0; border-top: 1px solid var(--hairline); }
  }
}

/* Zona de carga: la zona es un <label> con borde discontinuo y el <input type="file"> la cubre transparente (Tab, Enter y Espacio abren el selector). El foco se
   ve en el contorno de la zona con :focus-within, nunca en el input. Arrastre, error y deshabilitada son modificadores; la lista de archivos es una <ul>
   y su molde (oculto) es el marcado que clona montarZonaCarga, así nada diverge. */
@layer dz.componentes {
  .dz-zona-carga { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-zona-carga__zona {
    position: relative;
    display: grid;
    justify-items: center;
    gap: var(--s-1);
    padding: var(--s-6) var(--s-5);
    text-align: center;
    border: 1px dashed var(--border-control);
    border-radius: var(--r-card);
    background: transparent;
    color: var(--text-2);
    cursor: pointer;
    transition: border-color var(--dur-1) var(--ease-out), background-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  .dz-zona-carga__input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; outline: none; box-shadow: none; animation: none; }
  .dz-zona-carga__icono { width: var(--ico-4); height: var(--ico-4); margin-bottom: var(--s-1); }
  .dz-zona-carga__titulo { font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text); text-wrap: balance; }
  .dz-zona-carga__elige { color: var(--accent-text); font-weight: 500; }
  .dz-zona-carga__ayuda { font-size: var(--fs-2); line-height: var(--lh-2); color: var(--text-2); }
  @media (hover: hover) {
    .dz-zona-carga__zona:hover { border-color: var(--accent-control); background: var(--hover-bg); }
  }
  .dz-zona-carga__zona[data-ds-estado="hover"], .dz-zona-carga--arrastre .dz-zona-carga__zona { border-color: var(--accent-control); border-style: solid; background: var(--accent-soft); }
  .dz-zona-carga__zona:focus-within, .dz-zona-carga__zona[data-ds-estado="foco"] { border-color: var(--accent-control); border-style: solid; box-shadow: var(--ring); }
  .dz-zona-carga--error .dz-zona-carga__zona { border-color: var(--bad); }
  .dz-zona-carga--deshabilitada .dz-zona-carga__zona { opacity: var(--op-off); cursor: not-allowed; }
  .dz-zona-carga--deshabilitada .dz-zona-carga__input { cursor: not-allowed; }
  .dz-zona-carga__error { margin: 0; font-size: var(--fs-2); line-height: var(--lh-2); color: var(--bad-text); }
  .dz-zona-carga__error[hidden] { display: none; }
  .dz-zona-carga__estado { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-zona-carga__lista { display: grid; gap: var(--s-2); margin: 0; padding: 0; list-style: none; }
  .dz-zona-carga__lista:empty { display: none; }
  .dz-zona-carga__molde[hidden] { display: none; }
  .dz-zona-carga__archivo { display: flex; align-items: center; gap: var(--s-3); min-width: 0; padding: var(--s-2) var(--s-3); border: 1px solid var(--border); border-radius: var(--r-control); background: var(--surface); }
  .dz-zona-carga__archivo--cargando { border-color: var(--border-control); }
  .dz-zona-carga__tipo { display: inline-flex; flex: none; color: var(--text-2); }
  .dz-zona-carga__archivo--listo .dz-zona-carga__tipo { color: var(--ok-text); }
  .dz-zona-carga__archivo--error .dz-zona-carga__tipo { color: var(--bad-text); }
  .dz-zona-carga__datos { display: grid; flex: 1; gap: var(--s-1); min-width: 0; }
  .dz-zona-carga__nombre { overflow: hidden; font-size: var(--fs-3); font-weight: 500; line-height: var(--lh-2); text-overflow: ellipsis; white-space: nowrap; }
  .dz-zona-carga__meta { font-size: var(--fs-2); line-height: var(--lh-2); color: var(--text-2); }
  .dz-zona-carga__archivo--error .dz-zona-carga__meta { color: var(--bad-text); }
  .dz-zona-carga__progreso { appearance: none; display: block; width: 100%; height: var(--s-1); border: 0; border-radius: var(--r-pill); overflow: hidden; background: var(--surface-3); accent-color: var(--accent-control); }
  .dz-zona-carga__progreso::-webkit-progress-bar { background: var(--surface-3); }
  .dz-zona-carga__progreso::-webkit-progress-value { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-zona-carga__progreso::-moz-progress-bar { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-zona-carga__quitar { flex: none; }
  /* Con descripción: el archivo que espera lleva su campo bajo el nombre y el pie junta la cuenta de lo que falta con "Subir". El campo ocupa todo el ancho de la fila
     (el contorno de foco es el de .dz-campo, nunca el del input) y la fila alinea arriba para que el quitar no flote a media altura de un campo con error. */
  .dz-zona-carga__archivo--pendiente { align-items: flex-start; border-color: var(--border-control); }
  .dz-zona-carga__archivo--pendiente .dz-zona-carga__alt { margin-top: var(--s-1); }
  .dz-zona-carga__pie { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-3); }
  .dz-zona-carga__pie[hidden] { display: none; }
  .dz-zona-carga__faltan { flex: 1 1 auto; margin: 0; font-size: var(--fs-2); line-height: var(--lh-2); color: var(--text-2); }
  .dz-zona-carga__faltan:empty { display: none; }
  @media (max-width: 560px) {
    .dz-zona-carga__pie { align-items: stretch; flex-direction: column; }
    .dz-zona-carga__subir { width: 100%; }
  }
}

/* Agenda de semana y día: la rejilla de horas de las citas del equipo. Una columna por día (lunes primero), una fila por hora (64 px, así 15 min son 16 px) y cada
   cita un bloque cuya altura es su duración. El día de hoy y los días pasados van en la superficie anidada; lo de hoy lleva una línea de «ahora» de tinta (no es un
   estado, no es color). El borde izquierdo de 3 px dice el estado de la cita y nunca va solo: el nombre accesible y, en el día, el chip con texto lo dicen también.
   Las posiciones las pone el comportamiento con custom properties en MINUTOS (--dz-ag-ini: minutos desde la medianoche, --dz-ag-dur: minutos, --dz-ag-carril y --dz-ag-ancho
   para los empalmes) y el CSS las convierte a píxeles con la altura de una hora: así la rejilla sigue al zoom y a la densidad sin que nadie mida nada. La pieza no emite ningún style. Sin comportamiento (sin data-dz-montada) las citas quedan apiladas por día. La ventana visible es --dz-ag-desde a --dz-ag-hasta (8 a 20); lo de fuera va
   plegado en dos barras. En una sola columna (el día, y la semana bajo 560 px) solo se ve la columna activa y una tira de siete días de 44 px la cambia. */
@layer dz.componentes {
  .dz-agenda {
    --dz-ag-hora: calc(var(--h-fila) + var(--s-6));
    --dz-ag-regla: calc(var(--s-8) + var(--s-2));
    --dz-ag-desde: 8;
    --dz-ag-hasta: 20;
    --dz-ag-ahora: var(--text);
    position: relative;
    display: grid;
    gap: var(--s-3);
    min-width: 0;
    color: var(--text);
    font-size: var(--fs-2);
  }
  /* Lo que se coloca por minutos declara aquí su arriba y su alto: una custom property se resuelve donde se declara, y --dz-ag-ini y --dz-ag-dur son de cada elemento. */
  .dz-agenda__hora, .dz-agenda__cita, .dz-agenda__destino, .dz-agenda__ahora, .dz-agenda__ahora-hora {
    --dz-ag-arriba: calc((var(--dz-ag-ini, 0) - var(--dz-ag-desde) * 60) * var(--dz-ag-hora) / 60);
    --dz-ag-alto: calc(var(--dz-ag-dur, 30) * var(--dz-ag-hora) / 60);
  }
  .dz-agenda__barra { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); }
  .dz-agenda__nav { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-agenda__titulo { margin: 0; font-size: var(--fs-4); font-weight: 600; letter-spacing: -.012em; color: var(--text); font-variant-numeric: tabular-nums; }
  .dz-agenda__zona { display: inline-flex; align-items: center; gap: var(--s-1); margin: 0 0 0 auto; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-agenda__zona svg { flex: none; }
  .dz-agenda__filtros { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2); }
  .dz-agenda__asesores { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-agenda__agendar { margin-inline-start: auto; }
  .dz-agenda__leyenda { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); margin: 0; padding: 0; list-style: none; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-agenda__leyenda li { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-agenda__leyenda i { flex: none; width: var(--punto); height: var(--punto); box-sizing: border-box; border-radius: 50%; background: var(--text-muted); }
  .dz-agenda__leyenda i[data-tono="agendada"] { background: var(--accent-control); }
  .dz-agenda__leyenda i[data-tono="ok"] { background: var(--ok); }
  .dz-agenda__leyenda i[data-tono="aviso"] { background: var(--warn); }
  .dz-agenda__leyenda i[data-tono="peligro"] { background: var(--bad); }
  .dz-agenda__leyenda i[data-tono="rastro"] { background: transparent; border: 1px dashed var(--text-muted); }
  .dz-agenda__leyenda svg { flex: none; color: var(--warn-text); }
  .dz-agenda__aviso { margin: 0; }
  .dz-agenda__vacio { border: 1px dashed var(--line-2); border-radius: var(--r-card); }
  .dz-agenda--error .dz-agenda__cita { color: var(--text-muted); }
  .dz-agenda--error .dz-agenda__cita-lead, .dz-agenda--error .dz-agenda__cita-hora { color: var(--text-muted); }

  /* El lienzo: una tarjeta que se desplaza en vertical con la cabecera de días pegada arriba. Mide nueve horas y media de alto y el resto se desplaza. */
  .dz-agenda__lienzo { position: relative; max-height: calc(var(--dz-ag-hora) * 9 + var(--h-fila)); overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-agenda__lienzo:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-agenda__dias, .dz-agenda__cuerpo { display: grid; grid-template-columns: var(--dz-ag-regla); grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); }
  .dz-agenda__dias { position: sticky; top: 0; z-index: var(--z-sticky); border-bottom: 1px solid var(--border); background: var(--surface); }
  .dz-agenda__dia { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: var(--dz-dens-fila, var(--h-fila)); padding: var(--s-2) var(--s-1); font-size: var(--fs-1); color: var(--text-2); text-align: center; border-inline-start: 1px solid var(--border); }
  .dz-agenda__dia--regla { border-inline-start: 0; }
  .dz-agenda__dia-nombre { text-transform: lowercase; letter-spacing: .02em; }
  .dz-agenda__dia-largo { display: none; }
  .dz-agenda__dia-num { display: inline-flex; align-items: center; justify-content: center; min-width: var(--h-mini); height: var(--h-mini); padding: 0 var(--s-1); border-radius: var(--r-pill); font-size: var(--fs-3); font-weight: 600; font-variant-numeric: tabular-nums; color: var(--text); }
  .dz-agenda__dia[aria-current="date"] { color: var(--text); }
  .dz-agenda__dia[aria-current="date"] .dz-agenda__dia-num { background: var(--chip-on-bg); color: var(--chip-on-text); }
  .dz-agenda__dia-cuenta { color: var(--text-muted); }

  /* Lo de fuera de la ventana va plegado en dos barras tocables: dicen cuántas citas esconden y, al tocarlas, la rejilla pasa a las 24 horas. */
  .dz-agenda__pliegue { display: flex; align-items: center; gap: var(--s-2); width: 100%; min-height: var(--dz-dens-control-sm, var(--h-control-sm)); margin: 0; padding: 0 var(--s-3); border: 0; border-block: 1px solid var(--border); background: var(--surface-anidada); color: var(--text-2); font: inherit; font-size: var(--fs-1); text-align: left; cursor: pointer; }
  .dz-agenda__pliegue--antes { border-top: 0; }
  .dz-agenda__pliegue--despues { border-bottom: 0; }
  .dz-agenda__pliegue-icono { flex: none; }
  .dz-agenda__pliegue-texto { min-width: 0; }
  .dz-agenda__pliegue[aria-expanded="true"] .dz-agenda__pliegue-icono { transform: rotate(180deg); }
  .dz-agenda__pliegue-cuenta { margin-inline-start: auto; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  @media (hover: hover) { .dz-agenda__pliegue:hover { background: var(--hover-bg); color: var(--text); } }
  .dz-agenda__pliegue:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-agenda__pliegue[hidden] { display: none; }

  .dz-agenda__regla { position: relative; height: calc(var(--dz-ag-hora) * (var(--dz-ag-hasta) - var(--dz-ag-desde))); overflow: clip; }
  .dz-agenda__hora { position: absolute; right: var(--s-2); top: var(--dz-ag-arriba); transform: translateY(var(--s-1)); font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-agenda__columna { position: relative; height: calc(var(--dz-ag-hora) * (var(--dz-ag-hasta) - var(--dz-ag-desde))); overflow: clip; border-inline-start: 1px solid var(--border); background-image: repeating-linear-gradient(to bottom, var(--border) 0 1px, transparent 1px var(--dz-ag-hora)); }
  .dz-agenda__columna[aria-current="date"], .dz-agenda__columna--pasado { background-color: var(--surface-anidada); }
  .dz-agenda__lista { margin: 0; padding: 0; list-style: none; }
  .dz-agenda__item { margin: 0; padding: 0; }
  /* Un hueco de 15 min es tocable con el dedo solo porque la columna entera lo es: el tramo libre abre «Agendar» con la hora bajo el puntero. */
  .dz-agenda__hueco { position: absolute; inset: 0; width: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; cursor: cell; appearance: none; }
  .dz-agenda__hueco:focus-visible { outline: none; box-shadow: var(--ring-inset); }

  /* La cita: un bloque cuya altura es su duración. El carril (--dz-ag-carril) y el ancho los pone el reparto de empalmes. */
  .dz-agenda__cita {
    position: absolute;
    left: calc(var(--dz-ag-carril, 0) * var(--dz-ag-ancho, 100%) + var(--s-1));
    width: calc(var(--dz-ag-ancho, 100%) - var(--s-1) * 2);
    top: var(--dz-ag-arriba);
    height: max(var(--dz-ag-alto), var(--h-mini));
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    margin: 0;
    padding: var(--s-1) var(--s-2);
    border: 1px solid var(--line-2);
    border-inline-start: 3px solid var(--text-muted);
    border-radius: var(--r-control);
    background: var(--surface-2);
    color: var(--text);
    font: inherit;
    font-size: var(--fs-1);
    line-height: var(--lh-2);
    text-align: left;
    overflow: hidden;
    cursor: grab;
    touch-action: pan-y;
    -webkit-user-select: none;
    user-select: none;
    -webkit-touch-callout: none;
    transition: box-shadow var(--dur-1) var(--ease-out), opacity var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out);
  }
  @media (pointer: coarse) {
    .dz-agenda__cita { height: max(var(--dz-ag-alto), var(--h-tactil)); }
    /* «Día», «Hoy» y la tira de días medían 39 a 43 px de ancho: el blanco táctil es de 44 en las dos medidas (PCB-174, MCB-298). */
    .dz-agenda__barra .dz-control-segmentado__opcion, .dz-agenda__nav .dz-boton { min-width: var(--h-tactil); }
    .dz-agenda__tira { gap: 0; }
  }
  .dz-agenda__cita:focus-visible { outline: none; box-shadow: var(--ring); z-index: var(--z-base); }
  @media (hover: hover) { .dz-agenda__cita:hover { background: var(--surface-3); } }
  .dz-agenda__cita-fila { display: contents; }
  .dz-agenda__cita-hora { font-variant-numeric: tabular-nums; color: var(--text-2); white-space: nowrap; }
  .dz-agenda__cita-ini { font-variant-numeric: tabular-nums; }
  .dz-agenda__cita-fin { display: none; }
  .dz-agenda__cita--larga .dz-agenda__cita-fin { display: inline; }
  .dz-agenda__cita-lead { font-weight: 600; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .dz-agenda__cita-estado { display: none; }
  .dz-agenda__cita-meta { display: flex; align-items: center; gap: var(--s-1); min-width: 0; color: var(--text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .dz-agenda__cita-meta .dz-avatar { flex: none; }
  .dz-agenda__cita-tipo { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .dz-agenda__cita-detalle { display: none; }
  .dz-agenda__cita-marca { display: inline-flex; vertical-align: middle; margin-inline-start: var(--s-1); color: var(--warn-text); }
  .dz-agenda__cita-marca[hidden] { display: none; }
  /* Corta (30 min o menos): una sola línea con la hora y el lead; el tipo y el asesor quedan en el nombre accesible y en la hoja. */
  .dz-agenda__cita--corta { flex-direction: row; align-items: center; gap: var(--s-2); }
  .dz-agenda__cita--corta .dz-agenda__cita-fila { display: flex; align-items: center; gap: var(--s-2); min-width: 0; flex: 1 1 auto; }
  .dz-agenda__cita--corta .dz-agenda__cita-meta { display: none; }
  .dz-agenda__cita--corta .dz-agenda__cita-lead { flex: 1 1 auto; min-width: 0; }
  .dz-agenda__cita-marca svg { width: var(--ico-1); height: var(--ico-1); }
  /* Estado: el color solo dice el estado y siempre con un segundo canal (el chip con texto en el día, el nombre accesible en la semana). */
  .dz-agenda__cita[data-estado="agendada"] { border-inline-start-color: var(--accent-control); }
  .dz-agenda__cita[data-estado="realizada"] { border-inline-start-color: var(--ok); }
  .dz-agenda__cita[data-estado="no_asistio"] { border-inline-start-color: var(--bad); }
  .dz-agenda__cita[data-estado="vencida"] { border-inline-start-color: var(--warn); }
  .dz-agenda__cita[data-estado="realizada"], .dz-agenda__cita[data-estado="no_asistio"] { cursor: default; }
  /* La reagendada es solo el rastro de dónde estaba: rayada, sin carril y sin abrir nada. */
  .dz-agenda__cita[data-estado="reagendada"] { border-inline-start-color: var(--text-muted); border-style: dashed; background: repeating-linear-gradient(135deg, transparent 0 var(--s-1), var(--surface-3) var(--s-1) var(--s-2)); color: var(--text-muted); cursor: default; }
  .dz-agenda__cita[data-estado="reagendada"] .dz-agenda__cita-lead { color: var(--text-muted); text-decoration: line-through; }
  .dz-agenda__cita[data-empalme] { border-color: var(--warn); }
  .dz-agenda__cita--en-curso { box-shadow: inset 0 0 0 1px var(--text); }
  .dz-agenda__cita--en-curso:focus-visible { box-shadow: inset 0 0 0 1px var(--text), var(--ring); }
  /* Arrastre: el origen se queda como fantasma, el clon sigue al puntero sin easing y el hueco de destino dice la hora nueva. */
  .dz-agenda__cita--origen { opacity: var(--op-off); }
  .dz-agenda__cita--arrastrando { position: fixed; top: 0; left: 0; z-index: var(--z-dropdown); width: var(--dz-ag-clon-ancho); height: var(--dz-ag-clon-alto); margin: 0; pointer-events: none; cursor: grabbing; box-shadow: var(--shadow-md); transform: translate3d(var(--dz-ag-x, 0px), var(--dz-ag-y, 0px), 0) scale(1.02); transition: none; }
  .dz-agenda__destino { position: absolute; left: var(--s-1); right: var(--s-1); top: var(--dz-ag-arriba); height: max(var(--dz-ag-alto), var(--h-mini)); box-sizing: border-box; padding: var(--s-1) var(--s-2); border: 1px dashed var(--border-control); border-radius: var(--r-control); background: color-mix(in oklch, var(--sel-bg) 70%, transparent); color: var(--text-2); font-size: var(--fs-1); font-variant-numeric: tabular-nums; pointer-events: none; overflow: hidden; }
  .dz-agenda__destino[data-empalme] { border-color: var(--warn); background: var(--warn-soft); color: var(--warn-text); }
  .dz-agenda[data-dz-arrastrando] { cursor: grabbing; -webkit-user-select: none; user-select: none; }
  .dz-agenda[data-dz-arrastrando] .dz-agenda__cita:not(.dz-agenda__cita--arrastrando) { pointer-events: none; }
  .dz-agenda__cita[data-dz-tomada] { box-shadow: var(--ring); z-index: var(--z-base); }
  .dz-agenda__cita[aria-busy="true"] { opacity: var(--op-off); cursor: progress; }
  /* Ahora: una línea de tinta con punto, solo en la columna de hoy, y la hora en la regla. */
  .dz-agenda__ahora { position: absolute; left: 0; right: 0; top: var(--dz-ag-arriba); height: 0; border-top: 2px solid var(--dz-ag-ahora); pointer-events: none; z-index: var(--z-base); }
  .dz-agenda__ahora::before { content: ""; position: absolute; left: calc(var(--punto) / -2); top: calc(var(--punto) / -2 - 1px); width: var(--punto); height: var(--punto); border-radius: 50%; background: var(--dz-ag-ahora); }
  .dz-agenda__ahora-hora { position: absolute; right: var(--s-2); top: var(--dz-ag-arriba); transform: translateY(-50%); padding: 0 var(--s-1); border-radius: var(--r-1); background: var(--dz-ag-ahora); color: var(--bg); font-size: var(--fs-1); font-weight: 600; font-variant-numeric: tabular-nums; line-height: var(--lh-3); pointer-events: none; z-index: var(--z-base); }
  .dz-agenda__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

  /* Cargando: esqueletos con la altura de 30 y 60 min en cada columna, nunca un spinner sobre la rejilla. */
  .dz-agenda__lista--cargando { pointer-events: none; }
  .dz-agenda__esqueleto { position: absolute; left: var(--s-1); right: var(--s-1); width: auto; height: calc(var(--dz-ag-hora) / 2); }
  .dz-agenda__esqueleto--largo { height: var(--dz-ag-hora); }
  .dz-agenda__lista--cargando .dz-agenda__item:nth-child(1) .dz-agenda__esqueleto { top: calc(var(--dz-ag-hora) * 1.5); }
  .dz-agenda__lista--cargando .dz-agenda__item:nth-child(2) .dz-agenda__esqueleto { top: calc(var(--dz-ag-hora) * 4); }
  .dz-agenda__lista--cargando .dz-agenda__item:nth-child(3) .dz-agenda__esqueleto { top: calc(var(--dz-ag-hora) * 7); }

  /* El día tiene una sola columna ancha: le caben diez horas a la vista. Las 24 horas (ampliada) son la rejilla sin plegar; cargando no deja agendar tocando el hueco. */
  .dz-agenda--dia .dz-agenda__lienzo { max-height: calc(var(--dz-ag-hora) * 10 + var(--h-fila)); }
  .dz-agenda--ampliada { --dz-ag-desde: 0; --dz-ag-hasta: 24; }
  .dz-agenda--cargando .dz-agenda__hueco { pointer-events: none; }
  /* Una sola columna (el día, y la semana bajo 560 px): solo la columna activa, la cabecera pegada con el día entero y el bloque con más datos. */
  .dz-agenda--una .dz-agenda__columna:not([data-dz-activa]), .dz-agenda--una .dz-agenda__dia[data-dz-dia]:not([data-dz-activa]) { display: none; }
  .dz-agenda--una .dz-agenda__dia { flex-direction: row; justify-content: flex-start; gap: var(--s-2); padding-inline: var(--s-3); }
  .dz-agenda--una .dz-agenda__dia-corto { display: none; }
  .dz-agenda--una .dz-agenda__dia-largo { display: inline; }
  .dz-agenda--una .dz-agenda__cita { padding: var(--s-2) var(--s-3); font-size: var(--fs-2); }
  .dz-agenda--una .dz-agenda__cita-fin { display: inline; }
  .dz-agenda--una .dz-agenda__cita-estado { display: inline-flex; }
  .dz-agenda--una .dz-agenda__cita-detalle { display: inline; }
  .dz-agenda--una .dz-agenda__cita-fila { display: flex; flex-wrap: wrap; align-items: center; gap: 0 var(--s-2); min-width: 0; overflow: hidden; }
  .dz-agenda--una .dz-agenda__cita-fila .dz-agenda__cita-lead { flex: 1 1 auto; min-width: 0; }
  .dz-agenda--una .dz-agenda__cita-hora, .dz-agenda--una .dz-agenda__cita-estado { flex: none; }
  /* Una cita corta en una sola columna cabe en una línea (hora, lead y chip), sin relleno vertical: 30 min son 32 px y el chip mide 26. */
  .dz-agenda--una .dz-agenda__cita--corta { flex-direction: row; align-items: center; padding-block: 0; }
  .dz-agenda--una .dz-agenda__cita--corta .dz-agenda__cita-fila { flex-wrap: nowrap; flex: 1 1 auto; }
  .dz-agenda--una .dz-agenda__cita--corta .dz-agenda__cita-meta { display: none; }
  /* Una de 15 min (24 px) solo lleva hora y nombre; el estado queda en el borde y en el nombre accesible. */
  .dz-agenda__cita--minima { padding-block: 0; }
  .dz-agenda__cita--minima .dz-agenda__cita-estado { display: none; }
  /* En un carril de empalme (la mitad del ancho o menos) solo caben la hora y el nombre: el resto está en la hoja y en el nombre accesible. */
  .dz-agenda--semana .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-fin, .dz-agenda--semana .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-estado, .dz-agenda--semana .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-meta { display: none; }
  /* El nombre de un bloque alto en un carril se parte en hasta tres renglones en vez de cortarse a la mitad. */
  .dz-agenda__cita[data-dz-carriles]:not(.dz-agenda__cita--corta) .dz-agenda__cita-lead { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; white-space: normal; overflow-wrap: anywhere; }
  /* Tira de días del teléfono: siete botones de 44 px que cambian el día; la semana se recorre con ellos, con las flechas y deslizando. */
  .dz-agenda__tira { display: none; overflow-x: auto; overscroll-behavior-x: contain; gap: var(--s-1); margin: 0; padding: 0; list-style: none; }
  .dz-agenda__tira li { flex: 1 0 var(--h-tactil); min-width: var(--h-tactil); }
  .dz-agenda__tira-dia { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; min-height: var(--h-tactil); padding: var(--s-1) 0; border: 1px solid transparent; border-radius: var(--r-control); background: transparent; color: var(--text-2); font: inherit; font-size: var(--fs-1); cursor: pointer; }
  .dz-agenda__tira-dia b { font-size: var(--fs-3); font-weight: 600; font-variant-numeric: tabular-nums; color: var(--text); }
  .dz-agenda__tira-dia[aria-pressed="true"] { background: var(--sel-bg); border-color: var(--sel-line); color: var(--sel-text); }
  .dz-agenda__tira-dia[aria-current="date"] b { text-decoration: underline; text-underline-offset: .2em; }
  .dz-agenda__tira-dia:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-agenda__tira-dia i { width: var(--punto-chip); height: var(--punto-chip); margin-top: var(--s-1); border-radius: 50%; background: var(--text-muted); }
  .dz-agenda__tira-dia i[hidden] { display: none; }
  /* La hoja de formulario sirve a «Mover» y a «Agendar»: cada modo deja ver solo lo suyo (el comportamiento pone "hidden"). */
  .dz-agenda__solo-agendar { min-width: 0; }
  .dz-agenda__hoja-nota { margin: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-agenda__acciones { flex-wrap: wrap; }
  .dz-agenda__liga { margin: 0; }
  .dz-agenda__mes[hidden], .dz-agenda__hoy[hidden] { display: none; }
  /* La vista Mes es el calendario del DS en su ranura, más ancho que en un selector de fecha. */
  .dz-agenda__mes .dz-calendario { width: min(100%, calc(var(--w-calendario) * 2.5)); }

  /* Sin comportamiento (sin data-dz-montada) no hay posiciones: las citas quedan apiladas por día, en orden de hora. */
  .dz-agenda:not([data-dz-montada]) .dz-agenda__columna { height: auto; min-height: var(--h-fila); padding: var(--s-1) 0; overflow: visible; }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__lista { display: grid; gap: var(--s-1); }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__cita { position: static; width: calc(100% - var(--s-2)); height: auto; margin-inline: var(--s-1); cursor: pointer; }
  .dz-agenda:not([data-dz-montada]) :is(.dz-agenda__hueco, .dz-agenda__hora, .dz-agenda__ahora, .dz-agenda__ahora-hora, .dz-agenda__pliegue) { display: none; }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__destino { position: static; height: auto; margin-inline: var(--s-1); }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__cita--arrastrando { position: static; width: calc(100% - var(--s-2)); height: auto; margin-inline: var(--s-1); transform: none; box-shadow: var(--shadow-md); }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__regla { height: auto; }
  .dz-agenda:not([data-dz-montada]) .dz-agenda__lista--cargando .dz-agenda__esqueleto { position: static; margin-inline: var(--s-1); }

  /* Teléfono: la semana se vuelve la tira y una sola columna; el título y la zona pasan a línea propia. */
  @media (max-width: 560px) {
    .dz-agenda--semana .dz-agenda__tira { display: flex; }
    .dz-agenda__titulo { flex: 1 0 100%; font-size: var(--fs-3); }
    .dz-agenda__zona { flex: 1 0 100%; margin: 0; }
    .dz-agenda__agendar { margin-inline-start: 0; }
    .dz-agenda__lienzo { max-height: calc(var(--dz-ag-hora) * 7 + var(--h-fila)); }
    .dz-agenda--una .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-fin, .dz-agenda--una .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-estado, .dz-agenda--una .dz-agenda__cita[data-dz-carriles] .dz-agenda__cita-meta { display: none; }
  }
  @media (forced-colors: active) {
    .dz-agenda__cita { border-color: CanvasText; }
    .dz-agenda__cita:focus-visible, .dz-agenda__cita[data-dz-tomada], .dz-agenda__tira-dia[aria-pressed="true"] { outline: 2px solid Highlight; }
    .dz-agenda__dia[aria-current="date"] .dz-agenda__dia-num, .dz-agenda__tira-dia[aria-current="date"] b { outline: 2px solid Highlight; }
    .dz-agenda__columna[aria-current="date"] { border-inline: 2px solid Highlight; }
    .dz-agenda__ahora { border-top-color: Highlight; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-agenda__cita { transition: none; }
    .dz-agenda__cita--arrastrando { transform: translate3d(var(--dz-ag-x, 0px), var(--dz-ag-y, 0px), 0); }
    .dz-agenda__pliegue-icono { transition: none; }
  }
}

/* Árbol de equipos y permisos: el patrón tree de ARIA, dentro de la plantilla lista-panel. El foco es el aro interior de la fila (--ring-inset) y la selección es el fondo --sel-bg con la marca de
   --s-1 a la izquierda, igual que la fila de la tabla: foco y selección se distinguen a la vista. La sangría crece una vez --s-6 por nivel (hay reglas hasta el nivel 8) y nada se sale de la fila: el
   nombre se recorta con puntos suspensivos. El chip que viene del padre va en contorno ("dz-arbol__chip--heredado", el mismo recurso que los chips de una regla: lo puso una regla, no una persona), así que
   la forma, no solo el color, dice la diferencia. Bajo 560 px del contenedor la plantilla es una sola columna: el árbol o el panel a pantalla completa (data-dz-vista), con «Volver al árbol». */
@layer dz.componentes {
  .dz-arbol { margin: 0; padding: 0; list-style: none; }
  .dz-arbol [role="group"] { margin: 0; padding: 0; list-style: none; }
  .dz-arbol__nodo { margin: 0; --dz-nivel: 0; }
  .dz-arbol__nodo[hidden] { display: none; }
  .dz-arbol__nodo:focus { outline: none; }
  .dz-arbol__nodo[aria-level="2"] { --dz-nivel: 1; }
  .dz-arbol__nodo[aria-level="3"] { --dz-nivel: 2; }
  .dz-arbol__nodo[aria-level="4"] { --dz-nivel: 3; }
  .dz-arbol__nodo[aria-level="5"] { --dz-nivel: 4; }
  .dz-arbol__nodo[aria-level="6"] { --dz-nivel: 5; }
  .dz-arbol__nodo[aria-level="7"] { --dz-nivel: 6; }
  .dz-arbol__nodo[aria-level="8"] { --dz-nivel: 7; }
  .dz-arbol__fila {
    display: flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--dz-dens-fila, var(--h-fila));
    padding: 0 var(--s-2) 0 calc(var(--s-2) + var(--dz-nivel) * var(--s-6));
    border-radius: var(--r-control);
    cursor: default;
    transition: background var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) { .dz-arbol__fila:hover { background: var(--hover-bg); } }
  .dz-arbol__nodo[data-ds-estado="hover"] > .dz-arbol__fila { background: var(--hover-bg); }
  .dz-arbol__nodo:focus-visible > .dz-arbol__fila,
  .dz-arbol__nodo[data-ds-estado="foco"] > .dz-arbol__fila { box-shadow: var(--ring-inset); }
  .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila { background: var(--sel-bg); color: var(--sel-text); box-shadow: inset var(--s-1) 0 0 var(--sel-text); }
  .dz-arbol__nodo[aria-selected="true"]:focus-visible > .dz-arbol__fila,
  .dz-arbol__nodo[aria-selected="true"][data-ds-estado="foco"] > .dz-arbol__fila { box-shadow: var(--ring-inset), inset var(--s-1) 0 0 var(--sel-text); }
  .dz-arbol__chevron { flex: none; display: inline-grid; place-items: center; width: var(--h-mini); height: var(--h-mini); border: 0; border-radius: var(--r-1); background: transparent; color: var(--text-muted); cursor: pointer; }
  .dz-arbol__chevron svg { transition: transform var(--dur-1) var(--ease-out); }
  .dz-arbol__nodo[aria-expanded="true"] > .dz-arbol__fila > .dz-arbol__chevron svg { transform: rotate(90deg); }
  .dz-arbol__nodo:not([aria-expanded]) > .dz-arbol__fila > .dz-arbol__chevron { visibility: hidden; }
  .dz-arbol__nodo[aria-expanded="false"] > [role="group"] { display: none; }
  .dz-arbol__icono { flex: none; color: var(--text-muted); }
  .dz-arbol__nombre { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-2); font-weight: 500; }
  .dz-arbol__nota { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: var(--fs-1); color: var(--text-muted); white-space: nowrap; }
  .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila .dz-arbol__icono,
  .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila .dz-arbol__nota,
  .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila .dz-arbol__chevron,
  .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila .dz-arbol__cuenta { color: inherit; }
  .dz-arbol__chips { display: flex; align-items: center; gap: var(--s-1); margin-left: auto; flex: none; }
  .dz-arbol__chips .dz-chip { height: var(--h-mini); }
  .dz-arbol .dz-arbol__chip--heredado { background: transparent; box-shadow: inset 0 0 0 1px var(--line-2); }
  .dz-arbol__cuenta { font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  /* Cambio sin guardar: un punto de aviso al final de la fila (el texto para el lector va oculto dentro). */
  .dz-arbol__pendiente { flex: none; width: var(--s-2); height: var(--s-2); border-radius: 50%; background: var(--warn-text); }
  .dz-arbol__buscar { margin-bottom: var(--s-2); }
  .dz-arbol__aviso { margin-bottom: var(--s-2); }
  .dz-arbol__vacio[hidden], .dz-arbol[hidden], .dz-arbol__carga[hidden] { display: none; }
  .dz-arbol__vacio .dz-vacio { padding-block: var(--s-5); }
  .dz-arbol__carga { display: grid; gap: var(--s-2); padding: var(--s-2); }
  .dz-arbol__carga-fila { display: flex; align-items: center; min-height: var(--dz-dens-fila, var(--h-fila)); }
  .dz-arbol__carga-fila--n1 { padding-left: 0; }
  .dz-arbol__carga-fila--n2 { padding-left: var(--s-6); }
  .dz-arbol__carga-fila--n3 { padding-left: calc(var(--s-6) * 2); }
  .dz-arbol__carga-fila .dz-esqueleto { max-width: 100%; }

  .dz-arbol--vista .dz-arbol__panel-vivo { min-width: 0; }
  .dz-arbol__panel { min-width: 0; }
  .dz-arbol__panel-permisos { min-width: 0; }
  .dz-arbol__panel-pie { margin-top: 0; }
  .dz-arbol__moldes { display: none; }
  .dz-arbol__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-arbol__panel-cabecera { display: flex; align-items: center; gap: var(--s-3); margin-bottom: var(--s-4); }
  .dz-arbol__panel-titulos { min-width: 0; }
  .dz-arbol__panel-aro { flex: none; display: inline-grid; place-items: center; width: var(--s-8); height: var(--s-8); border-radius: 50%; background: var(--surface-2); color: var(--text-2); }
  .dz-arbol__panel-titulo { margin: 0; font-size: var(--fs-4); font-weight: 500; overflow-wrap: anywhere; }
  .dz-arbol__panel-sub { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-arbol__panel-permiso { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--s-1) var(--s-3); align-items: center; padding: var(--s-2) 0; border-top: 1px solid var(--border); }
  .dz-arbol__panel-permiso:first-child { border-top: 0; }
  .dz-arbol__panel-permiso-nombre { font-size: var(--fs-2); font-weight: 500; }
  .dz-arbol__panel-permiso-origen { grid-column: 1; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-arbol__panel-permiso--cambiado .dz-arbol__panel-permiso-nombre::after { content: ""; display: inline-block; width: var(--s-2); height: var(--s-2); margin-left: var(--s-2); border-radius: 50%; background: var(--warn-text); vertical-align: middle; }
  .dz-arbol__panel-permiso .dz-campo__selector { min-width: 0; }
  .dz-arbol__panel-permiso .dz-campo__control--selector { min-width: calc(var(--w-celda) * .64); }
  .dz-arbol__panel-permiso .dz-campo__control[aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; }

  .dz-arbol__panel-guardar { margin-top: var(--s-3); }
  .dz-arbol__panel-guardar[hidden] { display: none; }
  .dz-arbol__panel-volver { display: none; margin-bottom: var(--s-3); }
  .dz-arbol__panel-vacio { padding-block: var(--s-6); }

  /* Con el dedo, la fila y el chevron suben a la altura táctil. */
  @media (pointer: coarse) {
    .dz-arbol__fila { min-height: var(--h-tactil); }
    .dz-arbol__chevron { width: var(--h-tactil); height: var(--h-tactil); margin-inline: calc((var(--h-mini) - var(--h-tactil)) / 2); }
    /* «Volver al árbol» y los selectores de permiso del panel también (PCB-174, MCB-298). */
    .dz-arbol__panel-volver, .dz-arbol__panel-permiso .dz-campo__control--chico { min-height: var(--h-tactil); }
  }
  /* Una sola columna: la nota del equipo y los chips secundarios se ocultan, queda el chip del rol; el árbol o el panel, según data-dz-vista. */
  @container dz-lista-panel (max-width: 560px) {
    .dz-arbol__chips .dz-chip:nth-child(n+2), .dz-arbol__nota { display: none; }
    .dz-arbol__panel-volver { display: inline-flex; }
    .dz-lista-panel.dz-arbol--vista[data-dz-vista="arbol"] .dz-lista-panel__lista { display: flex; }
    .dz-lista-panel.dz-arbol--vista[data-dz-vista="arbol"] .dz-lista-panel__panel { display: none; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-arbol__fila, .dz-arbol__chevron svg { transition: none; }
  }
  @media (forced-colors: active) {
    .dz-arbol__nodo[aria-selected="true"] > .dz-arbol__fila { background: Highlight; color: HighlightText; }
    .dz-arbol__nodo:focus-visible > .dz-arbol__fila { outline: 2px solid CanvasText; outline-offset: -2px; }
    .dz-arbol__pendiente { background: CanvasText; }
  }
}

/* Atajos de teclado («?»): un modal ancho con buscador, el contexto actual primero y los grupos en dos columnas (una bajo 560 px). Usa el modal, el campo compuesto, la casilla, la ayuda
   y el chip del DS; lo propio es el renglón de teclas ("dz-atajos__teclas"), cuyas teclas son el átomo "kbd". El título del grupo es mono y
   mayúscula como la cabecera de tabla; el del grupo actual lleva el chip fuerte «aquí». Un atajo de una sola tecla apagado se atenúa a --op-off y dice «(apagado)»: la atenuación nunca va sola. */
@layer dz.componentes {
  .dz-atajos__teclas { display: inline-flex; align-items: center; gap: var(--s-1); flex: none; }
  /* La voz del renglón: las teclas dichas en palabras ("Mayús más F10") para el lector; los kbd, que son glifos sueltos, van aria-hidden. */
  .dz-atajos__voz { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .dz-atajos__mas { font-size: var(--fs-1); color: var(--text-muted); }

  .dz-atajos--modal .dz-modal__titulo { min-width: 0; }
  .dz-atajos__cabecera { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-3); }
  .dz-atajos__contexto { display: inline-flex; align-items: center; gap: var(--s-1); font-size: var(--fs-2); font-weight: 400; letter-spacing: 0; color: var(--text-2); }
  .dz-atajos__contexto b { font-weight: 600; color: var(--text); }
  .dz-atajos__contexto svg { flex: none; }

  .dz-atajos { display: grid; gap: var(--s-4); min-width: 0; }
  .dz-atajos__grupos { columns: 2; column-gap: var(--s-6); }
  .dz-atajos__grupo { break-inside: avoid; margin-bottom: var(--s-5); }
  .dz-atajos__grupo[hidden] { display: none; }
  .dz-atajos__grupo--actual .dz-atajos__titulo { color: var(--text); }
  .dz-atajos__titulo { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0 0 var(--s-1); font-family: var(--mono-code); font-size: var(--fs-1); font-weight: 600; letter-spacing: .05em; text-transform: uppercase; color: var(--text-muted); }
  .dz-atajos__titulo .dz-chip { font-family: var(--font); letter-spacing: 0; text-transform: none; }
  .dz-atajos__lista { display: grid; margin: 0; padding: 0; list-style: none; }
  .dz-atajos__fila { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); min-height: var(--dz-dens-barra, var(--h-barra)); padding: var(--s-1) 0; border-top: 1px solid var(--border); font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-atajos__fila:first-child { border-top: 0; }
  .dz-atajos__fila[hidden] { display: none; }
  .dz-atajos__fila[aria-disabled="true"] { opacity: var(--op-off); }
  .dz-atajos__que { min-width: 0; color: var(--text); }
  .dz-atajos__texto { overflow-wrap: anywhere; }
  .dz-atajos__aqui { flex: none; }
  .dz-atajos__titulo-texto { min-width: 0; }
  .dz-atajos__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-atajos__apagado { color: var(--text-2); white-space: nowrap; }
  .dz-atajos__apagado[hidden] { display: none; }
  .dz-atajos__que mark { padding: 0; background: none; color: inherit; font-weight: 600; }
  .dz-atajos__nada { margin: 0; color: var(--text-2); }
  .dz-atajos__nada[hidden] { display: none; }
  .dz-atajos__pie { display: grid; gap: var(--s-2); padding-top: var(--s-3); border-top: 1px solid var(--hairline); }
  .dz-atajos__casilla { min-width: 0; }
  .dz-atajos__preferencia { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-atajos__preferencia[hidden] { display: none; }

  @media (max-width: 560px) {
    .dz-modal.dz-atajos--modal { padding-inline: 3vw; }
    .dz-atajos__grupos { columns: 1; }
    .dz-atajos__fila { align-items: flex-start; }
    .dz-atajos__fila .dz-atajos__teclas { flex-wrap: wrap; justify-content: flex-end; }
  }
  @media (forced-colors: active) {
    .dz-atajos__que mark { background: Highlight; color: HighlightText; }
  }
}

/* Banner de sistema: la banda bajo la barra superior (ranura "banda" del cascarón), a todo lo ancho, que empuja el contenido. Regleta e icono del tono, como el aviso: el
   color nunca va solo. Segunda superficie (--surface-2) con filete inferior; los botones de dentro levantan su fondo a --surface para no perderse. Entra con
   dzEntraDesdeArriba y sale fundiéndose; con movimiento reducido aparece y desaparece. Bajo 820 px el icono y el texto van en el primer renglón, la × al final de ese renglón y
   las acciones en un segundo renglón alineado al texto. */
@layer dz.componentes {
  .dz-banner-sistema { --banner-marca: var(--accent-control); position: relative; grid-area: banda; display: flex; align-items: flex-start; gap: var(--s-3); padding: var(--s-2) var(--page-pad); min-height: var(--h-barra); background: var(--surface-2); border-bottom: 1px solid var(--border); font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); animation: dzEntraDesdeArriba var(--dur-2) var(--ease-out); overflow: clip; }
  .dz-banner-sistema[hidden] { display: none; }
  .dz-banner-sistema::before { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; width: var(--s-1); background: var(--banner-marca); }
  .dz-banner-sistema--informativo { --banner-marca: var(--accent-control); }
  .dz-banner-sistema--advertencia { --banner-marca: var(--warn-text); }
  .dz-banner-sistema--error { --banner-marca: var(--bad-text); }
  .dz-banner-sistema--ok { --banner-marca: var(--ok-text); }
  .dz-banner-sistema__bandas { display: contents; }
  .dz-banner-sistema__marca { display: inline-grid; place-items: center; flex: none; width: var(--ico-2); height: calc(var(--lh-3) * 1em); color: var(--banner-marca); }
  .dz-banner-sistema__texto { flex: 1 1 0; min-width: 0; margin: 0; }
  .dz-banner-sistema__texto b { font-weight: 600; color: var(--text); }
  .dz-banner-sistema__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); flex: none; min-height: calc(var(--lh-3) * 1em); }
  .dz-banner-sistema__acciones .dz-boton:not(.dz-boton--primario) { background: var(--surface); }
  .dz-banner-sistema__cuenta { font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-banner-sistema__cerrar { flex: none; margin: calc(var(--s-1) * -1) calc(var(--s-2) * -1) calc(var(--s-1) * -1) 0; color: var(--text-muted); }
  .dz-banner-sistema[data-dz-saliendo] { opacity: 0; transition: opacity var(--dur-1) var(--ease-sale); }
  @media (max-width: 820px) {
    .dz-banner-sistema { flex-wrap: wrap; }
    .dz-banner-sistema__texto { flex-basis: calc(100% - var(--ico-2) - var(--h-control-sm) - var(--s-3) * 2); }
    .dz-banner-sistema__acciones { flex-basis: 100%; order: 3; padding-inline-start: calc(var(--ico-2) + var(--s-3)); }
    .dz-banner-sistema__cerrar { order: 2; }
  }
  /* Incrustado (especímenes): la raíz no se pregunta a sí misma, así que el ajuste móvil sigue el ancho del propio cascarón. */
  @container dz-cascaron (max-width: 820px) {
    .dz-cascaron--incrustado .dz-banner-sistema { flex-wrap: wrap; }
    .dz-cascaron--incrustado .dz-banner-sistema__texto { flex-basis: calc(100% - var(--ico-2) - var(--h-control-sm) - var(--s-3) * 2); }
    .dz-cascaron--incrustado .dz-banner-sistema__acciones { flex-basis: 100%; order: 3; padding-inline-start: calc(var(--ico-2) + var(--s-3)); }
    .dz-cascaron--incrustado .dz-banner-sistema__cerrar { order: 2; }
  }
  @media (prefers-reduced-motion: reduce) { .dz-banner-sistema { animation: none; } .dz-banner-sistema[data-dz-saliendo] { transition: none; } }
  @media (forced-colors: active) { .dz-banner-sistema { border: 1px solid CanvasText; border-inline-start-width: var(--s-1); } .dz-banner-sistema::before { display: none; } }
}

/* Bitácora (línea de actividad): una lista de entradas del más reciente al más viejo. Cada entrada es un <details>: el resumen dice cuándo, quién y
   qué; abierta muestra el antes y el después por campo, el motivo y Revertir. Lo revertido y lo que no se puede revertir lo dicen con un chip de
   texto. El detalle es una caja de --surface-2 con rejilla de dos columnas (una sola en teléfono). El resumen lleva 12 px de aire lateral y el
   detalle se separa 8 px de él, para que el fondo del hover no toque la flecha ni la caja abierta (Alex, 23-oct-2026). */
@layer dz.componentes {
  .dz-bitacora__lista { margin: 0; padding: 0; list-style: none; }
  .dz-bitacora__entrada { border-bottom: 1px solid var(--border); }
  .dz-bitacora__entrada:last-child { border-bottom: 0; }
  .dz-bitacora__resumen {
    display: grid;
    grid-template-columns: auto auto auto minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--s-3);
    min-height: var(--dz-dens-fila, var(--h-mov));
    padding: var(--s-2) var(--s-3);
    list-style: none;
    cursor: pointer;
    font-size: var(--fs-2);
    line-height: var(--lh-3);
    border-radius: var(--r-control);
  }
  .dz-bitacora__resumen::-webkit-details-marker { display: none; }
  @media (hover: hover) { .dz-bitacora__resumen:hover { background: var(--hover-bg); } }
  .dz-bitacora__resumen[data-ds-estado="hover"] { background: var(--hover-bg); }
  .dz-bitacora__resumen:focus-visible,
  .dz-bitacora__resumen[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-bitacora__flecha { width: var(--ico-1); height: var(--ico-1); color: var(--text-muted); transition: transform var(--dur-1) var(--ease-out); }
  .dz-bitacora__registro[open] .dz-bitacora__flecha { transform: rotate(90deg); }
  .dz-bitacora__hora { white-space: nowrap; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-bitacora__quien { white-space: nowrap; font-weight: 500; }
  .dz-bitacora__cambio { min-width: 0; color: var(--text); overflow-wrap: anywhere; }
  .dz-bitacora__estado { justify-self: end; }
  .dz-bitacora__marca { vertical-align: middle; margin-inline-start: var(--s-1); }
  .dz-bitacora__entrada--revertido .dz-bitacora__cambio { color: var(--text-muted); }
  .dz-bitacora__detalle { display: grid; gap: var(--s-4); margin: var(--s-2) 0 var(--s-3); padding: var(--s-4); border-radius: var(--r-control); background: var(--surface-2); }
  .dz-bitacora__ab { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4) var(--s-6); }
  .dz-bitacora__lado { min-width: 0; }
  .dz-bitacora__rotulo { margin: 0 0 var(--s-2); font-size: var(--fs-2); font-weight: 500; color: var(--text-muted); }
  .dz-bitacora__campos { display: grid; margin: 0; }
  .dz-bitacora__campo { display: grid; grid-template-columns: minmax(calc(var(--s-6) * 3), 32%) minmax(0, 1fr); gap: var(--s-3); padding: var(--s-2) 0; border-top: 1px solid var(--hairline); font-size: var(--fs-2); }
  .dz-bitacora__campo:first-child { border-top: 0; }
  .dz-bitacora__campo dt { color: var(--text-muted); }
  .dz-bitacora__campo dd { margin: 0; color: var(--text); overflow-wrap: anywhere; }
  .dz-bitacora__nada { margin: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-bitacora__motivo, .dz-bitacora__nota { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-bitacora__motivo b { font-weight: 500; color: var(--text); }
  .dz-bitacora__revertir { justify-self: start; }
  @container (max-width: 560px) {
    .dz-bitacora__resumen { grid-template-columns: auto minmax(0, 1fr) auto; row-gap: var(--s-1); }
    .dz-bitacora__quien { grid-column: 2; }
    .dz-bitacora__cambio { grid-column: 2 / -1; }
    .dz-bitacora__ab { grid-template-columns: minmax(0, 1fr); }
  }
  .dz-bitacora { container-type: inline-size; }
  @media (prefers-reduced-motion: reduce) { .dz-bitacora__flecha { transition: none; } }
}

/* Cabina de llamada: dos columnas en una tarjeta del sistema. A la izquierda la persona, el estado (chip con punto: el color nunca va solo), el cronómetro en cifras
   tabulares y los controles; Colgar en peligro con el auricular relleno girado 135° y Volver a llamar con el mismo sin girar. A la derecha el contexto en una
   superficie anidada. Bajo el corte de tableta una sola columna. La hoja "¿Qué pasó…?" es la hoja del sistema; sus grupos son fieldset con radios. */
@layer dz.componentes {
  .dz-cabina-llamada { padding: var(--s-5); }
  .dz-cabina-llamada__marco { container: dz-cabina-llamada / inline-size; }
  .dz-cabina-llamada__rejilla { display: grid; grid-template-columns: minmax(0, 1fr) minmax(var(--w-celda), var(--w-modal)); gap: var(--s-5); }
  .dz-cabina-llamada__principal { display: grid; justify-items: center; align-content: start; gap: var(--s-2); text-align: center; min-width: 0; }
  .dz-cabina-llamada__estado { margin: 0 0 var(--s-2); }
  .dz-cabina-llamada__nombre { margin: var(--s-1) 0 0; font-size: var(--fs-6); font-weight: 600; letter-spacing: -.02em; overflow-wrap: anywhere; }
  .dz-cabina-llamada__nombre:focus-visible { outline: none; box-shadow: none; }
  .dz-cabina-llamada__datos { margin: 0; color: var(--text-muted); font-size: var(--fs-2); }
  .dz-cabina-llamada__reloj { margin: var(--s-2) 0 var(--s-4); font-size: var(--fs-7); font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -.02em; color: var(--text); }
  .dz-cabina-llamada__controles { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); }
  .dz-cabina-llamada__control { min-width: calc(var(--h-fila) * 2.8); justify-content: center; }
  .dz-cabina-llamada__control[aria-pressed="true"] { background: var(--sel-bg); color: var(--sel-text); }
  .dz-cabina-llamada__contexto { display: grid; align-content: start; gap: var(--s-3); min-width: 0; padding: var(--s-4); border-radius: var(--r-card); background: var(--surface-anidada); }
  .dz-cabina-llamada__contexto-cab { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); font-size: var(--fs-1); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); }
  .dz-cabina-llamada__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  /* La hoja de desenlaces. */
  .dz-cabina-llamada__apoyo { margin: 0; color: var(--text-muted); font-size: var(--fs-2); }
  .dz-cabina-llamada__grupo { min-width: 0; margin: 0; padding: 0; border: 0; }
  .dz-cabina-llamada__legend { margin: 0 0 var(--s-2); padding: 0; font-size: var(--fs-2); font-weight: 600; color: var(--text); }
  .dz-cabina-llamada__opciones { display: grid; gap: var(--s-1); }
  .dz-cabina-llamada__recontacto { padding-top: var(--s-2); }
  .dz-cabina-llamada__chips { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-cabina-llamada__error { margin: 0; }
  @container dz-cabina-llamada (max-width: 820px) {
    .dz-cabina-llamada__rejilla { grid-template-columns: minmax(0, 1fr); }
    .dz-cabina-llamada__control { flex: 1 1 40%; min-width: 0; }
  }
  @container dz-cabina-llamada (max-width: 560px) {
    .dz-cabina-llamada__contexto .dz-detalle { display: none; }
  }
}

/* Cajón: panel lateral de consulta con velo. Cabecera con icono y título, zona superior opcional y lista que se desplaza. Dos anchos, 392
   (--w-cajon) y 660 (--w-cajon-ancho). En teléfono es una hoja inferior de hasta 85 % del alto. Entra con --dur-4 y la curva de énfasis. */
@layer dz.componentes {
  .dz-cajon {
    position: fixed;
    inset: 0;
    z-index: var(--z-cajon);
    display: flex;
    justify-content: flex-end;
    background: color-mix(in oklch, var(--text) 30%, transparent);
    opacity: 1;
    transition: opacity var(--dur-4) var(--ease-enfasis), display var(--dur-4) allow-discrete;
    overscroll-behavior: contain;
    bottom: var(--dz-teclado, 0);
  }
  [data-ds-theme="dark"] .dz-cajon { background: color-mix(in oklch, var(--bg) 55%, transparent); }
  .dz-cajon[hidden] { display: none; opacity: 0; transition: opacity var(--dur-2) var(--ease-out), display var(--dur-2) allow-discrete; }
  .dz-cajon[data-dz-saliendo] { opacity: 0; transition: opacity var(--dur-2) var(--ease-sale); }
  .dz-cajon__panel {
    display: flex;
    flex-direction: column;
    width: var(--w-cajon);
    max-width: 92vw;
    height: 100%;
    background: var(--surface);
    color: var(--text);
    border-left: 1px solid var(--border);
    box-shadow: var(--shadow-md), 0 0 0 1px var(--hairline);
    transform: translateX(0);
    transition: transform var(--dur-4) var(--ease-enfasis);
  }
  .dz-cajon__panel:focus-visible { outline: none; }
  .dz-cajon--ancho .dz-cajon__panel { width: var(--w-cajon-ancho); }
  @starting-style { .dz-cajon:not([hidden]) { opacity: 0; } .dz-cajon:not([hidden]) .dz-cajon__panel { transform: translateX(100%); } }
  .dz-cajon[data-dz-saliendo] .dz-cajon__panel { transform: translateX(100%); transition: transform var(--dur-2) var(--ease-sale); }
  .dz-cajon__asa { display: none; }
  .dz-cajon__cabecera { flex: none; display: flex; align-items: center; gap: var(--s-2); padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--border); }
  .dz-cajon__cabecera svg { flex: none; width: var(--ico-2); height: var(--ico-2); }
  .dz-cajon__cerrar { flex: none; margin-right: calc(var(--s-2) * -1); }
  .dz-cajon__titulo { flex: 1; margin: 0; font-size: var(--fs-3); font-weight: 500; }
  .dz-cajon__superior { flex: none; padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--border); }
  .dz-cajon__lista { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior-y: contain; padding: var(--s-1) var(--s-4) var(--s-6); font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-cajon--muestra { bottom: auto; position: static; z-index: auto; display: block; background: none; transition: none; }
  [data-ds-theme="dark"] .dz-cajon--muestra { background: none; }
  /* La muestra va centrada en su lienzo y nunca más ancha que él: el 92vw del panel real mide la ventana, no el lienzo de 390 (Alex, 23-oct-2026). */
  .dz-cajon--muestra .dz-cajon__panel { height: calc(var(--h-fila) * 9); max-width: 100%; margin: 0 auto; border: 1px solid var(--hairline); border-radius: var(--r-card); transition: none; }
  @media (max-width: 820px) {
    .dz-cajon { align-items: flex-end; }
    .dz-cajon__panel { width: 100%; max-width: none; height: auto; max-height: 85vh; max-height: 85dvh; border-left: 0; border-top: 1px solid var(--hairline); border-radius: var(--r-card) var(--r-card) 0 0; padding-bottom: env(safe-area-inset-bottom); transform: translateY(0); touch-action: manipulation; }
    .dz-cajon--ancho .dz-cajon__panel { width: 100%; }
    /* El asa invita a deslizar; asa y cabecera arrastran (touch-action none) y la lista conserva su desplazamiento. El panel sigue al dedo. */
    .dz-cajon__panel { transform: translateY(var(--dz-arrastre, 0)); }
    .dz-cajon__panel[data-dz-arrastrando] { transition: none; }
    .dz-cajon__asa { display: block; flex: none; align-self: center; width: var(--s-8); height: var(--s-1); margin: var(--s-2) 0 0; border-radius: var(--r-pill); background: var(--border-control); touch-action: none; }
    .dz-cajon__cabecera { touch-action: none; }
    @starting-style { .dz-cajon:not([hidden]) .dz-cajon__panel { transform: translateY(100%); } }
    .dz-cajon[data-dz-saliendo] .dz-cajon__panel { transform: translateY(100%); }
    .dz-cajon--muestra { display: block; }
    .dz-cajon--muestra .dz-cajon__panel { height: calc(var(--h-fila) * 8); max-height: none; border: 1px solid var(--hairline); border-radius: var(--r-card); }
  }
  @media (prefers-reduced-motion: reduce) { .dz-cajon, .dz-cajon__panel { transition: none; } }
}

/* Calendario: la rejilla de un mes, lunes primero. El número va al centro geométrico de su botón en todos los estados; la cuenta de horarios
   cuelga del borde de abajo sin moverlo. La hairline bajo la cabecera y entre semanas es una sola línea continua (border-spacing 0); el aire lo
   pone la celda con --dz-cal-aire. El elegido va en --accent, hoy lleva borde y lo que no se puede elegir se atenúa. Nunca azul de sistema. */
@layer dz.componentes {
  .dz-calendario { --dz-cal-aire: 3px; --dz-cal-barra: var(--s-5); --dz-cal-h: var(--h-control); position: relative; display: grid; gap: var(--s-3); width: min(var(--w-calendario), 100%); min-width: 0; font-size: var(--fs-2); color: var(--text); }
  .dz-calendario__cabecera { position: relative; display: flex; align-items: center; justify-content: center; height: var(--dz-dens-btn-ico, var(--h-btn-ico)); }
  .dz-calendario__titulo { margin: 0; font-size: var(--fs-3); font-weight: 600; line-height: var(--dz-dens-btn-ico, var(--h-btn-ico)); color: var(--text); text-align: center; }
  .dz-calendario__nav {
    position: absolute;
    top: 0;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--dz-dens-btn-ico, var(--h-btn-ico));
    height: var(--dz-dens-btn-ico, var(--h-btn-ico));
    padding: 0;
    border: 1px solid transparent;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text-2);
    cursor: pointer;
  }
  .dz-calendario__nav svg { width: var(--ico-2); height: var(--ico-2); }
  .dz-calendario__nav--ant { left: 0; }
  .dz-calendario__nav--sig { right: 0; }
  @media (hover: hover) { .dz-calendario__nav:hover { background: var(--surface-2); color: var(--text); } }
  .dz-calendario__nav:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-calendario__rejilla { width: 100%; margin: 0; border-collapse: separate; border-spacing: 0; table-layout: fixed; }
  .dz-calendario__dia-semana { height: auto; padding: 0 0 var(--dz-cal-aire); border-bottom: 1px solid var(--hairline); font-size: var(--fs-1); font-weight: 500; line-height: calc(var(--fs-1) * 1.75); color: var(--text-muted); text-align: center; vertical-align: middle; }
  .dz-calendario__celda { padding: var(--dz-cal-aire) 1px; vertical-align: middle; }
  .dz-calendario__dia {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: var(--dz-cal-h);
    padding: 0;
    border: 1px solid transparent;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text);
    font: inherit;
    font-size: var(--fs-3);
    line-height: 1;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
  }
  .dz-calendario__n { display: block; line-height: 1; }
  .dz-calendario__dia[data-n] .dz-calendario__n { transform: translateY(calc(var(--dz-cal-aire) * -1)); }
  /* Horarios libres como barra de capacidad (Alex, 23-oct-2026, propuesta B de Fable): un riel en --line-2 y un relleno en --accent-control que
     crece por tramos, como una batería. 1 = un cuarto, 2 y 3 = la mitad, 4 a 7 = tres cuartos, 8 o más = llena. La cifra exacta va en el
     nombre accesible del día y en la lista de horas al elegirlo. */
  .dz-calendario__dia[data-n]::before,
  .dz-calendario__dia[data-n]::after { content: ''; position: absolute; left: calc(50% - var(--dz-cal-barra) / 2); bottom: calc(var(--s-1) + 1px); height: var(--dz-cal-aire); border-radius: var(--r-pill); }
  .dz-calendario__dia[data-n]::before { width: var(--dz-cal-barra); background: var(--line-2); }
  .dz-calendario__dia[data-n]::after { width: var(--dz-cal-barra); background: var(--accent-control); }
  .dz-calendario__dia[data-n="1"]::after { width: calc(var(--dz-cal-barra) / 4); }
  .dz-calendario__dia:is([data-n="2"], [data-n="3"])::after { width: calc(var(--dz-cal-barra) / 2); }
  .dz-calendario__dia:is([data-n="4"], [data-n="5"], [data-n="6"], [data-n="7"])::after { width: calc(var(--dz-cal-barra) * 3 / 4); }
  .dz-calendario__celda--fuera .dz-calendario__dia[data-n]::after { background: var(--text-muted); }
  /* Cero horarios libres es un dato: el riel queda vacío (sin relleno). Un día sin cuenta no lleva riel: eso es «sin dato». */
  .dz-calendario__dia[data-n="0"]::after { display: none; }
  .dz-calendario__leyenda { margin: var(--s-2) 0 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  @media (hover: hover) { .dz-calendario__celda[aria-selected="false"] .dz-calendario__dia:hover:not(:disabled) { background: var(--surface-2); } }
  .dz-calendario__celda[aria-selected="false"] .dz-calendario__dia[data-ds-estado="hover"] { background: var(--surface-2); }
  .dz-calendario__dia:focus-visible,
  .dz-calendario__dia[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-calendario__celda--fuera .dz-calendario__dia { color: var(--text-muted); }
  .dz-calendario__celda--hoy .dz-calendario__dia { border-color: var(--border-control); font-weight: 600; }
  .dz-calendario__celda[aria-selected="true"] .dz-calendario__dia { background: var(--accent); border-color: var(--text); box-shadow: inset 0 0 0 1px var(--text); color: var(--ink-on-accent); font-weight: 600; }
  .dz-calendario__celda[aria-selected="true"] .dz-calendario__dia[data-n]::before { background: color-mix(in oklch, var(--ink-on-accent) 25%, transparent); }
  .dz-calendario__celda[aria-selected="true"] .dz-calendario__dia[data-n]::after { background: var(--ink-on-accent); }
  .dz-calendario__dia:disabled { color: var(--text-muted); opacity: var(--op-off); cursor: not-allowed; }
  /* Rango (lo pone la pieza rango-fechas; la rejilla sigue siendo la de un mes con un elegido). La banda va en la celda, con la altura exacta del
     botón (--dz-cal-h), para que corra continua entre celdas sin la separación del aire. Inicio y fin siguen siendo el elegido de siempre
     (acento macizo, aria-selected); la banda arranca a la mitad del inicio y termina a la mitad del fin. La vista previa es la misma banda más
     clara y su fin provisional lleva el borde de los controles. */
  .dz-calendario { --dz-cal-banda: var(--sel-bg); --dz-cal-previa: color-mix(in oklch, var(--sel-bg) 55%, var(--surface)); }
  .dz-calendario__celda--rango { background: linear-gradient(var(--dz-cal-banda), var(--dz-cal-banda)) center / 100% var(--dz-cal-h) no-repeat; }
  .dz-calendario__celda--rango-inicio { background-size: 50% var(--dz-cal-h); background-position: right center; }
  .dz-calendario__celda--rango-fin { background-size: 50% var(--dz-cal-h); background-position: left center; }
  .dz-calendario__celda--rango-inicio.dz-calendario__celda--rango-fin { background: none; }
  .dz-calendario__celda--rango .dz-calendario__dia { border-radius: 0; }
  .dz-calendario__celda--rango-inicio .dz-calendario__dia { border-radius: var(--r-control) 0 0 var(--r-control); }
  .dz-calendario__celda--rango-fin .dz-calendario__dia { border-radius: 0 var(--r-control) var(--r-control) 0; }
  .dz-calendario__celda--rango-inicio.dz-calendario__celda--rango-fin .dz-calendario__dia { border-radius: var(--r-control); }
  .dz-calendario__celda--previa { --dz-cal-banda: var(--dz-cal-previa); }
  .dz-calendario__celda--previa-fin .dz-calendario__dia { border-color: var(--border-control); }
  .dz-calendario__celda--rango.dz-calendario__celda--fuera .dz-calendario__dia { color: var(--text-2); }
  @media (hover: hover) { .dz-calendario__celda--rango[aria-selected="false"] .dz-calendario__dia:hover:not(:disabled) { background: var(--surface-3); } }
  /* Con el dedo el día mide 44 de alto Y de ancho (7 columnas de --h-tactil más el aire de 1 px por lado). Si el contenedor no da ese ancho, la rejilla
     se desplaza sobre su eje en vez de encoger los botones; el relleno de --s-1 deja sitio al anillo de foco de la primera y la última columna. */
  @media (pointer: coarse) {
    .dz-calendario { --dz-cal-h: var(--h-tactil); --dz-cal-rejilla: calc((var(--h-tactil) + 2px) * 7); width: min(calc(var(--dz-cal-rejilla) + var(--s-1) * 2), 100%); padding-inline: var(--s-1); overflow-x: auto; scrollbar-width: none; }
    .dz-calendario::-webkit-scrollbar { display: none; }
    .dz-calendario__rejilla { min-width: var(--dz-cal-rejilla); }
    .dz-calendario__nav { width: var(--h-tactil); height: var(--h-tactil); }
  }
  @media (forced-colors: active) {
    .dz-calendario__celda[aria-selected="true"] .dz-calendario__dia { outline: 2px solid Highlight; }
    .dz-calendario__celda--hoy .dz-calendario__dia { outline: 1px solid CanvasText; }
    .dz-calendario__celda--rango { forced-color-adjust: none; background: Highlight; }
    .dz-calendario__celda--rango .dz-calendario__dia { color: HighlightText; }
    .dz-calendario__dia[data-n]::before { forced-color-adjust: none; background: GrayText; }
    .dz-calendario__dia[data-n]::after { forced-color-adjust: none; background: CanvasText; }
  }
}

/* Centro de avisos: la campana con su contador y el panel que abre. Secciones con cabecera (icono, título, cuenta) y filas (nombre, detalle);
   sin nada pendiente, «Todo al día». El contador es un número, nunca solo color. Es un popover con flechas. */
@layer dz.componentes {
  .dz-centro-avisos { position: relative; display: inline-block; vertical-align: middle; }
  .dz-centro-avisos__campana {
    position: relative;
    display: inline-grid;
    place-items: center;
    width: var(--dz-dens-barra, var(--h-barra));
    height: var(--dz-dens-barra, var(--h-barra));
    padding: 0;
    border: 1px solid var(--line-2);
    border-radius: var(--r-pill);
    background: var(--surface);
    color: var(--text);
    cursor: pointer;
  }
  .dz-centro-avisos__campana svg { width: var(--dz-dens-ico-solo, var(--ico-boton-solo)); height: var(--dz-dens-ico-solo, var(--ico-boton-solo)); }
  @media (hover: hover) { .dz-centro-avisos__campana:hover { background: var(--surface-2); } }
  .dz-centro-avisos__campana[data-ds-estado="hover"] { background: var(--surface-2); }
  .dz-centro-avisos__campana:focus-visible,
  .dz-centro-avisos__campana[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-centro-avisos__campana[aria-expanded="true"] { background: var(--sel-bg); color: var(--sel-text); border-color: transparent; }
  .dz-centro-avisos__n {
    position: absolute;
    top: calc(var(--s-1) * -1 - 2px);
    right: calc(var(--s-1) * -1 - 2px);
    min-width: calc(var(--contador) - 3px);
    height: calc(var(--contador) - 3px);
    padding: 0 var(--s-1);
    box-sizing: border-box;
    border-radius: var(--r-pill);
    background: var(--text-2);
    color: var(--bg);
    font-size: var(--fs-1);
    font-weight: 600;
    line-height: calc(var(--contador) - 3px);
    text-align: center;
    font-variant-numeric: tabular-nums;
  }
  .dz-centro-avisos__panel {
    position: absolute;
    top: calc(100% + var(--s-1) + 2px);
    right: 0;
    z-index: var(--z-dropdown);
    width: min(var(--w-avisos), calc(100vw - var(--s-4)));
    max-height: min(calc(var(--h-fila) * 13), calc(100dvh - var(--h-fila) * 2));
    overflow-y: auto;
    overscroll-behavior: contain;
    padding: var(--s-1) 0;
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-centro-avisos__panel[hidden] { display: none; }
  .dz-centro-avisos__panel[data-dz-saliendo] { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale); }
  .dz-centro-avisos__panel:focus-visible { outline: none; }
  .dz-centro-avisos--izquierda .dz-centro-avisos__panel { right: auto; left: 0; }
  .dz-centro-avisos__seccion + .dz-centro-avisos__seccion { margin-top: var(--s-2); padding-top: calc(var(--s-1) + 2px); border-top: 1px solid var(--hairline); }
  .dz-centro-avisos__cabecera,
  .dz-centro-avisos__fila { display: flex; align-items: center; gap: calc(var(--s-2) + 2px); box-sizing: border-box; color: var(--text); text-decoration: none; }
  .dz-centro-avisos__cabecera { padding: calc(var(--s-2) + 2px) calc(var(--s-3) + 2px) var(--s-1); font-size: var(--fs-3); font-weight: 500; }
  .dz-centro-avisos__fila { flex-wrap: wrap; justify-content: space-between; column-gap: calc(var(--s-2) + 2px); min-height: var(--h-tactil); padding: calc(var(--s-2) - 1px) calc(var(--s-3) + 2px) calc(var(--s-2) - 1px) calc(var(--s-7) + var(--s-2)); font-weight: 500; }
  @media (hover: hover) {
    .dz-centro-avisos__cabecera:hover,
    .dz-centro-avisos__fila:hover { background: var(--surface-2); color: var(--text); }
  }
  .dz-centro-avisos__cabecera:focus-visible,
  .dz-centro-avisos__fila:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-centro-avisos__ico { display: inline-grid; place-items: center; width: var(--ico-3); height: var(--ico-3); color: var(--text-2); }
  .dz-centro-avisos__ico svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-centro-avisos__cuenta { margin-left: auto; padding: 2px calc(var(--s-2) - 1px); border-radius: var(--r-pill); background: var(--surface-3); color: var(--text); font-family: var(--font-datos); font-size: var(--fs-1); font-weight: 400; line-height: 1; }
  .dz-centro-avisos__nombre { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-3); font-weight: 500; }
  .dz-centro-avisos__detalle { white-space: nowrap; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-centro-avisos__nota { margin: 0; padding: calc(var(--s-1) + 2px) calc(var(--s-3) + 2px) var(--s-2) calc(var(--s-7) + var(--s-2)); font-size: var(--fs-2); color: var(--text-muted); }
  .dz-centro-avisos__vacio { margin: 0; padding: var(--s-4) calc(var(--s-3) + 2px); font-size: var(--fs-3); line-height: 1.45; color: var(--text-2); }
  @media (pointer: coarse) {
    .dz-centro-avisos__campana { width: var(--h-tactil); height: var(--h-tactil); }
    .dz-centro-avisos__cabecera { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) { .dz-centro-avisos__panel { animation: none; } }
}

/* Paleta de comandos ⌘K: diálogo modal con un combobox cuya lista mezcla entidades, acciones y destinos. Escritorio (más de 560): caja de --w-comandos anclada
   arriba (--comandos-top), no al centro, porque la lista crece y encoge con cada tecla y una caja centrada saltaría. Por debajo de 560, o con puntero grueso, es una
   hoja a pantalla completa; la decide un container query y no un modificador, así la misma regla vale en la ventana y en un marco de 390. El campo no lleva anillo
   (decisión del 14-oct: es la única capa abierta y el caret basta); la fila activa lleva el fondo de selección y el aro interior --ring-inset del combobox, porque
   el foco real sigue en el campo (aria-activedescendant). Hairline translúcido además de la sombra. --muestra la pinta en su sitio para fichas y capturas. */
@layer dz.componentes {
  .dz-comandos {
    position: fixed;
    inset: 0;
    z-index: var(--z-hoja);
    container: dz-comandos / inline-size;
    display: block;
    font-family: var(--font);
    font-size: var(--fs-2);
    line-height: var(--lh-3);
    color: var(--text);
  }
  .dz-comandos[hidden] { display: none; }
  .dz-comandos__velo {
    position: absolute;
    inset: 0;
    background: color-mix(in oklch, var(--text) 45%, transparent);
    opacity: 1;
    transition: opacity var(--dur-2) var(--ease-out);
  }
  [data-ds-theme="dark"] .dz-comandos__velo { background: color-mix(in oklch, var(--bg) 70%, transparent); }
  .dz-comandos__caja {
    position: absolute;
    left: 50%;
    top: var(--comandos-top);
    transform: translateX(-50%);
    width: min(var(--w-comandos), calc(100% - var(--s-7)));
    max-height: var(--comandos-alto);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    background: var(--surface);
    color: var(--text);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    box-shadow: var(--shadow-md);
    transition: opacity var(--dur-2) var(--ease-out), transform var(--dur-2) var(--ease-out);
  }
  .dz-comandos__caja:focus-visible { outline: none; }
  @starting-style {
    .dz-comandos:not([hidden]) .dz-comandos__velo { opacity: 0; }
    .dz-comandos:not([hidden]) .dz-comandos__caja { opacity: 0; transform: translateX(-50%) translateY(var(--s-1)) scale(.98); }
  }
  .dz-comandos[data-dz-saliendo] .dz-comandos__velo { opacity: 0; transition-duration: var(--dur-1); }
  .dz-comandos[data-dz-saliendo] .dz-comandos__caja { opacity: 0; transition-duration: var(--dur-1); }

  /* Cabecera: lupa, campo sin anillo, esc y cierre. */
  .dz-comandos__cabecera {
    flex: none;
    display: flex;
    align-items: center;
    gap: var(--s-2);
    min-height: calc(var(--h-mov) + var(--s-1));
    padding: 0 var(--s-3) 0 var(--s-4);
    border-bottom: 1px solid var(--hairline);
    color: var(--text-muted);
  }
  .dz-comandos__cabecera:focus-within { color: var(--text); }
  .dz-comandos__lupa { flex: none; width: var(--ico-2); height: var(--ico-2); }
  /* El animation: none no es adorno: la regla global :focus-visible del DS anima box-shadow en cualquier elemento enfocado y, mientras corre, gana sobre box-shadow: none. */
  .dz-comandos__entrada,
  .dz-comandos__entrada:focus,
  .dz-comandos__entrada:focus-visible {
    flex: 1;
    min-width: 0;
    height: 100%;
    padding: 0;
    border: 0;
    outline: none;
    box-shadow: none;
    animation: none;
    background: transparent;
    color: var(--text);
    font: 400 var(--fs-4)/1.4 var(--font);
  }
  .dz-comandos__entrada::placeholder { color: var(--text-muted); opacity: 1; }
  .dz-comandos__cerrar { flex: none; margin-right: calc(var(--s-1) * -1); height: var(--dz-dens-btn-ico, var(--h-btn-ico)); width: var(--dz-dens-btn-ico, var(--h-btn-ico)); }
  .dz-comandos__cerrar svg { width: var(--dz-dens-ico-solo, var(--ico-boton-solo)); height: var(--dz-dens-ico-solo, var(--ico-boton-solo)); }
  .dz-comandos__cerrar:focus-visible,
  .dz-comandos__cerrar[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }

  /* Teclas: el átomo "kbd" (dz-kbd). */
  .dz-comandos__atajo { display: inline-flex; gap: 2px; flex: none; margin-left: auto; }
  .dz-comandos__atajo + .dz-comandos__atajo { margin-left: 0; }
  .dz-comandos__opcion:not([aria-selected="true"]) .dz-comandos__atajo--entrar { visibility: hidden; }

  /* Cuerpo: lo único que se desplaza. */
  .dz-comandos__cuerpo { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: var(--s-1) var(--s-1) var(--s-2); }
  .dz-comandos__lista { min-width: 0; }
  .dz-comandos__grupo + .dz-comandos__grupo { margin-top: var(--s-1); padding-top: var(--s-1); border-top: 1px solid var(--hairline); }
  .dz-comandos__grupo-titulo { display: flex; align-items: center; justify-content: space-between; padding: var(--s-2) var(--s-3) var(--s-1); font-size: var(--fs-1); font-weight: 500; color: var(--text-muted); }
  .dz-comandos__cuenta { font-variant-numeric: tabular-nums; }
  .dz-comandos__mas { padding: var(--s-1) var(--s-3) var(--s-2); font-size: var(--fs-1); color: var(--text-muted); }
  .dz-comandos__opcion {
    display: flex;
    align-items: center;
    gap: var(--s-3);
    min-height: var(--dz-dens-fila, var(--h-fila));
    padding: var(--s-1) var(--s-3);
    border-radius: var(--r-control);
    color: var(--text);
    cursor: pointer;
  }
  /* La activa es lo único que dice qué hará Enter: fondo de selección y aro interior en --focus (3:1 contra el panel). */
  .dz-comandos__opcion[aria-selected="true"] { background: var(--sel-bg); color: var(--sel-text); box-shadow: var(--ring-inset); }
  @media (hover: hover) { .dz-comandos__opcion:not([aria-selected="true"]):hover { background: var(--hover-bg); } }
  /* Ganchos de la ficha: congelan el hover de una fila y el foco del cierre, iguales a :hover y :focus-visible. En la aplicación el atributo no existe. */
  .dz-comandos__opcion[data-ds-estado="hover"]:not([aria-selected="true"]) { background: var(--hover-bg); }
  .dz-comandos__icono { flex: none; display: inline-grid; place-items: center; width: var(--avatar); height: var(--avatar); color: var(--text-2); }
  .dz-comandos__icono svg { width: var(--ico-2); height: var(--ico-2); }
  .dz-comandos__avatar {
    flex: none;
    display: inline-grid;
    place-items: center;
    width: var(--avatar);
    height: var(--avatar);
    border-radius: var(--r-pill);
    background: var(--surface-3);
    color: var(--text);
    font-size: var(--fs-1);
    font-weight: 600;
    letter-spacing: .02em;
  }
  .dz-comandos__texto { flex: 1 1 auto; min-width: 0; display: flex; align-items: baseline; gap: var(--s-2); }
  .dz-comandos__titulo { flex: none; max-width: 70%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
  .dz-comandos__detalle { flex: 1 1 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-1); color: var(--text-muted); }
  /* La coincidencia: peso y tinta plena, sin caja (Alex, 24-oct). */
  .dz-comandos mark { padding: 0; background: none; color: var(--text); font-weight: 600; }
  .dz-comandos__opcion--salida .dz-comandos__titulo { color: var(--accent-text); }
  .dz-comandos__opcion--salida[aria-selected="true"] .dz-comandos__titulo { color: var(--sel-text); }

  /* Notas, carga y error. */
  /* El aviso de cero resultados lleva el mismo relleno interno que la lista (--s-3 por los cuatro lados): antes el de abajo era --s-2 y el aviso se leía más pegado a su borde que las filas. */
  .dz-comandos__nota { margin: 0; padding: var(--s-3); color: var(--text-2); overflow-wrap: anywhere; }
  .dz-comandos__nota[hidden] { display: none; }
  .dz-comandos__nota--aprox { padding-bottom: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-comandos__cargando { display: grid; gap: var(--s-1); padding: var(--s-1) 0; }
  .dz-comandos__cargando[hidden] { display: none; }
  .dz-comandos__cargando-fila { display: flex; align-items: center; gap: var(--s-3); min-height: var(--dz-dens-fila, var(--h-fila)); padding: var(--s-1) var(--s-3); }
  .dz-comandos__cargando-fila > div { flex: 1; display: grid; gap: var(--s-2); }
  .dz-comandos__cargando-fila .dz-esqueleto--linea { height: var(--s-2); }
  .dz-comandos__error { display: flex; align-items: center; gap: var(--s-3); margin: var(--s-2) var(--s-3); padding: var(--s-3); border-radius: var(--r-control); background: var(--warn-soft); color: var(--warn-text); }
  .dz-comandos__error[hidden] { display: none; }
  .dz-comandos__error svg { flex: none; width: var(--ico-2); height: var(--ico-2); }

  /* Pie: solo para quien tiene teclado. */
  .dz-comandos__pie { flex: none; display: flex; flex-wrap: wrap; gap: var(--s-4); padding: var(--s-2) var(--s-4); border-top: 1px solid var(--hairline); font-size: var(--fs-1); color: var(--text-muted); }
  .dz-comandos__pie span { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-comandos__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-comandos__molde { display: none; }

  /* En su sitio (ficha o captura): la raíz ocupa su lugar en el flujo con el alto de una paleta abierta y el velo la tiñe. */
  .dz-comandos--muestra {
    position: relative;
    inset: auto;
    z-index: auto;
    height: calc(var(--comandos-alto) + var(--s-5) * 2);
    border-radius: var(--r-card);
    overflow: hidden;
  }
  .dz-comandos--muestra .dz-comandos__velo,
  .dz-comandos--muestra .dz-comandos__caja { transition: none; }
  @container dz-comandos (min-width: 561px) { .dz-comandos--muestra .dz-comandos__caja { top: var(--s-5); } }

  /* Hoja a pantalla completa: por debajo de 560 (corte móvil). Container query para que la misma regla valga en un marco de 390. */
  @container dz-comandos (max-width: 560px) {
    .dz-comandos__caja { left: 0; top: 0; transform: none; width: 100%; height: 100%; max-height: none; border-radius: 0; border: 0; box-shadow: none; }
    .dz-comandos__cabecera { min-height: calc(var(--h-mov) + var(--s-2)); padding: env(safe-area-inset-top) var(--s-3) 0 var(--s-4); }
    .dz-comandos .dz-comandos__kbd--esc, .dz-comandos__pie, .dz-comandos__atajo { display: none; }
    .dz-comandos__cerrar { width: var(--h-tactil); height: var(--h-tactil); margin-right: calc(var(--s-2) * -1); }
    .dz-comandos__opcion { min-height: var(--h-tactil); }
    .dz-comandos__texto { flex-direction: column; align-items: flex-start; gap: 1px; }
    .dz-comandos__titulo, .dz-comandos__detalle { max-width: 100%; flex: none; width: 100%; }
    .dz-comandos__cuerpo { padding-bottom: calc(var(--s-2) + env(safe-area-inset-bottom)); }
    @starting-style { .dz-comandos:not([hidden]) .dz-comandos__caja { transform: translateY(var(--s-3)); } }
  }
  @media (pointer: coarse) {
    .dz-comandos__opcion { min-height: var(--h-tactil); }
    .dz-comandos__cerrar { width: var(--h-tactil); height: var(--h-tactil); }
    .dz-comandos .dz-comandos__kbd--esc { display: none; }
    .dz-comandos__entrada, .dz-comandos__entrada:focus { font-size: var(--fs-4); }
  }
  @media (prefers-reduced-motion: reduce) { .dz-comandos__velo, .dz-comandos__caja { transition: none; } }
  @media (prefers-contrast: more) { .dz-comandos__opcion[aria-selected="true"] { box-shadow: none; outline: 2px solid var(--text); outline-offset: -2px; } }
  @media (forced-colors: active) {
    .dz-comandos__opcion[aria-selected="true"] { outline: 2px solid Highlight; outline-offset: -2px; }
    .dz-comandos mark { forced-color-adjust: none; background: Mark; color: MarkText; }
  }
}

/* Confirmación: un modal de 440 con una pregunta. Título con verbo, cosa y número; una frase de consecuencia; alcance, aviso y, si es
   destructiva, motivo obligatorio. El primario de una destructiva va macizo en el color de peligro. Sin rótulos de «Qué pasa / Qué no». */
@layer dz.componentes {
  .dz-confirmacion .dz-modal__cabecera { margin-bottom: var(--s-2); }
  .dz-confirmacion .dz-modal__titulo { overflow-wrap: anywhere; text-wrap: balance; }
  .dz-confirmacion .dz-modal__acciones { margin-top: var(--s-6); }
  .dz-confirmacion__frase { margin: 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); }
  .dz-confirmacion__alcance { display: grid; gap: var(--s-2); margin: var(--s-4) 0 0; padding: var(--s-3) var(--s-4); border: 1px solid var(--border); border-radius: var(--r-control); background: var(--surface-anidada); }
  .dz-confirmacion__nombres { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text); }
  .dz-confirmacion__fuera { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-confirmacion__cuerpo { display: grid; gap: var(--s-3); margin: var(--s-4) 0 0; font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-confirmacion__aviso { margin: var(--s-3) 0 0; padding: var(--s-2) var(--s-3); border: 1px solid var(--warn); border-radius: var(--r-control); color: var(--warn-text); font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-confirmacion__motivo { margin: var(--s-4) 0 0; }
  .dz-confirmacion--destructiva .dz-confirmacion__si { background: var(--bad); border-color: var(--bad); color: var(--ink-on-bad); font-weight: 500; }
  @media (hover: hover) {
    .dz-confirmacion--destructiva .dz-confirmacion__si:hover:not(:disabled):not([aria-disabled="true"]) { background: var(--bad); border-color: var(--bad); color: var(--ink-on-bad); filter: brightness(.92); }
  }
  .dz-confirmacion__si[aria-busy="true"] { cursor: progress; }
}

/* Constructor de grupos Y/O (la hoja «Filtros avanzados»): cada grupo es una tarjeta con su conjunción a la vista; el grupo anidado se distingue por su fondo.
   Entre condición y condición, una línea con «y» u «o» (decorativa: el control segmentado ya lo dijo). */
@layer dz.componentes {
  .dz-constructor { display: grid; gap: var(--s-3); }
  .dz-constructor__grupo { display: grid; gap: var(--s-3); padding: var(--s-3) var(--s-4); border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--surface-anidada); }
  .dz-constructor__grupo--anidado { background: var(--surface); }
  .dz-constructor__cabecera { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-constructor__cabecera > .dz-boton { margin-left: auto; }
  .dz-constructor__rotulo { font-size: var(--fs-2); color: var(--text-2); }
  .dz-constructor__condiciones { display: grid; gap: var(--s-2); margin: 0; padding: 0; list-style: none; }
  .dz-constructor__conjuncion { display: flex; align-items: center; gap: var(--s-2); margin: calc(var(--s-1) * -1) 0; font-size: var(--fs-1); font-weight: 600; letter-spacing: .05em; text-transform: uppercase; color: var(--text-muted); }
  .dz-constructor__conjuncion::before, .dz-constructor__conjuncion::after { content: ""; flex: 1; height: 1px; background: var(--line-2); }
  .dz-constructor__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-constructor__resumen { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-constructor__resumen b { font-weight: 600; color: var(--text); }
}

/* Desenlace de la llamada: el mismo panel de 380 px de la llamada, ya colgada. Estado «Terminada» y duración, quién era, la pregunta, la nota, lo probable en opciones grandes
   (icono, lo que pasa después y su tecla), lo demás plegado y «Después» al pie. Las teclas se ven con el ratón y se ocultan con el dedo, que no tiene teclado. */
@layer dz.componentes {
  .dz-desenlace-llamada {
    display: flex;
    flex-direction: column;
    box-sizing: border-box;
    width: var(--w-telefono);
    max-width: calc(100vw - var(--s-4) * 2);
    overflow: hidden;
    border: 1px solid var(--hairline);
    border-radius: var(--r-4);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
  }
  .dz-desenlace-llamada__cabecera { padding: var(--s-4) var(--s-3) var(--s-2) var(--s-5); }
  .dz-desenlace-llamada__cabecera .dz-linea-estado__linea { gap: var(--s-3); font-size: var(--fs-3); }
  .dz-desenlace-llamada__duracion {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--h-btn-ico);
    padding: 0 var(--s-3);
    box-sizing: border-box;
    border: 1px solid var(--hairline);
    border-radius: var(--r-pill);
    background: var(--surface-2);
    color: var(--text-2);
    font-size: var(--fs-2);
    font-weight: 500;
    line-height: 1;
    font-variant-numeric: tabular-nums;
  }
  .dz-desenlace-llamada__duracion svg { width: var(--ico-1); height: var(--ico-1); flex: none; color: var(--text-muted); }
  .dz-desenlace-llamada__quien { display: flex; align-items: center; gap: var(--s-4); padding: var(--s-2) var(--s-5) var(--s-4); border-bottom: 1px solid var(--hairline); }
  .dz-desenlace-llamada__datos { flex: 1 1 auto; display: grid; gap: var(--s-1); min-width: 0; }
  .dz-desenlace-llamada__nombre { margin: 0; font-size: var(--fs-4); font-weight: 600; letter-spacing: -.01em; line-height: var(--lh-2); overflow-wrap: anywhere; }
  .dz-desenlace-llamada__empresa { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-desenlace-llamada__telefono { margin: 0; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
  .dz-desenlace-llamada__etapa { flex: 0 100 auto; min-width: 0; }
  .dz-desenlace-llamada__hoja { display: grid; gap: var(--s-3); padding: var(--s-4) var(--s-4) 0; }
  .dz-desenlace-llamada__encabezado { display: flex; align-items: baseline; justify-content: space-between; flex-wrap: wrap; gap: var(--s-1) var(--s-3); }
  .dz-desenlace-llamada__titulo { margin: 0; font-size: var(--fs-5); font-weight: 600; letter-spacing: -.01em; }
  .dz-desenlace-llamada__pista { display: inline-flex; align-items: center; gap: var(--s-2); font-size: var(--fs-1); color: var(--text-2); }
  .dz-desenlace-llamada__pista::before { content: ""; width: var(--punto-chip); height: var(--punto-chip); flex: none; border-radius: 50%; background: var(--ok); }
  .dz-desenlace-llamada__pista--aviso::before { background: var(--warn); }
  .dz-desenlace-llamada__nota {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--line-2);
    border-radius: var(--r-3);
    background: var(--surface-2);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  .dz-desenlace-llamada__nota:focus-within { border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-desenlace-llamada__nota-rotulo { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-3) var(--s-3) 0; font-size: var(--fs-1); font-weight: 500; color: var(--text-muted); cursor: text; }
  .dz-desenlace-llamada__nota-rotulo svg { width: var(--ico-1); height: var(--ico-1); flex: none; }
  .dz-desenlace-llamada__nota-texto,
  .dz-desenlace-llamada__nota-texto:focus,
  .dz-desenlace-llamada__nota-texto:focus-visible {
    display: block;
    width: 100%;
    min-height: var(--h-boton-llamada);
    box-sizing: border-box;
    padding: var(--s-1) var(--s-3) var(--s-3);
    border: 0;
    border-radius: 0;
    outline: none;
    box-shadow: none;
    animation: none;
    resize: none;
    background: transparent;
    color: var(--text);
    font-family: var(--font);
    font-size: var(--fs-2);
    line-height: var(--lh-3);
  }
  .dz-desenlace-llamada__nota-texto::placeholder { color: var(--text-muted); }
  .dz-desenlace-llamada__opciones, .dz-desenlace-llamada__otras { display: grid; gap: var(--s-3); }
  .dz-desenlace-llamada__otras { gap: var(--s-2); padding: var(--s-1) 0; }
  .dz-desenlace-llamada__otras[hidden] { display: none; }
  .dz-desenlace-llamada__opcion {
    display: flex;
    align-items: center;
    gap: var(--s-3);
    box-sizing: border-box;
    width: 100%;
    min-height: calc(var(--h-boton-llamada) + var(--s-3));
    padding: var(--s-3);
    border: 1px solid var(--line-2);
    border-radius: var(--r-3);
    background: var(--surface-2);
    color: var(--text);
    font-family: inherit;
    text-align: left;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) { .dz-desenlace-llamada__opcion:hover { background: var(--surface-3); } }
  .dz-desenlace-llamada__opcion:focus-visible, .dz-desenlace-llamada__otro:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-desenlace-llamada__opcion--chica { min-height: var(--h-fila-2); padding: var(--s-2) var(--s-3); }
  .dz-desenlace-llamada__icono { display: grid; place-items: center; width: var(--h-fila); height: var(--h-fila); flex: none; border-radius: var(--r-control); background: var(--surface-3); color: var(--text-2); }
  .dz-desenlace-llamada__opcion--chica .dz-desenlace-llamada__icono { width: var(--h-btn-ico); height: var(--h-btn-ico); }
  .dz-desenlace-llamada__icono svg { width: var(--ico-3); height: var(--ico-3); }
  .dz-desenlace-llamada__opcion--chica .dz-desenlace-llamada__icono svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-desenlace-llamada__texto { flex: 1 1 auto; min-width: 0; }
  .dz-desenlace-llamada__texto b { display: block; font-size: var(--fs-3); font-weight: 600; line-height: var(--lh-2); }
  .dz-desenlace-llamada__texto span { display: block; margin-top: var(--s-1); font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-desenlace-llamada__otro {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-2);
    width: 100%;
    min-height: var(--h-tactil);
    padding: 0 var(--s-1);
    border: 0;
    border-radius: var(--r-3);
    background: none;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    cursor: pointer;
  }
  .dz-desenlace-llamada__otro-texto { display: inline-flex; align-items: center; gap: var(--s-2); }
  .dz-desenlace-llamada__otro svg { width: var(--ico-1); height: var(--ico-1); color: var(--text-muted); transition: transform var(--dur-1) var(--ease-out); }
  .dz-desenlace-llamada__otro[aria-expanded="true"] svg { transform: rotate(180deg); }
  .dz-desenlace-llamada__pie { display: flex; justify-content: center; padding-bottom: var(--s-4); }
  .dz-desenlace-llamada .dz-desenlace-llamada__despues { gap: var(--s-2); height: var(--h-tactil); color: var(--text-2); }
  .dz-desenlace-llamada__tecla { flex: none; }
  /* Con el dedo no hay teclado: las teclas no enseñan nada y se quitan. */
  @media (pointer: coarse), (hover: none) { .dz-desenlace-llamada__tecla { display: none; } }
  @media (prefers-reduced-motion: reduce) { .dz-desenlace-llamada__nota, .dz-desenlace-llamada__opcion, .dz-desenlace-llamada__otro svg { transition: none; } }
}

/* El toque en dos mitades (Enfoque): el avance del día, la banda de identidad (quién es y, a su derecha, lo que se le dijo), el guion de hoy, las dos mitades del toque y la fila del
   lead. El layout sale del ancho de la propia pieza (container query) y no de la ventana: a 1100 px o más la banda tiene dos columnas; a 820 px o menos es el teléfono. Allí la banda
   se disuelve (display: contents) para que su tira (rótulo, nombre, meta, guion y el control Hacer o Saber) se pegue bajo la barra a lo largo de las dos vistas: Hacer son las
   dos mitades, la pendiente primero; Saber es lo que se le dijo. El guion está dos veces en el marcado (la fila de escritorio y la caja de la tira) y el CSS deja visible una sola. */
@layer dz.componentes {
  .dz-enfoque-toque { display: grid; gap: var(--s-5); width: 100%; max-width: var(--w-enfoque); margin-inline: auto; container: dz-enfoque-toque / inline-size; }
  .dz-enfoque-toque__rejilla { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-5); align-items: start; }

  /* El avance del día y quién sigue. */
  .dz-enfoque-toque__avance { display: flex; align-items: center; gap: var(--s-2) var(--s-4); min-width: 0; }
  .dz-enfoque-toque__avance-texto { font-size: var(--fs-2); color: var(--text-2); white-space: nowrap; }
  .dz-enfoque-toque__barra {
    -webkit-appearance: none;
    appearance: none;
    flex: 0 1 var(--w-celda);
    min-width: calc(var(--w-celda) / 2);
    height: var(--s-1);
    border: 0;
    border-radius: var(--r-pill);
    background: var(--surface-3);
    color: var(--accent-control);
    overflow: hidden;
  }
  .dz-enfoque-toque__barra::-webkit-progress-bar { background: transparent; border-radius: var(--r-pill); }
  .dz-enfoque-toque__barra::-webkit-progress-value { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-enfoque-toque__barra::-moz-progress-bar { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-enfoque-toque__siguiente { display: inline-flex; align-items: center; justify-content: flex-end; gap: var(--s-3); flex: 1 1 0; margin-left: auto; min-width: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-enfoque-toque__siguiente-texto { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* La banda: una tarjeta con quién es y, a su derecha, lo que se le dijo y las señales. */
  .dz-enfoque-toque__banda { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-5) var(--s-7); padding: var(--s-6) var(--s-7); }
  .dz-enfoque-toque__identidad { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
  .dz-enfoque-toque__tira { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
  .dz-enfoque-toque__nombre { margin: 0; font-size: var(--fs-7); font-weight: 600; letter-spacing: -.01em; line-height: 1.15; overflow-wrap: anywhere; }
  .dz-enfoque-toque__nombre a { color: inherit; text-decoration: none; }
  @media (hover: hover) { .dz-enfoque-toque__nombre a:hover { color: var(--accent-text); } }
  .dz-enfoque-toque__nombre a:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--r-1); }
  .dz-enfoque-toque__meta { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-enfoque-toque__controles { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-1) var(--s-5); min-height: var(--h-tactil); }
  .dz-enfoque-toque__dichos { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; padding-top: var(--s-5); border-top: 1px solid var(--hairline); }
  .dz-enfoque-toque__dicho { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
  .dz-enfoque-toque__dicho-texto { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); text-wrap: pretty; }

  /* El guion de hoy, en su fila: «Qué decir hoy» en grande y su procedencia a la derecha. La copia de la tira es del teléfono. */
  .dz-enfoque-toque__guion--fila { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "r p" "t p"; align-items: center; gap: var(--s-1) var(--s-7); padding: var(--s-5) var(--s-7); }
  .dz-enfoque-toque__guion--fila .dz-enfoque-toque__guion-rotulo { grid-area: r; }
  .dz-enfoque-toque__guion--fila .dz-enfoque-toque__guion-texto { grid-area: t; }
  .dz-enfoque-toque__guion--fila .dz-enfoque-toque__guion-procedencia { grid-area: p; align-self: center; }
  .dz-enfoque-toque__guion { min-width: 0; }
  .dz-enfoque-toque__rotulo { overflow-wrap: anywhere; }
  .dz-enfoque-toque__guion-texto { margin: 0; font-size: var(--fs-5); font-weight: 500; line-height: 1.4; color: var(--text); text-wrap: pretty; }
  .dz-enfoque-toque__guion--viejo .dz-enfoque-toque__guion-texto { color: var(--text-2); }
  .dz-enfoque-toque__guion-procedencia { display: inline-flex; align-items: center; gap: var(--s-3); font-size: var(--fs-2); color: var(--text-muted); white-space: nowrap; }
  .dz-enfoque-toque__guion--movil, .dz-enfoque-toque__ver { display: none; }

  /* Las dos mitades, la llamada a la izquierda y el WhatsApp a la derecha. */
  .dz-enfoque-toque__mitades { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-5); align-items: stretch; }
  .dz-enfoque-toque__mitad { min-width: 0; }

  /* La fila del lead: etapa y salidas a la derecha. */
  .dz-enfoque-toque__fila { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--s-1) var(--s-5); padding: var(--s-3) var(--s-7); }
  .dz-enfoque-toque__fila-lead { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2) var(--s-3); min-width: 0; }
  .dz-enfoque-toque__salidas { display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; gap: 0 var(--s-5); margin-left: auto; }
  .dz-enfoque-toque__salidas .dz-enlace { display: inline-flex; align-items: center; min-height: var(--h-tactil); font-size: var(--fs-2); font-weight: 500; }

  /* Banda de dos columnas desde 1100 px: identidad a la izquierda, lo que se le dijo y las señales a la derecha. */
  @container dz-enfoque-toque (min-width: 1100px) {
    .dz-enfoque-toque__banda { grid-template-columns: minmax(0, 1fr) minmax(calc(var(--w-celda) + var(--s-8) + var(--s-6)), 42%); }
    .dz-enfoque-toque--sin-dichos .dz-enfoque-toque__banda { grid-template-columns: minmax(0, 1fr); }
    .dz-enfoque-toque__dichos { padding: 0 0 0 var(--s-7); border-top: 0; border-left: 1px solid var(--hairline); }
  }

  /* El teléfono (820 px o menos): Hacer y Saber. */
  @container dz-enfoque-toque (max-width: 820px) {
    .dz-enfoque-toque__rejilla { display: flex; flex-direction: column; gap: 0; }
    .dz-enfoque-toque__avance { flex-wrap: wrap; margin-bottom: var(--s-3); }
    .dz-enfoque-toque__avance-texto { white-space: normal; }
    .dz-enfoque-toque__barra { flex: 1 1 100%; }
    .dz-enfoque-toque__siguiente { display: none; }
    .dz-enfoque-toque__banda, .dz-enfoque-toque__identidad { display: contents; }
    .dz-enfoque-toque__guion--fila { display: none; }
    .dz-enfoque-toque__guion--movil, .dz-enfoque-toque__ver { display: grid; }
    .dz-enfoque-toque__tira { position: sticky; top: calc(var(--cascaron-top) + env(safe-area-inset-top)); z-index: var(--z-sticky); margin: 0 calc(var(--s-4) * -1); padding: var(--s-3) var(--s-4); gap: var(--s-1); background: var(--bg); border-bottom: 1px solid var(--border); }
    .dz-enfoque-toque__nombre { font-size: var(--fs-5); font-weight: 500; }
    .dz-enfoque-toque__meta { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
    .dz-enfoque-toque__guion--movil { grid-template-columns: minmax(0, 1fr); gap: var(--s-1); margin-top: var(--s-3); padding: var(--s-3); border: 1px solid var(--border); border-radius: var(--r-control); background: var(--surface-anidada); }
    .dz-enfoque-toque__guion--movil .dz-enfoque-toque__guion-rotulo { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-enfoque-toque__guion--movil .dz-enfoque-toque__guion-texto { font-size: var(--fs-4); font-weight: 450; }
    .dz-enfoque-toque__guion--movil .dz-enfoque-toque__guion-procedencia { font-size: var(--fs-1); }
    /* Hacer o Saber: un control de dos opciones en píldora, con radios nativos invisibles encima de cada opción. */
    .dz-enfoque-toque__ver { grid-template-columns: 1fr 1fr; gap: var(--s-1); min-width: 0; margin: var(--s-3) 0 0; padding: 3px; border: 0; border-radius: var(--r-pill); background: var(--surface-2); }
    .dz-enfoque-toque__ver-leyenda { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-enfoque-toque__ver-opcion { position: relative; display: flex; align-items: center; justify-content: center; height: max(var(--h-tactil), var(--h-control)); border-radius: var(--r-pill); font-size: var(--fs-2); font-weight: 500; color: var(--text-2); cursor: pointer; }
    .dz-enfoque-toque__ver-opcion input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: pointer; }
    .dz-enfoque-toque__ver-opcion:has(input:checked) { background: var(--surface); color: var(--text); box-shadow: 0 0 0 1px var(--border-control); }
    .dz-enfoque-toque__ver-opcion:has(input:focus-visible) { box-shadow: var(--ring); }
    .dz-enfoque-toque__controles { padding-top: var(--s-3); gap: 0 var(--s-4); }
    .dz-enfoque-toque__dichos { padding: var(--s-4) 0 0; border: 0; gap: var(--s-4); }
    .dz-enfoque-toque__mitades { display: flex; flex-direction: column; gap: var(--s-3); padding-top: var(--s-4); }
    .dz-enfoque-toque__mitades > .dz-toque-mitad--ahora { order: -1; }
    .dz-enfoque-toque__fila { flex-direction: column; align-items: stretch; padding: var(--s-3) var(--s-4); margin-top: var(--s-3); }
    .dz-enfoque-toque__salidas { justify-content: flex-start; margin: 0; }
    .dz-enfoque-toque:has([data-dz-ver="saber"]:checked) :is(.dz-enfoque-toque__controles, .dz-enfoque-toque__mitades, .dz-enfoque-toque__fila) { display: none; }
    .dz-enfoque-toque:has([data-dz-ver="hacer"]:checked) .dz-enfoque-toque__dichos { display: none; }
    .dz-enfoque-toque:not(:has(.dz-enfoque-toque__ver)) .dz-enfoque-toque__dichos { display: none; }
  }
  @media (forced-colors: active) { .dz-enfoque-toque__ver-opcion:has(input:checked) { border: 2px solid Highlight; } }
}

/* Exportador de leads: el cuerpo de una hoja (qué leads, qué columnas, qué formato y el aviso de datos personales), los toasts de sus salidas y la
   lista de Exportaciones. La raíz no pinta nada (display: contents): la hoja es la capa fija y los toasts los apila el comportamiento del toast. Foco
   y hairline vienen de la hoja, la casilla y el campo; aquí viven el sangrado de lo que cuelga de una opción (filtros y motivo bajo su radio), la
   rejilla de dos columnas de las casillas (una a 560 px) y el pie fijo de la hoja con los dos botones a 44 px con dedo. */
@layer dz.componentes {
  .dz-exportador { display: contents; }
  /* El espécimen estático de la hoja muestra todo el cuerpo: la altura de muestra de la hoja (9 filas) lo cortaría. */
  .dz-exportador .dz-hoja--muestra .dz-hoja__panel { height: auto; }
  .dz-exportador__que,
  .dz-exportador__columnas { display: grid; gap: var(--s-2); min-width: 0; margin: 0; padding: 0; border: 0; }
  .dz-exportador__que .dz-casilla,
  .dz-exportador__casillas .dz-casilla { align-items: start; }
  .dz-exportador__legend { display: flex; justify-content: space-between; gap: var(--s-3); float: left; width: 100%; padding: 0; margin: 0 0 var(--s-1); font-size: var(--fs-3); font-weight: 600; color: var(--text); }
  .dz-exportador__filtros { display: flex; flex-wrap: wrap; gap: var(--s-1); padding: 0 0 var(--s-2) calc(var(--h-control-sm) - var(--s-1)); }
  .dz-exportador__motivo { padding-left: calc(var(--h-control-sm) - var(--s-1)); }
  .dz-exportador__motivo[hidden] { display: none; }
  .dz-exportador__cuenta { font-weight: 500; font-variant-numeric: tabular-nums; color: var(--text-muted); }
  .dz-exportador__atajos { display: flex; flex-wrap: wrap; gap: var(--s-1); margin: calc(var(--s-1) * -1) 0 var(--s-1); }
  .dz-exportador__sin-columnas { margin: 0; font-size: var(--fs-2); color: var(--bad-text); }
  .dz-exportador__sin-columnas[hidden] { display: none; }
  .dz-exportador__grupo { display: grid; gap: var(--s-1); padding-top: var(--s-2); border-top: 1px solid var(--border); }
  .dz-exportador__grupo-t { margin: 0; font-size: var(--fs-1); font-weight: 500; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
  .dz-exportador__casillas { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 var(--s-3); }
  .dz-exportador__formato { display: grid; gap: var(--s-2); }
  .dz-exportador__formato > .dz-exportador__legend { float: none; }
  .dz-exportador__nota { margin: 0; font-size: var(--fs-1); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-exportador__exportaciones { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-exportador__exportaciones > .dz-exportador__legend { float: none; font-size: var(--fs-4); }
  .dz-exportador__tabla[hidden],
  .dz-exportador__molde[hidden],
  .dz-exportador__exportaciones [hidden] { display: none; }
  .dz-exportador__archivo { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-exportador__vencido { font-size: var(--fs-1); color: var(--text-muted); }
  .dz-exportador__lista-tabla .dz-tabla__celda { vertical-align: middle; }
  @media (max-width: 560px) {
    .dz-exportador__casillas { grid-template-columns: minmax(0, 1fr); }
    .dz-exportador .dz-hoja__pie .dz-boton { flex: 1 1 0; min-height: var(--h-tactil); }
    .dz-exportador__atajos .dz-boton { min-height: var(--h-tactil); }
  }
}

/* Filtros avanzados: la tira de vistas, la fila de filtros y el resultado, en columna con --s-3 entre ellos. Lo demás es de las piezas que compone
   (vistas, filtro, facetas, condicion, constructor, filtros, popover, hoja). */
@layer dz.componentes {
  .dz-filtros-avanzados { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-filtros-avanzados__fila { align-items: center; }
  /* El aviso de error y el vacío sin filas se muestran cuando hace falta (hidden los esconde); van pegados a la lista, no a la fila. */
  .dz-filtros-avanzados__error { min-width: 0; }
  .dz-filtros-avanzados__cero { min-width: 0; padding: var(--s-5) 0; }
  .dz-filtros-avanzados__error[hidden], .dz-filtros-avanzados__cero[hidden] { display: none; }
  .dz-filtros-avanzados__resultado { min-width: 0; }
  /* Mientras cargan los conteos la cuenta espera, sin congelar la lista (PCB-323). */
  .dz-filtros-avanzados[aria-busy="true"] .dz-filtros__cuenta b { color: transparent; background: var(--surface-3); border-radius: var(--r-1); }
  .dz-filtros-avanzados__resultado:empty { display: none; }
  @media (max-width: 560px) {
    .dz-filtros-avanzados__fila .dz-filtros__acciones { flex: 1 1 100%; justify-content: space-between; }
  }
}

/* Gráfica (organismo): línea para el tiempo, barras para comparar, embudo para la conversión por etapa. Solo tokens.
   Color de datos: --dato-1 (trazo y punto de la serie principal), --dato-2 (comparación punteada), --dato-relleno (barra y pista del embudo, el gris
   de control: el color solo dice un estado) y --dato-relleno-2 (segundo segmento apilado, que pasa 3:1 contra la superficie y contra --dato-1 en claro
   y oscuro). Guías en --border y eje en --line-2: no son dato. Un solo corte de contenedor, el del sistema (560). */
@layer dz.componentes {
  .dz-grafica {
    container: dz-grafica / inline-size;
    display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; margin: 0;
    color: var(--text); font-family: var(--font);
  }
  .dz-grafica--linea { gap: var(--s-3); }
  .dz-grafica--barras, .dz-grafica--embudo, .dz-grafica--meta, .dz-grafica--calor { gap: var(--s-4); }
  .dz-grafica__cabecera { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; }
  .dz-grafica__titulo { margin: 0; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.012em; text-wrap: pretty; }
  .dz-grafica__conclusion { margin: 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-wrap: pretty; }
  .dz-grafica__meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin: 0; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-grafica__aviso[data-tono="aviso"] { color: var(--warn-text); }
  .dz-grafica__pie { margin: 0; font-size: var(--fs-1); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-grafica__sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

  /* Lienzo: el par ancha/corta de la línea y el contenedor que elige (DCB-226, DCB-258). La corta corre entre 280 y 340 px (escala 1 a 1.21);
     la ancha, de 560 a 700 (1 a 1.25): el texto de 12 px nunca baja de 12 px efectivos. */
  .dz-grafica__lienzo { position: relative; min-width: 0; }
  .dz-grafica__lienzo--linea, .dz-grafica__lienzo--error { overflow: visible; }
  .dz-grafica__svg { display: block; width: 100%; height: auto; overflow: visible; }
  .dz-grafica__svg--ancha { max-width: calc(var(--s-8) * 14.5); }
  .dz-grafica__svg--corta { min-width: calc(var(--s-2) * 35); max-width: calc(var(--s-8) * 7); }
  @container dz-grafica (min-width: 561px) { .dz-grafica__svg--corta { display: none; } }
  @container dz-grafica (max-width: 560px) { .dz-grafica__svg--ancha { display: none; } }
  .dz-grafica text { font-size: var(--fs-1); font-family: var(--font); font-variant-numeric: tabular-nums; }
  .dz-grafica__tick { fill: var(--text-2); }
  /* La unidad del eje Y, sobre el tope del eje: apagada, es contexto y no dato. */
  .dz-grafica__unidad { fill: var(--text-muted); }
  .dz-grafica__etiqueta { pointer-events: none; }
  .dz-grafica__etiqueta--fuerte text { fill: var(--text); font-weight: 500; }
  .dz-grafica__etiqueta-valor { fill: var(--text-2); }
  .dz-grafica__etiqueta-valor { font-weight: 500; }
  .dz-grafica__etiqueta--fuerte .dz-grafica__etiqueta-valor { font-weight: 600; }
  .dz-grafica__guia { stroke: var(--border); stroke-width: 1; fill: none; }
  .dz-grafica__eje { stroke: var(--line-2); stroke-width: 1; fill: none; }
  .dz-grafica__serie { stroke: var(--dato-1); stroke-width: 2; fill: none; stroke-linejoin: round; stroke-linecap: round; }
  .dz-grafica__serie--comparacion { stroke: var(--dato-2); stroke-dasharray: 5 4; }
  /* Marcas: la zona de toque abarca toda la altura (un solo blanco, el más cercano en x); el punto, el cursor y el aro salen con hover,
     foco o fijado. El último punto siempre se ve: es el que lleva la etiqueta directa. */
  .dz-grafica__marca { outline: none; cursor: default; }
  .dz-grafica__zona { fill: transparent; }
  /* En toque la línea se recorre con el dedo: el movimiento horizontal es de la gráfica (elige la marca más cercana al dedo) y el vertical sigue siendo de la página. */
  .dz-grafica__svg { touch-action: pan-y; }
  /* Un día sin registro: banda tenue sobre el hueco y su leyenda (la línea se corta; la banda dice por qué). */
  .dz-grafica__hueco { fill: var(--dato-banda); }
  .dz-grafica__hueco-texto { fill: var(--text-muted); }
  .dz-grafica__cursor { stroke: var(--line-2); stroke-width: 1; fill: none; opacity: 0; transition: opacity var(--dur-1) var(--ease-out); }
  .dz-grafica__punto { fill: var(--dato-1); stroke: var(--surface); stroke-width: 2; opacity: 0; transition: opacity var(--dur-1) var(--ease-out); }
  .dz-grafica__aro { fill: none; stroke: transparent; stroke-width: 1.5; }
  .dz-grafica__marca--ultimo .dz-grafica__punto,
  .dz-grafica__marca[data-activa] .dz-grafica__punto,
  .dz-grafica__marca[data-fijado] .dz-grafica__punto,
  .dz-grafica__marca[data-ds-estado="hover"] .dz-grafica__punto,
  .dz-grafica__marca[data-ds-estado="foco"] .dz-grafica__punto,
  .dz-grafica__marca:focus-visible .dz-grafica__punto { opacity: 1; }
  .dz-grafica__marca[data-activa] .dz-grafica__cursor,
  .dz-grafica__marca[data-fijado] .dz-grafica__cursor,
  .dz-grafica__marca[data-ds-estado="hover"] .dz-grafica__cursor,
  .dz-grafica__marca[data-ds-estado="foco"] .dz-grafica__cursor,
  .dz-grafica__marca:focus-visible .dz-grafica__cursor { opacity: 1; }
  .dz-grafica__marca:focus-visible .dz-grafica__aro,
  .dz-grafica__marca[data-ds-estado="foco"] .dz-grafica__aro { stroke: var(--focus); }
  /* Una marca sin dato no tiene punto ni aro: el foco se lee en el cursor, que toma el color del foco y se engrosa. */
  .dz-grafica__marca:focus-visible .dz-grafica__cursor,
  .dz-grafica__marca[data-ds-estado="foco"] .dz-grafica__cursor { stroke: var(--focus); stroke-width: 2; }
  .dz-grafica__marca[data-fijado] .dz-grafica__aro { stroke: var(--dato-1); }
  @media (hover: hover) { .dz-grafica__marca:hover .dz-grafica__punto, .dz-grafica__marca:hover .dz-grafica__cursor { opacity: 1; } }
  /* Hover de una marca: contorno en acento (el aro), nunca un relleno más fuerte. La marca guarda su relleno y el puntero se lee por fuera, igual que en el calor. */
  .dz-grafica__marca[data-ds-estado="hover"] .dz-grafica__aro { stroke: var(--accent-control); stroke-width: 2; }
  @media (hover: hover) { .dz-grafica__marca:hover .dz-grafica__aro { stroke: var(--accent-control); stroke-width: 2; } }

  /* Globo: lo mínimo (DCB-194): fecha, valor y comparación. Superficie con hairline y sombra, como el tooltip en lista; el JS lo coloca. */
  .dz-grafica__globo {
    position: absolute; left: 0; top: 0; z-index: var(--z-dropdown); pointer-events: none;
    display: grid; gap: var(--s-1); min-width: calc(var(--s-8) * 3); max-width: var(--w-globo);
    padding: var(--s-2) var(--s-3); border: 1px solid var(--hairline); border-radius: var(--r-2);
    background: var(--surface); color: var(--text); box-shadow: var(--shadow-md);
    font-size: var(--fs-1); line-height: var(--lh-2); font-variant-numeric: tabular-nums;
    transform: translate(-50%, calc(-100% - var(--s-3)));
  }
  /* En una ficha o una captura el globo se muestra quieto, en el flujo, bajo el dibujo. */
  .dz-grafica__globo--muestra { position: static; transform: none; width: max-content; margin-top: var(--s-2); }
  /* El globo del calor va al lado de la celda, centrado en su alto, para no tapar las vecinas de arriba ni de abajo: a la derecha y, si no cabe, a la izquierda. */
  .dz-grafica__globo[data-lado="derecha"] { transform: translate(var(--s-3), -50%); }
  .dz-grafica__globo[data-lado="izquierda"] { transform: translate(calc(-100% - var(--s-3)), -50%); }
  .dz-grafica__globo[hidden] { display: none; }
  .dz-grafica__globo-titulo { font-weight: 500; padding-bottom: var(--s-1); border-bottom: 1px solid var(--hairline); }
  .dz-grafica__globo-fila { display: flex; justify-content: space-between; gap: var(--s-3); color: var(--text-2); }
  .dz-grafica__globo-valor { color: var(--text); font-weight: 500; }

  /* Tabla alternativa de la línea: plegada bajo un resumen que es un enlace con flecha (nunca subrayado). */
  .dz-grafica__tabla { min-width: 0; }
  .dz-grafica__resumen { display: inline-flex; align-items: center; gap: var(--s-1); min-height: var(--dz-dens-control-sm, var(--h-control-sm)); cursor: pointer; list-style: none; font-size: var(--fs-2); color: var(--accent-text); border-radius: var(--r-chip); }
  .dz-grafica__resumen::-webkit-details-marker { display: none; }
  .dz-grafica__resumen svg { transition: transform var(--dur-1) var(--ease-out); }
  .dz-grafica__tabla[open] > .dz-grafica__resumen svg { transform: rotate(180deg); }
  .dz-grafica__resumen:hover { color: var(--link-hover); }
  .dz-grafica__resumen:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-grafica__tabla > .dz-tabla__region { margin-top: var(--s-2); max-height: calc(var(--h-fila) * 8); overflow-y: auto; }
  .dz-grafica__tabla th.dz-tabla__celda { text-align: left; font-weight: 400; }
  .dz-grafica__tabla .dz-tabla__titulo { position: sticky; top: 0; background: var(--surface); z-index: 1; }

  /* Filas (barras y embudo): la tabla del sistema con una columna de barra. El texto es HTML y la tabla es la alternativa accesible. */
  .dz-grafica__filas { table-layout: auto; }
  .dz-grafica__col-barra { width: 100%; padding: 0; }
  /* El nombre no parte renglón en la fila ancha (la barra se queda con el resto); bajo 560 px va en su propio renglón y sí parte. */
  .dz-grafica__filas .dz-grafica__nombre { font-weight: 400; text-align: left; white-space: nowrap; padding-right: var(--s-3); }
  .dz-grafica__barra { width: 100%; padding: 0 var(--s-3) 0 0; }
  .dz-grafica__pista { display: block; width: 100%; height: var(--s-4); overflow: visible; }
  .dz-grafica__relleno { fill: var(--dato-relleno); }
  .dz-grafica__relleno--2 { fill: var(--dato-relleno-2); }
  /* Apilada: la primera parte en tinta (--dato-1) y la segunda en el gris medio: 3:1 contra la superficie y entre sí, en claro y oscuro. */
  .dz-grafica__pista--apilada .dz-grafica__relleno { fill: var(--dato-1); }
  .dz-grafica__pista--resalte .dz-grafica__relleno { fill: var(--dato-1); }
  .dz-grafica__pista--apilada .dz-grafica__relleno--2 { fill: var(--dato-relleno-2); }
  .dz-grafica__filas--embudo .dz-grafica__valor { font-weight: 600; }
  .dz-grafica__filas .dz-grafica__valor { font-weight: 500; white-space: nowrap; }
  .dz-grafica__filas .dz-grafica__segmento, .dz-grafica__filas .dz-grafica__tasa { color: var(--text-2); white-space: nowrap; }
  .dz-grafica__nota { display: block; font-size: var(--fs-1); font-weight: 400; color: var(--text-muted); white-space: nowrap; }
  .dz-grafica__etapa { display: inline-block; width: var(--s-2); height: var(--s-2); margin-right: var(--s-2); border-radius: var(--r-pill); background: var(--text-muted); vertical-align: 0; }
  .dz-grafica__etapa[data-color="st1"] { background: var(--st1, var(--text-muted)); }
  .dz-grafica__etapa[data-color="st2"] { background: var(--st2, var(--text-muted)); }
  .dz-grafica__etapa[data-color="st3"] { background: var(--st3, var(--text-muted)); }
  .dz-grafica__etapa[data-color="st4"] { background: var(--st4, var(--text-muted)); }
  .dz-grafica__etapa[data-color="st5"] { background: var(--st5, var(--text-muted)); }
  .dz-grafica__etapa[data-color="won"] { background: var(--st-won, var(--ok)); }
  .dz-grafica__etapa[data-color="lost"] { background: var(--st-lost, var(--bad)); }
  /* La tasa de paso es un renglón propio entre dos etapas: se lee en su lugar y no compite con la cifra de la fila. */
  .dz-grafica__paso-celda { height: auto; padding: var(--s-1) 0 var(--s-1) var(--s-2); border-bottom: 0; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; vertical-align: middle; }
  .dz-grafica__paso-celda svg { vertical-align: -.2em; margin-right: var(--s-1); }
  .dz-grafica__leyenda { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-4); margin: 0 0 var(--s-2); font-size: var(--fs-1); color: var(--text-2); }
  .dz-grafica__leyenda span { display: inline-flex; align-items: center; gap: var(--s-2); }
  .dz-grafica__muestra { display: inline-block; width: var(--s-3); height: var(--s-3); border-radius: var(--r-1); background: var(--dato-1); }
  .dz-grafica__muestra--2 { background: var(--dato-relleno-2); }
  /* Bajo 560 px de contenedor la fila se reacomoda: nombre y cifras en un renglón, la barra a todo lo ancho debajo. Nada escala. */
  @container dz-grafica (max-width: 560px) {
    .dz-grafica__filas, .dz-grafica__filas > tbody { display: block; width: 100%; }
    .dz-grafica__filas > thead { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-grafica__filas .dz-tabla__fila { display: grid; grid-template-columns: minmax(0, 1fr) auto auto auto; column-gap: var(--s-3); align-items: baseline; padding: var(--s-2) 0; border-bottom: 1px solid var(--border); }
    .dz-grafica__filas .dz-tabla__fila > * { height: auto; padding: 0; border-bottom: 0; }
    .dz-grafica__filas .dz-grafica__nombre { grid-column: 1; grid-row: 1; white-space: normal; }
    .dz-grafica__filas .dz-grafica__valor { grid-row: 1; }
    .dz-grafica__filas .dz-grafica__segmento, .dz-grafica__filas .dz-grafica__tasa { grid-row: 1; }
    .dz-grafica__filas .dz-grafica__barra { grid-column: 1 / -1; grid-row: 2; padding: var(--s-1) 0 0; }
    .dz-grafica__filas .dz-grafica__paso { display: block; }
    .dz-grafica__filas .dz-grafica__paso-celda { display: block; padding: var(--s-1) 0; }
    .dz-grafica__nota { display: inline; margin-left: var(--s-1); }
    /* Intervalo: lugar, nombre, tasa y n en el primer renglón; la pista en el segundo; el texto del intervalo en un tercero, a lo ancho. */
    .dz-grafica__filas--intervalo .dz-tabla__fila { grid-template-columns: auto minmax(0, 1fr) auto auto; }
    .dz-grafica__filas--intervalo .dz-grafica__lugar { grid-column: 1; grid-row: 1; }
    .dz-grafica__filas--intervalo .dz-grafica__nombre { grid-column: 2; }
    .dz-grafica__filas--intervalo .dz-grafica__n { grid-column: 4; grid-row: 1; }
    .dz-grafica__filas--intervalo .dz-grafica__intervalo-texto { grid-column: 1 / -1; grid-row: 3; text-align: left; font-size: var(--fs-1); color: var(--text-muted); padding-top: var(--s-1); }
    /* Comparación y meta: nombre, cifras y cambio (o avance) en el primer renglón, con la rejilla de la fila; la pista debajo. */
    .dz-grafica__filas--meta .dz-grafica__nombre { min-width: 0; }
    .dz-grafica__filas--meta .dz-grafica__nombre .dz-grafica__nota { display: block; margin-left: 0; }
    .dz-grafica__filas .dz-grafica__delta { grid-row: 1; }
    .dz-grafica__calor .dz-grafica__nombre { padding-right: var(--s-2); }
    .dz-grafica__calor .dz-grafica__celda { height: var(--h-tactil); padding: 0; }
    /* Los encabezados de franja parten renglón («8 a» / «10») en vez de encogerse o chocar. */
    .dz-grafica__calor .dz-tabla__titulo { white-space: normal; line-height: var(--lh-2); height: auto; padding: var(--s-1) 0; vertical-align: bottom; }
  }

  /* Barras con intervalo y empate: el trazo del intervalo lleva un aro de superficie detrás para pasar 3:1 contra la barra sin dibujar un borde. */
  .dz-grafica__intervalo { fill: var(--dato-intervalo); }
  .dz-grafica__intervalo-aro { fill: var(--surface); }
  .dz-grafica__relleno--atenuado { fill: var(--dato-relleno-2); }
  /* Etapa sin madurar: la barra en el gris medio con rayas verticales de tinta encima (se lee sin el color) y la nota bajo el nombre. */
  .dz-grafica__pista--sin-madurar .dz-grafica__relleno { fill: var(--dato-relleno-2); }
  .dz-grafica__trama { fill: var(--dato-1); }
  .dz-grafica__filas .dz-tabla__fila[data-inmadura] .dz-grafica__nombre .dz-grafica__nota { display: block; margin-left: 0; white-space: normal; }
  /* Barras apiladas en contenedor angosto: sin encabezados, cada cifra de parte lleva la muestra de su color (la que ya enseña la leyenda) y el total queda sin muestra. */
  @container dz-grafica (max-width: 560px) {
    .dz-grafica__filas--apiladas .dz-grafica__segmento[data-parte]::before { content: ""; display: inline-block; width: var(--s-2); height: var(--s-2); margin-right: var(--s-1); border-radius: var(--r-1); background: var(--dato-1); vertical-align: baseline; }
    .dz-grafica__filas--apiladas .dz-grafica__segmento[data-parte="2"]::before { background: var(--dato-relleno-2); }
  }
  .dz-grafica__relleno--resalte { fill: var(--dato-1); }
  .dz-grafica__filas .dz-grafica__lugar { width: 1%; color: var(--text-2); white-space: nowrap; }
  .dz-tabla__fila[data-empate] .dz-grafica__lugar { color: var(--text-muted); }
  .dz-grafica__muestra--intervalo { background: linear-gradient(to bottom, var(--dato-relleno) 0 30%, var(--dato-intervalo) 30% 70%, var(--dato-relleno) 70%); }
  .dz-grafica__muestra--atenuada { background: var(--dato-relleno-2); }

  /* Comparación de dos periodos: barras pareadas y columna de cambio con signo, glifo y tono (el color solo acompaña). */
  .dz-grafica__pista--pareada { height: calc(var(--s-4) + var(--s-1)); }
  .dz-grafica__filas .dz-grafica__delta { white-space: nowrap; }
  .dz-grafica__cambio { display: inline-flex; align-items: center; gap: var(--s-1); font-weight: 500; color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-grafica__cambio[data-tono="bueno"] { color: var(--ok-text); }
  .dz-grafica__cambio[data-tono="malo"] { color: var(--bad-text); }
  .dz-grafica__cambio .dz-grafica__nota { display: inline; font-weight: 400; }

  /* Meta (bala): bandas de fondo, la medida en tinta y el tick de la meta. */
  .dz-grafica__filas--comparacion .dz-grafica__segmento { color: var(--text-muted); }
  /* El nombre de la meta lleva su nota debajo («Faltan 9 en 5 días hábiles: 2 por día»): puede partir renglón, la barra se queda con el resto. */
  .dz-grafica__filas--meta .dz-grafica__nombre { white-space: normal; min-width: calc(var(--s-8) * 3); }
  .dz-grafica__pista--meta { overflow: visible; outline: 1px solid var(--dato-umbral); }
  .dz-grafica__rango { stroke: none; }
  .dz-grafica__rango--1 { fill: var(--dato-rango-1); }
  .dz-grafica__rango--2 { fill: var(--dato-rango-2); }
  .dz-grafica__rango--3 { fill: var(--dato-rango-3); }
  .dz-grafica__medida, .dz-grafica__tick-meta { fill: var(--dato-1); }
  .dz-grafica__ok { color: var(--ok-text); vertical-align: -.15em; margin-left: var(--s-1); }
  .dz-grafica__muestra--tinta { background: var(--dato-1); }
  .dz-grafica__muestra--meta { background: linear-gradient(to right, var(--dato-rango-2) 0 40%, var(--dato-1) 40% 60%, var(--dato-rango-2) 60%); }
  .dz-grafica__muestra--rango { background: linear-gradient(to right, var(--dato-rango-1) 0 34%, var(--dato-rango-2) 34% 67%, var(--dato-rango-3) 67%); box-shadow: inset 0 0 0 1px var(--dato-umbral); }

  /* Línea con banda, umbral y proyección: la forma lo dice, no el color (banda por área, umbral por punteado corto, proyección por punteado largo, fuera por punto hueco). */
  .dz-grafica__banda { fill: var(--dato-banda); stroke: var(--dato-umbral); stroke-width: 1; }
  .dz-grafica__banda--proyeccion { stroke: var(--dato-umbral); stroke-width: 1; stroke-dasharray: 2 4; }
  .dz-grafica__umbral { fill: none; stroke: var(--dato-umbral); stroke-width: 1.5; stroke-dasharray: 2 4; stroke-linecap: round; }
  .dz-grafica__umbral-texto { fill: var(--text-muted); }
  .dz-grafica__serie--proyeccion { stroke: var(--dato-2); stroke-dasharray: 5 4; }
  .dz-grafica__punto--fuera { fill: var(--surface); stroke: var(--dato-1); stroke-width: 2; opacity: 1; }
  .dz-grafica__claves { display: inline-flex; flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-grafica__clave { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-grafica__clave-muestra { display: inline-block; width: var(--s-4); height: 0; border-top: 2px solid var(--dato-1); }
  .dz-grafica__clave--serie { border-top: 2px solid var(--dato-1); }
  .dz-grafica__clave--banda { height: var(--s-2); border: 1px solid var(--dato-umbral); background: var(--dato-banda); }
  .dz-grafica__clave--umbral { border-top: 2px dashed var(--dato-umbral); }
  .dz-grafica__clave--proyeccion { border-top: 2px dashed var(--dato-2); }
  .dz-grafica__clave--hueco { width: var(--s-2); height: var(--s-2); box-sizing: border-box; border: 2px solid var(--dato-1); border-radius: var(--r-pill); background: var(--surface); }

  /* Calor (día × hora): tabla de doble entrada con la celda sombreada en una rampa gris de un solo matiz y el número dentro. El hueco de superficie entre celdas
     lo da border-spacing. tabla.css pinta TODA la fila en hover (--surface-2): aquí la celda guarda su paso de la rampa, la fila no cambia y el resalte es solo
     de la celda bajo el puntero o el foco, con un contorno en tinta por fuera (no mueve el texto, no cambia el paso y el número sigue legible). */
  .dz-grafica__calor { table-layout: fixed; border-collapse: separate; border-spacing: calc(var(--s-1) / 2); width: 100%; }
  .dz-grafica__calor--ancha { table-layout: auto; width: max-content; min-width: 100%; }
  .dz-grafica__calor .dz-grafica__nombre { width: 1%; white-space: nowrap; font-weight: 400; text-align: left; padding-right: var(--s-3); border-bottom: 0; }
  .dz-grafica__calor .dz-tabla__titulo { text-align: center; padding: 0 var(--s-1); }
  .dz-grafica__calor .dz-tabla__titulo:first-child { text-align: left; }
  .dz-grafica__calor .dz-grafica__celda { text-align: center; padding: 0 var(--s-1); height: var(--dz-dens-fila, var(--h-fila)); border-bottom: 0; border-radius: var(--r-1); color: var(--text); font-variant-numeric: tabular-nums; outline: 0 solid transparent; }
  .dz-grafica__calor--ancha .dz-grafica__celda { min-width: var(--h-tactil); }
  .dz-grafica__celda[data-nivel="0"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="0"] { color: var(--text-muted); background-color: transparent; }
  .dz-grafica__celda[data-nivel="1"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="1"] { background-color: var(--dato-escala-1); }
  .dz-grafica__celda[data-nivel="2"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="2"] { background-color: var(--dato-escala-2); }
  .dz-grafica__celda[data-nivel="3"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="3"] { background-color: var(--dato-escala-3); }
  .dz-grafica__celda[data-nivel="4"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="4"] { background-color: var(--dato-escala-4); color: var(--dato-escala-tinta-alta); }
  .dz-grafica__celda[data-nivel="5"], .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="5"] { background-color: var(--dato-escala-5); color: var(--dato-escala-tinta-alta); }
  /* Los pasos 1 a 3 no llegan a 3:1 contra la superficie: su contorno sí (--dato-umbral). Los pasos 4 y 5 ya pasan por sí solos. */
  .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda:is([data-nivel="1"], [data-nivel="2"], [data-nivel="3"]) { border: 1px solid var(--dato-umbral); }
  .dz-grafica__calor .dz-tabla__fila:hover > .dz-grafica__nombre { background: transparent; }
  .dz-grafica__calor .dz-grafica__celda { cursor: default; }
  /* Hover y foco, el mismo resalte: un contorno en tinta por fuera y un filete de superficie por dentro. Sobre un paso claro se lee el contorno y sobre uno oscuro
     se lee el filete (3:1 contra la superficie en los dos); el número no se mueve y sigue en su tinta sobre su paso. */
  @media (hover: hover) { .dz-grafica__calor .dz-grafica__celda:hover { outline: 2px solid var(--accent-control); box-shadow: inset 0 0 0 2px var(--surface); } }
  .dz-grafica__calor .dz-grafica__celda[data-ds-estado="hover"] { outline: 2px solid var(--accent-control); box-shadow: inset 0 0 0 2px var(--surface); }
  /* El foco del teclado sigue en tinta (3:1 contra cualquier paso): el contorno en acento es del puntero, el de tinta es del foco, y no se confunden. */
  .dz-grafica__calor .dz-grafica__celda:focus-visible,
  .dz-grafica__calor .dz-grafica__celda[data-ds-estado="foco"] { outline: 2px solid var(--text); box-shadow: inset 0 0 0 2px var(--surface); }
  .dz-grafica__escala { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-3); margin: var(--s-3) 0 0; padding: 0; list-style: none; font-size: var(--fs-1); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-grafica__escala-paso { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-grafica__escala i.dz-grafica__celda { display: inline-block; width: var(--s-3); height: var(--s-3); border-radius: var(--r-1); box-shadow: inset 0 0 0 1px var(--dato-umbral); }

  /* Estados: cargando conserva la forma (esqueleto del alto del dibujo), vacío lo dice, error reusa el aviso con Reintentar. */
  .dz-grafica__esqueleto { height: calc(var(--h-fila) * 4); border-radius: var(--r-control); }
  .dz-grafica__lienzo--barras .dz-grafica__esqueleto, .dz-grafica__lienzo--embudo .dz-grafica__esqueleto, .dz-grafica__lienzo--meta .dz-grafica__esqueleto, .dz-grafica__lienzo--calor .dz-grafica__esqueleto { height: calc(var(--h-fila) * 3); }
  .dz-grafica__estado { display: flex; align-items: center; gap: var(--s-2); margin: var(--s-2) 0 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-grafica__lienzo--vacio .dz-grafica__estado { min-height: calc(var(--h-fila) * 4); justify-content: center; margin: 0; border: 1px dashed var(--line-2); border-radius: var(--r-control); }
  .dz-grafica__reintentar { background: none; border: 0; padding: 0; font: inherit; cursor: pointer; }
  .dz-grafica__reintentar:focus-visible { outline: none; box-shadow: var(--ring); border-radius: var(--r-chip); }

  /* Movimiento reducido: lo resuelve base.css para todo el sistema (las transiciones de aquí duran 0.01 ms). */
  @media (forced-colors: active) {
    .dz-grafica__serie, .dz-grafica__guia, .dz-grafica__eje, .dz-grafica__cursor { stroke: CanvasText; }
    .dz-grafica__relleno, .dz-grafica__punto, .dz-grafica__muestra { fill: CanvasText; background: CanvasText; }
    .dz-grafica__relleno--2 { fill: GrayText; }
    .dz-grafica__muestra--2 { background: GrayText; }
    .dz-grafica__marca:focus-visible .dz-grafica__cursor, .dz-grafica__marca[data-ds-estado="foco"] .dz-grafica__cursor { stroke: Highlight; }
    .dz-grafica__intervalo, .dz-grafica__medida, .dz-grafica__tick-meta { fill: CanvasText; }
    .dz-grafica__relleno--atenuado { fill: GrayText; }
    /* La meta conserva sus tres bandas: oscura, media y Canvas con el contorno de la pista; la leyenda lleva los mismos tres tonos. */
    .dz-grafica__rango--1 { fill: GrayText; }
    .dz-grafica__rango--2 { fill: color-mix(in srgb, GrayText 50%, Canvas); }
    .dz-grafica__rango--3 { fill: Canvas; }
    .dz-grafica__pista--meta { outline-color: CanvasText; }
    .dz-grafica__muestra--rango { forced-color-adjust: none; background: linear-gradient(to right, GrayText 0 34%, color-mix(in srgb, GrayText 50%, Canvas) 34% 67%, Canvas 67%); box-shadow: none; outline: 1px solid CanvasText; }
    .dz-grafica__banda { fill: color-mix(in srgb, GrayText 35%, Canvas); stroke: CanvasText; }
    .dz-grafica__hueco { fill: color-mix(in srgb, GrayText 35%, Canvas); }
    .dz-grafica__trama { fill: CanvasText; }
    .dz-grafica__filas--apiladas .dz-grafica__segmento[data-parte]::before { forced-color-adjust: none; background: CanvasText; }
    .dz-grafica__filas--apiladas .dz-grafica__segmento[data-parte="2"]::before { background: GrayText; }
    .dz-grafica__clave--banda { forced-color-adjust: none; background: color-mix(in srgb, GrayText 35%, Canvas); border-color: CanvasText; }
    .dz-grafica__umbral, .dz-grafica__serie--proyeccion { stroke: CanvasText; }
    .dz-grafica__punto--fuera { fill: Canvas; stroke: CanvasText; }
    .dz-grafica__clave-muestra { border-color: CanvasText; }
    /* Calor: box-shadow no se pinta en colores forzados y una celda en CanvasText pierde el número bajo la placa de Canvas de Chromium. Cada celda va en Canvas
       con su número en CanvasText y el paso se lee por el borde (1 px en los pasos 1 a 3, 3 px en los dos altos, como su muestra en la escala); el hover y el
       foco, en Highlight. */
    .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel], .dz-grafica__escala i.dz-grafica__celda[data-nivel] { background-color: Canvas; color: CanvasText; box-shadow: none; outline: 1px solid CanvasText; outline-offset: -1px; }
    .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda[data-nivel="0"] { outline: 0; }
    .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda:is([data-nivel="4"], [data-nivel="5"]), .dz-grafica__escala i.dz-grafica__celda:is([data-nivel="4"], [data-nivel="5"]) { outline-width: 3px; outline-offset: -3px; font-weight: 600; }
    .dz-grafica__calor .dz-tabla__fila > .dz-grafica__celda:is(:hover, :focus-visible, [data-ds-estado]) { outline: 2px solid Highlight; outline-offset: 0; }
  }
}

/* Gráfica de área apilada de dos partes (organismo hermano de grafica): la parte que importa abajo en tinta (--dato-1), la otra encima en el gris medio
   (--dato-relleno-2), con un hueco de superficie de 2 px entre las dos. Solo dos partes: una tercera gris no pasa 3:1 contra la superficie. Las marcas, el globo,
   los ejes y la tabla son los de la línea de grafica (ver externas). */
@layer dz.componentes {
  .dz-grafica.dz-grafica-area { gap: var(--s-3); }
  .dz-grafica-area__parte { stroke: var(--surface); stroke-width: 2; stroke-linejoin: round; }
  .dz-grafica-area__parte--1 { fill: var(--dato-1); }
  .dz-grafica-area__parte--2 { fill: var(--dato-relleno-2); }
  /* Claves en la línea de meta (DCB-227: la leyenda siempre a la vista). */
  .dz-grafica-area__claves { display: inline-flex; flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-grafica-area__clave { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-grafica-area__muestra { display: inline-block; width: var(--s-4); height: var(--s-2); border-radius: var(--r-1); }
  .dz-grafica-area__muestra--1 { background: var(--dato-1); }
  .dz-grafica-area__muestra--2 { background: var(--dato-relleno-2); }
  @media (forced-colors: active) {
    .dz-grafica-area__parte--1 { fill: CanvasText; }
    .dz-grafica-area__parte--2 { fill: GrayText; }
    .dz-grafica-area__muestra--1 { background: CanvasText; }
    .dz-grafica-area__muestra--2 { background: GrayText; }
  }
}

/* Gráfica de cohortes (organismo hermano de grafica): tabla de doble entrada con cada celda sombreada en una rampa de cinco pasos de un solo matiz
   (--dato-escala-1 a -5, de claro a oscuro; los dos más oscuros llevan la tinta alta). El número va dentro de cada celda: el color solo acelera el patrón.
   La cohorte que aún no cumple el plazo lleva una trama diagonal hecha con la tinta del tema (en claro, rayas oscuras; en oscuro, claras) además del texto
   «en maduración» para el lector y de un contorno discontinuo en colores forzados. Reusa la cabecera, el pie y las leyendas de grafica (ver externas).
   Los selectores de las celdas llevan dos clases (los pasos, cuatro: le ganan al hover de fila de tabla.css aunque una app cargue tabla.css después). La celda es position: relative
   para que el texto «en maduración» (fuera de pantalla, dz-grafica__sr) quede dentro de la región que desplaza y no ensanche la página. */
@layer dz.componentes {
  .dz-grafica.dz-grafica-cohortes { gap: var(--s-4); }
  .dz-grafica-cohortes__tabla { width: 100%; border-collapse: separate; border-spacing: 2px; }
  .dz-grafica-cohortes__tabla--ancha { width: max-content; min-width: 100%; }
  .dz-grafica-cohortes__tabla .dz-grafica__nombre { width: 1%; padding: 0 var(--s-3) 0 0; border-bottom: 0; font-weight: 400; text-align: left; white-space: nowrap; }
  .dz-grafica-cohortes__tabla .dz-tabla__titulo { padding: 0 var(--s-1); text-align: center; }
  .dz-grafica-cohortes__tabla .dz-tabla__titulo:first-child { text-align: left; }
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__titulo-n { padding: 0 var(--s-3) 0 var(--s-1); text-align: right; }
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__n { width: 1%; padding: 0 var(--s-3) 0 0; border-bottom: 0; white-space: nowrap; }
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__celda { position: relative; padding: 0 var(--s-1); border-bottom: 0; border-radius: var(--r-1); color: var(--text); text-align: center; font-variant-numeric: tabular-nums; }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="0"] { color: var(--text-muted); background-color: transparent; }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="1"] { background-color: var(--dato-escala-1); }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="2"] { background-color: var(--dato-escala-2); }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="3"] { background-color: var(--dato-escala-3); }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda:is([data-nivel="1"], [data-nivel="2"], [data-nivel="3"]) { border: 1px solid var(--dato-umbral); }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="4"] { background-color: var(--dato-escala-4); color: var(--dato-escala-tinta-alta); }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="5"] { background-color: var(--dato-escala-5); color: var(--dato-escala-tinta-alta); }
  /* La trama: rayas de 2 px cada 8 con la tinta del tema al 18 %. Una raya del color del texto le quita contraste al número (en el paso 3 del oscuro baja
     de 5.5 a 3.8) y, en los pasos 3 y 5, la raya de la tinta se vuelve del color de la celda; por eso esos dos pasos rayan con la superficie, que es el
     extremo opuesto. Con esta elección el peor caso mide 4.5:1 o más en los cinco pasos, en claro y oscuro (lo comprueba la prueba, raya por raya). */
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__celda--madurando { --dz-trama-tinta: var(--text); }
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__celda--madurando[data-nivel="3"],
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__celda--madurando[data-nivel="5"] { --dz-trama-tinta: var(--surface); }
  .dz-grafica-cohortes__tabla .dz-grafica-cohortes__celda--madurando,
  .dz-grafica-cohortes__muestra--madurando { background-image: repeating-linear-gradient(135deg, color-mix(in srgb, var(--dz-trama-tinta, var(--text)) 18%, transparent) 0 2px, transparent 2px var(--s-2)); }

  /* Leyenda de la escala: seis pasos en orden, el primero es «sin dato». */
  .dz-grafica-cohortes__escala { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-3); margin: 0; padding: 0; list-style: none; font-size: var(--fs-1); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-grafica-cohortes__paso { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-grafica-cohortes__muestra { display: inline-block; flex: none; width: var(--s-3); height: var(--s-3); border-radius: var(--r-1); box-shadow: inset 0 0 0 1px var(--dato-umbral); }
  .dz-grafica-cohortes__muestra[data-nivel="1"] { background-color: var(--dato-escala-1); }
  .dz-grafica-cohortes__muestra[data-nivel="2"] { background-color: var(--dato-escala-2); }
  .dz-grafica-cohortes__muestra[data-nivel="3"] { background-color: var(--dato-escala-3); }
  .dz-grafica-cohortes__muestra[data-nivel="4"] { background-color: var(--dato-escala-4); }
  .dz-grafica-cohortes__muestra[data-nivel="5"] { background-color: var(--dato-escala-5); }
  .dz-grafica-cohortes__muestra--madurando { background-color: var(--dato-escala-2); }
  /* tabla.css pinta toda la fila en hover con el atajo background, que además borra la trama. Como en el calor, la fila de cohortes no cambia: la entrada y
     su n se quedan sin fondo y cada celda guarda su paso y su trama (la celda no es interactiva: no lleva resalte propio). */
  .dz-grafica-cohortes__tabla .dz-tabla__fila:is(:hover, [data-ds-estado="hover"]) > :is(.dz-grafica__nombre, .dz-grafica-cohortes__n) { background: transparent; }
  .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda.dz-grafica-cohortes__celda--madurando { background-image: repeating-linear-gradient(135deg, color-mix(in srgb, var(--dz-trama-tinta, var(--text)) 18%, transparent) 0 2px, transparent 2px var(--s-2)); }

  /* Bajo 560 px de contenedor los encabezados de columna parten renglón («SEM» / «0») en vez de empujar la tabla fuera de la pantalla. */
  @container dz-grafica (max-width: 560px) {
    .dz-grafica-cohortes__tabla .dz-tabla__titulo { height: auto; padding: var(--s-1) 0; line-height: var(--lh-2); white-space: normal; vertical-align: bottom; }
    .dz-grafica-cohortes__tabla .dz-grafica__nombre { padding-right: var(--s-2); }
  }

  /* Colores forzados: box-shadow no se pinta y Chromium pone una placa de Canvas detrás de cada texto, así que una celda en CanvasText con el número en Canvas
     se ve como un bloque negro con una barra blanca. Cada celda va en Canvas con su número en CanvasText y el paso se lee por el borde: 1 px en los pasos
     1 a 3 y 3 px en los dos altos (más el número). La muestra de la escala lleva el mismo borde que su celda; la maduración, un borde discontinuo. */
  @media (forced-colors: active) {
    .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel], .dz-grafica-cohortes__escala .dz-grafica-cohortes__muestra { background-color: Canvas; background-image: none; color: CanvasText; box-shadow: none; outline: 1px solid CanvasText; outline-offset: -1px; }
    .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda[data-nivel="0"] { outline: 0; }
    .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda:is([data-nivel="4"], [data-nivel="5"]), .dz-grafica-cohortes__escala .dz-grafica-cohortes__muestra:is([data-nivel="4"], [data-nivel="5"]) { outline-width: 3px; outline-offset: -3px; font-weight: 600; }
    .dz-grafica-cohortes__tabla .dz-tabla__fila > .dz-grafica-cohortes__celda.dz-grafica-cohortes__celda--madurando, .dz-grafica__leyenda .dz-grafica-cohortes__muestra--madurando { background-image: none; outline: 2px dashed CanvasText; outline-offset: -2px; }
  }
}

/* Gráfica de dispersión (organismo hermano de grafica): puntos siempre visibles (no esperan al hover), huecos cuando la muestra es chica y un aro que aparece con
   el puntero, el foco o lo fijado. Los selectores de los puntos llevan dos clases porque grafica.css, que se concatena después, los define con una. */
@layer dz.componentes {
  .dz-grafica.dz-grafica-dispersion { gap: var(--s-3); }
  .dz-grafica-dispersion__marca .dz-grafica-dispersion__punto { opacity: 1; }
  .dz-grafica-dispersion__marca .dz-grafica-dispersion__punto--hueco { fill: var(--surface); stroke: var(--dato-1); stroke-width: 2; }
  .dz-grafica-dispersion__marca[data-activa] .dz-grafica__aro,
  .dz-grafica-dispersion__marca[data-ds-estado="hover"] .dz-grafica__aro { stroke: var(--accent-control); stroke-width: 2; }
  @media (hover: hover) { .dz-grafica-dispersion__marca:hover .dz-grafica__aro { stroke: var(--accent-control); stroke-width: 2; } }
  .dz-grafica-dispersion .dz-grafica-dispersion__rotulo { fill: var(--text-2); }
  .dz-grafica-dispersion .dz-grafica-dispersion__eje-nombre { fill: var(--text-muted); }
  /* Claves en la línea de meta. */
  .dz-grafica-dispersion__claves { display: inline-flex; flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-grafica-dispersion__clave { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-grafica-dispersion__muestra { display: inline-block; box-sizing: border-box; width: var(--s-3); height: var(--s-3); border-radius: var(--r-pill); background: var(--dato-1); }
  .dz-grafica-dispersion__muestra--hueco { border: 2px solid var(--dato-1); background: var(--surface); }
  @media (forced-colors: active) {
    .dz-grafica-dispersion__marca .dz-grafica-dispersion__punto { fill: CanvasText; }
    .dz-grafica-dispersion__marca .dz-grafica-dispersion__punto--hueco { fill: Canvas; stroke: CanvasText; }
    .dz-grafica-dispersion__muestra { background: CanvasText; }
    .dz-grafica-dispersion__muestra--hueco { background: Canvas; border-color: CanvasText; }
  }
}

/* Gráfica de distribución (hermana de grafica): es grafica de barras con rangos en su orden natural. Aquí solo lo que añade: el resumen de la línea de meta
   (mediana y percentil que decide) en la tinta y con más peso, y el nombre del rango que contiene la mediana también con más peso, para que el resalte no
   dependa solo de la barra en tinta. */
@layer dz.componentes {
  .dz-grafica.dz-grafica-distribucion { gap: var(--s-4); }
  .dz-grafica-distribucion .dz-grafica-distribucion__dato { color: var(--text); font-weight: 500; }
  .dz-grafica-distribucion .dz-grafica__filas .dz-tabla__fila[data-resalte] .dz-grafica__nombre { font-weight: 500; }
}

/* Gráfica de múltiplos pequeños (composición de grafica): una rejilla de paneles, cada uno una gráfica de línea de una serie con el mismo eje. Los paneles
   miden 420 px como mínimo: a 1280 salen dos por renglón (2×2 con cuatro series, nunca 3+1) y a 390, uno. El título del panel es el nombre de la serie, no la conclusión. */
@layer dz.componentes {
  .dz-grafica-grupo { container: dz-grupo / inline-size; display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; margin: 0; color: var(--text); font-family: var(--font); }
  .dz-grafica-grupo__rejilla { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, calc(var(--s-8) * 8.75)), 1fr)); gap: var(--s-4); }
  .dz-grafica-grupo__panel .dz-grafica__titulo { font-size: var(--fs-3); font-weight: 500; color: var(--text-2); }
  .dz-grafica-grupo__panel .dz-grafica__svg--corta { max-width: calc(var(--s-8) * 9); }
}

/* Gráfica de puente o cascada (organismo hermano de grafica): la tabla de barras de grafica con una pista cuyo bloque flota desde el acumulado anterior.
   Los totales van en tinta a toda la altura (la pista usa dz-grafica__pista--resalte), lo que entra en el gris de control y lo que sale en el gris medio
   (dz-grafica__relleno--2); el signo y el acumulado están en las columnas. Todo el reflujo a 390 px es el de dz-grafica__filas. */
@layer dz.componentes {
  .dz-grafica.dz-grafica-puente { gap: var(--s-4); }
  .dz-grafica-puente__tabla .dz-grafica-puente__total .dz-grafica__nombre { font-weight: 500; }
  .dz-grafica-puente__muestra { display: inline-block; width: var(--s-3); height: var(--s-3); border-radius: var(--r-1); background: var(--dato-relleno); }
  @media (forced-colors: active) {
    .dz-grafica-puente__muestra { background: GrayText; }
  }
}

/* Hilo de mensajes: la conversación y su redactor. Las burbujas leen los tokens --hilo-* del tema (con la superficie del sistema como respaldo): la que entra
   a la izquierda con borde fino, la que sale a la derecha y la de sistema (una plantilla enviada por el producto) con filete discontinuo. El recibo es una o dos
   palomitas y, en el último mensaje propio, también la palabra. La ventana de 24 h es un chip con punto en el encabezado. */
@layer dz.componentes {
  .dz-hilo-mensajes { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; min-height: 0; color: var(--text); }
  .dz-hilo-mensajes__cabecera { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2) var(--s-3); padding-bottom: var(--s-3); border-bottom: 1px solid var(--hairline); }
  .dz-hilo-mensajes__persona { display: flex; align-items: center; gap: var(--s-2); min-width: 0; }
  .dz-hilo-mensajes__quien { min-width: 0; }
  .dz-hilo-mensajes__nombre { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); margin: 0; }
  .dz-hilo-mensajes__detalle { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-hilo-mensajes__log { display: flex; flex-direction: column; gap: var(--s-2); min-height: calc(var(--h-fila) * 5); max-height: calc(var(--h-fila) * 9); padding: var(--s-3) var(--s-2); overflow-y: auto; overscroll-behavior: contain; border-radius: var(--r-card); background: var(--hilo-bg, var(--surface-2)); }
  .dz-hilo-mensajes__log:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-hilo-mensajes__dia { align-self: center; margin: 0 0 var(--s-1); font-size: var(--fs-1); color: var(--hilo-meta, var(--text-muted)); }
  .dz-hilo-mensajes__dia span { padding: var(--s-1) var(--s-2); border: 1px solid var(--hairline); border-radius: var(--r-pill); background: var(--surface); }
  .dz-hilo-mensajes__burbuja { position: relative; max-width: min(78%, var(--w-lectura)); padding: var(--s-2) var(--s-3); border-radius: var(--r-3); font-size: var(--fs-2); line-height: var(--lh-3); animation: dzHiloEntra var(--dur-3) var(--ease-enfasis) backwards; }
  .dz-hilo-mensajes__texto { margin: 0; overflow-wrap: anywhere; white-space: pre-wrap; }
  .dz-hilo-mensajes__burbuja--in { align-self: flex-start; border: 1px solid var(--hilo-in-line, var(--border)); border-bottom-left-radius: var(--r-1); background: var(--hilo-in, var(--surface)); }
  .dz-hilo-mensajes__burbuja--out { align-self: flex-end; border-bottom-right-radius: var(--r-1); background: var(--hilo-out, var(--accent-soft)); color: var(--hilo-out-text, var(--text)); }
  .dz-hilo-mensajes__burbuja--sistema { align-self: flex-end; border: 1px dashed var(--line-2); border-bottom-right-radius: var(--r-1); background: var(--accent-soft); }
  .dz-hilo-mensajes__burbuja--nota { align-self: stretch; max-width: none; border: 1px dashed var(--warn); background: var(--warn-soft); color: var(--warn-text); }
  .dz-hilo-mensajes__origen { display: block; margin-top: var(--s-1); font-size: var(--fs-1); color: var(--hilo-meta, var(--text-muted)); }
  .dz-hilo-mensajes__meta { display: flex; align-items: center; justify-content: flex-end; gap: var(--s-1); margin-top: var(--s-1); font-size: var(--fs-1); font-variant-numeric: tabular-nums; color: var(--hilo-meta, var(--text-muted)); }
  .dz-hilo-mensajes__burbuja--out .dz-hilo-mensajes__meta { color: var(--hilo-meta-on, var(--text-2)); }
  .dz-hilo-mensajes__recibo { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-hilo-mensajes__recibo svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-hilo-mensajes__recibo[data-dz-recibo="leido"] { color: var(--ok-text); }
  /* En cola: el mensaje no pudo salir sin red; es un chip con su reloj y su frase, no palomitas, y dice cuándo sale. */
  .dz-hilo-mensajes__recibo--cola { color: var(--text-2); }
  .dz-hilo-mensajes__recibo-texto { display: none; }
  .dz-hilo-mensajes__burbuja[data-dz-ultimo] .dz-hilo-mensajes__recibo-texto { display: inline; }
  .dz-hilo-mensajes__escribiendo { display: inline-flex; gap: var(--s-1); align-items: center; }
  .dz-hilo-mensajes__escribiendo i { width: var(--punto-chip); height: var(--punto-chip); border-radius: 50%; background: var(--text-muted); animation: dzHiloPunto var(--dur-respira) var(--ease-velo) 3; }
  .dz-hilo-mensajes__escribiendo i:nth-child(2) { animation-delay: var(--dur-1); }
  .dz-hilo-mensajes__escribiendo i:nth-child(3) { animation-delay: var(--dur-2); }
  .dz-hilo-mensajes__redactor { display: grid; gap: var(--s-2); padding-top: var(--s-3); }
  .dz-hilo-mensajes__modos { justify-self: start; }
  .dz-hilo-mensajes__campo .dz-campo__control { min-height: calc(var(--h-control) * 1.4); }
  .dz-hilo-mensajes__razon { display: flex; align-items: flex-start; gap: var(--s-2); margin: 0; font-size: var(--fs-1); color: var(--warn-text); }
  .dz-hilo-mensajes__razon svg { flex: none; width: var(--ico-1); height: var(--ico-1); margin-top: var(--s-1); }
  .dz-hilo-mensajes__pie { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2); }
  .dz-hilo-mensajes__pista { display: inline-flex; align-items: center; gap: var(--s-1); font-size: var(--fs-1); color: var(--text-muted); }
  .dz-hilo-mensajes__pista kbd { display: inline-grid; place-items: center; min-width: 1.6em; height: 1.5em; padding: 0 .4em; border: 1px solid var(--line-2); border-bottom-width: 2px; border-radius: var(--r-1); background: var(--surface); color: var(--text-2); font-family: var(--font); font-size: .9em; font-weight: 500; }
  .dz-hilo-mensajes__acciones { display: flex; gap: var(--s-2); margin-left: auto; }
  .dz-hilo-mensajes__modelos { display: none; }
  .dz-hilo-mensajes__vivo { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  @keyframes dzHiloEntra { from { opacity: 0; transform: translateY(var(--s-2)); } }
  @keyframes dzHiloPunto { 0%, 100% { opacity: .35; } 50% { opacity: 1; } }
  @media (max-width: 560px) {
    .dz-hilo-mensajes__burbuja { max-width: 88%; }
    .dz-hilo-mensajes__pista { display: none; }
  }
  @media (pointer: coarse) { .dz-hilo-mensajes__pista { display: none; } }
  @media (prefers-reduced-motion: reduce) { .dz-hilo-mensajes__burbuja, .dz-hilo-mensajes__escribiendo i { animation: none; } }
  [data-dz-movimiento="reducido"] :is(.dz-hilo-mensajes__burbuja, .dz-hilo-mensajes__escribiendo i) { animation: none; }
}

/* Hoja: panel lateral derecho de formulario, de alto completo, con cabecera, cuerpo que se desplaza y pie fijo con las acciones. Es modal (velo,
   foco atrapado, Esc). Entra desde la derecha con --dur-4 y sale en --dur-2; en teléfono ocupa todo el ancho. Hairline como el modal. */
@layer dz.componentes {
  .dz-hoja {
    position: fixed;
    inset: 0;
    z-index: var(--z-hoja);
    display: flex;
    justify-content: flex-end;
    background: color-mix(in oklch, var(--text) 45%, transparent);
    opacity: 1;
    transition: opacity var(--dur-2) var(--ease-out), display var(--dur-2) allow-discrete;
    touch-action: manipulation;
    overscroll-behavior: contain;
    /* El teclado virtual no encoge el viewport de diseño en iOS: comportamiento/teclado mide cuánto tapa (--dz-teclado) y la hoja termina arriba de él. */
    bottom: var(--dz-teclado, 0);
  }
  [data-ds-theme="dark"] .dz-hoja { background: color-mix(in oklch, var(--bg) 70%, transparent); }
  .dz-hoja[hidden] { display: none; opacity: 0; transition: opacity var(--dur-1) var(--ease-out), display var(--dur-1) allow-discrete; }
  .dz-hoja[data-dz-saliendo] { opacity: 0; transition-duration: var(--dur-2); }
  .dz-hoja__panel {
    display: flex;
    flex-direction: column;
    width: min(var(--w-hoja), 100vw);
    height: 100%;
    background: var(--surface);
    color: var(--text);
    border-left: 1px solid var(--hairline);
    box-shadow: var(--shadow-md);
    transform: translateX(0);
    transition: transform var(--dur-4) var(--ease-enfasis);
  }
  .dz-hoja__panel:focus-visible { outline: none; }
  @starting-style { .dz-hoja:not([hidden]) { opacity: 0; } .dz-hoja:not([hidden]) .dz-hoja__panel { transform: translateX(100%); } }
  .dz-hoja[data-dz-saliendo] .dz-hoja__panel { transform: translateX(100%); transition-duration: var(--dur-2); transition-timing-function: var(--ease-sale); }
  .dz-hoja__cabecera { flex: none; display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); padding: calc(var(--s-4) + env(safe-area-inset-top)) max(var(--s-6), env(safe-area-inset-right)) var(--s-4) max(var(--s-6), env(safe-area-inset-left)); border-bottom: 1px solid var(--hairline); }
  .dz-hoja__titulo { margin: 0; font-size: var(--fs-5); font-weight: 500; letter-spacing: -.02em; line-height: var(--lh-2); }
  .dz-hoja__cerrar { flex: none; margin-right: calc(var(--s-2) * -1); }
  .dz-hoja__cuerpo { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior-y: contain; display: grid; align-content: start; gap: var(--s-3); padding: var(--s-5) max(var(--s-6), env(safe-area-inset-right)) var(--s-5) max(var(--s-6), env(safe-area-inset-left)); font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-hoja__pie { flex: none; display: flex; flex-wrap: wrap; gap: var(--s-2); justify-content: flex-end; padding: var(--s-4) max(var(--s-6), env(safe-area-inset-right)) calc(var(--s-4) + env(safe-area-inset-bottom)) max(var(--s-6), env(safe-area-inset-left)); border-top: 1px solid var(--hairline); }
  .dz-hoja--muestra { bottom: auto; position: static; z-index: auto; display: block; background: none; transition: none; }
  [data-ds-theme="dark"] .dz-hoja--muestra { background: none; }
  .dz-hoja--muestra .dz-hoja__panel { height: calc(var(--h-fila) * 9); width: 100%; max-width: var(--w-hoja); margin: 0 auto; border: 1px solid var(--hairline); border-radius: var(--r-card); transition: none; }
  @media (max-width: 560px) {
    .dz-hoja__panel { width: 100vw; }
    .dz-hoja__cabecera, .dz-hoja__pie { padding-left: var(--s-4); padding-right: var(--s-4); }
    .dz-hoja__cuerpo { padding: var(--s-4); }
  }
  @media (prefers-reduced-motion: reduce) { .dz-hoja, .dz-hoja__panel { transition: none; } }
}

/* Importador de leads desde un CSV: un asistente de cinco pasos en la página. Organismo de piezas que ya existen (pasos, zona de carga, tabla, campo,
   casilla, control segmentado, chip, aviso, detalle, progreso, toast, confirmación, esqueleto); aquí solo viven el ritmo de los paneles, la celda con
   error (valor con subrayado ondulado y el motivo en texto con icono, nunca solo color), las cifras grandes y los requisitos del mapeo. Un panel visible a
   la vez; el pie lleva Atrás a la izquierda y la acción primaria a la derecha. A 560 px el pie se invierte (la primaria arriba, de borde a borde) y las
   tablas se apilan. La región viva va fuera de la vista y dice el paso y los conteos. */
@layer dz.componentes {
  .dz-importador { display: grid; gap: var(--s-5); min-width: 0; }
  .dz-importador__barra { display: grid; gap: var(--s-3); padding: var(--s-4) var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-importador__pasos,
  .dz-importador__opciones,
  .dz-importador__recordar { min-width: 0; }
  .dz-importador__estado-fila { display: inline-block; }
  .dz-importador__contexto { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-importador__panel { display: grid; gap: var(--s-5); min-width: 0; }
  .dz-importador__panel[hidden] { display: none; }
  .dz-importador__cabecera { display: grid; gap: var(--s-1); }
  .dz-importador__titulo { margin: 0; font-size: var(--fs-6); font-weight: 600; line-height: var(--lh-1); color: var(--text); }
  .dz-importador__titulo:focus-visible { outline: none; box-shadow: none; }
  .dz-importador__apoyo { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-importador__cuerpo { display: grid; gap: var(--s-5); min-width: 0; }
  .dz-importador__panel[aria-busy="true"] .dz-importador__cuerpo { display: none; }
  .dz-importador__carga { display: grid; gap: var(--s-3); }
  .dz-importador__carga[hidden] { display: none; }
  .dz-importador__carga-larga[hidden] { display: none; }
  .dz-importador__carga-fila { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) minmax(0, 1fr); align-items: center; gap: var(--s-4); height: var(--h-fila); border-bottom: 1px solid var(--border); }
  .dz-importador__pie { display: flex; flex-wrap: wrap; gap: var(--s-2); justify-content: flex-end; padding-top: var(--s-4); border-top: 1px solid var(--border); }
  .dz-importador__pie > :first-child:not(.dz-boton--primario) { margin-right: auto; }
  .dz-importador__pie > [hidden] { display: none; }
  .dz-importador__deteccion .dz-tarjeta__cuerpo { display: grid; gap: var(--s-4); }
  .dz-importador__lectura { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--w-sub), 1fr)); gap: var(--s-4); align-items: start; }
  .dz-importador__encabezado-opcion { align-self: end; padding-bottom: var(--s-2); }
  .dz-importador__resumen { margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text); }
  .dz-importador__nota { margin: 0; font-size: var(--fs-1); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-importador__cruda .dz-tabla__celda { white-space: nowrap; }
  .dz-importador__col { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-importador__ejemplo { max-width: var(--w-celda); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-importador__mapa .dz-campo { min-width: var(--w-sub); }
  .dz-importador__sugerido { display: grid; gap: var(--s-1); justify-items: start; min-width: 0; }
  .dz-importador__chip-map { display: none; }
  .dz-importador__sugerido[data-estado-map="sugerido"] > [data-chip="sugerido"],
  .dz-importador__sugerido[data-estado-map="cambiado"] > [data-chip="cambiado"],
  .dz-importador__sugerido[data-estado-map="sin"] > [data-chip="sin"] { display: block; }
  .dz-importador__sugerido[data-estado-map="cambiado"] > .dz-importador__porque { display: none; }
  .dz-importador__porque { font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-importador__requisitos { display: grid; gap: var(--s-1); }
  .dz-importador__req { display: flex; align-items: center; gap: var(--s-2); margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-importador__req[data-ok="true"] .dz-importador__req-ico { color: var(--ok-text); }
  .dz-importador__req[data-ok="false"],
  .dz-importador__req[data-ok="false"] .dz-importador__req-ico { color: var(--bad-text); }
  .dz-importador__filtro { justify-self: start; }
  .dz-importador__previa .dz-tabla__celda { vertical-align: top; }
  .dz-importador__previa tr[hidden] { display: none; }
  .dz-importador__previa tr[hidden] { display: none; }
  .dz-importador__celda-error,
  .dz-importador__celda-dup { display: grid; gap: var(--s-1); }
  .dz-importador__valor-malo { color: var(--bad-text); text-decoration: underline wavy var(--bad); text-underline-offset: .2em; }
  .dz-importador__motivo { display: block; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-2); white-space: normal; }
  .dz-importador__motivo > .dz-ico { display: inline-block; vertical-align: text-bottom; margin-inline-end: var(--s-1); }
  .dz-importador__mas { justify-self: start; }
  .dz-importador__celda-error .dz-importador__motivo { color: var(--bad-text); }
  .dz-importador__politica { display: grid; gap: var(--s-2); margin: 0; padding: var(--s-4) var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface-anidada); min-width: 0; }
  .dz-importador__legend { float: left; width: 100%; padding: 0; margin: 0 0 var(--s-1); font-size: var(--fs-3); font-weight: 600; color: var(--text); }
  .dz-importador__cifras { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--w-cifra), 1fr)); gap: var(--s-3); }
  .dz-importador__cifra { display: grid; gap: var(--s-1); padding: var(--s-4) var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-importador__cifra > b { font-size: var(--fs-7); font-weight: 600; line-height: var(--lh-1); font-variant-numeric: tabular-nums; color: var(--text); }
  .dz-importador__cifra > span { font-size: var(--fs-2); color: var(--text-2); }
  .dz-importador__cifra--error > b { color: var(--bad-text); }
  .dz-importador__dos { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: var(--s-6); align-items: start; }
  .dz-importador__detalle { padding: var(--s-2) var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface-anidada); }
  .dz-importador__curso,
  .dz-importador__hecho,
  .dz-importador__detenido,
  .dz-importador__revertida { display: grid; gap: var(--s-4); }
  .dz-importador__curso[hidden],
  .dz-importador__hecho[hidden],
  .dz-importador__detenido[hidden],
  .dz-importador__revertida[hidden] { display: none; }
  .dz-importador__acciones-fin { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-importador__vivo { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  @media (max-width: 820px) {
    .dz-importador__dos { grid-template-columns: minmax(0, 1fr); }
    .dz-importador__barra { padding: var(--s-3) var(--s-4); }
  }
  @media (max-width: 560px) {
    /* Tumbaba el render de Chromium a 560 px o menos: una columna que además envuelve (flex-wrap: wrap) en el mismo árbol que la tabla apilada, que es un container-type.
       Medido: con nowrap, o con grid, no cae; con column-reverse tampoco hacía falta. La columna no envuelve y la primaria sube con order, sin column-reverse. */
    .dz-importador__pie { flex-direction: column; flex-wrap: nowrap; align-items: stretch; }
    .dz-importador__pie > .dz-boton--primario { order: -1; }
    .dz-importador__pie > :first-child:not(.dz-boton--primario) { margin-right: 0; }
    .dz-importador__pie .dz-boton { min-height: var(--h-tactil); }
    .dz-importador__acciones-fin .dz-boton { min-height: var(--h-tactil); }
    .dz-importador__mapa .dz-campo { min-width: 0; }
    .dz-importador__ejemplo { max-width: none; white-space: normal; }
    .dz-importador__filtro { flex-wrap: wrap; overflow: visible; }
  }
}

/* Línea de tiempo del lead: una cronología por día (encabezado pegajoso y lista), filtros por tipo en chips de dos estados, redactor de nota interna,
   pie con «Cargar más» y los estados cargando, error y vacío. Fundación: el hilo de actividad de la ficha de LeadZ (.lz-hilo). La fila de un evento es una
   rejilla de icono en aro de --h-mini, contenido y hora en tabulares; el cuerpo del evento (nota, último mensaje) usa la receta de la tarjeta anidada.
   Todo sale de un token; el único píxel suelto es el 1px de las líneas. Un solo corte, por contenedor, a 560 px. */
@layer dz.componentes {
  .dz-linea-tiempo { container-type: inline-size; position: relative; display: flex; flex-direction: column; min-width: 0; min-height: 0; background: var(--surface); color: var(--text); font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-linea-tiempo--alto { height: calc(var(--h-fila) * 14); }
  .dz-linea-tiempo__oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-linea-tiempo__anuncio { margin: 0; }

  /* Barra: filtros por tipo (chips de dos estados) y, a la derecha, lo que el producto quiera. */
  .dz-linea-tiempo__barra { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s-2) var(--s-3); padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--border); background: var(--surface); }
  .dz-linea-tiempo__filtros { display: flex; flex-wrap: wrap; gap: var(--s-1); min-width: 0; }
  .dz-linea-tiempo__cuenta { color: var(--text-muted); font-weight: 400; font-variant-numeric: tabular-nums; }
  .dz-chip[aria-pressed="true"] .dz-linea-tiempo__cuenta { color: inherit; }

  /* Cuerpo: lo único que se desplaza. */
  .dz-linea-tiempo__cuerpo { position: relative; flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }

  .dz-linea-tiempo__dia { min-width: 0; }
  /* Día: encabezado pegajoso con «Hoy», «Ayer» o la fecha; la fecha larga acompaña a Hoy y Ayer. Recibe el foco al cargar más. */
  .dz-linea-tiempo__fecha { position: sticky; top: 0; z-index: var(--z-sticky); margin: 0; padding: var(--s-2) var(--s-4); font-size: var(--fs-1); font-weight: 500; line-height: var(--lh-2); color: var(--text-muted); background: var(--surface); border-bottom: 1px solid var(--hairline); }
  .dz-linea-tiempo__fecha:focus-visible { outline: none; color: var(--text); }
  .dz-linea-tiempo__fecha-larga { font-weight: 400; }
  .dz-linea-tiempo__fecha-larga::before { content: "·"; margin-inline-end: var(--s-1); }

  /* Evento: icono en aro, contenido y hora a la derecha. */
  .dz-linea-tiempo__lista { list-style: none; margin: 0; padding: 0 var(--s-4); }
  .dz-linea-tiempo--registro .dz-linea-tiempo__evento { display: grid; grid-template-columns: var(--h-mini) minmax(0, 1fr) auto; column-gap: var(--s-3); align-items: start; padding: var(--s-3) 0; border-top: 1px solid var(--border); }
  .dz-linea-tiempo--registro .dz-linea-tiempo__evento:first-child { border-top: 0; }
  .dz-linea-tiempo__icono { display: inline-grid; place-items: center; width: var(--h-mini); height: var(--h-mini); border-radius: 50%; background: var(--surface-2); color: var(--text-2); }
  .dz-linea-tiempo__icono svg { width: var(--ico-1); height: var(--ico-1); } /* el aro de 24 (--h-mini) lleva el glifo a 16: a 12 los compuestos (llamada saliente, tareas, agenda) se fundían (ICB-73) */
  .dz-linea-tiempo__evento[data-tipo="nota"] .dz-linea-tiempo__icono { background: var(--surface-3); color: var(--text); }
  .dz-linea-tiempo__evento[data-resultado="fallo"] .dz-linea-tiempo__icono { background: var(--bad-soft); color: var(--bad-text); }
  .dz-linea-tiempo__evento[data-resultado="fallo"] .dz-linea-tiempo__titulo { color: var(--bad-text); }
  .dz-linea-tiempo__contenido { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-linea-tiempo__titulo { margin: 0; font-size: var(--fs-2); line-height: var(--lh-2); overflow-wrap: anywhere; }
  .dz-linea-tiempo__titulo b { font-weight: 500; }
  .dz-linea-tiempo__meta { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); overflow-wrap: anywhere; }
  .dz-linea-tiempo__hora { font-size: var(--fs-1); line-height: calc(var(--fs-2) * var(--lh-2)); color: var(--text-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
  .dz-linea-tiempo__duracion { font-variant-numeric: tabular-nums; }
  /* Cuerpo de un evento (la nota, el último mensaje): la receta de la tarjeta anidada. La prosa va a todo lo ancho. */
  .dz-linea-tiempo__cita { margin: var(--s-1) 0 0; padding: var(--s-2) var(--s-3); border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--surface-anidada); font-size: var(--fs-2); line-height: var(--lh-3); white-space: pre-wrap; overflow-wrap: anywhere; }
  .dz-linea-tiempo__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); margin-top: var(--s-1); }
  /* El encabezado pegajoso del día no tapa el control que recibe el foco (WCAG 2.4.11): al desplazarse para enfocarlo, se deja su alto libre arriba. */
  .dz-linea-tiempo__acciones > * { scroll-margin-top: var(--h-fila); }
  /* Lo recién llegado (nota guardada, evento en vivo) se asienta en --dur-4 desde la segunda superficie. */
  @keyframes dzLtNuevo { from { background: var(--surface-2); } }
  .dz-linea-tiempo__evento[data-nuevo] { animation: dzLtNuevo calc(var(--dur-4) * 3) var(--ease-out) both; }

  /* Pie: cuántos se ven y «Cargar N más». */
  .dz-linea-tiempo__pie { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--s-2) var(--s-3); padding: var(--s-3) var(--s-4); border-top: 1px solid var(--border); }
  .dz-linea-tiempo__pie--arriba { border-top: 0; border-bottom: 1px solid var(--border); }
  .dz-linea-tiempo__resumen { margin: 0; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }

  /* Estados: nada con ese filtro, cargando y error. El vacío de verdad es la pieza vacio. */
  .dz-linea-tiempo__nada { margin: 0; padding: var(--s-5) var(--s-4); font-size: var(--fs-2); color: var(--text-muted); }
  .dz-linea-tiempo__cargando { display: grid; gap: var(--s-4); padding: var(--s-4); }
  .dz-linea-tiempo__cargando-fila { display: grid; grid-template-columns: var(--h-mini) minmax(0, 1fr); gap: var(--s-2) var(--s-3); align-items: center; }
  .dz-linea-tiempo__cargando-fila .dz-esqueleto--circulo { width: var(--h-mini); height: var(--h-mini); }
  .dz-linea-tiempo__cargando-fila .dz-esqueleto--linea { grid-column: 2; }
  .dz-linea-tiempo__error { padding: var(--s-4); }

  /* Redactor de nota: un renglón plegado; al enfocar o con texto crece y aparece el pie con «Guardar nota». Siempre dice quién la ve. */
  .dz-linea-tiempo__redactor { display: grid; gap: var(--s-2); padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--border); }
  .dz-linea-tiempo__redactor--abajo { border-bottom: 0; border-top: 1px solid var(--border); }
  .dz-linea-tiempo__redactor-fila { display: flex; align-items: flex-start; gap: var(--s-3); }
  .dz-linea-tiempo__redactor-fila .dz-avatar { margin-top: calc((var(--h-control) - var(--h-mini)) / 2); }
  .dz-linea-tiempo__redactor-fila .dz-campo { flex: 1; min-width: 0; }
  .dz-linea-tiempo__redactor .dz-campo__control--area { min-height: var(--dz-dens-control, var(--h-control)); }
  .dz-linea-tiempo__redactor:is(:focus-within, [data-abierto]) .dz-campo__control--area { min-height: calc(var(--dz-dens-control, var(--h-control)) * 2); }
  .dz-linea-tiempo__redactor-pie { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-linea-tiempo__redactor-pie .dz-campo__ayuda { margin-right: auto; }
  .dz-linea-tiempo__redactor:not(:focus-within):not([data-abierto]) .dz-linea-tiempo__redactor-pie { display: none; }

  @container (max-width: 560px) {
    .dz-linea-tiempo__barra, .dz-linea-tiempo__pie, .dz-linea-tiempo__redactor, .dz-linea-tiempo__fecha, .dz-linea-tiempo__nada { padding-inline: var(--s-3); }
    .dz-linea-tiempo__lista { padding-inline: var(--s-3); }
    .dz-linea-tiempo__fecha-larga { display: none; }
  }
  @media (prefers-reduced-motion: reduce) { .dz-linea-tiempo__evento[data-nuevo] { animation: none; } }
}

/* Llamada en curso: el panel flotante del teléfono. Una columna de --w-telefono con hairline translúcido y sombra: el estado en una línea y el cronómetro en un chip, quién es,
   lo que se sabe de él en chips, la nota (un contenedor con rótulo: el foco va en el contorno y el textarea de adentro va sin anillo) y la barra de controles. Colgar es el
   único macizo de la barra y lleva el auricular relleno girado 135°. Teclado cambia la nota por el teclado de tonos. */
@layer dz.componentes {
  .dz-llamada-curso {
    display: flex;
    flex-direction: column;
    box-sizing: border-box;
    width: var(--w-telefono);
    max-width: calc(100vw - var(--s-4) * 2);
    overflow: hidden;
    border: 1px solid var(--hairline);
    border-radius: var(--r-4);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
  }
  .dz-llamada-curso__cabecera { padding: var(--s-4) var(--s-3) var(--s-2) var(--s-5); }
  .dz-llamada-curso__cabecera .dz-linea-estado__linea { gap: var(--s-3); font-size: var(--fs-3); }
  .dz-llamada-curso__reloj {
    display: inline-flex;
    align-items: center;
    height: var(--h-btn-ico);
    padding: 0 var(--s-3);
    box-sizing: border-box;
    border: 1px solid var(--hairline);
    border-radius: var(--r-pill);
    background: var(--surface-2);
    color: var(--text);
    font-size: var(--fs-3);
    font-weight: 500;
    line-height: 1;
    font-variant-numeric: tabular-nums;
  }
  .dz-llamada-curso__quien { display: flex; align-items: center; gap: var(--s-4); padding: var(--s-2) var(--s-5) var(--s-4); }
  .dz-llamada-curso__datos { display: grid; gap: var(--s-1); justify-items: start; min-width: 0; }
  .dz-llamada-curso__nombre { margin: 0; font-size: var(--fs-5); font-weight: 600; letter-spacing: -.01em; line-height: var(--lh-1); overflow-wrap: anywhere; }
  .dz-llamada-curso__empresa { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-llamada-curso__telefono { margin: 0; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-llamada-curso__chips { display: flex; flex-wrap: wrap; gap: var(--s-2); margin: 0; padding: 0 var(--s-5) var(--s-4); list-style: none; }
  .dz-llamada-curso__vista { display: grid; }
  .dz-llamada-curso__contexto { display: grid; gap: var(--s-3); padding: 0 var(--s-4) var(--s-4); }
  .dz-llamada-curso__nota {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--line-2);
    border-radius: var(--r-3);
    background: var(--surface-2);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  .dz-llamada-curso__nota:focus-within { border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-llamada-curso__nota-rotulo { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-3) var(--s-3) 0; font-size: var(--fs-1); font-weight: 500; color: var(--text-muted); cursor: text; }
  .dz-llamada-curso__nota-rotulo svg { width: var(--ico-1); height: var(--ico-1); flex: none; }
  .dz-llamada-curso__nota-texto,
  .dz-llamada-curso__nota-texto:focus,
  .dz-llamada-curso__nota-texto:focus-visible {
    display: block;
    width: 100%;
    min-height: var(--h-boton-llamada);
    box-sizing: border-box;
    padding: var(--s-1) var(--s-3) var(--s-3);
    border: 0;
    border-radius: 0;
    outline: none;
    box-shadow: none;
    animation: none;
    resize: none;
    background: transparent;
    color: var(--text);
    font-family: var(--font);
    font-size: var(--fs-2);
    line-height: var(--lh-3);
  }
  .dz-llamada-curso__nota-texto::placeholder { color: var(--text-muted); }
  .dz-llamada-curso__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-llamada-curso__tonos { display: grid; justify-items: center; }
  .dz-llamada-curso__tonos[hidden], .dz-llamada-curso__contexto[hidden] { display: none; }
  .dz-llamada-curso__barra { display: flex; gap: var(--s-2); padding: var(--s-4); border-top: 1px solid var(--hairline); }
  .dz-llamada-curso .dz-llamada-curso__control {
    flex: 1 1 0;
    flex-direction: column;
    justify-content: center;
    gap: var(--s-1);
    box-sizing: border-box;
    min-width: 0;
    height: calc(var(--h-boton-llamada) + var(--s-2));
    padding: 0;
    border-color: var(--hairline);
    border-radius: var(--r-3);
    background: var(--surface-2);
    font-size: var(--fs-1);
    font-weight: 500;
  }
  .dz-llamada-curso .dz-llamada-curso__control svg { width: var(--ico-3); height: var(--ico-3); }
  .dz-llamada-curso .dz-llamada-curso__control[aria-pressed="true"] { border-color: var(--line-2); background: var(--surface-3); color: var(--text); }
  .dz-llamada-curso .dz-llamada-curso__colgar { flex-grow: 1.4; border-color: var(--colgar-bg); background: var(--colgar-bg); color: var(--ink-on-colgar); font-weight: 600; }
  .dz-llamada-curso__rotulo { white-space: nowrap; }
  @media (prefers-reduced-motion: reduce) { .dz-llamada-curso__nota { transition: none; } }
}

/* Mapa: la dirección, "Abrir en Maps" y "Copiar dirección" van primero y siempre; debajo, el marco con el mapa de MapLibre GL, que es una mejora (sin
   red, sin JS o sin WebGL queda la dirección). El marco reserva su relación de aspecto antes de que llegue la biblioteca (16/9; con --alto, 2/1 con tope);
   sin min-height: junto con aspect-ratio lo convertiría en un ancho mínimo y a 390 px desbordaría.
   Las teselas se pintan en gris para que la capa de datos, el pin, mande; en oscuro se invierte el lienzo y NUNCA el pin, que es HTML. Los controles aparecen
   cuando el mapa está vivo. Pins y grupos miden 44 px (--h-tactil). El globo flota junto al pin y, a 560 px o menos, es una hoja inferior fija con área segura.
   La hoja de MapLibre no va en capa y le gana a dz.componentes: por eso la pieza no la contradice. MapLibre vive en un hijo propio (.dz-mapa__mapa, que mide
   el marco), el canvas lleva la clase dz-mapa__canvas (para invertirlo en oscuro) y la atribución es de la pieza, no del control de MapLibre. La atribución
   de OpenStreetMap nunca se oculta (licencia ODbL). */
@layer dz.componentes {
  .dz-mapa { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-mapa__direccion { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-4); margin: 0; font-size: var(--fs-2); color: var(--text); }
  .dz-mapa__direccion address { flex: 1 1 var(--w-sub); min-width: 0; font-style: normal; }
  .dz-mapa__direccion address span { display: block; color: var(--text-2); }
  .dz-mapa__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2) var(--s-3); }
  .dz-mapa__marco {
    position: relative;
    aspect-ratio: 16 / 9;
    width: 100%;
    min-width: 0;
    border: 1px solid var(--line-2);
    border-radius: var(--r-card);
    background: var(--surface-2);
    overflow: hidden;
  }
  .dz-mapa--alto .dz-mapa__marco { aspect-ratio: 2 / 1; max-height: calc(var(--h-fila-2) * 9); }
  /* El canvas enfocable lleva el anillo en el contorno del marco (nunca un segundo anillo dentro). */
  .dz-mapa--foco .dz-mapa__marco { box-shadow: var(--ring); }
  .dz-mapa__lienzo { position: absolute; inset: 0; width: 100%; height: 100%; }
  .dz-mapa__mapa { width: 100%; height: 100%; }
  [data-ds-theme="dark"] .dz-mapa__canvas { filter: invert(1) hue-rotate(180deg) brightness(.92); }
  /* Atribución del lienzo: la superficie del DS al 88 % con el texto secundario (6,1:1 o más en claro y oscuro); nunca se oculta. */
  .dz-mapa__atrib { position: absolute; right: 0; bottom: 0; z-index: var(--z-base); margin: 0; padding: var(--s-1) var(--s-2); border-start-start-radius: var(--r-2); background: color-mix(in oklch, var(--surface) 88%, transparent); color: var(--text-2); font-size: var(--fs-1); }
  .dz-mapa__cargando { position: absolute; inset: 0; z-index: var(--z-base); display: flex; align-items: center; justify-content: center; margin: 0; color: var(--text-2); font-size: var(--fs-2); pointer-events: none; }
  .dz-mapa__cargando[hidden] { display: none; }
  .dz-mapa__plantilla[hidden] { display: none; }
  /* Sin el mapa vivo no hay nada que acercar: los controles esperan. */
  .dz-mapa__controles { position: absolute; top: var(--s-2); right: var(--s-2); z-index: var(--z-base); display: none; gap: var(--s-1); }
  .dz-mapa--viva .dz-mapa__controles, .dz-mapa--muestra .dz-mapa__controles { display: grid; }
  .dz-mapa__controles .dz-boton { background: color-mix(in oklch, var(--surface) 92%, transparent); border-color: var(--hairline); }
  /* Con el estado a la vista el mapa no se opera: los controles se retiran en vez de quedar tenues bajo el velo. */
  .dz-mapa__marco:has(.dz-mapa__estado:not([hidden])) .dz-mapa__controles { visibility: hidden; }
  .dz-mapa__estado { position: absolute; inset: 0; z-index: calc(var(--z-base) + 1); display: flex; align-items: center; justify-content: center; padding: var(--s-4); background: color-mix(in oklch, var(--surface) 80%, transparent); }
  .dz-mapa__estado[hidden] { display: none; }
  .dz-mapa__estado .dz-aviso { max-width: var(--w-toast); }
  /* En pantalla angosta el aviso, con su texto y su botón, pasa de la altura 16 / 9 del marco y quedaba recortado abajo: con el estado a la vista el marco deja la relación de aspecto y el estado,
     en el flujo, lo estira; el hueco de abajo evita que la atribución del lienzo (siempre visible, ODbL) tape el botón. */
  @media (max-width: 560px) {
    .dz-mapa__marco:has(.dz-mapa__estado:not([hidden])) { aspect-ratio: auto; }
    .dz-mapa__estado { position: relative; inset: auto; min-height: calc(var(--h-tactil) * 4); padding-bottom: calc(var(--s-4) + var(--s-6)); }
  }
  /* Marcadores: botones de HTML, no dibujo en el canvas. El glifo (map-pin de Lucide) apoya su punta en la coordenada: el botón mide 44 px y el glifo va abajo. */
  /* El pin es un marcador relleno en la tinta del texto con el punto en la superficie (en oscuro la tinta es clara): destaca sobre las teselas grises en los dos temas.
     El glifo (map-pin de Lucide) mide unos 32 px de alto y apoya su punta en la coordenada: el botón mide 44 px, su borde inferior es la coordenada y el glifo
     baja por debajo de ese borde lo que el dibujo deja libre bajo la punta. */
  .dz-mapa__pin { display: inline-flex; align-items: flex-end; justify-content: center; width: var(--h-tactil); height: var(--h-tactil); margin: 0; padding: 0; border: 0; background: transparent; color: var(--text); cursor: pointer; }
  .dz-mapa__pin svg { flex: none; width: calc(var(--ico-5) * 1.6); height: calc(var(--ico-5) * 1.6); margin-bottom: calc(var(--ico-5) * -.15); fill: var(--text); stroke: var(--surface); stroke-width: 1.25; stroke-linejoin: round; filter: drop-shadow(0 2px 3px var(--c-negro-18)); }
  .dz-mapa__pin svg circle { fill: var(--surface); stroke: none; }
  .dz-mapa__pin[aria-expanded="true"] svg { fill: var(--chip-on-bg); color: var(--chip-on-bg); }
  .dz-mapa__pin:focus-visible { outline: none; }
  /* El aro de foco rodea el marcador entero, no el botón: la punta sigue en la coordenada. */
  .dz-mapa__pin:focus-visible svg { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: var(--r-pill); }
  .dz-mapa__grupo { display: inline-flex; align-items: center; justify-content: center; min-width: var(--h-tactil); height: var(--h-tactil); margin: 0; padding: 0 var(--s-2); border: 2px solid var(--surface); border-radius: var(--r-pill); background: var(--chip-on-bg); color: var(--chip-on-text); font: inherit; font-size: var(--fs-2); font-weight: 600; font-variant-numeric: tabular-nums; cursor: pointer; box-shadow: var(--shadow-md); }
  .dz-mapa__grupo:focus-visible { outline: none; box-shadow: var(--ring), var(--shadow-md); }
  /* El espécimen no tiene lienzo vivo: un pin estático al centro del marco. */
  .dz-mapa__marcador-muestra { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: var(--s-6); pointer-events: none; }
  .dz-mapa__pin-muestra { cursor: default; }
  .dz-mapa__globo {
    position: absolute;
    z-index: var(--z-dropdown);
    width: min(var(--w-popover), calc(100% - var(--s-4) * 2));
    padding: var(--s-3) var(--s-4);
    padding-inline-end: calc(var(--s-4) + var(--h-control-sm));
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    font-size: var(--fs-2);
  }
  .dz-mapa__globo[hidden] { display: none; }
  .dz-mapa__globo b { display: block; font-weight: 600; }
  .dz-mapa__globo p { margin: var(--s-1) 0 0; color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-mapa__globo .dz-enlace { margin-top: var(--s-1); }
  .dz-mapa__globo-cierra { position: absolute; top: var(--s-1); right: var(--s-1); }
  .dz-mapa__globo-muestra { left: var(--s-4); top: var(--s-4); }
  .dz-mapa__atribucion { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  @media (max-width: 560px) {
    /* Hoja inferior: el detalle del pin en teléfono (PCB-607, MCB-348). Fija, de borde a borde y con el área segura. */
    .dz-mapa__globo:not(.dz-mapa__globo-muestra) {
      position: fixed;
      inset-inline: 0;
      top: auto;
      bottom: env(safe-area-inset-bottom);
      z-index: var(--z-drawer);
      width: auto;
      padding: var(--s-4);
      padding-inline-end: calc(var(--s-4) + var(--h-tactil));
      padding-bottom: calc(var(--s-4) + env(safe-area-inset-bottom));
      border-width: 1px 0 0;
      border-radius: var(--r-card) var(--r-card) 0 0;
      font-size: var(--fs-3);
    }
    :root:has(.dz-cascaron:not(.dz-cascaron--incrustado)) .dz-mapa__globo:not(.dz-mapa__globo-muestra) { bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom)); }
    .dz-mapa__globo .dz-enlace { min-height: var(--h-tactil); }
    .dz-mapa__globo-cierra { top: var(--s-2); right: var(--s-2); }
    .dz-mapa__direccion { gap: var(--s-2); }
  }
  @media (pointer: coarse) {
    .dz-mapa__controles .dz-boton { width: var(--h-tactil); height: var(--h-tactil); }
  }
  /* Colores forzados: el pin con Canvas y CanvasText, el grupo con Highlight. */
  @media (forced-colors: active) {
    .dz-mapa__pin svg { forced-color-adjust: none; fill: CanvasText; stroke: Canvas; color: CanvasText; }
    .dz-mapa__pin svg circle { fill: Canvas; }
    .dz-mapa__grupo { forced-color-adjust: none; background: Highlight; color: HighlightText; }
  }
}

/* Matriz de permisos: roles en columnas, permisos agrupados por área en filas. La región se desplaza en los dos ejes y deja fijas la cabecera
   de columna (arriba) y la de fila (a la izquierda), con la esquina por encima de las dos. Usa la tabla del DS por composición (dz-tabla,
   dz-tabla__titulo, dz-tabla__celda) y no la región de la tabla, cuyo desvanecido en los bordes taparía lo que queda fijo. En un contenedor
   de 560 px o menos la primera columna se estrecha y los permisos largos pasan a dos líneas; la tabla se desplaza de lado.
   Una celda cambiada lleva fondo de aviso y una barra a la izquierda (la forma dice lo que el color acompaña). Una celda bloqueada (el Dueño,
   o todo cuando no se puede editar) no es disabled: sigue en el recorrido del teclado y su razón está enlazada con aria-describedby. */
@layer dz.componentes {
  .dz-matriz-permisos { display: grid; gap: var(--s-4); container-type: inline-size; min-width: 0; }

  /* Razones visibles: por qué un rol no se edita. */
  .dz-matriz-permisos__notas { display: grid; gap: var(--s-2); margin: 0; padding: 0; list-style: none; }
  .dz-matriz-permisos__nota { display: flex; align-items: center; gap: var(--s-2); font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-matriz-permisos__nota > svg { flex: none; color: var(--text-muted); }
  .dz-matriz-permisos__nota-texto { flex: 1 1 0; min-width: 0; }
  .dz-matriz-permisos__nota strong { font-weight: 600; color: var(--text); }

  .dz-matriz-permisos__region {
    position: relative;
    min-width: 0;
    max-width: 100%;
    max-height: min(calc(var(--h-fila) * 16), 80dvh);
    overflow: auto;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
  }
  .dz-matriz-permisos__tabla { width: 100%; min-width: max-content; }
  /* El foco no queda tapado por lo que está fijo: la cabecera de arriba y la primera columna. */
  .dz-matriz-permisos__region { scroll-padding-block-start: calc(var(--h-fila) * 2); scroll-padding-inline-start: var(--w-celda); }

  /* Cabecera de columna: nombre del rol, su estado y el resumen. Mono y mayúscula solo en el nombre; el resumen es texto corriente. */
  .dz-matriz-permisos__titulo-rol,
  .dz-matriz-permisos__titulo-esquina {
    position: sticky;
    top: 0;
    z-index: calc(var(--z-sticky) + 3);
    height: auto;
    padding: var(--s-2) var(--s-3);
    background: var(--surface);
    vertical-align: top;
  }
  .dz-matriz-permisos__titulo-rol { min-width: var(--w-celda); text-align: center; }
  .dz-matriz-permisos__rol-nombre { display: inline-flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--s-1) var(--s-2); }
  .dz-matriz-permisos__rol-nombre > svg { flex: none; }
  .dz-matriz-permisos__rol-estado { font-family: var(--font); letter-spacing: 0; text-transform: none; }
  .dz-matriz-permisos__resumen {
    display: block;
    margin-top: var(--s-1);
    font-family: var(--font);
    font-size: var(--fs-2);
    font-weight: 400;
    letter-spacing: 0;
    text-transform: none;
    color: var(--text-muted);
    font-variant-numeric: tabular-nums;
  }
  .dz-matriz-permisos__cambiar-dueno { flex: none; }

  /* Primera columna: fija a la izquierda. La esquina lleva la capa más alta. */
  .dz-matriz-permisos__titulo-esquina,
  .dz-matriz-permisos__fila-titulo,
  .dz-matriz-permisos__grupo-titulo {
    left: 0;
    min-width: var(--w-cifra);
    max-width: var(--w-celda);
    text-align: left;
    border-right: 1px solid var(--line-2);
  }
  .dz-matriz-permisos__titulo-esquina { z-index: calc(var(--z-sticky) + 4); vertical-align: bottom; }
  .dz-matriz-permisos__fila-titulo {
    position: sticky;
    z-index: calc(var(--z-sticky) + 1);
    padding: var(--s-2) var(--s-3);
    background: var(--surface);
    font-weight: 500;
    line-height: var(--lh-2);
    white-space: normal;
    overflow-wrap: anywhere;
  }
  .dz-matriz-permisos__permiso { display: block; }
  .dz-matriz-permisos__sensible { margin-top: var(--s-1); }

  /* Fila de área: banda con el nombre fijo a la izquierda y el resto de la fila vacío. */
  .dz-matriz-permisos__grupo-titulo {
    position: sticky;
    z-index: calc(var(--z-sticky) + 1);
    height: var(--dz-dens-barra, var(--h-barra));
    padding: 0 var(--s-3);
    border-top: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
    background: var(--surface-2);
    font-family: var(--mono-code);
    font-size: var(--fs-1);
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--text-muted);
    white-space: nowrap;
  }
  .dz-matriz-permisos__grupo-relleno { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); background: var(--surface-2); }
  .dz-matriz-permisos__grupo:first-of-type .dz-matriz-permisos__grupo-titulo,
  .dz-matriz-permisos__grupo:first-of-type .dz-matriz-permisos__grupo-relleno { border-top: 0; }

  /* Celdas: el control ocupa la celda entera para que el área que se toca sea la celda. */
  .dz-matriz-permisos__celda { padding: 0 var(--s-1); text-align: center; vertical-align: middle; }
  .dz-matriz-permisos__casilla { display: flex; justify-content: center; width: 100%; min-height: var(--dz-dens-fila, var(--h-fila)); }
  .dz-matriz-permisos__alcance { margin-block: var(--s-1); }
  .dz-matriz-permisos__alcance .dz-control-segmentado__opcion { padding: 0 var(--s-2); }
  @media (pointer: coarse) {
    .dz-matriz-permisos__casilla { min-height: var(--h-tactil); }
  }
  /* Bloqueada: se lee y se enfoca, no se cambia. */
  .dz-matriz-permisos .dz-casilla__control[aria-disabled="true"],
  .dz-matriz-permisos .dz-casilla:has(.dz-casilla__control[aria-disabled="true"]) { cursor: not-allowed; }
  .dz-matriz-permisos .dz-casilla:has(.dz-casilla__control[aria-disabled="true"]) .dz-casilla__caja { opacity: var(--op-off); }
  .dz-matriz-permisos .dz-control-segmentado:has(.dz-control-segmentado__opcion[aria-disabled="true"]) { opacity: var(--op-off); }
  .dz-matriz-permisos .dz-control-segmentado__opcion[aria-disabled="true"] { cursor: not-allowed; }
  /* Cambiada: fondo de aviso y barra a la izquierda; gana al hover de la fila. */
  .dz-matriz-permisos .dz-tabla__fila .dz-matriz-permisos__celda[data-dz-cambiada] { background: var(--warn-soft); box-shadow: inset var(--s-1) 0 0 var(--warn); }

  /* Teclas: la ayuda en lista, discreta bajo la tabla. */
  .dz-matriz-permisos__teclas { font-size: var(--fs-2); color: var(--text-muted); }

  /* Antes y después de cada cambio pendiente. */
  .dz-matriz-permisos__pendientes { display: grid; gap: var(--s-2); }
  .dz-matriz-permisos__pendientes-titulo { margin: 0; font-size: var(--fs-2); font-weight: 600; color: var(--text); }
  .dz-matriz-permisos__cambios { display: grid; margin: 0; padding: 0; list-style: none; }
  .dz-matriz-permisos__cambio { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2) var(--s-4); padding: var(--s-2) 0; border-top: 1px solid var(--border); font-size: var(--fs-2); }
  .dz-matriz-permisos__cambio:first-child { border-top: 0; }
  .dz-matriz-permisos__cambio-quien { min-width: 0; color: var(--text); }
  .dz-matriz-permisos__cambio-valores { display: inline-flex; align-items: center; gap: var(--s-2); color: var(--text-muted); }
  .dz-matriz-permisos__cambio-par { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-matriz-permisos__cambio-rotulo { color: var(--text-muted); }
  .dz-matriz-permisos__cambio-nota { flex-basis: 100%; color: var(--text-muted); font-size: var(--fs-1); }
  .dz-matriz-permisos__cambios--confirma { margin-top: var(--s-2); }
  .dz-matriz-permisos__molde { display: none; }

  /* Pie con el estado y las acciones. */
  .dz-matriz-permisos__pie { margin-top: 0; }

  /* Anuncio de cada cambio: solo para el lector de pantalla. */
  .dz-matriz-permisos__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }

  @container (max-width: 560px) {
    .dz-matriz-permisos__titulo-esquina,
    .dz-matriz-permisos__fila-titulo,
    .dz-matriz-permisos__grupo-titulo { min-width: calc(var(--s-8) * 2 + var(--s-7)); max-width: calc(var(--s-8) * 2 + var(--s-7)); padding-inline: var(--s-2); }
    .dz-matriz-permisos__nota { flex-wrap: wrap; align-items: flex-start; }
    .dz-matriz-permisos__nota-texto { flex-basis: calc(100% - var(--s-6)); }
    .dz-matriz-permisos__grupo-titulo { white-space: normal; }
    .dz-matriz-permisos__titulo-rol { padding-inline: var(--s-2); }
    .dz-matriz-permisos__cambio { align-items: flex-start; flex-direction: column; }
  }
  @media (forced-colors: active) {
    .dz-matriz-permisos .dz-tabla__fila .dz-matriz-permisos__celda[data-dz-cambiada] { forced-color-adjust: none; box-shadow: inset var(--s-1) 0 0 Highlight; background: Canvas; }
  }
}

/* Misiones: tablero flotante abajo a la derecha (hoja inferior en teléfono) y su píldora. No es modal: no tiene velo, no atrapa el foco ni inerta el panel. Superficie
   normal: hairline y sombra del sistema, un solo trazo. La marca de cada misión cuenta el orden o, hecha, muestra la palomita (se dibuja una sola vez); el estado va en
   texto para quien no ve. La píldora es un botón del sistema con la cuenta, siempre a un clic. */
@layer dz.componentes {
  .dz-misiones { display: contents; }
  .dz-misiones--muestra { display: block; }
  .dz-misiones__tablero { position: fixed; right: var(--s-6); bottom: calc(var(--s-6) + env(safe-area-inset-bottom)); z-index: var(--z-fab); display: flex; flex-direction: column; width: min(calc(var(--w-modal) - var(--s-6)), calc(100vw - var(--s-6) * 2)); max-height: calc(100dvh - var(--cascaron-top) - var(--s-6) * 2); border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--surface); color: var(--text); box-shadow: var(--shadow-md); transform-origin: bottom right; animation: dzMisionesEntra var(--dur-3) var(--ease-enfasis) backwards; }
  .dz-misiones__tablero:focus { outline: none; }
  .dz-misiones__cab { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-4) var(--s-3) var(--s-2) var(--s-5); }
  .dz-misiones__titulo { flex: 1 1 auto; margin: 0; font-size: var(--fs-4); font-weight: 500; letter-spacing: -.012em; }
  .dz-misiones__titulo:focus-visible { outline: none; box-shadow: none; }
  .dz-misiones__apoyo { margin: 0; padding: 0 var(--s-5); font-size: var(--fs-2); color: var(--text-2); }
  .dz-misiones__progreso { padding: var(--s-3) var(--s-5) var(--s-2); }
  .dz-misiones__lista { flex: 1 1 auto; min-height: 0; margin: 0; padding: 0 var(--s-3) var(--s-2); overflow: auto; overscroll-behavior: contain; list-style: none; }
  .dz-misiones__mision { display: grid; grid-template-columns: var(--h-control-xs) minmax(0, 1fr) auto; gap: var(--s-1) var(--s-2); align-items: center; padding: var(--s-2); border-radius: var(--r-control); }
  .dz-misiones__mision + .dz-misiones__mision { border-top: 1px solid var(--border); }
  .dz-misiones__marca { display: inline-grid; place-items: center; width: var(--h-control-xs); height: var(--h-control-xs); border: 1px solid var(--border-control); border-radius: 50%; background: var(--surface); color: var(--text-2); font-size: var(--fs-1); font-weight: 600; }
  .dz-misiones__mision[data-estado="hecha"] .dz-misiones__marca { border-color: var(--ok); background: var(--ok-soft); color: var(--ok-text); }
  .dz-misiones__marca svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-misiones__marca svg path { stroke-dasharray: 1; }
  .dz-misiones__mision[data-recien] .dz-misiones__marca svg path { animation: dzMisionTraza var(--dur-4) var(--ease-out) backwards; }
  .dz-misiones__cuerpo { min-width: 0; }
  .dz-misiones__nombre { margin: 0; font-weight: 500; color: var(--text); }
  .dz-misiones__mision[data-estado="hecha"] .dz-misiones__nombre { color: var(--text-2); }
  .dz-misiones__detalle { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-misiones__sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-misiones__ir { grid-column: 3; grid-row: 1 / span 2; }
  .dz-misiones__mision[data-estado="hecha"] .dz-misiones__ir { visibility: hidden; }
  .dz-misiones__pie { margin: 0; padding: var(--s-2) var(--s-5) var(--s-4); border-top: 1px solid var(--border); font-size: var(--fs-1); color: var(--text-muted); }
  .dz-misiones__fin { padding: 0 var(--s-4) var(--s-4); }
  .dz-misiones__fin-acciones { display: flex; flex-direction: column; gap: var(--s-2); }
  .dz-misiones__pildora { position: fixed; right: var(--s-6); bottom: calc(var(--s-6) + env(safe-area-inset-bottom)); z-index: var(--z-fab); border-color: var(--hairline); background: var(--surface); box-shadow: var(--shadow-md); animation: dzMisionesEntra var(--dur-3) var(--ease-enfasis) backwards; }
  .dz-misiones__n { display: inline-flex; align-items: center; height: var(--h-mini); padding: 0 var(--s-2); border-radius: var(--r-chip); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-1); font-variant-numeric: tabular-nums; }
  .dz-misiones__pildora[data-dz-estado="hecha"] .dz-misiones__n { background: var(--ok-soft); color: var(--ok-text); }
  .dz-misiones__modelo { display: none; }
  .dz-misiones__vivo { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  /* En una ficha o una captura se pinta en su sitio, sin flotar. */
  .dz-misiones--muestra .dz-misiones__tablero, .dz-misiones--muestra .dz-misiones__pildora { position: static; animation: none; }
  .dz-misiones--muestra .dz-misiones__tablero { width: 100%; max-height: none; }
  @keyframes dzMisionesEntra { from { opacity: 0; transform: translateY(var(--s-2)) scale(.98); } }
  @keyframes dzMisionTraza { from { stroke-dashoffset: 1; } }
  @media (max-width: 560px) {
    .dz-misiones__tablero { right: var(--s-2); left: var(--s-2); bottom: calc(var(--cascaron-bar) + var(--s-2) + env(safe-area-inset-bottom)); width: auto; max-height: calc(100dvh - var(--cascaron-top) - var(--cascaron-bar) - var(--s-4) * 2); transform-origin: bottom center; }
    .dz-misiones__pildora { right: var(--s-3); bottom: calc(var(--cascaron-bar) + var(--s-3) + env(safe-area-inset-bottom)); }
  }
  @media (pointer: coarse) { .dz-misiones__ir { min-height: var(--h-tactil); } }
  @media (prefers-reduced-motion: reduce) { .dz-misiones__tablero, .dz-misiones__pildora, .dz-misiones__mision[data-recien] .dz-misiones__marca svg path { animation: none; } }
  [data-dz-movimiento="reducido"] :is(.dz-misiones__tablero, .dz-misiones__pildora, .dz-misiones__mision[data-recien] .dz-misiones__marca svg path) { animation: none; }
  @media (forced-colors: active) { .dz-misiones__marca, .dz-misiones__tablero, .dz-misiones__pildora { border: 1px solid CanvasText; } }
}

/* Modal: caja centrada sobre un velo. Dos anchos, 440 (--w-modal) y 760 (--w-modal-ancho); el ancho no se cierra con el velo. Los dos llevan
   hairline translúcido además de la sombra. Nace con hidden; entra con el velo que funde y la caja que sube y crece desde 96 %, y sale en
   menos tiempo y sin escala (la salida pone data-dz-saliendo y espera la transición). --muestra lo pinta en su sitio, para fichas y capturas. */
@layer dz.componentes {
  .dz-modal {
    position: fixed;
    inset: 0;
    z-index: var(--z-hoja);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--s-5);
    background: color-mix(in oklch, var(--text) 45%, transparent);
    opacity: 1;
    transition: opacity var(--dur-2) var(--ease-out), display var(--dur-2) allow-discrete;
    touch-action: manipulation;
    overscroll-behavior: contain;
  }
  [data-ds-theme="dark"] .dz-modal { background: color-mix(in oklch, var(--bg) 70%, transparent); }
  .dz-modal[hidden] { display: none; opacity: 0; transition: opacity var(--dur-1) var(--ease-out), display var(--dur-1) allow-discrete; }
  .dz-modal[data-dz-saliendo] { opacity: 0; transition-duration: var(--dur-1); }
  .dz-modal__caja {
    width: min(var(--w-modal), 94vw);
    max-height: calc(100dvh - var(--s-5) * 2);
    display: flex;
    flex-direction: column;
    overflow: hidden;
    padding: var(--s-6);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    transition: transform var(--dur-2) var(--ease-out), opacity var(--dur-2) var(--ease-out);
  }
  .dz-modal__caja:focus-visible { outline: none; }
  .dz-modal--ancho .dz-modal__caja { width: min(var(--w-modal-ancho), 94vw); }
  @starting-style {
    .dz-modal:not([hidden]) { opacity: 0; }
    .dz-modal:not([hidden]) .dz-modal__caja { opacity: 0; transform: translateY(var(--s-1)) scale(.96); }
  }
  .dz-modal[data-dz-saliendo] .dz-modal__caja { opacity: 0; transition-duration: var(--dur-1); }
  .dz-modal__cabecera { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--s-3); margin-bottom: var(--s-3); }
  .dz-modal--ancho .dz-modal__cabecera { margin: calc(var(--s-6) * -1) calc(var(--s-6) * -1) var(--s-4); padding: var(--s-4) var(--s-6); border-bottom: 1px solid var(--hairline); align-items: center; }
  .dz-modal__titulo { margin: 0; font-size: var(--fs-5); font-weight: 500; letter-spacing: -.02em; line-height: var(--lh-2); }
  .dz-modal__cerrar { flex: none; margin-right: calc(var(--s-2) * -1); }
  .dz-modal__descripcion { margin: 0 0 var(--s-3); font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  /* Solo el cuerpo se desplaza: la cabecera con su ✕ y las acciones quedan a la vista en un modal alto (PCB-1998). El relleno de 1 px
     que se descuenta con el margen deja respirar al anillo de foco de los campos de los bordes. */
  .dz-modal__caja > * { flex: none; }
  .dz-modal__caja > .dz-modal__cuerpo { flex: 0 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior-y: contain; margin: calc(var(--s-1) * -1); padding: var(--s-1); }
  .dz-modal__cuerpo { font-size: var(--fs-2); line-height: var(--lh-3); }
  :where(.dz-modal__cuerpo > p) { margin: 0 0 var(--s-2); }
  .dz-modal__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); justify-content: flex-end; margin-top: var(--s-5); }
  .dz-modal--muestra { position: static; z-index: auto; display: block; padding: 0; background: none; transition: none; }
  [data-ds-theme="dark"] .dz-modal--muestra { background: none; }
  .dz-modal--muestra .dz-modal__caja { max-width: 100%; margin: 0 auto; transition: none; }
  @media (max-width: 560px) {
    .dz-modal__acciones { flex-direction: column-reverse; align-items: stretch; }
    .dz-modal__acciones > * { width: 100%; justify-content: center; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-modal, .dz-modal__caja { transition: none; }
  }
}

/* Papelera: lo eliminado, con su ventana, para restaurarlo o eliminarlo para siempre. Organismo de piezas que ya existen (filtros, tabla, barra de
   lote, confirmación, toast, vacío, esqueleto, aviso); aquí solo viven su ritmo, la celda del tipo y la de «Vence». Una nota de ventana arriba, el
   buscador y la tabla debajo. «Vence en 23 días» lleva la cifra tabular; con tres días o menos pasa a un chip de aviso con icono y palabra, y vencido es
   un chip rojo con la razón en texto bajo él (un control deshabilitado dice por qué, a la vista). Los vacíos y el aviso de error ocupan el lugar de la
   tabla. La región viva va fuera de la vista y dice lo que pasó (restauró, eliminó, cuántos hay). */
@layer dz.componentes {
  .dz-papelera { display: grid; gap: var(--s-4); min-width: 0; }
  .dz-papelera__cabecera { display: grid; gap: var(--s-1); }
  .dz-papelera__ventana,
  .dz-papelera__permiso { display: flex; align-items: flex-start; gap: var(--s-2); margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-papelera__ventana > .dz-ico,
  .dz-papelera__permiso > .dz-ico { flex: none; margin-block: calc((var(--fs-2) * var(--lh-3) - var(--ico-1)) / 2); color: var(--text-muted); }
  .dz-papelera__permiso { color: var(--warn-text); }
  .dz-papelera__permiso > .dz-ico { color: inherit; }
  .dz-papelera__filtros[hidden] { display: none; }
  .dz-papelera__cuenta { margin: calc(var(--s-2) * -1) 0 0; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-papelera__tipo { display: inline-flex; vertical-align: middle; align-items: center; gap: var(--s-2); white-space: nowrap; color: var(--text-2); }
  .dz-papelera__tipo > .dz-ico { flex: none; color: var(--text-muted); }
  .dz-papelera__cuando { white-space: nowrap; color: var(--text-2); }
  .dz-papelera__cifra { font-variant-numeric: tabular-nums; }
  .dz-papelera__vence { color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-papelera__vence--vencido { display: inline-flex; flex-direction: column; align-items: flex-start; gap: var(--s-1); }
  .dz-papelera__nota { font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-papelera__restaurar { justify-self: start; white-space: nowrap; }
  .dz-papelera__vacio:focus-visible { outline: none; border-radius: var(--r-card); box-shadow: var(--ring); }
  .dz-papelera__cargando { display: grid; }
  .dz-papelera__esqueleto { display: grid; grid-template-columns: auto minmax(0, 2fr) minmax(0, 1fr); align-items: center; gap: var(--s-4); height: var(--h-fila); padding: 0 var(--s-2); border-bottom: 1px solid var(--border); }
  .dz-papelera__esqueleto > .dz-esqueleto--circulo { width: var(--ico-3); height: var(--ico-3); }
  .dz-papelera__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  @media (max-width: 560px) {
    .dz-papelera__vence--vencido { flex-direction: row; flex-wrap: wrap; }
  }
}

/* Editor de plantillas de WhatsApp: crear, editar y versionar la plantilla que Meta aprueba. Editor a la izquierda (7fr) y previa pegada a la derecha (5fr); a 1100 px o menos, una
   columna con la previa primero y el cupo al final. La previa usa las clases de burbuja del hilo de mensajes (la burbuja real del Inbox). Cada variable resuelta es un <mark>
   sobre la selección con una línea inferior en el acento (el texto hereda su color: contraste de texto sobre --sel-bg); la que no tiene dato va en el par de aviso, con
   la clave en mono. Las reglas de Meta son renglones con icono y texto (nunca solo color); el campo no se marca inválido mientras se escribe: la lista informa, el error
   bloquea solo al enviar. Foco en el contorno de cada campo (los campos del DS), nunca en el input interno. */
@layer dz.componentes {
  /* Contenedor de sí misma: los cortes responden al ancho que la pieza tiene (un panel de 406 px en una ventana de 1280), no al de la ventana (PCB-2024). */
  .dz-plantilla-wa { container-type: inline-size; inline-size: 100%; display: grid; gap: var(--s-6); min-width: 0; color: var(--text); }
  .dz-plantilla-wa__arriba { display: grid; gap: var(--s-4); }
  .dz-plantilla-wa__tecnico { font-family: var(--mono-code); font-size: var(--fs-1); color: var(--text-muted); }
  .dz-plantilla-wa__tecnico code { font: inherit; }
  .dz-plantilla-wa__chips { display: flex; flex-wrap: wrap; gap: var(--s-1); }
  .dz-plantilla-wa__columnas { display: grid; grid-template-columns: minmax(0, 7fr) minmax(var(--w-cajon), 5fr); gap: var(--s-7); align-items: start; }
  .dz-plantilla-wa__der { position: sticky; top: var(--s-4); display: grid; gap: var(--s-5); min-width: 0; }
  .dz-plantilla-wa__izq { min-width: 0; }
  .dz-plantilla-wa__editor { display: grid; gap: var(--s-6); min-width: 0; }
  .dz-plantilla-wa__identidad { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4); }
  .dz-plantilla-wa__seccion { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-plantilla-wa__rotulo { margin: 0; font-size: var(--fs-2); font-weight: 500; color: var(--text); }
  .dz-plantilla-wa__opcional { font-weight: 400; color: var(--text-muted); }
  .dz-plantilla-wa__cuerpo-cab { display: flex; justify-content: space-between; align-items: baseline; gap: var(--s-3); }
  .dz-plantilla-wa__contador { font-size: var(--fs-1); font-variant-numeric: tabular-nums; color: var(--text-muted); }
  .dz-plantilla-wa__contador[data-pasa] { color: var(--bad-text); }
  .dz-plantilla-wa__herramientas { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-plantilla-wa__insertar .dz-menu__panel { width: var(--w-cajon); max-width: calc(100vw - var(--s-6)); }
  .dz-plantilla-wa__item-campo { display: grid; gap: 0; text-align: start; }
  .dz-plantilla-wa__item-campo code { font-family: var(--mono-code); font-size: var(--fs-1); }
  .dz-plantilla-wa__item-campo > span { font-size: var(--fs-1); color: var(--text-muted); }
  .dz-plantilla-wa__usadas { display: flex; flex-wrap: wrap; gap: var(--s-1); }
  .dz-plantilla-wa__usadas .dz-chip code { font-family: var(--mono-code); font-size: var(--fs-1); }
  .dz-plantilla-wa__reglas { display: grid; gap: var(--s-1); padding: var(--s-3) var(--s-4); border: 1px solid var(--border); border-radius: var(--r-control); background: var(--surface-anidada); }
  .dz-plantilla-wa__regla { display: flex; align-items: flex-start; gap: var(--s-2); margin: 0; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-plantilla-wa__regla .dz-ico { flex: none; margin-top: calc((var(--fs-2) * var(--lh-3) - var(--ico-1)) / 2); }
  .dz-plantilla-wa__regla[data-ok="true"] .dz-ico { color: var(--ok-text); }
  .dz-plantilla-wa__regla[data-ok="false"] { color: var(--bad-text); }
  .dz-plantilla-wa__regla[data-ok="false"] .dz-ico { color: var(--bad-text); }
  .dz-plantilla-wa__boton-lista { display: grid; gap: var(--s-2); }
  .dz-plantilla-wa__boton-fila { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr) auto; gap: var(--s-2); align-items: start; }
  .dz-plantilla-wa__boton-fila .dz-boton--icono { grid-column: 3; grid-row: 1; }
  .dz-plantilla-wa__boton-url { grid-column: 1 / span 2; grid-row: 2; display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: var(--s-2); }
  .dz-plantilla-wa__boton-url[hidden] { display: none; }
  .dz-plantilla-wa__previa { display: grid; gap: var(--s-3); padding: var(--s-4) var(--s-5); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-plantilla-wa__previa-cab { display: flex; justify-content: space-between; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
  .dz-plantilla-wa__previa-t { margin: 0; font-size: var(--fs-4); font-weight: 600; }
  .dz-plantilla-wa__esqueleto { display: grid; gap: var(--s-2); }
  .dz-plantilla-wa__esqueleto[hidden], [data-previa][hidden] { display: none; }
  .dz-plantilla-wa__log { min-height: 0; max-height: none; }
  .dz-plantilla-wa__burbuja { max-width: 100%; animation: none; }
  .dz-plantilla-wa__var { padding: 0 var(--s-1); border-radius: var(--r-1); background: var(--sel-bg); color: inherit; box-shadow: inset 0 calc(var(--s-1) * -0.5) 0 var(--accent-control); }
  .dz-plantilla-wa__var--hueco { background: var(--warn-soft); color: var(--warn-text); box-shadow: inset 0 calc(var(--s-1) * -0.5) 0 var(--warn); font-family: var(--mono-code); font-size: var(--fs-1); }
  .dz-plantilla-wa__encabezado-texto { margin: 0 0 var(--s-1); font-weight: 600; }
  .dz-plantilla-wa__media { display: grid; place-items: center; gap: var(--s-1); aspect-ratio: 16 / 9; margin: calc(var(--s-1) * -1) calc(var(--s-2) * -1) var(--s-2); border-radius: var(--r-2); background: var(--surface-3); color: var(--text-2); font-size: var(--fs-1); }
  .dz-plantilla-wa__media--imagen { aspect-ratio: 16 / 9; }
  .dz-plantilla-wa__media--documento { aspect-ratio: auto; min-height: var(--h-fila-2); grid-auto-flow: column; justify-content: start; padding: 0 var(--s-3); }
  .dz-plantilla-wa__pie-texto { margin: var(--s-1) 0 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-plantilla-wa__botones-previa { display: grid; gap: var(--s-1); align-self: flex-end; width: min(78%, var(--w-lectura)); }
  .dz-plantilla-wa__boton-previa { display: inline-flex; justify-content: center; align-items: center; gap: var(--s-2); min-height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0 var(--s-3); border-radius: var(--r-3); background: var(--hilo-out, var(--accent-soft)); color: var(--accent-text); font-size: var(--fs-2); font-weight: 500; }
  .dz-plantilla-wa__previa-pie { display: grid; gap: var(--s-2); }
  .dz-plantilla-wa__previa-nota { margin: 0; font-size: var(--fs-1); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-plantilla-wa__previa-datos { border-top: 1px solid var(--border); }
  .dz-plantilla-wa__cupo { display: grid; gap: var(--s-3); }
  .dz-plantilla-wa__cupo-nota { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-plantilla-wa__pie { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: var(--s-3); padding-top: var(--s-4); border-top: 1px solid var(--border); }
  .dz-plantilla-wa__veredicto { flex: 1 1 var(--w-cajon); min-width: 0; }
  .dz-plantilla-wa__razon { font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-2); }
  .dz-plantilla-wa__razon[data-tono="error"] { color: var(--bad-text); }
  .dz-plantilla-wa__razon[data-tono="aviso"] { color: var(--warn-text); }
  .dz-plantilla-wa__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); }
  .dz-plantilla-wa__comparar { display: grid; gap: var(--s-1); font-size: var(--fs-1); color: var(--text-2); }
  .dz-plantilla-wa__comparar > span { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-plantilla-wa__modelos { display: none; }
  @container (max-width: 1100px) {
    .dz-plantilla-wa__columnas { grid-template-columns: minmax(0, 1fr); gap: var(--s-5); }
    .dz-plantilla-wa__der { display: contents; }
    .dz-plantilla-wa__previa { order: -1; }
  }
  @container (max-width: 560px) {
    .dz-plantilla-wa__identidad { grid-template-columns: minmax(0, 1fr); }
    .dz-plantilla-wa__boton-fila { grid-template-columns: minmax(0, 1fr) auto; }
    .dz-plantilla-wa__boton-fila > .dz-campo:nth-child(1) { grid-column: 1; grid-row: 1; }
    .dz-plantilla-wa__boton-fila > .dz-campo:nth-child(2) { grid-column: 1 / span 2; grid-row: 2; }
    .dz-plantilla-wa__boton-fila .dz-boton--icono { grid-column: 2; grid-row: 1; }
    .dz-plantilla-wa__boton-url { grid-column: 1 / span 2; grid-row: 3; grid-template-columns: minmax(0, 1fr); }
    .dz-plantilla-wa__enc { flex-wrap: wrap; overflow: visible; }
    .dz-plantilla-wa__botones-previa { width: 88%; }
    .dz-plantilla-wa__pie { flex-direction: column; flex-wrap: nowrap; align-items: stretch; }
    .dz-plantilla-wa__acciones { flex-direction: column; flex-wrap: nowrap; }
    .dz-plantilla-wa__acciones > .dz-boton--primario { order: -1; }
    .dz-plantilla-wa__acciones .dz-boton { min-height: var(--h-tactil); }
  }
}

/* Popover: un panel anclado bajo su disparador para contenido que no es una lista de acciones. Superficie con hairline, radio de tarjeta y sombra,
   mínimo --w-popover. No atrapa el foco; Esc, el clic fuera y sacar el foco lo cierran. Se voltea hacia arriba solo si abajo no cabe
   (data-dz-lado="arriba"); en teléfono no pasa del ancho de la ventana. */
@layer dz.componentes {
  .dz-popover { position: relative; display: inline-block; vertical-align: middle; }
  .dz-popover__disparador[aria-expanded="true"] { background: var(--sel-bg); color: var(--sel-text); border-color: transparent; }
  .dz-popover__panel {
    position: absolute;
    top: calc(100% + var(--s-1) + 2px);
    right: 0;
    z-index: var(--z-dropdown);
    display: grid;
    gap: var(--s-2);
    min-width: min(var(--w-popover), calc(100vw - var(--s-4) * 2));
    max-width: calc(100vw - var(--s-4) * 2);
    translate: var(--dz-desplaza, 0) 0;
    padding: var(--s-3) var(--s-4);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    font-size: var(--fs-2);
    line-height: var(--lh-3);
    text-align: left;
    white-space: normal;
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-popover__panel[hidden] { display: none; }
  .dz-popover__panel[data-dz-saliendo] { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale); }
  .dz-popover__panel:focus-visible { outline: none; }
  .dz-popover--izquierda .dz-popover__panel { right: auto; left: 0; }
  .dz-popover--ancho .dz-popover__panel { min-width: min(var(--w-avisos), calc(100vw - var(--s-4) * 2)); }
  .dz-popover[data-dz-lado="arriba"] .dz-popover__panel { top: auto; bottom: calc(100% + var(--s-1) + 2px); }
  /* En la capa del documento (comportamiento/flotante: top layer, o <body> sin Popover API) el panel ya no cuelga de su contenedor sino de la ventana: se ancla
     con las coordenadas que le da el comportamiento (--dz-flot-x, --dz-flot-y) y se anula lo que el navegador pone a un [popover] (inset, margen, relleno propio,
     overflow). El z-index se queda en el token: en el top layer no hace falta, y sin él (respaldo) pone el panel sobre la barra fija (31) y la cabecera de tabla (3). */
  .dz-popover__panel[data-dz-flotante] { position: fixed; inset: auto; top: var(--dz-flot-y, 0); left: var(--dz-flot-x, 0); margin: 0; width: auto; height: auto; overflow: visible; translate: none; }
  @media (prefers-reduced-motion: reduce) { .dz-popover__panel { animation: none; } }
}

/* Rango de fechas: el disparador con el periodo y un panel con la columna de atajos a la izquierda y un mes de calendario a la derecha (dos con
   data-dz-meses="2"), los campos Del y Al, la casilla de comparar y el pie con el resumen, Cancelar y Aplicar. USA calendario, boton,
   campo-compuesto y casilla sin cambiarlos; la banda del rango son modificadores de celda que viven en calendario.css. En escritorio el panel
   cuelga del disparador (no es un popover: Tab da la vuelta dentro y perder el foco no descarta lo elegido). Con dz-rango-fechas--hoja, que el
   comportamiento pone a 820 px o menos o con puntero grueso, es una hoja inferior con velo, un mes, atajos en una fila que se desplaza, días de
   --h-tactil y el pie pegado. Foco en el contorno del campo (:focus-within), nunca en el input; hairline en lo que flota; claro y oscuro. */
@layer dz.componentes {
  .dz-rango-fechas {
    --dz-rf-ancho: calc(var(--w-calendario) + var(--w-sub) * .72 + var(--s-4) * 2 + var(--s-5));
    position: relative;
    display: inline-block;
    vertical-align: middle;
    max-width: 100%;
    font-size: var(--fs-2);
    color: var(--text);
  }
  .dz-rango-fechas:not(.dz-rango-fechas--hoja):has(.dz-rango-fechas__meses--dos) { --dz-rf-ancho: calc(var(--w-calendario) * 2 + var(--w-sub) * .72 + var(--s-4) * 2 + var(--s-5) * 3 + 1px); }
  .dz-rango-fechas__disparador { max-width: 100%; font-weight: 500; font-variant-numeric: tabular-nums; }
  .dz-rango-fechas__disparador > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .dz-rango-fechas__disparador[aria-expanded="true"] { background: var(--sel-bg); color: var(--sel-text); }
  .dz-rango-fechas__chev { margin-right: calc(var(--s-1) * -1); color: var(--text-2); }
  .dz-rango-fechas__atajo-nombre { color: var(--text-2); font-weight: 500; }

  /* La capa es el velo de la hoja; en escritorio no pinta nada y el panel cuelga del disparador. */
  .dz-rango-fechas__capa { display: contents; }
  .dz-rango-fechas__capa[hidden] { display: none; }
  /* Salida del panel que cuelga del disparador: se funde y sube un poco en --dur-1, sin escala, y no recibe puntero mientras sale. */
  .dz-rango-fechas__capa[data-dz-saliendo] .dz-rango-fechas__panel { opacity: 0; transform: translateY(calc(var(--s-1) * -1)); transition: opacity var(--dur-1) var(--ease-sale), transform var(--dur-1) var(--ease-sale); pointer-events: none; }
  .dz-rango-fechas[data-dz-lado="arriba"] .dz-rango-fechas__capa[data-dz-saliendo] .dz-rango-fechas__panel { transform: translateY(var(--s-1)); }
  .dz-rango-fechas__panel {
    position: absolute;
    top: calc(100% + var(--s-1) + 2px);
    left: 0;
    z-index: var(--z-dropdown);
    box-sizing: border-box;
    display: grid;
    gap: var(--s-4);
    width: var(--dz-rf-ancho);
    max-width: calc(100vw - var(--s-4) * 2);
    padding: var(--s-4);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    text-align: left;
    line-height: var(--lh-3);
    white-space: normal;
    animation: dzEntraDesdeArriba var(--dur-1) var(--ease-out);
  }
  .dz-rango-fechas__panel:focus-visible { outline: none; }
  .dz-rango-fechas[data-dz-lado="arriba"] .dz-rango-fechas__panel { top: auto; bottom: calc(100% + var(--s-1) + 2px); }
  .dz-rango-fechas[data-dz-alinea="derecha"] .dz-rango-fechas__panel { left: auto; right: 0; }
  .dz-rango-fechas--muestra .dz-rango-fechas__panel { position: static; margin-top: var(--s-2); animation: none; }
  .dz-rango-fechas__asa { display: none; }

  /* Columna de atajos a la izquierda; el cuerpo (mes, campos, comparar) a la derecha. */
  .dz-rango-fechas__columnas { display: grid; grid-template-columns: calc(var(--w-sub) * .72) minmax(0, 1fr); gap: var(--s-5); }
  .dz-rango-fechas__cuerpo { display: grid; align-content: start; gap: var(--s-4); min-width: 0; }
  .dz-rango-fechas__atajos { display: grid; align-content: start; gap: 2px; padding-right: var(--s-5); border-right: 1px solid var(--hairline); }
  .dz-rango-fechas__atajo {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--s-3);
    width: 100%;
    min-height: var(--dz-dens-control-sm, var(--h-control-sm));
    padding: 0 var(--s-3);
    border: 0;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text);
    font: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    text-align: left;
    white-space: nowrap;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) { .dz-rango-fechas__atajo:hover:not(:disabled) { background: var(--hover-bg); } }
  .dz-rango-fechas__atajo[data-ds-estado="hover"]:not(:disabled) { background: var(--hover-bg); }
  .dz-rango-fechas__atajo:focus-visible,
  .dz-rango-fechas__atajo[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-rango-fechas__atajo[aria-pressed="true"] { background: var(--sel-bg); color: var(--sel-text); }
  .dz-rango-fechas__atajo:disabled { color: var(--text-muted); opacity: var(--op-off); cursor: not-allowed; }
  .dz-rango-fechas__atajo--personalizado { margin-top: var(--s-2); }

  /* Meses: uno o dos calendarios del DS tal cual. Con dos, una hairline entre ellos, el primero esconde su flecha derecha y el segundo la
     izquierda, y los días del mes vecino se esconden para no pintar la misma fecha dos veces. */
  .dz-rango-fechas__meses { display: flex; gap: var(--s-5); min-width: 0; }
  .dz-rango-fechas__meses .dz-calendario { flex: 1 1 var(--w-calendario); }
  .dz-rango-fechas__meses--dos .dz-calendario + .dz-calendario { padding-left: var(--s-5); border-left: 1px solid var(--hairline); }
  .dz-rango-fechas:not(.dz-rango-fechas--hoja) .dz-rango-fechas__meses--dos .dz-calendario__celda--fuera { background: none; }
  .dz-rango-fechas:not(.dz-rango-fechas--hoja) .dz-rango-fechas__meses--dos .dz-calendario__celda--fuera .dz-calendario__dia { visibility: hidden; }
  .dz-rango-fechas:not(.dz-rango-fechas--hoja) .dz-rango-fechas__meses--dos .dz-calendario:first-child .dz-calendario__nav--sig,
  .dz-rango-fechas:not(.dz-rango-fechas--hoja) .dz-rango-fechas__meses--dos .dz-calendario:last-child .dz-calendario__nav--ant { visibility: hidden; }

  /* Campos Del y Al: el campo compuesto del DS; el foco va en su contorno, el input interno no lleva anillo. */
  .dz-rango-fechas__campos { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: end; gap: var(--s-2); }
  .dz-rango-fechas__campo { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-rango-fechas__rotulo { font-size: var(--fs-1); font-weight: 500; color: var(--text-2); }
  .dz-rango-fechas__campo .dz-campo-compuesto { min-width: 0; padding: 0 var(--s-3); }
  .dz-rango-fechas__campo .dz-campo-compuesto__control { width: 100%; font-variant-numeric: tabular-nums; letter-spacing: .01em; }
  .dz-rango-fechas__al { display: inline-flex; align-items: center; height: var(--dz-dens-control-sm, var(--h-control-sm)); color: var(--text-muted); font-size: var(--fs-2); }
  .dz-rango-fechas__error { margin: 0; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--bad-text); }
  .dz-rango-fechas__error:empty { display: none; }

  /* Comparar: la casilla del DS y, junto, el periodo anterior ya calculado en cifras tabulares (solo si está marcada). */
  .dz-rango-fechas__comparar { flex-wrap: wrap; gap: var(--s-2) var(--s-3); }
  .dz-rango-fechas__comparado { color: var(--text-muted); font-size: var(--fs-1); font-variant-numeric: tabular-nums; }
  .dz-rango-fechas__comparar:has(.dz-casilla__control:not(:checked)) .dz-rango-fechas__comparado { display: none; }

  /* Pie: el resumen a la izquierda, Cancelar y Aplicar a la derecha. Un solo primario. */
  .dz-rango-fechas__pie { display: flex; align-items: center; gap: var(--s-2); padding-top: var(--s-3); border-top: 1px solid var(--hairline); }
  .dz-rango-fechas__resumen { margin: 0 auto 0 0; color: var(--text-muted); font-size: var(--fs-1); font-variant-numeric: tabular-nums; }
  .dz-rango-fechas__pie .dz-boton { height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0 var(--s-3); }

  /* Hoja inferior: velo fijo a la ventana, un solo mes, atajos en fila que se desplaza, días y botones de --h-tactil y el pie pegado. */
  .dz-rango-fechas--hoja { position: static; display: block; --dz-rf-ancho: 100%; }
  .dz-rango-fechas--hoja .dz-rango-fechas__capa {
    position: fixed;
    inset: 0;
    z-index: var(--z-hoja);
    display: flex;
    align-items: flex-end;
    background: var(--velo);
    overscroll-behavior: contain;
    touch-action: manipulation;
    animation: dzRangoVelo var(--dur-2) var(--ease-out);
  }
  .dz-rango-fechas--hoja .dz-rango-fechas__capa[hidden] { display: none; }
  /* Salida de la hoja inferior: el velo se funde y el panel baja su propio alto en --dur-2 (la mitad de lo que tardó en subir), con la curva de lo que se va. */
  .dz-rango-fechas--hoja .dz-rango-fechas__capa[data-dz-saliendo] { opacity: 0; transition: opacity var(--dur-2) var(--ease-sale); pointer-events: none; }
  .dz-rango-fechas--hoja .dz-rango-fechas__capa[data-dz-saliendo] .dz-rango-fechas__panel { opacity: 1; transform: translateY(100%); transition: transform var(--dur-2) var(--ease-sale); }
  .dz-rango-fechas--hoja .dz-rango-fechas__panel {
    position: static;
    gap: var(--s-3);
    max-width: none;
    max-height: 92vh;
    max-height: 92dvh;
    overflow-y: auto;
    overscroll-behavior-y: contain;
    padding: var(--s-3) var(--s-4) calc(var(--s-4) + env(safe-area-inset-bottom));
    border-bottom: 0;
    border-radius: var(--r-card) var(--r-card) 0 0;
    box-shadow: none;
    animation: dzRangoHoja var(--dur-4) var(--ease-enfasis);
  }
  .dz-rango-fechas--hoja .dz-rango-fechas__asa { order: -2; display: block; width: var(--s-7); height: var(--s-1); margin: 0 auto; border-radius: var(--r-pill); background: var(--line-2); }
  .dz-rango-fechas--hoja .dz-rango-fechas__columnas,
  .dz-rango-fechas--hoja .dz-rango-fechas__cuerpo { display: contents; }
  .dz-rango-fechas--hoja .dz-rango-fechas__columnas > .dz-rango-fechas__atajos { order: -1; }
  .dz-rango-fechas--hoja .dz-rango-fechas__atajos { display: flex; gap: var(--s-1); margin-inline: calc(var(--s-4) * -1); padding: 0 var(--s-4); border-right: 0; overflow-x: auto; scrollbar-width: none; }
  .dz-rango-fechas--hoja .dz-rango-fechas__atajos::-webkit-scrollbar { display: none; }
  .dz-rango-fechas--hoja .dz-rango-fechas__atajo--personalizado { margin-top: 0; }
  .dz-rango-fechas--hoja .dz-rango-fechas__atajo { flex: none; width: auto; min-height: var(--dz-dens-control-sm, var(--h-filtro)); border: 1px solid var(--border); border-radius: var(--r-chip); color: var(--text-2); }
  /* Con el dedo el blanco de 44 px nunca baja: la fila ya se desplaza en horizontal, así que el alto no cuesta ancho. */
  @media (pointer: coarse) { .dz-rango-fechas--hoja .dz-rango-fechas__atajo { min-height: var(--h-tactil); } }
  .dz-rango-fechas--hoja .dz-rango-fechas__atajo[aria-pressed="true"] { border-color: transparent; background: var(--chip-on-bg); color: var(--chip-on-text); }
  .dz-rango-fechas--hoja .dz-rango-fechas__meses .dz-calendario + .dz-calendario { display: none; }
  .dz-rango-fechas--hoja .dz-rango-fechas__meses .dz-calendario { --dz-cal-h: var(--h-tactil); flex-basis: auto; width: 100%; }
  .dz-rango-fechas--hoja .dz-rango-fechas__meses .dz-calendario__nav { width: var(--h-tactil); height: var(--h-tactil); }
  .dz-rango-fechas--hoja .dz-rango-fechas__campo .dz-campo-compuesto { height: var(--dz-dens-control, var(--h-control)); }
  .dz-rango-fechas--hoja .dz-rango-fechas__al { height: var(--dz-dens-control, var(--h-control)); }
  .dz-rango-fechas--hoja .dz-rango-fechas__pie {
    position: sticky;
    bottom: calc(var(--s-4) * -1);
    flex-wrap: wrap;
    margin: 0 calc(var(--s-4) * -1) calc(var(--s-4) * -1);
    padding: var(--s-3) var(--s-4) calc(var(--s-4) + env(safe-area-inset-bottom));
    background: var(--surface);
  }
  .dz-rango-fechas--hoja .dz-rango-fechas__pie .dz-boton { flex: 1 1 0; justify-content: center; height: var(--h-tactil); }
  .dz-rango-fechas--hoja .dz-rango-fechas__resumen { flex: 1 1 100%; margin: 0 0 var(--s-1); }
  /* En una ficha o una captura la hoja no tapa la ventana: la capa es un marco con velo y el panel va pegado abajo. */
  .dz-rango-fechas--hoja.dz-rango-fechas--muestra { width: min(100%, calc(var(--w-calendario) + var(--s-4) * 2 + var(--s-6))); }
  .dz-rango-fechas--hoja.dz-rango-fechas--muestra .dz-rango-fechas__capa { position: relative; inset: auto; z-index: auto; padding-top: var(--s-7); animation: none; }
  .dz-rango-fechas--hoja.dz-rango-fechas--muestra .dz-rango-fechas__panel { animation: none; margin-top: 0; }

  @keyframes dzRangoVelo { from { opacity: 0; } }
  @keyframes dzRangoHoja { from { transform: translateY(100%); } }
  @media (prefers-reduced-motion: reduce) { .dz-rango-fechas__panel, .dz-rango-fechas__capa, .dz-rango-fechas--hoja .dz-rango-fechas__panel, .dz-rango-fechas--hoja .dz-rango-fechas__capa { animation: none; } .dz-rango-fechas__atajo { transition: none; } }
}

/* Recorrido: la capa a pantalla completa de una simulación guiada. Es una superficie modal del sistema (foco atrapado, fondo inerte, Esc pregunta antes de salir) con tres
   zonas: la barra (marca, escena actual, pasos y Pausar o Saltar), el escenario (la portada, las escenas del producto y el resumen) y la guía fija abajo, en lista, que entra al
   modal o a la hoja cuando el paso ocurre ahí. Todo mide el ancho de la propia capa (container query), no el de la ventana, así que un marco de 390 px y un teléfono real
   se ven igual. Movimiento: sale la escena anterior (--dur-1), entra la nueva por trozos (--dur-3) y el nombre del lead viaja de una vista a otra (--dur-4 con --ease-enfasis);
   nada en bucle, y con movimiento reducido todo aparece en su sitio. Las animaciones de entrada no dejan transform al terminar: una escena con transform atraparía la
   posición fija de un modal o una hoja que cuelga de ella. La altura de la guía llega en --dz-guia-alto para que las escenas no queden tapadas. */
@layer dz.componentes {
  .dz-recorrido { display: contents; }
  .dz-recorrido__capa { position: fixed; inset: 0; z-index: var(--z-modal); display: grid; grid-template: minmax(0, 1fr) / minmax(0, 1fr); overflow: hidden; container: dz-recorrido / inline-size; background: var(--bg); color: var(--text); opacity: 1; transition: opacity var(--dur-2) var(--ease-velo); }
  .dz-recorrido__capa[hidden] { display: none; opacity: 0; transition: opacity var(--dur-1) var(--ease-out), display var(--dur-1) allow-discrete; }
  .dz-recorrido__capa[data-dz-saliendo] { opacity: 0; transition-duration: var(--dur-2); }
  @starting-style { .dz-recorrido__capa:not([hidden]) { opacity: 0; } }
  .dz-recorrido__panel { position: relative; display: grid; grid-template-rows: auto minmax(0, 1fr); height: 100%; min-height: 0; outline: none; }
  .dz-recorrido__sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }

  /* La barra. */
  .dz-recorrido__barra { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: var(--s-3); min-height: var(--h-mov); padding: var(--s-2) var(--s-4); border-bottom: 1px solid var(--hairline); background: var(--surface); }
  .dz-recorrido__izq { display: flex; align-items: center; gap: var(--s-3); min-width: 0; }
  .dz-recorrido__marca { display: inline-flex; align-items: center; gap: var(--s-2); height: var(--h-chip); padding: 0 var(--s-2) 0 var(--s-1); border-radius: var(--r-pill); background: var(--chip-on-bg); color: var(--chip-on-text); font-size: var(--fs-1); font-weight: 600; }
  .dz-recorrido__marca svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-recorrido__barra-titulo { overflow: hidden; font-size: var(--fs-2); font-weight: 500; white-space: nowrap; text-overflow: ellipsis; }
  .dz-recorrido__pasos { min-width: 0; }
  .dz-recorrido__avance .dz-pasos__descripcion { display: none; }
  .dz-recorrido__avance .dz-pasos__estado { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .dz-recorrido__avance .dz-pasos__titulo { white-space: nowrap; }
  .dz-recorrido__avance .dz-pasos__lista { gap: var(--s-5); }
  .dz-recorrido__der { display: flex; justify-content: flex-end; gap: var(--s-1); }
  .dz-recorrido__capa[data-dz-escena-actual="resumen"] .dz-recorrido__der { visibility: hidden; }

  /* El escenario. */
  .dz-recorrido__escenario { position: relative; display: grid; min-height: 0; overflow: hidden; }
  .dz-recorrido__escenario > [data-dz-producto] { min-height: 0; }
  .dz-recorrido__escena { min-width: 0; min-height: 0; }
  .dz-recorrido__escena[hidden] { display: none; }
  .dz-recorrido__escena--portada, .dz-recorrido__escena--resumen { display: grid; justify-items: center; align-content: safe center; box-sizing: border-box; padding: var(--s-5) var(--s-6) calc(var(--s-6) + var(--dz-guia-alto, 0px)); overflow-y: auto; overscroll-behavior: contain; }
  [data-dz-anima="entra"] > * { animation: dzRecEntra var(--dur-3) var(--ease-out) backwards; }
  [data-dz-anima="entra"] > :nth-child(2) { animation-delay: calc(var(--dur-1) * .5); }
  [data-dz-anima="entra"] > :nth-child(3) { animation-delay: var(--dur-1); }
  [data-dz-anima="entra"] > :nth-child(4) { animation-delay: calc(var(--dur-1) * 1.5); }
  [data-dz-anima="sale"] { animation: dzRecSale var(--dur-1) var(--ease-out) forwards; }
  .dz-recorrido__portada { display: grid; justify-items: center; gap: var(--s-4); width: min(100%, var(--w-modal-ancho)); text-align: center; }
  .dz-recorrido__portada--ancha { width: min(100%, calc(var(--w-modal-ancho) + var(--w-sub))); }
  .dz-recorrido__ilustracion { color: var(--text); }
  .dz-recorrido__sobre { margin: 0; font-size: var(--fs-1); font-weight: 600; text-transform: uppercase; letter-spacing: .06em; color: var(--text-muted); }
  .dz-recorrido__titulo { margin: 0; font-size: var(--fs-7); font-weight: 600; letter-spacing: -.025em; line-height: var(--lh-1); text-wrap: balance; }
  .dz-recorrido__titulo:focus-visible { outline: none; box-shadow: none; }
  .dz-recorrido__texto { margin: 0; font-size: var(--fs-4); line-height: var(--lh-3); color: var(--text-2); text-wrap: pretty; }
  .dz-recorrido__escenas { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); margin: 0; padding: 0; list-style: none; }
  .dz-recorrido__escenas li { display: inline-flex; align-items: center; gap: var(--s-2); height: var(--dz-dens-control, var(--h-control)); padding: 0 var(--s-3) 0 var(--s-2); border: 1px solid var(--hairline); border-radius: var(--r-pill); background: var(--surface); font-size: var(--fs-2); font-weight: 500; }
  .dz-recorrido__n { display: inline-flex; color: var(--text-muted); }
  .dz-recorrido__botones { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); margin-top: var(--s-2); }
  .dz-recorrido__nota { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-recorrido__columnas { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(var(--w-celda), 1fr); gap: var(--s-5); width: 100%; text-align: left; }
  .dz-recorrido__aprendido { align-self: start; }
  .dz-recorrido__lado { display: grid; align-content: start; gap: var(--s-3); }
  .dz-recorrido__atajos { display: grid; gap: var(--s-2); margin: 0; }
  .dz-recorrido__atajos div { display: grid; grid-template-columns: var(--h-tactil) minmax(0, 1fr); align-items: center; gap: var(--s-2); }
  .dz-recorrido__atajos dt, .dz-recorrido__atajos dd { margin: 0; }
  .dz-recorrido__atajos dd { font-size: var(--fs-2); }
  .dz-recorrido__kbd { display: inline-grid; place-items: center; min-width: 1.6em; height: 1.5em; padding: 0 .4em; border: 1px solid var(--line-2); border-bottom-width: 2px; border-radius: var(--r-1); background: var(--surface); color: var(--text-2); font-family: var(--font); font-size: .85em; font-weight: 500; }

  /* La guía: fija abajo, o dentro del modal o la hoja donde ocurre el paso. */
  .dz-recorrido__guia { position: absolute; right: 0; bottom: var(--dz-guia-base, 0px); left: 0; z-index: var(--z-sticky); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--s-3) var(--s-5); padding: var(--s-3) var(--s-5); border-top: 1px solid var(--hairline); background: var(--surface); box-shadow: var(--shadow-md); animation: dzRecEntra var(--dur-3) var(--ease-enfasis) backwards; }
  .dz-recorrido__guia[hidden] { display: none; }
  .dz-recorrido__guia-cab { display: grid; justify-items: center; gap: var(--s-1); align-self: start; min-width: var(--w-sub); text-align: center; }
  .dz-recorrido__guia-marca { display: inline-grid; place-items: center; width: var(--h-btn-ico); height: var(--h-btn-ico); border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); }
  .dz-recorrido__eyebrow { margin: 0; font-size: var(--fs-1); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); }
  dl.dz-recorrido__lista { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); grid-template-columns: none; gap: var(--s-4); margin: 0; }
  dl.dz-recorrido__lista > .dz-ayuda__renglon { display: grid; grid-column: auto; grid-template-columns: minmax(0, 1fr); gap: var(--s-1); padding: 0 var(--s-4) 0 0; border: 0; border-right: 1px solid var(--hairline); }
  dl.dz-recorrido__lista > .dz-ayuda__renglon:last-child { padding-right: 0; border-right: 0; }
  .dz-recorrido__lista .dz-ayuda__clave { font-size: var(--fs-1); text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); }
  .dz-recorrido__lista .dz-ayuda__texto { font-size: var(--fs-2); line-height: var(--lh-2); }
  .dz-recorrido__acciones { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--s-2); }
  .dz-recorrido__acciones:empty { display: none; }
  .dz-recorrido__izquierda { margin-right: auto; }
  .dz-recorrido__modelo, .dz-recorrido__modelos { display: none; }
  [data-dz-guia-local] { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--s-2) var(--s-3); margin-bottom: var(--s-2); padding: var(--s-3) var(--s-4); border-radius: var(--r-card); background: var(--surface-anidada); }
  [data-dz-guia-local] .dz-recorrido__guia-marca { grid-row: 1 / span 2; width: var(--h-mini); height: var(--h-mini); }
  [data-dz-guia-local] .dz-recorrido__eyebrow { align-self: center; }
  [data-dz-guia-local] dl.dz-recorrido__lista { grid-column: 2; grid-auto-flow: row; grid-auto-columns: auto; gap: var(--s-2); }
  [data-dz-guia-local] dl.dz-recorrido__lista > .dz-ayuda__renglon { padding: 0; border: 0; }

  /* Lo que se resalta (la acción que toca): un anillo suave que entra una vez, sin bucle. */
  [data-dz-foco] { position: relative; box-shadow: var(--ring-soft), 0 0 0 var(--s-1) color-mix(in oklch, var(--accent-control) 14%, transparent); animation: dzRecFoco var(--dur-4) var(--ease-enfasis) backwards; }
  /* El lead viaja de una vista a otra. */
  [data-dz-viajero] { position: absolute; z-index: var(--z-toast); display: inline-flex; align-items: center; gap: var(--s-2); height: var(--h-control); padding: 0 var(--s-3) 0 var(--s-1); border: 1px solid var(--hairline); border-radius: var(--r-pill); background: var(--surface); box-shadow: var(--shadow-md); font-size: var(--fs-2); font-weight: 600; white-space: nowrap; pointer-events: none; transform-origin: 0 0; transition: transform var(--dur-4) var(--ease-enfasis), opacity var(--dur-2) var(--ease-out); will-change: transform; }
  [data-dz-viajero="fin"] { opacity: 0; }
  [data-dz-llegada] { animation: dzRecPop var(--dur-3) var(--ease-enfasis) backwards; }
  /* El aviso para retomar: persistente, no toma el foco. */
  .dz-recorrido__retomar { position: fixed; bottom: var(--s-4); left: 50%; z-index: var(--z-toast); display: flex; align-items: center; gap: var(--s-3); max-width: calc(100vw - var(--s-4) * 2); padding: var(--s-2) var(--s-3) var(--s-2) var(--s-4); border: 1px solid var(--hairline); border-radius: var(--r-card); background: var(--surface); color: var(--text); box-shadow: var(--shadow-md); translate: -50% 0; animation: dzRecEntra var(--dur-3) var(--ease-enfasis) backwards; }
  .dz-recorrido__retomar[hidden] { display: none; }
  .dz-recorrido__retomar-texto { margin: 0; font-size: var(--fs-2); }
  .dz-recorrido--muestra .dz-recorrido__capa { position: relative; inset: auto; height: calc(var(--h-fila) * 16); min-height: 0; transition: none; }
  .dz-recorrido--muestra .dz-recorrido__retomar { position: static; max-width: none; translate: none; animation: none; }

  @keyframes dzRecEntra { from { opacity: 0; transform: translateY(var(--s-2)); } }
  @keyframes dzRecSale { to { opacity: 0; transform: translateY(var(--s-1)); } }
  @keyframes dzRecPop { 0% { opacity: .6; transform: scale(.96); } 60% { transform: scale(1.02); } }
  @keyframes dzRecFoco { from { box-shadow: var(--ring-0); } }

  /* Teléfono (el ancho de la capa, no el de la ventana): la barra baja los pasos a una segunda fila y la guía queda en una columna con solo el renglón "Haz" a la vista. */
  @container dz-recorrido (max-width: 820px) {
    .dz-recorrido__barra { grid-template-columns: minmax(0, 1fr) auto; padding: var(--s-2) var(--s-3); }
    .dz-recorrido__pasos { grid-column: 1 / -1; grid-row: 2; }
    .dz-recorrido__barra-titulo { display: none; }
    .dz-recorrido__columnas { grid-template-columns: minmax(0, 1fr); }
    .dz-recorrido__titulo { font-size: var(--fs-6); }
    .dz-recorrido__texto { font-size: var(--fs-2); }
    .dz-recorrido__escenas { display: grid; grid-template-columns: minmax(0, 1fr); justify-items: stretch; width: 100%; }
    .dz-recorrido__botones { width: 100%; }
    .dz-recorrido__botones > * { flex: 1 1 100%; justify-content: center; }
    .dz-recorrido__escena--portada, .dz-recorrido__escena--resumen { padding: var(--s-4) var(--s-4) calc(var(--s-6) + var(--dz-guia-alto, 0px)); }
    .dz-recorrido__guia { grid-template-columns: minmax(0, 1fr); gap: var(--s-2); padding: var(--s-3) var(--s-4); box-shadow: none; }
    .dz-recorrido__guia-cab { grid-auto-flow: column; justify-content: start; align-items: center; min-width: 0; text-align: left; }
    .dz-recorrido__guia-marca { width: var(--h-mini); height: var(--h-mini); }
    dl.dz-recorrido__lista { grid-auto-flow: row; grid-auto-columns: auto; gap: var(--s-2); }
    dl.dz-recorrido__lista > .dz-ayuda__renglon { grid-template-columns: var(--w-sub) minmax(0, 1fr); border: 0; padding: 0; }
    .dz-recorrido__guia dl.dz-recorrido__lista > .dz-ayuda__renglon:not(.dz-recorrido__haz) { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-recorrido__acciones { justify-content: stretch; }
    .dz-recorrido__acciones > * { flex: 1 1 auto; justify-content: center; }
    .dz-recorrido__retomar { bottom: calc(var(--cascaron-bar) + var(--s-2)); }
  }
  @container dz-recorrido (max-width: 560px) {
    .dz-recorrido__avance .dz-pasos__resumen { display: block; }
    .dz-recorrido__avance .dz-pasos__paso:not([data-dz-resumen]) { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
    .dz-recorrido__avance .dz-pasos__paso[data-dz-resumen] { flex: 1 1 auto; }
    .dz-recorrido__avance .dz-pasos__paso[data-dz-resumen] .dz-pasos__linea { display: none; }
    dl.dz-recorrido__lista > .dz-ayuda__renglon { grid-template-columns: minmax(0, 1fr); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-recorrido__capa, [data-dz-viajero], .dz-recorrido__guia, .dz-recorrido__retomar, [data-dz-llegada], [data-dz-anima="entra"] > *, [data-dz-anima="sale"], [data-dz-foco] { animation: none; transition: none; }
  }
  [data-dz-movimiento="reducido"] :is(.dz-recorrido__capa, [data-dz-viajero], .dz-recorrido__guia, .dz-recorrido__retomar, [data-dz-llegada], [data-dz-anima="entra"] > *, [data-dz-anima="sale"], [data-dz-foco]) { animation: none; transition: none; }
}

/* Respuesta de IA: la respuesta del asistente con su motivo de parada en data-dz-parada. Una pieza, ocho estados. Antes del primer texto, tres puntos que respiran (los de
   «está escribiendo»), nunca un spinner a pantalla completa; el cursor vive solo mientras se escribe (en parada «escribiendo») y con movimiento reducido queda fijo. Los
   puntos se asientan a los 5 s como todo fondo (--mov-asienta): si no llegó texto, quedan fijos y el rótulo dice «Sigue pensando…». El pie y las acciones traen una variante
   por parada y solo la de la parada actual está a la vista. Lo que escribe el modelo es texto y sus saltos de párrafo se conservan. */
@layer dz.componentes {
  .dz-respuesta-ia { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-respuesta-ia__pregunta { margin: 0; display: flex; gap: var(--s-2); align-items: baseline; font-size: var(--fs-3); color: var(--text); }
  .dz-respuesta-ia__quien { flex: none; font-size: var(--fs-1); font-weight: 500; color: var(--text-muted); }
  .dz-respuesta-ia__bloque { display: grid; gap: var(--s-2); padding: var(--s-3) var(--s-4); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-respuesta-ia__cab { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-respuesta-ia__cuerpo { font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text); overflow-wrap: anywhere; }
  .dz-respuesta-ia__cuerpo[hidden] { display: none; }
  .dz-respuesta-ia__cuerpo p { margin: 0; }
  .dz-respuesta-ia__cuerpo p + p { margin-top: var(--s-2); }
  .dz-respuesta-ia__cursor { display: none; width: 2px; height: 1.1em; vertical-align: text-bottom; margin-left: 1px; background: var(--text); }
  .dz-respuesta-ia[data-dz-parada="escribiendo"] .dz-respuesta-ia__cursor { display: inline-block; animation: dz-parpadeo calc(var(--dur-respira) * 1.1) steps(2, start) infinite; }
  @keyframes dz-parpadeo { to { visibility: hidden; } }
  .dz-respuesta-ia__espera { display: none; align-items: center; gap: var(--s-2); }
  .dz-respuesta-ia[data-dz-parada="esperando"] .dz-respuesta-ia__espera { display: flex; }
  .dz-respuesta-ia[data-dz-parada="esperando"] .dz-respuesta-ia__cuerpo:not(:has(p:not(:empty))) { display: none; }
  .dz-respuesta-ia__puntos { display: inline-flex; align-items: center; gap: var(--s-1); height: var(--h-control-sm); }
  .dz-respuesta-ia__puntos i { display: block; width: var(--s-2); height: var(--s-2); border-radius: var(--r-pill); background: var(--text-muted); }
  .dz-respuesta-ia__puntos--respira i { opacity: .25; animation: dz-respira calc(var(--dur-respira) * 1.6) var(--ease-velo) backwards infinite; }
  .dz-respuesta-ia__puntos--respira i:nth-child(2) { animation-delay: calc(var(--dur-1) * 1.5); }
  .dz-respuesta-ia__puntos--respira i:nth-child(3) { animation-delay: calc(var(--dur-1) * 3); }
  @keyframes dz-respira { 0%, 100% { opacity: .25; } 50% { opacity: 1; } }
  .dz-respuesta-ia__espera[data-dz-asentado] .dz-respuesta-ia__puntos i { animation: none; opacity: .6; }
  .dz-respuesta-ia__pensando { font-size: var(--fs-2); color: var(--text-muted); }
  .dz-respuesta-ia__pensando[hidden] { display: none; }
  .dz-respuesta-ia__pie:not(:has(> .dz-respuesta-ia__grupo:not([hidden]))) { display: none; }
  .dz-respuesta-ia__pie { display: grid; gap: var(--s-2); }
  .dz-respuesta-ia__pie .dz-respuesta-ia__grupo { display: grid; gap: var(--s-2); }
  .dz-respuesta-ia__nota { margin: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-respuesta-ia__nota[hidden] { display: none; }
  .dz-respuesta-ia__referencia { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); font-size: var(--fs-2); color: var(--text-muted); }
  .dz-respuesta-ia__referencia[hidden] { display: none; }
  .dz-respuesta-ia__codigo { font-family: var(--mono-code); font-size: var(--fs-2); color: var(--text); }
  .dz-respuesta-ia__pie .dz-vacio { padding: var(--s-4) var(--s-3); }
  .dz-respuesta-ia__acciones { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: center; }
  .dz-respuesta-ia__acciones:not(:has(> .dz-respuesta-ia__grupo:not([hidden]))) { display: none; }
  .dz-respuesta-ia__acciones > .dz-respuesta-ia__grupo { display: flex; flex-wrap: wrap; gap: var(--s-2); align-items: center; }
  .dz-respuesta-ia__menu { margin-inline-start: 0; }
  .dz-respuesta-ia__menu > .dz-menu__disparador { width: var(--dz-dens-control-sm, var(--h-control-sm)); height: var(--dz-dens-control-sm, var(--h-control-sm)); padding: 0; justify-content: center; color: var(--text-muted); }
  .dz-respuesta-ia__menu > .dz-menu__disparador > svg:last-child { display: none; }
  .dz-respuesta-ia__oculto,
  .dz-respuesta-ia__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-respuesta-ia__cuota { margin: 0; font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-respuesta-ia__cuota--aviso { color: var(--warn-text); }
  .dz-respuesta-ia__acciones [aria-disabled="true"] { opacity: var(--op-off); cursor: not-allowed; }
  .dz-respuesta-ia .dz-respuesta-ia__grupo[hidden],
  .dz-respuesta-ia .dz-respuesta-ia__cab [data-dz-chip][hidden] { display: none; }
  @media (prefers-reduced-motion: reduce) {
    .dz-respuesta-ia[data-dz-parada] .dz-respuesta-ia__cursor { animation: none; }
    .dz-respuesta-ia .dz-respuesta-ia__puntos i { animation: none; opacity: .6; }
  }
  @media (forced-colors: active) { .dz-respuesta-ia__bloque { border-color: CanvasText; } .dz-respuesta-ia__cursor { background: CanvasText; } }
}

/* Tabla grande: la "tabla" de siempre (cabecera en mono mayúscula, filas con hairline, cifras tabulares) para una lista de miles de filas. Una región alta
   que desplaza en los dos ejes, con la cabecera pegada arriba y columnas fijas a la izquierda; las filas no montadas las miden dos huecos (<tr>) y todas las
   filas miden lo mismo (celdas de una línea con recorte). Cada columna fija lleva su propio left (--dz-izq, que pone el comportamiento: la segunda empieza
   donde termina la primera); la última dibuja el borde y, con la región desplazada a un lado, una sombra corta para separar lo fijo de lo que se mueve.
   Cabecera: el título es el botón de orden, al lado el menú de la columna (aparece al apuntar o enfocar) y el asa de ancho en el borde derecho, una línea
   de 3 px en --focus al apuntarla o al arrastrarla. El foco de fila es un aro interior en la fila entera, distinto de la selección (fondo y marca a la
   izquierda). Acciones de fila: «⋯» al final, visible al apuntar o enfocar con puntero fino y siempre con el dedo. */
@layer dz.componentes {
  .dz-tabla-grande { min-width: 0; }
  .dz-tabla__region.dz-tabla-grande__region {
    position: relative;
    max-height: var(--dz-tabla-alto, calc(100dvh - var(--cascaron-top, 0px) - var(--s-8) * 4));
    min-height: calc(var(--h-fila) * 8);
    overflow: auto;
    overscroll-behavior: contain;
    overflow-anchor: none;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
  }
  /* La máscara de desvanecido de la región normal taparía las columnas fijas: la grande no la usa y marca el borde con una sombra interior en la última fija. */
  @supports (animation-timeline: scroll(self inline)) { .dz-tabla__region.dz-tabla-grande__region { mask-image: none; animation: none; } }
  .dz-tabla-grande__region .dz-tabla { table-layout: fixed; width: max-content; min-width: 100%; }
  .dz-tabla-grande__region .dz-tabla-grande__col-sel { width: var(--s-8); }
  .dz-tabla-grande__region .dz-tabla-grande__col-acciones { width: var(--h-tactil); }
  .dz-tabla-grande__region .dz-tabla__titulo { position: sticky; top: 0; z-index: 2; padding-right: var(--s-6); background: var(--surface); }
  /* La celda de «Seleccionar todas» no lleva el relleno de los títulos (el derecho de 24 px la corría 12 px a la izquierda del eje de las casillas de fila): mismo relleno que la celda de fila. */
  .dz-tabla-grande__region .dz-tabla__titulo.dz-tabla__seleccion { padding: 0; }
  .dz-tabla-grande__region .dz-tabla__celda, .dz-tabla-grande__region .dz-tabla__titulo { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-tabla-grande__region .dz-tabla__celda { height: var(--dz-dens-fila, var(--h-fila)); padding-top: 0; padding-bottom: 0; }
  .dz-tabla-grande__region .dz-tabla__seleccion { overflow: visible; }
  .dz-tabla-grande__region .dz-tabla-grande__celda--acciones { overflow: visible; }
  .dz-tabla-grande__region .dz-tabla > tbody > tr:last-child > .dz-tabla__celda { border-bottom: 1px solid var(--border); }
  .dz-tabla-grande__region .dz-tabla > tbody > tr.dz-tabla-grande__hueco:last-child > .dz-tabla__celda,
  .dz-tabla-grande__region .dz-tabla > tbody > tr.dz-tabla-grande__hueco > td { border-bottom: 0; }
  /* Columnas fijas: sin script solo la primera (junto a la casilla); el comportamiento da a cada una su left (PCB-1976). */
  .dz-tabla-grande__titulo--fija, .dz-tabla-grande__celda--fija { position: sticky; left: var(--dz-izq, var(--dz-sel, var(--s-8))); z-index: 1; background: var(--surface); }
  .dz-tabla__seleccion.dz-tabla-grande__titulo--fija, .dz-tabla__seleccion.dz-tabla-grande__celda--fija { left: 0; }
  .dz-tabla-grande__region .dz-tabla-grande__titulo--fija { z-index: 3; }
  .dz-tabla-grande__titulo--fija-ultima, .dz-tabla-grande__celda--fija-ultima { box-shadow: inset -1px 0 0 var(--border); }
  .dz-tabla-grande__region[data-dz-desplazada] .dz-tabla-grande__titulo--fija-ultima,
  .dz-tabla-grande__region[data-dz-desplazada] .dz-tabla-grande__celda--fija-ultima { box-shadow: inset -1px 0 0 var(--line-2), calc(var(--s-1) * 1.5) 0 var(--s-3) calc(var(--s-2) * -1) var(--c-negro-18); }
  .dz-tabla-grande__region .dz-tabla__fila[aria-selected="true"] > .dz-tabla-grande__celda--fija { background: var(--sel-bg); }
  @media (hover: hover) { .dz-tabla-grande__region .dz-tabla__fila:hover > .dz-tabla-grande__celda--fija { background: var(--surface-2); } }
  /* Hueco virtual: una fila sin contenido que mide lo que miden las filas no montadas (aria-hidden, sin celdas que leer). */
  .dz-tabla-grande__hueco > td { height: var(--dz-hueco, 0px); padding: 0; border: 0; }
  /* Foco de fila (recorrido con flechas): aro interior en la fila entera, distinto de la selección. */
  .dz-tabla__fila:focus { outline: none; }
  .dz-tabla__fila:focus-visible > .dz-tabla__celda { box-shadow: inset 0 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila:focus-visible > .dz-tabla__celda:first-child { box-shadow: inset 1.5px 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila:focus-visible > .dz-tabla__celda:last-child { box-shadow: inset -1.5px 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila[data-ds-estado="foco"] > .dz-tabla__celda { box-shadow: inset 0 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila[data-ds-estado="foco"] > .dz-tabla__celda:first-child { box-shadow: inset 1.5px 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila[data-ds-estado="foco"] > .dz-tabla__celda:last-child { box-shadow: inset -1.5px 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus); }
  .dz-tabla__fila[aria-selected="true"]:focus-visible > .dz-tabla__seleccion { box-shadow: inset 1.5px 1.5px 0 var(--focus), inset 0 -1.5px 0 var(--focus), inset var(--s-1) 0 0 var(--sel-text); }
  .dz-tabla-grande__fila--espera > .dz-tabla__celda { pointer-events: none; }
  /* Cabecera. */
  .dz-tabla-grande__titulo-interior { display: flex; align-items: center; gap: var(--s-1); min-width: 0; }
  .dz-tabla__titulo--numero .dz-tabla-grande__titulo-interior { flex-direction: row-reverse; }
  .dz-tabla-grande__titulo-interior > .dz-tabla__orden { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
  .dz-tabla-grande__columna-menu { flex: none; width: var(--h-mini); height: var(--h-mini); opacity: 0; transition: opacity var(--dur-1) var(--ease-out); }
  .dz-tabla-grande__columna-menu svg { width: var(--ico-1); height: var(--ico-1); }
  .dz-tabla__titulo:hover .dz-tabla-grande__columna-menu, .dz-tabla__titulo:focus-within .dz-tabla-grande__columna-menu, .dz-tabla-grande__columna-menu[aria-expanded="true"] { opacity: 1; }
  @media (hover: none) { .dz-tabla-grande__columna-menu { opacity: 1; } }
  .dz-tabla-grande__pin { flex: none; opacity: .7; }
  .dz-tabla-grande__asa { position: absolute; top: 0; right: 0; z-index: 2; width: var(--s-2); height: 100%; cursor: col-resize; touch-action: none; }
  .dz-tabla-grande__asa::after { content: ""; position: absolute; top: var(--s-2); bottom: var(--s-2); left: var(--s-1); width: 1px; background: var(--line-2); transition: background var(--dur-1) var(--ease-out), width var(--dur-1) var(--ease-out); }
  @media (hover: hover) { .dz-tabla-grande__asa:hover::after { left: 3px; width: 3px; background: var(--focus); border-radius: var(--r-pill); } }
  .dz-tabla-grande__asa:focus-visible { outline: none; box-shadow: none; }
  .dz-tabla-grande__asa:focus-visible::after, .dz-tabla-grande__asa[data-dz-arrastrando]::after { left: 3px; width: 3px; top: 0; bottom: 0; background: var(--focus); border-radius: var(--r-pill); }
  .dz-tabla-grande__region[data-dz-redimensionando] { cursor: col-resize; user-select: none; }
  /* Acciones de fila. */
  .dz-tabla-grande__celda--acciones { width: var(--h-tactil); padding: 0; text-align: center; }
  .dz-tabla-grande__mas { opacity: 0; transition: opacity var(--dur-1) var(--ease-out); }
  .dz-tabla__fila:hover .dz-tabla-grande__mas, .dz-tabla__fila:focus-within .dz-tabla-grande__mas, .dz-tabla__fila:focus .dz-tabla-grande__mas, .dz-tabla__fila[data-dz-menu] .dz-tabla-grande__mas, .dz-tabla-grande__mas[aria-expanded="true"] { opacity: 1; }
  @media (hover: none), (pointer: coarse) {
    .dz-tabla-grande__mas { opacity: 1; }
    .dz-tabla-grande__region .dz-tabla__fila { -webkit-touch-callout: none; }
  }
  .dz-tabla__fila[data-dz-menu] > .dz-tabla__celda, .dz-tabla-grande__region .dz-tabla__fila[data-dz-menu] > .dz-tabla-grande__celda--fija { background: var(--surface-2); }
  .dz-tabla__fila[data-dz-menu][aria-selected="true"] > .dz-tabla__celda, .dz-tabla-grande__region .dz-tabla__fila[data-dz-menu][aria-selected="true"] > .dz-tabla-grande__celda--fija { background: var(--sel-bg); }
  /* Línea de estado bajo la región: dónde estás (filas 1 a 100 de 4,812), qué está montado y la selección; cifras tabulares. */
  .dz-tabla-grande__estado { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-4); margin: var(--s-2) 0 0; font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-tabla-grande__estado b { font-weight: 600; color: var(--text); }
  .dz-tabla-grande__estado-nota { color: var(--text-muted); }
  /* Herramientas: a la izquierda la cuenta, a la derecha las columnas. */
  .dz-tabla-grande__herramientas { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--s-2) var(--s-3); margin-bottom: var(--s-2); }
  .dz-tabla-grande__herramientas-derecha { display: flex; align-items: center; gap: var(--s-2); margin-left: auto; }
  .dz-tabla-grande__cuenta { margin: 0; font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-tabla-grande__cuenta b { font-weight: 600; color: var(--text); }
  .dz-tabla-grande__vacio[hidden] { display: none; }
  /* Franja de error de un bloque (modo remoto): el resto de la lista sigue viva. */
  .dz-tabla-grande__error-bloque > td { padding: var(--s-2); }
  .dz-tabla-grande__error-bloque .dz-aviso { position: sticky; left: var(--s-2); width: max-content; max-width: calc(100vw - var(--s-8)); }
  /* Columnas (popover): lista reordenable con casilla, asa y mover arriba o abajo con botones. */
  .dz-tabla-grande__columnas { display: grid; gap: var(--s-1); min-width: 0; }
  .dz-tabla-grande__columnas-titulo { margin: 0; font-weight: 600; }
  .dz-tabla-grande__columnas-lista { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; max-height: calc(var(--h-fila) * 8); overflow-y: auto; }
  .dz-tabla-grande__columna { display: flex; align-items: center; gap: var(--s-1); min-height: var(--dz-dens-barra, var(--h-barra)); padding: 0 var(--s-1); border-radius: var(--r-control); }
  .dz-tabla-grande__columna[data-dz-arrastrando] { background: var(--surface-2); box-shadow: var(--shadow-md); }
  .dz-tabla-grande__columna[data-dz-destino] { box-shadow: inset 0 2px 0 var(--focus); }
  .dz-tabla-grande__columna-asa { flex: none; display: inline-grid; place-items: center; width: var(--h-mini); height: var(--h-mini); color: var(--text-muted); cursor: grab; touch-action: none; }
  .dz-tabla-grande__columna .dz-casilla { flex: 1 1 auto; min-width: 0; }
  .dz-tabla-grande__columna-mover { display: inline-flex; gap: 0; opacity: 0; }
  .dz-tabla-grande__columna:hover .dz-tabla-grande__columna-mover, .dz-tabla-grande__columna:focus-within .dz-tabla-grande__columna-mover { opacity: 1; }
  @media (hover: none), (pointer: coarse) { .dz-tabla-grande__columna-mover { opacity: 1; } }
  .dz-tabla-grande__columnas-pie { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); padding-top: var(--s-2); border-top: 1px solid var(--hairline); }
  .dz-tabla-grande__columnas-nota { font-size: var(--fs-1); color: var(--text-muted); }
  /* A 390 px la casilla y el nombre quedan fijos, las columnas de menor prioridad parten ocultas (las recupera «Columnas») y los blancos miden 44 px. */
  @media (pointer: coarse) {
    .dz-tabla-grande__region .dz-tabla-grande__col-sel { width: var(--h-tactil); }
    .dz-tabla-grande__columna-menu { width: var(--h-tactil); height: var(--h-tactil); }
    /* El asa de ancho mide 44 px de ancho pegada al borde derecho de la columna, dentro de ella (la cabecera recorta lo que se sale); la raya sigue en el borde y el botón de
       orden queda debajo (su mitad derecha es aire) y el «⋯» encima, para ganar donde se solapan en una columna angosta. */
    .dz-tabla-grande__asa { width: var(--h-tactil); }
    .dz-tabla-grande__asa::after { left: auto; right: var(--s-1); }
    .dz-tabla-grande__asa:focus-visible::after, .dz-tabla-grande__asa[data-dz-arrastrando]::after { left: auto; right: calc(var(--s-1) - 1px); }
    .dz-tabla-grande__titulo-interior > .dz-tabla-grande__columna-menu { position: relative; z-index: 3; }
    .dz-tabla-grande__columna-asa { width: var(--h-tactil); height: var(--h-tactil); }
    .dz-tabla-grande__columna { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-tabla-grande__columna-menu, .dz-tabla-grande__mas, .dz-tabla-grande__asa::after { transition: none; }
  }
}

/* Tablero de pipeline, «carril abierto»: las columnas NO tienen caja; solo la cabecera (punto de etapa, nombre, cuenta, suma en MXN) y las tarjetas.
   La columna se dibuja como caja únicamente cuando recibe un arrastre (fondo --surface-2 y borde de control): en reposo su borde de 2 px es
   transparente, así no hay una caja gris compitiendo con las tarjetas. Hereda de tablero la región con foco, el desplazamiento horizontal con
   ajuste y, bajo 820 px de contenedor, columnas de 86 cqw con la siguiente asomando y un selector de etapa pegado a la izquierda. El hueco
   punteado marca dónde cae la tarjeta; su alto lo pone el comportamiento. Lleva dentro, ocultos, el menú «Mover a…», la hoja y los toasts. */
@layer dz.componentes {
  .dz-tablero-pipeline {
    container: dz-tablero-pipeline / inline-size;
    position: relative;
    min-width: 0;
    padding-bottom: var(--s-2);
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
    scrollbar-gutter: stable;
    border-radius: var(--r-card);
  }
  .dz-tablero-pipeline:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  /* Mientras hay una tarjeta levantada (ratón, dedo o teclado): sin selección de texto y sin ajuste, para que el autodesplazamiento sea fluido. */
  .dz-tablero-pipeline[data-dz-arrastrando] { cursor: grabbing; -webkit-user-select: none; user-select: none; scroll-snap-type: none; }
  .dz-tablero-pipeline[data-dz-arrastrando] * { cursor: grabbing; }
  .dz-tablero-pipeline__oculto,
  .dz-tablero-pipeline__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .dz-tablero-pipeline__carriles { display: flex; align-items: flex-start; gap: var(--s-3); width: max-content; min-width: 100%; }
  .dz-tablero-pipeline__columna {
    display: flex;
    flex: 1 0 var(--w-sub);
    flex-direction: column;
    gap: var(--s-2);
    box-sizing: border-box;
    width: var(--w-sub);
    min-width: 0;
    max-block-size: none;
    padding: var(--s-1);
    border: 2px solid transparent;
    border-radius: var(--r-card);
    scroll-snap-align: start;
    transition: background var(--dur-1) var(--ease-out), border-color var(--dur-1) var(--ease-out);
  }
  .dz-tablero-pipeline--alto .dz-tablero-pipeline__columna { max-block-size: var(--dz-tablero-alto, 70dvh); }
  .dz-tablero-pipeline__columna--destino { background: var(--surface-2); border-color: var(--border-control); }
  .dz-tablero-pipeline__columna--destino .dz-tablero-pipeline__vacia { display: none; }

  .dz-tablero-pipeline__cabecera { display: grid; flex: none; grid-template-columns: minmax(0, 1fr) auto; align-items: center; column-gap: var(--s-2); min-height: var(--h-control-sm); padding: 0 var(--s-1); }
  .dz-tablero-pipeline__etapa { display: flex; align-items: center; gap: var(--s-2); min-width: 0; margin: 0; font-size: var(--fs-2); font-weight: 600; letter-spacing: 0; color: var(--text); }
  .dz-tablero-pipeline__etapa-nombre { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-tablero-pipeline__punto { flex: none; width: var(--punto); height: var(--punto); border-radius: 50%; background: var(--st1); }
  .dz-tablero-pipeline__punto--st1 { background: var(--st1); }
  .dz-tablero-pipeline__punto--st2 { background: var(--st2); }
  .dz-tablero-pipeline__punto--st3 { background: var(--st3); }
  .dz-tablero-pipeline__punto--st4 { background: var(--st4); }
  .dz-tablero-pipeline__punto--st5 { background: var(--st5); }
  .dz-tablero-pipeline__punto--ganado { background: var(--st-won); }
  .dz-tablero-pipeline__punto--perdido { background: var(--st-lost); }
  .dz-tablero-pipeline__cuenta { display: inline-flex; align-items: center; height: var(--contador); padding: 0 var(--s-2); border-radius: var(--r-pill); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-1); font-weight: 500; font-variant-numeric: tabular-nums; }
  .dz-tablero-pipeline__suma { grid-column: 1 / -1; margin: 0; padding-bottom: var(--s-1); font-size: var(--fs-1); line-height: var(--lh-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }

  /* Lista de tarjetas: se desplaza sola cuando la columna tiene alto; el relleno y el margen negativo dejan sitio al anillo de foco. */
  .dz-tablero-pipeline__cuerpo { display: grid; flex: 1 1 auto; align-content: start; gap: var(--s-2); min-height: 0; margin: calc(-1 * var(--s-1)); padding: var(--s-1); overflow-y: auto; list-style: none; scrollbar-gutter: stable; }
  .dz-tablero-pipeline__hueco { box-sizing: border-box; min-height: var(--h-control); border: 1px dashed var(--accent-control); border-radius: var(--r-card); background: color-mix(in oklch, var(--surface-2) 55%, transparent); animation: dzpHueco var(--dur-1) var(--ease-out); }
  .dz-tablero-pipeline__hueco--origen { visibility: hidden; border: 0; animation: none; }
  @keyframes dzpHueco { from { opacity: 0; } }
  .dz-tablero-pipeline__vacia { margin: 0; padding: var(--s-4); border: 1px dashed var(--line-2); border-radius: var(--r-card); font-size: var(--fs-2); color: var(--text-muted); text-align: center; }
  .dz-tablero-pipeline__vacia[hidden] { display: none; }

  /* Selector de etapa: solo bajo 820 px de contenedor. */
  .dz-tablero-pipeline__selector { display: none; gap: var(--s-1); margin: 0; padding: 0 0 var(--s-3); overflow-x: auto; list-style: none; scrollbar-width: none; }
  .dz-tablero-pipeline__selector::-webkit-scrollbar { display: none; }
  .dz-tablero-pipeline__selector .dz-chip { flex: none; }
  .dz-tablero-pipeline__selector .dz-tablero-pipeline__punto { width: var(--punto-chip); height: var(--punto-chip); }
  .dz-tablero-pipeline__selector .dz-chip[aria-pressed="true"] .dz-tablero-pipeline__punto { background: var(--chip-on-text); }
  .dz-tablero-pipeline__selector-cuenta { font-variant-numeric: tabular-nums; }

  /* «Mover a…»: menú de escritorio (se coloca junto al botón) y hoja del teléfono. */
  .dz-tablero-pipeline__menu { position: fixed; right: auto; z-index: var(--z-dropdown); animation: none; }
  .dz-tablero-pipeline__menu[hidden] { display: none; }
  .dz-tablero-pipeline__item-nombre { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: left; }
  .dz-tablero-pipeline__actual { display: none; flex: none; font-size: var(--fs-1); font-weight: 400; color: var(--text-muted); }
  .dz-menu__item[aria-disabled="true"] { cursor: default; }
  .dz-menu__item[aria-disabled="true"] .dz-tablero-pipeline__actual { display: inline; }
  .dz-menu__item[aria-disabled="true"] .dz-tablero-pipeline__item-nombre { color: var(--text-muted); }
  .dz-tablero-pipeline__hoja-nota { margin: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-tablero-pipeline__hoja-lista { display: grid; gap: var(--s-1); }

  /* Teléfono: columnas de 86 cqw (la siguiente asoma), menos aire entre ellas y el selector de etapa pegado a la izquierda. */
  @container dz-tablero-pipeline (max-width: 820px) {
    .dz-tablero-pipeline__carriles { gap: var(--s-2); width: auto; }
    .dz-tablero-pipeline__columna { flex: 0 0 86cqw; width: 86cqw; }
    .dz-tablero-pipeline__selector { position: sticky; left: 0; display: flex; }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-tablero-pipeline__columna, .dz-tablero-pipeline__hueco { animation: none; transition: none; }
  }
}

/* Tarjeta de lead del pipeline: cuatro renglones (nombre; valor y días en la etapa; siguiente acción; asesor y «Mover a…»). Borde de 1 px y SIN sombra
   en reposo; en hover solo el borde sube a --line-2 (nada se levanta). La sombra entra únicamente al levantarla, y entonces el borde desaparece:
   nunca borde y sombra a la vez. Toda la tarjeta es un solo foco (anillo en su contorno; el enlace del nombre no lleva anillo propio). «Mover a…»
   se revela con el puntero fino (hover o foco dentro) y está siempre a la vista con puntero grueso o bajo 820 px. Con movimiento reducido no hay
   transición ni animación: la tarjeta aparece en el destino. */
@layer dz.componentes {
  .dz-tarjeta-pipeline {
    position: relative;
    display: grid;
    gap: var(--s-2);
    box-sizing: border-box;
    margin: 0;
    padding: var(--s-3);
    list-style: none;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    -webkit-touch-callout: none;
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out), opacity var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) { .dz-tarjeta-pipeline:hover { border-color: var(--line-2); } }
  @media (pointer: fine) { .dz-tarjeta-pipeline { cursor: grab; } }
  .dz-tarjeta-pipeline[data-ds-estado="hover"] { border-color: var(--line-2); }
  .dz-tarjeta-pipeline:focus-visible,
  .dz-tarjeta-pipeline[data-ds-estado="foco"] { outline: none; box-shadow: var(--ring); }
  .dz-tarjeta-pipeline__oculto { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
  .dz-tarjeta-pipeline__cabeza { display: flex; align-items: flex-start; gap: var(--s-2); min-width: 0; }
  .dz-tarjeta-pipeline__nombre {
    flex: 1 1 auto;
    min-width: 0;
    font-size: var(--fs-3);
    font-weight: 600;
    line-height: var(--lh-2);
    color: var(--text);
    text-decoration: none;
    overflow-wrap: anywhere;
    text-wrap: balance;
  }
  /* Toda la tarjeta abre el lead: el enlace del nombre se estira sobre la tarjeta (ella es la referencia de posición) y «Mover a…» queda por encima. */
  .dz-tarjeta-pipeline__nombre::after { content: ""; position: absolute; inset: 0; }
  @media (hover: hover) { .dz-tarjeta-pipeline__nombre:hover { color: var(--link-hover); text-decoration: none; } }
  .dz-tarjeta-pipeline__nombre:focus-visible { outline: none; }
  .dz-tarjeta-pipeline__linea { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); min-width: 0; }
  .dz-tarjeta-pipeline__valor { font-size: var(--fs-3); font-weight: 500; line-height: var(--lh-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
  .dz-tarjeta-pipeline__valor small { margin-left: var(--s-1); font-size: var(--fs-1); font-weight: 400; color: var(--text-muted); }
  .dz-tarjeta-pipeline__dias { flex: none; font-variant-numeric: tabular-nums; }
  .dz-tarjeta-pipeline__dias--larga { color: var(--text); font-weight: 600; }
  .dz-tarjeta-pipeline__siguiente { display: flex; align-items: center; gap: var(--s-1); min-width: 0; font-size: var(--fs-2); color: var(--text-2); }
  .dz-tarjeta-pipeline__siguiente > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-tarjeta-pipeline__siguiente--vencida { color: var(--bad-text); }
  .dz-tarjeta-pipeline__siguiente--sin { color: var(--text-muted); }
  .dz-tarjeta-pipeline__pie { display: flex; align-items: center; gap: var(--s-2); min-width: 0; padding-top: var(--s-2); border-top: 1px solid var(--border); }
  .dz-tarjeta-pipeline__asesor { display: flex; flex: 1 1 auto; align-items: center; gap: var(--s-2); min-width: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-tarjeta-pipeline__asesor > span:last-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-tarjeta-pipeline__mover { position: relative; z-index: 1; flex: none; margin: calc(-1 * var(--s-1)) calc(-1 * var(--s-1)) calc(-1 * var(--s-1)) 0; }
  @media (hover: hover) and (pointer: fine) {
    .dz-tarjeta-pipeline__mover { opacity: 0; transition: opacity var(--dur-1) var(--ease-out), background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out); }
    .dz-tarjeta-pipeline:hover .dz-tarjeta-pipeline__mover,
    .dz-tarjeta-pipeline:focus-within .dz-tarjeta-pipeline__mover,
    .dz-tarjeta-pipeline__mover:focus-visible,
    .dz-tarjeta-pipeline__mover[aria-expanded="true"] { opacity: 1; }
  }
  @media (max-width: 820px) { .dz-tarjeta-pipeline__mover { opacity: 1; } }

  /* Tomada con el teclado: anillo sobre la sombra, sin borde. Levantada con el puntero: sombra, 92 % y escala, sin borde. */
  .dz-tarjeta-pipeline[data-dz-tomada] { border-color: transparent; box-shadow: var(--ring), var(--shadow-md); }
  .dz-tarjeta-pipeline--arrastrando {
    position: fixed;
    z-index: var(--z-dropdown);
    margin: 0;
    border-color: transparent;
    box-shadow: var(--shadow-md);
    opacity: .92;
    transform: scale(1.02);
    pointer-events: none;
    cursor: grabbing;
  }
  .dz-tarjeta-pipeline--regresando { transition: transform var(--dur-2) var(--ease-out), opacity var(--dur-2) var(--ease-out); }
  .dz-tarjeta-pipeline--aterrizada { animation: dzpAterriza var(--dur-3) var(--ease-out); }
  @keyframes dzpAterriza { 0% { transform: translateY(calc(-1 * var(--s-1))) scale(1.02); } 60% { transform: translateY(1px); } 100% { transform: none; } }
  /* Esperando que quien la usa confirme el movimiento. */
  .dz-tarjeta-pipeline[aria-busy="true"] { opacity: .72; pointer-events: none; }
  .dz-tarjeta-pipeline--cargando { pointer-events: none; cursor: default; }
  .dz-tarjeta-pipeline--cargando .dz-esqueleto { border-radius: var(--r-1); }
  .dz-tarjeta-pipeline--cargando .dz-esqueleto--circulo { width: var(--h-mini); height: var(--h-mini); border-radius: 50%; }
  @media (prefers-reduced-motion: reduce) {
    .dz-tarjeta-pipeline, .dz-tarjeta-pipeline__mover { transition: none; }
    .dz-tarjeta-pipeline--aterrizada { animation: none; }
  }
}

/* Teclado de marcación: el campo del número como contenedor con borde (el foco se dibuja en el contorno con :focus-within y el input de adentro va sin anillo), la línea de
   quién es, doce teclas redondas con sus letras y la barra de ajustes, Llamar y borrar. Llamar en verde y apagado en gris neutro mientras no alcanzan los dígitos. Con --tonos
   es solo la rejilla, más chica, para mandar tonos en una llamada. */
@layer dz.componentes {
  .dz-teclado-marcacion { display: grid; gap: 0; min-width: 0; }
  /* El marcador es el panel flotante del teléfono: ancho propio, hairline translúcido y sombra. Plano va sin marco y a todo el ancho; el de tonos vive dentro de la llamada. */
  .dz-teclado-marcacion:not(.dz-teclado-marcacion--tonos):not(.dz-teclado-marcacion--plano) {
    box-sizing: border-box;
    width: var(--w-telefono);
    max-width: calc(100vw - var(--s-4) * 2);
    overflow: hidden;
    border: 1px solid var(--hairline);
    border-radius: var(--r-4);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
  }
  .dz-teclado-marcacion__cabecera { padding: var(--s-4) var(--s-4) var(--s-2); }
  .dz-teclado-marcacion__quien { display: grid; gap: var(--s-2); padding: var(--s-1) var(--s-4) var(--s-3); }
  .dz-teclado-marcacion__campo {
    display: flex;
    align-items: center;
    height: var(--h-boton-llamada);
    box-sizing: border-box;
    padding: 0 var(--s-4);
    border: 1px solid var(--line-2);
    border-radius: var(--r-3);
    background: var(--surface-2);
    transition: border-color var(--dur-1) var(--ease-out), box-shadow var(--dur-1) var(--ease-out);
  }
  .dz-teclado-marcacion__campo:focus-within { border-color: var(--field-line); box-shadow: var(--ring); }
  .dz-teclado-marcacion__numero,
  .dz-teclado-marcacion__numero:focus,
  .dz-teclado-marcacion__numero:focus-visible {
    flex: 1;
    min-width: 0;
    width: auto;
    height: 100%;
    padding: 0;
    border: 0;
    outline: none;
    box-shadow: none;
    animation: none;
    background: transparent;
    color: var(--text);
    font-family: var(--font);
    font-size: var(--fs-6);
    font-weight: 500;
    line-height: 1;
    letter-spacing: .02em;
    font-variant-numeric: tabular-nums;
    caret-color: var(--accent-control);
  }
  .dz-teclado-marcacion__numero::placeholder { color: var(--text-muted); }
  .dz-teclado-marcacion__dice { margin: 0; min-height: var(--s-4); font-size: var(--fs-2); line-height: var(--lh-2); color: var(--accent-text); }
  .dz-teclado-marcacion__dice[data-dz-tono="aviso"] { color: var(--warn-text); }
  .dz-teclado-marcacion__dice[data-dz-tono="malo"] { color: var(--bad-text); }
  .dz-teclado-marcacion__teclas { display: grid; grid-template-columns: repeat(3, var(--tecla)); justify-content: space-between; gap: var(--s-3) 0; padding: var(--s-2) calc(var(--s-7) + var(--s-2)) var(--s-4); }
  .dz-teclado-marcacion__tecla {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--s-1);
    width: var(--tecla);
    height: var(--tecla);
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: var(--surface-2);
    color: var(--text);
    font-family: inherit;
    cursor: pointer;
    user-select: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: transparent;
    transition: background var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out);
  }
  .dz-teclado-marcacion__digito { font-size: var(--fs-7); font-weight: 500; line-height: 1; }
  .dz-teclado-marcacion__letras { min-height: var(--s-3); font-size: var(--fs-1); font-weight: 500; line-height: 1; letter-spacing: .06em; color: var(--text-2); }
  /* El asterisco vive alto en la tipografía: se baja para centrarlo a ojo. */
  .dz-teclado-marcacion__tecla--simbolo[data-dz-tecla="*"] { padding-top: var(--s-3); }
  .dz-teclado-marcacion__tecla--simbolo[data-dz-tecla="#"] { padding-top: var(--s-1); }
  @media (hover: hover) { .dz-teclado-marcacion__tecla:hover { background: var(--surface-3); } }
  .dz-teclado-marcacion__tecla:active,
  .dz-teclado-marcacion__tecla[data-dz-pulsada] { background: var(--border-control); transform: scale(.96); }
  .dz-teclado-marcacion__tecla:focus-visible { outline: none; box-shadow: var(--ring); }
  .dz-teclado-marcacion__barra { display: grid; grid-template-columns: 1fr var(--h-boton-llamada); gap: var(--s-2); padding: var(--s-4); border-top: 1px solid var(--hairline); }
  .dz-teclado-marcacion__barra--ajustes { grid-template-columns: var(--h-boton-llamada) 1fr var(--h-boton-llamada); }
  .dz-teclado-marcacion .dz-teclado-marcacion__accion { box-sizing: border-box; width: auto; min-width: 0; height: var(--h-boton-llamada); padding: 0; justify-content: center; border-radius: var(--r-3); border-color: var(--hairline); background: var(--surface-2); color: var(--text-2); }
  .dz-teclado-marcacion .dz-teclado-marcacion__accion svg { width: var(--ico-3); height: var(--ico-3); }
  @media (hover: hover) { .dz-teclado-marcacion .dz-teclado-marcacion__accion:hover:not(.dz-boton--llamar) { background: var(--surface-3); color: var(--text); } }
  .dz-teclado-marcacion .dz-teclado-marcacion__llamar { gap: var(--s-2); font-size: var(--fs-4); font-weight: 600; border-color: var(--llamar-bg); background: var(--llamar-bg); color: var(--ink-on-llamar); }
  .dz-teclado-marcacion .dz-teclado-marcacion__llamar[aria-disabled="true"] { border-color: var(--hairline); background: var(--surface-2); color: var(--text-muted); }
  /* Con el dedo no se achica nada: la barra y las teclas ya miden más de 44 px. Solo el teclado de tonos baja de tamaño, y sus teclas siguen por encima de los 44. */
  .dz-teclado-marcacion--tonos .dz-teclado-marcacion__teclas { grid-template-columns: repeat(3, var(--h-boton-llamada)); grid-auto-rows: var(--h-boton-llamada); gap: var(--s-2) 0; padding: 0 var(--s-8) var(--s-4); }
  .dz-teclado-marcacion--tonos .dz-teclado-marcacion__tecla { width: var(--h-boton-llamada); height: var(--h-boton-llamada); }
  .dz-teclado-marcacion--tonos .dz-teclado-marcacion__digito { font-size: var(--fs-6); }
  @media (prefers-reduced-motion: reduce) { .dz-teclado-marcacion__campo, .dz-teclado-marcacion__tecla { transition: none; } .dz-teclado-marcacion__tecla:active, .dz-teclado-marcacion__tecla[data-dz-pulsada] { transform: none; } }
  @media (forced-colors: active) { .dz-teclado-marcacion__tecla { border: 1px solid ButtonText; } }
}

/* Toast: superficie con hairline y sombra, abajo al centro. Texto, acción opcional (Deshacer con su atajo) y cerrar. role="status" para lo que
   informa y role="alert" para lo que falla. No toma el foco ni entra en la pila de capas: se va solo y se detiene con el puntero o el foco. */
@layer dz.componentes {
  .dz-toast {
    position: fixed;
    bottom: calc(var(--s-6) + env(safe-area-inset-bottom));
    left: 50%;
    translate: -50% 0;
    z-index: var(--z-toast);
    display: flex;
    align-items: center;
    gap: var(--s-1);
    max-width: min(var(--w-toast), 92%);
    padding: var(--s-1);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    animation: dzEntra var(--dur-2) var(--ease-out);
    transition: opacity var(--dur-2) var(--ease-out), translate var(--dur-2) var(--ease-out);
  }
  .dz-toast[hidden] { display: none; }
  /* En la capa del documento (popover="manual") el navegador le pone inset 0, margen automático, desborde y texto de lienzo: se devuelve a la posición de siempre. */
  .dz-toast[popover] { top: auto; right: auto; width: auto; height: auto; margin: 0; overflow: visible; }
  .dz-toast[popover]:not(:popover-open):not([hidden]) { display: flex; }
  .dz-toast--error { background: var(--bad-soft); color: var(--bad-text); }
  .dz-toast[data-dz-saliendo] { opacity: 0; translate: -50% var(--s-1); transition-duration: var(--dur-1); }
  .dz-toast__cuerpo { flex: 1 1 auto; min-width: 0; padding: var(--s-3); font-size: var(--fs-2); line-height: var(--lh-3); overflow-wrap: break-word; }
  .dz-toast__accion { flex: none; }
  .dz-toast__atajo { margin-left: var(--s-1); padding: 0 var(--s-1); border: 1px solid var(--hairline); border-radius: var(--r-1); font-family: inherit; font-size: var(--fs-1); line-height: var(--lh-2); color: var(--text-muted); }
  .dz-toast__cerrar { flex: none; color: inherit; }
  .dz-toast__detalle { margin-top: var(--s-1); font-size: var(--fs-1); color: var(--text-2); }
  .dz-toast__detalle > summary { cursor: pointer; }
  .dz-toast[data-dz-pila] { bottom: calc(var(--s-6) + var(--dz-toast-sube, 0px) + env(safe-area-inset-bottom)); }
  .dz-toast--muestra { position: static; translate: none; max-width: var(--w-toast); animation: none; }
  @media (max-width: 820px) {
    .dz-toast, .dz-toast[popover] { bottom: calc(var(--cascaron-bar) + var(--s-2) + env(safe-area-inset-bottom)); left: var(--s-2); right: var(--s-2); translate: none; max-width: none; }
    .dz-toast[data-dz-pila] { bottom: calc(var(--cascaron-bar) + var(--s-2) + var(--dz-toast-sube, 0px) + env(safe-area-inset-bottom)); }
    .dz-toast[data-dz-saliendo] { translate: 0 var(--s-1); }
    .dz-toast--muestra { left: auto; right: auto; max-width: var(--w-toast); }
    .dz-toast:has(.dz-toast__accion) { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; padding-bottom: var(--s-2); }
    .dz-toast:has(.dz-toast__accion) .dz-toast__accion { grid-column: 1 / -1; grid-row: 2; justify-self: end; margin-right: var(--s-2); }
  }
  @media (pointer: coarse) {
    .dz-toast__cerrar { width: var(--h-tactil); height: var(--h-tactil); }
    /* «Detalle para soporte» medía 18 px con el dedo: el renglón del resumen sube a 44. */
    .dz-toast__detalle > summary { display: flex; align-items: center; min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) { .dz-toast { animation: none; transition: none; } }
}

/* Tooltip: el nombre corto de un control (tinta invertida) o, en lista, la ayuda de tres a cinco renglones (superficie con hairline).
   Sale con el puntero tras 300 ms y de inmediato con el foco; el puntero puede cruzar al globo sin que se vaya (WCAG 1.4.13) y Esc lo descarta
   hasta que el foco o el puntero salgan (data-dz-cerrado). El lado se elige al pintar: arriba, abajo, izquierda o derecha. */
@layer dz.componentes {
  .dz-tooltip { position: relative; display: inline-flex; }
  .dz-tooltip__globo {
    position: absolute;
    left: 50%;
    bottom: calc(100% + var(--s-1) + 2px);
    z-index: var(--z-dropdown);
    width: max-content;
    max-width: var(--w-globo);
    padding: var(--s-1) var(--s-2);
    border-radius: var(--r-2);
    background: var(--text);
    color: var(--bg);
    font-size: var(--fs-1);
    font-weight: 500;
    line-height: var(--lh-2);
    white-space: normal;
    box-shadow: var(--shadow-sm);
    pointer-events: none;
    opacity: 0;
    visibility: hidden;
    transform: translateX(-50%) translateY(2px);
    transition: opacity var(--dur-1) var(--ease-out), transform var(--dur-1) var(--ease-out), visibility 0s linear var(--dur-1);
  }
  /* El puente: un borde invisible del ancho del hueco entre el globo y su control, para que el puntero lo cruce sin que el globo se vaya
     (WCAG 1.4.13, «se puede pasar el cursor encima»). Solo recibe el puntero mientras el globo está a la vista (pointer-events lo decide el globo). */
  .dz-tooltip__globo::before { content: ""; position: absolute; inset: calc((var(--s-1) + 2px) * -1); }
  .dz-tooltip__globo--lista {
    padding: var(--s-3) var(--s-4);
    border: 1px solid var(--hairline);
    border-radius: var(--r-card);
    background: var(--surface);
    color: var(--text);
    box-shadow: var(--shadow-md);
    font-size: var(--fs-2);
    font-weight: 400;
    pointer-events: auto;
    width: max-content;
    max-width: var(--w-globo-lista);
  }
  /* La lista va en una <dl> dentro del globo (el globo es el role="tooltip"; una <dl> con ese rol perdería sus dt y dd): hereda la tinta y el interlineado del globo. */
  .dz-tooltip__globo--lista .dz-ayuda { color: inherit; line-height: inherit; }
  @media (hover: hover) {
    .dz-tooltip:hover:not([data-dz-cerrado]) .dz-tooltip__globo,
    .dz-tooltip__globo:hover { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(-50%) translateY(0); transition-delay: var(--dur-3); }
  }
  .dz-tooltip:focus-within:not([data-dz-cerrado]) .dz-tooltip__globo,
  .dz-tooltip--visible .dz-tooltip__globo { opacity: 1; visibility: visible; pointer-events: auto; transform: translateX(-50%) translateY(0); transition-delay: 0s; }
  .dz-tooltip--abajo .dz-tooltip__globo { bottom: auto; top: calc(100% + var(--s-1) + 2px); transform: translateX(-50%) translateY(-2px); }
  .dz-tooltip--izquierda .dz-tooltip__globo,
  .dz-tooltip--derecha .dz-tooltip__globo { bottom: auto; top: 50%; }
  .dz-tooltip--izquierda .dz-tooltip__globo { left: auto; right: calc(100% + var(--s-1) + 2px); transform: translateY(-50%) translateX(2px); }
  .dz-tooltip--derecha .dz-tooltip__globo { left: calc(100% + var(--s-1) + 2px); transform: translateY(-50%) translateX(-2px); }
  @media (hover: hover) {
    .dz-tooltip--abajo:hover:not([data-dz-cerrado]) .dz-tooltip__globo { transform: translateX(-50%) translateY(0); }
    .dz-tooltip--izquierda:hover:not([data-dz-cerrado]) .dz-tooltip__globo,
    .dz-tooltip--derecha:hover:not([data-dz-cerrado]) .dz-tooltip__globo { transform: translateY(-50%); }
  }
  .dz-tooltip--abajo:focus-within:not([data-dz-cerrado]) .dz-tooltip__globo,
  .dz-tooltip--abajo.dz-tooltip--visible .dz-tooltip__globo { transform: translateX(-50%) translateY(0); }
  .dz-tooltip--izquierda:focus-within:not([data-dz-cerrado]) .dz-tooltip__globo,
  .dz-tooltip--derecha:focus-within:not([data-dz-cerrado]) .dz-tooltip__globo,
  .dz-tooltip--izquierda.dz-tooltip--visible .dz-tooltip__globo,
  .dz-tooltip--derecha.dz-tooltip--visible .dz-tooltip__globo { transform: translateY(-50%); }
  @media (max-width: 560px) { .dz-tooltip__globo--lista { width: min(var(--w-globo-lista), calc(100vw - var(--s-6) * 2)); } }
  @media (prefers-reduced-motion: reduce) { .dz-tooltip__globo { transition: none; } }
}

/* Velo de entrada: pantalla completa, traslúcida, con el logo armándose y una barra de progreso de total conocido. El velo se va en cuanto
   termina la carga (ACB-236): no tiene tiempo fijo, solo un piso corto para que no parpadee. Todos sus tiempos salen de la escala de
   tokens (--dur-*), ninguno es un valor suelto. La salida (--dur-3) es más corta que la entrada (ACB-12), el desenfoque queda fijo y solo
   baja la opacidad; la apertura es el fundido de una capa de color, no el cambio de «background» sobre una capa con desenfoque. Con
   movimiento reducido el logo aparece entero, la barra salta sin transición y la salida es solo opacidad. */
@layer dz.componentes {
  .dz-velo-entrada {
    --velo-subrayado: currentColor; --velo-funde: var(--dur-4); --velo-salta: var(--dur-4); --velo-salta-ret: calc(var(--dur-respira) + var(--dur-3)); --velo-abre-ret: calc(var(--dur-respira) + var(--dur-2)); --velo-abre: calc(var(--dur-4) + var(--dur-3)); --velo-desenfoque: var(--velo-blur); --velo-sube: var(--s-1); --velo-pista: var(--s-1);
    position: fixed; inset: 0; z-index: var(--z-velo-entrada); display: grid; place-items: center; box-sizing: border-box;
    background: transparent; color: var(--text); font-family: var(--font);
    -webkit-backdrop-filter: blur(var(--velo-desenfoque)) saturate(1.1); backdrop-filter: blur(var(--velo-desenfoque)) saturate(1.1);
    transition: opacity var(--dur-3) var(--ease-out);
  }
  .dz-velo-entrada::before { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--bg); animation: dz-velo-abre var(--velo-abre) var(--ease-velo) var(--velo-abre-ret) forwards; }
  .dz-velo-entrada[hidden] { display: none; }
  .dz-velo-entrada--incrustado { position: absolute; }
  @keyframes dz-velo-abre { from { opacity: 1; } to { opacity: .72; } }
  @supports not (backdrop-filter: blur(1px)) { .dz-velo-entrada::before { animation: none; opacity: 1; } }
  .dz-velo-entrada--fuera { opacity: 0; pointer-events: none; }
  .dz-velo-entrada__logo { display: block; transition: transform var(--dur-3) var(--ease-out), opacity var(--dur-3) var(--ease-out); }
  .dz-velo-entrada__logo svg { overflow: visible; height: var(--h-barra); width: auto; }
  /* El subrayado del logo tiene color propio de la pieza (2.3.0): --velo-subrayado. El color de marca es del producto, no del núcleo: el producto da su color a --velo-subrayado sobre el velo. Sin él queda en la tinta del logo. */
  .dz-velo-entrada__logo [class~="dz-subrayado"] { fill: var(--velo-subrayado, currentColor); }
  .dz-velo-entrada--fuera .dz-velo-entrada__logo { transform: scale(1.04); opacity: 0; }
  .dz-velo-entrada__carga {
    position: absolute; top: calc(50% + var(--h-barra) / 2 + var(--s-6)); left: 0; right: 0; margin: 0 auto; width: var(--w-sub);
    display: flex; flex-direction: column; align-items: center; gap: var(--s-3);
    animation: dz-velo-funde var(--velo-funde) var(--ease-enfasis) var(--velo-abre-ret) both;
  }
  @keyframes dz-velo-funde { from { opacity: 0; transform: translateY(var(--velo-sube)); } to { opacity: 1; transform: none; } }
  .dz-velo-entrada--fuera .dz-velo-entrada__carga { animation: none; opacity: 0; transition: opacity var(--dur-3) var(--ease-out); }
  .dz-velo-entrada__pista {
    display: block; width: 100%; height: var(--velo-pista); border: 0; border-radius: var(--r-pill); overflow: hidden; background: var(--surface-3);
    -webkit-appearance: none; appearance: none;
  }
  .dz-velo-entrada__pista::-webkit-progress-bar { background: var(--surface-3); border-radius: var(--r-pill); }
  .dz-velo-entrada__pista::-webkit-progress-value { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-velo-entrada__pista::-moz-progress-bar { background: var(--accent-control); border-radius: var(--r-pill); }
  .dz-velo-entrada__paso { min-height: var(--fs-1); font-size: var(--fs-1); font-weight: 500; line-height: 1; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
  .dz-velo-entrada__saltar {
    margin-top: var(--s-2); height: var(--dz-dens-barra, var(--h-barra)); padding: 0 var(--s-4); border: 1px solid var(--border-control); border-radius: var(--r-pill);
    background: transparent; color: var(--text-2); font-family: inherit; font-size: var(--fs-2); font-weight: 500; cursor: pointer;
    opacity: 0; animation: dz-velo-salta var(--velo-salta) var(--ease-velo) var(--velo-salta-ret) forwards;
  }
  @keyframes dz-velo-salta { to { opacity: 1; } }
  .dz-velo-entrada__saltar:focus-visible { opacity: 1; outline: none; box-shadow: var(--ring); }
  .dz-velo-entrada--fuera .dz-velo-entrada__saltar { opacity: 0; transition: opacity var(--dur-2); }
  @media (hover: hover) { .dz-velo-entrada__saltar:hover { background: var(--surface-2); color: var(--text); } }
  @media (pointer: coarse) { .dz-velo-entrada__saltar { height: var(--h-tactil); } }
  @media (max-width: 560px) { .dz-velo-entrada__logo svg { height: var(--h-tactil); } }
  @media (prefers-reduced-motion: reduce) {
    .dz-velo-entrada::before { animation: none; opacity: .72; }
    .dz-velo-entrada--fuera .dz-velo-entrada__logo { transform: none; }
    .dz-velo-entrada__carga { animation: none; }
    .dz-velo-entrada__saltar { animation: none; opacity: 1; }
  }
}

/* Visor: el diálogo modal a pantalla completa de la galería. Va sobre un velo opaco oscuro igual en los dos temas (está sobre la foto, no sobre la
   página): el texto es --c-gris-0 sobre --mascara-opaca, el hover de sus botones fantasma es --c-blanco-13 y el foco, un aro claro. El grid (barra,
   escena, pie) vive en el panel y no en la raíz; si no, el pie se sale del viewport. Ampliar al doble es una transformación con --dur-2, sin
   transición con movimiento reducido (lo apaga base.css); ampliada, arrastrar mueve la foto (--dz-pan-x y --dz-pan-y los pone el comportamiento). */
@layer dz.componentes {
  .dz-visor { position: fixed; inset: 0; z-index: var(--z-hoja); display: grid; grid-template-rows: minmax(0, 1fr); background: var(--mascara-opaca); color: var(--c-gris-0); overscroll-behavior: contain; }
  .dz-visor[hidden] { display: none; }
  .dz-visor--muestra { position: relative; inset: auto; z-index: auto; height: calc(var(--h-fila) * 12); border-radius: var(--r-card); overflow: hidden; }
  .dz-visor__panel { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; min-height: 0; height: 100%; }
  .dz-visor__panel:focus-visible { outline: none; }
  .dz-visor__barra { display: flex; align-items: center; gap: var(--s-2); padding: var(--s-2) var(--s-3); padding-top: calc(var(--s-2) + env(safe-area-inset-top)); }
  .dz-visor__contador { font-size: var(--fs-2); font-variant-numeric: tabular-nums; color: var(--c-gris-0); }
  .dz-visor__titulo { flex: 1 1 auto; min-width: 0; margin: 0; font-size: var(--fs-2); font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .dz-visor .dz-boton--fantasma { color: var(--c-gris-0); }
  @media (hover: hover) { .dz-visor .dz-boton--fantasma:hover:not(:disabled) { background: var(--c-blanco-13); color: var(--c-gris-0); } }
  .dz-visor .dz-boton--fantasma[data-ds-estado="hover"] { background: var(--c-blanco-13); color: var(--c-gris-0); }
  .dz-visor .dz-boton--fantasma[data-ds-estado="foco"] { box-shadow: 0 0 0 1.5px var(--c-gris-0); }
  .dz-visor .dz-boton--fantasma[aria-pressed="true"] { background: var(--c-blanco-13); color: var(--c-gris-0); }
  .dz-visor .dz-boton:focus-visible { box-shadow: 0 0 0 1.5px var(--c-gris-0); }
  .dz-visor__escena { position: relative; display: flex; align-items: center; justify-content: center; min-height: 0; overflow: hidden; touch-action: none; }
  .dz-visor__img { max-width: 100%; max-height: 100%; object-fit: contain; cursor: zoom-in; user-select: none; transition: transform var(--dur-2) var(--ease-out), opacity var(--dur-2) var(--ease-out); }
  .dz-visor__img[data-zoom="2"] { transform: translate(var(--dz-pan-x, 0px), var(--dz-pan-y, 0px)) scale(2); cursor: grab; }
  .dz-visor__img[data-zoom="2"][data-dz-arrastre] { cursor: grabbing; transition: opacity var(--dur-2) var(--ease-out); }
  .dz-visor__flecha { position: absolute; top: 50%; transform: translateY(-50%); }
  .dz-visor__flecha--ant { left: var(--s-3); }
  .dz-visor__flecha--sig { right: var(--s-3); }
  .dz-visor__pie { display: flex; align-items: center; gap: var(--s-3); padding: var(--s-3); padding-bottom: calc(var(--s-3) + env(safe-area-inset-bottom)); font-size: var(--fs-2); line-height: var(--lh-2); }
  .dz-visor__alt { flex: 1 1 auto; margin: 0; color: var(--c-gris-0); }
  .dz-visor__error { margin: 0; color: var(--c-gris-0); font-weight: 500; }
  .dz-visor__cargando { position: absolute; inset: auto 0 var(--s-3); margin: 0; text-align: center; color: var(--c-gris-0); font-size: var(--fs-2); pointer-events: none; }
  .dz-visor__cargando[hidden], .dz-visor__error[hidden], .dz-visor__fotos { display: none; }
  .dz-visor__teclas,
  .dz-visor__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  /* A 560 px o menos se sigue pudiendo deslizar, pero las flechas no desaparecen (UCB-131): bajan a las esquinas inferiores de la escena, de 44 px, sobre un velo
     oscuro para que se lean sobre cualquier foto. */
  @media (max-width: 560px) {
    .dz-visor__flecha { top: auto; bottom: var(--s-2); transform: none; background: var(--mascara-opaca); }
    .dz-visor__flecha--ant { left: var(--s-2); }
    .dz-visor__flecha--sig { right: var(--s-2); }
    .dz-visor__pie { flex-wrap: wrap; }
  }
}

/* Ajustes: navegación de secciones a la izquierda, la sección activa en una columna de lectura y el pie de guardar pegado abajo. Bajo
   820 px del contenedor la navegación pasa arriba como una fila que se desplaza, medida contra el contenedor y no contra la ventana. */
@layer dz.componentes {
  .dz-ajustes {
    container: dz-ajustes / inline-size;
    min-width: 0;
  }
  .dz-ajustes__rejilla {
    display: grid;
    grid-template-columns: var(--w-sub) minmax(0, 1fr);
    gap: var(--s-6);
    align-items: start;
    min-width: 0;
  }
  .dz-ajustes__navegacion { position: sticky; top: var(--s-4); min-width: 0; }
  .dz-ajustes__principal { display: flex; flex-direction: column; gap: var(--s-5); max-width: var(--w-lectura); min-width: 0; }
  .dz-ajustes__cabecera { min-width: 0; }
  .dz-ajustes__cuerpo { display: flex; flex-direction: column; gap: var(--s-5); min-width: 0; }
  .dz-ajustes__pie { position: sticky; bottom: 0; }
  @container dz-ajustes (max-width: 820px) {
    .dz-ajustes__rejilla { grid-template-columns: minmax(0, 1fr); gap: var(--s-4); }
    .dz-ajustes__navegacion { position: static; }
    /* La pieza pestanas-verticales pasa a fila con @media de la ventana; dentro de Ajustes manda el ancho del contenedor, para que un marco
       de 390 en una ventana ancha (regresión visual, panel lateral, vista previa) también la vea en fila. Mismas reglas que su @media. */
    .dz-ajustes__navegacion .dz-pestanas-verticales { flex-direction: row; width: 100%; max-height: none; overflow-x: auto; overflow-y: hidden; gap: var(--s-1); padding-bottom: var(--s-1); }
    .dz-ajustes__navegacion .dz-pestanas-verticales__pestana { width: auto; flex: none; white-space: nowrap; }
    .dz-ajustes__navegacion .dz-pestanas-verticales__grupo { display: none; }
  }
}

/* Auth-shell: SOLO el contenedor de las pantallas de acceso. Una tarjeta centrada en la región main, con la ranura del logo animado arriba y
   la del fondo animado detrás (aria-hidden). La pantalla completa de Acceso llega en la ola E2b. */
@layer dz.componentes {
  .dz-auth-shell {
    position: relative;
    display: grid;
    place-items: center;
    min-height: 100vh;
    min-height: 100dvh;
    padding: var(--page-pad);
    box-sizing: border-box;
    background: var(--bg);
    color: var(--text);
    font-family: var(--font);
    overflow: hidden;
    isolation: isolate;
  }
  .dz-auth-shell__fondo { position: absolute; inset: 0; z-index: -1; pointer-events: none; overflow: hidden; }
  .dz-auth-shell__controles { position: absolute; right: var(--s-3); bottom: var(--s-3); z-index: 1; }
  .dz-auth-shell__tarjeta {
    width: 100%;
    max-width: var(--w-modal);
    padding: var(--s-6);
    box-sizing: border-box;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: var(--shadow-md);
  }
  .dz-auth-shell__tarjeta:focus { outline: none; }
  /* En la tarjeta de acceso el botón ocupa el ancho y su texto va al centro (Alex, 23-oct-2026); el botón base, como el de LeadZ, no centra. */
  .dz-auth-shell__tarjeta .dz-boton { justify-content: center; }
  .dz-auth-shell__logo { display: flex; justify-content: center; margin-bottom: var(--s-5); }
  .dz-auth-shell__titulo { margin: 0; font-size: var(--fs-5); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.02em; text-align: center; text-wrap: balance; }
  .dz-auth-shell__bajada { margin: var(--s-2) 0 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-align: center; text-wrap: balance; }
  .dz-auth-shell__cuerpo { margin-top: var(--s-5); display: flex; flex-direction: column; gap: var(--s-4); }
  .dz-auth-shell__pie { margin-top: var(--s-5); padding-top: var(--s-4); border-top: 1px solid var(--border); font-size: var(--fs-2); color: var(--text-muted); text-align: center; }
  /* Endoso de la marca madre al pie de la tarjeta (la pieza endoso): centrado, bajo el pie. La pieza ya trae su área de respeto de una «Z» como relleno, así que aquí no se suma otro aire. */
  .dz-auth-shell__endoso { display: flex; justify-content: center; margin-top: var(--s-2); margin-bottom: calc(var(--s-3) * -1); }
  /* El enlace del pie (por ejemplo "Escribe a soporte", la única salida de un estado bloqueado) va dentro de una frase y no parte el renglón, pero con el dedo su blanco
     llega a --h-tactil: el relleno de un elemento en línea suma área de toque sin mover las líneas. */
  @media (pointer: coarse) {
    .dz-auth-shell__pie .dz-enlace { padding-block: var(--s-3); }
    @supports (height: 1lh) { .dz-auth-shell__pie .dz-enlace { padding-block: calc((var(--h-tactil) - 1lh) / 2); } }
  }
  @media (max-width: 560px) {
    .dz-auth-shell { place-items: stretch; padding: var(--s-3); }
    .dz-auth-shell__tarjeta { align-self: center; padding: var(--s-5); }
    /* Los controles (pausar el fondo) flotan abajo a la derecha: el shell reserva su alto para que la tarjeta no pase por debajo. */
    .dz-auth-shell:has(> .dz-endoso--barra) .dz-auth-shell__tarjeta { margin-bottom: calc(var(--h-mov) + var(--s-1) + env(safe-area-inset-bottom)); }
    .dz-auth-shell:has(> .dz-auth-shell__controles) { padding-bottom: calc(var(--s-3) * 2 + var(--h-control-sm)); }
  }
}

/* Cascarón: barra superior, columna lateral, contenido (la región main) y, bajo 820 px, barra inferior de cuatro destinos y «Más». Bajo 820 px
   la columna lateral es un cajón que abre «Más» (comportamiento/cascaron): velo, Esc, foco que vuelve al botón. Las medidas son tokens
   (--cascaron-top, --cascaron-bar, --cascaron-side, --cascaron-side-mini). --pleno es el modo de LeadZ (lz-pleno): el scroll lo hacen
   las columnas de adentro. --incrustado mide dentro de un marco, no de la ventana (especímenes y páginas modelo del sitio). */
@layer dz.componentes {
  .dz-cascaron {
    --dz-lateral: var(--cascaron-side);
    --dz-top: var(--cascaron-top);
    position: relative;
    display: grid;
    grid-template-columns: var(--dz-lateral) minmax(0, 1fr);
    grid-template-rows: var(--dz-top) minmax(0, 1fr);
    grid-template-areas: "superior superior" "lateral contenido";
    min-height: 100vh;
    min-height: 100dvh;
    background: var(--bg);
    color: var(--text);
    font-family: var(--font);
  }
  /* En el teléfono real la barra de arriba se pinta bajo la isla y las muescas (viewport-fit=cover): suma las áreas seguras. El marco incrustado no las tiene. */
  .dz-cascaron:not(.dz-cascaron--incrustado) { --dz-top: calc(var(--cascaron-top) + env(safe-area-inset-top)); }
  .dz-cascaron--mini { --dz-lateral: var(--cascaron-side-mini); }
  .dz-cascaron--pleno { height: 100vh; height: 100dvh; overflow: hidden; }
  .dz-cascaron--incrustado { height: auto; min-height: calc(var(--cascaron-side) * 2); overflow: hidden; container: dz-cascaron / inline-size; }
  /* Con una banda de sistema (piece banner-sistema) entre la barra superior y el contenido: una fila más, a todo lo ancho, que empuja el contenido. Sin banda a la vista el cascarón no la lleva (la clase la pone la pieza y la quita el comportamiento). */
  .dz-cascaron--con-banda { grid-template-rows: var(--dz-top) auto minmax(0, 1fr); grid-template-areas: "superior superior" "banda banda" "lateral contenido"; }

  /* El salto al contenido: fuera de pantalla hasta que recibe el foco (primera parada de Tab). */
  .dz-cascaron__saltar {
    position: absolute;
    top: var(--s-2);
    left: var(--s-2);
    z-index: var(--z-bloqueo);
    padding: var(--s-2) var(--s-3);
    border-radius: var(--r-control);
    background: var(--surface);
    border: 1px solid var(--border-control);
    color: var(--text);
    font-size: var(--fs-2);
    font-weight: 600;
    text-decoration: none;
    transform: translateY(-300%);
  }
  .dz-cascaron__saltar:focus { transform: none; }

  .dz-cascaron__superior {
    grid-area: superior;
    position: sticky;
    top: 0;
    z-index: calc(var(--z-drawer) + 1);
    display: flex;
    align-items: center;
    gap: var(--s-2);
    height: var(--dz-top);
    padding: env(safe-area-inset-top) var(--s-3) 0;
    box-sizing: border-box;
    background: var(--surface);
    border-bottom: 1px solid var(--border);
  }
  .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__superior { padding-left: max(var(--s-3), env(safe-area-inset-left)); padding-right: max(var(--s-3), env(safe-area-inset-right)); }
  .dz-cascaron--incrustado .dz-cascaron__superior { position: relative; }
  .dz-cascaron__marca {
    display: inline-flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--h-mini);
    padding: 0 var(--s-2);
    border-radius: var(--r-control);
    color: var(--text);
    font-size: var(--fs-3);
    font-weight: 600;
    letter-spacing: -.01em;
    text-decoration: none;
  }
  .dz-cascaron__acciones { margin-left: auto; display: flex; align-items: center; gap: var(--s-2); min-width: 0; }

  .dz-cascaron__lateral {
    grid-area: lateral;
    position: sticky;
    top: var(--dz-top);
    align-self: start;
    z-index: var(--z-sticky);
    height: calc(100vh - var(--dz-top));
    height: calc(100dvh - var(--dz-top));
    padding: var(--s-4) var(--s-3);
    box-sizing: border-box;
    overflow-y: auto;
    overscroll-behavior: contain;
    background: var(--surface);
    border-right: 1px solid var(--border);
  }
  .dz-cascaron--incrustado .dz-cascaron__lateral { position: relative; top: auto; height: auto; }
  .dz-cascaron--pleno .dz-cascaron__lateral { height: 100%; }
  .dz-cascaron__nav { display: flex; flex-direction: column; gap: var(--s-1); flex: none; }
  /* Con buscador o lista la columna es una pila: el buscador y los destinos quedan fijos y la lista desplaza por su cuenta. */
  .dz-cascaron__lateral:has(> .dz-cascaron__lista) { display: flex; flex-direction: column; overflow-y: hidden; }
  .dz-cascaron__buscador { flex: none; margin-bottom: var(--s-3); }
  .dz-cascaron__lista { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; margin-top: var(--s-3); padding-top: var(--s-3); border-top: 1px solid var(--hairline); }
  .dz-cascaron--incrustado .dz-cascaron__lista { max-height: calc(var(--h-fila) * 4); }
  .dz-cascaron__marca svg { display: block; height: var(--ico-3); width: auto; }
  .dz-cascaron__destino,
  .dz-cascaron__mas {
    position: relative;
    display: flex;
    align-items: center;
    gap: var(--s-2);
    min-height: var(--dz-dens-control, var(--h-control));
    padding: 0 var(--s-2);
    border: 0;
    border-radius: var(--r-control);
    background: transparent;
    color: var(--text-2);
    font-family: inherit;
    font-size: var(--fs-2);
    font-weight: 500;
    text-decoration: none;
    cursor: pointer;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  .dz-cascaron__icono { flex: none; color: var(--text-muted); }
  .dz-cascaron__texto { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .dz-cascaron__contador { margin-left: auto; }
  @media (hover: hover) {
    .dz-cascaron__destino:hover,
    .dz-cascaron__mas:hover { background: var(--hover-bg); color: var(--text); }
  }
  .dz-cascaron__destino[aria-current="page"] { background: var(--sel-bg); color: var(--sel-text); font-weight: 600; }
  .dz-cascaron__destino[aria-current="page"] .dz-cascaron__icono { color: var(--sel-text); }
  .dz-cascaron__destino:focus-visible,
  .dz-cascaron__mas:focus-visible { outline: none; box-shadow: var(--ring-inset); }

  /* Columna contraída: solo el glifo; el texto sigue en el árbol para los lectores y sale en la tira de ayuda del título. */
  .dz-cascaron--mini .dz-cascaron__lateral { padding-inline: var(--s-2); }
  .dz-cascaron--mini .dz-cascaron__destino { justify-content: center; padding: 0; }
  .dz-cascaron--mini .dz-cascaron__texto,
  .dz-cascaron--mini .dz-cascaron__contador { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }

  .dz-cascaron__velo { display: none; }
  .dz-cascaron__contenido {
    grid-area: contenido;
    min-width: 0;
    padding: var(--page-pad);
    box-sizing: border-box;
  }
  .dz-cascaron__contenido:focus { outline: none; }
  .dz-cascaron--pleno .dz-cascaron__contenido { padding: 0; display: flex; overflow: hidden; min-height: 0; }
  .dz-cascaron__inferior { display: none; }
  /* Lo que flota sobre la pantalla (toasts): una pila abajo a la derecha que deja pasar el puntero salvo en lo que lleva. */
  .dz-cascaron__capas {
    position: fixed;
    inset: 0;
    z-index: var(--z-toast);
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    justify-content: flex-end;
    gap: var(--s-2);
    padding: var(--s-4);
    pointer-events: none;
  }
  .dz-cascaron__capas > * { pointer-events: auto; max-width: min(var(--w-modal), 100%); }
  .dz-cascaron--incrustado .dz-cascaron__capas { position: absolute; }

  /* Bajo 820 px de ventana: la columna lateral es un cajón, la barra de arriba se adelgaza (token) y abajo van cuatro destinos y «Más». El cascarón
     --incrustado no escucha la ventana sino su propio ancho (el bloque @container de abajo). */
  @media (max-width: 820px) {
    .dz-cascaron:not(.dz-cascaron--incrustado) {
      grid-template-columns: minmax(0, 1fr);
      grid-template-areas: "superior" "contenido";
      padding-bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom));
    }
    .dz-cascaron--con-banda:not(.dz-cascaron--incrustado) { grid-template-rows: var(--dz-top) auto minmax(0, 1fr); grid-template-areas: "superior" "banda" "contenido"; }
    .dz-cascaron--pleno:not(.dz-cascaron--incrustado) { padding-bottom: 0; }
    .dz-cascaron--pleno:not(.dz-cascaron--incrustado) .dz-cascaron__contenido { padding-bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom)); }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__lateral {
      position: fixed;
      top: 0;
      bottom: 0;
      left: 0;
      z-index: var(--z-cajon);
      width: min(var(--cascaron-side), 86vw);
      height: auto;
      padding-top: calc(var(--s-4) + env(safe-area-inset-top));
      border-right: 1px solid var(--hairline);
      box-shadow: var(--shadow-md);
      transform: translateX(-100%);
      visibility: hidden;
      transition: transform var(--dur-2) var(--ease-out), visibility 0s linear var(--dur-2);
    }
    .dz-cascaron:not(.dz-cascaron--incrustado)[data-cajon="abierto"] .dz-cascaron__lateral { transform: none; visibility: visible; transition: transform var(--dur-2) var(--ease-out), visibility 0s; }
    .dz-cascaron:not(.dz-cascaron--incrustado).dz-cascaron--mini { --dz-lateral: var(--cascaron-side); }
    .dz-cascaron:not(.dz-cascaron--incrustado).dz-cascaron--mini .dz-cascaron__destino { justify-content: flex-start; padding: 0 var(--s-2); }
    .dz-cascaron:not(.dz-cascaron--incrustado).dz-cascaron--mini .dz-cascaron__texto,
    .dz-cascaron:not(.dz-cascaron--incrustado).dz-cascaron--mini .dz-cascaron__contador { position: static; width: auto; height: auto; margin: 0; clip-path: none; }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__velo {
      display: block;
      position: fixed;
      inset: 0;
      z-index: var(--z-cajon-velo);
      background: var(--velo);
      opacity: 0;
      visibility: hidden;
      transition: opacity var(--dur-2) var(--ease-velo), visibility 0s linear var(--dur-2);
    }
    .dz-cascaron:not(.dz-cascaron--incrustado)[data-cajon="abierto"] .dz-cascaron__velo { opacity: 1; visibility: visible; transition: opacity var(--dur-2) var(--ease-velo), visibility 0s; }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior {
      position: fixed;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: var(--z-drawer);
      display: grid;
      grid-template-columns: repeat(5, minmax(0, 1fr));
      min-height: var(--cascaron-bar);
      padding: 0 max(var(--s-1), env(safe-area-inset-right)) env(safe-area-inset-bottom) max(var(--s-1), env(safe-area-inset-left));
      box-sizing: content-box;
      background: var(--surface);
      border-top: 1px solid var(--hairline);
    }
    /* Con el teclado abierto la barra de destinos estorba y el teclado la sube sobre el campo: se esconde mientras dure (comportamiento/teclado). */
    :root[data-dz-teclado] .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior { display: none; }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__capas { padding-bottom: calc(var(--cascaron-bar) + var(--s-4) + env(safe-area-inset-bottom)); }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__destino,
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__mas {
      flex-direction: column;
      justify-content: center;
      gap: var(--s-1);
      min-height: var(--cascaron-bar);
      padding: var(--s-1);
      font-size: var(--fs-1);
      text-align: center;
    }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__texto { flex: none; max-width: 100%; line-height: 1.1; }
    /* La señal del activo es la misma que la de «Más» abierto: una píldora detrás del glifo y el rótulo en 600. */
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__icono { box-sizing: border-box; width: calc(var(--ico-3) + var(--s-4) * 2); height: calc(var(--ico-3) + var(--s-1) * 2); padding: var(--s-1) var(--s-4); border-radius: var(--r-pill); }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__destino[aria-current="page"],
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__mas[aria-expanded="true"] { background: transparent; color: var(--sel-text); font-weight: 600; }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__destino[aria-current="page"] .dz-cascaron__icono,
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__mas[aria-expanded="true"] .dz-cascaron__icono { background: var(--sel-bg); color: var(--sel-text); }
    .dz-cascaron:not(.dz-cascaron--incrustado) .dz-cascaron__inferior .dz-cascaron__contador { position: absolute; top: var(--s-1); left: calc(50% + var(--s-3)); margin: 0; box-shadow: var(--aro); }
  }
  /* Lo mismo, medido contra el ancho del propio cascarón incrustado: un marco de 390 pinta móvil aunque la ventana mida 1280, y uno de escritorio
     pinta escritorio aunque la ventana mida 390. Sin iframe: la CSP de Passwordz no lo permite. */
  @container dz-cascaron (max-width: 820px) {
    /* La raíz no puede preguntarse a sí misma: la rejilla se queda de dos columnas y lo de adentro se coloca de otro modo. La columna lateral sale
       de la rejilla (absoluta, es el cajón), el contenido ocupa las dos columnas y deja sitio a la barra inferior con su margen. */
    .dz-cascaron--incrustado .dz-cascaron__contenido { grid-area: auto; grid-column: 1 / -1; grid-row: 2; margin-bottom: calc(var(--cascaron-bar) + env(safe-area-inset-bottom)); }
    /* Incrustado y con banda: la raíz no se pregunta a sí misma, así que la banda y el contenido se colocan por fila dentro de la consulta de contenedor. */
    .dz-cascaron--con-banda.dz-cascaron--incrustado .dz-banner-sistema { grid-area: auto; grid-column: 1 / -1; grid-row: 2; }
    .dz-cascaron--con-banda.dz-cascaron--incrustado .dz-cascaron__contenido { grid-row: 3; }
    .dz-cascaron--incrustado .dz-cascaron__lateral {
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      z-index: var(--z-cajon);
      width: min(var(--cascaron-side), 86vw);
      height: auto;
      padding-top: calc(var(--s-4) + env(safe-area-inset-top));
      border-right: 1px solid var(--hairline);
      box-shadow: var(--shadow-md);
      transform: translateX(-100%);
      visibility: hidden;
      transition: transform var(--dur-2) var(--ease-out), visibility 0s linear var(--dur-2);
    }
    .dz-cascaron--incrustado[data-cajon="abierto"] .dz-cascaron__lateral { transform: none; visibility: visible; transition: transform var(--dur-2) var(--ease-out), visibility 0s; }
    .dz-cascaron--incrustado.dz-cascaron--mini { --dz-lateral: var(--cascaron-side); }
    .dz-cascaron--incrustado.dz-cascaron--mini .dz-cascaron__destino { justify-content: flex-start; padding: 0 var(--s-2); }
    .dz-cascaron--incrustado.dz-cascaron--mini .dz-cascaron__texto,
    .dz-cascaron--incrustado.dz-cascaron--mini .dz-cascaron__contador { position: static; width: auto; height: auto; margin: 0; clip-path: none; }
    .dz-cascaron--incrustado .dz-cascaron__velo {
      display: block;
      position: absolute;
      inset: 0;
      z-index: var(--z-cajon-velo);
      background: var(--velo);
      opacity: 0;
      visibility: hidden;
      transition: opacity var(--dur-2) var(--ease-velo), visibility 0s linear var(--dur-2);
    }
    .dz-cascaron--incrustado[data-cajon="abierto"] .dz-cascaron__velo { opacity: 1; visibility: visible; transition: opacity var(--dur-2) var(--ease-velo), visibility 0s; }
    .dz-cascaron--incrustado .dz-cascaron__inferior {
      position: absolute;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: var(--z-drawer);
      display: grid;
      grid-template-columns: repeat(5, minmax(0, 1fr));
      min-height: var(--cascaron-bar);
      padding: 0 var(--s-1) env(safe-area-inset-bottom);
      box-sizing: content-box;
      background: var(--surface);
      border-top: 1px solid var(--hairline);
    }
    .dz-cascaron--incrustado .dz-cascaron__capas { padding-bottom: calc(var(--cascaron-bar) + var(--s-4) + env(safe-area-inset-bottom)); }
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__destino,
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__mas {
      flex-direction: column;
      justify-content: center;
      gap: var(--s-1);
      min-height: var(--cascaron-bar);
      padding: var(--s-1);
      font-size: var(--fs-1);
      text-align: center;
    }
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__texto { flex: none; max-width: 100%; line-height: 1.1; }
    /* La señal del activo es la misma que la de «Más» abierto: una píldora detrás del glifo y el rótulo en 600. */
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__icono { box-sizing: border-box; width: calc(var(--ico-3) + var(--s-4) * 2); height: calc(var(--ico-3) + var(--s-1) * 2); padding: var(--s-1) var(--s-4); border-radius: var(--r-pill); }
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__destino[aria-current="page"],
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__mas[aria-expanded="true"] { background: transparent; color: var(--sel-text); font-weight: 600; }
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__destino[aria-current="page"] .dz-cascaron__icono,
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__mas[aria-expanded="true"] .dz-cascaron__icono { background: var(--sel-bg); color: var(--sel-text); }
    .dz-cascaron--incrustado .dz-cascaron__inferior .dz-cascaron__contador { position: absolute; top: var(--s-1); left: calc(50% + var(--s-3)); margin: 0; box-shadow: var(--aro); }
  }
  @media (pointer: coarse) {
    .dz-cascaron__marca,
    .dz-cascaron__destino,
    .dz-cascaron__mas { min-height: var(--h-tactil); }
  }
  @media (prefers-reduced-motion: reduce) {
    .dz-cascaron__lateral,
    .dz-cascaron__velo { transition: none; }
  }
}

/* Dashboard: cabecera, tira de cifras y una rejilla de tarjetas. La rejilla tiene tres columnas desde 1100 px de contenedor, dos desde 820 y
   una debajo (container query: responde a SU ancho, no al de la ventana). Una celda ocupa 1, 2 o 3 columnas. */
@layer dz.componentes {
  .dz-dashboard { container: dz-dashboard / inline-size; display: flex; flex-direction: column; gap: var(--s-5); min-width: 0; }
  .dz-dashboard__cabecera { min-width: 0; }
  .dz-dashboard__cifras { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--w-cifra), 1fr)); gap: var(--s-3); margin: 0; }
  .dz-dashboard__cifra { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding: var(--s-4); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-dashboard__rotulo { font-size: var(--fs-2); color: var(--text-2); }
  .dz-dashboard__valor { margin: 0; font-size: var(--fs-6); font-weight: 600; line-height: var(--lh-1); letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
  /* La tendencia de la cifra (átomo tendencia) va entre el valor y el cambio: la forma de cómo llegó. */
  .dz-dashboard__tendencia { margin: 0; }
  .dz-dashboard__cambio { display: flex; align-items: center; gap: var(--s-1); margin: 0; font-size: var(--fs-2); font-variant-numeric: tabular-nums; color: var(--text-muted); }
  /* El icono del tono es el segundo canal del veredicto; la palabra va solo para el lector de pantalla. */
  .dz-dashboard__sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-dashboard__cambio[data-tono="bueno"] { color: var(--ok-text); }
  .dz-dashboard__cambio[data-tono="malo"] { color: var(--bad-text); }
  .dz-dashboard__cambio[data-tono="aviso"] { color: var(--warn-text); }
  /* Una cifra sin cambio ni referencia lo dice a la vista (DCB-212): quien arma el tablero la completa. */
  .dz-dashboard__cambio[data-tono="falta"] { color: var(--text-muted); font-style: italic; }
  .dz-dashboard__referencia { margin: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-dashboard__valor[aria-busy="true"] { display: flex; align-items: center; min-height: calc(var(--fs-6) * var(--lh-1)); }
  .dz-dashboard__rejilla { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s-4); align-items: start; }
  .dz-dashboard__celda { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; padding: var(--s-5); box-sizing: border-box; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-dashboard__encabezado { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); min-height: var(--h-control-sm); }
  .dz-dashboard__titulo { margin: 0; font-size: var(--fs-3); font-weight: 500; letter-spacing: -.012em; color: var(--text-2); }
  .dz-dashboard__acciones { display: flex; align-items: center; gap: var(--s-2); flex: none; }
  .dz-dashboard__cuerpo { min-width: 0; font-size: var(--fs-3); }
  .dz-dashboard__sello { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-dashboard__sello b { color: var(--text); font-weight: 500; }
  /* El sello cambia de tono con la edad (neutro, tibio, viejo) y siempre lo dice también con texto. */
  .dz-dashboard__sello[data-edad="tibio"] { color: var(--text-2); }
  .dz-dashboard__sello[data-edad="viejo"], .dz-dashboard__sello[data-edad="viejo"] b { color: var(--warn-text); }
  .dz-dashboard__sello[data-edad="falta"] { font-style: italic; }
  .dz-dashboard__sello[data-corrida="fallo"] { color: var(--bad-text); }
  .dz-dashboard__ventana { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  @container dz-dashboard (min-width: 821px) {
    .dz-dashboard__rejilla { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .dz-dashboard__celda--2,
    .dz-dashboard__celda--3 { grid-column: span 2; }
    /* Una celda sencilla justo antes de una ancha se quedaría sola en su renglón con media fila vacía: ocupa el renglón (Alex, 23-oct-2026). */
    .dz-dashboard__celda:not(.dz-dashboard__celda--2, .dz-dashboard__celda--3):has(+ :is(.dz-dashboard__celda--2, .dz-dashboard__celda--3)) { grid-column: span 2; }
  }
  @container dz-dashboard (min-width: 1101px) {
    .dz-dashboard__rejilla { grid-template-columns: repeat(3, minmax(0, 1fr)); }
    .dz-dashboard__celda--3 { grid-column: span 3; }
  }
}

/* Detalle de una página: volver, título con su estado en texto, acciones, la columna principal y la lateral de metadatos. Bajo 820 px del
   contenedor la lateral baja debajo de la principal. */
@layer dz.componentes {
  .dz-detalle-pagina { container: dz-detalle-pagina / inline-size; display: flex; flex-direction: column; gap: var(--s-5); min-width: 0; }
  .dz-detalle-pagina__cabecera { display: flex; flex-direction: column; gap: var(--s-2); }
  .dz-detalle-pagina__volver {
    align-self: flex-start;
    display: inline-flex;
    align-items: center;
    gap: var(--s-1);
    min-height: var(--h-control-sm);
    border-radius: var(--r-control);
    color: var(--accent-text);
    font-size: var(--fs-2);
    font-weight: 500;
    text-decoration: none;
  }
  @media (hover: hover) {
    .dz-detalle-pagina__volver:hover { color: var(--link-hover); }
  }
  .dz-detalle-pagina__fila { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--s-3); }
  .dz-detalle-pagina__titulos { min-width: 0; }
  .dz-detalle-pagina__titulo { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); font-size: var(--fs-5); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.02em; overflow-wrap: anywhere; }
  .dz-detalle-pagina__estado { padding: 0 var(--s-2); border: 1px solid var(--border-control); border-radius: var(--r-chip); font-size: var(--fs-1); font-weight: 500; letter-spacing: 0; line-height: var(--lh-2); color: var(--text-2); }
  .dz-detalle-pagina__apoyo { margin: var(--s-1) 0 0; font-size: var(--fs-3); color: var(--text-2); }
  .dz-detalle-pagina__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-detalle-pagina__cuerpo { display: grid; grid-template-columns: minmax(0, 1fr) var(--w-hoja); gap: var(--s-6); align-items: start; }
  .dz-detalle-pagina__principal { display: flex; flex-direction: column; gap: var(--s-6); min-width: 0; }
  .dz-detalle-pagina__seccion { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
  .dz-detalle-pagina__subtitulo { margin: 0; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.012em; }
  .dz-detalle-pagina__apoyo-seccion { margin: calc(var(--s-1) * -1) 0 0; font-size: var(--fs-3); color: var(--text-2); }
  .dz-detalle-pagina__contenido { min-width: 0; }
  .dz-detalle-pagina__lateral { min-width: 0; padding: var(--s-5); box-sizing: border-box; border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  /* Intercalada: la lateral va en el documento entre dos tramos de secciones. En ancho ocupa la segunda columna a todo el alto; en estrecho cae en su sitio. */
  .dz-detalle-pagina__cuerpo--intercalado { grid-template-rows: auto minmax(0, 1fr); row-gap: var(--s-6); }
  .dz-detalle-pagina__cuerpo--intercalado > .dz-detalle-pagina__principal { grid-column: 1; }
  .dz-detalle-pagina__cuerpo--intercalado > .dz-detalle-pagina__lateral { grid-column: 2; grid-row: 1 / span 2; }
  .dz-detalle-pagina__cuerpo--intercalado > .dz-detalle-pagina__principal--cola { grid-row: 2; }
  @container dz-detalle-pagina (max-width: 1100px) {
    .dz-detalle-pagina__cuerpo { grid-template-columns: minmax(0, 1fr) var(--w-celda); gap: var(--s-5); }
  }
  @container dz-detalle-pagina (max-width: 820px) {
    .dz-detalle-pagina__cuerpo { grid-template-columns: minmax(0, 1fr); }
    .dz-detalle-pagina__cuerpo--intercalado { grid-template-rows: none; row-gap: var(--s-6); }
    .dz-detalle-pagina__cuerpo--intercalado > .dz-detalle-pagina__principal,
    .dz-detalle-pagina__cuerpo--intercalado > .dz-detalle-pagina__lateral { grid-column: 1; grid-row: auto; }
  }
}

/* Ficha de inmueble: los bloques que la página modelo suma a detalle-pagina. Cifras en texto (sin iconos de cama, baño ni regla), el precio con su
   comparación contra la torre y el riel de rango, y el asesor. El color nunca dice si el delta es bueno o malo: lo dicen el signo, la flecha y el texto.
   Todo sale de tokens; la posición del punto y de la marca del promedio es --dz-pos, que el comportamiento toma de data-pos. */
@layer dz.componentes {
  .dz-ficha-inmueble { display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
  .dz-ficha-inmueble__oculto,
  .dz-ficha-inmueble__anuncio { position: absolute; inline-size: 1px; block-size: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-ficha-inmueble__error { min-width: 0; }
  .dz-ficha-inmueble__estado { vertical-align: middle; }
  .dz-ficha-inmueble__razon { font-size: var(--fs-2); color: var(--text-2); }
  /* El menú «Más acciones» se ve como un botón de solo icono: el disparador del menú es un fantasma. */
  .dz-ficha-inmueble__menu .dz-menu__disparador { justify-content: center; width: var(--dz-dens-control, var(--h-control)); padding: 0; border: 1px solid var(--border-control); background: var(--surface-2); color: var(--text); }
  @media (hover: hover) { .dz-ficha-inmueble__menu .dz-menu__disparador:hover, .dz-ficha-inmueble__menu[open] > .dz-menu__disparador { background: var(--surface-3); } }
  .dz-ficha-inmueble__menu .dz-menu__disparador svg:last-child { display: none; }
  .dz-ficha-inmueble__descripcion,
  .dz-ficha-inmueble__direccion { margin: 0; font-style: normal; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text); }

  .dz-ficha-inmueble__cifras { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s-3); margin: 0 0 var(--s-4); padding: 0; list-style: none; }
  .dz-ficha-inmueble__cifra { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding: var(--s-3) var(--s-4); border: 1px solid var(--hairline); border-radius: var(--r-control); background: var(--surface-anidada); }
  .dz-ficha-inmueble__cifra b { font-size: var(--fs-5); font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -.012em; color: var(--text); }
  .dz-ficha-inmueble__cifra span { font-size: var(--fs-1); color: var(--text-2); }
  .dz-ficha-inmueble__esqueleto { display: grid; gap: var(--s-3); }
  .dz-ficha-inmueble__esqueleto-titulo { min-width: calc(var(--h-fila) * 4); }

  /* Lateral: dos bloques con título propio y hairline entre ellos, sin tarjeta dentro de la tarjeta de la lateral. */
  .dz-ficha-inmueble__bloque + .dz-ficha-inmueble__bloque { margin-top: var(--s-5); padding-top: var(--s-5); border-top: 1px solid var(--hairline); }
  .dz-ficha-inmueble__subtitulo { margin: 0 0 var(--s-3); font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.012em; }
  .dz-ficha-inmueble__precio { margin: 0; font-size: var(--fs-7); font-weight: 600; letter-spacing: -.02em; line-height: var(--lh-1); font-variant-numeric: tabular-nums; color: var(--text); }
  .dz-ficha-inmueble__precio small { margin-inline-start: var(--s-1); font-size: var(--fs-3); font-weight: 500; letter-spacing: 0; color: var(--text-2); }
  .dz-ficha-inmueble__precio--pendiente { font-size: var(--fs-5); color: var(--text-2); }
  .dz-ficha-inmueble__bloque--vendido .dz-ficha-inmueble__precio { color: var(--text-2); }
  .dz-ficha-inmueble__vendido { margin: var(--s-1) 0 0; font-size: var(--fs-2); font-weight: 500; color: var(--text); }
  .dz-ficha-inmueble__m2 { position: relative; display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: var(--s-2) 0 0; font-size: var(--fs-2); color: var(--text-2); font-variant-numeric: tabular-nums; }
  .dz-ficha-inmueble__m2-valor { white-space: nowrap; }
  .dz-ficha-inmueble__m2 .dz-ficha-inmueble__delta { order: 3; flex: 1 1 100%; }
  .dz-ficha-inmueble__delta { display: inline-flex; align-items: center; gap: var(--s-1); }
  .dz-ficha-inmueble__delta svg { width: var(--ico-1); height: var(--ico-1); flex: none; }
  /* Rango de la torre: un riel y un punto. La posición es el canal más preciso (DCB-3); la marca fina es el promedio. */
  .dz-ficha-inmueble__rango { display: grid; gap: var(--s-1); margin-top: var(--s-4); font-size: var(--fs-1); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-ficha-inmueble__riel { position: relative; height: var(--punto); border-radius: var(--r-pill); background: var(--line-2); }
  .dz-ficha-inmueble__punto { position: absolute; top: 50%; left: var(--dz-pos, 0%); width: var(--s-3); height: var(--s-3); transform: translate(-50%, -50%); border: 2px solid var(--surface); border-radius: 50%; background: var(--text); }
  .dz-ficha-inmueble__promedio { position: absolute; top: calc(var(--s-1) * -1); left: var(--dz-pos, 0%); width: 1px; height: calc(var(--punto) + var(--s-2)); background: var(--text-muted); }
  .dz-ficha-inmueble__extremos { display: grid; grid-template-columns: auto auto; justify-content: space-between; gap: var(--s-1) var(--s-2); }
  .dz-ficha-inmueble__extremos > :nth-child(1) { grid-column: 1; grid-row: 1; }
  .dz-ficha-inmueble__extremos > :nth-child(3) { grid-column: 2; grid-row: 1; }
  .dz-ficha-inmueble__extremos > :nth-child(2) { grid-column: 1 / -1; grid-row: 2; text-align: center; }
  .dz-ficha-inmueble__actualizado { margin: var(--s-3) 0 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-ficha-inmueble__asesor { display: flex; align-items: center; gap: var(--s-3); }
  .dz-ficha-inmueble__asesor-datos { display: grid; min-width: 0; }
  .dz-ficha-inmueble__asesor-datos b { font-weight: 600; color: var(--text); }
  .dz-ficha-inmueble__asesor-datos span { font-size: var(--fs-1); color: var(--text-2); }
  .dz-ficha-inmueble__contacto { display: flex; flex-wrap: wrap; gap: var(--s-2); margin-top: var(--s-3); }
  @container dz-detalle-pagina (max-width: 560px) {
    .dz-ficha-inmueble__cifras { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .dz-ficha-inmueble__precio { font-size: var(--fs-6); }
  }
}

/* Formulario con índice: el índice a la izquierda (pegado) y las secciones en una columna de lectura. Bajo 820 px del contenedor el
   índice pasa arriba como una fila que se desplaza. */
@layer dz.componentes {
  .dz-formulario-indice {
    container: dz-formulario-indice / inline-size;
    min-width: 0;
  }
  .dz-formulario-indice__rejilla {
    display: grid;
    grid-template-columns: var(--w-sub) minmax(0, 1fr);
    gap: var(--s-6);
    align-items: start;
    min-width: 0;
  }
  .dz-formulario-indice__indice {
    position: sticky;
    top: var(--s-4);
    display: flex;
    flex-direction: column;
    gap: var(--s-1);
  }
  .dz-formulario-indice__enlace {
    display: flex;
    align-items: center;
    min-height: var(--dz-dens-control, var(--h-control));
    padding: 0 var(--s-2);
    border-radius: var(--r-control);
    color: var(--text-2);
    font-size: var(--fs-3);
    font-weight: 500;
    text-decoration: none;
    transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
  }
  @media (hover: hover) {
    .dz-formulario-indice__enlace:hover { background: var(--hover-bg); color: var(--text); }
  }
  .dz-formulario-indice__enlace[aria-current="location"] { background: var(--sel-bg); color: var(--sel-text); font-weight: 600; }
  .dz-formulario-indice__enlace:focus-visible { outline: none; box-shadow: var(--ring-inset); }
  .dz-formulario-indice__cuerpo { display: flex; flex-direction: column; gap: var(--s-7); max-width: var(--w-lectura); min-width: 0; }
  .dz-formulario-indice__seccion { scroll-margin-top: calc(var(--cascaron-top) + var(--s-4)); }
  .dz-formulario-indice__titulo { margin: 0; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.012em; }
  .dz-formulario-indice__apoyo { margin: var(--s-1) 0 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); }
  .dz-formulario-indice__campos { margin-top: var(--s-4); display: flex; flex-direction: column; gap: var(--s-4); min-width: 0; }
  .dz-formulario-indice__pie { position: sticky; bottom: 0; }
  @container dz-formulario-indice (max-width: 820px) {
    .dz-formulario-indice__rejilla { grid-template-columns: minmax(0, 1fr); gap: var(--s-4); }
    .dz-formulario-indice__indice { position: static; flex-direction: row; overflow-x: auto; padding-bottom: var(--s-1); }
    .dz-formulario-indice__enlace { flex: none; white-space: nowrap; }
  }
}

/* Lista + panel: la lista a la izquierda y el contexto de la fila elegida a la derecha. La plantilla responde al ancho de SU contenedor
   (container query), no al de la ventana: bajo 560 px es una sola columna, o la lista o el panel a pantalla completa. */
@layer dz.componentes {
  .dz-lista-panel {
    container: dz-lista-panel / inline-size;
    min-width: 0;
  }
  .dz-lista-panel__rejilla {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--s-4);
    align-items: start;
    min-width: 0;
  }
  .dz-lista-panel[data-panel="abierto"] .dz-lista-panel__rejilla { grid-template-columns: minmax(0, 3fr) minmax(var(--w-celda), 2fr); }
  .dz-lista-panel__lista { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
  .dz-lista-panel__cabecera,
  .dz-lista-panel__filtros { min-width: 0; }
  .dz-lista-panel__cuerpo { min-width: 0; }
  .dz-lista-panel__panel {
    position: sticky;
    top: var(--s-4);
    min-width: 0;
    padding: var(--s-5);
    box-sizing: border-box;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface);
  }
  @container dz-lista-panel (max-width: 560px) {
    .dz-lista-panel[data-panel="abierto"] .dz-lista-panel__rejilla { grid-template-columns: minmax(0, 1fr); }
    .dz-lista-panel[data-panel="abierto"] .dz-lista-panel__lista { display: none; }
    .dz-lista-panel__panel { position: static; }
  }
}

/* Onboarding: panel, recorrido y misiones puestos de acuerdo. El panel ocupa su sitio; el recorrido (una capa fija a pantalla completa) y las misiones (un tablero flotante)
   no ocupan lugar en el flujo. Mientras el recorrido está abierto las misiones esperan, sin tomar el foco ni mostrarse detrás; y si el aviso para retomar está a la vista la
   píldora de misiones sube lo que mide un botón para no quedar debajo. En una ficha o una captura (muestra) las capas se apilan en columna, sin flotar. */
@layer dz.componentes {
  .dz-onboarding { display: grid; gap: var(--s-3); min-width: 0; }
  .dz-onboarding__banda { min-width: 0; }
  .dz-onboarding__panel { min-width: 0; }
  .dz-onboarding:has(.dz-recorrido__capa:not([hidden])) :is(.dz-misiones__tablero, .dz-misiones__pildora) { visibility: hidden; }
  .dz-onboarding:has(.dz-recorrido__retomar:not([hidden])) .dz-misiones__pildora { bottom: calc(var(--s-6) + var(--h-control) + var(--s-4) + env(safe-area-inset-bottom)); }
  .dz-onboarding--muestra { gap: var(--s-4); }
}

/* Pantalla de acceso: la plantilla completa sobre el auth-shell. Cuerpo en una columna, un solo primario por tarjeta, botones al ancho de la
   tarjeta y a la altura táctil. El código de un uso es UN campo (no seis casillas): el autocompletado de código de un solo uso, el pegado y
   el lector de pantalla funcionan con un solo control. */
@layer dz.componentes {
  .dz-pantalla-acceso .dz-auth-shell__logo { flex-direction: column; align-items: center; gap: var(--s-4); }
  .dz-pantalla-acceso .dz-auth-shell__cuerpo > .dz-boton,
  .dz-pantalla-acceso__metodos > .dz-boton { width: 100%; justify-content: center; height: auto; min-height: var(--h-tactil); }
  .dz-pantalla-acceso__acciones > .dz-boton { flex: 1 1 auto; justify-content: center; min-height: var(--h-tactil); }
  .dz-pantalla-acceso .dz-auth-shell__cuerpo > .dz-boton[aria-busy="true"] { cursor: progress; }
  .dz-pantalla-acceso__anuncio { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-pantalla-acceso__icono {
    display: grid; place-items: center; align-self: center; width: var(--vacio-aro); height: var(--vacio-aro); box-sizing: border-box;
    border: 1px solid var(--border); border-radius: var(--r-pill); background: var(--surface-2); color: var(--text-2);
  }
  .dz-pantalla-acceso__metodos { display: flex; flex-direction: column; gap: var(--s-2); }
  .dz-pantalla-acceso__acciones { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--s-2); }
  .dz-pantalla-acceso__ayuda { margin: calc(-1 * var(--s-2)) 0 0; text-align: center; font-size: var(--fs-2); line-height: var(--lh-3); color: var(--text-muted); }
  .dz-pantalla-acceso__o { margin: 0; text-align: center; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-pantalla-acceso__codigo .dz-campo__control {
    font-family: var(--mono-code); font-size: var(--fs-5); letter-spacing: .4em; text-align: center; font-variant-numeric: tabular-nums;
  }
  .dz-pantalla-acceso__codigo .dz-campo__control::placeholder { letter-spacing: normal; }
  .dz-pantalla-acceso__lista { margin: 0; padding: 0; font-size: var(--fs-2); line-height: var(--lh-3); }
  .dz-pantalla-acceso__lista > div { padding: var(--s-2) 0; border-top: 1px solid var(--border); }
  .dz-pantalla-acceso__lista > div:first-child { border-top: 0; padding-top: 0; }
  .dz-pantalla-acceso__lista dt { font-weight: 600; color: var(--text); }
  .dz-pantalla-acceso__lista dd { margin: 0; color: var(--text-2); }
  .dz-pantalla-acceso__cuenta { margin: 0; text-align: center; font-size: var(--fs-2); color: var(--text-muted); font-variant-numeric: tabular-nums; }
  .dz-pantalla-acceso__correo { margin: 0; display: flex; justify-content: center; }
  .dz-pantalla-acceso__espera { margin: 0; display: flex; align-items: center; justify-content: center; gap: var(--s-2); font-size: var(--fs-3); color: var(--text-2); }
  .dz-pantalla-acceso__giro { animation: dz-acceso-giro calc(var(--dur-4) * 2) linear infinite; }
  @keyframes dz-acceso-giro { to { transform: rotate(360deg); } }
  .dz-pantalla-acceso__paso { margin: 0; text-align: center; font-size: var(--fs-1); font-weight: 500; letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
  .dz-pantalla-acceso__pasos, .dz-pantalla-acceso__guia { margin: 0; padding: 0; list-style: none; counter-reset: dz-acceso-paso; display: flex; flex-direction: column; gap: var(--s-3); font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); }
  .dz-pantalla-acceso__pasos li, .dz-pantalla-acceso__guia li { display: flex; gap: var(--s-3); align-items: baseline; counter-increment: dz-acceso-paso; }
  .dz-pantalla-acceso__pasos li::before, .dz-pantalla-acceso__guia li::before {
    content: counter(dz-acceso-paso); flex: none; display: grid; place-items: center; width: var(--ico-4); height: var(--ico-4); box-sizing: border-box;
    border: 1px solid var(--border-control); border-radius: var(--r-pill); font-size: var(--fs-1); font-weight: 600; color: var(--text-2);
  }
  .dz-pantalla-acceso__pasos li[aria-current="step"] { color: var(--text); font-weight: 600; }
  .dz-pantalla-acceso__guia b { color: var(--text); font-weight: 600; }
  .dz-pantalla-acceso__referencia { font-family: var(--mono-code); font-size: var(--fs-2); color: var(--text); }
  /* Estados de sistema (error 500, mantenimiento, sin conexión): la ilustración del estado centrada y la referencia copiable con su botón en el pie. */
  .dz-pantalla-acceso__dibujo { align-self: center; }
  .dz-pantalla-acceso__copiable { margin: 0 0 var(--s-2); display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--s-2); font-size: var(--fs-2); color: var(--text-muted); }
  /* Con movimiento reducido el arco que gira pasa a una fila de puntos quieta: se lee como "en proceso", no como un anillo roto. */
  @media (prefers-reduced-motion: reduce) { .dz-pantalla-acceso__giro { animation: none; } .dz-pantalla-acceso__giro path { stroke-dasharray: 0 4; } }
}

/* Reporte: cabecera con periodo y acciones, tira de cifras, secciones y el sello «datos hasta». La cifra se dice con texto; el color del
   cambio solo acompaña. */
@layer dz.componentes {
  .dz-reporte { container: dz-reporte / inline-size; display: flex; flex-direction: column; gap: var(--s-6); min-width: 0; }
  .dz-reporte__cabecera { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--s-3); }
  .dz-reporte__titulos { min-width: 0; }
  .dz-reporte__titulo { margin: 0; font-size: var(--fs-5); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.02em; }
  .dz-reporte__periodo { margin: var(--s-1) 0 0; font-size: var(--fs-3); color: var(--text-2); }
  .dz-reporte__acciones { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-2); }
  .dz-reporte__cifras { display: grid; grid-template-columns: repeat(auto-fit, minmax(var(--w-cifra), 1fr)); gap: var(--s-3); margin: 0; }
  .dz-reporte__cifra { display: flex; flex-direction: column; gap: var(--s-1); min-width: 0; padding: var(--s-4); border: 1px solid var(--border); border-radius: var(--r-card); background: var(--surface); }
  .dz-reporte__rotulo { font-size: var(--fs-2); color: var(--text-2); }
  .dz-reporte__valor { margin: 0; font-size: var(--fs-6); font-weight: 600; line-height: var(--lh-1); letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
  /* La tendencia de la cifra (átomo tendencia) va entre el valor y el cambio: la forma de cómo llegó. */
  .dz-reporte__tendencia { margin: 0; }
  .dz-reporte__cambio { display: flex; align-items: center; gap: var(--s-1); margin: 0; font-size: var(--fs-2); font-variant-numeric: tabular-nums; color: var(--text-muted); }
  /* El icono del tono es el segundo canal del veredicto; la palabra va solo para el lector de pantalla. */
  .dz-reporte__sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
  .dz-reporte__cambio[data-tono="bueno"] { color: var(--ok-text); }
  .dz-reporte__cambio[data-tono="malo"] { color: var(--bad-text); }
  .dz-reporte__cambio[data-tono="aviso"] { color: var(--warn-text); }
  /* Una cifra sin cambio ni referencia lo dice a la vista (DCB-212): quien arma el tablero la completa. */
  .dz-reporte__cambio[data-tono="falta"] { color: var(--text-muted); font-style: italic; }
  .dz-reporte__referencia { margin: 0; font-size: var(--fs-2); color: var(--text-muted); }
  .dz-reporte__valor[aria-busy="true"] { display: flex; align-items: center; min-height: calc(var(--fs-6) * var(--lh-1)); }
  .dz-reporte__seccion { display: flex; flex-direction: column; gap: var(--s-3); min-width: 0; }
  .dz-reporte__subtitulo { margin: 0; font-size: var(--fs-4); font-weight: 600; line-height: var(--lh-2); letter-spacing: -.012em; }
  .dz-reporte__apoyo { margin: calc(var(--s-1) * -1) 0 0; font-size: var(--fs-3); color: var(--text-2); }
  .dz-reporte__cuerpo { min-width: 0; }
  .dz-reporte__sello { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s-1) var(--s-2); margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  .dz-reporte__sello b { color: var(--text); font-weight: 500; }
  /* El sello cambia de tono con la edad (neutro, tibio, viejo) y siempre lo dice también con texto. */
  .dz-reporte__sello[data-edad="tibio"] { color: var(--text-2); }
  .dz-reporte__sello[data-edad="viejo"], .dz-reporte__sello[data-edad="viejo"] b { color: var(--warn-text); }
  .dz-reporte__sello[data-edad="falta"] { font-style: italic; }
  .dz-reporte__sello[data-corrida="fallo"] { color: var(--bad-text); }
  .dz-reporte__ventana { margin: 0; font-size: var(--fs-1); color: var(--text-muted); }
  @container dz-reporte (max-width: 560px) {
    .dz-reporte__cifras { grid-template-columns: minmax(0, 1fr); }
  }
}

/* Tablero: columnas de tarjetas que se recorren en horizontal. La región tiene foco para desplazarla con las flechas; bajo 820 px del
   contenedor cada columna ocupa casi todo el ancho y el siguiente asoma para avisar que hay más. */
@layer dz.componentes {
  .dz-tablero {
    container: dz-tablero / inline-size;
    min-width: 0;
    padding-bottom: var(--s-2);
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
    scrollbar-gutter: stable;
  }
  .dz-tablero__carriles {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: var(--w-sub);
    gap: var(--s-3);
    align-items: start;
    width: max-content;
    min-width: 100%;
  }
  .dz-tablero:focus-visible { outline: none; box-shadow: var(--ring-inset); border-radius: var(--r-card); }
  .dz-tablero__columna {
    display: flex;
    flex-direction: column;
    gap: var(--s-3);
    min-width: 0;
    padding: var(--s-3);
    box-sizing: border-box;
    border: 1px solid var(--border);
    border-radius: var(--r-card);
    background: var(--surface-2);
    scroll-snap-align: start;
  }
  .dz-tablero__cabecera { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); min-height: var(--h-control-sm); }
  .dz-tablero__titulo { margin: 0; font-size: var(--fs-2); font-weight: 600; letter-spacing: 0; color: var(--text); }
  .dz-tablero__cuerpo { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
  .dz-tablero__vacia { margin: 0; padding: var(--s-4) var(--s-2); font-size: var(--fs-2); color: var(--text-muted); text-align: center; }
  @container dz-tablero (max-width: 820px) {
    .dz-tablero__carriles { grid-auto-columns: 86cqw; width: auto; }
  }
}
/* Movimiento del DS: tokens nuevos, coreografías, iconos animados, logos y fondos, cada uno con su versión de movimiento reducido.
   Generado por generador/movimiento.mjs desde tokens/movimiento.json. No se edita a mano: se cambia la fuente y se regenera. */
@layer reset, dz.tokens, dz.base, dz.componentes;
@layer dz.tokens {
  :root {
    --mov-dist-1: 4px;
    --mov-dist-2: 8px;
    --mov-sube: 28px;
    --mov-escala-entra: .9;
    --mov-escala-latido: 1.06;
    --mov-opacidad-latido: .7;
    --mov-opacidad-ola: .35;
    --mov-retardo: 80ms;
    --mov-escalon-letra: 70ms;
    --mov-escalon-traza: 90ms;
    --mov-letra: 540ms;
    --mov-sub: 450ms;
    --mov-sub-ret: 700ms;
    --mov-sube-breve: 8px;
    --mov-retardo-breve: 0ms;
    --mov-escalon-letra-breve: 20ms;
    --mov-letra-breve: 280ms;
    --mov-sub-breve: 260ms;
    --mov-sub-ret-breve: 160ms;
    --mov-traza: 720ms;
    --mov-latido: 1800ms;
    --mov-giro: 800ms;
    --mov-timbre: 1200ms;
    --mov-envia: 600ms;
    --mov-sonar: 2500ms;
    --mov-deriva: 24000ms;
    --mov-asienta: 5000ms;
    --mov-fondo-paso: 40px;
  }
}
@layer dz.componentes {
  @keyframes dz-entra {
    0% { opacity: 0; transform: translateY(var(--mov-dist-2)); }
    100% { opacity: 1; transform: none; }
  }
  @keyframes dz-entra-reducido {
    0% { opacity: 0; }
    100% { opacity: 1; }
  }
  .dz-entra { transform-box: fill-box; transform-origin: center; animation: dz-entra var(--dur-2) var(--ease-out) both; }
  @keyframes dz-sale {
    0% { opacity: 1; transform: none; }
    100% { opacity: 0; transform: translateY(var(--mov-dist-1)); }
  }
  @keyframes dz-sale-reducido {
    0% { opacity: 1; }
    100% { opacity: 0; }
  }
  .dz-sale { transform-box: fill-box; transform-origin: center; animation: dz-sale var(--dur-1) var(--ease-out) both; }
  @keyframes dz-latido {
    0% { opacity: 1; transform: scale(1); }
    50% { opacity: var(--mov-opacidad-latido); transform: scale(var(--mov-escala-latido)); }
    100% { opacity: 1; transform: scale(1); }
  }
  .dz-latido { transform-box: fill-box; transform-origin: center; animation: dz-latido var(--mov-latido) var(--ease-velo) infinite; }
  @keyframes dz-traza {
    0% { stroke-dashoffset: 1; opacity: 0; }
    4% { stroke-dashoffset: 1; opacity: 1; }
    100% { stroke-dashoffset: 0; opacity: 1; }
  }
  .dz-traza .dz-trazo { stroke-dasharray: 1; animation: dz-traza var(--mov-traza) var(--ease-out) var(--mov-retardo) both; }
  .dz-traza .dz-trazo:nth-child(2) { animation-delay: calc(var(--mov-retardo) + 1 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(3) { animation-delay: calc(var(--mov-retardo) + 2 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(4) { animation-delay: calc(var(--mov-retardo) + 3 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(5) { animation-delay: calc(var(--mov-retardo) + 4 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(6) { animation-delay: calc(var(--mov-retardo) + 5 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(7) { animation-delay: calc(var(--mov-retardo) + 6 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(8) { animation-delay: calc(var(--mov-retardo) + 7 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(9) { animation-delay: calc(var(--mov-retardo) + 8 * var(--mov-escalon-traza)); }
  .dz-traza .dz-trazo:nth-child(10) { animation-delay: calc(var(--mov-retardo) + 9 * var(--mov-escalon-traza)); }
  @keyframes dz-ensamble-letra {
    0% { transform: translateY(var(--mov-sube)); opacity: 0; }
    100% { transform: translateY(0); opacity: 1; }
  }
  .dz-ensamble .dz-letra { transform-box: fill-box; transform-origin: center; animation: dz-ensamble-letra var(--mov-letra) var(--ease-enfasis) var(--mov-retardo) both; }
  .dz-ensamble .dz-letra:nth-child(2) { animation-delay: calc(var(--mov-retardo) + 1 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(3) { animation-delay: calc(var(--mov-retardo) + 2 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(4) { animation-delay: calc(var(--mov-retardo) + 3 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(5) { animation-delay: calc(var(--mov-retardo) + 4 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(6) { animation-delay: calc(var(--mov-retardo) + 5 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(7) { animation-delay: calc(var(--mov-retardo) + 6 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(8) { animation-delay: calc(var(--mov-retardo) + 7 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(9) { animation-delay: calc(var(--mov-retardo) + 8 * var(--mov-escalon-letra)); }
  .dz-ensamble .dz-letra:nth-child(10) { animation-delay: calc(var(--mov-retardo) + 9 * var(--mov-escalon-letra)); }
  @keyframes dz-ensamble-subrayado {
    0% { transform: scaleX(0); }
    100% { transform: scaleX(1); }
  }
  .dz-ensamble .dz-subrayado { transform-box: fill-box; transform-origin: center; transform-origin: 0 50%; animation: dz-ensamble-subrayado var(--mov-sub) var(--ease-enfasis) var(--mov-sub-ret) both; }
  @keyframes dz-gira {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
  .dz-gira { transform-box: fill-box; transform-origin: center; animation: dz-gira var(--mov-giro) linear infinite; }
  @keyframes dz-pop {
    0% { transform: scale(var(--mov-escala-entra)); opacity: .4; }
    100% { transform: scale(1); opacity: 1; }
  }
  .dz-pop { transform-box: fill-box; transform-origin: center; animation: dz-pop var(--dur-3) var(--ease-enfasis) both; }
  @keyframes dz-timbre {
    0% { transform: rotate(0deg); }
    10% { transform: rotate(-14deg); }
    20% { transform: rotate(12deg); }
    30% { transform: rotate(-10deg); }
    40% { transform: rotate(8deg); }
    50% { transform: rotate(0deg); }
    100% { transform: rotate(0deg); }
  }
  .dz-timbre { transform-box: fill-box; transform-origin: center; animation: dz-timbre var(--mov-timbre) var(--ease-velo) infinite; }
  @keyframes dz-llega {
    0% { transform: translate(var(--mov-dist-1), calc(-1 * var(--mov-dist-1))); opacity: .25; }
    45% { transform: translate(0, 0); opacity: 1; }
    100% { transform: translate(0, 0); opacity: 1; }
  }
  .dz-llega { transform-box: fill-box; transform-origin: center; animation: dz-llega var(--mov-timbre) var(--ease-out) infinite; }
  @keyframes dz-envia {
    0% { transform: translate(0, 0); opacity: 1; }
    45% { transform: translate(var(--mov-dist-2), calc(-1 * var(--mov-dist-2))); opacity: 0; }
    46% { transform: translate(calc(-1 * var(--mov-dist-2)), var(--mov-dist-2)); opacity: 0; }
    100% { transform: translate(0, 0); opacity: 1; }
  }
  .dz-envia { transform-box: fill-box; transform-origin: center; animation: dz-envia var(--mov-envia) var(--ease-enfasis) both; }
  @keyframes dz-ola {
    0% { opacity: 1; }
    35% { opacity: var(--mov-opacidad-ola); }
    70% { opacity: 1; }
    100% { opacity: 1; }
  }
  .dz-ola .dz-letra { animation: dz-ola var(--mov-latido) var(--ease-velo) infinite; }
  .dz-ola .dz-letra:nth-child(2) { animation-delay: calc(1 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(3) { animation-delay: calc(2 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(4) { animation-delay: calc(3 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(5) { animation-delay: calc(4 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(6) { animation-delay: calc(5 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(7) { animation-delay: calc(6 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(8) { animation-delay: calc(7 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(9) { animation-delay: calc(8 * var(--mov-escalon-letra)); }
  .dz-ola .dz-letra:nth-child(10) { animation-delay: calc(9 * var(--mov-escalon-letra)); }
  @keyframes dz-deriva {
    0% { transform: translate(0, 0); }
    100% { transform: translate(calc(-1 * var(--mov-fondo-paso)), calc(-1 * var(--mov-fondo-paso))); }
  }
  .dz-deriva { transform-box: fill-box; transform-origin: center; animation: dz-deriva var(--mov-deriva) linear infinite; }
  @keyframes dz-sonar {
    0% { transform: scale(1); opacity: .9; }
    80% { transform: scale(1.4); opacity: 0; }
    100% { transform: scale(1.4); opacity: 0; }
  }
  .dz-sonar { transform-box: fill-box; transform-origin: center; animation: dz-sonar var(--mov-sonar) var(--ease-out) infinite; }
  .dz-logo { display: block; overflow: visible; }
  .dz-logo .dz-subrayado { fill: var(--brand, currentColor); }
  .dz-logo--carga .dz-letra { transform-box: fill-box; transform-origin: center; }
  .dz-logo--zebra { color: var(--tinta-firma); }
  .dz-ensamble--breve { --mov-retardo: var(--mov-retardo-breve); --mov-letra: var(--mov-letra-breve); --mov-escalon-letra: var(--mov-escalon-letra-breve); --mov-sub: var(--mov-sub-breve); --mov-sub-ret: var(--mov-sub-ret-breve); --mov-sube: var(--mov-sube-breve); }
  .dz-ia { display: inline-block; overflow: visible; }
  .dz-ia--cargando { transform-box: fill-box; transform-origin: center; }
  .dz-fondo { position: absolute; inset: 0; overflow: hidden; pointer-events: none; contain: layout paint; }
  .dz-fondo > i { position: absolute; display: block; will-change: transform; }
  .dz-fondo--vacio { overflow: visible; contain: none; }
  .dz-fondo--vacio > i { inset: 0; border-radius: 50%; border: 1px solid var(--line-2); opacity: 0; animation: dz-sonar var(--mov-sonar) var(--ease-out) 2; }
  .dz-fondo--vacio > i:last-child { animation: dz-sonar var(--mov-sonar) var(--ease-out) calc(var(--mov-sonar) * 0.5) 1; }
  .dz-vacio__aro::before, .dz-vacio__aro::after { content: ""; position: absolute; inset: -1px; border-radius: 50%; border: 1px solid var(--line-2); opacity: 0; pointer-events: none; animation: dz-sonar var(--mov-sonar) var(--ease-out) 2; }
  .dz-vacio__aro::after { animation: dz-sonar var(--mov-sonar) var(--ease-out) calc(var(--mov-sonar) * 0.5) 1; }
  .dz-vacio__icono [pathLength] { stroke-dasharray: 1; animation: dz-traza var(--mov-traza) var(--ease-out) var(--mov-retardo) both; }
  .dz-vacio__icono [pathLength]:nth-child(2) { animation-delay: calc(var(--mov-retardo) + 1 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(3) { animation-delay: calc(var(--mov-retardo) + 2 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(4) { animation-delay: calc(var(--mov-retardo) + 3 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(5) { animation-delay: calc(var(--mov-retardo) + 4 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(6) { animation-delay: calc(var(--mov-retardo) + 5 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(7) { animation-delay: calc(var(--mov-retardo) + 6 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(8) { animation-delay: calc(var(--mov-retardo) + 7 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(9) { animation-delay: calc(var(--mov-retardo) + 8 * var(--mov-escalon-traza)); }
  .dz-vacio__icono [pathLength]:nth-child(10) { animation-delay: calc(var(--mov-retardo) + 9 * var(--mov-escalon-traza)); }
  .dz-fondo--espera > i:first-child { inset: 0 calc(-1 * var(--mov-fondo-paso)) calc(-1 * var(--mov-fondo-paso)) 0; background-image: radial-gradient(circle, color-mix(in oklch, var(--text-muted) 85%, transparent) 0 1.5px, transparent 1.6px); background-size: var(--mov-fondo-paso) var(--mov-fondo-paso); opacity: 0.9; animation: dz-deriva var(--mov-deriva) linear 0.2 forwards; }
  .dz-fondo--espera > i:last-child { inset: 0; background: var(--bg); animation: dz-latido var(--mov-latido) var(--ease-velo) 2; transform-box: fill-box; transform-origin: center; }
  .dz-fondo-acceso { position: relative; isolation: isolate; overflow: hidden; background: var(--bg); }
  .dz-fondo__lienzo { position: absolute; inset: 0; width: 100%; height: 100%; display: block; z-index: -1; }
  .dz-fondo-acceso--css::before { content: ""; position: absolute; z-index: -1; inset: 0 calc(-1 * var(--mov-fondo-paso)) calc(-1 * var(--mov-fondo-paso)) 0; background-image: radial-gradient(circle, color-mix(in oklch, var(--text-muted) 85%, transparent) 0 1.5px, transparent 1.6px); background-size: var(--mov-fondo-paso) var(--mov-fondo-paso); opacity: 0.8; will-change: transform; animation: dz-deriva var(--mov-deriva) linear infinite; }
  .dz-fondo-acceso--quieto::before { animation: none; }

  /* Movimiento reducido. Lo pide el sistema operativo, o una página que lo muestre con data-dz-movimiento="reducido" en un ancestro. */
  @media (prefers-reduced-motion: reduce) {
    .dz-entra { animation: dz-entra-reducido var(--dur-1) var(--ease-out) both; }
    .dz-sale { animation: dz-sale-reducido var(--dur-1) var(--ease-out) both; }
    .dz-latido { animation: none; }
    .dz-traza .dz-trazo { animation: none; }
    .dz-ensamble .dz-letra { animation: none; }
    .dz-ensamble .dz-subrayado { animation: none; }
    .dz-gira { animation: none; }
    .dz-gira path { stroke-dasharray: 0 4; }
    .dz-pop { animation: none; }
    .dz-timbre { animation: none; }
    .dz-llega { animation: none; }
    .dz-envia { animation: none; }
    .dz-ola .dz-letra { animation: none; }
    .dz-deriva { animation: none; }
    .dz-sonar { animation: none; }
    .dz-fondo--vacio > i { animation: none; opacity: .3; }
    .dz-fondo--vacio > i:last-child { animation: none; opacity: .3; }
    .dz-vacio__aro::before { animation: none; }
    .dz-vacio__aro::after { animation: none; }
    .dz-vacio__icono [pathLength] { animation: none; }
    .dz-fondo--espera > i { animation: none; }
    .dz-fondo--espera > i:first-child { animation: none; }
    .dz-fondo--espera > i:last-child { animation: none; opacity: .7; }
    .dz-fondo-acceso--css::before { animation: none; }
  }
  [data-dz-movimiento="reducido"] .dz-entra { animation: dz-entra-reducido var(--dur-1) var(--ease-out) both; }
  [data-dz-movimiento="reducido"] .dz-sale { animation: dz-sale-reducido var(--dur-1) var(--ease-out) both; }
  [data-dz-movimiento="reducido"] .dz-latido { animation: none; }
  [data-dz-movimiento="reducido"] .dz-traza .dz-trazo { animation: none; }
  [data-dz-movimiento="reducido"] .dz-ensamble .dz-letra { animation: none; }
  [data-dz-movimiento="reducido"] .dz-ensamble .dz-subrayado { animation: none; }
  [data-dz-movimiento="reducido"] .dz-gira { animation: none; }
  [data-dz-movimiento="reducido"] .dz-gira path { stroke-dasharray: 0 4; }
  [data-dz-movimiento="reducido"] .dz-pop { animation: none; }
  [data-dz-movimiento="reducido"] .dz-timbre { animation: none; }
  [data-dz-movimiento="reducido"] .dz-llega { animation: none; }
  [data-dz-movimiento="reducido"] .dz-envia { animation: none; }
  [data-dz-movimiento="reducido"] .dz-ola .dz-letra { animation: none; }
  [data-dz-movimiento="reducido"] .dz-deriva { animation: none; }
  [data-dz-movimiento="reducido"] .dz-sonar { animation: none; }
  [data-dz-movimiento="reducido"] .dz-fondo--vacio > i { animation: none; opacity: .3; }
  [data-dz-movimiento="reducido"] .dz-fondo--vacio > i:last-child { animation: none; opacity: .3; }
  [data-dz-movimiento="reducido"] .dz-vacio__aro::before { animation: none; }
  [data-dz-movimiento="reducido"] .dz-vacio__aro::after { animation: none; }
  [data-dz-movimiento="reducido"] .dz-vacio__icono [pathLength] { animation: none; }
  [data-dz-movimiento="reducido"] .dz-fondo--espera > i { animation: none; }
  [data-dz-movimiento="reducido"] .dz-fondo--espera > i:first-child { animation: none; }
  [data-dz-movimiento="reducido"] .dz-fondo--espera > i:last-child { animation: none; opacity: .7; }
  [data-dz-movimiento="reducido"] .dz-fondo-acceso--css::before { animation: none; }
  /* En segundo plano nada corre: movimiento.js pone data-dz-pausa en <html> con visibilitychange. */
  :root[data-dz-pausa] *, :root[data-dz-pausa] *::before, :root[data-dz-pausa] *::after { animation-play-state: paused !important; }
}


  /* Excepción de acceso 1 · el botón «Continuar con Google» es el botón del DS con la marca de Google (guía de Google Identity): fondo blanco con borde
     #747775 en claro y #131314 con borde #8E918F en oscuro, la G a color y el texto en su peso. Medidas, radio y foco siguen siendo los del DS. */
  .dz-pantalla-acceso .lz-google { --google-fondo: #ffffff; --google-texto: #1f1f1f; --google-borde: #747775; --google-fondo-hover: #f7f8f8; gap: 12px; background: var(--google-fondo); color: var(--google-texto); border-color: var(--google-borde); }
  .dz-pantalla-acceso .lz-google .lz-google__g { width: var(--ico-18); height: var(--ico-18); flex: none; }
  @media (hover: hover) { .dz-pantalla-acceso .lz-google:hover { background: var(--google-fondo-hover); color: var(--google-texto); border-color: var(--google-borde); } }
  [data-ds-theme="dark"] .dz-pantalla-acceso .lz-google { --google-fondo: #131314; --google-texto: #e3e3e3; --google-borde: #8e918f; --google-fondo-hover: #1e1f20; }
  /* El fondo animado llena su ranura; sin JS queda el color liso del tema. */
  .dz-pantalla-acceso .lz-fondo { width: 100%; height: 100%; }
  /* Una línea que la plantilla no trae y el CRM sí sabe: a quién pedirle acceso. */
  .dz-pantalla-acceso .lz-acceso-nota { margin: 0; font-size: var(--fs-3); line-height: var(--lh-3); color: var(--text-2); text-align: center; text-wrap-style: balance; }
  /* Excepción de acceso 2 · el endoso de la marca: «powered by» y el logo oficial de Zebra, una sola vez, al pie de la entrada (BCB, 17-oct). El logo usa
     currentColor y como imagen pinta negro; el archivo no se toca (HUELLA_LOGO), se invierte con un filtro. Es una barra traslúcida con desenfoque (Alex, 17-oct y 26-oct): la entrada es siempre oscura. */
  .lz-endoso { position: fixed; left: 0; right: 0; bottom: 0; z-index: 2; display: flex; justify-content: center; align-items: center; gap: 12px; height: calc(52px + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom); background: color-mix(in oklch, var(--text) 1.2%, transparent); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); border-top: 1px solid var(--border); color: var(--text-2); pointer-events: none; overflow: hidden; }
  /* WebKit no desenfoca lo que pinta un canvas WebGL: el pie lleva su propia copia de la franja, desenfocada (la llena JS_ENTRADA). */
  .lz-endoso .lz-endoso__vidrio { position: absolute; inset: 0; width: 100%; height: 100%; filter: blur(10px) saturate(130%); transform: scale(1.04); pointer-events: none; z-index: -1; }
  .lz-endoso small { font: 500 var(--fs-1)/1 var(--font); letter-spacing: .04em; text-transform: uppercase; color: var(--text-muted); }
  .lz-endoso img { display: block; height: 16px; width: auto; }
  [data-ds-theme="dark"] .lz-endoso img { filter: invert(1); }
  @media (max-width: 560px) { .dz-pantalla-acceso .dz-auth-shell__tarjeta { margin-bottom: calc(52px + env(safe-area-inset-bottom)); } }
