.wavelines-about {
    pointer-events: none;
    position: absolute;
    right: 0;
    width: 80vw;
    min-width: 1220px;
    height: 100%;
    z-index: 2;
}

/* ---- About: scroll-triggered entrance ----
   One rehearsed entrance per viewport. The signature waveline draws itself in,
   the ellipse settles behind, then heading -> copy -> button -> service list
   arrive in sequence. Everything below the `html.js` gate: with JS off (or a
   headless/no-JS renderer), the pre-states never apply and content ships fully
   visible. Reduced-motion resolves every state to its end value (see the
   prefers-reduced-motion block above).

   --ease-out-quint: confident deceleration, no bounce. */

/* The waveline only exists in the .js path so it can hold at offset until drawn. */
.js .wavelines-about path {
    stroke-dasharray: 2661;
    stroke-dashoffset: 2661;
}
.js .wavelines-about.is-drawn path {
    animation: wavy 2.8s cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

/* Pre-reveal resting state for the About content pieces. Each rises from a
   small offset with opacity; the reveal replaces this with a settle transition. */
.js #about .about-article h2,
.js #about .about-article p,
.js #about .about-div > a,
.js #about .about-service > li,
.js #about #resume-btn-mobile {
    opacity: 0;
    transform: translateY(28px);
    transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: var(--reveal-delay, 0s);
}

/* The ellipse blob: settles in from slightly-scaled + soft blur, giving the
   flat surface atmospheric depth without a shadow (Flat-By-Default Rule). */
.js #about .ellipse-about {
    opacity: 0;
    transform: translate(-50%, -50%) scale(0.82);
    filter: blur(14px);
    transition: opacity 1.1s ease, transform 1.1s cubic-bezier(0.22, 1, 0.36, 1),
    filter 1.1s ease;
    transition-delay: 0.1s;
}

/* Reveal: fire once the section is in view (class added by the observer). */
.js #about.is-visible .about-article h2,
.js #about.is-visible .about-article p,
.js #about.is-visible .about-div > a,
.js #about.is-visible .about-service > li,
.js #about.is-visible #resume-btn-mobile {
    opacity: 1;
    transform: translateY(0);
}
.js #about.is-visible .ellipse-about {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
    filter: blur(0);
}

/* Sequence: heading leads, copy and button follow, then the service list
   staggers item-by-item. Delays cap under ~1s of total choreography. */
.js #about.is-visible .about-article h2 {
    --reveal-delay: 0.35s;
}
.js #about.is-visible .about-article p {
    --reveal-delay: 0.48s;
}
.js #about.is-visible .about-div > a,
.js #about.is-visible #resume-btn-mobile {
    --reveal-delay: 0.62s;
}
/* Legitimate sibling stagger across the three service items. */
.js #about.is-visible .about-service > li:nth-child(1) {
    --reveal-delay: 0.7s;
}
.js #about.is-visible .about-service > li:nth-child(2) {
    --reveal-delay: 0.82s;
}
.js #about.is-visible .about-service > li:nth-child(3) {
    --reveal-delay: 0.94s;
}

.about-div {
    display: flex;
    flex-direction: column;
    align-items: center;
    color: white;
    position: relative;
}

#resume-btn-mobile {
    display: none;
}

.resume-btn-about {
    width: 110px;
    height: 28px;
    border: 2px solid white;
    background-color: transparent;
    border-radius: 30px;
    margin: 0;
    color: white;
    font-size: 1rem;
    cursor: pointer;
}
.resume-btn-about:hover {
    color: var(--purple);
    background-color: white;
    transition: all ease 0.3s;
}
.about-div > ul {
    color: white;
}

.about-article {
    text-align: center;
    max-width: 400px;
}
.about-article > p {
    text-align: center;
    font-size: 20px;
    width: 100%;
}

.ellipse-about {
    width: 45vw;
    max-width: 685px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: -1;
}

.about-service {
    color: white;
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 1em;
    max-width: 300px;
}
.about-service > li {
    margin: 0;
    padding-top: 1.2em;
    border-top: 1px solid rgba(255, 255, 255, 0.35);
}
.about-service > li:first-child {
    padding-top: 0;
    border-top: none;
}
.service-title {
    display: block;
    font-size: 20px;
    font-weight: bolder;
    line-height: 1.2;
}
.service-desc {
    display: block;
    margin-top: 0.4em;
    font-size: 16px;
    font-weight: 400;
    line-height: 1.45;
}
@media(max-width: 1120px) {
    .wavelines-about {
        display: none;
    }
    .ellipse-about {
        display: none;
    }
    .section:nth-child(2) {
        background: var(--purple);
    }
    .about-article {
        max-width: 600px;
    }
    .about-article p {
        font-size: 18px;
        max-width: unset;
        text-align: left;
    }

    .about-service > li {
        margin: 1em;
    }

    .about-service {
        margin: 0;
        padding: 0;
    }

    #resume-btn-monitor {
        display: none;
    }
    #resume-btn-mobile {
        display: unset;
    }
}

@media(max-width: 480px) {
    .about-article p,
    .article-projects p,
    .article-skills p {
        font-size: 16px;
    }
    .about-service > li {
        margin: 0.6em 1em;
        font-size: 18px;
    }
}