Files
v10/packages/react/src/presets/video/minimal-skin.css
T

709 lines
18 KiB
CSS

/* ==========================================================================
Reset
========================================================================== */
.media-minimal-skin *,
.media-minimal-skin *::before,
.media-minimal-skin *::after {
box-sizing: border-box;
margin: 0;
}
.media-minimal-skin img,
.media-minimal-skin video,
.media-minimal-skin svg {
display: block;
max-width: 100%;
}
.media-minimal-skin button {
font: inherit;
}
@media (prefers-reduced-motion: no-preference) {
.media-minimal-skin {
interpolate-size: allow-keywords;
}
}
/* ==========================================================================
Root Container
========================================================================== */
.media-minimal-skin {
position: relative;
isolation: isolate;
container: media-root / inline-size;
overflow: clip;
border-radius: var(--media-border-radius, 0.75rem);
background: oklch(0 0 0);
font-family:
Inter Variable,
Inter,
ui-sans-serif,
system-ui,
sans-serif;
font-size: 0.8125rem;
line-height: 1.5;
letter-spacing: normal;
-webkit-font-smoothing: auto;
-moz-osx-font-smoothing: auto;
}
/* Border ring */
.media-minimal-skin::after {
content: "";
position: absolute;
inset: 0;
z-index: 10;
border-radius: inherit;
box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.15);
pointer-events: none;
}
@media (prefers-color-scheme: dark) {
.media-minimal-skin::after {
box-shadow: inset 0 0 0 1px oklch(1 0 0 / 0.15);
}
}
/* Fullscreen */
.media-minimal-skin:fullscreen {
border-radius: 0;
}
/* ==========================================================================
Media Element
========================================================================== */
.media-minimal-skin > video {
width: 100%;
height: 100%;
}
/* ==========================================================================
Poster Image
========================================================================== */
.media-minimal-skin > img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
transition: opacity 0.25s;
pointer-events: none;
}
.media-minimal-skin > img:not([data-visible]) {
opacity: 0;
}
/* ==========================================================================
Overlay / Scrim
========================================================================== */
.media-minimal-skin .media-overlay {
position: absolute;
inset: 0;
z-index: 1;
border-radius: inherit;
background-image: linear-gradient(to top, oklch(0 0 0 / 0.7), oklch(0 0 0 / 0.5) 7.5rem, oklch(0 0 0 / 0));
backdrop-filter: blur(0) saturate(1.2) brightness(0.9);
opacity: 0;
transition-property: opacity, backdrop-filter;
transition-duration: 500ms;
transition-delay: 500ms;
transition-timing-function: ease-out;
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
.media-minimal-skin .media-overlay {
transition-duration: 100ms;
}
}
.media-minimal-skin .media-controls[data-visible] ~ .media-overlay,
.media-minimal-skin .media-error[data-visible] ~ .media-overlay {
opacity: 1;
transition-duration: 150ms;
transition-delay: 0ms;
}
.media-minimal-skin .media-error[data-visible] ~ .media-overlay {
backdrop-filter: blur(8px) saturate(1.2) brightness(0.9);
}
/* ==========================================================================
Buffering Indicator
========================================================================== */
.media-minimal-skin .media-buffering-indicator {
position: absolute;
inset: 0;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
color: oklch(1 0 0);
pointer-events: none;
}
/* ==========================================================================
Error Dialog
========================================================================== */
.media-minimal-skin .media-error {
display: none;
}
.media-minimal-skin .media-error[data-visible] {
position: absolute;
inset: 0;
z-index: 20;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
}
.media-minimal-skin .media-error__dialog {
display: none;
transition-property: display, opacity, transform;
transition-duration: 500ms;
transition-delay: 100ms;
transition-behavior: allow-discrete;
transition-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-minimal-skin .media-error[data-visible] .media-error__dialog {
display: flex;
flex-direction: column;
gap: 0.75rem;
max-width: 16rem;
padding: 1rem;
color: oklch(1 0 0);
font-size: 0.875rem;
text-shadow: 0 1px 0 oklch(0 0 0 / 0.5);
pointer-events: auto;
transform: scale(1);
opacity: 1;
color: oklch(1 0 0);
@starting-style {
transform: scale(0.5);
opacity: 0;
}
}
.media-minimal-skin .media-error__content {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding: 0.375rem 0;
}
.media-minimal-skin .media-error__title {
font-weight: 600;
line-height: 1.25;
}
.media-minimal-skin .media-error__actions {
display: flex;
gap: 0.5rem;
}
.media-minimal-skin .media-error__actions > * {
flex: 1;
}
/* ==========================================================================
Controls
========================================================================== */
.media-minimal-skin .media-controls {
position: absolute;
bottom: 0;
inset-inline: 0;
z-index: 10;
container: media-controls / inline-size;
display: flex;
align-items: center;
gap: 0.5rem;
padding: 2rem 0.375rem 0.375rem 0.375rem;
color: oklch(1 0 0);
will-change: transform, filter, opacity;
transition-property: transform, filter, opacity;
transition-duration: 75ms;
transition-delay: 0ms;
transition-timing-function: ease-out;
}
.media-minimal-skin .media-controls:not([data-visible]) {
opacity: 0;
transform: translateY(100%);
filter: blur(8px);
transition-duration: 500ms;
transition-delay: 500ms;
pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
.media-minimal-skin .media-controls:not([data-visible]) {
scale: 1;
transform: translateY(0);
filter: blur(0);
transition-duration: 100ms;
}
}
@container media-root (width > 40rem) {
.media-minimal-skin .media-controls {
gap: 0.875rem;
padding: 2.5rem 0.75rem 0.75rem 0.75rem;
}
}
/* ==========================================================================
Time Controls & Display
========================================================================== */
.media-minimal-skin .media-time-controls {
display: flex;
flex-direction: row-reverse;
align-items: center;
flex: 1;
gap: 0.75rem;
}
.media-minimal-skin .media-time {
display: flex;
align-items: center;
gap: 0.25rem;
}
.media-minimal-skin .media-time__value {
font-variant-numeric: tabular-nums;
text-shadow: 0 1px 0 oklch(0 0 0 / 0.2);
}
.media-minimal-skin .media-time__value--current,
.media-minimal-skin .media-time__separator {
display: none;
}
@container media-controls (width > 28rem) {
.media-minimal-skin .media-time-controls {
flex-direction: row;
}
.media-minimal-skin .media-time__value--duration,
.media-minimal-skin .media-time__separator {
color: oklch(1 0 0 / 0.5);
}
.media-minimal-skin .media-time__value--current,
.media-minimal-skin .media-time__separator {
display: inline;
}
}
/* ==========================================================================
Button Groups
========================================================================== */
.media-minimal-skin .media-button-group {
display: flex;
align-items: center;
gap: 0.075rem;
}
@container media-root (width > 40rem) {
.media-minimal-skin .media-button-group {
gap: 0.125rem;
}
}
/* ==========================================================================
Buttons
========================================================================== */
/* Base button */
.media-minimal-skin .media-button {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 0.5rem 1rem;
background: oklch(1 0 0);
border: none;
border-radius: 0.5rem;
outline: 2px solid transparent;
outline-offset: -2px;
color: oklch(0 0 0);
font-weight: 500;
transition-property: background-color, color, outline-offset;
transition-duration: 150ms;
transition-timing-function: ease-out;
cursor: pointer;
user-select: none;
}
.media-minimal-skin .media-button:focus-visible {
outline-color: oklch(1 0 0);
outline-offset: 2px;
}
.media-minimal-skin .media-button[disabled] {
opacity: 0.5;
filter: grayscale(1);
cursor: not-allowed;
}
/* Icon button variant */
.media-minimal-skin .media-button--icon {
display: grid;
width: 2.375rem;
padding: 0;
aspect-ratio: 1;
background: transparent;
color: oklch(1 0 0);
}
.media-minimal-skin .media-button--icon:hover,
.media-minimal-skin .media-button--icon:focus-visible,
.media-minimal-skin .media-button--icon[aria-expanded="true"] {
color: oklch(1 0 0 / 0.8);
text-decoration: none;
}
.media-minimal-skin .media-button--icon .media-icon {
filter: drop-shadow(0 1px 0 oklch(0 0 0 / 0.25));
}
/* Seek button variant — hidden at small sizes */
@container media-controls (width < 28rem) {
.media-minimal-skin .media-button--seek {
display: none;
}
}
/* Playback rate button */
.media-minimal-skin .media-button--playback-rate {
padding: 0;
}
.media-minimal-skin .media-button--playback-rate span {
width: 4ch;
font-variant-numeric: tabular-nums;
}
/* ==========================================================================
Icons
========================================================================== */
.media-minimal-skin .media-icon__container {
position: relative;
}
.media-minimal-skin .media-icon {
flex-shrink: 0;
grid-area: 1 / 1;
width: 18px;
height: 18px;
transition-behavior: allow-discrete;
transition-property: display, opacity;
transition-duration: 150ms;
transition-timing-function: ease-out;
}
.media-minimal-skin .media-icon--hidden {
display: none;
opacity: 0;
}
.media-minimal-skin .media-icon--flipped {
scale: -1 1;
}
/* Seek icon label positioning */
.media-minimal-skin .media-icon--seek ~ .media-icon__label {
position: absolute;
right: 0;
bottom: -3px;
font-size: 0.75em;
font-weight: 480;
font-variant-numeric: tabular-nums;
}
.media-minimal-skin .media-icon--seek.media-icon--flipped ~ .media-icon__label {
right: unset;
left: 0;
}
/* ==========================================================================
Slider
========================================================================== */
.media-minimal-skin .media-slider {
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex: 1;
border-radius: calc(infinity * 1px);
outline: none;
}
/* Horizontal orientation */
.media-minimal-skin .media-slider[data-orientation="horizontal"] {
min-width: 5rem;
width: 100%;
height: 1.25rem;
}
/* Vertical orientation */
.media-minimal-skin .media-slider[data-orientation="vertical"] {
width: 1.25rem;
height: 4.5rem;
}
/* Track */
.media-minimal-skin .media-slider__track {
position: relative;
isolation: isolate;
overflow: hidden;
background-color: oklch(1 0 0 / 0.2);
border-radius: inherit;
box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
user-select: none;
}
.media-minimal-skin .media-slider__track[data-orientation="horizontal"] {
width: 100%;
height: 0.1875rem;
}
.media-minimal-skin .media-slider__track[data-orientation="vertical"] {
width: 0.1875rem;
height: 100%;
}
/* Thumb */
.media-minimal-skin .media-slider__thumb {
position: absolute;
transform: translate(-50%, -50%);
z-index: 10;
width: 0.75rem;
height: 0.75rem;
background-color: oklch(1 0 0);
border-radius: calc(infinity * 1px);
box-shadow:
0 0 0 1px oklch(0 0 0 / 0.1),
0 1px 3px 0 oklch(0 0 0 / 0.15),
0 1px 2px -1px oklch(0 0 0 / 0.15);
opacity: 0;
scale: 0.7;
transform-origin: center;
transition-property: opacity, scale, outline-offset;
transition-duration: 150ms;
transition-timing-function: ease-out;
user-select: none;
outline: 2px solid transparent;
outline-offset: -2px;
}
.media-minimal-skin .media-slider__thumb[data-orientation="horizontal"] {
top: 50%;
left: var(--media-slider-fill);
}
.media-minimal-skin .media-slider__thumb[data-orientation="vertical"] {
left: 50%;
top: calc(100% - var(--media-slider-fill));
}
.media-minimal-skin .media-slider__thumb:focus-visible {
outline-color: oklch(1 0 0);
outline-offset: 2px;
}
.media-minimal-skin .media-slider:hover .media-slider__thumb,
.media-minimal-skin .media-slider:focus-within .media-slider__thumb,
.media-minimal-skin .media-slider__thumb--persistent {
opacity: 1;
scale: 1;
}
/* Shared track fills */
.media-minimal-skin .media-slider__buffer,
.media-minimal-skin .media-slider__fill {
position: absolute;
border-radius: inherit;
pointer-events: none;
}
.media-minimal-skin .media-slider__buffer[data-orientation="horizontal"],
.media-minimal-skin .media-slider__fill[data-orientation="horizontal"] {
inset-block: 0;
left: 0;
}
.media-minimal-skin .media-slider__buffer[data-orientation="vertical"],
.media-minimal-skin .media-slider__fill[data-orientation="vertical"] {
inset-inline: 0;
bottom: 0;
}
/* Buffer */
.media-minimal-skin .media-slider__buffer {
background-color: oklch(1 0 0 / 0.2);
width: var(--media-slider-buffer, 0%);
transition-duration: 0.25s;
transition-timing-function: ease-out;
}
.media-default-skin .media-slider__buffer[data-orientation="horizontal"] {
width: var(--media-slider-buffer);
transition-property: width;
}
.media-default-skin .media-slider__buffer[data-orientation="vertical"] {
height: var(--media-slider-buffer);
transition-property: height;
}
/* Fill */
.media-minimal-skin .media-slider__fill {
background-color: oklch(1 0 0);
}
.media-minimal-skin .media-slider__fill[data-orientation="horizontal"] {
width: var(--media-slider-fill);
}
.media-minimal-skin .media-slider__fill[data-orientation="vertical"] {
height: var(--media-slider-fill);
}
/* Time display within slider */
.media-minimal-skin .media-slider__time-display {
font-variant-numeric: tabular-nums;
}
/* ==========================================================================
Popups & Animations
========================================================================== */
.media-minimal-skin .media-popup-animation {
opacity: 1;
transform: scale(1);
transform-origin: bottom;
filter: blur(0px);
transition-property: transform, scale, opacity, filter;
transition-duration: 200ms;
}
.media-minimal-skin .media-popup-animation[data-starting-style],
.media-minimal-skin .media-popup-animation[data-ending-style] {
opacity: 0;
transform: scale(0);
filter: blur(8px);
}
.media-minimal-skin .media-popup-animation[data-instant] {
transition-duration: 0ms;
}
.media-minimal-skin .media-popup {
margin: 0;
border: 0;
background: transparent;
--media-popover-side-offset: 0.5rem;
}
.media-minimal-skin .media-popup--volume {
padding: 0.25rem;
}
/* ==========================================================================
Tooltips
========================================================================== */
.media-minimal-skin .media-tooltip {
white-space: nowrap;
}
.media-minimal-skin .media-tooltip-popup {
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
background-color: oklch(1 0 0 / 0.1);
backdrop-filter: blur(64px) brightness(0.9) saturate(1.5);
box-shadow:
0 4px 6px -1px oklch(0 0 0 / 0.1),
0 2px 4px -2px oklch(0 0 0 / 0.1);
color: oklch(1 0 0);
font-size: 0.75rem;
}
@media (prefers-reduced-transparency: reduce) {
.media-minimal-skin .media-tooltip-popup {
background-color: oklch(0 0 0 / 0.7);
}
}
@media (prefers-contrast: more) {
.media-minimal-skin .media-tooltip-popup {
background-color: oklch(0 0 0 / 0.9);
}
}
/* ==========================================================================
Captions
========================================================================== */
.media-minimal-skin .media-captions {
position: absolute;
inset: auto 1rem 1.5rem 1rem;
z-index: 20;
font-size: 1rem;
text-wrap: balance;
pointer-events: none;
}
.media-minimal-skin .media-captions__container {
display: flex;
flex-direction: column;
align-items: center;
max-width: 42ch;
margin: 0 auto;
text-align: center;
}
.media-minimal-skin .media-captions__text {
display: block;
padding: 0.125rem 0.5rem;
color: oklch(1 0 0);
text-shadow:
0 0 1px oklch(0 0 0 / 0.7),
0 0 8px oklch(0 0 0 / 0.7);
text-align: center;
white-space: pre-wrap;
line-height: 1.2;
}
@media (prefers-contrast: more) {
.media-minimal-skin .media-captions__text {
background: oklch(0 0 0 / 0.7);
text-shadow: none;
box-decoration-break: clone;
}
}
.media-minimal-skin .media-captions__text > * {
display: inline;
}
/* Responsive caption sizing */
@container media-root (width > 20rem) {
.media-minimal-skin .media-captions {
font-size: 1.5rem;
}
}
@container media-root (width > 48rem) {
.media-minimal-skin .media-captions {
font-size: 1.875rem;
}
}
@container media-root (width > 80rem) {
.media-minimal-skin .media-captions {
font-size: 2.25rem;
}
}
/* Caption shifting styles (custom and native) */
.media-minimal-skin {
--media-caption-track-delay: 600ms;
--media-caption-track-y: -0.5rem;
}
.media-minimal-skin:has(.media-controls[data-visible]) {
--media-caption-track-delay: 25ms;
--media-caption-track-y: -3rem;
}
.media-minimal-skin .media-captions,
.media-minimal-skin video::-webkit-media-text-track-container {
/* NOTE: The delay must account for the controls delay/duration */
transition: transform 150ms ease-out;
transition-delay: var(--media-caption-track-delay);
}
.media-minimal-skin video::-webkit-media-text-track-container {
transform: translateY(var(--media-caption-track-y)) scale(0.98);
z-index: 1;
font-family: inherit;
}
/* When controls are visible, shift captions up to avoid overlap */
.media-minimal-skin .media-controls[data-visible] ~ .media-captions {
transform: translateY(calc(var(--media-caption-track-y) - 0.5rem));
}
@media (prefers-reduced-motion: reduce) {
.media-minimal-skin .media-captions,
.media-minimal-skin video::-webkit-media-text-track-container {
transition-duration: 50ms;
}
}