﻿/* =====================================================
   Akcadmia — componentes/portada.css
   Piezas que comparten todas las secciones de la portada: el ritmo vertical,
   la superficie alterna, la cabecera de cada sección y la aparición al
   desplazar.

   GLOBAL y no en un .cshtml.css: la portada está repartida en parciales, cada
   una con su CSS aislado, y estas reglas las usan todas. Con aislamiento
   habría que copiarlas una vez por parcial.
   ===================================================== */

/* === Sección ===
   Un solo ritmo vertical para toda la portada: crece con la pantalla hasta un
   tope, así que en móvil no quedan huecos enormes entre bloques y en
   escritorio las secciones respiran. */
.edu-portada-seccion {
    padding-block: clamp(3.5rem, 8vw, 6rem);
}

/* Superficie alterna: separa una sección de la vecina sin necesidad de líneas.
   En claro es el blanco sobre el lavanda de la página; en oscuro, un punto por
   encima del fondo y por debajo de las tarjetas, que siguen en #1E293B. */
.edu-portada-seccion--alterna {
    background-color: #FFFFFF;
}

[data-tema="oscuro"] .edu-portada-seccion--alterna {
    background-color: #131B2E;
}

/* === Cabecera de sección ===
   Antetítulo, título y entradilla, en ese orden de importancia. El antetítulo
   va en --edu-primario, que el tema oscuro ya voltea al índigo luminoso. */
.edu-portada-seccion__cabecera {
    max-width: 46rem;
    margin: 0 auto 2.75rem;
    text-align: center;
}

/* Variante para cuando la cabecera comparte fila con otro bloque. */
.edu-portada-seccion__cabecera--izquierda {
    max-width: none;
    margin: 0 0 2rem;
    text-align: left;
}

.edu-portada-seccion__antetitulo {
    margin: 0 0 .6rem;
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .16em;
    text-transform: uppercase;
    color: var(--edu-primario);
}

.edu-portada-seccion__titulo {
    margin: 0 0 .75rem;
    font-size: clamp(1.75rem, 1.25rem + 1.8vw, 2.5rem);
    font-weight: 700;
    line-height: 1.15;
    letter-spacing: -.02em;
}

.edu-portada-seccion__entradilla {
    margin: 0;
    font-size: 1.05rem;
    color: var(--edu-texto-suave);
}

/* Sobre una franja del color de marca, que es índigo en los dos temas: el
   antetítulo pasa a un lima pálido y la entradilla a blanco apenas atenuado. El
   lima de acción, sobre el índigo medio de bg-primary, se queda por debajo de
   4,5:1 en un texto de este cuerpo; el pálido lo supera y se sigue leyendo como
   lima. Sin contraparte oscura porque la franja tampoco cambia de familia. */
.edu-portada-seccion--marca .edu-portada-seccion__antetitulo {
    color: #D9F99D;
}

.edu-portada-seccion--marca .edu-portada-seccion__entradilla {
    color: rgba(255, 255, 255, .9);
}

/* === Aparición al desplazar ===
   El estado oculto solo existe cuando js/home/aparicion-portada.js marca la
   portada con --animada: sin el guion, sin IntersectionObserver o con la
   preferencia de menos movimiento, todo se ve desde el principio.

   El valor de data-revelar escalona la entrada de elementos vecinos sin
   escribir estilos en el marcado: 1, 2 y 3 llegan un poco después que el que
   no lleva valor. */
.edu-portada--animada [data-revelar] {
    opacity: 0;
    transform: translateY(1.5rem);
    transition: opacity .7s ease, transform .7s cubic-bezier(.2, .7, .2, 1);
}

.edu-portada--animada [data-revelar="1"] {
    transition-delay: .08s;
}

.edu-portada--animada [data-revelar="2"] {
    transition-delay: .16s;
}

.edu-portada--animada [data-revelar="3"] {
    transition-delay: .24s;
}

.edu-portada--animada [data-revelar].edu-portada--revelado {
    opacity: 1;
    transform: none;
}

@media (prefers-reduced-motion: reduce) {
    .edu-portada--animada [data-revelar] {
        opacity: 1;
        transform: none;
        transition: none;
    }
}

/* === Iconos de los botones de acción ===
   El cohete de "Empezar ahora" y el play de "Ver ciclos" se mueven allí donde
   aparezcan: el hero, el cierre y el aviso de que no hay ciclos. Van aquí,
   globales, porque esos botones viven en vistas distintas y una sola definición
   los mantiene iguales.

   En reposo hacen un gesto breve cada pocos segundos —el cohete se impulsa, el
   play emite un anillo— y el resto del tiempo están quietos: llaman la atención
   sin convertirse en ruido. Al pasar el cursor, o al llegar con el teclado, el
   gesto completo. Solo se anima transform y opacity, que el navegador mueve sin
   recalcular la página.

   line-height: 1 ajusta la caja del icono al dibujo: con la altura de línea del
   botón la caja sería más alta que el glifo y el anillo saldría ovalado. */
.edu-portada-cohete,
.edu-portada-play {
    position: relative;
    display: inline-block;
    line-height: 1;
}

.edu-portada-cohete {
    animation: edu-portada-cohete-reposo 3.6s ease-in-out infinite;
}

/* El anillo nace del contorno del icono, que ya es un círculo, y se desvanece al
   crecer: la señal de "reproducir" que se reconoce sin explicación. Toma el color
   del texto del botón, así que vale igual sobre el índigo que sobre el blanco. */
.edu-portada-play {
    transition: transform .25s ease;
}

    .edu-portada-play::after {
        content: "";
        position: absolute;
        inset: 0;
        border: 1.5px solid currentColor;
        border-radius: 50%;
        opacity: 0;
        pointer-events: none;
        animation: edu-portada-play-anillo 2.8s ease-out infinite;
    }

/* Despegue al llegar con el teclado. El del cursor va aparte, solo en equipos
   con ratón: en una pantalla táctil el hover se queda pegado tras tocar. */
.btn:focus-visible > .edu-portada-cohete {
    animation: edu-portada-cohete-despegue .9s cubic-bezier(.5, 0, .3, 1);
}

.btn:focus-visible > .edu-portada-play {
    transform: scale(1.12);
}

@media (hover: hover) {
    .btn:hover > .edu-portada-cohete {
        animation: edu-portada-cohete-despegue .9s cubic-bezier(.5, 0, .3, 1);
    }

    .btn:hover > .edu-portada-play {
        transform: scale(1.12);
    }

        .btn:hover > .edu-portada-play::after {
            animation-duration: 1.2s;
        }
}

/* Reposo: un impulso corto hacia donde apunta el cohete, y quieto el resto. */
@keyframes edu-portada-cohete-reposo {
    0%, 70%, 100% {
        transform: none;
    }

    76% {
        transform: translate(.12em, -.12em);
    }

    82% {
        transform: translate(-.04em, .04em);
    }

    88% {
        transform: translate(.06em, -.06em);
    }

    94% {
        transform: none;
    }
}

/* Despegue: sale por arriba a la derecha, se desvanece y vuelve a entrar desde
   abajo a la izquierda, de modo que acaba exactamente donde empezó. */
@keyframes edu-portada-cohete-despegue {
    0% {
        transform: none;
        opacity: 1;
    }

    40% {
        transform: translate(.9em, -.9em);
        opacity: 0;
    }

    41% {
        transform: translate(-.9em, .9em);
        opacity: 0;
    }

    100% {
        transform: none;
        opacity: 1;
    }
}

@keyframes edu-portada-play-anillo {
    0% {
        transform: scale(1);
        opacity: .7;
    }

    55%, 100% {
        transform: scale(1.9);
        opacity: 0;
    }
}

@media (prefers-reduced-motion: reduce) {
    .edu-portada-cohete,
    .edu-portada-play::after,
    .btn:focus-visible > .edu-portada-cohete,
    .btn:hover > .edu-portada-cohete {
        animation: none;
    }

    .edu-portada-play {
        transition: none;
    }
}