/* Yahu · Horizonte — tokens. Generado de tokens/tokens.json; no editar a mano. */
:root, [data-theme="noche"] {
  --yh-fondo: #110f0d;
  --yh-sup-1: #1a1816;
  --yh-sup-2: #1f1d1a;
  --yh-sup-3: #262320;
  --yh-hundido: #0a0908;
  --yh-campo: #1a1816;
  --yh-velo: rgba(10, 9, 8, 0.72);
  --yh-texto: #f2ead9;
  --yh-texto-2: #b8ae9d;
  --yh-texto-3: #9a9082;
  --yh-texto-inv: #110f0d;
  --yh-texto-off: #57534e;
  --yh-filete: rgba(242, 234, 217, 0.08);
  --yh-filete-fuerte: rgba(242, 234, 217, 0.16);
  --yh-borde-control: #71695f;
  --yh-boton-fondo: #1c1917;
  --yh-boton-borde: rgba(242, 234, 217, 0.14);
  --yh-foco: var(--yh-texto);
  --yh-naranja: #ff6a1f;
  --yh-sobre-naranja: #110f0d;
  --yh-senal-texto: #ff6a1f;
  --yh-senal-grafico: #ff6a1f;
  --yh-senal-suave: #2e1a0f;
  --yh-halo: rgba(255, 106, 31, 0.55);
  --yh-franja-1: #e2401c;
  --yh-franja-2: var(--yh-naranja);
  --yh-franja-3: #f5b544;
  --yh-fosforo: rgba(255, 106, 31, 0.5);
  --yh-barrido: rgba(0, 0, 0, 0.22);
  --yh-positivo: #10ec90;
  --yh-positivo-suave: #0f2a1e;
  --yh-precaucion: #f5b544;
  --yh-precaucion-suave: #2e2412;
  --yh-critico: #f0523a;
  --yh-critico-suave: #2e1512;
  --yh-sobre-critico: #110f0d;
  --yh-burbuja: #262320;
  --yh-burbuja-texto: var(--yh-texto);
  --yh-cielo-cenit: #1a1816;
  --yh-cielo-base: #0a0908;
  --yh-estrella: #f2ead9;
  --yh-orbita: rgba(242, 234, 217, 0.32);
  --yh-sombra-flotante: inset 0 1px 0 rgba(250, 250, 249, 0.06), 0 24px 48px -16px rgba(0, 0, 0, 0.6);
  --yh-brillo-senal: 0 0 0 1px rgba(255, 106, 31, 0.6), 0 0 16px rgba(255, 106, 31, 0.5), 0 0 48px rgba(255, 106, 31, 0.25);
}
:root {
  --yh-esp-1: 4px;
  --yh-esp-2: 8px;
  --yh-esp-3: 12px;
  --yh-esp-4: 16px;
  --yh-esp-5: 20px;
  --yh-esp-6: 24px;
  --yh-esp-8: 32px;
  --yh-esp-10: 40px;
  --yh-esp-14: 56px;
  --yh-esp-18: 72px;
  --yh-radio-chip: 4px;
  --yh-radio-control: 8px;
  --yh-radio-campo: 8px;
  --yh-radio-ficha: 12px;
  --yh-radio-hoja: 16px;
  --yh-radio-pildora: 999px;
  --yh-toque-min: 44px;
  --yh-boton-alto: 40px;
  --yh-boton-alto-hoja: 44px;
  --yh-campo-alto: 48px;
  --yh-barra-alto: 44px;
  --yh-pestanas-alto: 50px;
  --yh-riel-ancho: 248px;
  --yh-columna-ancho: 720px;
  --yh-panel-ahora-ancho: 320px;
  --yh-t-toque: 90ms;
  --yh-t-rapido: 160ms;
  --yh-t-base: 240ms;
  --yh-t-hoja: 400ms;
  --yh-t-hoja-salida: 260ms;
  --yh-t-pulso: 1600ms;
  --yh-t-orbita-vigilando: 16s;
  --yh-t-orbita-pensando: 2.4s;
  --yh-curva-llegada: cubic-bezier(0.16, 1, 0.3, 1);
  --yh-curva-salida: cubic-bezier(0.5, 0, 0.75, 0);
  --yh-curva-hoja: cubic-bezier(0.32, 0.72, 0, 1);
  --yh-curva-pulso: cubic-bezier(0.37, 0, 0.63, 1);
  --font-display: "Saira", ui-sans-serif, system-ui, sans-serif;
  --font-texto: "Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;
  --font-mono: "Space Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
@font-face { font-family: "Saira"; src: url("../fonts/saira-wdth-wght.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Geist"; src: url("../fonts/geist-wght.woff2") format("woff2"); font-weight: 100 900; font-style: normal; font-display: swap; }
@font-face { font-family: "Space Mono"; src: url("../fonts/space-mono-400.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: "Space Mono"; src: url("../fonts/space-mono-700.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; }
.display-1 { font-family: var(--font-display); font-size: 40px; line-height: 42px; font-weight: 600; letter-spacing: -0.01em; }
.display-2 { font-family: var(--font-display); font-size: 28px; line-height: 32px; font-weight: 600; letter-spacing: -0.01em; }
.titulo { font-family: var(--font-display); font-size: 20px; line-height: 24px; font-weight: 600; letter-spacing: 0; }
.subtitulo { font-family: var(--font-texto); font-size: 16px; line-height: 22px; font-weight: 600; letter-spacing: -0.01em; }
.chat { font-family: var(--font-texto); font-size: 17px; line-height: 26px; font-weight: 400; letter-spacing: -0.01em; }
.cuerpo { font-family: var(--font-texto); font-size: 15px; line-height: 22px; font-weight: 400; }
.apoyo { font-family: var(--font-texto); font-size: 14px; line-height: 20px; font-weight: 400; }
.boton { font-family: var(--font-texto); font-size: 14px; line-height: 20px; font-weight: 500; }
.pestana { font-family: var(--font-texto); font-size: 11px; line-height: 13px; font-weight: 500; }
.mono-s { font-family: var(--font-mono); font-size: 11px; line-height: 16px; font-weight: 400; letter-spacing: 0.06em; }
.mono-m { font-family: var(--font-mono); font-size: 13px; line-height: 20px; font-weight: 400; }
.reloj { font-family: var(--font-mono); font-size: 40px; line-height: 44px; font-weight: 700; letter-spacing: -0.02em; }

/* Yahu · Horizonte — la base: las tres voces, la capa retro, el movimiento compartido y el logo.
   Un solo tema: noche. Todo color y medida sale de tokens.css. Lo que necesita JavaScript
   (descifrar, relojes, estrellas) vive en js/nucleo.js. */

.yh {
  font-family: var(--font-texto);
  color: var(--yh-texto);
  background: var(--yh-fondo);
  color-scheme: dark;
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}
.yh *,
.yh *::before,
.yh *::after { box-sizing: border-box; }

/* ——— Las tres voces ———
   Display: Saira extendida, la rotulación de la era espacial (Eurostile, NASA 1975).
   Los estilos display-1, display-2 y titulo la llevan aunque falte `yh-display`. */
.yh-display,
.display-1,
.display-2,
.titulo {
  font-family: var(--font-display);
  font-variation-settings: "wdth" 125;
  text-wrap: balance;
}
/* Rótulos, telemetría y bitácora: Space Mono en MAYÚSCULAS, abierta +0.06em. */
.yh-mono {
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
}
/* Código: identificadores, comandos, valores. Minúsculas tal cual, sin tracking. */
.yh-codigo {
  font-family: var(--font-mono);
  text-transform: none;
  letter-spacing: 0;
  font-variant-ligatures: none;
}
/* Dentro de una frase la mono va a 0.86 em para igualar la altura de x de Geist. */
.yh-codigo-en-linea { font-size: 0.86em; }

/* Una tecla: ⌘K, Esc, Enter. */
.yh-tecla {
  display: inline-grid;
  place-items: center;
  min-width: 20px;
  height: 20px;
  padding: 0 5px;
  border: 1px solid var(--yh-filete-fuerte);
  border-bottom-width: 2px;
  border-radius: var(--yh-radio-chip);
  background: var(--yh-sup-3);
  color: var(--yh-texto-2);
  font-family: var(--font-mono);
  font-size: 11px;
  line-height: 1;
  letter-spacing: 0;
}

/* El cursor de bloque de Yahu cuando escribe: naranja, parpadea cada segundo. */
.yh-cursor {
  display: inline-block;
  width: 0.55em;
  height: 1.1em;
  margin-inline-start: 2px;
  vertical-align: text-bottom;
  background: var(--yh-senal-grafico);
  box-shadow: 0 0 8px var(--yh-fosforo);
  animation: yh-cursor 1s steps(1) infinite;
}
@keyframes yh-cursor { 50% { opacity: 0; } }

/* Con dedo, los botones crecen a la zona táctil de Apple (44 y 48 en hojas). */
@media (pointer: coarse) {
  :root { --yh-boton-alto: 44px; --yh-boton-alto-hoja: 48px; }
}

/* ═══ La capa retro ═══ */

/* Pantalla CRT: líneas de barrido, viñeta y un parpadeo casi imperceptible.
   Va en un contenedor (la traza, la consola, la llamada, el horizonte). */
.yh-crt { position: relative; isolation: isolate; }
.yh-crt::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 3;
  border-radius: inherit;
  pointer-events: none;
  background:
    radial-gradient(130% 100% at 50% 50%, transparent 62%, rgba(0, 0, 0, 0.38) 100%),
    repeating-linear-gradient(to bottom, var(--yh-barrido) 0 1px, transparent 1px 3px);
  animation: yh-crt-parpadeo 5.2s steps(1) infinite;
}
@keyframes yh-crt-parpadeo { 0%, 100% { opacity: 1; } 47% { opacity: 0.86; } 48% { opacity: 1; } 83% { opacity: 0.92; } 84% { opacity: 1; } }
/* Encender: la pantalla nace de una línea horizontal brillante, como un tubo. Una vez. */
.yh-enciende { animation: yh-enciende 620ms var(--yh-curva-llegada) backwards; transform-origin: 50% 50%; }
@keyframes yh-enciende {
  0% { transform: scale(0.6, 0.004); filter: brightness(4); opacity: 0.4; }
  35% { transform: scale(1, 0.004); filter: brightness(3); opacity: 1; }
  100% { transform: none; filter: none; opacity: 1; }
}
/* Fósforo: el texto naranja brilla en la pantalla. Sólo sobre yh-hundido y el cielo. */
.yh-fosforo { text-shadow: 0 0 10px var(--yh-fosforo); }

/* Esquinas de visor: cuatro escuadras de 10 px en las esquinas, como un retículo. */
.yh-esquinas { position: relative; --yh-esquina: var(--yh-texto-3); }
.yh-esquinas::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  --l: 10px;
  background:
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) top left / var(--l) 1px,
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) top left / 1px var(--l),
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) top right / var(--l) 1px,
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) top right / 1px var(--l),
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) bottom left / var(--l) 1px,
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) bottom left / 1px var(--l),
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) bottom right / var(--l) 1px,
    linear-gradient(var(--yh-esquina), var(--yh-esquina)) bottom right / 1px var(--l);
  background-repeat: no-repeat;
}

/* Papel cuadriculado de plano técnico: retícula de 24 px. */
.yh-reticula {
  background-image:
    linear-gradient(rgba(242, 234, 217, 0.045) 1px, transparent 1px),
    linear-gradient(90deg, rgba(242, 234, 217, 0.045) 1px, transparent 1px);
  background-size: 24px 24px;
  background-position: -1px -1px;
}

/* Franjas de misión: rojo, naranja y ámbar, 4 px cada una con 2 px de aire. */
.yh-franjas {
  display: block;
  height: 16px;
  background: linear-gradient(to bottom,
    var(--yh-franja-1) 0 4px, transparent 4px 6px,
    var(--yh-franja-2) 6px 10px, transparent 10px 12px,
    var(--yh-franja-3) 12px 16px);
}
.yh-franjas--vertical {
  width: 16px;
  height: auto;
  background: linear-gradient(to right,
    var(--yh-franja-1) 0 4px, transparent 4px 6px,
    var(--yh-franja-2) 6px 10px, transparent 10px 12px,
    var(--yh-franja-3) 12px 16px);
}
/* Que corran: las franjas se dibujan de izquierda a derecha al montar. */
.yh-franjas--entra { animation: yh-franjas 900ms var(--yh-curva-llegada) backwards; transform-origin: left; }
@keyframes yh-franjas { from { transform: scaleX(0); } }

/* Cinta de telemetría: el contenido va dos veces dentro de `.yh-cinta-pista` y corre sin fin. */
.yh-cinta {
  overflow: hidden;
  white-space: nowrap;
  -webkit-mask: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
          mask: linear-gradient(to right, transparent, #000 6%, #000 94%, transparent);
}
.yh-cinta-pista { display: inline-flex; gap: 2.5em; padding-right: 2.5em; animation: yh-cinta 38s linear infinite; }
.yh-cinta:hover .yh-cinta-pista { animation-play-state: paused; }
@keyframes yh-cinta { to { transform: translateX(-50%); } }

/* ═══ Movimiento compartido ═══
   Entrar: de desenfocado y 6 px abajo a nítido. `--i` escalona hermanos de 60 en 60 ms. */
.yh-entra {
  animation: yh-entra 560ms var(--yh-curva-llegada) backwards;
  animation-delay: calc(var(--i, 0) * 60ms);
}
@keyframes yh-entra {
  from { opacity: 0; transform: translateY(6px); filter: blur(6px); }
  to { opacity: 1; transform: none; filter: none; }
}
/* Cascada: los hijos de una lista entran uno tras otro (hasta el décimo; los demás, juntos). */
.yh-cascada > * { animation: yh-entra 560ms var(--yh-curva-llegada) backwards; animation-delay: calc(var(--i, 10) * 60ms); }
.yh-cascada > :nth-child(1) { --i: 0; }
.yh-cascada > :nth-child(2) { --i: 1; }
.yh-cascada > :nth-child(3) { --i: 2; }
.yh-cascada > :nth-child(4) { --i: 3; }
.yh-cascada > :nth-child(5) { --i: 4; }
.yh-cascada > :nth-child(6) { --i: 5; }
.yh-cascada > :nth-child(7) { --i: 6; }
.yh-cascada > :nth-child(8) { --i: 7; }
.yh-cascada > :nth-child(9) { --i: 8; }
/* Revelar un titular display: más lento y con más desenfoque. */
.yh-revela {
  animation: yh-revela 800ms var(--yh-curva-llegada) backwards;
  animation-delay: calc(var(--i, 0) * 90ms);
}
@keyframes yh-revela {
  from { opacity: 0; transform: translateY(0.18em) scale(0.985); filter: blur(14px); }
  to { opacity: 1; transform: none; filter: none; }
}
/* Un dato que cambia: el número nuevo sube en su lugar. */
.yh-cambia { animation: yh-cambia 320ms var(--yh-curva-llegada); }
@keyframes yh-cambia {
  from { opacity: 0; transform: translateY(40%); }
  to { opacity: 1; transform: none; }
}
/* Lo vivo late: un anillo de halo que se abre y se apaga. */
.yh-late { animation: yh-late 1.6s var(--yh-curva-pulso) infinite; }
@keyframes yh-late {
  0% { box-shadow: 0 0 0 0 var(--yh-halo); }
  70%, 100% { box-shadow: 0 0 0 7px rgba(255, 106, 31, 0); }
}

/* ═══ El logo ═══
   <svg class="yh-logo" viewBox="0 0 120 120"><path class="yh-logo-luz" d="M 81.98 91.73
   A 40 40 0 1 0 28.27 38.02 A 38 38 0 1 1 81.98 91.73 Z"/><circle class="yh-logo-tu"
   cx="56" cy="64" r="24"/></svg>. La luz gira alrededor de tu centro (56, 64). */
.yh-logo { display: block; flex: none; width: var(--yh-logo-tam, 24px); height: var(--yh-logo-tam, 24px); overflow: visible; }
.yh-logo-luz { fill: var(--yh-naranja); transform-box: view-box; transform-origin: 56px 64px; }
.yh-logo-tu { fill: var(--yh-texto); transform-box: view-box; transform-origin: 56px 64px; }
.yh-logo-firma { display: inline-flex; align-items: center; gap: 0.35em; color: var(--yh-texto); text-decoration: none; }
.yh-logo-firma .yh-logo { --yh-logo-tam: 1.3em; margin-inline-start: -0.12em; }
.yh-logo-nombre {
  font-family: var(--font-display);
  font-variation-settings: "wdth" 125;
  font-weight: 600;
  letter-spacing: 0.01em;
  line-height: 1;
}
/* Amanecer: al montar, la luz sale de detrás de ti y tú apareces. Una vez. */
.yh-logo--amanece .yh-logo-luz { animation: yh-logo-luz 1100ms var(--yh-curva-llegada) backwards; }
.yh-logo--amanece .yh-logo-tu { animation: yh-logo-tu 700ms var(--yh-curva-llegada) backwards; }
@keyframes yh-logo-luz { from { opacity: 0; transform: rotate(-200deg) scale(0.7); } to { opacity: 1; transform: none; } }
@keyframes yh-logo-tu { from { opacity: 0; transform: scale(0.4); } to { opacity: 1; transform: none; } }
/* Llamando: la luz te rodea, una vuelta cada 1.6 s, mientras Yahu está al teléfono. */
.yh-logo--llama .yh-logo-luz { animation: yh-logo-gira 1.6s linear infinite; }
@keyframes yh-logo-gira { to { transform: rotate(360deg); } }
/* Te necesita: la luz respira. */
.yh-logo--necesita .yh-logo-luz { animation: yh-logo-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate; }
@keyframes yh-logo-respira { to { opacity: 0.45; } }

/* El foco: nunca naranja */
.yh :focus-visible { outline: 2px solid var(--yh-foco); outline-offset: 2px; }

/* El cielo: sólo en la llamada, la bienvenida, los estados vacíos y la portada */
.yh-cielo {
  background: radial-gradient(120% 70% at 50% -10%, var(--yh-cielo-cenit) 0%, var(--yh-cielo-base) 62%);
  color: var(--yh-texto);
}

@media (prefers-reduced-motion: reduce) {
  .yh *,
  .yh *::before,
  .yh *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 1ms !important;
  }
  .yh-crt::after { animation: none; }
}

/* Yahu · Orbita. Extraído del design system Horizonte; la guía está en el artifact
   (components/Orbita/README.md). Necesita tokens.css y base.css. */

/* ═══ órbita: núcleo ═══
   La marca y el indicador de estado. Una elipse de excentricidad 0.6 girada
   −23.44°, trazada a 1 px. Tú eres el cuerpo, en el foco; Yahu es el satélite.
   El script calcula la geometría y la posición (ecuación de Kepler por Newton);
   aquí sólo va la apariencia. Fuente: Orbita/preview.html; PildoraEstado y
   Navegacion llevan una copia idéntica. */
.yh-orbita {
  --yh-orbita-tam: 20px;
  position: relative;
  display: inline-block;
  flex: none;
  width: var(--yh-orbita-tam);
  height: var(--yh-orbita-tam);
  vertical-align: middle;
}
.yh-orbita-traza {
  position: absolute;
  inset: 0;
  overflow: visible;
}
.yh-orbita-traza ellipse {
  fill: none;
  stroke: var(--yh-orbita);
  stroke-width: 1;
  vector-effect: non-scaling-stroke;
}
.yh-orbita--blanca .yh-orbita-traza ellipse { stroke: var(--yh-texto); }
/* El punteado significa «todavía no»: en pausa o sin conexión. */
.yh-orbita[data-estado="pausa"] .yh-orbita-traza ellipse { stroke-dasharray: 1.5 2; }
.yh-orbita--grande[data-estado="pausa"] .yh-orbita-traza ellipse { stroke-dasharray: 2 3; }

.yh-orbita-cuerpo,
.yh-orbita-onda,
.yh-orbita-satelite {
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 50%;
}
/* Tú: un disco en texto-3. Desde 64 px, la luz de Yahu lo ilumina por el
   lado que lo mira, más mientras más cerca está (∝ 1/r²). */
.yh-orbita-cuerpo {
  overflow: hidden;
  background: var(--yh-texto-3);
  transition: box-shadow 600ms var(--yh-curva-salida);
}
.yh-orbita-luz { display: none; }
/* El horizonte: desde 64 px tú eres un disco negro con canto de luz, como el
   agujero de eventide; en los tamaños chicos sigues siendo un punto en texto-3. */
.yh-orbita--grande .yh-orbita-cuerpo {
  background: var(--yh-cielo-base);
  box-shadow: inset 0 0 0 1px var(--yh-filete-fuerte), 0 0 0 1px var(--yh-orbita);
}
/* Cuando Yahu está vivo, su órbita se enciende: un anillo naranja con halo. */
.yh-orbita--grande:is([data-estado="pensando"], [data-estado="necesita"], [data-estado="contacto"]) .yh-orbita-traza ellipse {
  stroke: var(--yh-senal-grafico);
}
.yh-orbita--grande:is([data-estado="pensando"], [data-estado="necesita"], [data-estado="contacto"]) .yh-orbita-traza {
  filter: drop-shadow(0 0 3px var(--yh-halo)) drop-shadow(0 0 12px var(--yh-halo));
}
.yh-orbita--grande .yh-orbita-luz {
  display: block;
  position: absolute;
  inset: 0;
  border-radius: inherit;
  opacity: var(--yh-orbita-luz, 0);
  background: radial-gradient(circle var(--yh-orbita-alcance, 8px) at var(--yh-orbita-lx, 50%) var(--yh-orbita-ly, 50%), var(--yh-senal-grafico), transparent);
}
/* Contacto: el borde del cuerpo queda encendido; al colgar se enfría en 600 ms. */
.yh-orbita--encendida .yh-orbita-cuerpo {
  box-shadow: 0 0 0 1px var(--yh-senal-grafico), var(--yh-brillo-senal);
  transition-duration: 280ms;
  transition-timing-function: var(--yh-curva-llegada);
}
.yh-orbita-onda {
  opacity: 0;
  pointer-events: none;
  box-shadow: inset 0 0 0 1px var(--yh-senal-grafico);
}
.yh-orbita-onda--sale { animation: yh-orbita-onda 900ms var(--yh-curva-llegada); }
@keyframes yh-orbita-onda {
  from { opacity: 0.5; transform: scale(1); }
  to { opacity: 0; transform: scale(2.2); }
}
/* Yahu: el satélite naranja. Brilla sólo cuando está vivo. */
.yh-orbita-satelite { background: var(--yh-senal-grafico); }
.yh-orbita[data-estado="pensando"] .yh-orbita-satelite,
.yh-orbita[data-estado="contacto"] .yh-orbita-satelite { box-shadow: var(--yh-brillo-senal); }
.yh-orbita-satelite::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  opacity: 0;
  box-shadow: var(--yh-brillo-senal);
}
/* Te necesita: estacionado en el perigeo, su brillo respira. */
.yh-orbita--aparcada .yh-orbita-satelite::after { opacity: 1; }
.yh-orbita--aparcada[data-vivo] .yh-orbita-satelite::after {
  animation: yh-orbita-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-orbita-respira {
  from { opacity: 1; }
  to { opacity: 0.35; }
}
/* En pausa: satélite hueco en texto-3. */
.yh-orbita[data-estado="pausa"] .yh-orbita-satelite {
  background: transparent;
  box-shadow: inset 0 0 0 1px var(--yh-texto-3);
}
@media (prefers-reduced-motion: reduce) {
  .yh-orbita-onda--sale { animation: none; }
}
/* ═══ fin del núcleo de la órbita ═══ */

/* ═══ órbita: firma ═══
   La órbita de 20 px junto a «Yahu» en Saira extendida 600 a 18 px.
   Fuente: Orbita/preview.html. */
.yh-orbita-firma {
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
}
.yh-orbita-nombre {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 18px;
  line-height: 1;
  letter-spacing: -0.01em;
  font-variation-settings: "wdth" 125;

  color: var(--yh-texto);
}
/* ═══ fin de la firma ═══ */


/* Yahu · PildoraEstado. Extraído del design system Horizonte; la guía está en el artifact
   (components/PildoraEstado/README.md). Necesita tokens.css y base.css. */

/* ═══ órbita: firma ═══
   La órbita de 20 px junto a «Yahu» en Saira extendida 600 a 18 px.
   Fuente: Orbita/preview.html. */
.yh-orbita-firma {
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
}
.yh-orbita-nombre {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 18px;
  line-height: 1;
  letter-spacing: -0.01em;
  font-variation-settings: "wdth" 125;

  color: var(--yh-texto);
}
/* ═══ fin de la firma ═══ */

/* ═══ píldora: estilos ═══
   Una píldora de 32 px con zona táctil de 44 que dice qué hace Yahu: sup-2 con
   filete fuerte y luz de canto. El indicador es la órbita de 14 px (el estado de Yahu) o un punto
   de 8 px (una llamada o la salud de una conexión). Fuente:
   PildoraEstado/preview.html; Navegacion lleva una copia idéntica. */
.yh-pildora-estado {
  --yh-pildora-estado-fondo: var(--yh-sup-2);
  --yh-pildora-estado-sombra: inset 0 0 0 1px var(--yh-filete-fuerte), var(--yh-sombra-flotante);
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
  height: 32px;
  padding: 0 var(--yh-esp-3);
  border: 0;
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-pildora-estado-fondo);
  box-shadow: var(--yh-pildora-estado-sombra);
  color: var(--yh-texto-2);
  font: inherit;
  white-space: nowrap;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: transform var(--yh-t-toque) var(--yh-curva-llegada);
}
/* La zona táctil llega a 44 px sin agrandar la cápsula. */
.yh-pildora-estado::before {
  content: "";
  position: absolute;
  inset: calc((32px - var(--yh-toque-min)) / 2) 0;
}
.yh-pildora-estado:active { transform: scale(0.97); }
.yh-pildora-estado--orbita { padding-left: var(--yh-esp-2); }
.yh-pildora-estado-punto {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: currentColor;
}
/* Te necesita: señal-texto sobre señal-suave (5.77:1). */
.yh-pildora-estado--necesita {
  --yh-pildora-estado-fondo: var(--yh-senal-suave);
  --yh-pildora-estado-sombra: none;
  color: var(--yh-senal-texto);
}
/* En llamada: el punto vivo respira y el texto va en primario. */
.yh-pildora-estado--llamada { color: var(--yh-texto); }
.yh-pildora-estado--llamada .yh-pildora-estado-punto {
  background: var(--yh-senal-grafico);
  box-shadow: var(--yh-brillo-senal);
  animation: yh-pildora-estado-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-pildora-estado-respira {
  from { opacity: 1; }
  to { opacity: 0.35; }
}
/* Sin acceso: el punto y la palabra en crítico, nunca sólo el color. */
.yh-pildora-estado--critico {
  --yh-pildora-estado-fondo: var(--yh-critico-suave);
  --yh-pildora-estado-sombra: none;
  color: var(--yh-critico);
}
/* ═══ fin de la píldora ═══ */

/* Yahu · Boton. Extraído del design system Horizonte; la guía está en el artifact
   (components/Boton/README.md). Necesita tokens.css y base.css. */

/* ——— Botón ———
   La tipografía la pone la clase `boton` (14/20, 500). Los selectores llevan
   `.yh` delante para ganarle a `.boton` sin depender del orden de las hojas. */
.yh .yh-boton {
  position: relative;
  isolation: isolate;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  height: var(--yh-boton-alto);
  min-width: var(--yh-boton-alto);
  margin: 0;
  padding: 0 16px;
  border: 1px solid var(--yh-boton-borde);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  color: var(--yh-texto);
  text-decoration: none;
  white-space: nowrap;
  overflow: hidden;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition:
    transform var(--yh-t-toque) var(--yh-curva-llegada),
    background-color var(--yh-t-rapido) var(--yh-curva-llegada),
    border-color var(--yh-t-rapido) var(--yh-curva-llegada),
    color var(--yh-t-rapido) var(--yh-curva-llegada);
}
/* Con dedo la zona táctil llega a 44 sin agrandar el botón. */
.yh .yh-boton::after { content: ""; position: absolute; inset: calc((var(--yh-boton-alto) - 44px) / 2) 0; }
.yh .yh-boton--con-flecha { padding-right: 12px; }

/* La flecha: → lleva a otra pantalla, ↗ sale de la app. Se desliza 2 px al pasar. */
.yh-boton-flecha {
  width: 14px;
  height: 14px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh-boton-icono { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }

/* Variantes */
.yh .yh-boton--primario { border-color: transparent; background: var(--yh-texto); color: var(--yh-texto-inv); }
/* Yahu: el principal con su punto vivo. Suelta a Yahu («Sí, llama»). */
.yh .yh-boton--yahu { border-color: transparent; background: var(--yh-texto); color: var(--yh-texto-inv); padding-left: 14px; }
.yh .yh-boton--yahu::before {
  content: "";
  width: 7px;
  height: 7px;
  flex: none;
  border-radius: 50%;
  background: var(--yh-naranja);
  box-shadow: 0 0 0 0 var(--yh-halo);
  animation: yh-boton-late 1.6s var(--yh-curva-pulso) infinite;
}
@keyframes yh-boton-late {
  0% { box-shadow: 0 0 0 0 var(--yh-halo); }
  70%, 100% { box-shadow: 0 0 0 7px rgba(255, 106, 31, 0); }
}
.yh .yh-boton--peligro { color: var(--yh-critico); }
.yh .yh-boton--fantasma { border-color: transparent; background: transparent; padding: 0 10px; color: var(--yh-texto-2); }
/* Enlace con flecha: sin caja, como «Talk to an engineer →». */
.yh .yh-boton--enlace { height: auto; min-width: 0; padding: 4px 0; border: 0; background: none; border-radius: var(--yh-radio-chip); }
.yh .yh-boton--icono { width: var(--yh-boton-alto); padding: 0; }
.yh .yh-boton--hoja { height: var(--yh-boton-alto-hoja); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-boton--compacto { height: 32px; padding: 0 12px; }
}

/* Pasar el cursor */
@media (hover: hover) {
  .yh .yh-boton:hover { border-color: rgba(250, 250, 249, 0.24); background: var(--yh-sup-2); }
  .yh .yh-boton--primario:hover, .yh .yh-boton--yahu:hover { border-color: transparent; background: #ded4c1; }
  .yh .yh-boton--fantasma:hover { background: var(--yh-sup-1); color: var(--yh-texto); }
  .yh .yh-boton--enlace:hover { background: none; color: var(--yh-texto); }
  .yh .yh-boton--peligro:hover { background: var(--yh-critico-suave); border-color: rgba(240, 82, 58, 0.4); }
  .yh .yh-boton:hover .yh-boton-flecha--ir { transform: translateX(2px); }
  .yh .yh-boton:hover .yh-boton-flecha--salir { transform: translate(2px, -2px); }
}
/* Presionado. `yh-boton--presionado` sólo existe para enseñar el estado en esta vista. */
.yh .yh-boton:active:not(:disabled), .yh .yh-boton--presionado { transform: scale(.97); }
/* Foco: el anillo real lo pone bundle.css con :focus-visible; esta clase sólo lo enseña. */
.yh .yh-boton--foco { outline: 2px solid var(--yh-foco); outline-offset: 2px; }
.yh .yh-boton:disabled, .yh .yh-boton[aria-disabled="true"] {
  border-color: transparent;
  background: var(--yh-sup-1);
  color: var(--yh-texto-off);
  cursor: not-allowed;
  transform: none;
}
.yh .yh-boton:disabled::before { animation: none; background: var(--yh-texto-off); }

/* ——— Mantener para confirmar ———
   Para lo irreversible: se llena de izquierda a derecha mientras lo sostienes
   (1.2 s); si sueltas antes, se vacía. Al llenarse se confirma y la palomita
   se dibuja. Con teclado: sostén Espacio o Enter. */
.yh .yh-boton--mantener { --yh-boton-relleno: var(--yh-critico); --yh-boton-sobre: var(--yh-sobre-critico); justify-content: center; }
.yh .yh-boton--mantener.yh-boton--de-yahu { --yh-boton-relleno: var(--yh-naranja); --yh-boton-sobre: var(--yh-sobre-naranja); }
.yh-boton-carga {
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--yh-boton-relleno);
  transform-origin: left center;
  transform: scaleX(0);
  transition: transform 220ms var(--yh-curva-salida);
}
.yh .yh-boton--mantener[data-estado="sosteniendo"] .yh-boton-carga { transform: scaleX(1); transition: transform 1200ms linear; }
.yh .yh-boton--mantener[data-estado="listo"] .yh-boton-carga { transform: scaleX(1); transition: none; }
.yh .yh-boton--mantener[data-estado="listo"] { color: var(--yh-boton-sobre); border-color: transparent; }
.yh-boton-palomita { display: none; }
.yh .yh-boton--mantener[data-estado="listo"] .yh-boton-palomita { display: block; stroke-dasharray: 20; stroke-dashoffset: 20; animation: yh-boton-traza 320ms var(--yh-curva-llegada) forwards; }
@keyframes yh-boton-traza { to { stroke-dashoffset: 0; } }
/* El texto que queda sobre el relleno se recorta en su color, como la cuenta de Confirmación. */
.yh-boton-texto-sobre {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--yh-boton-sobre);
  clip-path: inset(0 100% 0 0);
  transition: clip-path 220ms var(--yh-curva-salida);
  pointer-events: none;
}
.yh .yh-boton--mantener[data-estado="sosteniendo"] .yh-boton-texto-sobre { clip-path: inset(0 0 0 0); transition: clip-path 1200ms linear; }
.yh .yh-boton--mantener[data-estado="listo"] .yh-boton-texto-sobre { display: none; }

@media (pointer: coarse) {
  .yh .yh-boton--compacto { height: var(--yh-boton-alto); }
}
@media (prefers-reduced-motion: reduce) {
  .yh .yh-boton:active:not(:disabled), .yh .yh-boton--presionado { transform: none; opacity: .88; }
  .yh .yh-boton--yahu::before { animation: none; }
}

/* Yahu · CampoTexto. Extraído del design system Horizonte; la guía está en el artifact
   (components/CampoTexto/README.md). Necesita tokens.css y base.css. */

/* ——— Campo de texto ———
   Etiqueta con `apoyo` en 600, valor con `chat` (17 px: Safari no hace zoom al enfocar).
   Los selectores llevan `.yh` delante para ganarle a las clases de texto. */
.yh-campo-texto { display: grid; gap: var(--yh-esp-2); min-width: 0; }
.yh .yh-campo-texto-etiqueta { font-weight: 600; color: var(--yh-texto-2); }
.yh .yh-campo-texto-control {
  display: block;
  width: 100%;
  height: var(--yh-campo-alto);
  margin: 0;
  padding: 0 var(--yh-esp-4);
  border: 1px solid var(--yh-borde-control);
  border-radius: var(--yh-radio-campo);
  background: var(--yh-campo);
  color: var(--yh-texto);
  font-variant-numeric: tabular-nums;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh-campo-texto-control::placeholder { color: var(--yh-texto-3); opacity: 1; }
/* Teléfonos y códigos: Space Mono a 17 px, sin pasar a mayúsculas lo que escribes */
.yh .yh-campo-texto-mono { font-family: var(--font-mono); }
.yh .yh-campo-texto-control[aria-invalid="true"] { border-color: var(--yh-critico); }
.yh .yh-campo-texto-ayuda { margin: 0; color: var(--yh-texto-2); }
.yh .yh-campo-texto-error {
  display: flex;
  align-items: flex-start;
  gap: var(--yh-esp-2);
  margin: 0;
  color: var(--yh-critico);
}
.yh-campo-texto-icono {
  width: 16px;
  height: 16px;
  margin-block-start: 2px;   /* centra 16 px en la línea de 20 */
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-campo-texto-icono .yh-campo-texto-punto { fill: currentColor; stroke: none; }
/* La mono dentro de una frase va a 0.83 em */
.yh-campo-texto-dato { font-family: var(--font-mono); font-size: .83em; }
/* Foco: el anillo real lo pone bundle.css con :focus-visible; esta clase sólo lo enseña. */
.yh .yh-campo-texto-foco { outline: 2px solid var(--yh-foco); outline-offset: 2px; }

/* Yahu · EntradaChat. Extraído del design system Horizonte; la guía está en el artifact
   (components/EntradaChat/README.md). Necesita tokens.css y base.css. */

/* ——— Entrada de chat ——— */
.yh-entrada-chat {
  display: flex;
  align-items: flex-end;
  gap: var(--yh-esp-2);
  margin: 0;
}
/* El texto usa la clase `chat` (17/26): 26 + 2 × 10 de padding + 2 de borde = 48 */
.yh .yh-entrada-chat-campo {
  display: block;
  flex: 1 1 auto;
  min-width: 0;
  min-height: var(--yh-campo-alto);
  max-height: calc(6 * 26px + 2 * 10px + 2px);   /* 6 líneas; después, scroll */
  margin: 0;
  padding: 10px var(--yh-esp-5);
  border: 1px solid var(--yh-borde-control);
  border-radius: var(--yh-radio-control);
  background: var(--yh-campo);
  color: var(--yh-texto);
  font-variant-numeric: tabular-nums;
  resize: none;
  overflow-y: hidden;
  scrollbar-width: thin;
  scrollbar-color: var(--yh-borde-control) transparent;
}
.yh-entrada-chat-campo::placeholder { color: var(--yh-texto-3); opacity: 1; }
/* Cuando pasa de una línea deja de ser cápsula */
.yh .yh-entrada-chat-campo-varias { border-radius: var(--yh-radio-ficha); }

.yh-entrada-chat-enviar {
  display: grid;
  place-items: center;
  flex: none;
  width: var(--yh-toque-min);
  height: var(--yh-toque-min);
  /* centrado contra la primera línea del campo de 48 */
  margin: 0 0 calc((var(--yh-campo-alto) - var(--yh-toque-min)) / 2);
  padding: 0;
  border: 0;
  border-radius: var(--yh-radio-control);
  background: var(--yh-texto);
  color: var(--yh-texto-inv);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition:
    background-color var(--yh-t-rapido) var(--yh-curva-llegada),
    color var(--yh-t-rapido) var(--yh-curva-llegada),
    transform var(--yh-t-toque) var(--yh-curva-llegada);
}
.yh-entrada-chat-enviar:active:not(:disabled) { transform: scale(.97); }
/* Vacío: no hay nada que enviar */
.yh-entrada-chat-enviar:disabled { background: var(--yh-sup-3); color: var(--yh-texto-off); cursor: default; }
.yh-entrada-chat-icono {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-entrada-chat-icono-detener { fill: currentColor; stroke: none; }
.yh-entrada-chat-enviar[data-modo="detener"] .yh-entrada-chat-icono-enviar,
.yh-entrada-chat-enviar:not([data-modo="detener"]) .yh-entrada-chat-icono-detener { display: none; }

@media (prefers-reduced-motion: reduce) {
  .yh-entrada-chat-enviar:active:not(:disabled) { transform: none; opacity: .88; }
}

/* Yahu · TurnoChat. Extraído del design system Horizonte; la guía está en el artifact
   (components/TurnoChat/README.md). Necesita tokens.css y base.css. */

/* ——— Turno de chat ——— */
.yh-turno-chat-hilo {
  display: flex;
  flex-direction: column;
  gap: var(--yh-esp-5);              /* 20 px entre turnos */
  max-width: var(--yh-columna-ancho);
  margin: 0;
}
.yh-turno-chat-turno {
  display: flex;
  flex-direction: column;
  gap: var(--yh-esp-1);              /* 4 px dentro de un turno */
  min-width: 0;
  margin: 0;
  animation: yh-turno-chat-llega var(--yh-t-base) var(--yh-curva-llegada) both;
}
/* Todo nace de su origen: Yahu desde su rótulo, tú desde el campo de abajo a la derecha */
.yh-turno-chat-yahu { align-items: flex-start; transform-origin: 0 0; }
.yh-turno-chat-tuyo { align-items: flex-end; transform-origin: 100% 100%; }

.yh .yh-turno-chat-rotulo,
.yh .yh-turno-chat-meta { margin: 0; color: var(--yh-texto-3); }
.yh .yh-turno-chat-texto { margin: 0; max-width: 34em; color: var(--yh-texto); text-wrap: pretty; }
.yh .yh-turno-chat-bitacora { margin: 0; padding: 0; list-style: none; color: var(--yh-texto-2); }

.yh-turno-chat-grupo {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--yh-esp-1);
  width: 100%;
}
.yh .yh-turno-chat-burbuja {
  max-width: 80%;
  margin: 0;
  padding: 10px 14px;                /* medida exacta del sistema, fuera de la escala de 4 */
  border-radius: var(--yh-radio-ficha);
  background: var(--yh-burbuja);
  color: var(--yh-burbuja-texto);
  overflow-wrap: anywhere;
}
/* La última burbuja del grupo apunta a su hora */
.yh .yh-turno-chat-burbuja:last-child { border-bottom-right-radius: var(--yh-radio-chip); }

/* No se envió: crítico, con ícono y con una salida */
.yh .yh-turno-chat-fallo {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  color: var(--yh-critico);
}
.yh-turno-chat-icono {
  width: 16px;
  height: 16px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-turno-chat-icono .yh-turno-chat-punto { fill: currentColor; stroke: none; }
.yh-turno-chat-reintentar {
  position: relative;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  font-variation-settings: inherit;
  text-transform: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
/* Zona táctil de 44 px alrededor de una palabra de 16 px de alto */
.yh-turno-chat-reintentar::before { content: ""; position: absolute; inset: -14px -8px; }

/* Yahu escribiendo: cursor de bloque naranja de 0.5 × 1.1 em que parpadea cada segundo */
.yh-turno-chat-cursor {
  display: inline-block;
  width: .5em;
  height: 1.1em;
  margin-inline-start: .1em;
  vertical-align: -.2em;
  background: var(--yh-senal-texto);
  animation: yh-turno-chat-parpadeo 1s steps(1) infinite;
}

@keyframes yh-turno-chat-llega { from { opacity: 0; transform: scale(.985); } }
@keyframes yh-turno-chat-funde { from { opacity: 0; } }
@keyframes yh-turno-chat-parpadeo { 50% { opacity: 0; } }

@media (prefers-reduced-motion: reduce) {
  .yh-turno-chat-turno { animation-name: yh-turno-chat-funde; }
  .yh-turno-chat-cursor { animation: none; }
}

/* Yahu · Confirmacion. Extraído del design system Horizonte; la guía está en el artifact
   (components/Confirmacion/README.md). Necesita tokens.css y base.css. */
/* entradas: --yh-confirmacion-tope, --yh-confirmacion-curva-hoja — las pone el script de la hoja al abrirla. */

/* ——— Confirmación ———
   La tipografía la ponen las clases de estilo (titulo, cuerpo, apoyo, boton,
   mono-s, mono-m). Los selectores llevan `.yh` delante para ganarles sin
   depender del orden de las hojas. */
.yh .yh-confirmacion {
  /* Medidas exactas del sistema (§8), fuera de la escala de 4 a propósito */
  --yh-confirmacion-radio: var(--yh-radio-ficha);
  --yh-confirmacion-relleno: var(--yh-esp-4);
  --yh-confirmacion-recibo-relleno: 14px;
  --yh-confirmacion-clave: 72px;
  /* Radio concéntrico: max(6 px, radio del contenedor − su padding). 6 en la tarjeta, 12 en la hoja. */
  --yh-confirmacion-radio-dentro: max(var(--yh-radio-chip), calc(var(--yh-confirmacion-radio) - var(--yh-confirmacion-relleno)));
  container: yh-confirmacion / inline-size;
  position: relative;
  width: 100%;
  max-width: 560px;
  margin: 0;
  padding: var(--yh-confirmacion-relleno);
  border: 1px solid transparent;
  border-radius: var(--yh-confirmacion-radio);
  background: var(--yh-sup-1);
  color: var(--yh-texto);
}
/* La ficha sube del fondo con un filete */
.yh-confirmacion { border-color: var(--yh-filete); }

/* Cabecera: la bitácora de Yahu en mono, con la órbita estacionada */
.yh .yh-confirmacion-cabecera {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  min-width: 0;
  margin: 0;
  color: var(--yh-texto-3);
}
.yh .yh-confirmacion-pide { color: var(--yh-senal-texto); }
/* Ya resuelta: deja de pedir y queda el folio */
.yh .yh-confirmacion:is([data-estado="aprobado"], [data-estado="rechazado"]) :is(.yh-confirmacion-pide, .yh-confirmacion-vence) { display: none; }

/* La órbita de 12 px, el tamaño de Orbita para una línea mono-s, con su geometría:
   tú en el foco y Yahu estacionado en el perigeo */
.yh .yh-confirmacion-orbita { position: relative; flex: none; width: 12px; height: 12px; }
.yh .yh-confirmacion-orbita svg { position: absolute; inset: 0; overflow: visible; }
.yh .yh-confirmacion-orbita ellipse { fill: none; stroke: var(--yh-orbita); stroke-width: 1; vector-effect: non-scaling-stroke; }
.yh .yh-confirmacion-orbita-cuerpo,
.yh .yh-confirmacion-orbita-satelite { position: absolute; border-radius: 50%; }
.yh .yh-confirmacion-orbita-cuerpo { left: 2.7px; top: 6.36px; width: 1.5px; height: 1.5px; background: var(--yh-texto-3); }
.yh .yh-confirmacion-orbita-satelite { left: -.12px; top: 6.5px; width: 3px; height: 3px; background: var(--yh-senal-grafico); }
.yh .yh-confirmacion-orbita-satelite::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  box-shadow: var(--yh-brillo-senal);
  animation: yh-confirmacion-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
/* Contando: ya tiene tu sí, la luz se queda fija. Resuelta: se apaga. */
.yh .yh-confirmacion[data-estado="contando"] .yh-confirmacion-orbita-satelite::after { animation: none; }
.yh .yh-confirmacion:is([data-estado="aprobado"], [data-estado="rechazado"]) .yh-confirmacion-orbita-satelite::after { animation: none; box-shadow: none; }
@keyframes yh-confirmacion-respira { to { opacity: .35; } }

/* Título: verbo y objeto exactos. 24/28 a 125 % cuando la tarjeta es ancha. */
.yh .yh-confirmacion-titulo { margin: var(--yh-esp-2) 0 0; color: var(--yh-texto); }
.yh .yh-confirmacion-titulo:focus { outline: none; }
.yh .yh-confirmacion-titulo:focus-visible { outline: 2px solid var(--yh-foco); outline-offset: 2px; }
@container yh-confirmacion (min-width: 440px) {
  .yh .yh-confirmacion-titulo { font-size: 24px; line-height: 28px; }
}

/* El recibo: al pie de la letra, hundido, con la columna de claves en mono */
.yh .yh-confirmacion-recibo {
  display: grid;
  grid-template-columns: var(--yh-confirmacion-clave) minmax(0, 1fr);
  align-items: baseline;
  gap: var(--yh-esp-2) var(--yh-esp-3);
  margin: var(--yh-esp-3) 0 0;
  padding: var(--yh-confirmacion-recibo-relleno);
  border-radius: var(--yh-confirmacion-radio-dentro);
  background: var(--yh-hundido);
}
.yh .yh-confirmacion-recibo dt { color: var(--yh-texto-3); }
.yh .yh-confirmacion-recibo dd { min-width: 0; margin: 0; color: var(--yh-texto); overflow-wrap: break-word; }
/* Los cambios, como diff: «−» en texto-3 tachado, «+» en texto con el signo en señal */
.yh .yh-confirmacion-diff { display: grid; gap: var(--yh-esp-1); }
.yh .yh-confirmacion-diff > span { display: flex; gap: var(--yh-esp-2); }
.yh .yh-confirmacion-signo { flex: none; }
.yh .yh-confirmacion-diff-menos { color: var(--yh-texto-3); }
.yh .yh-confirmacion-diff-menos del { text-decoration: line-through 1px currentColor; }
.yh .yh-confirmacion-diff-mas ins { color: var(--yh-texto); text-decoration: none; }
.yh .yh-confirmacion-diff-mas .yh-confirmacion-signo { color: var(--yh-senal-texto); }

/* Debajo del recibo: el porqué con su fuente, la regla que lo detuvo y la consecuencia */
.yh .yh-confirmacion-porque { margin: var(--yh-esp-3) 0 0; color: var(--yh-texto-2); text-wrap: pretty; }
.yh .yh-confirmacion-fuente { margin: var(--yh-esp-1) 0 0; color: var(--yh-texto-3); }
.yh .yh-confirmacion-regla {
  width: fit-content;
  max-width: 100%;
  margin: var(--yh-esp-3) 0 0;
  padding: var(--yh-esp-1) var(--yh-esp-2);
  border-radius: var(--yh-radio-chip);
  background: var(--yh-sup-3);
  color: var(--yh-texto-2);
  text-wrap: balance;
}
.yh .yh-confirmacion-consecuencia {
  display: flex;
  align-items: flex-start;
  gap: var(--yh-esp-2);
  margin: var(--yh-esp-3) 0 0;
  color: var(--yh-texto-2);
}
.yh .yh-confirmacion-consecuencia .yh-confirmacion-icono { color: var(--yh-texto-3); }
/* Precaución: ámbar sobre su fondo suave, siempre con ícono */
.yh .yh-confirmacion-consecuencia--precaucion {
  padding: var(--yh-esp-2) var(--yh-esp-3);
  border-radius: var(--yh-confirmacion-radio-dentro);
  background: var(--yh-precaucion-suave);
  color: var(--yh-precaucion);
}
.yh .yh-confirmacion-consecuencia--precaucion .yh-confirmacion-icono { color: currentColor; }
.yh .yh-confirmacion:is([data-estado="aprobado"], [data-estado="rechazado"]) .yh-confirmacion-consecuencia { display: none; }

.yh .yh-confirmacion-icono {
  width: 20px;
  height: 20px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh .yh-confirmacion-icono--chico { width: 16px; height: 16px; }
.yh .yh-confirmacion-icono .yh-confirmacion-punto { fill: currentColor; stroke: none; }

/* ——— El pie: botones, cuenta para deshacer, bitácora o el porqué del rechazo ——— */
.yh .yh-confirmacion-pie { margin-top: var(--yh-esp-4); }
.yh .yh-confirmacion-acciones { display: flex; gap: var(--yh-esp-3); }
.yh .yh-confirmacion-boton {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  gap: var(--yh-esp-2);
  min-height: var(--yh-boton-alto-hoja);
  min-width: var(--yh-toque-min);
  margin: 0;
  padding: 0 var(--yh-esp-5);
  border: 1px solid transparent;
  border-radius: var(--yh-radio-control);
  background: transparent;
  color: var(--yh-texto);
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition:
    transform var(--yh-t-toque) var(--yh-curva-llegada),
    background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-confirmacion-boton--secundario { border-color: var(--yh-boton-borde); background: var(--yh-boton-fondo); }
/* El verbo que suelta a Yahu: el principal blanco con su punto vivo, y toma el resto del ancho */
.yh .yh-confirmacion-boton--senal {
  flex: 1 1 auto;
  background: var(--yh-texto);
  color: var(--yh-texto-inv);
}
.yh .yh-confirmacion-boton--senal::before {
  content: "";
  width: 7px;
  height: 7px;
  flex: none;
  border-radius: 50%;
  background: var(--yh-naranja);
  animation: yh-confirmacion-late 1.6s var(--yh-curva-pulso) infinite;
}
@keyframes yh-confirmacion-late {
  0% { box-shadow: 0 0 0 0 var(--yh-halo); }
  70%, 100% { box-shadow: 0 0 0 7px rgba(255, 106, 31, 0); }
}
.yh .yh-confirmacion-boton:active { transform: scale(.97); }
.yh .yh-confirmacion-boton--secundario:active { background: var(--yh-sup-3); }
@media (hover: hover) {
  .yh .yh-confirmacion-boton--secundario:hover { border-color: rgba(250, 250, 249, 0.24); background: var(--yh-sup-2); }
  .yh .yh-confirmacion-boton--senal:hover { background: #ded4c1; }
}

/* La barra que se vacía en 5 s. Dos capas con la misma geometría: la de abajo en
   texto sobre la superficie y la de arriba, recortada a lo que queda, en tinta sobre
   naranja; así ningún tramo del texto pierde contraste. */
.yh .yh-confirmacion-cuenta {
  --yh-confirmacion-resto: 1;
  position: relative;
  flex: 1 1 auto;
  min-width: 0;
  height: var(--yh-boton-alto-hoja);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  box-shadow: inset 0 0 0 1px var(--yh-boton-borde);
}
.yh .yh-confirmacion-cuenta-capa {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--yh-esp-1);
  padding: 0 var(--yh-esp-1) 0 var(--yh-esp-4);
  border-radius: inherit;
  color: var(--yh-texto);
  white-space: nowrap;
}
.yh .yh-confirmacion-cuenta-capa--relleno {
  background: var(--yh-naranja);
  color: var(--yh-sobre-naranja);
  pointer-events: none;
  clip-path: inset(0 calc((1 - var(--yh-confirmacion-resto)) * 100%) 0 0 round var(--yh-radio-control));
  transition: clip-path 1s linear;
}
.yh .yh-confirmacion-deshacer {
  display: inline-flex;
  align-items: center;
  height: var(--yh-toque-min);
  margin: 0;
  padding: 0 var(--yh-esp-3);
  border: 0;
  border-radius: var(--yh-radio-control);
  background: none;
  color: inherit;
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
/* El anillo de foco de «Deshacer» se dibuja también en la capa naranja */
.yh .yh-confirmacion-cuenta:has(.yh-confirmacion-deshacer:focus-visible) .yh-confirmacion-cuenta-capa--relleno .yh-confirmacion-deshacer {
  outline: 2px solid var(--yh-foco);
  outline-offset: 2px;
}

/* Bitácora al resolverse: «› aprobado por ti · 8:54» con la palomita en SVG */
.yh .yh-confirmacion-bitacoras { display: grid; gap: var(--yh-esp-1); }
.yh .yh-confirmacion-bitacora {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  margin: 0;
  color: var(--yh-texto-2);
}
.yh .yh-confirmacion-bitacora > span:last-child { text-wrap: pretty; }
.yh .yh-confirmacion-palomita { color: var(--yh-positivo); }
.yh .yh-confirmacion-bitacora .yh-confirmacion-icono:not(.yh-confirmacion-palomita) { color: var(--yh-texto-3); }

/* Rechazar pregunta por qué */
.yh .yh-confirmacion-motivos { display: grid; gap: var(--yh-esp-3); margin: 0; }
.yh .yh-confirmacion-pregunta { margin: 0; font-weight: 600; }
.yh .yh-confirmacion-opciones { display: grid; gap: var(--yh-esp-2); }
.yh .yh-confirmacion-opciones .yh-confirmacion-boton { min-height: var(--yh-boton-alto); padding: 0 var(--yh-esp-4); }
@container yh-confirmacion (min-width: 420px) {
  .yh .yh-confirmacion-opciones { grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); }
}
.yh .yh-confirmacion-ayuda { margin: 0; color: var(--yh-texto-2); text-wrap: pretty; }
.yh .yh-confirmacion-fantasma {
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
  min-height: var(--yh-toque-min);
  margin: 0 0 0 calc(var(--yh-esp-3) * -1);
  padding: 0 var(--yh-esp-3);
  border: 0;
  border-radius: var(--yh-radio-control);
  background: none;
  color: var(--yh-texto);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-confirmacion-fantasma:active { background: var(--yh-sup-3); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-confirmacion-fantasma:hover { background: var(--yh-sup-3); }
}

/* Todo nace de su origen: el pie nuevo crece desde el botón que lo cambió */
.yh .yh-confirmacion-entra {
  transform-origin: 50% 100%;
  animation: yh-confirmacion-entra var(--yh-t-base) var(--yh-curva-llegada) both;
}
@keyframes yh-confirmacion-entra { from { opacity: 0; transform: scale(.985); } }
@keyframes yh-confirmacion-funde { from { opacity: 0; } }

.yh .yh-confirmacion-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ——— La hoja: <dialog> en celular, radio 28, agarradera de 36 × 5 y velo ——— */
.yh .yh-confirmacion--hoja {
  --yh-confirmacion-radio: var(--yh-radio-hoja);
  position: relative;
  inset: auto;
  display: flex;
  flex-direction: column;
  width: auto;
  height: auto;
  max-width: none;
  max-height: var(--yh-confirmacion-tope, 92dvh);
  margin: 0;
  padding: 0;
  border-bottom-width: 0;
  border-radius: var(--yh-radio-hoja) var(--yh-radio-hoja) 0 0;
  background: var(--yh-sup-2);
  box-shadow: var(--yh-sombra-flotante);
  transition: transform var(--yh-t-hoja) var(--yh-confirmacion-curva-hoja, var(--yh-curva-hoja));
}
.yh-confirmacion--hoja { border-color: var(--yh-filete-fuerte); }
/* El display de arriba le gana al del navegador: un <dialog> cerrado se oculta aquí */
.yh .yh-confirmacion--hoja:not([open]) { display: none; }
.yh .yh-confirmacion-agarradera {
  flex: none;
  width: 36px;
  height: 5px;
  margin: 6px auto 0;
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-filete-fuerte);
}
.yh .yh-confirmacion-hoja-cuerpo {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: var(--yh-esp-1) var(--yh-confirmacion-relleno) 0;
}
.yh .yh-confirmacion--hoja .yh-confirmacion-cabecera { margin-top: var(--yh-esp-2); }
/* El título comparte fila con «Cerrar»: la cabecera en mono conserva todo el ancho */
.yh .yh-confirmacion-hoja-titulo {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--yh-esp-2);
  margin-top: var(--yh-esp-2);
}
.yh .yh-confirmacion-hoja-titulo .yh-confirmacion-titulo { margin: 0; }
.yh .yh-confirmacion-cerrar {
  flex: none;
  display: inline-grid;
  place-items: center;
  width: var(--yh-toque-min);
  height: var(--yh-toque-min);
  /* Centrado en la primera línea del título y con el ícono al ras del contenido */
  margin: calc((26px - var(--yh-toque-min)) / 2) calc(var(--yh-esp-3) * -1) 0 0;
  padding: 0;
  border: 0;
  border-radius: var(--yh-radio-control);
  background: none;
  color: var(--yh-texto-2);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.yh .yh-confirmacion-cerrar:active { background: var(--yh-sup-3); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-confirmacion-cerrar:hover { background: var(--yh-sup-3); }
}
/* Las acciones quedan fijas abajo, respetando el área segura */
.yh .yh-confirmacion--hoja .yh-confirmacion-pie {
  flex: none;
  margin: 0;
  padding: var(--yh-esp-4) var(--yh-confirmacion-relleno) max(var(--yh-esp-4), env(safe-area-inset-bottom));
}

/* Yahu · Traza. Extraído del design system Horizonte; la guía está en el artifact
   (components/Traza/README.md). Necesita tokens.css y base.css. */

/* ——— Traza ———
   Una corrida de Yahu (un «run») leída como un log: cabecera con el id y el
   reloj, una fila por paso con su número de línea, la herramienta en código,
   el detalle en Geist y la latencia a la derecha. Vive en `yh-hundido`. */
.yh-traza {
  display: grid;
  margin: 0;
  border: 1px solid var(--yh-filete);
  border-radius: var(--yh-radio-ficha);
  background: var(--yh-hundido);
  overflow: hidden;
}
.yh-traza-cabeza {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--yh-esp-2) var(--yh-esp-4);
  padding: var(--yh-esp-3) var(--yh-esp-4);
  border-bottom: 1px solid var(--yh-filete);
}
.yh-traza-cabeza > * { margin: 0; }
.yh-traza-id { color: var(--yh-texto); }
.yh-traza-id span:not([data-yh-descifra]) { color: var(--yh-texto-3); }
.yh-traza-metricas { display: flex; gap: var(--yh-esp-4); color: var(--yh-texto-3); }
.yh-traza-metricas b { font-weight: 500; color: var(--yh-texto); }

.yh-traza-pasos { list-style: none; margin: 0; padding: var(--yh-esp-2) 0; counter-reset: paso; }
.yh-traza-paso {
  counter-increment: paso;
  display: grid;
  grid-template-columns: 28px 8px minmax(0, 1fr) auto;
  column-gap: var(--yh-esp-3);
  align-items: baseline;
  padding: 6px var(--yh-esp-4) 6px var(--yh-esp-2);
}
/* El número de línea, como en un editor. */
.yh-traza-paso::before {
  content: counter(paso, decimal-leading-zero);
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--yh-texto-off);
  text-align: end;
}
.yh-traza-punto {
  width: 7px;
  height: 7px;
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-positivo);
  align-self: center;
}
.yh-traza-cuerpo { display: grid; gap: 2px; min-width: 0; }
.yh-traza-cuerpo > * { margin: 0; }
.yh-traza-herramienta { color: var(--yh-texto); }
.yh-traza-herramienta span { color: var(--yh-texto-3); }
.yh-traza-detalle { color: var(--yh-texto-2); overflow-wrap: anywhere; }
.yh-traza-ms { color: var(--yh-texto-3); white-space: nowrap; }

/* La compuerta: el paso que espera tu ok. Lo único naranja de la traza. */
.yh-traza-paso--compuerta { background: var(--yh-senal-suave); }
.yh-traza-paso--compuerta .yh-traza-punto {
  background: var(--yh-senal-grafico);
  box-shadow: var(--yh-brillo-senal);
  animation: yh-traza-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
.yh-traza-paso--compuerta .yh-traza-herramienta,
.yh-traza-paso--compuerta .yh-traza-ms { color: var(--yh-senal-texto); text-shadow: 0 0 10px var(--yh-fosforo); }
@keyframes yh-traza-respira { to { opacity: 0.35; } }
/* Lo que todavía no corre: punteado y en el piso del texto. */
.yh-traza-paso--pendiente .yh-traza-punto { background: transparent; box-shadow: inset 0 0 0 1px var(--yh-texto-3); }
.yh-traza-paso--pendiente .yh-traza-herramienta { color: var(--yh-texto-3); }
.yh-traza-paso--fallo .yh-traza-punto { background: var(--yh-critico); }
.yh-traza-paso--fallo .yh-traza-ms { color: var(--yh-critico); }

/* El pie: el prompt de Yahu, como una terminal. */
.yh-traza-pie {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  padding: var(--yh-esp-3) var(--yh-esp-4);
  border-top: 1px solid var(--yh-filete);
  color: var(--yh-texto-2);
}
.yh-traza-pie > * { margin: 0; }
.yh-traza-prompt { color: var(--yh-senal-texto); }
.yh-traza-teclas { margin-inline-start: auto; display: flex; gap: var(--yh-esp-1); align-items: center; color: var(--yh-texto-3); }

/* Yahu · Consola. Extraído del design system Horizonte; la guía está en el artifact
   (components/Consola/README.md). Necesita tokens.css y base.css. */

/* ——— Consola ———
   Un panel de control de misión sobre yh-hundido con retícula, pantalla CRT y
   esquinas de visor. El radar da una vuelta cada 4 s; cada cuenta se enciende
   cuando el barrido pasa por su ángulo. */
.yh-consola {
  --yh-consola-vuelta: 4s;
  display: grid;
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-ficha);
  background-color: var(--yh-hundido);
  overflow: hidden;
}
.yh-consola-cabeza {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--yh-esp-2) var(--yh-esp-4);
  padding: var(--yh-esp-3) var(--yh-esp-4);
}
.yh-consola-cabeza > * { margin: 0; }
.yh-consola-titulo { display: flex; align-items: center; gap: var(--yh-esp-3); margin-right: auto; color: var(--yh-texto); }
.yh-consola-titulo .yh-franjas--vertical { height: 16px; }
.yh-consola-sub { color: var(--yh-texto-3); }
.yh-consola-vivo { display: inline-flex; align-items: center; gap: var(--yh-esp-2); color: var(--yh-positivo); }
.yh-consola-vivo i { width: 7px; height: 7px; border-radius: 50%; background: currentColor; box-shadow: 0 0 8px rgba(16, 236, 144, 0.7); animation: yh-consola-respira 1.6s var(--yh-curva-pulso) infinite alternate; }
@keyframes yh-consola-respira { to { opacity: 0.35; } }
.yh-consola-reloj { color: var(--yh-texto); font-weight: 700; }

.yh-consola-cuerpo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--yh-esp-5);
  padding: var(--yh-esp-5) var(--yh-esp-4);
  border-top: 1px solid var(--yh-filete);
  border-bottom: 1px solid var(--yh-filete);
}
@media (min-width: 640px) {
  .yh-consola-cuerpo { grid-template-columns: 240px minmax(0, 1fr); align-items: center; }
}

/* El radar */
.yh-radar {
  position: relative;
  width: 240px;
  max-width: 100%;
  aspect-ratio: 1;
  justify-self: center;
  border-radius: 50%;
  background:
    repeating-radial-gradient(circle, transparent 0 39px, rgba(242, 234, 217, 0.12) 39px 40px),
    linear-gradient(transparent calc(50% - 0.5px), rgba(242, 234, 217, 0.12) calc(50% - 0.5px) calc(50% + 0.5px), transparent calc(50% + 0.5px)),
    linear-gradient(90deg, transparent calc(50% - 0.5px), rgba(242, 234, 217, 0.12) calc(50% - 0.5px) calc(50% + 0.5px), transparent calc(50% + 0.5px)),
    radial-gradient(circle, #14110e 0%, var(--yh-cielo-base) 70%);
  box-shadow: inset 0 0 0 1px var(--yh-filete-fuerte), 0 0 40px rgba(255, 106, 31, 0.08);
}
.yh-radar-barrido {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: conic-gradient(from 0deg, rgba(255, 106, 31, 0) 0deg 290deg, rgba(255, 106, 31, 0.05) 300deg, rgba(255, 106, 31, 0.42) 359deg, rgba(255, 106, 31, 0.9) 360deg);
  animation: yh-radar-gira var(--yh-consola-vuelta) linear infinite;
}
@keyframes yh-radar-gira { to { transform: rotate(360deg); } }
/* Una cuenta: un punto a su ángulo (--a, desde arriba y en el sentido del reloj) y distancia (--r). */
.yh-radar-cuenta {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 0;
  height: 0;
  transform: rotate(var(--a)) translateY(calc(var(--r) * -1));
}
.yh-radar-punto {
  position: absolute;
  left: -4px;
  top: -4px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--yh-texto);
  opacity: 0.35;
  animation: yh-radar-eco var(--yh-consola-vuelta) linear infinite;
  animation-delay: var(--t);   /* ángulo ÷ 360 × la vuelta: se enciende cuando pasa el barrido */
}
.yh-radar-cuenta--pide .yh-radar-punto { background: var(--yh-naranja); }
@keyframes yh-radar-eco {
  0% { opacity: 1; box-shadow: 0 0 0 0 rgba(242, 234, 217, 0.6), 0 0 12px rgba(255, 106, 31, 0.9); transform: scale(1.4); }
  40% { box-shadow: 0 0 0 10px rgba(242, 234, 217, 0), 0 0 0 rgba(255, 106, 31, 0); transform: scale(1); }
  100% { opacity: 0.35; box-shadow: none; transform: scale(1); }
}
.yh-radar-nombre {
  position: absolute;
  left: 8px;
  top: -6px;
  transform: rotate(calc(var(--a) * -1));
  transform-origin: -8px 6px;
  color: var(--yh-texto-2);
  font-size: 10px;
  white-space: nowrap;
}
.yh-radar-centro {
  position: absolute;
  left: 50%;
  top: 50%;
  width: 22px;
  height: 22px;
  translate: -50% -50%;
}

/* La telemetría */
.yh-telemetria { display: grid; gap: var(--yh-esp-4); min-width: 0; }
.yh-telemetria-datos {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(112px, 1fr));
  gap: 1px;
  margin: 0;
  border: 1px solid var(--yh-filete);
  background: var(--yh-filete);
}
.yh-telemetria-datos > div { display: grid; gap: 2px; padding: var(--yh-esp-3); background: var(--yh-hundido); }
.yh-telemetria-datos dt { color: var(--yh-texto-3); }
.yh-telemetria-datos dd { margin: 0; font-family: var(--font-mono); font-weight: 700; font-size: 26px; line-height: 30px; letter-spacing: -0.02em; color: var(--yh-texto); }
.yh-telemetria-datos .yh-telemetria-pide dd { color: var(--yh-senal-texto); }
/* Actividad por hora: 24 barras que crecen al montar. */
.yh-actividad { display: grid; gap: var(--yh-esp-2); margin: 0; }
.yh-actividad figcaption { display: flex; justify-content: space-between; color: var(--yh-texto-3); }
.yh-actividad-barras { display: grid; grid-template-columns: repeat(24, 1fr); align-items: end; gap: 3px; height: 56px; }
.yh-actividad-barras span {
  height: calc(var(--v) * 1%);
  min-height: 2px;
  background: var(--yh-texto-3);
  transform-origin: bottom;
  animation: yh-actividad 700ms var(--yh-curva-llegada) backwards;
  animation-delay: calc(var(--h) * 25ms + 200ms);
}
.yh-actividad-barras span.yh-actividad-ahora { background: var(--yh-senal-grafico); box-shadow: 0 0 10px var(--yh-fosforo); }
.yh-actividad-barras span.yh-actividad-futuro { background: var(--yh-filete-fuerte); }
@keyframes yh-actividad { from { transform: scaleY(0); } }

/* La cinta */
.yh-consola-cinta { padding: var(--yh-esp-3) 0; color: var(--yh-texto-2); }
.yh-consola-cinta b { font-weight: 400; color: var(--yh-texto); }
.yh-consola-cinta em { font-style: normal; color: var(--yh-senal-texto); }

@media (prefers-reduced-motion: reduce) {
  .yh-radar-barrido { animation: none; transform: rotate(120deg); }
  .yh-radar-punto { animation: none; opacity: 0.8; }
}

/* Yahu · Llamada. Extraído del design system Horizonte; la guía está en el artifact
   (components/Llamada/README.md). Necesita tokens.css y base.css. */
/* entradas: --yh-llamada-luz, --yh-llamada-lx, --yh-llamada-ly — las pone el script de la órbita de la ventanilla: cuánta luz y desde dónde. */

/* ——— Llamada ———
   La ventanilla lleva el cielo; la cápsula flota con la sombra de lo que flota. */
.yh-llamada { --yh-llamada-sombra-pagina: var(--yh-sombra-flotante); }

/* La ventanilla: cielo, radio 28 y padding 20. */
.yh-llamada-ventanilla {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  container-type: inline-size;
  display: grid;
  gap: var(--yh-esp-5);
  margin: 0;
  padding: var(--yh-esp-5);
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-hoja);
  color: var(--yh-texto);
}
.yh-llamada-ventanilla > * { min-width: 0; margin: 0; }
/* Textura: sólo existe en el cielo. Grano al 4 % (feTurbulence .85, 2 octavas, mosaico de 128 px)… */
.yh-llamada-ventanilla::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: .04;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23g)'/%3E%3C/svg%3E");
}
/* …y de 40 a 60 estrellas fijas de 0.6, 0.9 y 1.4 px, dispersas (las pone el script). */
.yh-llamada-estrellas {
  position: absolute;
  inset: 0;
  z-index: -1;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
.yh-llamada-estrellas circle { fill: var(--yh-estrella); }
.yh-llamada-estrella--22 { opacity: .22; }
.yh-llamada-estrella--40 { opacity: .4; }
.yh-llamada-estrella--75 { opacity: .75; }

/* Arriba: la píldora «en llamada · 02:41» con el punto que respira, y el número. */
.yh-llamada-cabeza {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--yh-esp-2) var(--yh-esp-3);
}
.yh-llamada-cabeza > p { margin: 0; }
.yh-llamada-pildora {
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
  height: 32px;
  padding: 0 var(--yh-esp-3);
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-sup-2);
  box-shadow: var(--yh-sombra-flotante);
  color: var(--yh-texto);
  white-space: nowrap;
}
.yh-llamada-numero { color: var(--yh-texto-2); white-space: nowrap; }
.yh-llamada-punto {
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--yh-senal-grafico);
  box-shadow: var(--yh-brillo-senal);
  animation: yh-llamada-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-llamada-respira {
  from { opacity: 1; }
  to { opacity: .35; }
}

/* La órbita en contacto: la misma geometría que el componente Órbita
   (elipse 0.6 girada −23.44°, tú en el foco, Yahu tocando tu borde por el
   lado del perigeo). Las medidas en px salen de su fórmula para 64 y 120. */
.yh-llamada-orbita { position: relative; flex: none; width: 64px; height: 64px; }
.yh-llamada-orbita--120 { width: 120px; height: 120px; justify-self: center; }
.yh-llamada-orbita-traza { position: absolute; inset: 0; overflow: visible; }
.yh-llamada-orbita-traza ellipse {
  fill: none;
  stroke: var(--yh-orbita);
  stroke-width: 1;
  vector-effect: non-scaling-stroke;
}
.yh-llamada-cuerpo,
.yh-llamada-onda,
.yh-llamada-satelite { position: absolute; border-radius: 50%; }
.yh-llamada-cuerpo,
.yh-llamada-onda { left: 11.906px; top: 35.556px; width: 7.192px; height: 7.192px; }
.yh-llamada-satelite { left: 7.606px; top: 39.139px; width: 4.795px; height: 4.795px; }
.yh-llamada-orbita--120 .yh-llamada-cuerpo,
.yh-llamada-orbita--120 .yh-llamada-onda { left: 22.046px; top: 66.718px; width: 13.586px; height: 13.586px; }
.yh-llamada-orbita--120 .yh-llamada-satelite { left: 13.923px; top: 73.486px; width: 9.057px; height: 9.057px; }
/* Tú: el cuerpo, un disco en texto-3 como en Órbita. En contacto su borde queda
   encendido (un anillo de 1 px por fuera y la luz) y la cara que mira a Yahu, iluminada. */
.yh-llamada-cuerpo {
  overflow: hidden;
  background: var(--yh-texto-3);
  box-shadow: 0 0 0 1px var(--yh-senal-grafico), var(--yh-brillo-senal);
  transition: box-shadow 280ms var(--yh-curva-llegada);
}
.yh-llamada-luz {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  opacity: var(--yh-llamada-luz, .9);
  background: radial-gradient(circle var(--yh-llamada-alcance, 7.2px) at var(--yh-llamada-lx, 4.1%) var(--yh-llamada-ly, 69.9%), var(--yh-senal-grafico), transparent);
}
.yh-llamada-orbita--120 { --yh-llamada-alcance: 13.6px; }
/* Yahu: el satélite, vivo. */
.yh-llamada-satelite { background: var(--yh-senal-grafico); box-shadow: var(--yh-brillo-senal); }
/* Mientras cae (el momento Contacto) el borde sigue frío. */
.yh-llamada-ventanilla[data-fase="cayendo"] .yh-llamada-cuerpo { box-shadow: none; }
/* Mientras suena: una onda por timbre (escala 1 → 2.2, opacidad .5 → 0, en 900 ms). */
.yh-llamada-onda {
  opacity: 0;
  pointer-events: none;
  border: 1px solid var(--yh-senal-grafico);
}
.yh-llamada-sonando[data-fase="contacto"] .yh-llamada-onda {
  animation: yh-llamada-onda 2400ms var(--yh-curva-llegada) infinite;
}
@keyframes yh-llamada-onda {
  0% { opacity: .5; transform: scale(1); }
  37.5%, 100% { opacity: 0; transform: scale(2.2); }
}

/* La misión: el título, los parámetros y las fases. */
.yh-llamada-titulo { color: var(--yh-texto); }
.yh-llamada-parametros {
  list-style: none;
  padding: 0;
  display: grid;
  gap: var(--yh-esp-1);
  color: var(--yh-texto-2);
}
.yh-llamada-junto { white-space: nowrap; }
.yh-llamada-fases {
  list-style: none;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--yh-esp-1);
}
.yh-llamada-fases li { display: grid; gap: var(--yh-esp-2); color: var(--yh-texto-3); }
.yh-llamada-tramo { height: 3px; border-radius: var(--yh-radio-pildora); background: var(--yh-filete-fuerte); }
.yh-llamada-fases .yh-llamada-fase--hecha { color: var(--yh-texto-2); }
.yh-llamada-fase--hecha .yh-llamada-tramo { background: var(--yh-texto); }
.yh-llamada-fases .yh-llamada-fase--actual { color: var(--yh-texto); }
.yh-llamada-fase--actual .yh-llamada-tramo { background: var(--yh-senal-grafico); }

/* El osciloscopio: la voz de quien habla, en fósforo naranja (Yahu) o marfil (la otra persona). */
.yh-llamada-osc {
  position: relative;
  height: 56px;
  border: 1px solid var(--yh-filete);
  border-radius: var(--yh-radio-chip);
  background-color: rgba(10, 9, 8, 0.6);
  background-size: 12px 12px;
  --yh-esquina: rgba(242, 234, 217, 0.4);
}
.yh-llamada-osc canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
.yh-llamada-osc-quien { position: absolute; right: 8px; top: 4px; color: var(--yh-texto-3); }

/* Las últimas líneas de la transcripción. */
.yh-llamada-transcripcion {
  list-style: none;
  padding: var(--yh-esp-4) 0 0;
  border-top: 1px solid var(--yh-filete);
  display: grid;
  gap: var(--yh-esp-3);
}
.yh-llamada-transcripcion p { margin: 0; }
.yh-llamada-transcripcion .mono-s { color: var(--yh-texto-3); }
.yh-llamada-transcripcion .cuerpo { color: var(--yh-texto); }

/* Botones: los mismos que el componente Botón (secundario y peligro), 44 px. */
.yh-llamada-acciones { display: flex; gap: var(--yh-esp-3); }
.yh .yh-llamada-boton {
  flex: 1 1 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--yh-esp-2);
  min-width: 0;
  min-height: var(--yh-boton-alto);
  margin: 0;
  padding: 0 var(--yh-esp-5);
  border: 1px solid var(--yh-boton-borde);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  color: var(--yh-texto);
  white-space: nowrap;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition: transform var(--yh-t-toque) var(--yh-curva-llegada), background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-llamada-boton--peligro { border-color: var(--yh-critico); color: var(--yh-critico); }
.yh .yh-llamada-boton:active { transform: scale(.97); background: var(--yh-sup-3); }
.yh .yh-llamada-boton--peligro:active { background: var(--yh-critico-suave); }
@media (hover: hover) {
  .yh .yh-llamada-boton:hover { border-color: rgba(250, 250, 249, 0.24); background: var(--yh-sup-2); }
}
.yh-llamada-icono {
  flex: none;
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Cuando Yahu te llama a ti: órbita de 120 px y display-1. */
.yh-llamada-ventanilla--entrante { justify-items: center; text-align: center; }
.yh-llamada-entrante-textos { display: grid; gap: var(--yh-esp-2); justify-items: center; width: 100%; }
.yh-llamada-entrante-textos > * { margin: 0; max-width: 100%; }
.yh-llamada-entrante-titulo { color: var(--yh-texto); }
.yh-llamada-motivo { color: var(--yh-texto-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.yh-llamada-entrante-accion { display: grid; gap: var(--yh-esp-3); justify-items: center; width: 100%; }
.yh-llamada-entrante-accion > * { margin: 0; }
.yh-llamada-entrante-accion .yh-llamada-boton { width: 100%; }
.yh-llamada-nota { display: inline-flex; align-items: center; gap: var(--yh-esp-2); color: var(--yh-texto-3); }
.yh-llamada-nota .yh-llamada-icono { width: 16px; height: 16px; stroke-width: 1.75; }
/* Desde 400 px de ventanilla (escritorio): titulo a 24/28 y display-1 a 56/54, los dos al 125 %. */
@container (min-width: 400px) {
  .yh .yh-llamada-titulo { font-size: 24px; line-height: 28px; }
  .yh .yh-llamada-entrante-titulo { font-size: 56px; line-height: 54px; }
}

/* Con la web abierta: el aviso naranja a todo el ancho, con texto en tinta. */
.yh .yh-llamada-aviso {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-3);
  width: auto;
  min-height: var(--yh-toque-min);
  margin: 0 calc(-1 * var(--yh-esp-5));
  padding: var(--yh-esp-3) var(--yh-esp-5);
  border: 0;
  border-radius: 0;
  background: var(--yh-naranja);
  color: var(--yh-sobre-naranja);
  text-align: start;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.yh .yh-llamada-aviso:focus-visible { outline-color: var(--yh-sobre-naranja); outline-offset: -4px; }
.yh-llamada-aviso .yh-llamada-icono { width: 24px; height: 24px; stroke-width: 1.75; }
.yh-llamada-aviso-texto {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: var(--yh-esp-2);
}

/* Fuera de la vista: la cápsula fija de 44 px. */
.yh .yh-llamada-capsula {
  justify-self: start;
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
  height: var(--yh-toque-min);
  margin: 0;
  padding: 0 var(--yh-esp-4);
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-control);
  background: var(--yh-sup-2);
  box-shadow: var(--yh-llamada-sombra-pagina);
  color: var(--yh-texto);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: transform var(--yh-t-toque) var(--yh-curva-llegada);
}
.yh .yh-llamada-capsula:active { transform: scale(.97); }
/* Su anillo de foco va hacia adentro, como el del aviso, para verse sobre lo que tenga abajo. */
.yh .yh-llamada-capsula:focus-visible { outline-offset: -4px; }

/* Lo vivo se pausa cuando no se ve; con movimiento reducido no hay ondas ni respiración. */
.yh-llamada-ventanilla.yh-llamada-fuera .yh-llamada-onda,
.yh-llamada-fuera .yh-llamada-punto,
.yh-llamada-capsula.yh-llamada-fuera .yh-llamada-punto { animation-play-state: paused; }
@media (prefers-reduced-motion: reduce) {
  .yh-llamada-onda { display: none; }
  .yh-llamada-punto { animation: none; }
  .yh .yh-llamada-boton:active,
  .yh .yh-llamada-capsula:active { transform: none; opacity: .88; }
}

/* Yahu · Hoy. Extraído del design system Horizonte; la guía está en el artifact
   (components/Hoy/README.md). Necesita tokens.css y base.css. */
/* entradas: --yh-hoy-h, --yh-hoy-ini, --yh-hoy-fin — las pone el marcado: la hora de cada marca y el inicio y fin de cada evento, en horas. */

/* ——— Hoy ———
   Lo vivo es la línea «ahora» con el satélite; lo demás está quieto. */

/* La regla del día: 24 marcas de 1 px, una por hora; las largas cada 6 h. */
.yh-hoy-regla { margin: 0; display: grid; gap: var(--yh-esp-1); }
.yh-hoy-regla-ahora,
.yh-hoy-regla-pista,
.yh-hoy-regla-horas { position: relative; }
.yh-hoy-regla-ahora { height: 16px; }
.yh-hoy-regla-ahora span {
  position: absolute;
  top: 0;
  left: calc(var(--yh-hoy-h) / 24 * 100%);
  translate: -50% 0;
  color: var(--yh-texto-2);
  white-space: nowrap;
}
.yh-hoy-regla-pista { height: 24px; border-bottom: 1px solid var(--yh-filete-fuerte); }
.yh-hoy-marca {
  position: absolute;
  bottom: 0;
  left: calc(var(--yh-hoy-h) / 24 * 100%);
  width: 1px;
  height: 6px;
  background: var(--yh-filete-fuerte);
}
.yh-hoy-marca--larga { height: 12px; background: var(--yh-texto-3); }
/* Los eventos: tramos de 3 px sobre la línea base. */
.yh-hoy-tramo {
  position: absolute;
  bottom: -2px;
  left: calc(var(--yh-hoy-ini) / 24 * 100%);
  width: calc((var(--yh-hoy-fin) - var(--yh-hoy-ini)) / 24 * 100%);
  height: 3px;
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-texto-2);
}
.yh-hoy-tramo--pasado { background: var(--yh-texto-3); }
.yh-hoy-tramo--pronto { background: var(--yh-texto); }
/* «ahora 16:15»: una línea de 1 px en señal-gráfico, con el satélite arriba. */
.yh-hoy-ahora {
  position: absolute;
  top: 0;
  bottom: -2px;
  left: calc(var(--yh-hoy-h) / 24 * 100%);
  width: 1px;
  background: var(--yh-senal-grafico);
}
.yh-hoy-satelite {
  position: absolute;
  top: 0;
  left: 50%;
  width: 7px;
  height: 7px;
  translate: -50% -50%;
  border-radius: 50%;
  background: var(--yh-senal-grafico);
  box-shadow: var(--yh-brillo-senal);
}
.yh-hoy-regla-horas { height: 16px; color: var(--yh-texto-3); }
.yh-hoy-regla-horas span { position: absolute; top: 0; left: calc(var(--yh-hoy-h) / 24 * 100%); translate: -50% 0; }
.yh-hoy-regla-horas span:first-child { translate: 0 0; }

/* La fila: columna de 56 px con las horas, el riel con su nodo de 7 px y la ficha. */
.yh-hoy-filas { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--yh-esp-3); }
.yh-hoy-fila {
  --yh-hoy-nodo-y: calc(var(--yh-esp-3) + 11px);   /* centro de la primera línea de la ficha */
  display: grid;
  grid-template-columns: var(--yh-esp-14) 7px minmax(0, 1fr);
  column-gap: var(--yh-esp-3);
  align-items: start;
}
.yh-hoy-horas {
  margin: 0;
  padding-top: var(--yh-esp-3);
  display: grid;
  justify-items: start;
  color: var(--yh-texto-3);
}
.yh-hoy-horas > :first-child { color: var(--yh-texto); }
.yh-hoy-riel { position: relative; align-self: stretch; }
.yh-hoy-riel::before {
  content: "";
  position: absolute;
  left: 3px;
  width: 1px;
  top: 0;
  bottom: calc(-1 * var(--yh-esp-3));
  background: var(--yh-filete-fuerte);
}
.yh-hoy-fila:first-child .yh-hoy-riel::before { top: var(--yh-hoy-nodo-y); }
.yh-hoy-fila:last-child .yh-hoy-riel::before { bottom: auto; height: var(--yh-hoy-nodo-y); }
.yh-hoy-fila:only-child .yh-hoy-riel::before { display: none; }
.yh-hoy-nodo {
  position: absolute;
  top: var(--yh-hoy-nodo-y);
  left: 0;
  width: 7px;
  height: 7px;
  translate: 0 -50%;
  border: 1px solid var(--yh-texto-2);
  border-radius: 50%;
  background: var(--yh-fondo);
}
/* La ficha: sup-1, radio de ficha y filete. */
.yh-hoy-ficha {
  min-width: 0;
  display: grid;
  gap: var(--yh-esp-1);
  padding: var(--yh-esp-3) var(--yh-esp-4);
  border: 1px solid transparent;
  border-radius: var(--yh-radio-ficha);
  background: var(--yh-sup-1);
}
.yh-hoy-ficha { border-color: var(--yh-filete); }
.yh-hoy-ficha > * { margin: 0; }
.yh-hoy-ficha-cabeza {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--yh-esp-1) var(--yh-esp-2);
}
.yh-hoy-ficha-cabeza > * { margin: 0; }
.yh-hoy-titulo { color: var(--yh-texto); text-wrap: balance; }
.yh-hoy-meta { color: var(--yh-texto-2); }
.yh-hoy-nota { margin-top: var(--yh-esp-1); color: var(--yh-texto-3); }
/* Falta menos de una hora: el chip «en 45 min» en señal-suave es lo único naranja
   de la fila; el nodo va lleno en texto, como su tramo en la regla. */
.yh-hoy-chip {
  display: inline-flex;
  align-items: center;
  padding: var(--yh-esp-1) var(--yh-esp-2);
  border-radius: var(--yh-radio-chip);
  background: var(--yh-senal-suave);
  color: var(--yh-senal-texto);
  white-space: nowrap;
}
.yh-hoy-fila--pronto .yh-hoy-nodo { border-color: var(--yh-texto); background: var(--yh-texto); }
/* Ya pasó: horas, título y nodo en el piso del texto. */
.yh-hoy-fila--pasada .yh-hoy-horas > :first-child { color: var(--yh-texto-3); }
.yh-hoy-fila--pasada .yh-hoy-titulo { color: var(--yh-texto-2); }
.yh-hoy-fila--pasada .yh-hoy-nodo { border-color: var(--yh-texto-3); background: var(--yh-texto-3); }

/* «Lo que vi»: la misma fila, con la decisión de Yahu en mono. */
.yh-hoy-decision {
  margin-top: var(--yh-esp-1);
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  color: var(--yh-texto-2);
}
.yh-hoy-icono {
  flex: none;
  width: 16px;
  height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-hoy-fila--ignorado .yh-hoy-decision { color: var(--yh-texto-3); }
.yh-hoy-fila--ignorado .yh-hoy-nodo { border-color: var(--yh-texto-3); }
.yh-hoy-fila--avisado .yh-hoy-nodo { background: var(--yh-texto-2); }
.yh-hoy-fila--llamado .yh-hoy-decision { color: var(--yh-texto); }
.yh-hoy-fila--llamado .yh-hoy-nodo { border-color: var(--yh-texto); background: var(--yh-texto); }

/* Yahu · LoQueSabe. Extraído del design system Horizonte; la guía está en el artifact
   (components/LoQueSabe/README.md). Necesita tokens.css y base.css. */
/* entradas: --yh-loquesabe-luz, --yh-loquesabe-alcance, --yh-loquesabe-lx, --yh-loquesabe-ly — las pone el script de la órbita del estado vacío. */

/* ——— Lo que Yahu sabe de ti ———
   La tipografía la ponen las clases de estilo (display-2, subtitulo, cuerpo,
   boton, mono-s). Los selectores llevan `.yh` delante para ganarles sin
   depender del orden de las hojas. */
.yh .yh-loquesabe {
  --yh-loquesabe-clave: 72px; /* la misma columna de claves que el recibo de Confirmación */
  container: yh-loquesabe / inline-size;
  display: grid;
  align-content: start;
  gap: var(--yh-esp-8);
  min-width: 0;
  margin: 0;
}
.yh .yh-loquesabe-cabeza { display: grid; gap: var(--yh-esp-2); }
.yh .yh-loquesabe-titulo { margin: 0; color: var(--yh-texto); }
@container yh-loquesabe (min-width: 600px) {
  .yh .yh-loquesabe-titulo { font-size: 40px; line-height: 42px; }
}
.yh .yh-loquesabe-intro { margin: 0; max-width: 34em; color: var(--yh-texto-2); text-wrap: pretty; }

.yh .yh-loquesabe-seccion { display: grid; gap: var(--yh-esp-3); min-width: 0; }
.yh .yh-loquesabe-encabezado {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--yh-esp-1) var(--yh-esp-3);
}
.yh .yh-loquesabe-encabezado h3 { margin: 0; color: var(--yh-texto); }
.yh .yh-loquesabe-encabezado h3:focus { outline: none; }
.yh .yh-loquesabe-encabezado h3:focus-visible { outline: 2px solid var(--yh-foco); outline-offset: 2px; }
.yh .yh-loquesabe-encabezado p { margin: 0; color: var(--yh-texto-3); }

/* Una ficha por lista; las filas se separan con un filete */
.yh .yh-loquesabe-lista {
  margin: 0;
  padding: 0;
  list-style: none;
  border: 1px solid transparent;
  border-radius: var(--yh-radio-ficha);
  background: var(--yh-sup-1);
}
/* La ficha sube del fondo con un filete */
.yh-loquesabe-lista { border-color: var(--yh-filete); }
.yh .yh-loquesabe-lista > li {
  min-height: var(--yh-esp-14);
  padding: var(--yh-esp-4);
  transition:
    height var(--yh-t-base) var(--yh-curva-salida),
    padding var(--yh-t-base) var(--yh-curva-salida),
    opacity var(--yh-t-rapido) var(--yh-curva-salida);
}
.yh .yh-loquesabe-lista > li + li { border-top: 1px solid var(--yh-filete); }

/* Regla: su número, la condición como «si · entonces» y de dónde salió */
.yh .yh-loquesabe-numero { margin: 0; color: var(--yh-texto-2); }
.yh .yh-loquesabe-condicion {
  display: grid;
  grid-template-columns: var(--yh-loquesabe-clave) minmax(0, 1fr);
  align-items: baseline;
  gap: var(--yh-esp-1) var(--yh-esp-3);
  margin: var(--yh-esp-2) 0 0;
}
.yh .yh-loquesabe-condicion dt { color: var(--yh-texto-3); }
.yh .yh-loquesabe-condicion dd { min-width: 0; margin: 0; color: var(--yh-texto); overflow-wrap: break-word; text-wrap: pretty; }
.yh .yh-loquesabe-origen { margin: var(--yh-esp-2) 0 0; color: var(--yh-texto-3); }

/* Recuerdo: lo que sabe, su fuente y el botón para borrarlo */
.yh .yh-loquesabe-recuerdo {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: var(--yh-esp-2);
  align-items: start;
}
.yh .yh-loquesabe-recuerdo-texto { margin: 0; color: var(--yh-texto); text-wrap: pretty; }
.yh .yh-loquesabe-recuerdo .yh-loquesabe-origen { margin-top: var(--yh-esp-1); }
.yh .yh-loquesabe-borrar {
  display: inline-grid;
  place-items: center;
  width: var(--yh-toque-min);
  height: var(--yh-toque-min);
  /* El ícono queda centrado en la primera línea y al ras del contenido */
  margin: -10px calc(var(--yh-esp-3) * -1) 0 0;
  padding: 0;
  border: 0;
  border-radius: var(--yh-radio-control);
  background: none;
  color: var(--yh-texto-2);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition:
    background-color var(--yh-t-rapido) var(--yh-curva-llegada),
    color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-loquesabe-borrar:active { background: var(--yh-critico-suave); color: var(--yh-critico); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-loquesabe-borrar:hover { background: var(--yh-critico-suave); color: var(--yh-critico); }
}
.yh .yh-loquesabe-icono {
  width: 20px;
  height: 20px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Borrado: queda la bitácora con 5 s para deshacer y luego la fila se pliega */
.yh .yh-loquesabe-olvido {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  column-gap: var(--yh-esp-2);
  margin: 0;
  color: var(--yh-texto-2);
  animation: yh-loquesabe-funde var(--yh-t-rapido) var(--yh-curva-llegada) both;
}
.yh .yh-loquesabe-deshacer {
  display: inline-flex;
  align-items: center;
  min-height: var(--yh-toque-min);
  margin: 0;
  padding: 0 var(--yh-esp-3);
  border: 0;
  border-radius: var(--yh-radio-control);
  background: none;
  color: var(--yh-texto);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.yh .yh-loquesabe-deshacer:active { background: var(--yh-sup-3); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-loquesabe-deshacer:hover { background: var(--yh-sup-3); }
}
.yh .yh-loquesabe-lista > li.yh-loquesabe-saliendo { overflow: hidden; min-height: 0; padding-block: 0; opacity: 0; }
@keyframes yh-loquesabe-funde { from { opacity: 0; } }

/* Sin recuerdos en la sección: el punteado dice «todavía no» */
.yh .yh-loquesabe-vacio-seccion {
  margin: 0;
  padding: var(--yh-esp-4);
  border: 1px dashed var(--yh-borde-control);
  border-radius: var(--yh-radio-ficha);
  color: var(--yh-texto-2);
  text-wrap: pretty;
}

/* ——— Estado vacío: siempre de noche, con cielo, estrellas y la órbita vigilando ——— */
.yh .yh-loquesabe-cielo {
  position: relative;
  display: grid;
  justify-items: center;
  gap: var(--yh-esp-2);
  padding: var(--yh-esp-18) var(--yh-esp-6) var(--yh-esp-8);
  overflow: hidden;
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-ficha);
  color: var(--yh-texto);
  text-align: center;
  isolation: isolate;
}
.yh .yh-loquesabe-cielo-fondo { position: absolute; inset: 0; z-index: -1; width: 100%; height: 100%; pointer-events: none; }
.yh .yh-loquesabe-estrellas circle { fill: var(--yh-estrella); }
/* Grano al 4 %: feTurbulence de .85 con 2 octavas, en mosaico de 128 px */
.yh .yh-loquesabe-grano {
  opacity: .04;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='128' height='128'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='128' height='128' filter='url(%23g)'/%3E%3C/svg%3E");
  background-size: 128px 128px;
}
.yh .yh-loquesabe-cielo-titulo { margin: 0; color: var(--yh-texto); text-wrap: balance; }
.yh .yh-loquesabe-cielo-texto { margin: 0; max-width: 30em; color: var(--yh-texto-2); text-wrap: pretty; }
.yh .yh-loquesabe-boton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--yh-boton-alto);
  margin-top: var(--yh-esp-4);
  padding: 0 var(--yh-esp-5);
  border: 1px solid var(--yh-boton-borde);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  color: var(--yh-texto);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition:
    transform var(--yh-t-toque) var(--yh-curva-llegada),
    background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-loquesabe-boton:active { transform: scale(.97); background: var(--yh-sup-3); }
@media (hover: hover) {
  .yh .yh-loquesabe-boton:hover { border-color: rgba(250, 250, 249, 0.24); background: var(--yh-sup-2); }
}

/* La órbita de 64 px con la geometría de Orbita; el script la mueve como manda Kepler */
.yh .yh-loquesabe-orbita { position: relative; width: 64px; height: 64px; margin-bottom: var(--yh-esp-4); }
.yh .yh-loquesabe-orbita svg { position: absolute; inset: 0; overflow: visible; }
.yh .yh-loquesabe-orbita ellipse { fill: none; stroke: var(--yh-orbita); stroke-width: 1; vector-effect: non-scaling-stroke; }
.yh .yh-loquesabe-cuerpo,
.yh .yh-loquesabe-satelite { position: absolute; left: 0; top: 0; border-radius: 50%; }
.yh .yh-loquesabe-cuerpo { overflow: hidden; background: var(--yh-texto-3); }
/* La cara que mira al satélite se ilumina, más mientras más cerca está (∝ 1/r²) */
.yh .yh-loquesabe-luz {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  opacity: var(--yh-loquesabe-luz, 0);
  background: radial-gradient(circle var(--yh-loquesabe-alcance, 8px) at var(--yh-loquesabe-lx, 50%) var(--yh-loquesabe-ly, 50%), var(--yh-senal-grafico), transparent);
}
.yh .yh-loquesabe-satelite { background: var(--yh-senal-grafico); }

.yh .yh-loquesabe-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

@media (prefers-reduced-motion: reduce) {
  .yh .yh-loquesabe-boton:active { transform: none; opacity: .88; }
}

/* Yahu · MosaicoConexion. Extraído del design system Horizonte; la guía está en el artifact
   (components/MosaicoConexion/README.md). Necesita tokens.css y base.css. */

/* ——— Mosaico de conexión ———
   Rejilla de 2 columnas con 12 px; 3 cuando la rejilla mide 600 px o más
   (escritorio). Todo el mosaico se toca: es un <button>. */
.yh-mosaico-zona { container-type: inline-size; }
.yh-mosaico-rejilla {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--yh-esp-3);
}
@container (min-width: 600px) {
  .yh-mosaico-rejilla { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.yh-mosaico-rejilla > li { display: grid; min-width: 0; }
.yh .yh-mosaico {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--yh-esp-3);
  width: 100%;
  min-width: 0;
  min-height: 136px;
  margin: 0;
  padding: var(--yh-esp-4);
  border: 1px solid transparent;
  border-radius: var(--yh-radio-ficha);
  background: var(--yh-sup-1);
  color: var(--yh-texto);
  text-align: start;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition: transform var(--yh-t-toque) var(--yh-curva-llegada), background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
/* Sube del fondo con un filete. */
.yh .yh-mosaico { border-color: var(--yh-filete); }
.yh .yh-mosaico:active { transform: scale(.97); background: var(--yh-sup-3); }
/* Al pasar el cursor se levanta 2 px, su filete se aclara y la flecha avanza. */
.yh .yh-mosaico { transition: transform var(--yh-t-base) var(--yh-curva-llegada), background-color var(--yh-t-rapido) var(--yh-curva-llegada), border-color var(--yh-t-rapido) var(--yh-curva-llegada); }
.yh-mosaico-ir { transition: transform var(--yh-t-rapido) var(--yh-curva-llegada); }
@media (hover: hover) and (pointer: fine) {
  .yh .yh-mosaico:hover { transform: translateY(-2px); border-color: var(--yh-filete-fuerte); background: var(--yh-sup-2); }
  .yh .yh-mosaico:hover .yh-mosaico-ir { transform: translateX(3px); }
}
.yh-mosaico-arriba { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--yh-esp-2); }
/* El logo de terceros, a 24 px dentro de un círculo blanco de 40 px: el único color ajeno al sistema.
   Lo de adentro va en tinta (`yh-texto-inv`). */
.yh-mosaico-logo {
  flex: none;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border: 1px solid var(--yh-filete);
  border-radius: 50%;
  background: #ffffff;
  color: var(--yh-texto-inv);
}
.yh-mosaico-logo svg { width: 24px; height: 24px; }
.yh-mosaico-g {
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 600;
  line-height: 1;

}
.yh-mosaico-icono {
  flex: none;
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-mosaico-ir { color: var(--yh-texto-3); }
.yh-mosaico-textos { display: grid; gap: var(--yh-esp-1); min-width: 0; }
.yh-mosaico-nombre { color: var(--yh-texto); }
.yh-mosaico-alcance { color: var(--yh-texto-2); overflow-wrap: anywhere; }
.yh-mosaico-junto { white-space: nowrap; }
/* El estado: un punto de 8 px y una palabra; nunca sólo color. */
.yh-mosaico-estado { display: inline-flex; align-items: center; gap: var(--yh-esp-2); margin-top: var(--yh-esp-1); }
.yh-mosaico-punto { flex: none; width: 8px; height: 8px; border-radius: 50%; background: currentColor; }
.yh-mosaico--conectado .yh-mosaico-estado { color: var(--yh-positivo); }
.yh-mosaico--sin-acceso .yh-mosaico-estado { color: var(--yh-critico); }
/* Sin conectar: el punteado significa «todavía no». */
.yh .yh-mosaico.yh-mosaico--sin-conectar { border: 1px dashed var(--yh-borde-control); background: transparent; }
.yh .yh-mosaico.yh-mosaico--sin-conectar:active { background: var(--yh-sup-1); }
.yh-mosaico--sin-conectar .yh-mosaico-estado { color: var(--yh-texto-2); }
.yh-mosaico--sin-conectar .yh-mosaico-punto { background: transparent; border: 1px dotted var(--yh-texto-2); }

/* Desconectar abre un recibo en una hoja: sup-2 y radio 28; flota con filete fuerte y su sombra.
   Las mismas medidas que la hoja de Confirmación: agarradera a 6 px del borde y 16 a los lados. */
.yh-mosaico-hoja {
  container: yh-mosaico-hoja / inline-size;
  display: grid;
  gap: var(--yh-esp-4);
  max-width: 560px;
  margin: 0;
  padding: 6px var(--yh-esp-4) var(--yh-esp-4);
  border: 1px solid transparent;
  border-radius: var(--yh-radio-hoja);
  background: var(--yh-sup-2);
  box-shadow: var(--yh-sombra-flotante);
}
.yh-mosaico-hoja { border-color: var(--yh-filete-fuerte); }
.yh-mosaico-hoja > * { margin: 0; min-width: 0; }
.yh-mosaico-agarradera {
  justify-self: center;
  width: 36px;
  height: 5px;
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-filete-fuerte);
}
.yh-mosaico-hoja-cabeza { display: grid; gap: var(--yh-esp-2); }
.yh-mosaico-hoja-cabeza > * { margin: 0; }
.yh-mosaico-hoja-rotulo { color: var(--yh-texto-3); }
.yh-mosaico-hoja-titulo { color: var(--yh-texto); }
/* En una hoja ancha (escritorio) el título pasa a 24/28 al 125 %, como en Confirmación. */
@container yh-mosaico-hoja (min-width: 440px) {
  .yh .yh-mosaico-hoja-titulo { font-size: 24px; line-height: 28px; }
}
/* El recibo, igual que el de Confirmación: hundido, padding de 14 px (medida exacta del
   sistema, fuera de la escala de 4), radio concéntrico (28 − 16 = 12) y claves de 72 px. */
.yh-mosaico-recibo {
  display: grid;
  gap: var(--yh-esp-2);
  padding: 14px;
  border-radius: max(var(--yh-radio-chip), calc(var(--yh-radio-hoja) - var(--yh-esp-4)));
  background: var(--yh-hundido);
}
.yh-mosaico-recibo > div {
  display: grid;
  grid-template-columns: var(--yh-esp-18) minmax(0, 1fr);
  column-gap: var(--yh-esp-3);
  align-items: baseline;
}
.yh-mosaico-recibo dt { color: var(--yh-texto-3); }
.yh-mosaico-recibo dd { margin: 0; color: var(--yh-texto); }
/* El diff: «−» en texto-3 y tachado. */
.yh-mosaico-menos { color: var(--yh-texto-3); text-decoration: none; }
.yh-mosaico-menos s { text-decoration-thickness: 1px; }
.yh-mosaico-consecuencia { display: flex; align-items: flex-start; gap: var(--yh-esp-2); color: var(--yh-texto-2); }
.yh-mosaico-consecuencia .yh-mosaico-icono { width: 20px; height: 20px; }
/* Botones de hoja (52 px): el secundario toma lo que necesita, el de peligro el resto. */
.yh-mosaico-acciones { display: flex; gap: var(--yh-esp-3); }
.yh .yh-mosaico-boton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--yh-esp-2);
  min-height: var(--yh-boton-alto-hoja);
  min-width: var(--yh-toque-min);
  margin: 0;
  padding: 0 var(--yh-esp-5);
  border: 1px solid var(--yh-boton-borde);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  color: var(--yh-texto);
  white-space: nowrap;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
  transition: transform var(--yh-t-toque) var(--yh-curva-llegada), background-color var(--yh-t-rapido) var(--yh-curva-llegada);
}
.yh .yh-mosaico-boton--peligro { flex: 1 1 auto; color: var(--yh-critico); }
.yh .yh-mosaico-boton:active { transform: scale(.97); background: var(--yh-sup-3); }
.yh .yh-mosaico-boton--peligro:active { background: var(--yh-critico-suave); }
@media (hover: hover) {
  .yh .yh-mosaico-boton:hover { border-color: rgba(250, 250, 249, 0.24); background: var(--yh-sup-2); }
}

@media (prefers-reduced-motion: reduce) {
  .yh .yh-mosaico:active,
  .yh .yh-mosaico-boton:active { transform: none; opacity: .88; }
}

/* Yahu · Navegacion. Extraído del design system Horizonte; la guía está en el artifact
   (components/Navegacion/README.md). Necesita tokens.css y base.css. */

/* ── Navegación ───────────────────────────────────────────────────────────
   Celular: barra superior de 44 px y barra de pestañas de 50 px, las dos
   opacas y más el área segura. Escritorio (1024 px o más): el riel izquierdo
   de 248 px. Íconos de 24 px: contorno en texto-3 para lo inactivo y relleno
   en texto para lo activo. El naranja sólo entra como insignia o como el punto
   de una llamada; nunca dice dónde estás. */
.yh-navegacion-barra {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-3);
  height: calc(var(--yh-barra-alto) + env(safe-area-inset-top, 0px));
  padding: env(safe-area-inset-top, 0px) var(--yh-esp-5) 0;
  background: var(--yh-fondo);
  box-shadow: inset 0 -1px 0 var(--yh-filete);
}
.yh-navegacion-barra .yh-logo-firma { margin-right: auto; font-size: 18px; }
.yh-navegacion-riel-marca .yh-logo-firma { font-size: 18px; }

.yh-navegacion-pestanas {
  --yh-navegacion-recorte: var(--yh-fondo);
  display: flex;
  height: calc(var(--yh-pestanas-alto) + env(safe-area-inset-bottom, 0px));
  padding-bottom: env(safe-area-inset-bottom, 0px);
  background: var(--yh-fondo);
  box-shadow: inset 0 1px 0 var(--yh-filete);
}
.yh-navegacion-pestana {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--yh-esp-1);
  color: var(--yh-texto-3);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: color var(--yh-t-rapido) linear;
}
.yh-navegacion-pestana[aria-current="page"] { color: var(--yh-texto); }

.yh-navegacion-icono {
  position: relative;
  display: block;
  flex: none;
  width: 24px;
  height: 24px;
}
.yh-navegacion-svg {
  display: block;
  width: 24px;
  height: 24px;
  overflow: visible;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.yh-navegacion-svg--relleno { display: none; }
[aria-current="page"] .yh-navegacion-svg--contorno { display: none; }
[aria-current="page"] .yh-navegacion-svg--relleno { display: block; }
.yh-navegacion-sprite {
  position: absolute;
  width: 0;
  height: 0;
  overflow: hidden;
}
/* Insignia: naranja de 18 px con el número en tinta (5.91:1). */
.yh-navegacion-insignia {
  position: absolute;
  top: -6px;
  left: 14px;
  min-width: 18px;
  height: 18px;
  padding: 0 var(--yh-esp-1);
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-naranja);
  color: var(--yh-sobre-naranja);
  box-shadow: 0 0 0 2px var(--yh-navegacion-recorte);
  font-family: var(--font-texto);
  font-size: 11px;
  font-weight: 600;
  line-height: 18px;
  text-align: center;
}
/* Durante una llamada, «Llamadas» lleva un punto naranja que respira. */
.yh-navegacion-punto {
  position: absolute;
  top: -2px;
  left: 19px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--yh-senal-grafico);
  box-shadow: 0 0 0 2px var(--yh-navegacion-recorte);
  animation: yh-navegacion-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-navegacion-respira {
  from { opacity: 1; }
  to { opacity: 0.35; }
}
.yh-navegacion-oculto {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* El riel: el activo va en un renglón sup-2. */
.yh-navegacion-riel {
  --yh-navegacion-recorte: var(--yh-fondo);
  --yh-navegacion-activo: var(--yh-sup-2);
  display: flex;
  flex-direction: column;
  gap: var(--yh-esp-4);
  flex: none;
  width: var(--yh-riel-ancho);
  padding: var(--yh-esp-4) var(--yh-esp-3) var(--yh-esp-5);
  background: var(--yh-fondo);
  box-shadow: inset -1px 0 0 var(--yh-filete);
}
.yh-navegacion-riel-marca {
  display: flex;
  align-items: center;
  min-height: var(--yh-toque-min);
  padding: 0 var(--yh-esp-3);
}
.yh-navegacion-riel-lista {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--yh-esp-1);
}
.yh-navegacion-riel-item {
  display: flex;
  align-items: center;
  gap: var(--yh-esp-3);
  min-height: var(--yh-toque-min);
  padding: 0 var(--yh-esp-3);
  border-radius: var(--yh-radio-control);
  color: var(--yh-texto-2);
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  transition: background-color var(--yh-t-rapido) linear, color var(--yh-t-rapido) linear;
}
.yh-navegacion-riel-item .yh-navegacion-icono { color: var(--yh-texto-3); }
.yh-navegacion-riel-item:active { background: var(--yh-sup-3); }
.yh-navegacion-riel-item[aria-current="page"] {
  --yh-navegacion-recorte: var(--yh-navegacion-activo);
  background: var(--yh-navegacion-activo);
  color: var(--yh-texto);
}
.yh-navegacion-riel-item[aria-current="page"] .yh-navegacion-icono { color: var(--yh-texto); }
.yh-navegacion-riel-item .yh-navegacion-insignia {
  position: static;
  margin-left: auto;
  box-shadow: none;
}
.yh-navegacion-riel-pie {
  display: grid;
  justify-items: start;
  gap: var(--yh-esp-3);
  margin-top: auto;
  padding: 0 var(--yh-esp-3);
}
.yh-navegacion-riel-firma {
  margin: 0;
  color: var(--yh-texto-3);
}

/* Yahu · Insignia. Extraído del design system Horizonte; la guía está en el artifact
   (components/Insignia/README.md). Necesita tokens.css y base.css. */

/* ——— Insignia ———
   Un SVG de 240 × 240: anillo con el texto en círculo (gira una vuelta cada
   60 s), el cielo con estrellas que titilan, las tres franjas cruzando en
   diagonal, el eclipse al centro y un satélite que da la vuelta en 8 s. */
.yh-insignia { display: block; width: var(--yh-insignia-tam, 240px); height: auto; overflow: visible; }
.yh-insignia-borde { fill: var(--yh-sup-2); stroke: var(--yh-texto); stroke-width: 2; }
.yh-insignia-filo { fill: none; stroke: var(--yh-filete-fuerte); stroke-width: 1; }
.yh-insignia-cielo { fill: var(--yh-cielo-base); stroke: var(--yh-texto); stroke-width: 1.5; }
.yh-insignia-texto {
  fill: var(--yh-texto);
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.18em;
}
.yh-insignia-anillo { transform-box: view-box; transform-origin: 120px 120px; animation: yh-insignia-gira 60s linear infinite; }
@keyframes yh-insignia-gira { to { transform: rotate(360deg); } }
.yh-insignia-franja-1 { fill: var(--yh-franja-1); }
.yh-insignia-franja-2 { fill: var(--yh-franja-2); }
.yh-insignia-franja-3 { fill: var(--yh-franja-3); }
.yh-insignia-estrella { fill: var(--yh-estrella); animation: yh-insignia-titila 2.6s var(--yh-curva-pulso) infinite alternate; }
.yh-insignia-estrella:nth-of-type(2n) { animation-delay: -1.1s; }
.yh-insignia-estrella:nth-of-type(3n) { animation-delay: -1.9s; animation-duration: 3.4s; }
@keyframes yh-insignia-titila { from { opacity: 0.9; } to { opacity: 0.2; } }
.yh-insignia-orbita { fill: none; stroke: var(--yh-orbita); stroke-width: 1; stroke-dasharray: 2 4; }
.yh-insignia-satelite {
  fill: var(--yh-naranja);
  offset-path: path("M 120 120 m -74 0 a 74 30 -18 1 0 148 0 a 74 30 -18 1 0 -148 0");
  animation: yh-insignia-orbita 8s linear infinite;
}
@keyframes yh-insignia-orbita { from { offset-distance: 0%; } to { offset-distance: 100%; } }
.yh-insignia-luz { fill: var(--yh-naranja); }
.yh-insignia-tu { fill: var(--yh-texto); }

@media (prefers-reduced-motion: reduce) {
  .yh-insignia-anillo, .yh-insignia-estrella, .yh-insignia-satelite { animation: none; }
}

/* Yahu · Horizonte. Extraído del design system Horizonte; la guía está en el artifact
   (components/Horizonte/README.md). Necesita tokens.css y base.css. */

/* ——— Horizonte ———
   Una pista alta que se recorre con scroll y una escena pegajosa encima.
   El progreso (0 → 1) acerca la cámara al agujero negro de r = 20 rₛ a
   r = 0.9 rₛ: al pasar de 1 se cruza el horizonte y todo queda negro.
   Después aparece lo que hay del otro lado. */
.yh-horizonte {
  --yh-horizonte-alto: 640px;
  --p: 0;                       /* progreso total, lo escribe el script */
  --q: 0;                       /* progreso del acercamiento (0 → 1 en el 78 % de la pista) */
  --d: 0;                       /* progreso del otro lado (0 → 1 después del horizonte) */
  position: relative;
  height: var(--yh-horizonte-alto);
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-width: none;
  background: var(--yh-fondo);
}
.yh-horizonte::-webkit-scrollbar { display: none; }
.yh-horizonte-pista { height: calc(var(--yh-horizonte-alto) * 5.2); }
.yh-horizonte-escena {
  position: sticky;
  top: 0;
  height: var(--yh-horizonte-alto);
  margin-bottom: calc(-1 * var(--yh-horizonte-alto));
  overflow: hidden;
  isolation: isolate;
}
.yh-horizonte-lienzo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
}
/* Sin WebGL: el mismo dibujo con dos capas de CSS (disco negro y anillo desenfocado). */
.yh-horizonte-respaldo {
  position: absolute;
  left: 50%;
  top: 52%;
  width: calc(180px + var(--q) * 1400px);
  aspect-ratio: 1;
  translate: -50% -50%;
  z-index: -1;
  display: none;
}
.yh-horizonte--sin-gl .yh-horizonte-respaldo { display: block; }
.yh-horizonte-respaldo::before {
  content: "";
  position: absolute;
  inset: 30% -60%;
  border-radius: 50%;
  border: 18px solid var(--yh-naranja);
  filter: blur(14px);
  opacity: 0.8;
}
.yh-horizonte-respaldo::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--yh-cielo-base);
  box-shadow: 0 0 0 1px rgba(250, 250, 249, 0.4), 0 0 60px 10px var(--yh-halo);
}

/* La barra: logo a la izquierda, dos botones a la derecha. */
.yh-horizonte-barra {
  z-index: 4;
  position: absolute;
  inset: 0 0 auto;
  display: flex;
  align-items: center;
  gap: var(--yh-esp-3);
  height: 56px;
  padding: 0 var(--yh-esp-6);
  border-bottom: 1px solid var(--yh-filete);
  background: rgba(17, 15, 13, calc(0.4 + var(--q) * 0.6));
}
.yh-horizonte-firma { display: inline-flex; align-items: center; gap: 6px; margin-right: auto; color: var(--yh-texto); text-decoration: none; }
.yh-horizonte-firma svg { width: 22px; height: 22px; }
.yh-horizonte-firma span { font-family: var(--font-display); font-variation-settings: "wdth" 125; font-weight: 600; font-size: 18px; letter-spacing: -0.01em; }

/* Los titulares: se apagan con desenfoque al acercarte. */
.yh-horizonte-titular {
  text-shadow: 0 2px 32px rgba(10, 9, 8, 0.55);
  position: absolute;
  margin: 0;
  font-family: var(--font-display);
  font-variation-settings: "wdth" 125;
  font-weight: 600;
  font-size: clamp(34px, 8vw, 84px);
  line-height: 0.95;
  letter-spacing: -0.02em;
  color: var(--yh-texto);
  white-space: nowrap;
  opacity: calc(1 - var(--q) * 3);
  filter: blur(calc(var(--q) * 40px));
  transform: scale(calc(1 + var(--q) * 0.6));
}
.yh-horizonte-titular--1 { left: var(--yh-esp-6); top: 80px; transform-origin: left top; }
.yh-horizonte-titular--2 { right: var(--yh-esp-10); bottom: 64px; transform-origin: right bottom; }
.yh-horizonte-intro {
  z-index: 4;
  position: absolute;
  left: var(--yh-esp-6);
  bottom: 56px;
  display: grid;
  gap: var(--yh-esp-4);
  max-width: 340px;
  opacity: calc(1 - var(--q) * 4);
  translate: 0 calc(var(--q) * 40px);
}
.yh-horizonte-intro p { margin: 0; color: var(--yh-texto-2); text-shadow: 0 1px 16px rgba(10, 9, 8, 0.9); }
.yh-horizonte-acciones { display: flex; flex-wrap: wrap; gap: var(--yh-esp-2); }

/* La regla de la derecha y su lectura: «distancia al horizonte r = 20.00 rₛ». */
.yh-horizonte-regla {
  position: absolute;
  top: 56px;
  right: 0;
  bottom: 0;
  width: 14px;
  background: repeating-linear-gradient(to bottom, rgba(250, 250, 249, 0.18) 0 1px, transparent 1px 12px);
  -webkit-mask: linear-gradient(to left, #000 6px, transparent 14px);
          mask: linear-gradient(to left, #000 6px, transparent 14px);
  opacity: calc(1 - var(--d));
}
.yh-horizonte-lectura {
  position: absolute;
  right: 22px;
  top: calc(72px + var(--q) * (var(--yh-horizonte-alto) - 160px));
  margin: 0;
  text-align: right;
  color: var(--yh-texto-2);
  text-shadow: 0 1px 12px rgba(10, 9, 8, 0.95), 0 0 2px rgba(10, 9, 8, 0.9);
  opacity: calc(1 - var(--d) * 2);
}
.yh-horizonte-lectura::after {
  content: "";
  position: absolute;
  right: -22px;
  top: 7px;
  width: 18px;
  height: 1px;
  background: var(--yh-texto-2);
}
.yh-horizonte-lectura b { display: block; font-weight: 500; color: var(--yh-texto); }
.yh-horizonte-lectura sub { font-size: 0.7em; }
.yh-horizonte-pista-texto {
  position: absolute;
  left: 50%;
  bottom: var(--yh-esp-4);
  translate: -50% 0;
  margin: 0;
  color: var(--yh-texto-2);
  white-space: nowrap;
  opacity: calc(1 - var(--q) * 6);
  animation: yh-horizonte-flota 2.4s var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-horizonte-flota { to { translate: -50% -4px; opacity: calc(0.6 - var(--q) * 6); } }

/* El visor: un marco con esquinas, una cruz al centro y la fase arriba a la derecha. */
.yh-horizonte-visor {
  position: absolute;
  inset: 72px 28px 40px 24px;
  pointer-events: none;
  --yh-esquina: rgba(242, 234, 217, 0.5);
  opacity: calc(1 - var(--d));
}
.yh-horizonte-visor::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 22px;
  height: 22px;
  translate: -50% -50%;
  background:
    linear-gradient(rgba(242, 234, 217, 0.55), rgba(242, 234, 217, 0.55)) center / 1px 100% no-repeat,
    linear-gradient(rgba(242, 234, 217, 0.55), rgba(242, 234, 217, 0.55)) center / 100% 1px no-repeat;
  opacity: calc(1 - var(--q) * 2);
}
.yh-horizonte-fase {
  position: absolute;
  left: var(--yh-esp-6);
  top: calc(var(--yh-horizonte-alto) - 92px);
  display: flex;
  align-items: center;
  gap: var(--yh-esp-2);
  margin: 0;
  color: var(--yh-texto);
  text-shadow: 0 1px 12px rgba(10, 9, 8, 0.95);
  opacity: calc(var(--q) * 4 - 0.2);
}
.yh-horizonte-fase i { width: 7px; height: 7px; border-radius: 50%; background: var(--yh-naranja); animation: yh-horizonte-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate; }
.yh-horizonte-coord {
  position: absolute;
  left: var(--yh-esp-6);
  top: calc(var(--yh-horizonte-alto) - 70px);
  margin: 0;
  color: var(--yh-texto-3);
  text-shadow: 0 1px 12px rgba(10, 9, 8, 0.95);
  opacity: calc(var(--q) * 4 - 0.2);
}
.yh-horizonte-barra .yh-franjas { width: 28px; height: 12px; margin-left: 2px; background: linear-gradient(to bottom, var(--yh-franja-1) 0 3px, transparent 3px 4.5px, var(--yh-franja-2) 4.5px 7.5px, transparent 7.5px 9px, var(--yh-franja-3) 9px 12px); }

/* Del otro lado: el texto se enfoca mientras sigues bajando. */
.yh-horizonte-otro {
  position: absolute;
  inset: 0;
  display: grid;
  place-content: center;
  justify-items: center;
  gap: var(--yh-esp-5);
  padding: 0 var(--yh-esp-6);
  text-align: center;
  pointer-events: none;
  opacity: var(--d);
}
.yh-horizonte-otro h2 {
  margin: 0;
  max-width: 16ch;
  font-family: var(--font-display);
  font-variation-settings: "wdth" 125;
  font-weight: 600;
  font-size: clamp(32px, 5vw, 52px);
  line-height: 1.02;
  letter-spacing: -0.045em;
  color: var(--yh-texto);
  text-wrap: balance;
  filter: blur(calc((1 - var(--d)) * 18px));
  transform: scale(calc(0.94 + var(--d) * 0.06));
}
.yh-horizonte-otro p { margin: 0; max-width: 40ch; color: var(--yh-texto-2); }
.yh-horizonte-aviso {
  display: inline-flex;
  align-items: center;
  gap: var(--yh-esp-2);
  height: 32px;
  padding: 0 var(--yh-esp-3);
  border: 1px solid var(--yh-filete-fuerte);
  border-radius: var(--yh-radio-pildora);
  background: var(--yh-sup-2);
  color: var(--yh-texto);
}
.yh-horizonte-aviso i {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--yh-senal-grafico);
  box-shadow: var(--yh-brillo-senal);
  animation: yh-horizonte-respira var(--yh-t-pulso) var(--yh-curva-pulso) infinite alternate;
}
@keyframes yh-horizonte-respira { to { opacity: 0.35; } }

/* Botones de la escena (la familia Boton, en su tamaño de 40). */
.yh .yh-horizonte-boton {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 40px;
  padding: 0 14px 0 16px;
  border: 1px solid var(--yh-boton-borde);
  border-radius: var(--yh-radio-control);
  background: var(--yh-boton-fondo);
  color: var(--yh-texto);
  text-decoration: none;
  white-space: nowrap;
  transition: background-color var(--yh-t-rapido) var(--yh-curva-llegada), transform var(--yh-t-toque) var(--yh-curva-llegada);
}
.yh .yh-horizonte-boton--primario { border-color: transparent; background: var(--yh-texto); color: var(--yh-texto-inv); }
.yh .yh-horizonte-boton--fantasma { border-color: transparent; background: transparent; padding: 0 10px; color: var(--yh-texto-2); }
.yh .yh-horizonte-boton:active { transform: scale(0.97); }
.yh-horizonte-boton svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; transition: transform var(--yh-t-rapido) var(--yh-curva-llegada); }
.yh-horizonte-boton:hover svg { transform: translate(2px, -2px); }

@media (max-width: 560px) {
  .yh-horizonte-titular--2 { right: var(--yh-esp-5); bottom: 260px; }
  .yh-horizonte-lectura { top: calc(150px + var(--q) * (var(--yh-horizonte-alto) - 240px)); }
  .yh-horizonte-barra .yh-horizonte-boton--fantasma { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .yh-horizonte-titular, .yh-horizonte-otro h2 { filter: none; transform: none; }
  .yh-horizonte-pista-texto, .yh-horizonte-aviso i { animation: none; }
}
