/* =========================================================================
   IUSF — style.css
   Tokens de diseño y estilos que Tailwind (utilitario) no cubre bien:
   tipografía a medida, glassmorphism, patrón de fondo, dark mode, FAB.
   ========================================================================= */

@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700&family=Work+Sans:wght@400;500;600;700&display=swap');

:root {
  --ink:        #121315; /* negro real del logotipo IUSF */
  --ink-deep:   #0A0B0C;
  --stone:      #F1EEE9;
  --stone-soft: #FAFAF8;
  --ochre:      #D82126; /* rojo real de Fe y Alegría */
  --ochre-dark: #B01A1F;
  --brick:      #8B3A3A;
  --text-ink:   #1A1B1D;
  --text-paper: #FAFAF8;
  --line:       rgba(18, 19, 21, 0.14);
  --line-dark:  rgba(250, 250, 248, 0.14);
}

html { scroll-behavior: smooth; }

body {
  font-family: 'Work Sans', system-ui, sans-serif;
  background: var(--stone-soft);
  color: var(--text-ink);
  transition: background-color .25s ease, color .25s ease;
}

.font-display {
  font-family: 'Fraunces', Georgia, serif;
  font-optical-sizing: auto;
}

/* ---------------------------------------------------------------------
   Modo oscuro — se activa con la clase .dark en <html>, persistida
   en localStorage por main.js. Redefine los tokens en vez de duplicar
   utilidades por todo el documento.
   --------------------------------------------------------------------- */
html.dark body {
  background: var(--ink-deep);
  color: var(--text-paper);
}

html.dark .surface-paper   { background: var(--ink); color: var(--text-paper); }
html.dark .surface-stone   { background: var(--ink-deep); color: var(--text-paper); }
html.dark .border-token    { border-color: var(--line-dark); }
html.dark .text-muted      { color: rgba(245, 242, 234, 0.65); }
html.dark .card-surface    { background: rgba(245, 242, 234, 0.04); border-color: var(--line-dark); }
html.dark .skeleton        { background: linear-gradient(90deg, rgba(255,255,255,.06) 25%, rgba(255,255,255,.12) 37%, rgba(255,255,255,.06) 63%); }

/* ---------------------------------------------------------------------
   Fachada real del instituto como fondo del hero — reemplaza el patrón
   abstracto por la identidad real del campus, con un degradado que
   garantiza contraste suficiente para el texto en cualquier punto.
   --------------------------------------------------------------------- */
.hero-fachada {
  background-image: url('../img/fachada-iusf.jpg');
  background-size: cover;
  background-position: center 65%;
}

/* Carrusel de imágenes del hero (admin/imagenes-hero.php) — varias capas
   apiladas que se cross-fadean entre sí; .hero-fachada de arriba queda
   como imagen de respaldo si aún no se ha subido ninguna. */
.hero-fachada-slide {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center 65%;
  opacity: 0;
  transition: opacity 1.6s ease;
}
.hero-fachada-slide.is-active {
  opacity: 1;
}

.hero-fachada-overlay {
  background: linear-gradient(
    100deg,
    rgba(18, 19, 21, 0.72) 0%,
    rgba(18, 19, 21, 0.55) 30%,
    rgba(18, 19, 21, 0.32) 55%,
    rgba(18, 19, 21, 0.14) 78%,
    rgba(18, 19, 21, 0.02) 100%
  );
}

html.dark .hero-fachada-overlay {
  background: linear-gradient(
    100deg,
    rgba(10, 11, 12, 0.75) 0%,
    rgba(10, 11, 12, 0.58) 30%,
    rgba(10, 11, 12, 0.34) 55%,
    rgba(10, 11, 12, 0.15) 78%,
    rgba(10, 11, 12, 0.02) 100%
  );
}

/* Respaldo de legibilidad para el texto del hero: con el overlay más
   claro (a pedido: "que la imagen se destaque"), este text-shadow
   mantiene el contraste sin tener que oscurecer la foto de nuevo. */
.hero-texto-seguro {
  text-shadow: 0 2px 16px rgba(0, 0, 0, 0.55), 0 1px 4px rgba(0, 0, 0, 0.4);
}

/* Variante para bandas con texto centrado (preinscripción, cursos,
   documentos, pagos, CTA final) — un tinte parejo en vez del degradado
   direccional del hero principal, porque aquí el texto no está a un lado. */
.hero-fachada-overlay-centro {
  background: linear-gradient(
    rgba(18, 19, 21, 0.60),
    rgba(18, 19, 21, 0.60)
  );
}
html.dark .hero-fachada-overlay-centro {
  background: linear-gradient(
    rgba(10, 11, 12, 0.62),
    rgba(10, 11, 12, 0.62)
  );
}

/* ---------------------------------------------------------------------
   Patrón "plano técnico" para el fondo del hero — remite a un
   documento de ingeniería/instituto técnico, no a un gradiente genérico.
   --------------------------------------------------------------------- */
.blueprint-grid {
  background-image:
    linear-gradient(rgba(250, 250, 248, 0.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(250, 250, 248, 0.06) 1px, transparent 1px);
  background-size: 42px 42px;
}

/* ---------------------------------------------------------------------
   Carnet (glassmorphism) — la pieza con más carácter visual del hero.
   --------------------------------------------------------------------- */
.carnet {
  background: linear-gradient(155deg, rgba(250,250,248,0.14), rgba(250,250,248,0.045));
  border: 1px solid rgba(250, 250, 248, 0.22);
  backdrop-filter: blur(18px);
  -webkit-backdrop-filter: blur(18px);
  box-shadow: 0 30px 60px -25px rgba(0,0,0,0.55);
}

.carnet-notch {
  background: var(--ochre);
}

/* Parallax: las capas se desplazan a distinta velocidad vía JS
   (transform), este estilo solo prepara la transición. */
.parallax-layer {
  will-change: transform;
  transition: transform .15s ease-out;
}

/* ---------------------------------------------------------------------
   Botones — micro-interacción de "ripple" añadida por JS (span.ripple)
   --------------------------------------------------------------------- */
.btn-ripple {
  position: relative;
  overflow: hidden;
}
.ripple-span {
  position: absolute;
  border-radius: 9999px;
  transform: scale(0);
  animation: ripple-anim .6s ease-out;
  background: rgba(255,255,255,0.45);
  pointer-events: none;
}
@keyframes ripple-anim {
  to { transform: scale(3.5); opacity: 0; }
}

/* ---------------------------------------------------------------------
   Skeleton loaders (noticias)
   --------------------------------------------------------------------- */
.skeleton {
  background: linear-gradient(90deg, #e7e5e1 25%, #f2f1ee 37%, #e7e5e1 63%);
  background-size: 400% 100%;
  animation: skeleton-loading 1.4s ease infinite;
}
@keyframes skeleton-loading {
  0% { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}

/* ---------------------------------------------------------------------
   FAB de WhatsApp
   --------------------------------------------------------------------- */
.fab-whatsapp {
  box-shadow: 0 12px 28px -8px rgba(19, 30, 43, 0.45);
}
.fab-ring {
  animation: fab-pulse 2.4s ease-out infinite;
}
@keyframes fab-pulse {
  0%   { box-shadow: 0 0 0 0 rgba(41, 171, 90, 0.45); }
  70%  { box-shadow: 0 0 0 16px rgba(41, 171, 90, 0); }
  100% { box-shadow: 0 0 0 0 rgba(41, 171, 90, 0); }
}

/* Accesibilidad: foco visible consistente, incluso con Tailwind reset */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: 2px solid var(--ochre);
  outline-offset: 2px;
}

/* Respeta preferencia de reducción de movimiento */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .fab-ring, .skeleton, .parallax-layer { animation: none !important; transition: none !important; }
}

/* Carrusel del carnet */
.carnet-track {
  display: flex;
  transition: transform .55s cubic-bezier(.65,0,.35,1);
}
.carnet-slide {
  flex: 0 0 100%;
}

/* =========================================================================
   Sistema de íconos "sello" — cuadros de borde recto (misma lógica que el
   resto del sitio: sin border-radius, como un documento oficial) con un
   ícono duotone adentro. Reemplaza los íconos sueltos de ph-regular por
   algo con más presencia, sin salirse de la identidad ya establecida.
   ========================================================================= */
.icon-seal {
  display: inline-grid;
  place-items: center;
  width: 34px;
  height: 34px;
  flex-shrink: 0;
  border: 1px solid var(--line);
  background: var(--stone-soft);
  color: var(--ochre-dark);
  transition: border-color .2s ease, background-color .2s ease, transform .2s ease;
}
.icon-seal i { font-size: 17px; }

.icon-seal-lg {
  width: 56px;
  height: 56px;
  border-width: 1.5px;
}
.icon-seal-lg i { font-size: 26px; }

.icon-seal-sm {
  width: 26px;
  height: 26px;
  border-width: 1px;
}
.icon-seal-sm i { font-size: 13px; }

/* Estado activo (ítem del sidebar actual): el sello se "estampa" en rojo sólido */
.icon-seal-activo {
  background: var(--ochre);
  border-color: var(--ochre);
  color: var(--stone-soft);
}

a:hover > .icon-seal,
button:hover > .icon-seal {
  border-color: var(--ochre);
  transform: translateY(-1px);
}

html.dark .icon-seal { background: rgba(245, 242, 234, 0.04); border-color: var(--line-dark); }

/* Dentro del sidebar (fondo oscuro fijo, sin importar modo claro/oscuro) el
   sello inactivo necesita su propio contraste — un cuadro casi transparente
   con borde tenue, en vez del fondo claro pensado para páginas de papel. */
#admin-sidebar .icon-seal:not(.bg-ink) {
  background: rgba(250, 250, 248, 0.06);
  border-color: rgba(250, 250, 248, 0.18);
  color: rgba(250, 250, 248, 0.85);
}
#admin-sidebar a:hover > .icon-seal:not(.bg-ink) {
  border-color: var(--ochre);
  background: rgba(216, 33, 38, 0.12);
}

/* ---------------------------------------------------------------------
   Subrayado editorial para enlaces de texto — se dibuja de izquierda a
   derecha en vez del subrayado nativo, más deliberado que un simple
   hover:underline.
   --------------------------------------------------------------------- */
.link-draw {
  position: relative;
  text-decoration: none;
}
.link-draw::after {
  content: '';
  position: absolute;
  left: 0; bottom: -1px;
  width: 100%; height: 1.5px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform .3s ease;
}
.link-draw:hover::after { transform: scaleX(1); }

/* ---------------------------------------------------------------------
   Tarjetas con elevación sutil al pasar el mouse — un solo tratamiento
   consistente para KPIs y tarjetas de reporte en vez de sombras genéricas
   repetidas por todo el panel.
   --------------------------------------------------------------------- */
.card-lift {
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
.card-lift:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 24px -16px rgba(18, 19, 21, 0.35);
  border-color: rgba(216, 33, 38, 0.35);
}

/* ---------------------------------------------------------------------
   Entrada escalonada — UN solo momento orquestado (ej. la fila de KPIs
   al cargar el dashboard), no animaciones sueltas en cada tarjeta.
   --------------------------------------------------------------------- */
.stagger-in > * {
  opacity: 0;
  transform: translateY(10px);
  animation: stagger-fade-up .5s ease forwards;
}
.stagger-in > *:nth-child(1) { animation-delay: .02s; }
.stagger-in > *:nth-child(2) { animation-delay: .08s; }
.stagger-in > *:nth-child(3) { animation-delay: .14s; }
.stagger-in > *:nth-child(4) { animation-delay: .20s; }
.stagger-in > *:nth-child(5) { animation-delay: .26s; }
@keyframes stagger-fade-up {
  to { opacity: 1; transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .stagger-in > * { animation: none !important; opacity: 1 !important; transform: none !important; }
  .card-lift:hover, a:hover > .icon-seal, button:hover > .icon-seal { transform: none !important; }
}

/* Línea de sección con "corte" diagonal sutil (no un divider genérico) */
.section-cut {
  clip-path: polygon(0 0, 100% 0, 100% 96%, 0 100%);
}

/* ---------------------------------------------------------------------
   Tarjetas de opción (preinscripcion.php) — radios/checkboxes rediseñados
   como tarjetas clickeables en vez de puntos + texto plano. Cada paso del
   formulario usa un color de acento distinto (definido aquí, no en
   Tailwind, porque son colores puntuales que no necesitan ser utilidades
   globales del sitio).
   --------------------------------------------------------------------- */
.option-card { background: #FAFAF8; }
.option-card:hover { background: var(--stone); }

.option-card-ochre  .option-card-input { accent-color: var(--ochre); }
.option-card-purple .option-card-input { accent-color: #6D28D9; }
.option-card-blue   .option-card-input { accent-color: #1D4ED8; }
.option-card-green  .option-card-input { accent-color: #0F7B3F; }
.option-card-teal   .option-card-input { accent-color: #0891B2; }
.option-card-amber  .option-card-input { accent-color: #B45309; }
.option-card-indigo .option-card-input { accent-color: #4338CA; }

.option-card-ochre:has(.option-card-input:checked)  { border-color: var(--ochre); background: rgba(216,33,38,0.08); }
.option-card-purple:has(.option-card-input:checked) { border-color: #6D28D9; background: rgba(109,40,217,0.08); }
.option-card-blue:has(.option-card-input:checked)   { border-color: #1D4ED8; background: rgba(29,78,216,0.08); }
.option-card-green:has(.option-card-input:checked)  { border-color: #0F7B3F; background: rgba(15,123,63,0.08); }
.option-card-teal:has(.option-card-input:checked)   { border-color: #0891B2; background: rgba(8,145,178,0.08); }
.option-card-amber:has(.option-card-input:checked)  { border-color: #B45309; background: rgba(180,83,9,0.08); }
.option-card-indigo:has(.option-card-input:checked) { border-color: #4338CA; background: rgba(67,56,202,0.08); }

/* Insignia de ícono del paso actual, en el encabezado de progreso */
.paso-badge { transition: background-color .25s ease, color .25s ease; }

/* ---------------------------------------------------------------------
   Controles tipo botón de pagos.php (método de pago, moneda) — variante
   de selección "interruptor" distinta a las tarjetas de preinscripción,
   a propósito: cada formulario usa una forma distinta.
   --------------------------------------------------------------------- */
.metodo-toggle { background: #FAFAF8; }
.metodo-toggle:hover { background: var(--stone); }
.metodo-toggle-activo {
  background: var(--ochre) !important;
  color: #FAFAF8 !important;
  border-color: var(--ochre) !important;
}

.moneda-toggle { background: #FAFAF8; color: #6b7280; }
.moneda-toggle:not(:first-child) { border-left: 1px solid var(--line); }
.moneda-toggle-activo {
  background: var(--ochre) !important;
  color: #FAFAF8 !important;
}

/* Selector V/E de la cédula (preinscripcion.php) — mismo criterio que los
   toggles de pagos.php: una sola clase de estado, nunca clases Tailwind
   fijas que puedan quedar compitiendo con ella. */
.tipo-cedula-btn { background: #FAFAF8; color: #6b7280; }
.tipo-cedula-btn:not(:first-child) { border-left: 1px solid var(--line); }
.tipo-cedula-btn:hover { background: var(--stone); }
.tipo-cedula-activo {
  background: var(--ochre) !important;
  color: #FAFAF8 !important;
}

/* ---------------------------------------------------------------------
   Contenido de páginas dinámicas (admin/paginas.php) — Tailwind resetea
   el estilo por defecto de párrafos/listas/enlaces, así que el HTML
   guardado desde el editor necesita estas reglas para verse legible.
   --------------------------------------------------------------------- */
.prose-pagina { line-height: 1.75; }
.prose-pagina p { margin-bottom: 1.25em; }
.prose-pagina h2 { font-family: 'Fraunces', Georgia, serif; font-size: 1.5rem; margin: 1.5em 0 0.6em; }
.prose-pagina h3 { font-family: 'Fraunces', Georgia, serif; font-size: 1.25rem; margin: 1.3em 0 0.5em; }
.prose-pagina ul, .prose-pagina ol { margin: 0 0 1.25em 1.5em; }
.prose-pagina ul { list-style: disc; }
.prose-pagina ol { list-style: decimal; }
.prose-pagina li { margin-bottom: 0.4em; }
.prose-pagina a { color: var(--ochre-dark); text-decoration: underline; }
.prose-pagina blockquote { border-left: 3px solid var(--ochre); padding-left: 1em; color: rgba(26,27,29,0.7); margin: 1.25em 0; }
.prose-pagina img { max-width: 100%; height: auto; margin: 1.25em 0; }
html.dark .prose-pagina blockquote { color: rgba(245,242,234,0.7); }
