/* Short, consistent interaction feedback; branding stays with each event. */
.ems-scroll-progress {
    position: fixed;
    inset: 0 0 auto;
    height: 3px;
    z-index: 500;
    pointer-events: none;
    overflow: hidden;
}

.ems-scroll-progress[hidden] { display: none; }

.ems-scroll-progress-fill {
    width: 100%;
    height: 100%;
    background: var(--ems-scroll-color, #0757be);
    transform: scaleX(0);
    transform-origin: left center;
}

/* The shared top bar takes over the innovation navigation's older indicator. */
body:has(> .ems-scroll-progress:not([hidden])) .innovation-premium .innovation-event-nav::after {
    display: none;
}

@media (prefers-reduced-motion: no-preference) {
    :where(.btn, .summit-btn, .awards-button, .awards-text-link) {
        transition-timing-function: cubic-bezier(.22, 1, .36, 1);
    }

    :where(.btn, .summit-btn, .awards-button):active:not(:disabled) {
        scale: .985;
    }

}

/* These headers are readable in the first server render. Starting a CSS fade
   before the motion module loads, then another entrance after hydration,
   makes a page appear to blink twice. Deliberate public scene motion is owned
   by its own components; application headings stay stable from first paint. */
:is(.page-header, .member-page-header) { animation: none; }

@media (prefers-reduced-motion: reduce) {
    html { scroll-behavior: auto !important; }
}
