diff --git a/packages/core/src/dom/index.ts b/packages/core/src/dom/index.ts index a4ee0f38..e1f57da7 100644 --- a/packages/core/src/dom/index.ts +++ b/packages/core/src/dom/index.ts @@ -1,5 +1,5 @@ export * from './feature'; -export * from './media/proxy'; +export type { AudioApiProxy, MediaApiProxy, MediaApiProxyTarget, VideoApiProxy } from './media/proxy'; export * from './media/types'; export * from './store/features'; export * from './store/selectors'; diff --git a/packages/react/src/presets/video/minimal-skin.css b/packages/react/src/presets/video/minimal-skin.css index 4561e29b..e90d8b31 100644 --- a/packages/react/src/presets/video/minimal-skin.css +++ b/packages/react/src/presets/video/minimal-skin.css @@ -96,6 +96,7 @@ /* Media Control Bar UI/Styles */ .media-minimal-skin .media-controls { position: absolute; + container: media-controls / inline-size; bottom: 0; inset-inline: 0; padding: 2rem 0.375rem 0.375rem 0.375rem; @@ -133,20 +134,40 @@ } } -/* Time Display */ -.media-minimal-skin .media-time-group { +/* Time Controls */ +.media-minimal-skin .media-time-controls { + display: flex; + flex-direction: row-reverse; + align-items: center; + flex: 1; + gap: 0.75rem; +} +.media-minimal-skin .media-time { display: flex; align-items: center; gap: 0.25rem; } -.media-minimal-skin .media-duration-display { - display: contents; - color: oklab(1 0 0 / 0.5); +.media-minimal-skin .media-time__value--current, +.media-minimal-skin .media-time__separator { + display: none; } -.media-minimal-skin .media-time-display { +.media-minimal-skin .media-time__value { text-shadow: 0 1px 0 oklab(0 0 0 / 0.2); font-variant-numeric: tabular-nums; } +@container media-controls (width > 480px) { + .media-minimal-skin .media-time-controls { + flex-direction: row; + } + .media-minimal-skin .media-time__value--duration, + .media-minimal-skin .media-time__separator { + color: oklab(1 0 0 / 0.5); + } + .media-minimal-skin .media-time__value--current, + .media-minimal-skin .media-time__separator { + display: inline; + } +} /* Button Groups (layout only) */ .media-minimal-skin .media-button-group { @@ -192,6 +213,11 @@ opacity: 0.5; filter: grayscale(1); } +@container media-controls (width < 480px) { + .media-minimal-skin .media-button--seek { + display: none; + } +} /* Icons */ .media-minimal-skin .media-icon__container { diff --git a/packages/react/src/presets/video/minimal-skin.tsx b/packages/react/src/presets/video/minimal-skin.tsx index 448cd272..6cdb4ad1 100644 --- a/packages/react/src/presets/video/minimal-skin.tsx +++ b/packages/react/src/presets/video/minimal-skin.tsx @@ -29,8 +29,8 @@ const SEEK_TIME = 10; export type MinimalVideoSkinProps = BaseSkinProps; -const Button = forwardRef>(function Button(props, ref) { - return )} /> - +
diff --git a/packages/react/src/presets/video/skin.css b/packages/react/src/presets/video/skin.css index 7fc9992f..c23e90fe 100644 --- a/packages/react/src/presets/video/skin.css +++ b/packages/react/src/presets/video/skin.css @@ -129,12 +129,13 @@ /* Media Control Bar UI/Styles */ .media-default-skin .media-controls { position: absolute; + container: media-controls / inline-size; bottom: 0.75rem; inset-inline: 0.75rem; - padding: 0.25rem; + padding: 0.175rem; display: flex; align-items: center; - gap: 0.125rem; + gap: 0.075rem; color: oklab(1 0 0); border-radius: calc(infinity * 1px); will-change: scale, transform, filter, opacity; @@ -160,19 +161,34 @@ scale: 1; } } +@container media-root (width > 640px) { + .media-default-skin .media-controls { + padding: 0.25rem; + gap: 0.125rem; + } +} /* Time Display */ -.media-default-skin .media-time-group { +.media-default-skin .media-time { + container: media-time / inline-size; display: flex; align-items: center; flex: 1; gap: 0.75rem; - padding-inline: 0.375rem; + padding-inline: 0.5rem; } -.media-default-skin .media-time-display { +.media-default-skin .media-time__value { text-shadow: 0 1px 0 oklab(0 0 0 / 0.25); font-variant-numeric: tabular-nums; } +.media-default-skin .media-time .media-time__value:first-child { + display: none; +} +@container media-time (width > 240px) { + .media-default-skin .media-time .media-time__value:first-child { + display: block; + } +} /* Buttons */ .media-default-skin .media-button { @@ -208,6 +224,11 @@ opacity: 0.5; filter: grayscale(1); } +@container media-controls (width < 480px) { + .media-default-skin .media-button--seek { + display: none; + } +} /* Icons */ .media-default-skin .media-icon__container { diff --git a/packages/react/src/presets/video/skin.tsx b/packages/react/src/presets/video/skin.tsx index 12f3f0af..78f3da68 100644 --- a/packages/react/src/presets/video/skin.tsx +++ b/packages/react/src/presets/video/skin.tsx @@ -29,8 +29,8 @@ const SEEK_TIME = 10; export type VideoSkinProps = BaseSkinProps; -const Button = forwardRef>(function Button(props, ref) { - return