/* A small branded van follows the reading progress along the viewport edge. */
.ls-scroll-progress {
    --ls-van-width: 184px;
    position: fixed;
    z-index: 990;
    right: 0;
    bottom: 0;
    left: 0;
    height: calc(80px + env(safe-area-inset-bottom, 0px));
    overflow: hidden;
    visibility: hidden;
    pointer-events: none;
    user-select: none;
}

.ls-scroll-progress.is-visible {
    visibility: visible;
}

.ls-scroll-progress__track {
    position: absolute;
    right: 0;
    bottom: env(safe-area-inset-bottom, 0px);
    left: 0;
    height: 4px;
    background: #dce5ea;
}

.ls-scroll-progress__fill {
    width: 100%;
    height: 100%;
    background: #e9004c;
    transform: scaleX(0);
    transform-origin: left center;
}

.ls-scroll-progress__van {
    position: absolute;
    bottom: 3px;
    left: 0;
    width: var(--ls-van-width);
    line-height: 0;
    filter: drop-shadow(0 2px 2px rgb(0 38 62 / 16%));
    will-change: transform;
}

.ls-scroll-progress__van > svg {
    display: block;
    width: 100%;
    height: auto;
    overflow: visible;
}

.ls-scroll-progress__wheel {
    transform: rotate(var(--ls-wheel-angle, 0deg));
    transform-box: fill-box;
    transform-origin: center;
}

/* Pitch around the axle line; the nested body keeps its independent idle. */
.ls-scroll-progress__suspension {
    transform-box: view-box;
    transform-origin: 49% 85%;
    transform: rotate(0deg);
    transition: transform 200ms ease-out;
}

.ls-scroll-progress.is-driving .ls-scroll-progress__suspension {
    transform: rotate(-.85deg);
}

.ls-scroll-progress.is-braking .ls-scroll-progress__suspension {
    animation: ls-van-brake 520ms ease-in-out;
}

@keyframes ls-van-brake {
    0% { transform: rotate(-.85deg); }
    45% { transform: rotate(.65deg); }
    75% { transform: rotate(-.12deg); }
    100% { transform: rotate(0deg); }
}

/* Only the body idles: the tyres stay planted on the progress line. */
.ls-scroll-progress.is-visible .ls-scroll-progress__body {
    animation: ls-van-idle 820ms ease-in-out infinite;
}

@keyframes ls-van-idle {
    0%, 100% { transform: translateY(0); }
    25% { transform: translateY(-2px); }
    50% { transform: translateY(.6px); }
    75% { transform: translateY(-1.2px); }
}

/* Keep the final footer links above the van when the reader reaches the end. */
.ls-has-scroll-progress #bottom-bar {
    padding-bottom: calc(80px + env(safe-area-inset-bottom, 0px));
}

@media (max-width: 767px) {
    .ls-scroll-progress {
        --ls-van-width: 136px;
        height: calc(60px + env(safe-area-inset-bottom, 0px));
    }

    .ls-has-scroll-progress #bottom-bar {
        padding-bottom: calc(60px + env(safe-area-inset-bottom, 0px));
    }
}

@media (prefers-reduced-motion: reduce) {
    .ls-scroll-progress .ls-scroll-progress__suspension,
    .ls-scroll-progress.is-driving .ls-scroll-progress__suspension,
    .ls-scroll-progress.is-braking .ls-scroll-progress__suspension {
        transform: none;
        transition: none;
        animation: none;
    }

    .ls-scroll-progress.is-visible .ls-scroll-progress__body {
        animation: none;
    }

    .ls-scroll-progress__wheel {
        transform: none;
    }
}

@media print {
    .ls-scroll-progress {
        display: none;
    }

    .ls-has-scroll-progress #bottom-bar {
        padding-bottom: 0;
    }
}
