@7sage/vidstack
Version:
UI component library for building high-quality, accessible video and audio experiences on the web.
418 lines (360 loc) • 11.8 kB
CSS
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Audio Layout
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
[data-media-player] .vds-audio-layout:not([data-match]) {
display: none ;
}
:where([data-media-player][data-layout='audio']) {
border-radius: var(--audio-border-radius, 6px);
}
:where(.vds-audio-layout) {
position: relative;
display: inline-flex;
align-items: center;
min-width: 100%;
height: 60px;
color: var(--audio-controls-color, var(--default-color));
background-color: var(--audio-bg, var(--default-bg));
border-radius: var(--audio-border-radius, 6px);
box-sizing: border-box;
filter: var(
--audio-filter,
drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06))
);
}
.vds-audio-layout {
border: var(--audio-border, 1px solid rgb(255 255 255 / 0.1));
}
:where([data-media-player][data-focus]:not([data-playing]) .vds-audio-layout) {
box-shadow: var(--media-focus-ring);
}
:where(.vds-audio-layout) {
--media-brand: var(--audio-brand, var(--default-brand));
--media-font-family: var(--audio-font-family, sans-serif);
--media-controls-color: var(--audio-controls-color, var(--default-controls-color));
--media-menu-y-offset: 18px;
--media-tooltip-y-offset: 18px;
--media-slider-track-bg: var(--audio-slider-track-bg, var(--default-slider-track-bg));
--media-slider-track-fill-bg: var(--audio-slider-track-bg, var(--media-brand));
--media-slider-track-progress-bg: var(
--audio-slider-progress-bg,
var(--default-slider-progress-bg)
);
--media-slider-value-border: var(--audio-slider-value-border, 1px solid rgb(255 255 255 / 0.1));
--media-slider-value-gap: var(--audio-slider-value-gap, 6px);
--media-focus-ring-color: var(--audio-focus-ring-color, rgb(78 156 246));
--media-focus-ring: var(--audio-focus-ring, 0 0 0 3px var(--media-focus-ring-color));
}
.vds-audio-layout.light,
.light .vds-audio-layout {
--default-brand: rgb(10 10 10);
--default-color: rgb(10 10 10);
--default-bg: rgb(250 250 250);
--default-controls-color: rgb(10 10 10);
--default-border: 1px solid rgb(100 100 100 /0.2);
--default-slider-track-bg: rgb(50 50 50 / 0.1);
--default-slider-progress-bg: rgb(10 10 10 / 0.2);
}
.vds-audio-layout.dark,
.dark .vds-audio-layout {
--default-brand: #f5f5f5;
--default-color: #f5f5f5;
--default-controls-color: #f5f5f5;
--default-bg: black;
--default-slider-track-bg: rgb(255 255 255 / 0.3);
--default-slider-progress-bg: rgb(255 255 255 / 0.5);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Controls
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
.vds-audio-layout .vds-controls {
padding-inline: 6px;
border-radius: var(--audio-border-radius, 6px);
}
:where(.vds-audio-layout .vds-controls-group) {
display: flex;
align-items: center;
pointer-events: auto;
width: 100%;
}
:where(.vds-audio-layout .vds-button) {
width: var(--audio-button-size, 36px);
height: var(--audio-button-size, 36px);
margin-right: 2.5px;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Buttons
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-play-tooltip) {
--media-tooltip-y-offset: 18px;
}
:where(.vds-audio-layout .vds-button) {
transition: max-width 140ms ease-in;
max-width: var(--audio-button-size, 36px);
}
:where(.vds-audio-layout .vds-play-button) {
--media-button-hover-transform: 0;
--media-button-border: var(--audio-play-button-border, var(--color));
--media-button-hover-bg: var(--bg-color);
--media-button-touch-hover-bg: var(--bg-color);
width: var(--audio-play-button-size, 32px);
height: var(--audio-play-button-size, 32px);
border-radius: var(--audio-play-button-border-radius, 100%);
pointer-events: auto;
margin-bottom: 2px;
overflow: hidden;
}
.vds-audio-layout .vds-play-button {
color: var(--audio-play-button-color, var(--default-color));
background-color: var(--audio-play-button-bg, var(--default-bg));
}
.light .vds-audio-layout .vds-play-button,
.vds-audio-layout.light .vds-play-button {
--default-color: #f5f5f5;
--default-bg: var(--media-brand);
}
.dark .vds-audio-layout .vds-play-button,
.vds-audio-layout.dark .vds-play-button {
--default-color: rgb(10 10 10);
--default-bg: var(--media-brand);
}
:where(.vds-audio-layout .vds-caption-button:not([data-active])) {
opacity: var(--audio-caption-button-off-opacity, 0.64);
}
:where(.vds-audio-layout .vds-live-button) {
margin-right: 8px;
}
:where(.vds-audio-layout .vds-seek-button) {
max-width: 0px;
visibility: hidden;
}
:where([data-playing] .vds-audio-layout .vds-seek-button) {
max-width: var(--audio-button-size, 36px);
visibility: visible;
}
:where(.vds-audio-layout .vds-settings-menu .vds-button) {
margin-right: 0;
}
@media (pointer: coarse) {
:where(.vds-audio-layout .vds-caption-button) {
display: none;
}
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Title
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-title) {
display: flex;
align-items: center;
position: relative;
margin-left: 6px;
margin-right: auto;
max-width: 100%;
opacity: 1;
transition:
max-width 150ms ease-in,
opacity 150ms ease-in;
overflow: hidden;
text-wrap: nowrap;
white-space: nowrap;
transition-delay: 75ms;
}
:where([data-playing] .vds-audio-layout .vds-title) {
opacity: 0;
margin: 0;
max-width: 0px;
transition: none;
transition-delay: 0;
}
:where(.vds-audio-layout .vds-title-text) {
display: inline-flex;
align-items: center;
}
:where(.vds-audio-layout .vds-marquee .vds-title-text) {
animation: vds-marquee 8s linear infinite;
}
:where(.vds-audio-layout .vds-title:hover *) {
animation-play-state: paused;
}
:where(.vds-audio-layout .vds-title-text:nth-child(2)) {
margin-left: 16px;
}
@keyframes vds-marquee {
from {
transform: translateX(0%);
}
to {
transform: translateX(calc(-100% - 16px));
}
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Time
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-time) {
margin-inline: 8px;
transition: max-width 140ms ease-in;
font-size: var(--audio-time-font-size, 15px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Time Slider
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-time-slider) {
--media-slider-preview-offset: 14px;
opacity: 0;
max-width: 0px;
transform: scaleX(0);
transform-origin: center left;
transition: none;
visibility: hidden;
}
:where([data-media-player]:not([data-paused]) .vds-audio-layout .vds-time-slider) {
opacity: 1;
max-width: 100%;
transform: scaleX(1);
transition:
opacity 150ms ease-in,
transform 150ms ease-in;
transition-delay: 75ms;
visibility: visible;
}
:where(.vds-audio-layout .vds-slider-chapter-title) {
color: var(--audio-slider-chapter-title-color, black);
}
:where(.dark .vds-audio-layout .vds-slider-chapter-title) {
color: var(--audio-slider-chapter-title-color, white);
}
:where([data-buffering] .vds-audio-layout .vds-slider-progress) {
--stripe-color: var(--audio-buffering-stripe-color, rgb(0 0 0 / 0.25));
--stripe-size: var(--audio-buffering-stripe-size, 30px);
width: 100% ;
background-image: linear-gradient(
-45deg,
var(--stripe-color) 25%,
transparent 25%,
transparent 50%,
var(--stripe-color) 50%,
var(--stripe-color) 75%,
transparent 75%,
transparent
);
background-size: var(--stripe-size) var(--stripe-size);
animation: vds-audio-track-progress var(--audio-buffering-stripe-speed, 2s) linear infinite;
}
@keyframes vds-audio-track-progress {
0% {
background-position: 0 0;
}
100% {
background-position: var(--stripe-size) var(--stripe-size);
}
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Volume Slider
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-volume) {
--media-slider-height: var(--audio-volume-height, 96px);
--media-slider-preview-offset: 6px;
--gap: var(--audio-volume-gap, 16px);
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
:where(.vds-audio-layout .vds-volume-popup) {
position: absolute;
bottom: calc(100% + var(--gap));
left: 50%;
opacity: 0;
transform: translateX(-50%);
transition:
opacity 150ms ease-out,
visibility 150ms ease-out;
border-radius: var(--audio-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-audio-layout .vds-volume-popup::after {
content: '';
position: fixed;
bottom: calc(-1 * var(--gap));
right: 0;
width: 100%;
height: var(--gap);
z-index: 1;
pointer-events: auto;
}
.vds-audio-layout .vds-volume-popup {
background-color: var(--audio-volume-bg, var(--media-menu-bg, var(--default-bg)));
border: var(--audio-volume-border, var(--default-border));
}
.light .vds-audio-layout .vds-volume-popup,
.vds-audio-layout.light .vds-volume-popup {
--default-bg: rgb(250 250 250);
--default-border: 1px solid rgb(10 10 10 / 0.1);
}
.dark .vds-audio-layout .vds-volume-popup,
.vds-audio-layout.dark .vds-volume-popup {
--default-bg: rgb(10 10 10);
--default-border: 1px solid rgb(255 255 255 / 0.1);
}
:where(.vds-audio-layout .vds-volume[data-active] .vds-volume-popup),
:where(.vds-audio-layout .vds-volume:has([data-active]) .vds-volume-popup) {
transition:
opacity 150ms ease-in,
visibility 150ms ease-in;
opacity: 1;
visibility: visible;
}
:where(.vds-audio-layout .vds-volume[data-active] .vds-tooltip-content) {
display: none ;
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Menus
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-menu-items[data-root]) {
max-height: var(--audio-menu-max-height, 320px);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Captions
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
:where(.vds-audio-layout .vds-captions) {
--cue-font-size: calc(var(--audio-cue-font-size, 14px) * var(--media-user-font-size, 1));
display: inline-block;
position: absolute;
width: 100%;
top: unset;
bottom: calc(100% + var(--audio-captions-offset, 4px));
text-align: center;
background-color: var(--media-user-display-bg, var(--media-cue-display-bg));
}
:where([data-preview] .vds-audio-layout .vds-captions),
:where([data-paused] .vds-audio-layout .vds-captions) {
opacity: 0;
}
@media (pointer: coarse) {
.vds-audio-layout[data-scrubbing] :where(.vds-button, .vds-time) {
max-width: 0 ;
margin: 0 ;
padding: 0 ;
transition: max-width 150ms ease-out;
}
}