feat(ui): skin design improvements, add html frosted skin (WIP) (#133)

This commit is contained in:
Sam Potts
2025-10-25 14:35:48 +11:00
committed by GitHub
parent 52b91d3bd8
commit 75a90e7104
14 changed files with 547 additions and 428 deletions
@@ -288,7 +288,7 @@ export class MediaPopoverPortal extends HTMLElement {
if (!portalId) return;
/* @TODO We need to make sure portal logic is non-brittle longer term (CJP) */
// NOTE: Hacky solution in part to ensure styling propogates from skin to container's baked in portal (TL;DR - Shadow DOM vs. Light DOM CSS) (CJP)
// NOTE: Hacky solution in part to ensure styling propagates from skin to container's baked in portal (TL;DR - Shadow DOM vs. Light DOM CSS) (CJP)
const portalContainer
= ((this.getRootNode() as ShadowRoot | Document).getElementById(portalId)
?? (this.getRootNode() as ShadowRoot | Document)
-390
View File
@@ -1,390 +0,0 @@
import { MediaSkin } from '@/media/media-skin';
import '@/media/media-container';
import '@/media/media-provider';
import '@/components/media-play-button';
import '@/components/media-mute-button';
import '@/components/media-volume-slider';
import '@/components/media-time-slider';
import '@/components/media-fullscreen-button';
import '@/components/media-duration-display';
import '@/components/media-current-time-display';
import '@/components/media-preview-time-display';
import '@/components/media-popover';
import '@/components/media-tooltip';
import '@/icons';
export function getTemplateHTML() {
return /* html */`
${MediaSkin.getTemplateHTML()}
<style>
/** @TODO: Improve/Polish CSS Here */
/* Media Container UI/Styles */
media-container {
display: inline-block;
position: relative;
/* NOTE: Setting color here for generic inheritance, including SVG fill: currentColor defaults (CJP) */
color: rgb(238 238 238);
}
media-container > ::slotted([slot=media]) {
display: block;
width: 100%;
height: 100%;
}
/* Media Container UI Overlay Styling */
media-container > .overlay {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
display: flex;
flex-flow: column nowrap;
align-items: start;
pointer-events: none;
background: none;
}
/* Time Display Styling */
media-current-time-display,
media-duration-display {
padding: 4px 8px;
color: rgb(238 238 238);
font-family: monospace;
font-size: 14px;
border-radius: 2px;
min-width: 3em;
text-align: center;
display: inline-block;
}
/* Generic Media Button Styling */
.button {
border: none;
padding: 8px;
cursor: pointer;
color: rgb(238 238 238);
display: flex;
align-items: center;
justify-content: center;
min-width: 24px;
min-height: 24px;
}
.button .icon {
width: 18px;
height: 18px;
display: none;
}
/* Media Play Button UI/Styles */
media-play-button:not([data-paused]) .pause-icon,
media-play-button[data-paused] .play-icon {
display: block;
}
/* Media Fullscreen Button UI/Styles */
media-fullscreen-button:not([data-fullscreen]) .fullscreen-enter-icon,
media-fullscreen-button[data-fullscreen] .fullscreen-exit-icon {
display: block;
}
/* One way to define the "default visible" icon (CJP) */
media-mute-button:not([data-volume-level]) .volume-low-icon,
media-mute-button[data-volume-level=high] .volume-high-icon,
media-mute-button[data-volume-level=low] .volume-low-icon,
media-mute-button[data-volume-level=medium] .volume-low-icon,
media-mute-button[data-volume-level=off] .volume-off-icon {
display: block;
}
/* Media Control Bar UI/Styles */
.control-bar {
position: absolute;
bottom: 0;
left: 0;
right: 0;
background: rgb(20 20 30 / .7);
display: flex;
align-items: center;
justify-content: flex-start;
width: 100%;
}
/* TimeSlider Component Styles */
media-time-slider-root {
display: flex;
align-items: center;
justify-content: center;
position: relative;
min-width: 100px;
width: 100%;
margin: 0 .5rem;
}
/* Horizontal orientation styles */
media-time-slider-root[data-orientation="horizontal"] {
min-width: 100px;
width: 100%;
height: 20px;
}
/* Vertical orientation styles */
media-time-slider-root[data-orientation="vertical"] {
min-width: 20px;
width: 20px;
height: 100px;
flex-direction: column;
}
media-time-slider-track {
position: relative;
width: 100%;
height: .375rem;
background-color: #e0e0e0;
border-radius: .25rem;
overflow: hidden;
pointer-events: none;
}
/* Horizontal track styles */
media-time-slider-track[data-orientation="horizontal"] {
width: 100%;
height: .375rem;
}
/* Vertical track styles */
media-time-slider-track[data-orientation="vertical"] {
width: .375rem;
height: 100%;
}
media-time-slider-thumb {
width: .75rem;
height: .75rem;
background-color: #fff;
border-radius: 50%;
pointer-events: none;
}
media-time-slider-pointer {
background-color: rgba(255, 255, 255, .5);
pointer-events: none;
}
media-time-slider-progress {
background-color: #007bff;
border-radius: inherit;
}
media-popover-popup {
background: rgb(20 20 30 / .7);
padding: 14px 0;
--transition: .15s ease-in-out;
transition: transform var(--transition), scale var(--transition), opacity var(--transition);
}
media-popover-popup[data-starting-style] {
transition-duration: 0s;
transform: scale(0.9) translateY(8px);
opacity: 0;
}
media-popover-popup[data-ending-style] {
transform: scale(0.9) translateY(8px);
opacity: 0;
}
/* VolumeSlider Component Styles */
media-volume-slider-root {
display: flex;
align-items: center;
justify-content: center;
position: relative;
min-width: 80px;
width: 80px;
margin: 0 .5rem;
}
/* Horizontal orientation styles */
media-volume-slider-root[data-orientation="horizontal"] {
min-width: 80px;
width: 80px;
height: 20px;
}
/* Vertical orientation styles */
media-volume-slider-root[data-orientation="vertical"] {
min-width: 20px;
width: 20px;
height: 80px;
flex-direction: column;
}
media-volume-slider-track {
position: relative;
width: 100%;
height: .375rem;
background-color: #e0e0e0;
border-radius: .25rem;
overflow: hidden;
pointer-events: none;
}
/* Horizontal track styles */
media-volume-slider-track[data-orientation="horizontal"] {
width: 100%;
height: .375rem;
}
/* Vertical track styles */
media-volume-slider-track[data-orientation="vertical"] {
width: .375rem;
height: 100%;
}
media-volume-slider-thumb {
width: .75rem;
height: .75rem;
background-color: #fff;
border-radius: 50%;
pointer-events: none;
}
media-volume-slider-progress {
background-color: #007bff;
border-radius: inherit;
}
/* Tooltip Component Styles */
media-tooltip-popup {
background: rgb(20 20 30 / .9);
color: rgb(238 238 238);
padding: 6px 8px;
border-radius: 4px;
font-size: 13px;
font-family: system-ui, -apple-system, sans-serif;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--transition: .15s ease-in-out;
transition: transform var(--transition), scale var(--transition), opacity var(--transition);
}
media-tooltip-popup[data-starting-style] {
transition-duration: 0s;
transform: scale(0.9);
opacity: 0;
}
media-tooltip-popup[data-ending-style] {
transform: scale(0.9);
opacity: 0;
}
.tooltip {
display: none;
white-space: nowrap;
}
media-tooltip-popup[data-paused] .play-tooltip,
media-tooltip-popup:not([data-paused]) .pause-tooltip {
display: block;
}
media-tooltip-popup[data-fullscreen] .fullscreen-exit-tooltip,
media-tooltip-popup:not([data-fullscreen]) .fullscreen-enter-tooltip {
display: block;
}
</style>
<media-container>
<slot name="media" slot="media"></slot>
<div class="overlay"></div>
<div class="control-bar">
<!-- NOTE: We can decide if we further want to provide a further, "themed" media-play-button that comes with baked in default styles and icons. (CJP) -->
<media-tooltip-root delay="600" close-delay="0">
<media-tooltip-trigger>
<media-play-button class="button">
<media-play-icon class="icon play-icon"></media-play-icon>
<media-pause-icon class="icon pause-icon"></media-pause-icon>
</media-play-button>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="8" collision-padding="8">
<media-tooltip-popup>
<span class="tooltip play-tooltip">Play</span>
<span class="tooltip pause-tooltip">Pause</span>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
<!-- Use the show-remaining attribute to show count down/remaining time -->
<media-current-time-display show-remaining></media-current-time-display>
<media-tooltip-root track-cursor-axis="x">
<media-tooltip-trigger>
<media-time-slider-root>
<media-time-slider-track>
<media-time-slider-progress></media-time-slider-progress>
<media-time-slider-pointer></media-time-slider-pointer>
</media-time-slider-track>
<media-time-slider-thumb></media-time-slider-thumb>
</media-time-slider-root>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="18" collision-padding="12">
<media-tooltip-popup>
<preview-time-display></preview-time-display>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
<media-duration-display></media-duration-display>
<media-popover-root open-on-hover delay="200" close-delay="100">
<media-popover-trigger>
<media-mute-button class="button">
<media-volume-high-icon class="icon volume-high-icon"></media-volume-high-icon>
<media-volume-low-icon class="icon volume-low-icon"></media-volume-low-icon>
<media-volume-off-icon class="icon volume-off-icon"></media-volume-off-icon>
</media-mute-button>
</media-popover-trigger>
<media-popover-portal>
<media-popover-positioner side="top">
<media-popover-popup>
<media-volume-slider-root orientation="vertical">
<media-volume-slider-track>
<media-volume-slider-progress></media-volume-slider-progress>
</media-volume-slider-track>
<media-volume-slider-thumb></media-volume-slider-thumb>
</media-volume-slider-root>
</media-popover-popup>
</media-popover-positioner>
</media-popover-portal>
</media-popover-root>
<media-tooltip-root delay="600" close-delay="0">
<media-tooltip-trigger>
<media-fullscreen-button class="button">
<media-fullscreen-enter-icon class="icon fullscreen-enter-icon"></media-fullscreen-enter-icon>
<media-fullscreen-exit-icon class="icon fullscreen-exit-icon"></media-fullscreen-exit-icon>
</media-fullscreen-button>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="8" collision-padding="8">
<media-tooltip-popup>
<span class="tooltip fullscreen-enter-tooltip">Enter Fullscreen</span>
<span class="tooltip fullscreen-exit-tooltip">Exit Fullscreen</span>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
</div>
</media-container>
`;
}
export class MediaSkinDefault extends MediaSkin {
static getTemplateHTML: () => string = getTemplateHTML;
}
customElements.define('media-skin-default', MediaSkinDefault);
+119
View File
@@ -0,0 +1,119 @@
import { MediaSkin } from '@/media/media-skin';
import styles from './styles.css';
import '@/media/media-container';
import '@/media/media-provider';
import '@/components/media-play-button';
import '@/components/media-mute-button';
import '@/components/media-volume-slider';
import '@/components/media-time-slider';
import '@/components/media-fullscreen-button';
import '@/components/media-duration-display';
import '@/components/media-current-time-display';
import '@/components/media-preview-time-display';
import '@/components/media-popover';
import '@/components/media-tooltip';
import '@/icons';
export function getTemplateHTML() {
return /* html */`
${MediaSkin.getTemplateHTML()}
<style>${styles}</style>
<media-container>
<slot name="media" slot="media"></slot>
<div class="overlay"></div>
<div class="control-bar surface">
<!-- NOTE: We can decide if we further want to provide a further, "themed" media-play-button that comes with baked in default styles and icons. (CJP) -->
<media-tooltip-root delay="600" close-delay="0">
<media-tooltip-trigger>
<media-play-button class="button">
<media-play-icon class="icon play-icon"></media-play-icon>
<media-pause-icon class="icon pause-icon"></media-pause-icon>
</media-play-button>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="12" collision-padding="12">
<media-tooltip-popup class="surface popup-animation">
<span class="tooltip play-tooltip">Play</span>
<span class="tooltip pause-tooltip">Pause</span>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
<div class="time-controls">
<!-- Use the show-remaining attribute to show count down/remaining time -->
<media-current-time-display show-remaining></media-current-time-display>
<media-tooltip-root track-cursor-axis="x">
<media-tooltip-trigger>
<media-time-slider-root class="slider-root">
<media-time-slider-track class="slider-track">
<media-time-slider-progress class="slider-progress"></media-time-slider-progress>
<media-time-slider-pointer class="slider-pointer"></media-time-slider-pointer>
</media-time-slider-track>
<media-time-slider-thumb class="slider-thumb"></media-time-slider-thumb>
</media-time-slider-root>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="18" collision-padding="12">
<media-tooltip-popup class="surface popup-animation">
<preview-time-display></preview-time-display>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
<media-duration-display></media-duration-display>
</div>
<media-popover-root open-on-hover delay="200" close-delay="100">
<media-popover-trigger>
<media-mute-button class="button">
<media-volume-high-icon class="icon volume-high-icon"></media-volume-high-icon>
<media-volume-low-icon class="icon volume-low-icon"></media-volume-low-icon>
<media-volume-off-icon class="icon volume-off-icon"></media-volume-off-icon>
</media-mute-button>
</media-popover-trigger>
<media-popover-portal>
<media-popover-positioner side="top" side-offset="12" collision-padding="12">
<media-popover-popup class="surface popup-animation">
<media-volume-slider-root class="slider-root" orientation="vertical">
<media-volume-slider-track class="slider-track">
<media-volume-slider-progress class="slider-progress"></media-volume-slider-progress>
</media-volume-slider-track>
<media-volume-slider-thumb class="slider-thumb"></media-volume-slider-thumb>
</media-volume-slider-root>
</media-popover-popup>
</media-popover-positioner>
</media-popover-portal>
</media-popover-root>
<media-tooltip-root delay="600" close-delay="0">
<media-tooltip-trigger>
<media-fullscreen-button class="button">
<media-fullscreen-enter-icon class="icon fullscreen-enter-icon"></media-fullscreen-enter-icon>
<media-fullscreen-exit-icon class="icon fullscreen-exit-icon"></media-fullscreen-exit-icon>
</media-fullscreen-button>
</media-tooltip-trigger>
<media-tooltip-portal>
<media-tooltip-positioner side="top" side-offset="12" collision-padding="12">
<media-tooltip-popup class="surface popup-animation">
<span class="tooltip fullscreen-enter-tooltip">Enter Fullscreen</span>
<span class="tooltip fullscreen-exit-tooltip">Exit Fullscreen</span>
</media-tooltip-popup>
</media-tooltip-positioner>
</media-tooltip-portal>
</media-tooltip-root>
</div>
</media-container>
`;
}
export class MediaSkinFrosted extends MediaSkin {
static getTemplateHTML: () => string = getTemplateHTML;
}
customElements.define('media-skin-frosted', MediaSkinFrosted);
+351
View File
@@ -0,0 +1,351 @@
media-container * {
box-sizing: border-box;
}
media-container {
position: relative;
isolation: isolate;
container: root / inline-size;
overflow: clip;
font-size: 0.8125rem;
line-height: 1.5;
border-radius: inherit;
}
media-container::before,
media-container::after {
content: '';
position: absolute;
pointer-events: none;
border-radius: inherit;
z-index: 10;
}
media-container::before {
inset: 1px;
box-shadow: inset 0 0 0 1px oklab(1 0 0 / 0.15);
}
media-container::after {
inset: 0;
box-shadow: inset 0 0 0 1px oklab(0 0 0 / 0.1);
}
/* Fullscreen */
media-container:fullscreen {
border-radius: 0;
}
media-container:fullscreen video {
height: 100%;
width: 100%;
}
media-container > ::slotted([slot='media']) {
display: block;
width: 100%;
height: 100%;
}
/* Media Container UI Overlay Styling */
media-container > .overlay {
position: absolute;
inset: 0;
display: flex;
flex-flow: column nowrap;
align-items: start;
pointer-events: none;
background-image: linear-gradient(to top, oklab(0 0 0 / 0.5), oklab(0 0 0 / 0.3), rgba(0, 0, 0, 0));
backdrop-filter: saturate(1.5) brightness(0.9);
transition: opacity 0.15s ease-out;
transition-delay: 500ms;
opacity: 0;
}
media-container:hover > .overlay,
media-container:has([data-paused]) > .overlay,
media-container:has([aria-expanded='true']) > .overlay {
opacity: 1;
transition-delay: 0ms;
}
/* Common Surface Styles - e.g. tooltips, popovers, controls */
.surface {
background-color: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(64px) brightness(0.9) saturate(1.5);
box-shadow:
inset 0 0 0 1px oklab(1 0 0 / 0.15),
0 0 0 1px oklab(0 0 0 / 0.15),
oklab(0 0 0 / 0.15) 0px 1px 3px 0px,
oklab(0 0 0 / 0.15) 0px 1px 2px -1px;
}
@media (prefers-reduced-transparency: reduce) {
.surface {
background-color: oklab(0 0 0 / 0.7);
box-shadow:
inset 0 0 0 1px oklab(0 0 0),
0 0 0 1px oklab(1 0 0 / 0.2);
}
}
@media (prefers-contrast: more) {
.surface {
background-color: oklab(0 0 0 / 0.9);
box-shadow:
inset 0 0 0 1px oklab(0 0 0),
0 0 0 1px oklab(1 0 0 / 0.2);
}
}
/* Media Control Bar UI/Styles */
.control-bar {
position: absolute;
bottom: 0.75rem;
inset-inline: 0.75rem;
padding: 0.25rem;
display: flex;
align-items: center;
gap: 0.125rem;
border-radius: calc(infinity * 1px);
will-change: scale, transform, filter, opacity;
scale: 0.9;
opacity: 0;
filter: blur(8px);
transition-property: scale, transform, filter, opacity;
transition-delay: 500ms;
transition-duration: 300ms;
transition-timing-function: ease-out;
transform-origin: bottom;
color: oklab(1 0 0);
}
media-container:hover > .control-bar,
media-container:has([data-paused]) > .control-bar,
media-container:has([aria-expanded='true']) > .control-bar {
opacity: 1;
scale: 1;
filter: blur(0px);
transition-delay: 0ms;
transition-duration: 100ms;
}
/* Time Display Styling */
.time-controls {
display: flex;
align-items: center;
flex: 1;
gap: 0.75rem;
padding-inline: 0.375rem;
}
media-current-time-display,
media-duration-display {
text-shadow: 0 1px 0 oklab(0 0 0 / 0.25);
font-variant-numeric: tabular-nums;
}
/* Generic Media Button Styling */
.button {
display: grid;
flex-shrink: 0;
padding: 0.5rem;
cursor: pointer;
background: transparent;
border: none;
border-radius: calc(infinity * 1px);
color: oklab(1 0 0 / 0.9);
user-select: none;
outline: 2px solid transparent;
outline-offset: -2px;
transition-property: background-color, color, outline-offset;
transition-duration: 150ms;
transition-timing-function: ease-out;
}
.button:hover,
.button:focus-visible,
.button[aria-expanded='true'] {
background-color: oklab(1 0 0 / 0.1);
color: oklab(1 0 0);
text-decoration: none;
}
.button:focus-visible {
outline-color: oklch(62.3% 0.214 259.815);
outline-offset: 2px;
}
.button[disabled] {
cursor: not-allowed;
opacity: 0.5;
filter: grayscale(1);
}
.button .icon {
grid-area: 1 / 1;
width: 18px;
height: 18px;
filter: drop-shadow(0 1px 0 oklab(0 0 0 / 0.25));
}
/* Media Play Button UI/Styles */
media-play-button .icon {
opacity: 0;
transition: opacity 150ms linear;
}
media-play-button:not([data-paused]) .pause-icon,
media-play-button[data-paused] .play-icon {
opacity: 1;
}
/* Media Fullscreen Button UI/Styles */
media-fullscreen-button .icon {
display: none;
}
media-fullscreen-button:not([data-fullscreen]) .fullscreen-enter-icon,
media-fullscreen-button[data-fullscreen] .fullscreen-exit-icon {
display: inline;
}
/* One way to define the "default visible" icon (CJP) */
media-mute-button .icon {
display: none;
}
media-mute-button:not([data-volume-level]) .volume-low-icon,
media-mute-button[data-volume-level='high'] .volume-high-icon,
media-mute-button[data-volume-level='low'] .volume-low-icon,
media-mute-button[data-volume-level='medium'] .volume-low-icon,
media-mute-button[data-volume-level='off'] .volume-off-icon {
display: inline;
}
/* TimeSlider Component Styles */
.slider-root {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
position: relative;
border-radius: calc(infinity * 1px);
outline: none;
}
/* Horizontal orientation styles */
.slider-root[data-orientation='horizontal'] {
min-width: 80px;
width: 100%;
height: 20px;
}
/* Vertical orientation styles */
.slider-root[data-orientation='vertical'] {
height: 80px;
width: 20px;
}
.slider-track {
position: relative;
isolation: isolate;
background-color: oklab(1 0 0 / 0.2);
border-radius: inherit;
overflow: hidden;
user-select: none;
outline: 2px solid transparent;
outline-offset: -2px;
transition: outline-offset 150ms ease-out;
box-shadow: 0 0 0 1px oklab(0 0 0 / 0.05);
}
/* Horizontal track styles */
.slider-track[data-orientation='horizontal'] {
width: 100%;
height: 0.25rem;
}
/* Vertical track styles */
.slider-track[data-orientation='vertical'] {
width: 0.25rem;
height: 100%;
}
.slider-root:focus-visible .slider-track {
outline-color: oklch(62.3% 0.214 259.815);
outline-offset: 6px;
}
.slider-thumb {
width: 0.625rem;
height: 0.625rem;
background-color: oklab(1 0 0);
border-radius: calc(infinity * 1px);
user-select: none;
z-index: 10;
box-shadow:
0 0 0 1px oklab(0 0 0 / 0.1),
0 1px 3px 0 oklab(0 0 0 / 0.15),
0 1px 2px -1px oklab(0 0 0 / 0.15);
opacity: 0;
transition-property: opacity, height, width;
transition-duration: 150ms;
transition-timing-function: ease-in-out;
}
.slider-thumb:active {
width: 0.75rem;
height: 0.75rem;
}
.slider-root:hover .slider-thumb,
.slider-root:focus-within .slider-thumb {
opacity: 1;
}
.slider-track[data-orientation='horizontal'] .slider-thumb {
cursor: ew-resize;
}
.slider-track[data-orientation='vertical'] .slider-thumb {
cursor: ns-resize;
}
.slider-pointer {
background-color: oklab(1 0 0 / 0.2);
border-radius: inherit;
}
.slider-progress {
background-color: oklab(1 0 0);
border-radius: inherit;
}
.popup-animation {
transition-property: transform, scale, opacity, filter;
transition-duration: 200ms;
transform: scale(1);
transform-origin: bottom;
opacity: 1;
filter: blur(0px);
}
.popup-animation[data-starting-style],
.popup-animation[data-ending-style] {
transform: scale(0);
opacity: 0;
filter: blur(8px);
}
.popup-animation[data-instant] {
transition-duration: 0ms;
}
media-popover-popup {
padding: 0.75rem 0.25rem;
border-radius: calc(infinity * 1px);
}
/* Tooltip Component Styles */
media-tooltip-popup {
color: oklab(1 0 0);
padding: 0.25rem 0.625rem;
border-radius: calc(infinity * 1px);
font-size: 0.75rem;
}
.tooltip {
display: none;
white-space: nowrap;
}
media-tooltip-popup[data-paused] .play-tooltip,
media-tooltip-popup:not([data-paused]) .pause-tooltip {
display: block;
}
media-tooltip-popup[data-fullscreen] .fullscreen-exit-tooltip,
media-tooltip-popup:not([data-fullscreen]) .fullscreen-enter-tooltip {
display: block;
}
+26
View File
@@ -0,0 +1,26 @@
import { MediaSkin } from '@/media/media-skin';
import '@/media/media-container';
import '@/media/media-provider';
import '@/components/media-play-button';
import '@/components/media-mute-button';
import '@/components/media-volume-slider';
import '@/components/media-time-slider';
import '@/components/media-fullscreen-button';
import '@/components/media-duration-display';
import '@/components/media-current-time-display';
import '@/components/media-preview-time-display';
import '@/components/media-popover';
import '@/components/media-tooltip';
import '@/icons';
export function getTemplateHTML() {
return /* html */`
${MediaSkin.getTemplateHTML()}
`;
}
export class MediaSkinMinimal extends MediaSkin {
static getTemplateHTML: () => string = getTemplateHTML;
}
customElements.define('media-skin-minimal', MediaSkinMinimal);
+4
View File
@@ -0,0 +1,4 @@
declare module '*.css' {
const content: string;
export default content;
}