UNPKG

@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
/* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Audio Layout * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ [data-media-player] .vds-audio-layout:not([data-match]) { display: none !important; } :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% !important; 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 !important; } /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 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 !important; margin: 0 !important; padding: 0 !important; transition: max-width 150ms ease-out; } }