A modern media player based on tiptap and shadcn ui for React
Clone the project
git clone https://github.com/hunghg255/reactjs-player-media.git
Go to the project directory
cd reactjs-player-media
Install dependencies
pnpm install
Start the Demo server
npm run build:lib:dev
npm run playground
The main container component for the media player.
Prop Name | Type | Description |
---|---|---|
onPlay | () => void | Callback when media starts playing |
onPause | () => void | Callback when media is paused |
onEnded | () => void | Callback when playback ends |
onTimeUpdate | (time: number) => void | Callback when playback time updates |
onVolumeChange | (volume: number) => void | Callback when volume changes |
onMuted | (muted: boolean) => void | Callback when muted state changes |
onMediaError | (error: MediaError | null) => void | Callback when a media error occurs |
onPipError | (error: unknown, state: "enter" | "exit") => void | Callback when PiP error occurs |
onFullscreenChange | (fullscreen: boolean) => void | Callback when fullscreen state changes |
dir | "ltr" | "rtl" | Text direction |
label | string | Accessibility label (default: "Media player") |
tooltipSideOffset | number | Tooltip offset (default: 10) |
tooltipDelayDuration | number | Tooltip delay (default: 600) |
autoHide | boolean | Enable auto-hiding controls (default: false) |
disabled | boolean | Disable controls (default: false) |
withoutTooltip | boolean | Disable tooltips (default: false) |
Attribute | Description |
---|---|
[data-controls-visible] |
Present when the controls are visible. |
[data-disabled] |
Present when the media player is disabled. |
[data-state] |
fullscreen , windowed |
The video element, integrated with the player state.
The audio element, integrated with the player state.
A container for the media player controls.
Attribute | Description |
---|---|
[data-disabled] |
Present when the controls are disabled. |
[data-state] |
fullscreen , windowed |
[data-visible] |
Present when the controls are visible. |
Displays as a subtle backdrop that improves readability for media controls.
Attribute | Description |
---|---|
[data-state] |
fullscreen , windowed |
[data-visible] |
Present when the controls are visible. |
A loading indicator that appears when media is loading, similar to YouTube/Netflix style.
Prop Name | Type | Description |
---|---|---|
delay | number | Delay before showing loading indicator (default: 500) |
An error component that displays when media playback encounters an error, with retry and reload options.
Prop Name | Type | Description |
---|---|---|
error | MediaError | null | Media error object |
label | string | Error label |
description | string | Error description |
onRetry | () => void | Callback on retry |
onReload | () => void | Callback on reload |
Attribute | Description |
---|---|
[data-state] |
fullscreen , windowed |
A volume indicator that appears when the volume is changed with keyboard interactions.
A button to play or pause the media.
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
[data-state] |
on , off |
A button to seek backward in the media.
Prop Name | Type | Description |
---|---|---|
seconds | number | Seconds to seek backward (default: 5) |
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
A button to seek forward in the media.
Prop Name | Type | Description |
---|---|---|
seconds | number | Seconds to seek forward (default: 10) |
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
A slider component to seek through the media playback.
Prop Name | Type | Description |
---|---|---|
withTime | boolean | Show current/remaining time (default: false) |
withoutChapter | boolean | Hide chapter markers (default: true) |
withoutTooltip | boolean | Disable seek tooltip (default: false) |
tooltipThumbnailSrc | string | (time: number) => string | Thumbnail for seek preview |
tooltipTimeVariant | "current" | "progress" | Tooltip time display (default: "current") |
tooltipSideOffset | number | Tooltip offset (default: 10) |
tooltipCollisionBoundary | Element | Element[] | Tooltip collision boundary |
tooltipCollisionPadding | number | Partial<Record<"top" | "right" | "bottom" | "left", number>> | Tooltip collision padding (default: 10) |
Attribute | Description |
---|---|
[data-disabled] |
Present when the slider is disabled. |
[data-hovering] |
Present when the seek slider is being actively hovered. |
[data-slider=''] |
Present on the seek slider. |
[data-slot='media-player-seek-container'] |
The container for the seek slider. |
[data-slot='media-player-seek'] |
The root for the seek slider. |
[data-slot='media-player-seek-buffered'] |
The buffered progress indicator within the track. |
[data-slot='media-player-seek-hover-range'] |
The hover preview range indicator. |
[data-slot='media-player-seek-chapter-separator'] |
Chapter separators displayed on the track. |
[data-slot='media-player-seek-thumbnail'] |
The thumbnail preview container in the tooltip. |
[data-slot='media-player-seek-chapter-title'] |
The chapter title in the tooltip. |
[data-slot='media-player-seek-time'] |
The time display in the tooltip. |
<MediaPlayer.Seek
className={cn(
"[&_[data-slot='media-player-seek-buffered']]:bg-primary/60",
"[&_[data-slot='media-player-seek-hover-range']]:bg-primary/70",
"[&_[data-slot='media-player-seek-chapter-separator']]:w-1 [&_[data-slot='media-player-seek-chapter-separator']]:bg-muted",
"[&_[data-slot='media-player-seek-thumbnail']]:border-2 [&_[data-slot='media-player-seek-thumbnail']]:border-ring",
)}
/>
A slider component to control the media volume.
Prop Name | Type | Description |
---|---|---|
expandable | boolean | Expand slider on hover (default: false) |
Attribute | Description |
---|---|
[data-disabled] |
Present when the volume control is disabled. |
[data-slider=''] |
Present on the volume slider. |
[data-slot='media-player-volume-container'] |
The container for the volume slider. |
[data-slot='media-player-volume-trigger'] |
The trigger for the volume slider. |
[data-slot='media-player-volume'] |
The root for the volume slider. |
[data-state] |
on , off |
Displays the current time, duration, or remaining time of the media.
Prop Name | Type | Description |
---|---|---|
variant | "progress" | "remaining" | "duration" | Time display format (default: "progress") |
A select dropdown to control the media playback speed.
Prop Name | Type | Description |
---|---|---|
defaultOpen | boolean | Dropdown open by default (default: false) |
open | boolean | Dropdown open (default: false) |
onOpenChange | (open: boolean) => void | Callback on open/close |
modal | boolean | Dropdown is modal (default: false) |
sideOffset | number | Dropdown offset (default: 10) |
speeds | number[] | Playback speed options (default: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]) |
Attribute | Description |
---|---|
[data-disabled] |
Present when the select is disabled. |
A button to toggle loop mode.
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
[data-state] |
on , off |
A button to toggle fullscreen mode.
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
[data-state] |
on , off |
A button to toggle picture in picture mode (video only).
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
[data-state] |
on , off |
A button to toggle captions or subtitles (video only).
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
[data-state] |
on , off |
A button to download the media file.
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
A dropdown menu with playback speed selector, caption selector, and resolution selector.
Features:
- Playback speed control with customizable speeds
- Video quality/resolution selection (when available)
- Captions/subtitles control
- Organized in a clean dropdown interface
<MediaPlayer.Settings speeds={[0.5, 0.75, 1, 1.25, 1.5, 2]} />
Attribute | Description |
---|---|
[data-disabled] |
Present when the button is disabled. |
Keys | Description |
---|---|
Space, K | Toggles play/pause. |
ArrowRight | Seeks forward 5 seconds (video only). |
ArrowLeft | Seeks backward 5 seconds (video only). |
J | Seeks backward 10 seconds (video only). |
L | Seeks forward 10 seconds (video only). |
Shift + ArrowRight | Seeks forward 5 seconds (audio only). |
Shift + ArrowLeft | Seeks backward 5 seconds (audio only). |
0–9 | Seeks to 0%-90% of duration. |
Home | Seeks to beginning. |
End | Seeks to end. |
ArrowUp | Increases volume (video only). |
ArrowDown | Decreases volume (video only). |
M | Toggles mute. |
R | Toggles repeat mode. |
F | Toggles fullscreen. |
Escape | Exits fullscreen when in fullscreen mode. |
> | Increases playback speed. |
< | Decreases playback speed. |
C | Toggles captions (video only, if available). |
P | Toggles Picture-in-Picture. |
D | Downloads the media file (if download button is present). |