} />} />
- Toggle playback rate
+
@@ -311,6 +321,73 @@ export function MinimalVideoSkinTailwind(props: MinimalVideoSkinProps): ReactNod
+
+ {/* Hotkeys */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Gestures */}
+
+
+
+
+
+
+ {/* Input Feedback */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/react/src/presets/video/minimal-skin.tsx b/packages/react/src/presets/video/minimal-skin.tsx
index e4d3166b..b71c3f2f 100644
--- a/packages/react/src/presets/video/minimal-skin.tsx
+++ b/packages/react/src/presets/video/minimal-skin.tsx
@@ -6,6 +6,7 @@ import {
CaptionsOnIcon,
CastEnterIcon,
CastExitIcon,
+ ChevronIcon,
FullscreenEnterIcon,
FullscreenExitIcon,
PauseIcon,
@@ -26,6 +27,8 @@ import { CastButton } from '@/ui/cast-button';
import { Controls } from '@/ui/controls';
import { ErrorDialog } from '@/ui/error-dialog';
import { FullscreenButton } from '@/ui/fullscreen-button';
+import { Gesture } from '@/ui/gesture';
+import { Hotkey } from '@/ui/hotkey';
import { MuteButton } from '@/ui/mute-button';
import { PiPButton } from '@/ui/pip-button';
import { PlayButton } from '@/ui/play-button';
@@ -33,15 +36,21 @@ import { PlaybackRateButton } from '@/ui/playback-rate-button';
import { Popover } from '@/ui/popover';
import { Poster } from '@/ui/poster';
import { SeekButton } from '@/ui/seek-button';
+import { SeekIndicator } from '@/ui/seek-indicator';
import { Slider } from '@/ui/slider';
+import { StatusAnnouncer } from '@/ui/status-announcer/status-announcer';
+import { StatusIndicator } from '@/ui/status-indicator';
import { Time } from '@/ui/time';
import { TimeSlider } from '@/ui/time-slider';
import { Tooltip } from '@/ui/tooltip';
+import { VolumeIndicator } from '@/ui/volume-indicator';
import { VolumeSlider } from '@/ui/volume-slider';
import { isRenderProp } from '@/utils/use-render';
import type { BaseVideoSkinProps } from '../types';
const SEEK_TIME = 10;
+const TOP_STATUS_ACTIONS = ['toggleSubtitles', 'toggleFullscreen', 'togglePictureInPicture'] as const;
+const CENTER_STATUS_ACTIONS = ['togglePaused'] as const;
export type MinimalVideoSkinProps = BaseVideoSkinProps;
@@ -144,7 +153,7 @@ export function MinimalVideoSkin(props: MinimalVideoSkinProps): ReactNode {
}
/>
-
Seek backward {SEEK_TIME} seconds
+
@@ -158,7 +167,7 @@ export function MinimalVideoSkin(props: MinimalVideoSkinProps): ReactNode {
}
/>
- Seek forward {SEEK_TIME} seconds
+
@@ -191,7 +200,7 @@ export function MinimalVideoSkin(props: MinimalVideoSkinProps): ReactNode {
} />} />
- Toggle playback rate
+
@@ -307,6 +317,72 @@ export function VideoSkinTailwind(props: VideoSkinProps): ReactNode {
+
+ {/* Hotkeys */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Gestures */}
+
+
+
+
+
+
+ {/* Input Feedback */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/react/src/presets/video/skin.tsx b/packages/react/src/presets/video/skin.tsx
index 95477070..e9265477 100644
--- a/packages/react/src/presets/video/skin.tsx
+++ b/packages/react/src/presets/video/skin.tsx
@@ -6,6 +6,7 @@ import {
CaptionsOnIcon,
CastEnterIcon,
CastExitIcon,
+ ChevronIcon,
FullscreenEnterIcon,
FullscreenExitIcon,
PauseIcon,
@@ -26,8 +27,8 @@ import { CastButton } from '@/ui/cast-button';
import { Controls } from '@/ui/controls';
import { ErrorDialog } from '@/ui/error-dialog';
import { FullscreenButton } from '@/ui/fullscreen-button';
-import { Gesture } from '@/ui/gesture/gesture';
-import { Hotkey } from '@/ui/hotkey/hotkey';
+import { Gesture } from '@/ui/gesture';
+import { Hotkey } from '@/ui/hotkey';
import { MuteButton } from '@/ui/mute-button';
import { PiPButton } from '@/ui/pip-button';
import { PlayButton } from '@/ui/play-button';
@@ -35,15 +36,21 @@ import { PlaybackRateButton } from '@/ui/playback-rate-button';
import { Popover } from '@/ui/popover';
import { Poster } from '@/ui/poster';
import { SeekButton } from '@/ui/seek-button';
+import { SeekIndicator } from '@/ui/seek-indicator';
import { Slider } from '@/ui/slider';
+import { StatusAnnouncer } from '@/ui/status-announcer/status-announcer';
+import { StatusIndicator } from '@/ui/status-indicator';
import { Time } from '@/ui/time';
import { TimeSlider } from '@/ui/time-slider';
import { Tooltip } from '@/ui/tooltip';
+import { VolumeIndicator } from '@/ui/volume-indicator';
import { VolumeSlider } from '@/ui/volume-slider';
import { isRenderProp } from '@/utils/use-render';
import type { BaseVideoSkinProps } from '../types';
const SEEK_TIME = 10;
+const TOP_STATUS_ACTIONS = ['toggleSubtitles', 'toggleFullscreen', 'togglePictureInPicture'] as const;
+const CENTER_STATUS_ACTIONS = ['togglePaused'] as const;
export type VideoSkinProps = BaseVideoSkinProps;
@@ -148,7 +155,7 @@ export function VideoSkin(props: VideoSkinProps): ReactNode {
}
/>
-
Seek backward {SEEK_TIME} seconds
+
@@ -162,7 +169,7 @@ export function VideoSkin(props: VideoSkinProps): ReactNode {
}
/>
- Seek forward {SEEK_TIME} seconds
+
@@ -189,7 +196,7 @@ export function VideoSkin(props: VideoSkinProps): ReactNode {