/* =========================================================
   AleGa info — hoja de estilos principal
   Los colores se guardan en variables (:root) para poder
   cambiarlos en un solo lugar y usarlos en todas las páginas.
   ========================================================= */
/* :root es el elemento <html>, o sea el antepasado de TODO. Las variables que
   se declaran aquí las puede leer cualquier regla de cualquier página que
   enlace esta hoja: por eso es el sitio donde se guarda la paleta. */
:root {
  color-scheme: dark;       /* Le dice al navegador que la página es oscura: así pinta de oscuro las barras de scroll y los campos de formulario */
  --fondo: #0e0e10;         /* Grafito: el fondo de toda la página */
  --fondo-alt: #131316;     /* Un gris un pelo más claro, para separar secciones sin usar líneas */
  --superficie: #17171a;    /* Tarjetas y cajas: lo que se ve "encima" del fondo */
  --texto: #ededed;         /* Texto principal. No es blanco puro: el blanco puro sobre negro cansa la vista */
  --texto-suave: #9a9aa0;   /* Texto secundario (descripciones, pies de foto) */
  --linea: #2a2a2e;         /* El color de todos los bordes y separadores */
  --acento: #c6f432;        /* Verde lima (botones y detalles) */
  --acento-hover: #b3e01f;  /* El mismo lima un poco más apagado, para cuando el cursor está encima */
  --acento-suave: #1f2610;  /* Lima muy oscuro: sirve de fondo detrás de texto lima */
  --sobre-acento: #0e0e10;  /* Color del texto encima del lima (el lima es tan claro que pide texto oscuro) */
  --rojo: #f87171;          /* Para errores y para el botón de volver */
  --rojo-hover: #ef4444;    /* El rojo con el cursor encima */
  --radio: 14px;            /* El redondeo estándar de las esquinas. Una sola variable = todas las cajas redondean igual */
  --ancho: 1080px;          /* Hasta dónde se estira el contenido en pantallas grandes */
  --titulos: "Geist", system-ui, -apple-system, "Segoe UI", Arial, sans-serif; /* Tipografía de los títulos. La lista es un plan B: si Geist no carga, se usa la siguiente que exista */
  --sans: "Geist", system-ui, -apple-system, "Segoe UI", Arial, sans-serif;    /* Tipografía del texto normal */
  --mono: "Geist Mono", Consolas, ui-monospace, monospace;                     /* Tipografía de ancho fijo: todas las letras miden lo mismo, ideal para código y números */
}

/* El asterisco significa "todos los elementos"; ::before y ::after son los dos
   trocitos extra que CSS puede inventar dentro de cada uno.
   border-box hace que width incluya el padding y el borde: si pides 200px de
   ancho, mide 200px en pantalla, no 200 + padding + borde. */
*, *::before, *::after { box-sizing: border-box; }

/* Cuando un enlace salta a un #ancla, la página se desliza en vez de brincar */
html { scroll-behavior: smooth; }

body {
  margin: 0;                            /* El navegador pone 8px de margen por su cuenta; sin esto quedaría una franja blanca al borde */
  font-family: var(--sans);             /* Tipografía por defecto; todo lo demás la hereda */
  font-size: 16px;                      /* Tamaño base del texto */
  line-height: 1.6;                     /* Separación entre renglones = 1.6 veces el tamaño de la letra */
  color: var(--texto);                  /* Color del texto, heredado por todos los hijos */
  background: var(--fondo);             /* Fondo de la página entera */
  -webkit-font-smoothing: antialiased;  /* Suaviza el dibujo de las letras claras sobre fondo oscuro (solo en Chrome y Safari) */
}

/* Evita que la página de fondo se mueva cuando la ventana de contacto está abierta.
   :has() mira hacia adentro: "un body que CONTENGA un dialog abierto". */
body:has(dialog[open]) { overflow: hidden; }

/* max-width: la imagen nunca sobresale de su caja. height: auto mantiene la
   proporción al encogerla, para que no salga aplastada. */
img { max-width: 100%; height: auto; }

/* Los títulos vienen con margen y con negrita exagerada de fábrica; aquí se
   quita el margen (lo pone el layout), se baja la negrita a 600, se juntan los
   renglones (1.15) y se juntan un poco las letras (letter-spacing negativo). */
h1, h2, h3, h4 { margin: 0; font-weight: 600; line-height: 1.15; letter-spacing: -.01em; }

p { margin: 0; }     /* Igual que arriba: el aire entre párrafos lo decide el contenedor con gap */
a { color: inherit; }/* Los enlaces dejan de ser azules y toman el color del texto que los rodea */

/* <code> = un trocito de código dentro de una frase */
code {
  font-family: var(--mono);        /* Ancho fijo, para que se note que es código */
  font-size: .88em;                /* em = relativo a la letra de alrededor: siempre un 12% más pequeño que el texto donde esté */
  background: var(--acento-suave); /* Fondo lima oscuro que lo resalta */
  color: var(--acento);            /* Letra lima */
  padding: 2px 6px;                /* Aire adentro: 2px arriba y abajo, 6px a los lados */
  border-radius: 6px;              /* Esquinas redondeadas */
}

/* Centra el contenido y limita su ancho. Esta clase se repite en cada sección;
   es la que impide que el texto se estire de borde a borde en un monitor grande. */
.envoltura {
  width: 100%;              /* Ocupa todo lo que pueda... */
  max-width: var(--ancho);  /* ...pero nunca más de 1080px */
  margin: 0 auto;           /* 0 arriba y abajo, "auto" a los lados = reparte el sobrante por igual, o sea centra */
  padding: 0 24px;          /* Aire a los lados para que el texto no toque el borde de la pantalla */
}

/* ---------------------------------------------------------
   BOTONES (se usan con class, porque un id no se puede repetir)
   --------------------------------------------------------- */
/* .boton es la BASE: todo botón la lleva. Las variantes de abajo (--borde,
   --rojo, --pequeno) solo cambian lo que las diferencia. Así, si mañana
   cambia el redondeo, se cambia una vez aquí y no en seis sitios. */
.boton {
  display: inline-flex;       /* flex por dentro (para alinear icono y texto), "inline" por fuera (no ocupa todo el ancho) */
  align-items: center;        /* Centra verticalmente lo que haya dentro */
  justify-content: center;    /* Centra horizontalmente lo que haya dentro */
  gap: 8px;                   /* Separación entre el icono y el texto, si hay dos cosas */
  padding: 12px 22px;         /* Aire interior: 12px arriba/abajo, 22px a los lados */
  border: 1px solid var(--acento); /* Borde: grosor, tipo de línea y color */
  border-radius: 999px;       /* Un número enorme = píldora. El navegador redondea hasta donde da la altura */
  background: var(--acento);  /* Relleno lima */
  color: var(--sobre-acento); /* Texto oscuro, porque el lima es muy claro */
  font: inherit;              /* <button> NO hereda la tipografía del body; hay que pedírselo a mano */
  font-size: 15px;            /* ...y luego fijar el tamaño */
  font-weight: 500;           /* Seminegrita */
  text-decoration: none;      /* Quita el subrayado cuando el botón es en realidad un enlace <a> */
  cursor: pointer;            /* Manita al pasar por encima: avisa de que se puede pulsar */
  transition: background-color .2s, border-color .2s, color .2s, transform .2s; /* Los cambios de estos 4 valores tardan 0.2s en vez de ser instantáneos */
}
/* :hover = el cursor está encima. El botón se aclara y sube 1px */
.boton:hover { background: var(--acento-hover); border-color: var(--acento-hover); transform: translateY(-1px); }
/* :active = justo mientras se mantiene pulsado; vuelve a su sitio, como si se hundiera */
.boton:active { transform: translateY(0); }
/* :disabled = tiene el atributo disabled en el HTML. Se apaga y pierde la manita */
.boton:disabled {
  background: var(--fondo-alt);
  border-color: var(--linea);
  color: var(--texto-suave);
  cursor: default;   /* Flecha normal: no invita a pulsar */
  transform: none;   /* Anula el salto del hover */
}

/* Variante "fantasma": sin relleno, solo contorno */
.boton--borde { background: transparent; color: var(--texto); border-color: var(--linea); }
.boton--borde:hover { background: var(--superficie); border-color: var(--texto-suave); }

/* Variante roja (volver, cancelar) */
.boton--rojo { background: var(--rojo); border-color: var(--rojo); }
.boton--rojo:hover { background: var(--rojo-hover); border-color: var(--rojo-hover); }

/* Variante lima explícita, para cuando hay que devolverle el color a un botón que era --borde */
.boton--claro { background: var(--acento); border-color: var(--acento); color: var(--sobre-acento); }
.boton--claro:hover { background: var(--acento-hover); border-color: var(--acento-hover); }

/* Variante pequeña: solo toca el aire interior y el tamaño de letra */
.boton--pequeno { padding: 8px 16px; font-size: 14px; }

/* Clase de utilidad: el JavaScript la pone y la quita para mostrar u ocultar cosas */
.oculto { display: none; }

/* :focus-visible = el elemento tiene el foco Y el navegador cree que llegaste
   con el teclado (Tab), no con el ratón. Sin este recuadro, quien navega con
   teclado no sabe dónde está parado. */
.boton:focus-visible,
.boton-tab:focus-visible,
a:focus-visible,
summary:focus-visible,
.tarjeta-hover:focus-visible {
  outline: 2px solid var(--acento); /* outline se dibuja FUERA de la caja y no empuja nada, por eso se usa este y no border */
  outline-offset: 3px;              /* Lo separa 3px del elemento para que se vea mejor */
}

/* ---------------------------------------------------------
   BARRA SUPERIOR
   --------------------------------------------------------- */
.barra {
  position: sticky;   /* Se comporta como normal hasta que llega al borde de arriba; ahí se queda pegada */
  top: 0;             /* "El borde de arriba" = 0px del tope de la ventana. sticky sin top no hace nada */
  z-index: 10;        /* Orden de apilado: número más alto = se dibuja encima. Sin esto, el contenido pasaría por delante */
  background: color-mix(in srgb, var(--fondo) 85%, transparent); /* Mezcla el fondo con un 15% de transparencia: se intuye lo que pasa por detrás */
  backdrop-filter: blur(10px); /* Desenfoca lo que queda DETRÁS de la barra (efecto cristal esmerilado) */
  border-bottom: 1px solid var(--linea); /* Línea fina que la separa del contenido */
}
/* space-between = el primer hijo a la izquierda, el último a la derecha y el hueco en medio */
.barra__interior { display: flex; align-items: center; justify-content: space-between; gap: 16px; height: 68px; }
/* white-space: nowrap impide que "AleGa info" se parta en dos renglones en pantallas estrechas */
.logo { font-family: var(--titulos); font-weight: 700; font-size: 22px; letter-spacing: -.04em; text-decoration: none; white-space: nowrap; color: var(--texto); }
.logo__punto { color: var(--acento); }  /* El punto del logo, en lima */
.logo__sub { font-family: var(--sans); font-size: 13px; color: var(--texto-suave); } /* El texto pequeño junto al logo */
.barra__enlaces { display: flex; align-items: center; gap: 24px; font-size: 15px; } /* Los enlaces en fila, separados 24px */
.barra__enlaces a { color: var(--texto-suave); text-decoration: none; transition: color .2s; } /* Apagados y sin subrayar... */
.barra__enlaces a:hover { color: var(--texto); }                                              /* ...y se encienden al pasar el cursor */

/* ---------------------------------------------------------
   PORTADA (inicio)
   --------------------------------------------------------- */
/* padding con 3 valores = arriba / lados / abajo. Aquí: 110px arriba, 0 a los lados, 100px abajo */
.portada { padding: 110px 0 100px; }

/* La pastillita de "Primer ciclo" con el puntito lima */
.etiqueta {
  display: inline-flex;            /* Se ajusta a su contenido en vez de ocupar todo el renglón */
  align-items: center;             /* Alinea el punto con el texto */
  gap: 10px;                       /* Separación entre el punto y el texto */
  padding: 6px 14px;
  border: 1px solid var(--linea);
  border-radius: 999px;            /* Píldora */
  background: var(--superficie);
  font-size: 13px;
  color: var(--texto-suave);
  margin-bottom: 28px;             /* Aire hasta el título que viene debajo */
}
.etiqueta__punto {
  width: 8px;
  height: 8px;
  border-radius: 50%;    /* La mitad del ancho: un cuadrado con 50% de radio es un círculo perfecto */
  background: var(--acento);
}

.portada__titulo {
  font-family: var(--titulos);
  font-weight: 600;
  font-size: clamp(40px, 6.2vw, 76px); /* clamp(mínimo, deseado, máximo): 6.2vw = 6.2% del ancho de la ventana, pero nunca menos de 40px ni más de 76px. Un título que se adapta solo, sin @media */
  line-height: 1.02;                   /* Renglones muy juntos: en tamaños grandes el aire de más se nota mucho */
  letter-spacing: -.045em;             /* Letras un poco más juntas, truco habitual en titulares grandes */
  max-width: 15ch;                     /* ch = el ancho del carácter "0". Corta el título a unos 15 caracteres por renglón */
  color: var(--texto);
}
/* <em> sale en cursiva por defecto; aquí se le quita la cursiva y se usa solo para pintar de lima */
.portada__titulo em { font-style: normal; color: var(--acento); }
/* 56ch ≈ 56 caracteres por renglón: el rango cómodo para leer es 45-75 */
.portada__texto { margin-top: 24px; max-width: 56ch; font-size: 18px; color: var(--texto-suave); }
/* flex-wrap: wrap deja que los botones bajen a otro renglón si no caben */
.portada__acciones { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 36px; }

/* La fila de cifras (cursos, temas, etc.) bajo la portada */
.cifras { display: flex; flex-wrap: wrap; gap: 40px; margin-top: 64px; padding-top: 28px; border-top: 1px solid var(--linea); }
/* display: block obliga al número a ocupar su propio renglón, con el texto debajo. line-height: 1 quita el aire sobrante */
.cifra__numero { display: block; font-family: var(--mono); font-size: 36px; font-weight: 500; line-height: 1; letter-spacing: -.04em; color: var(--acento); }
.cifra__texto { font-size: 14px; color: var(--texto-suave); }

/* ---------------------------------------------------------
   SECCIONES
   --------------------------------------------------------- */
.seccion { padding: 96px 0; border-top: 1px solid var(--linea); } /* Aire arriba y abajo + línea que la separa de la anterior */
.seccion--alt { background: var(--fondo-alt); }                   /* Variante con fondo un tono más claro, para alternar */
.seccion__cabecera { margin-bottom: 48px; max-width: 60ch; }      /* El bloque de título; 60ch para que el texto no se estire */
/* text-transform: uppercase pone el texto en mayúsculas SIN tocar el HTML.
   En mayúsculas las letras se apelotonan, por eso se separan con letter-spacing positivo. */
.seccion__etiqueta { font-size: 13px; text-transform: uppercase; letter-spacing: .12em; color: var(--texto-suave); margin-bottom: 12px; }
.seccion__titulo {
  font-family: var(--titulos);
  font-weight: 600;
  font-size: clamp(30px, 4vw, 44px); /* Igual que el de portada, pero más pequeño */
  line-height: 1.1;
  letter-spacing: -.035em;
  color: var(--texto);
}
.seccion__texto { margin-top: 14px; color: var(--texto-suave); }

/* ---------------------------------------------------------
   TARJETAS DE CICLOS (tarjeta interactiva)
   --------------------------------------------------------- */
/* grid = rejilla. repeat(3, 1fr) son 3 columnas; fr es "fracción del espacio
   sobrante", así que 1fr 1fr 1fr = tres columnas exactamente iguales. */
.ciclos { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }

.tarjeta-hover {
  position: relative;       /* El ancla de la capa sorpresa: un hijo con position:absolute se coloca respecto al antepasado posicionado más cercano */
  overflow: hidden;         /* Oculta lo que sale de la caja (la capa sorpresa mientras está escondida abajo) */
  display: flex;
  flex-direction: column;   /* Los hijos se apilan en vertical en vez de ponerse en fila */
  min-height: 260px;        /* Altura mínima: así todas las tarjetas miden igual aunque tengan distinto texto */
  padding: 28px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  transition: transform .3s ease, box-shadow .3s ease, border-color .3s; /* ease = arranca y frena suave, en vez de ir a velocidad constante */
}
/* :focus-within = "este elemento o CUALQUIER hijo suyo tiene el foco".
   Hace que también funcione con teclado o tocando en el celular, donde no hay hover. */
.tarjeta-hover:hover,
.tarjeta-hover:focus-within {
  transform: translateY(-6px); /* El pequeño salto: 6px hacia arriba (la Y crece hacia abajo, por eso es negativo) */
  border-color: var(--acento);
  box-shadow: 0 16px 32px -14px rgba(0, 0, 0, .5); /* x / y / difuminado / extensión negativa (encoge la sombra) / color. La sombra cae hacia abajo, como si la tarjeta se levantara */
}

.tarjeta__numero { font-family: var(--mono); font-size: 40px; font-weight: 500; line-height: 1; letter-spacing: -.04em; color: var(--acento); }
/* La pastilla de estado se saca del flujo y se clava en la esquina superior derecha */
.tarjeta__estado {
  position: absolute;             /* Fuera del flujo: no empuja a sus hermanos */
  top: 28px;                      /* A 28px del borde de arriba de la tarjeta... */
  right: 28px;                    /* ...y 28px del derecho */
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 500;
  background: var(--acento-suave);
  color: var(--acento);
}
/* margin-top: auto dentro de un flex en columna empuja este elemento y los que
   siguen hasta abajo del todo: por eso el título queda pegado al pie de la tarjeta */
.titulot { margin-top: auto; font-size: 22px; color: var(--texto); }
.parrafotarjeta { margin-top: 6px; font-size: 14px; color: var(--texto-suave); }

/* La capa que sube al pasar el cursor, con la lista de cursos del ciclo */
.capa-sorpresa {
  position: absolute;
  inset: 0;                    /* Atajo de top/right/bottom/left: 0 en los cuatro lados = tapa la tarjeta entera */
  display: flex;
  flex-direction: column;
  justify-content: center;     /* En columna, justify-content centra en VERTICAL (el eje principal es el vertical) */
  padding: 24px 28px;
  background: var(--superficie);
  color: var(--texto);
  transform: translateY(100%); /* Escondida abajo: 100% de SU propia altura, o sea justo fuera de la tarjeta */
  transition: transform .35s ease;
}
/* Cuando el usuario pasa el cursor por la tarjeta, la capa sorpresa sube.
   El espacio entre los dos selectores significa "descendiente": una .capa-sorpresa que esté DENTRO de una .tarjeta-hover con el cursor encima */
.tarjeta-hover:hover .capa-sorpresa,
.tarjeta-hover:focus-within .capa-sorpresa { transform: translateY(0); }

.capa-sorpresa__titulo { font-size: 12px; text-transform: uppercase; letter-spacing: .12em; color: var(--acento); margin-bottom: 8px; }

/* OJO con este nombre: .curso es el enlace a un curso dentro de la capa sorpresa.
   No confundir con .aula (más abajo), que es el layout de la página del curso.
   Se llamaron igual una vez y las dos reglas se pisaron: en CSS dos clases con
   el mismo nombre son la MISMA clase, aunque estén en secciones distintas. */
.curso {
  display: flex;
  justify-content: space-between; /* Nombre del curso a la izquierda, flecha a la derecha */
  align-items: center;
  gap: 12px;
  padding: 11px 0;                /* Aire arriba y abajo; 0 a los lados */
  border-bottom: 1px solid var(--linea); /* Raya que separa un curso del siguiente */
  color: var(--texto);
  text-decoration: none;          /* Sin subrayado */
  font-size: 15px;
}
.curso:last-child { border-bottom: none; }            /* Al último de la lista se le quita la raya, que si no queda suelta */
.curso::after { content: "→"; transition: transform .2s; } /* ::after inventa un trocito al final del elemento; content es lo que escribe */
.curso:hover { color: var(--acento); }
.curso:hover::after { transform: translateX(4px); }   /* La flecha se desplaza 4px a la derecha al pasar el cursor */

/* Ciclos que todavía no tienen cursos. Solo cambian lo justo respecto a .tarjeta-hover */
.tarjeta-hover--pronto { background: transparent; border-style: dashed; } /* Sin relleno y con borde de rayitas: se lee como "aún no está" */
.tarjeta-hover--pronto:hover { transform: none; box-shadow: none; border-color: var(--linea); } /* Anula el salto: no hay nada que abrir */
.tarjeta-hover--pronto .tarjeta__numero { color: var(--linea); }    /* Número casi invisible */
.tarjeta-hover--pronto .tarjeta__estado { background: var(--fondo-alt); color: var(--texto-suave); } /* Pastilla gris en vez de lima */
.tarjeta-hover--pronto .titulot { color: var(--texto-suave); }

/* ---------------------------------------------------------
   LABORATORIO (demo del botón con función)
   --------------------------------------------------------- */
/* Dos columnas desiguales: la derecha (la demo) es un 15% más ancha.
   align-items: start impide que las dos columnas se estiren a la misma altura. */
.laboratorio { display: grid; grid-template-columns: 1fr 1.15fr; gap: 56px; align-items: start; }
/* El signo > significa "hijo directo". min-width: 0 desactiva el mínimo automático
   de grid y flex (que es "lo ancho que sea el contenido"): sin esto, un bloque de
   código largo ensancharía su columna y rompería el layout. */
.laboratorio > * { min-width: 0; }

/* La lista numerada de pasos. Los números NO están en el HTML: los cuenta el CSS */
.pasos { margin: 0; padding: 0; list-style: none; counter-reset: paso; } /* Quita la viñeta y crea un contador llamado "paso", empezando en 0 */
.pasos li { position: relative; padding: 16px 0 16px 48px; border-bottom: 1px solid var(--linea); color: var(--texto-suave); counter-increment: paso; } /* 48px de hueco a la izquierda para el número; counter-increment le suma 1 en cada <li> */
.pasos li:first-child { border-top: 1px solid var(--linea); } /* Solo el primero lleva raya arriba, para cerrar la lista por los dos extremos */
.pasos li::before {
  content: "0" counter(paso); /* Escribe un 0 y luego el valor actual del contador: 01, 02, 03... */
  position: absolute;         /* Se coloca respecto al <li>, que es relative */
  left: 0;                    /* En el hueco de 48px que dejó el padding */
  top: 13px;
  font-family: var(--mono);
  font-size: 20px;
  color: var(--acento);
}

/* La caja de demostración del botón con función */
.demo {
  padding: 32px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: var(--radio);
  transition: background-color .3s; /* El JS le cambia el fondo; esta línea hace que el cambio sea suave */
}
.demo__titulo { font-family: var(--titulos); font-weight: 600; font-size: 30px; letter-spacing: -.035em; color: var(--texto); }
.demo__texto { margin-top: 12px; color: var(--texto-suave); }
/* display: block quita el hueco fantasma que las imágenes tienen debajo por ser "inline" */
.demo__texto img { display: block; margin-top: 16px; border: 1px solid var(--linea); border-radius: 10px; }
.demo__acciones { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; }
/* Los hex sueltos (#1e1e1e, #252526) son los colores exactos de Visual Studio Code:
   no son de la paleta del sitio a propósito, imitan el editor */
.demo__codigo { margin-top: 14px; background: #1e1e1e; border: 1px solid var(--linea); border-radius: 10px; overflow: hidden; } /* overflow: hidden recorta el código en las esquinas redondeadas */
.demo__archivo { display: block; padding: 7px 14px; background: #252526; color: #cccccc; font-size: 12px; } /* La pestañita con el nombre del archivo */
/* overflow-x: auto = si una línea de código es muy larga, aparece una barra de
   scroll SOLO en este bloque, en vez de ensanchar la página entera */
.demo__codigo pre { margin: 0; padding: 12px 14px; overflow-x: auto; color: #d4d4d4; font-family: Consolas, "Cascadia Code", ui-monospace, monospace; font-size: 12.5px; line-height: 1.55; }

/* ---------------------------------------------------------
   LLAMADO A CONTACTO
   --------------------------------------------------------- */
/* La caja grande de "¿hablamos?" antes del pie */
.llamado {
  display: flex;
  flex-wrap: wrap;                /* En pantallas estrechas el botón baja debajo del texto */
  align-items: center;
  justify-content: space-between; /* Texto a un lado, botón al otro */
  gap: 32px;
  padding: 56px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  color: var(--texto);
  border-radius: 22px;            /* Más redondo que --radio: es la caja más grande de la página */
}
.llamado .seccion__titulo { color: var(--texto); } /* Reafirma el color del título dentro de esta caja */
.llamado p { margin-top: 10px; max-width: 48ch; color: var(--texto-suave); }

/* ---------------------------------------------------------
   PIE DE PÁGINA
   --------------------------------------------------------- */
.pie { border-top: 1px solid var(--linea); padding: 28px 0; font-size: 14px; color: var(--texto-suave); }
.pie__interior { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 16px; } /* Un texto a cada extremo, y si no caben, se apilan */

/* ---------------------------------------------------------
   PÁGINAS DE CURSOS
   --------------------------------------------------------- */
/* La almohadilla # selecciona por id. Un id solo puede existir UNA vez por
   página, así que sirve para cosas únicas como este contenedor. */
#contenedor {
  max-width: 860px;          /* Más estrecho que --ancho: son páginas de leer, no de ver */
  margin: 0 auto;            /* Centrado */
  padding: 64px 24px 96px;   /* Arriba / lados / abajo */
}
#titulop {
  font-family: var(--titulos);
  font-weight: 600;
  font-size: clamp(36px, 5.2vw, 56px); /* Se adapta al ancho de la ventana, entre 36px y 56px */
  line-height: 1.05;
  letter-spacing: -.04em;
  color: var(--texto);
}
/* margin con 3 valores: 10px arriba, 0 a los lados, 36px abajo */
.subtitulo { margin: 10px 0 36px; font-size: 18px; font-weight: 400; color: var(--texto-suave); }

/* El cartel de los cursos que aún no existen */
.en-construccion {
  margin: 8px 0 36px;
  padding: 48px 24px;
  text-align: center;
  color: var(--texto-suave);
  border: 1px dashed var(--linea); /* dashed = rayitas, el código visual de "provisional" */
  border-radius: var(--radio);
}
.en-construccion strong { display: block; font-family: var(--titulos); font-weight: 600; font-size: 24px; letter-spacing: -.03em; color: var(--texto); } /* display: block le da su propio renglón al <strong> */

/* ---------------------------------------------------------
   LAYOUT DEL CURSO: índice a la izquierda, tema a la derecha
   El índice se dibuja desde javascript/curso.js con datos/curso.js
   --------------------------------------------------------- */
.aula {
  display: grid;
  grid-template-columns: 260px minmax(0, 1fr); /* Columna 1: 260px fijos para el índice. Columna 2: el resto, pero con minmax(0,...) para que un bloque de código ancho no la infle */
  gap: 48px;              /* Separación entre las dos columnas */
  align-items: start;     /* Cada columna empieza arriba; si no, la corta se estiraría hasta igualar a la larga */
  max-width: var(--ancho);
  margin: 0 auto;
  padding: 40px 24px 96px;
}

/* ---- Índice ---- */
.aula__indice {
  position: sticky;                 /* Se queda fijo mientras el panel de la derecha hace scroll */
  top: 24px;                        /* Se pega a 24px del tope de la ventana */
  max-height: calc(100dvh - 48px);  /* dvh = altura REAL de la ventana en el móvil (descuenta la barra del navegador, cosa que vh no hace). Menos 24px arriba y 24 abajo */
  overflow-y: auto;                 /* Si los 14 temas no caben, el índice hace scroll por su cuenta */
  padding-right: 6px;               /* Hueco para que la barra de scroll no tape el texto */
}
.aula__nombre {
  font-family: var(--titulos);
  font-weight: 600;
  font-size: 21px;
  line-height: 1.2;
  letter-spacing: -.02em;
  color: var(--texto);
  margin-bottom: 16px;
}
/* El campo de búsqueda del temario */
.aula__buscar {
  width: 100%;              /* Ocupa los 260px de la columna */
  padding: 9px 14px;
  margin-bottom: 20px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 10px;
  font-family: var(--sans);  /* Los <input> tampoco heredan la tipografía: hay que repetirla */
  font-size: 14px;
  color: var(--texto);       /* Y el color del texto que escribes */
}
.aula__buscar::placeholder { color: var(--texto-suave); } /* ::placeholder pinta el texto de ejemplo ("Buscar tema"), no lo que escribes */
.aula__buscar:focus { outline: none; border-color: var(--acento); } /* Al hacer clic, en vez del recuadro del sistema se enciende el borde en lima */

/* El aviso que aparece cuando la búsqueda no encuentra ningún tema */
.aula__sinresultados {
  padding: 10px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--texto-suave);
}
.aula__sinresultados strong { color: var(--texto); } /* Resalta el texto buscado dentro del aviso */

.indice__modulo { margin-bottom: 22px; } /* Separación entre un módulo y el siguiente */
/* El encabezado de cada módulo: "FUNDAMENTOS   2/3" */
.indice__titulo {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 8px 10px;     /* 4 valores = arriba / derecha / abajo / izquierda, en el sentido del reloj */
  font-size: 12px;
  font-weight: 500;
  letter-spacing: .04em;    /* Separación extra porque va en mayúsculas */
  text-transform: uppercase;
  color: var(--texto-suave);
}
/* margin-left: auto se come todo el hueco libre a la izquierda y empuja el contador hasta la derecha del todo */
.indice__contador { margin-left: auto; font-size: 11px; letter-spacing: 0; }

/* El número correlativo del tema (01, 02, 03...). Lo calcula javascript/curso.js
   a partir de la posición en el array TEMAS, no está escrito en ningún sitio. */
.indice__numero {
  flex: none;              /* Atajo de flex-grow/shrink/basis: prohíbe que el número se encoja cuando el título es largo */
  min-width: 16px;         /* Ancho mínimo para que "01" y "10" queden alineados en columna */
  font-family: var(--mono);/* Ancho fijo: los dígitos ocupan lo mismo y la columna no baila */
  font-size: 12px;
  color: var(--linea);     /* Muy apagado: es un dato secundario */
}
.indice__tema--activo .indice__numero { color: var(--acento); }      /* El número del tema abierto se enciende */
a.indice__tema:hover .indice__numero { color: var(--texto-suave); }  /* Y se aclara un poco al pasar el cursor */

/* Cada tema del índice */
.indice__tema {
  display: flex;
  align-items: baseline;             /* Alinea por la línea sobre la que "se apoyan" las letras, no por el centro: así el número y el título quedan a la misma altura aunque midan distinto */
  gap: 8px;
  padding: 7px 10px;
  border-left: 2px solid transparent;/* Borde invisible reservado desde ya: si solo apareciera en el activo, el texto se movería 2px al seleccionarlo */
  border-radius: 0;
  font-size: 14px;
  line-height: 1.35;
  color: var(--texto-suave);
  text-decoration: none;
  transition: background-color .15s, color .15s;
}
/* El buscador esconde los temas poniéndoles el atributo hidden. El navegador
   trae de fábrica una regla [hidden] { display: none }, pero es más débil que
   el display: flex de aquí arriba y pierde: sin esta línea, los temas
   "ocultos" se seguirían viendo. */
.indice__tema[hidden] { display: none; }
/* a.indice__tema = solo los <a> con esa clase. Los temas "pronto" no son enlaces, así que no reaccionan */
a.indice__tema:hover { background: var(--fondo-alt); color: var(--texto); }
/* El tema que está abierto ahora mismo */
.indice__tema--activo {
  background: var(--acento-suave);   /* Fondo lima oscuro */
  border-left-color: var(--acento);  /* Se enciende la barrita de la izquierda que estaba transparente */
  color: var(--acento);
}
.indice__tema--pronto { color: var(--linea); cursor: default; } /* Tema sin contenido: casi invisible y sin manita */
/* El palomita ✓ de "ya lo vi", guardado en localStorage */
.indice__marca {
  flex: none;
  margin-left: auto;  /* Lo empuja al extremo derecho del tema */
  padding-left: 6px;
  font-size: 12px;
  color: var(--acento);
}

/* ---- Panel del tema ---- */
/* El panel donde el JS mete el HTML del tema. min-width: 0 otra vez, porque es
   una columna de grid y un <pre> largo podría ensancharla */
.aula__panel { min-width: 0; }
.tema__titulo {
  font-family: var(--titulos);
  font-weight: 600;
  font-size: clamp(28px, 3.4vw, 40px);
  line-height: 1.1;
  letter-spacing: -.03em;
  color: var(--texto);
}
/* Los mensajes de "Cargando…" o "Este tema aún no tiene contenido" */
.aula__aviso {
  padding: 48px 0;
  color: var(--texto-suave);
  line-height: 1.7;
}

/* La barra del final del tema: botón de "ya lo vi" + anterior/siguiente */
.tema__pie {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px;
  margin-top: 32px;
  padding-top: 24px;
  border-top: 1px solid var(--linea);
}
/* Estado del botón cuando el tema YA está marcado: se apaga a fondo lima oscuro */
.boton--hecho { background: var(--acento-suave); color: var(--acento); }
.boton--hecho:hover { background: var(--acento-suave); } /* Repite el mismo color para anular el hover heredado de .boton */
/* margin-left: auto manda este bloque al extremo derecho del pie */
.tema__navegacion {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-left: auto;
}
/* Los dos enlaces "← Anterior" y "Siguiente →" */
.tema__salto {
  padding: 8px 14px;
  border: 1px solid var(--linea);
  border-radius: 999px;
  font-size: 13px;
  color: var(--texto-suave);
  text-decoration: none;
}
.tema__salto:hover { border-color: var(--acento); color: var(--acento); }
.tema__salto--siguiente { color: var(--acento); } /* El de "siguiente" ya viene encendido: es el camino natural */

/* ---- Botón que abre el índice en celular ---- */
.aula__menu {
  display: none;        /* Escondido en escritorio; el @media de abajo lo enciende por debajo de 980px */
  position: fixed;      /* Fijo a la VENTANA, no a la página: no se mueve al hacer scroll */
  right: 20px;          /* Esquina inferior derecha, donde llega el pulgar */
  bottom: 20px;
  z-index: 20;          /* Por encima de todo lo demás (la barra usa 10) */
  padding: 12px 20px;
  background: var(--acento);
  border: 0;            /* Los <button> traen borde gris de fábrica; hay que quitarlo */
  border-radius: 999px;
  font-family: var(--sans);
  font-size: 14px;
  font-weight: 500;
  color: var(--sobre-acento);
  cursor: pointer;
}

/* inicio: pestañas */
/* PESTAÑAS (tabs)
   Este trozo es el que se muestra en el visor "¿Cómo hice esto?": el JS lee
   este archivo y recorta justo lo que hay entre "inicio: pestañas" y
   "fin: pestañas". Si mueves estos dos comentarios, el visor cambia. */
.contenedor-pestanas { border: 1px solid var(--linea); border-radius: 12px; overflow: hidden; } /* overflow: hidden recorta los botones en las esquinas redondeadas */
.botones-pestanas { display: flex; flex-wrap: wrap; background: var(--fondo-alt); border-bottom: 1px solid var(--linea); } /* La fila de botones */
.boton-tab {
  flex: 1 1 auto;            /* crecer / encoger / tamaño base. Los tres botones se reparten el ancho por igual */
  padding: 12px 18px;
  background: transparent;   /* Sin relleno: el fondo lo pone el contenedor */
  border: none;              /* Quita el borde de fábrica del <button> */
  font: inherit;             /* Hereda la tipografía del body, que un <button> no toma solo */
  font-size: 14px;
  font-weight: 600;
  color: var(--texto);
  cursor: pointer;
  transition: background-color .2s;
}
.boton-tab:hover { background: var(--superficie); }
/* Botón ACTIVO (seleccionado). La clase "activo" la pone y la quita el JavaScript
   con classList: el CSS solo describe cómo se ve cada estado */
.boton-tab.activo { background: var(--acento); color: var(--sobre-acento); }

/* 1. Ocultar todos los contenidos por defecto (display: none los saca del todo) */
.contenido-tab { display: none; padding: 24px; background: var(--superficie); }
/* 2. Mostrar el contenido que tenga la clase 'activo'. Esta pareja de reglas
   ES el mecanismo de las pestañas: mostrar uno y esconder los demás */
.contenido-tab.activo { display: block; }
.contenido-tab h3 { font-size: 20px; color: var(--texto); margin-bottom: 10px; }
.contenido-tab p { margin-bottom: 18px; color: var(--texto-suave); }
.contenido-tab .boton { margin: 0 8px 8px 0; } /* Aire a la derecha y abajo, por si hay varios botones seguidos */

/* Botón de lenguaje seleccionado: un .boton--borde que además tenga .activo.
   Dos clases pegadas sin espacio = el MISMO elemento tiene las dos */
.boton--borde.activo { background: var(--acento); border-color: var(--acento); color: var(--sobre-acento); }

/* VENTANA DE CÓDIGO (colores del tema oscuro de Visual Studio Code).
   Aquí los colores van en hex y no en variables a propósito: no son la paleta
   del sitio, son los del editor que se está imitando */
.ventana-codigo {
  margin-top: 16px;
  background: #1e1e1e;                              /* El gris del editor */
  border: 1px solid var(--linea);
  border-radius: 10px;
  overflow: hidden;
  box-shadow: 0 16px 36px -18px rgba(0, 0, 0, .6);  /* rgba: rojo, verde, azul y opacidad (0.6 = 60%) */
}
.ventana-codigo__pestanas { display: flex; background: #252526; } /* La barra gris de arriba */
.ventana-codigo__archivo {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 16px;
  background: #1e1e1e;                /* Igual que el cuerpo: parece que la pestaña y el código son una pieza */
  border-top: 2px solid var(--acento);/* La rayita de arriba que marca la pestaña abierta, como en VS Code */
  color: #fff;
  font-size: 13px;
}
/* El iconito del lenguaje, dibujado con ::before. Aquí solo se define el tipo de
   letra; QUÉ dibuja lo deciden las tres reglas siguientes */
.ventana-codigo__archivo::before { font-family: ui-monospace, Consolas, monospace; font-size: 12px; font-weight: 700; }
/* [data-lenguaje="html"] selecciona por atributo. El JS escribe ese atributo al
   abrir el visor, y el icono cambia solo, sin tocar más CSS */
.ventana-codigo[data-lenguaje="html"] .ventana-codigo__archivo::before { content: "<>"; color: #e37933; }
.ventana-codigo[data-lenguaje="css"] .ventana-codigo__archivo::before { content: "#"; color: #519aba; }
.ventana-codigo[data-lenguaje="javascript"] .ventana-codigo__archivo::before { content: "JS"; color: #cbcb41; }
.ventana-codigo__ruta { padding: 4px 16px 6px; font-size: 12px; color: #a9a9a9; } /* La miga de pan "Proyecto › carpeta › archivo" */
/* Dos columnas en fila: los números a la izquierda y el código a la derecha.
   max-height + overflow: auto = la ventana nunca pasa de 460px y hace scroll por dentro */
.ventana-codigo__cuerpo { display: flex; max-height: 460px; overflow: auto; }
.ventana-codigo__cuerpo pre {
  margin: 0;
  padding: 8px 0 16px;
  font-family: Consolas, "Cascadia Code", ui-monospace, monospace;
  font-size: 13px;
  line-height: 1.6;
  tab-size: 2;   /* Un tabulador se dibuja del ancho de 2 espacios en vez de 8 */
}
.ventana-codigo__numeros {
  position: sticky;               /* Al hacer scroll horizontal, la columna de números se queda pegada... */
  left: 0;                        /* ...al borde izquierdo */
  min-width: 52px;
  padding-right: 16px !important; /* !important pisa el padding del pre de arriba. Es un martillazo: solo se usa cuando de verdad hace falta */
  text-align: right;              /* Los números alineados a la derecha, como en cualquier editor */
  color: #6e7681;
  background: #1e1e1e;            /* Fondo propio, para que el código no se vea por debajo al hacer scroll */
  user-select: none;              /* No se pueden seleccionar: así al copiar el código no se llevan los números */
}
.ventana-codigo__texto { flex: 1; padding-right: 24px !important; color: #d4d4d4; } /* flex: 1 = se queda con todo el ancho que sobra */
/* Dentro del visor, <code> tiene que perder el estilo lima de la regla general:
   aquí es código de verdad, con su propio coloreado */
.ventana-codigo__texto code { padding: 0; background: none; color: inherit; font: inherit; border-radius: 0; }
.ventana-codigo__estado {
  display: flex;
  justify-content: space-between; /* Lenguaje a un lado, contador de líneas al otro */
  gap: 12px;
  padding: 3px 12px;
  background: var(--acento);
  color: var(--sobre-acento);
  font-size: 12px;
}

/* Colores de cada parte del código. El JavaScript envuelve cada trocito en un
   <span> con una de estas clases; el CSS solo dice de qué color va cada una */
.c-comentario { color: #6a9955; } /* Verde: comentarios */
.c-signo { color: #808080; }      /* Gris: llaves, puntos y comas, paréntesis */
.c-etiqueta { color: #569cd6; }   /* Azul: nombres de etiqueta HTML */
.c-atributo { color: #9cdcfe; }   /* Celeste: atributos (class, id, href) */
.c-texto { color: #ce9178; }      /* Naranja: cadenas de texto entre comillas */
.c-selector { color: #d7ba7d; }   /* Dorado: selectores de CSS */
.c-numero { color: #b5cea8; }     /* Verde claro: números */
.c-palabra { color: #569cd6; }    /* Azul: palabras reservadas (const, function) */
.c-control { color: #c586c0; }    /* Morado: control de flujo (if, else, return) */
.c-funcion { color: #dcdcaa; }    /* Amarillo: nombres de función */
.c-objeto { color: #4fc1ff; }     /* Azul brillante: objetos del navegador (document, console) */
.c-regex { color: #d16969; }      /* Rojo: expresiones regulares */
/* fin: pestañas */

/* TEMA: VARIABLES Y EXPRESIONES
   De aquí abajo están las piezas que usan los archivos de temas/*.html.
   Son clases compartidas: un bloque, una fórmula, una tarjeta... y cada tema
   las combina como necesite, en vez de tener CSS propio. */
.tema { margin-bottom: 20px; }
.tema__bloque { padding: 20px 0; border-bottom: 1px solid var(--linea); } /* Cada apartado del tema, separado por una raya */
.tema__bloque:first-child { padding-top: 4px; } /* El primero pega menos aire arriba, que ya lo da el título */
.tema__bloque h3 { font-size: 19px; color: var(--texto); margin-bottom: 8px; }
.tema__bloque p { color: var(--texto-suave); }
.tema__bloque strong { color: var(--texto); font-weight: 600; } /* Lo resaltado vuelve al color fuerte */

/* La cajita tipo "área = base × altura" */
.tema__formula {
  display: inline-flex;            /* Se ajusta a lo que mide la fórmula */
  align-items: center;
  gap: 10px;
  margin-top: 14px;
  padding: 10px 18px;
  background: var(--acento-suave);
  border-radius: 10px;
  font-family: var(--mono);
  color: var(--acento) !important; /* !important porque hereda de .tema__bloque p, que la pintaría de gris */
}
.tema__formula span { padding: 2px 10px; background: var(--superficie); border-radius: 6px; } /* Cada pieza de la fórmula, en su propia cajita */

/* Comparación lado a lado (lo que se hace bien vs. lo que se hace mal) */
.tema__comparacion { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-top: 14px; } /* Dos columnas iguales */
.tema__lista { display: flex; flex-wrap: wrap; gap: 6px; align-content: flex-start; padding: 14px; border-radius: 10px; } /* align-content: flex-start junta los renglones arriba en vez de repartirlos */
.tema__lista-titulo { width: 100%; font-size: 13px; font-weight: 600; } /* width: 100% obliga al título a ocupar un renglón entero, así los ejemplos empiezan debajo */
.tema__lista--bien { background: var(--acento-suave); }
.tema__lista--bien .tema__lista-titulo { color: var(--acento); }
.tema__lista--mal { background: color-mix(in srgb, var(--rojo) 12%, transparent); } /* Un 12% del rojo: un tinte suave, sin tener que inventar otro hex */
.tema__lista--mal .tema__lista-titulo { color: var(--rojo); }
.tema__lista--mal code { background: var(--superficie); color: var(--rojo); text-decoration: line-through; } /* Tachado: se ve de un vistazo que ese nombre no vale */
.tema__lista--bien code { background: var(--superficie); }

/* Rejilla de tarjetas explicativas */
.tema__tarjetas { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; margin-top: 14px; } /* Tres columnas por defecto */
.tema__tarjetas--dos { grid-template-columns: 1fr 1fr; }  /* Variante de dos columnas: solo cambia esa línea */
.tema__tarjeta { display: flex; flex-direction: column; gap: 8px; padding: 16px; background: var(--fondo); border: 1px solid var(--linea); border-radius: 10px; } /* Fondo más oscuro que el panel: la tarjeta se hunde en vez de sobresalir */
.tema__tarjeta h4 { font-size: 15px; color: var(--texto); }
.tema__tarjeta p { font-size: 14px; }
.tema__tarjeta > code { align-self: flex-start; background: var(--superficie); } /* align-self: flex-start impide que el <code> se estire a lo ancho de la tarjeta */
.tema__simbolos { display: flex; flex-wrap: wrap; gap: 6px; } /* La fila de símbolos (+, -, *, /) */
.tema__simbolos code { min-width: 34px; text-align: center; font-size: 15px; font-weight: 600; background: var(--superficie); border: 1px solid var(--linea); } /* min-width iguala todas las cajitas aunque el símbolo sea de una sola letra */
.tema__nota { margin-top: auto; font-size: 13px !important; } /* margin-top: auto la pega al fondo de la tarjeta, así las notas de varias tarjetas quedan a la misma altura */

/* Los bloques de pseudocódigo (PSeInt) */
.tema__pseudocodigo {
  margin: 14px 0 0;
  padding: 16px 20px;
  background: #1e1e1e;   /* Fondo de editor, como el visor de código */
  color: #d4d4d4;
  border: 1px solid var(--linea);
  border-radius: 10px;
  font-family: Consolas, "Cascadia Code", ui-monospace, monospace;
  font-size: 14px;
  line-height: 1.6;
  overflow-x: auto;      /* Scroll propio si una línea es larga. Ojo: el <pre> respeta los espacios TAL CUAL están escritos en el HTML, por eso en temas/*.html estos bloques van pegados al margen izquierdo */
}

/* TEMA: ESTRUCTURAS CONDICIONALES
   Los diagramas de flujo son SVG escritos a mano dentro del HTML del tema.
   Un SVG no usa background ni color: usa fill (relleno) y stroke (contorno).
   Como están en el HTML y no son imágenes, el CSS puede pintarlos con las
   variables del sitio y hasta resaltar una forma al ejecutar un caso. */
.simbolos-dfd { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; font-size: 14px; color: var(--texto); } /* La leyenda de símbolos, sin viñetas */
.simbolos-dfd li { display: flex; align-items: center; gap: 10px; }      /* Dibujo y texto en fila */
.simbolos-dfd svg { width: 40px; height: 24px; flex-shrink: 0; }         /* flex-shrink: 0 impide que el dibujito se aplaste si el texto es largo */
.simbolos-dfd svg * { fill: var(--superficie); stroke: var(--texto); stroke-width: 1.5; } /* El asterisco pinta TODAS las formas de dentro del svg de una vez */

.diagrama { width: 100%; max-width: 220px; height: auto; margin: 4px auto; } /* Se encoge con la tarjeta pero no pasa de 220px; auto a los lados lo centra */
.diagrama__forma { fill: var(--superficie); stroke: var(--texto); stroke-width: 1.5; } /* Cajas y rombos del diagrama */
.diagrama__forma--activa { fill: var(--acento-suave); stroke: var(--acento); }         /* El JS añade esta clase al camino que se ejecutó */
.diagrama__linea { fill: none; stroke: var(--texto-suave); stroke-width: 1.5; }         /* fill: none = la flecha es una línea, no una forma rellena */
.diagrama marker path { fill: var(--texto-suave); }                                    /* La puntita de la flecha (un <marker> de SVG) */
.diagrama text { font-family: var(--sans); font-size: 11px; fill: var(--texto); text-anchor: middle; } /* En SVG el color de la letra es fill, y text-anchor: middle es el "text-align: center" */
.diagrama .diagrama__etiqueta { font-size: 10px; font-weight: 600; fill: var(--acento); } /* Los "SÍ" y "NO" de cada salida del rombo */
.tema__tarjeta .tema__pseudocodigo { margin-top: auto; font-size: 13px; padding: 12px 14px; } /* Dentro de una tarjeta el pseudocódigo va más compacto y pegado abajo */

/* Los casos prácticos: enunciado a la izquierda, campos y consola a la derecha */
.caso { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px; padding: 16px; background: var(--fondo); border: 1px solid var(--linea); border-radius: 12px; }
.caso__numero { display: inline-block; margin-bottom: 6px; padding: 2px 10px; background: var(--acento); color: var(--sobre-acento); border-radius: 999px; font-size: 12px; font-weight: 600; } /* La pastilla "Caso 3". inline-block permite darle padding sin que ocupe todo el renglón */
.caso__info > p { font-size: 14px; }                              /* Solo los párrafos hijos directos, no los que estén más adentro */
.caso__prueba { display: flex; flex-direction: column; gap: 12px; }/* Campos arriba, consola abajo */
.caso__entradas { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; } /* flex-end alinea por abajo: el botón queda a la altura de los campos, no de sus etiquetas */
.caso__entradas label { display: flex; flex-direction: column; gap: 4px; font-family: var(--mono); font-size: 13px; color: var(--texto); } /* Etiqueta arriba y campo debajo, como una sola pieza */
.caso__entradas input {
  width: 90px;                    /* Son números cortos: no necesitan más */
  padding: 7px 10px;
  font: inherit;                  /* Los <input> tampoco heredan la tipografía */
  color: var(--texto);
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 8px;
}
/* Al hacer clic: se quita el recuadro del sistema y se pone un halo lima propio.
   box-shadow con 0 de desplazamiento y 3px de extensión dibuja un aro alrededor */
.caso__entradas input:focus { outline: none; border-color: var(--acento); box-shadow: 0 0 0 3px color-mix(in srgb, var(--acento) 25%, transparent); }
.caso__entradas .boton { margin: 0; } /* Quita cualquier margen heredado: aquí el aire lo pone el gap */

/* Ventana que imita la ejecución de PSeInt. Va en blanco a propósito, aunque
   el sitio sea oscuro: PSeInt se ve así, y el contraste ayuda a distinguir
   "esto es el programa corriendo" de "esto es la explicación" */
.consola { flex: 1; display: flex; flex-direction: column; background: #fff; border: 1px solid #c9c9c9; border-radius: 8px; overflow: hidden; }
.consola__barra { padding: 6px 12px; background: #f3f3f3; border-bottom: 1px solid #e0e0e0; font-size: 12px; color: #333; } /* La barra de título de la ventanita */
.consola__barra::before { content: "▶ "; color: #2e9e3e; } /* El triangulito verde de "ejecutar" */
/* white-space: pre-wrap respeta los saltos de línea y los espacios que escribe
   el JavaScript, pero además parte las líneas largas para que quepan */
.consola__pantalla { flex: 1; margin: 0; padding: 12px; min-height: 150px; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 1.55; color: #777; white-space: pre-wrap; }
.consola__sistema { color: #1f3fb5; }   /* Azul: mensajes del sistema */
.consola__entrada { color: #111; }      /* Negro: lo que "escribe" el usuario */
.consola__resultado { color: #1d7a2c; } /* Verde: lo que imprime el programa */
/* Variante --navegador: la misma consola, pero imitando la de Chrome */
.consola--navegador .consola__barra::before { content: "● "; color: #65a30d; } /* Un punto en vez del triángulo */
.consola--navegador .consola__resultado { color: #111; }                       /* La consola del navegador no pinta de verde */
.consola--navegador .consola__pantalla { min-height: 90px; }                   /* Más baja: los ejemplos de JS son más cortos */

/* TEMA: ESTRUCTURAS REPETITIVAS
   Recuadro donde los bucles dibujan sus figuras. Cada vuelta añade una
   pieza, igual que el document.body.innerHTML += de los ejemplos. */
.figura {
  flex: 1;                      /* Ocupa todo el alto que le sobre a la columna */
  display: flex;
  flex-wrap: wrap;              /* Sin filas, las piezas se acomodan solas y bajan de renglón */
  align-content: flex-start;    /* Las filas se apilan arriba en vez de repartirse por todo el alto */
  gap: 5px;
  min-height: 120px;            /* Para que el recuadro se vea aunque todavía no haya dibujado nada */
  padding: 14px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 8px;
  overflow: auto;               /* Si el usuario pide 20x20, se desplaza en vez de desbordarse */
}
/* Una fila del bucle exterior. width: 100% la obliga a ocupar el renglón
   entero, así el bucle interior queda siempre en su propia línea. */
.figura__fila { display: flex; gap: 5px; width: 100%; }
/* flex: none evita que las piezas se encojan cuando no caben: se prefiere
   que el recuadro se desplace antes que deformar la figura */
.figura__circulo { width: 20px; height: 20px; flex: none; border-radius: 50%; background: var(--acento); }  /* 50% de radio = círculo perfecto */
.figura__cuadrado { width: 20px; height: 20px; flex: none; border-radius: 3px; background: var(--acento); } /* El mismo tamaño, apenas redondeado */

/* MATEMÁTICA APLICADA — TEMA: NÚMEROS ENTEROS
   La recta numérica de los casos 1 y 2. Está hecha con elementos colocados
   en porcentajes y no con un SVG a propósito: un SVG escala su texto junto
   con el dibujo, y a 375px los números de la regla quedaban en 4px. Así la
   recta se estira con la columna y las letras miden siempre lo mismo. */
.recta {
  position: relative;           /* Es el origen de coordenadas de todo lo que va dentro */
  height: 92px;
  margin-top: 12px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 8px;
}
.recta__eje { position: absolute; left: 10px; right: 10px; top: 50px; height: 2px; background: var(--texto-suave); }
/* Las dos puntas de flecha, cada una un triángulo hecho con bordes: la recta
   no empieza ni acaba en el recuadro, sigue por los dos lados */
.recta__eje::before { content: ""; position: absolute; left: -1px; top: -3px; border: 4px solid transparent; border-right-color: var(--texto-suave); }
.recta__eje::after  { content: ""; position: absolute; right: -1px; top: -3px; border: 4px solid transparent; border-left-color: var(--texto-suave); }
/* Todo lo que se coloca sobre el eje comparte el mismo truco: el left en
   porcentaje marca el punto y translateX(-50%) centra la pieza justo en él */
.recta__marca { position: absolute; top: 44px; width: 1px; height: 14px; background: var(--linea); transform: translateX(-50%); }
.recta__cero { top: 40px; height: 22px; width: 2px; background: var(--texto); } /* La marca del cero va más alta y más clara: es la referencia de todo el tema */
.recta__numero { position: absolute; top: 64px; transform: translateX(-50%); font-family: var(--mono); font-size: 11px; color: var(--texto-suave); }
.recta__punto { position: absolute; top: 45px; width: 12px; height: 12px; margin-left: -6px; border-radius: 50%; background: var(--acento); } /* margin-left en vez de translateX: aquí el desplazamiento es fijo, media anchura del punto */
.recta__etiqueta { position: absolute; top: 16px; transform: translateX(-50%); white-space: nowrap; font-family: var(--mono); font-size: 12px; font-weight: 600; color: var(--acento); } /* nowrap: "a = -7" tiene que caber en un renglón aunque esté cerca del borde */
.recta__tramo { position: absolute; top: 48px; height: 6px; background: var(--acento); opacity: .35; } /* El trozo entre los dos puntos: eso es la distancia */


/* TEMA: ARREGLO DE DATOS
   El arreglo dibujado como una fila de celdas, con el índice debajo de cada
   una. Es la imagen que hay que tener en la cabeza al leer frutas[2]. */
.arreglo { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
.arreglo__celda { display: flex; flex-direction: column; align-items: center; gap: 4px; }
.arreglo__valor {
  min-width: 62px;
  padding: 8px 10px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 8px;
  font-family: var(--mono);
  font-size: 13px;
  text-align: center;
  color: var(--texto);
}
.arreglo__indice { font-family: var(--mono); font-size: 11px; color: var(--texto-suave); } /* El número de debajo: la posición, no el valor */
/* La celda que se está consultando ahora mismo */
.arreglo__celda--activa .arreglo__valor { background: var(--acento-suave); border-color: var(--acento); color: var(--acento); }
.arreglo__celda--activa .arreglo__indice { color: var(--acento); }

/* La galería del caso práctico: una lámina grande con el número de la imagen */
.galeria { flex: 1; display: flex; flex-direction: column; gap: 8px; }
.galeria__lamina {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 120px;
  background: var(--acento-suave);
  border: 1px solid var(--acento);
  border-radius: 8px;
  font-family: var(--mono);
  font-size: 44px;
  color: var(--acento);
}
.galeria__pie { font-family: var(--mono); font-size: 12px; color: var(--texto-suave); }

/* TEMAS: FUNCIONES Y APLICACIONES ------------------------------------------ */

/* Los cuatro cuadrados de colores del tema 12. Son los únicos colores fijos
   de la hoja que no salen de la paleta: aquí el color ES el contenido, porque
   la función tiene que decir de qué color es el cuadrado que estás tocando. */
.cuadros { display: flex; flex-wrap: wrap; gap: 8px; }
.cuadro {
  flex: 1;                /* Los cuatro se reparten el ancho por igual */
  min-width: 56px;        /* …pero sin encogerse tanto que no se puedan señalar */
  height: 72px;
  border: 1px solid var(--linea);
  border-radius: 8px;
  cursor: pointer;        /* La manita avisa de que el elemento reacciona */
  transition: transform .15s;
}
.cuadro:hover { transform: translateY(-3px); } /* Se levanta un poco: confirma que el ratón está encima */
.cuadro--rojo { background: #d94040; }
.cuadro--amarillo { background: #d9c040; }
.cuadro--verde { background: #3f9e4d; }
.cuadro--azul { background: #3f6ad9; }
.cuadros__respuesta { font-family: var(--mono); font-size: 13px; color: var(--texto-suave); }
.cuadros__respuesta strong { color: var(--acento); }

/* El visor del tema 13. El borde es grueso a propósito: init() lo cambia y
   hay que poder ver el cambio. */
.visor {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 130px;
  background: var(--fondo-alt);
  border: 3px solid var(--linea);   /* init() cambia este color y este grosor */
  border-radius: 8px;
  font-size: 56px;
  line-height: 1;
  cursor: pointer;
  transition: border-width .15s, border-color .15s;
}

/* Los grupos de botones de radio de los casos del sorteo y del vehículo */
.caso__opciones { display: flex; flex-wrap: wrap; gap: 6px 16px; }
.caso__opciones label { display: flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 13px; color: var(--texto); cursor: pointer; }
.caso__opciones input { accent-color: var(--acento); } /* accent-color pinta el propio control del navegador, sin tener que dibujarlo a mano */
.caso__opciones--grupos { flex-direction: column; gap: 10px; }
.grupo-opcion {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 16px;
  margin: 0;
  padding: 8px 12px;
  border: 1px solid var(--linea);
  border-radius: 8px;
}
/* El <legend> de un fieldset se coloca encima del borde por defecto; aquí se
   le da un fondo para que la línea no le pase por detrás del texto */
.grupo-opcion legend { padding: 0 6px; background: var(--fondo); font-size: 12px; color: var(--texto-suave); }

/* La escena del caso del vehículo: el JS le cambia el fondo, y al coche de
   dentro el margen y el tamaño de letra. */
.escena {
  display: flex;
  align-items: center;
  min-height: 110px;
  padding: 12px;
  background: var(--fondo-alt);
  border: 1px solid var(--linea);
  border-radius: 8px;
  transition: background .2s;
}
.escena__movil { display: block; font-size: 28px; line-height: 1; transition: font-size .2s, margin .2s; }

/* TEMA: ESTRUCTURAS CONDICIONALES SIMPLES Y DOBLES */
.tema__tarjeta { min-width: 0; } /* evita que el código largo ensanche la tarjeta (el mismo truco de .laboratorio > *) */
.tema__tarjeta > .boton { align-self: flex-start; margin: 0; } /* El botón se ajusta a su texto en vez de estirarse a lo ancho */
/* [data-lenguaje] a secas = "los que TENGAN ese atributo", sin importar su valor.
   Son los bloques que colorea el JavaScript */
.tema__tarjeta .tema__pseudocodigo[data-lenguaje] { margin-top: 4px; }
.caso__info, .caso__prueba { min-width: 0; } /* Las dos columnas del caso, otra vez a prueba de contenido ancho */

/* La tabla de la notación NSE */
.tabla-nse { width: 100%; border-collapse: collapse; font-size: 13px; background: var(--superficie); border: 1px solid var(--linea); border-radius: 8px; overflow: hidden; } /* border-collapse: collapse funde los bordes de celdas contiguas en una sola línea, en vez de dibujar dos */
.tabla-nse th { padding: 6px 10px; background: var(--fondo-alt); color: var(--texto); font-weight: 600; text-align: left; } /* Los <th> salen centrados de fábrica; aquí se alinean a la izquierda */
.tabla-nse td { padding: 4px 10px; border-top: 1px solid var(--linea); color: var(--texto-suave); }
.tabla-nse td:last-child, .tabla-nse th:last-child { text-align: right; } /* La última columna son números: a la derecha se leen mejor */
.tabla-nse tr.activo td { background: var(--acento-suave); color: var(--acento); font-weight: 600; } /* El JS marca la fila que corresponde al resultado del caso */

/* TEMA: HTML, CSS Y JAVASCRIPT */
/* Casi todos los campos de los casos guardan números de dos cifras, y por eso
   miden 90px. Los de este tema guardan frases enteras (un valor de CSS, una
   cadena de texto), así que necesitan más sitio. min() los deja crecer hasta
   240px, pero nunca más que el hueco disponible: en un móvil no desbordan */
.caso__entradas input.caso__campo--ancho { width: min(240px, 100%); }

/* La mini página sobre la que se prueban las reglas de CSS. Son un h4 y un p
   de verdad, apilados uno debajo del otro, para poder ver a cuál de los dos
   afecta cada selector */
.mini-pagina {
  padding: 14px 16px;
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 8px;
}
.mini-pagina h4 { margin-bottom: 6px; font-size: 16px; color: var(--texto); }
.mini-pagina p { margin: 0; color: var(--texto-suave); } /* margin: 0 para que el JS sea el único que mueva este párrafo */

/* ---------------------------------------------------------
   Un @media es una regla condicional: "aplica esto SOLO si...".
   max-width: 700px significa "si la ventana mide 700px o menos".
   Lo de arriba sigue valiendo; esto solo cambia lo que haga falta.
   --------------------------------------------------------- */
@media (max-width: 700px) {
  /* Todas las rejillas de varias columnas pasan a una sola: en un celular no
     caben dos, y una sola columna siempre se lee */
  .tema__comparacion, .tema__tarjetas, .tema__tarjetas--dos, .caso { grid-template-columns: 1fr; }
}

/* Por debajo de 980px el índice deja de ser una columna y pasa a
   abrirse con el botón flotante "Temas" */
@media (max-width: 980px) {
  .aula { grid-template-columns: 1fr; gap: 0; padding: 32px 20px 96px; } /* De dos columnas a una */
  .aula__indice {
    display: none;                          /* Escondido por defecto; lo abre el botón */
    position: static;                       /* Deja de ser sticky: en una sola columna no tiene sentido que se quede pegado */
    max-height: none;                       /* Y deja de tener scroll propio */
    margin-bottom: 32px;
    padding-bottom: 24px;
    border-bottom: 1px solid var(--linea);  /* Raya que lo separa del tema que viene debajo */
  }
  .aula__indice.abierto { display: block; } /* La clase "abierto" la pone y la quita el JS al pulsar el botón */
  .aula__menu { display: block; }           /* Aparece el botón flotante "☰ Temas" */
  .tema__navegacion { margin-left: 0; width: 100%; } /* Anterior/siguiente ocupan su propio renglón */
}

/* ---------------------------------------------------------
   VENTANA DE CONTACTO (se crea desde javascript/contacto.js)
   --------------------------------------------------------- */
/* Es un <dialog>, un elemento del navegador hecho para ventanas emergentes.
   Él solo se pone por encima de todo, atrapa el foco del teclado y se cierra
   con Escape: por eso no hace falta inventar nada con position y z-index. */
.ventana-contacto {
  width: min(1100px, calc(100vw - 32px));   /* min() elige el MENOR de los dos: 1100px en un monitor, o el ancho de la ventana menos 32px si es pequeña */
  height: min(880px, calc(100dvh - 32px));  /* Lo mismo con la altura. dvh mide la ventana real del móvil */
  max-width: none;                          /* El navegador limita los <dialog> al 90% de la pantalla; esto lo anula */
  max-height: none;
  padding: 0;                               /* Y también le quita el relleno que trae de fábrica */
  background: var(--superficie);
  border: 1px solid var(--linea);
  border-radius: 18px;
  overflow: hidden;
  box-shadow: 0 30px 80px -20px rgba(0, 0, 0, .7); /* Sombra grande: la ventana se despega del fondo */
}
/* [open] = el atributo que el navegador pone mientras el diálogo está abierto.
   El display tiene que ir aquí, porque un <dialog> cerrado es display: none */
.ventana-contacto[open] { display: flex; flex-direction: column; animation: aparecer .25s ease; }
/* ::backdrop es la capa que el navegador dibuja DETRÁS del diálogo. No existe en el HTML */
.ventana-contacto::backdrop { background: rgba(0, 0, 0, .6); backdrop-filter: blur(3px); }
.ventana-contacto__barra {
  display: flex;
  align-items: center;
  justify-content: space-between;  /* Título a la izquierda, acciones a la derecha */
  gap: 12px;
  padding: 10px 12px 10px 20px;    /* 4 valores: arriba / derecha / abajo / izquierda */
  border-bottom: 1px solid var(--linea);
  font-size: 14px;
  color: var(--texto-suave);
}
.ventana-contacto__acciones { display: flex; align-items: center; gap: 6px; }
.ventana-contacto__enlace { padding: 6px 12px; border-radius: 999px; font-size: 14px; color: var(--texto-suave); text-decoration: none; } /* "Abrir en pestaña nueva" */
.ventana-contacto__enlace:hover { background: var(--fondo-alt); color: var(--texto); }
.ventana-contacto__cerrar {
  width: 36px;
  height: 36px;
  border: 1px solid var(--linea);
  border-radius: 50%;    /* Ancho = alto + 50% de radio = círculo */
  background: var(--superficie);
  color: var(--texto);
  font-size: 15px;
  cursor: pointer;
}
.ventana-contacto__cerrar:hover { background: var(--fondo-alt); }
.ventana-contacto__marco { flex: 1; width: 100%; border: 0; } /* El <iframe> con la página de contacto: flex: 1 le da toda la altura que sobra */

/* Una animación con nombre: se declara aquí y se usa arriba con animation.
   from = cómo empieza, to = cómo acaba; el navegador rellena lo de en medio */
@keyframes aparecer {
  from { opacity: 0; transform: translateY(12px) scale(.98); } /* Invisible, 12px más abajo y un 2% más pequeña */
  to { opacity: 1; transform: none; }                          /* Visible y en su sitio */
}

/* ---------------------------------------------------------
   RESPONSIVE (tablet y celular)
   --------------------------------------------------------- */
/* Tablet: 860px o menos */
@media (max-width: 860px) {
  .ciclos { grid-template-columns: repeat(2, 1fr); }      /* De 3 columnas a 2 */
  .laboratorio { grid-template-columns: 1fr; gap: 32px; } /* Las dos columnas se apilan */
  .portada { padding: 72px 0 64px; }                      /* Menos aire: en una pantalla corta, el aire es espacio perdido */
  .seccion { padding: 72px 0; }
  .llamado { padding: 36px; }
}

/* Celular: 560px o menos */
@media (max-width: 560px) {
  .envoltura { padding: 0 16px; }            /* Menos margen lateral, para ganar ancho de lectura */
  .ciclos { grid-template-columns: 1fr; }    /* Y de 2 columnas a 1 */
  .barra__enlaces a { display: none; }       /* Los enlaces de la barra desaparecen; queda el logo y el botón */
  .logo { font-size: 20px; }
  .portada__acciones .boton { width: 100%; } /* Botones de ancho completo: más fáciles de tocar con el dedo */
  .cifras { gap: 28px; }
  .demo { padding: 24px; }
  .llamado { padding: 28px 22px; }
  #contenedor { padding: 40px 16px 72px; }
  .ventana-contacto { width: 100vw; height: 100dvh; border: 0; border-radius: 0; } /* La ventana pasa a pantalla completa: en un móvil no tiene sentido una ventanita flotante */
  .ventana-contacto__enlace { display: none; }
}

/* Esto NO mide la pantalla: mira una preferencia del sistema operativo.
   Quien tiene activado "reducir movimiento" (por mareo o vértigo) recibe la
   misma página sin una sola animación. Es accesibilidad, no un detalle. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; } /* El scroll vuelve a ser instantáneo */
  /* !important aquí sí está justificado: tiene que ganarle a cualquier
     transición declarada más arriba, sin excepción */
  *, *::before, *::after { transition: none !important; animation: none !important; }
}
