---
title: UI Components
description: Understanding Video.js v10's primitive-based component architecture
---
import FrameworkCase from '@/components/docs/FrameworkCase.astro';
import DocsLink from '@/components/docs/DocsLink.astro';
Video.js v10 components are built from **unstyled UI primitives**, taking inspiration from projects like [shadcn/ui](https://ui.shadcn.com/) and [Base UI](https://base-ui.com/). This approach gives you control over styling and behavior while handling the complex interactions for you.
## Core Principles
### 1. Primitive-Based Design
Each primitive represents at most **one HTML element**, without internal elements.
```tsx
{/* One element: the track */}
{/* One element: the progress bar */}
{/* One element: hover indicator */}
{/* One element: the draggable thumb */}
```
```html
```
### 2. Compound Components
Complex components are broken into smaller, composable pieces. This pattern is used for:
- **Sliders** - Root, Track, Thumb, Progress, Pointer
- **Tooltips** - Root, Trigger, Positioner, Popup, Arrow, Portal
- **Popovers** - Root, Trigger, Positioner, Popup, Portal
Each piece handles one concern, but they work together seamlessly.
### 3. Built-in Accessibility
Components include proper ARIA attributes, keyboard navigation, and focus management out of the box:
- Buttons have correct roles and labels
- Sliders support arrow key navigation
- Focus is managed properly in tooltips and popovers
- Screen readers get meaningful announcements
### 4. Data Attributes for Styling
Components expose state through data attributes, allowing pure CSS state styling:
```css
/* Style based on state without JavaScript */
button[data-paused] {
/* Paused state */
}
button:not([data-paused]) {
/* Playing state */
}
```
Common data attributes:
- `data-paused` - Present when media is paused
- `data-muted` - Present when audio is muted
- `data-fullscreen` - Present when in fullscreen mode
- `data-volume-level` - Values: `high`, `medium`, `low`, `off`
## Available Components
### Simple Components
Single-element components that handle one piece of UI:
- **PlayButton** - Play/pause toggle
- **MuteButton** - Audio mute toggle
- **FullscreenButton** - Fullscreen toggle
- **CurrentTimeDisplay** - Current playback time
- **DurationDisplay** - Total media duration
- **PreviewTimeDisplay** - Time at hover position
### Compound Components
Multi-element components for complex interactions:
- **TimeSlider** - Seekable timeline with progress
- **VolumeSlider** - Volume control slider
- **Tooltip** - Hover tooltips with positioning
- **Popover** - Click/hover popovers with collision detection