@7sage/vidstack
Version:
UI component library for building high-quality, accessible video and audio experiences on the web.
591 lines (496 loc) • 16.1 kB
CSS
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Video Layout
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
[data-media-player] .vds-video-layout:not([data-match]) {
display: none ;
}
[data-media-player][data-layout='video'] {
background-color: var(--video-bg, black);
}
[data-media-player][data-layout='video']:not([data-fullscreen]) {
border-radius: var(--video-border-radius, 6px);
border: var(--video-border, 1px solid rgb(255 255 255 / 0.1));
}
:where(.vds-video-layout) {
--media-brand: var(--video-brand, #f5f5f5);
--media-font-family: var(--video-font-family, sans-serif);
--media-controls-color: var(--video-controls-color, #f5f5f5);
--media-tooltip-y-offset: 6px;
--media-menu-y-offset: 6px;
--media-focus-ring-color: var(--video-focus-ring-color, rgb(78 156 246));
--media-focus-ring: var(--video-focus-ring, 0 0 0 3px var(--media-focus-ring-color));
color: var(--video-controls-color, #f5f5f5);
display: contents;
}
:where([data-media-player][data-focus]:not([data-playing]) .vds-video-layout .vds-controls) {
border-radius: var(--video-border-radius, 6px);
box-shadow: var(--media-focus-ring);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Controls
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-controls[data-visible]) {
border-radius: var(--video-border-radius, 6px);
background-image: linear-gradient(
to top,
rgb(0 0 0 / 0.6),
10%,
transparent,
95%,
rgb(0 0 0 / 0.3)
);
}
.vds-video-layout .vds-controls-group {
align-items: center;
display: flex;
pointer-events: auto;
z-index: 0;
padding: 4px 6px;
}
.vds-video-layout .vds-controls-group:first-child {
z-index: 50;
}
/* second last group */
.vds-video-layout .vds-controls-group:nth-last-child(2) {
padding: 0 12px;
z-index: 11;
margin-bottom: -16px;
}
.vds-video-layout:not([data-sm]) .vds-controls-group:last-child {
--media-menu-y-offset: 26px;
--media-tooltip-y-offset: 26px;
--media-slider-preview-offset: 26px;
z-index: 10;
}
:where(.vds-video-layout .vds-button) {
margin-right: 2.5px;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Title
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout[data-sm] .vds-chapter-title) {
font-size: var(--video-sm-chapter-title-font-size, 15px);
}
:where([data-fullscreen] .vds-video-layout .vds-chapter-title) {
font-size: var(--video-fullscreen-chapter-title-font-size, 16px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Buttons
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout:not([data-sm]) .vds-mute-button) {
margin-left: -2.5px;
margin-right: -5px;
}
:where(.vds-video-layout[data-sm]) {
--media-button-size: var(--video-sm-button-size, 36px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Sliders
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-time-slider) {
--media-slider-height: 45px;
flex-grow: 0;
}
:where(.vds-video-layout .vds-slider-thumbnail) {
--media-thumbnail-border: var(--video-slider-thumbnail-border, 1px solid #f5f5f5);
border-radius: var(--video-slider-thumbnail-border-radius, 2px);
}
.vds-video-layout .vds-time-slider .vds-slider-value {
background-color: var(--video-time-bg, unset);
text-shadow:
-1px -1px 0 #333333,
1px -1px 0 #333333,
-1px 1px 0 #333333,
1px 1px 0 #333333;
}
:where(.vds-video-layout[data-sm] .vds-time) {
text-shadow: unset;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Large Layout Volume Slider
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout[data-lg] .vds-volume) {
--gap: var(--video-volume-gap, 10px);
display: contents;
}
:where(.vds-video-layout[data-lg] .vds-volume-popup) {
display: contents;
}
:where(.vds-video-layout[data-lg] .vds-volume-slider) {
margin: 0;
max-width: 0;
transition: all 0.15s ease;
}
:where(.vds-video-layout[data-lg] .vds-volume[data-active] .vds-volume-slider),
:where(.vds-video-layout[data-lg] .vds-volume:has([data-active]) .vds-volume-slider) {
margin-left: var(--gap);
opacity: 1;
visibility: visible;
max-width: var(--video-volume-slider-max-width, 72px);
}
/* safe area. */
.vds-video-layout[data-lg] .vds-volume-slider::after {
content: '';
position: fixed;
top: 0;
left: calc(-1 * var(--gap));
width: var(--gap);
height: 100%;
z-index: 1;
pointer-events: auto;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Small Layout Volume Slider
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout[data-sm] .vds-volume) {
--media-slider-height: var(--video-volume-height, 96px);
--media-slider-preview-offset: calc(-200% - 6px);
--gap: var(--video-volume-gap, 10px);
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
:where(.vds-video-layout[data-sm] .vds-volume-popup) {
display: block;
position: absolute;
top: calc(100% + var(--gap));
left: 50%;
opacity: 0;
transform: translateX(-50%);
transition:
opacity 150ms ease-out,
visibility 150ms ease-out;
border-radius: var(--video-volume-border-radius, 8px);
filter: var(--media-volume-filter, drop-shadow(0 1px 1px rgb(0 0 0 / 0.05)));
visibility: hidden;
}
/* safe area. */
.vds-video-layout[data-sm] .vds-mute-button::after {
content: '';
position: fixed;
bottom: calc(-1 * var(--gap));
right: 0;
width: 100%;
height: var(--gap);
z-index: 1;
pointer-events: auto;
}
.vds-video-layout .vds-volume-popup {
background-color: var(--video-volume-bg, var(--media-menu-bg, var(--default-bg)));
border: var(--video-volume-border, var(--default-border));
}
.light .vds-video-layout .vds-volume-popup,
.vds-video-layout.light .vds-volume-popup {
--default-bg: rgb(250 250 250);
--default-border: 1px solid rgb(10 10 10 / 0.1);
}
.dark .vds-video-layout .vds-volume-popup,
.vds-video-layout.dark .vds-volume-popup {
--default-bg: rgb(10 10 10);
--default-border: 1px solid rgb(255 255 255 / 0.1);
}
:where(.vds-video-layout[data-sm] .vds-volume[data-active] .vds-volume-popup),
:where(.vds-video-layout[data-sm] .vds-volume:has([data-active]) .vds-volume-popup) {
transition:
opacity 150ms ease-in,
visibility 150ms ease-in;
opacity: 1;
visibility: visible;
}
:where(.vds-video-layout[data-sm] .vds-volume[data-active] .vds-tooltip-content) {
display: none ;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Time
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-time[data-type='current']) {
margin-right: 2px;
}
:where(.vds-video-layout .vds-time[data-type='current'][remainder]) {
margin-left: 2px;
}
.vds-video-layout .vds-time {
--default-color: #f5f5f5 ;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Captions
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where([data-preview] .vds-video-layout .vds-captions) {
opacity: 0;
}
:where(.vds-video-layout .vds-captions) {
z-index: 10;
transition: var(--video-captions-transition, bottom 0.3s ease-in-out);
}
@media (min-width: 980px) {
:where([data-fullscreen] .vds-video-layout .vds-captions) {
bottom: var(--video-lg-fullscreen-captions-offset, 54px);
}
}
:where([data-media-player][data-controls] .vds-video-layout .vds-captions) {
bottom: var(--video-captions-offset, 78px);
}
:where([data-media-player][data-controls] .vds-video-layout[data-sm] .vds-captions) {
bottom: var(--video-sm-captions-offset, 48px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Chapters
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-time-slider .vds-slider-chapter-title) {
width: 100%;
text-align: center;
text-shadow:
-1px -1px 0 #212121,
1px -1px 0 #212121,
-1px 1px 0 #212121,
1px 1px 0 #212121;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Gestures
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-gesture) {
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
}
:where(.vds-video-layout .vds-gesture[action='seek:-10']) {
width: var(--video-gesture-seek-width, 20%);
z-index: 1;
}
:where(.vds-video-layout .vds-gesture[action='seek:10']) {
left: unset;
right: 0;
width: var(--video-gesture-seek-width, 20%);
z-index: 1;
}
@media (pointer: coarse) {
:where(.vds-video-layout .vds-gesture[action='toggle:paused']) {
display: none;
}
}
@media not (pointer: coarse) {
:where([data-media-player] .vds-video-layout .vds-gesture[action='toggle:controls']) {
display: none;
}
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Live Button
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-live-button) {
margin-left: 12px;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Time Group
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout:not([data-sm]) .vds-time-group) {
margin-left: 10px;
}
:where(.vds-video-layout[data-sm] .vds-time) {
font-size: var(--video-sm-time-font-size, 14px);
}
:where([data-fullscreen] .vds-video-layout .vds-time) {
font-size: var(--video-fullscreen-time-font-size, 16px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Load Container
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout .vds-load-container) {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
display: none;
align-items: center;
justify-content: center;
pointer-events: none;
z-index: 99;
}
:where(
[data-media-player][data-load='play']:not([data-started])
.vds-video-layout[data-match]
.vds-load-container
) {
display: flex;
}
:where(.vds-video-layout .vds-load-container .vds-play-button) {
--size: var(--video-load-button-size, 56px);
--color: var(--video-load-button-color, rgb(0 0 0 / 0.8));
--bg-color: var(--video-load-button-bg, var(--media-brand));
--media-button-hover-transform: 0;
--media-button-border: var(--video-load-button-border, var(--color));
--media-button-hover-bg: var(--video-load-button-bg, var(--media-brand));
width: var(--size);
height: var(--size);
pointer-events: auto;
margin-bottom: 2px;
overflow: hidden;
}
.vds-video-layout .vds-load-container .vds-play-button {
border-radius: var(--video-load-button-border-radius, 100%);
color: var(--color);
}
.vds-video-layout .vds-load-container .vds-play-button {
background-color: var(--bg-color);
}
:where(.vds-video-layout[data-sm] .vds-load-container .vds-play-button) {
--size: var(--video-sm-load-button-size, 48px);
--media-button-hover-transform: translateY(0%);
width: var(--size);
height: var(--size);
transform: translateY(0%);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Small Layout
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-video-layout[data-sm] .vds-controls-group:nth-last-child(2)) {
pointer-events: none;
}
:where(.vds-video-layout[data-sm] .vds-controls-group:last-child) {
z-index: 2;
margin-top: -2.5px;
margin-bottom: -6px;
}
:where([data-fullscreen] .vds-video-layout[data-sm] .vds-controls-group:last-child) {
margin-bottom: 0;
}
.vds-video-layout[data-sm] .vds-controls-group {
padding: 2px;
}
:where(.vds-video-layout[data-sm])
:where(
.vds-button,
.vds-slider:not(.vds-time-slider),
.vds-time,
.vds-time-divider,
.vds-chapter-title
) {
transition: opacity 0.15s ease;
}
:where([data-media-player]:not([data-started]) .vds-video-layout[data-sm])
:where(.vds-button .vds-slider, .vds-time-group) {
opacity: 0;
visibility: hidden;
}
:where(.vds-video-layout[data-sm] .vds-time-slider) {
transition: transform 0.1s linear;
}
@media (pointer: coarse) {
:where([data-preview] .vds-video-layout:not([data-no-scrub-gesture]))
:where(
.vds-button,
.vds-slider:not(.vds-time-slider),
.vds-time,
.vds-chapter-title,
.vds-time-divider,
.vds-captions,
.vds-live-button
) {
opacity: 0;
}
:where([data-preview] .vds-video-layout:not([data-no-scrub-gesture]) .vds-time-slider) {
--track-height: var(--video-sm-slider-focus-track-height, 12px);
transform: translateY(-6px);
transition: transform 0.1s linear;
}
}
:where(.vds-video-layout[data-sm] .vds-controls .vds-play-button) {
--size: var(--video-sm-play-button-size, 45px);
--media-button-hover-transform: translateY(25%);
width: var(--size);
height: var(--size);
transform: translateY(25%);
border-radius: 100%;
pointer-events: auto;
margin-bottom: 2px;
overflow: hidden;
}
.vds-video-layout[data-sm] .vds-controls .vds-play-button {
background-color: var(--video-sm-play-button-bg, rgba(0 0 0 / 0.6));
}
:where(
[data-media-player]:not([data-started])
.vds-video-layout[data-sm]
.vds-controls-group:not(:nth-child(3))
) {
opacity: 0;
visibility: hidden;
}
/* center big play button inside buffering indicator. */
:where(.vds-video-layout[data-sm] .vds-buffering-indicator) {
--media-buffering-size: 64px;
transform: translate(-2px, -4px);
}
:where(.vds-video-layout .vds-start-duration .vds-time) {
position: absolute;
right: 8px;
bottom: 8px;
margin-right: 8px;
margin-bottom: 8px;
z-index: 10;
}
.vds-video-layout .vds-start-duration .vds-time {
padding: var(--video-sm-start-duration-padding, 3px 6px);
color: var(--video-sm-start-duration-color, var(--video-controls-color));
background-color: var(--video-sm-start-duration-bg, rgba(0 0 0 / 0.64));
}
:where([data-started] .vds-video-layout .vds-start-duration .vds-time) {
display: none;
}
:where([data-media-player]:not([data-can-play]) .vds-video-layout .vds-start-duration .vds-time) {
opacity: 0;
}
:where(.vds-video-layout[data-sm] .vds-time[data-type='current']) {
margin-left: 8px;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Fullscreen
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where([data-fullscreen] .vds-video-layout .vds-controls-group:nth-last-child(2)) {
margin-bottom: -16px;
}
@media (orientation: portrait) {
:where([data-fullscreen] .vds-video-layout .vds-captions) {
bottom: 30lvh;
bottom: 10dvh;
}
}
@media (orientation: landscape) {
:where([data-fullscreen] .vds-video-layout .vds-controls-group:nth-last-child(2)) {
margin-bottom: -12px;
}
}