/*
 * Editorial effects: word-by-word section titles, toolkit marquee and a
 * scroll-linked timeline. Hidden starting states depend on `motion-ready` or
 * `is-visible`, so content stays readable without JavaScript and under
 * reduced-motion preferences.
 */

.split-word {
    display: inline-block;
    padding-bottom: 0.08em;
    margin-bottom: -0.08em;
    overflow: hidden;
    vertical-align: top;
}

.split-word > span {
    display: inline-block;
}

.motion-ready .split-word > span {
    transform: translate3d(0, 110%, 0);
    transition: transform 900ms var(--motion-ease-out) calc(var(--word-index, 0) * 70ms);
}

.motion-ready .is-visible .split-word > span {
    transform: translate3d(0, 0, 0);
}

.skill-marquee {
    position: relative;
    margin-top: 16px;
    overflow: hidden;
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
    mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

.motion-ready .skill-marquee {
    opacity: 0;
    transform: translate3d(0, 16px, 0);
    transition: opacity 700ms var(--motion-ease-out), transform 700ms var(--motion-ease-out);
}

.motion-ready .skill-marquee.is-visible {
    opacity: 1;
    transform: translate3d(0, 0, 0);
}

.skill-track {
    display: flex;
    width: max-content;
    animation: skill-marquee 42s linear infinite;
}

.skill-marquee:hover .skill-track {
    animation-play-state: paused;
}

.skill-marquee .skill-list {
    display: flex;
    flex: none;
    gap: 8px;
    margin: 0;
    padding: 0 8px 0 0;
    list-style: none;
}

.skill-marquee .skill-item {
    flex: none;
    min-width: 120px;
}

.motion-ready .skill-marquee .skill-item {
    opacity: 1;
}

@keyframes skill-marquee {
    from {
        transform: translate3d(0, 0, 0);
    }
    to {
        transform: translate3d(var(--marquee-shift, -50%), 0, 0);
    }
}

.timeline {
    position: relative;
}

.timeline::before {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 18px;
    z-index: 1;
    width: 1px;
    background: var(--gold);
    transform: scaleY(var(--timeline-progress, 0));
    transform-origin: 50% 0;
    content: '';
    pointer-events: none;
}

.timeline-item::before {
    z-index: 2;
}

.motion-ready .timeline-item::before {
    transform: scale(0);
    transition: transform 500ms var(--motion-ease-out);
}

.motion-ready .timeline-item.is-visible::before {
    transform: scale(1);
}

.live-dot {
    position: relative;
    display: inline-block;
    width: 6px;
    height: 6px;
    margin-left: 8px;
    border-radius: 50%;
    background: var(--gold);
    vertical-align: middle;
}

.live-dot::after {
    position: absolute;
    inset: -4px;
    border: 1px solid var(--gold);
    border-radius: 50%;
    animation: live-pulse 2200ms ease-out infinite;
    content: '';
}

@keyframes live-pulse {
    from {
        opacity: 0.8;
        transform: scale(0.6);
    }
    to {
        opacity: 0;
        transform: scale(2.2);
    }
}

@media (prefers-reduced-motion: reduce) {
    .skill-marquee {
        overflow: visible;
        -webkit-mask-image: none;
        mask-image: none;
    }

    .skill-track {
        display: block;
        width: auto;
    }

    .skill-marquee .skill-list {
        flex-wrap: wrap;
        padding-right: 0;
    }

    .skill-marquee .skill-list-echo {
        display: none;
    }

    .timeline::before {
        transform: none;
    }
}
