mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
feat(packages): add UI support for gestures and hotkeys (#1388)
Co-authored-by: Rahim <rahim.alwer@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Rahim
Claude Opus 4.6
parent
6c81f2d190
commit
0620814a67
@@ -79,7 +79,12 @@
|
||||
}
|
||||
|
||||
& .media-icon {
|
||||
filter: drop-shadow(0 1px 0 var(--media-controls-current-shadow-color, oklch(0 0 0 / 0.25)));
|
||||
grid-area: 1 / 1;
|
||||
transition-behavior: allow-discrete;
|
||||
transition-property: display, opacity;
|
||||
transition-duration: 150ms;
|
||||
transition-timing-function: ease-out;
|
||||
filter: drop-shadow(0 1px 0 var(--media-current-shadow-color));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,16 +3,11 @@
|
||||
========================================================================== */
|
||||
|
||||
.media-default-skin .media-controls {
|
||||
--media-controls-current-shadow-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));
|
||||
--media-controls-current-shadow-color-subtle: oklch(
|
||||
from var(--media-controls-current-shadow-color) l c h /
|
||||
calc(alpha * 0.4)
|
||||
);
|
||||
display: flex;
|
||||
column-gap: 0.075rem;
|
||||
align-items: center;
|
||||
padding: 0.375rem;
|
||||
container: media-controls / inline-size;
|
||||
text-shadow: 0 1px 0 var(--media-controls-current-shadow-color);
|
||||
text-shadow: 0 1px 0 var(--media-current-shadow-color);
|
||||
border-radius: 1.5rem;
|
||||
}
|
||||
|
||||
@@ -6,15 +6,9 @@
|
||||
position: relative;
|
||||
}
|
||||
.media-default-skin .media-icon {
|
||||
display: block;
|
||||
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;
|
||||
width: var(--media-icon-size);
|
||||
height: var(--media-icon-size);
|
||||
}
|
||||
.media-default-skin .media-icon--flipped {
|
||||
scale: -1 1;
|
||||
|
||||
@@ -0,0 +1,228 @@
|
||||
/* ==========================================================================
|
||||
Input Feedback
|
||||
========================================================================== */
|
||||
|
||||
.media-default-skin .media-input-feedback {
|
||||
position: absolute;
|
||||
inset-inline: 0;
|
||||
top: 0;
|
||||
bottom: 3.5rem; /* Shift up a little in smaller containers */
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
align-items: center;
|
||||
justify-items: center;
|
||||
color: var(--media-color-primary, oklch(1 0 0));
|
||||
pointer-events: none;
|
||||
|
||||
@container media-root (width > 24rem) {
|
||||
bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Feedback islands ------------------------------------------------------- */
|
||||
|
||||
.media-default-skin .media-input-feedback-island {
|
||||
--media-surface-background-color: oklch(0 0 0 / 0.25);
|
||||
position: absolute;
|
||||
top: 0.75rem;
|
||||
font-weight: 500;
|
||||
color: inherit;
|
||||
pointer-events: none;
|
||||
border-radius: calc(Infinity * 1px);
|
||||
transform-origin: top center;
|
||||
transition-timing-function: ease-out;
|
||||
transition-duration: 100ms;
|
||||
|
||||
.media-input-feedback-island__content {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
width: 100%;
|
||||
padding: 0.25rem 0.625rem;
|
||||
|
||||
/* Increase contrast of the content */
|
||||
* {
|
||||
mix-blend-mode: difference;
|
||||
}
|
||||
}
|
||||
|
||||
.media-icon {
|
||||
display: none;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.media-input-feedback-island__value {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
@media (pointer: coarse) {
|
||||
transition-property: scale, translate, opacity;
|
||||
will-change: scale, translate, opacity;
|
||||
}
|
||||
|
||||
@media (pointer: fine) and (prefers-reduced-motion: no-preference) {
|
||||
transition-property: scale, translate, filter, opacity;
|
||||
will-change: scale, translate, filter, opacity;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-transparency: reduce) or (prefers-contrast: more) {
|
||||
--media-surface-background-color: oklch(0 0 0);
|
||||
}
|
||||
|
||||
/* Default hidden state */
|
||||
&[data-starting-style],
|
||||
&[data-ending-style] {
|
||||
opacity: 0;
|
||||
transition-timing-function: ease-in;
|
||||
transition-duration: 250ms;
|
||||
|
||||
@media (pointer: fine) and (prefers-reduced-motion: no-preference) {
|
||||
filter: blur(8px);
|
||||
scale: 0.9;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
&[data-ending-style] {
|
||||
translate: 0 -25%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-island--volume {
|
||||
width: min(80%, 12rem);
|
||||
|
||||
.media-input-feedback-island__content {
|
||||
--media-progress-fill: var(--media-volume-fill);
|
||||
background-image: linear-gradient(
|
||||
to right,
|
||||
currentColor 0%,
|
||||
currentColor var(--media-progress-fill),
|
||||
transparent var(--media-progress-fill),
|
||||
transparent 100%
|
||||
);
|
||||
border-radius: inherit;
|
||||
transition: --media-progress-fill 200ms linear;
|
||||
}
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-island--volume[data-level="high"] .media-icon--volume-high,
|
||||
.media-default-skin .media-input-feedback-island--volume[data-level="low"] .media-icon--volume-low,
|
||||
.media-default-skin .media-input-feedback-island--volume[data-level="off"] .media-icon--volume-off {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="captions-on"] .media-icon--captions-on,
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="captions-off"] .media-icon--captions-off,
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="fullscreen"] .media-icon--fullscreen-enter,
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="exit-fullscreen"] .media-icon--fullscreen-exit,
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="pip"] .media-icon--pip-enter,
|
||||
.media-default-skin .media-input-feedback-island--status[data-status="exit-pip"] .media-icon--pip-exit {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* --- Boundary shake ------------------------------------------------------- */
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.media-default-skin .media-input-feedback-island--volume[data-min],
|
||||
.media-default-skin .media-input-feedback-island--volume[data-max] {
|
||||
animation: media-shake 300ms ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Bubble ---------------------------------------------------------------- */
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
grid-row: 1;
|
||||
grid-column: 2; /* default to center for status bubbles and undirected seeks */
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 1rem;
|
||||
transition: opacity 250ms ease-out;
|
||||
|
||||
@container media-root (width > 24rem) {
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
&[data-starting-style],
|
||||
&[data-ending-style] {
|
||||
opacity: 0;
|
||||
transition-timing-function: ease-in;
|
||||
transition-duration: 200ms;
|
||||
}
|
||||
}
|
||||
|
||||
/* Direction placement — seek bubbles move to the side implied by their direction. */
|
||||
.media-default-skin .media-input-feedback-bubble[data-direction="backward"] {
|
||||
grid-column: 1;
|
||||
justify-self: left;
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble:not([data-direction]) {
|
||||
grid-column: 2;
|
||||
transition-timing-function:
|
||||
ease-out, linear(0, 0.12 1.5%, 1.35 9.7%, 2.2 13.9%, 3 19.9%, 2.7 21.8%, 0.62 37.5%, 0.96 50.9%, 1);
|
||||
transition-duration: 600ms;
|
||||
transition-property: opacity, scale;
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
transition: opacity 100ms ease-out;
|
||||
}
|
||||
|
||||
&[data-starting-style],
|
||||
&[data-ending-style] {
|
||||
opacity: 0;
|
||||
scale: 0.8;
|
||||
transition-timing-function: ease-in;
|
||||
transition-duration: 200ms;
|
||||
}
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble[data-direction="forward"] {
|
||||
grid-column: 3;
|
||||
justify-self: right;
|
||||
}
|
||||
|
||||
/* --- Bubble icons ---------------------------------------------------------- */
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble .media-icon {
|
||||
display: none;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
|
||||
/* seek: seek icon, flipped for backward */
|
||||
.media-default-skin .media-input-feedback-bubble[data-direction] .media-icon--seek {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble[data-direction="backward"] .media-icon--seek {
|
||||
transform: scaleX(-1);
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.media-default-skin
|
||||
.media-input-feedback-bubble[data-direction="forward"]:not([data-starting-style])
|
||||
.media-icon--seek {
|
||||
animation: media-slide-in-forward 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.media-default-skin
|
||||
.media-input-feedback-bubble[data-direction="backward"]:not([data-starting-style])
|
||||
.media-icon--seek {
|
||||
animation: media-slide-in-backward 300ms ease-in-out;
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-island--status[data-status]:not([data-starting-style]) .media-icon,
|
||||
.media-default-skin .media-input-feedback-bubble[data-status]:not([data-starting-style]) .media-icon {
|
||||
animation: media-pop-in 250ms ease-out;
|
||||
}
|
||||
}
|
||||
|
||||
.media-default-skin .media-input-feedback-bubble[data-status="pause"] .media-icon--pause,
|
||||
.media-default-skin .media-input-feedback-bubble[data-status="play"] .media-icon--play {
|
||||
display: block;
|
||||
}
|
||||
@@ -16,6 +16,10 @@
|
||||
.media-default-skin button {
|
||||
font: inherit;
|
||||
}
|
||||
.media-default-skin [hidden][hidden] {
|
||||
/* Keep authored templates hidden even when component classes set display. */
|
||||
display: none;
|
||||
}
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
.media-default-skin {
|
||||
interpolate-size: allow-keywords;
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
========================================================================== */
|
||||
|
||||
.media-default-skin {
|
||||
--media-current-shadow-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - 0.5) * 0.5), 0.15));
|
||||
--media-current-shadow-color-subtle: oklch(from var(--media-current-shadow-color) l c h / calc(alpha * 0.4));
|
||||
--media-icon-size: 18px;
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 100%;
|
||||
@@ -19,20 +22,22 @@
|
||||
line-height: 1.5;
|
||||
letter-spacing: normal;
|
||||
outline: 2px solid transparent;
|
||||
outline-offset: 2px;
|
||||
outline-offset: -4px;
|
||||
border-radius: var(--media-border-radius, 2rem);
|
||||
isolation: isolate;
|
||||
transition-timing-function: ease-out;
|
||||
transition-duration: 100ms;
|
||||
transition-property: outline-offset, outline-color;
|
||||
|
||||
&:focus-visible {
|
||||
outline-color: currentColor;
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
& > * {
|
||||
font-size: 0.75rem; /* 12px at 100% font size */
|
||||
}
|
||||
|
||||
@container media-root (width > 48rem) {
|
||||
& > * {
|
||||
@container media-root (width > 48rem) {
|
||||
font-size: 0.875rem; /* 14px at 100% font size */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
background-color: currentColor;
|
||||
border-radius: calc(infinity * 1px);
|
||||
box-shadow:
|
||||
0 0 0 1px var(--media-controls-current-shadow-color-subtle, oklch(0 0 0 / 0.1)),
|
||||
0 0 0 1px var(--media-current-shadow-color-subtle, 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;
|
||||
|
||||
@@ -15,14 +15,17 @@
|
||||
@import "./components/slider.css";
|
||||
@import "./components/popup.css";
|
||||
@import "./components/captions.css";
|
||||
@import "./components/input-feedback.css";
|
||||
@import "../../shared/css/video/icon-state.css";
|
||||
@import "../../shared/global/video/keyframes.css";
|
||||
@import "../../shared/global/video/properties.css";
|
||||
|
||||
/* ==========================================================================
|
||||
Root
|
||||
========================================================================== */
|
||||
|
||||
.media-default-skin--video {
|
||||
--media-spring-transition: linear(
|
||||
--media-spring-timing-function: linear(
|
||||
0,
|
||||
0.034 1.5%,
|
||||
0.763 9.7%,
|
||||
@@ -44,7 +47,7 @@
|
||||
--media-controls-transition-timing-function: ease-out;
|
||||
--media-error-dialog-transition-duration: 350ms;
|
||||
--media-error-dialog-transition-delay: 100ms;
|
||||
--media-error-dialog-transition-timing-function: var(--media-spring-transition);
|
||||
--media-error-dialog-transition-timing-function: var(--media-spring-timing-function);
|
||||
--media-popup-transition-duration: 100ms;
|
||||
--media-popup-transition-timing-function: ease-out;
|
||||
--media-tooltip-side-offset: 0.75rem;
|
||||
|
||||
Reference in New Issue
Block a user