@import "./components/reset.css"; @import "./components/root.css"; @import "./components/surface.css"; @import "./components/media.css"; @import "./components/overlay.css"; @import "./components/buffering.css"; @import "./components/error.css"; @import "./components/controls.css"; @import "./components/time.css"; @import "./components/button.css"; @import "./components/button-group.css"; @import "./components/badge.css"; @import "./components/icons.css"; @import "./components/poster.css"; @import "./components/thumbnail.css"; @import "./components/slider.css"; @import "./components/popup.css"; @import "./components/menus.css"; @import "./components/captions.css"; @import "./components/input-feedback.css"; @import "../../shared/css/video/icon-state.css"; @import "../../shared/global/video/keyframes.css"; @import "../../shared/global/video/properties.css"; /* ========================================================================== Root ========================================================================== */ .media-default-skin--video { --media-spring-timing-function: linear( 0, 0.034 1.5%, 0.763 9.7%, 1.066 13.9%, 1.198 19.9%, 1.184 21.8%, 0.963 37.5%, 0.997 50.9%, 1 ); --media-border-color: oklch(0 0 0 / 0.1); --media-surface-background-color: oklch(1 0 0 / 0.1); --media-surface-inner-border-color: oklch(1 0 0 / 0.05); --media-surface-outer-border-color: oklch(0 0 0 / 0.1); --media-surface-shadow-color: oklch(0 0 0 / 0.15); --media-surface-backdrop-filter: blur(16px) saturate(1.5); --media-video-border-radius: var(--media-border-radius, 2rem); --media-controls-transition-duration: 100ms; --media-controls-transition-timing-function: ease-out; --media-error-dialog-transition-duration: 350ms; --media-error-dialog-transition-delay: 100ms; --media-error-dialog-transition-timing-function: var(--media-spring-timing-function); --media-popup-transition-duration: 100ms; --media-popup-transition-timing-function: ease-out; --media-tooltip-side-offset: 0.75rem; --media-tooltip-boundary-offset: 0.5rem; --media-popover-side-offset: 0.5rem; --media-popover-boundary-offset: 0.5rem; overflow: clip; background: oklch(0 0 0); @media (prefers-reduced-motion: reduce) { --media-error-dialog-transition-duration: 50ms; --media-error-dialog-transition-delay: 0ms; --media-error-dialog-transition-timing-function: ease-out; --media-popup-transition-duration: 0ms; } @media (prefers-color-scheme: dark) { --media-border-color: oklch(1 0 0 / 0.15); } @media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) { --media-surface-background-color: oklch(0 0 0); --media-surface-inner-border-color: oklch(1 0 0 / 0.25); --media-surface-outer-border-color: transparent; } &:has(.media-controls:not([data-visible])) { /* Slight delay to hide controls on non-touch devices after interaction */ @media (pointer: fine) { --media-controls-transition-duration: 300ms; } @media (pointer: coarse) { --media-controls-transition-duration: 150ms; } @media (prefers-reduced-motion: reduce) { --media-controls-transition-duration: 50ms; } } /* Inner border ring */ &::after { position: absolute; inset: 0; z-index: 10; pointer-events: none; content: ""; border-radius: inherit; box-shadow: inset 0 0 0 1px var(--media-border-color); } &:fullscreen { --media-border-radius: 0; } } /* ========================================================================== Error Dialog ========================================================================== */ .media-default-skin--video .media-error { position: absolute; inset: 0; z-index: 20; display: flex; align-items: center; justify-content: center; } .media-default-skin--video .media-error__dialog { display: flex; flex-direction: column; gap: 0.75rem; max-width: 18rem; padding: 0.75rem; color: oklch(1 0 0); text-shadow: 0 1px 0 oklch(0 0 0 / 0.25); border-radius: 1.75rem; transition-delay: var(--media-error-dialog-transition-delay); transition-timing-function: var(--media-error-dialog-transition-timing-function); transition-duration: var(--media-error-dialog-transition-duration); transition-property: opacity, scale; } .media-default-skin--video .media-error[data-starting-style] .media-error__dialog, .media-default-skin--video .media-error[data-ending-style] .media-error__dialog { opacity: 0; scale: 0.5; } .media-default-skin--video .media-error[data-ending-style] .media-error__dialog { transition-delay: 0ms; } .media-default-skin--video .media-error__content { display: flex; flex-direction: column; gap: 0.5rem; padding: 0.5rem 0.5rem 0.375rem; text-shadow: inherit; } .media-default-skin--video .media-error__title { font-size: 1rem; } /* ========================================================================== Controls (hide/show behavior) ========================================================================== */ .media-default-skin--video .media-controls { position: absolute; inset-inline: 0.5rem; bottom: 0.5rem; z-index: 10; flex-wrap: wrap; color: var(--media-color-primary, oklch(1 0 0)); transform-origin: bottom; transition-timing-function: var(--media-controls-transition-timing-function); transition-duration: var(--media-controls-transition-duration); @media (pointer: fine) { transition-property: scale, filter, opacity; will-change: scale, filter, opacity; } @media (pointer: coarse) { transition-property: scale, opacity; will-change: scale, opacity; } &:not([data-visible]) { pointer-events: none; opacity: 0; scale: 0.95; @media (pointer: fine) and (prefers-reduced-motion: no-preference) { filter: blur(8px); } @media (prefers-reduced-motion: reduce) { scale: 1; } } & .media-time-controls { flex: 0 0 100%; order: -1; padding-inline: 0.625rem; } & .media-button-group:first-child { flex: 1; text-align: left; } & .media-button-group:last-child { flex: 1; justify-content: end; } @container media-root (width > 42rem) { inset-inline: 0.75rem; bottom: 0.75rem; flex-wrap: nowrap; column-gap: 0.125rem; padding: 0.25rem; & .media-time-controls { flex: 1; order: unset; } & .media-button-group:first-child, & .media-button-group:last-child { flex: 0 0 auto; } } } .media-default-skin--video .media-error[data-open] ~ .media-controls { display: none; } /* Hide cursor when controls are hidden */ .media-default-skin--video:has(.media-controls:not([data-visible])) { cursor: none; } /* ========================================================================== Sliders ========================================================================== */ .media-default-skin--video .media-slider__track { background-color: oklch(1 0 0 / 0.2); box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05); } .media-default-skin--video .media-slider__thumbnail { --media-slider-thumbnail-max-width: 11rem; --media-slider-thumbnail-padding: -1.125rem; /** Inset is the difference between the container width and the slider (100%) width. Divided by 2 as we render the time on both sides. */ --media-slider-thumbnail-inset: calc((100cqi - 100%) / 2); position: absolute; bottom: calc(100% + 1.2rem); left: clamp( calc( var(--media-slider-thumbnail-max-width) / 2 + var(--media-slider-thumbnail-padding) - var(--media-slider-thumbnail-inset) ), var(--media-slider-pointer), calc( 100% - var(--media-slider-thumbnail-max-width) / 2 - var(--media-slider-thumbnail-padding) + var(--media-slider-thumbnail-inset) ) ); pointer-events: none; opacity: 0; filter: blur(8px); transform-origin: bottom; scale: 0.8; translate: -50%; transition-timing-function: ease-out; transition-duration: 150ms; transition-property: scale, opacity, filter; & .media-thumbnail__image { max-width: var(--media-slider-thumbnail-max-width); } &:has(.media-thumbnail__image[data-loading]) { max-height: 6rem; } } .media-default-skin--video .media-slider[data-pointing] .media-slider__thumbnail:has([role="img"]:not([data-hidden])) { opacity: 1; filter: blur(0); scale: 1; } .media-default-skin--video .media-slider__thumbnail:has([role="img"]:not([data-hidden])) + .media-slider__preview .media-slider__value { display: none; }