FrameworkStyle

media-thumbnail

Time-based thumbnail preview component for timeline scrubbing and hover previews

Quick Start: Video Track

Thumbnail can read thumbnail cues directly from your video track. Add a <track> with kind="metadata" and label="thumbnails" to your media element.

Mux provides this as storyboard.vtt:

https://image.mux.com/{PLAYBACK_ID}/storyboard.vtt

<video src="video.mp4">
  <track
    kind="metadata"
    label="thumbnails"
    src="https://image.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/storyboard.vtt"
    default
  />
</video>
<media-thumbnail time="12"></media-thumbnail>

Anatomy

<media-thumbnail time="12"></media-thumbnail>

Behavior

Thumbnail resolves an image for the current time.

Supported source formats:

  • Text track: <track kind="metadata" label="thumbnails" src="...vtt">
  • JSON array: { url, startTime, endTime? }[]
  • JSON sprite array: { url, startTime, endTime?, width, height, coords }[]

In React, text-track mode needs Player.Provider because it reads track state from the player store. JSON modes (thumbnails prop) work without Provider.

The component picks the latest thumbnail whose startTime is less than or equal to the current time, then scales/clips sprite tiles to fit CSS min/max constraints while preserving aspect ratio.

Styling

Use state data attributes for pure CSS styling:

media-thumbnail[data-hidden] {
  display: none;
}

media-thumbnail[data-loading] {
  opacity: 0.6;
}

media-thumbnail[data-error] {
  outline: 1px solid #ef4444;
}

Accessibility

Thumbnail is decorative by default (aria-hidden="true"). It is intended for visual preview UX (for example, timeline hover previews) rather than primary accessible content.

Examples

Text Track (VTT)

<section class="html-thumbnail-text-track">
    <video-player>
        <media-container>
            <video
                class="html-thumbnail-text-track__media"
                src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4"
                preload="auto"
                muted
                playsinline
                crossorigin="anonymous"
            >
                <track
                    kind="metadata"
                    label="thumbnails"
                    src="/docs/demos/thumbnail/basic.vtt"
                    default
                />
            </video>
            <media-thumbnail class="html-thumbnail-text-track__thumbnail" time="12"></media-thumbnail>
        </media-container>
    </video-player>
</section>

JSON Array

<media-thumbnail time="12" style="max-width: 240px;"></media-thumbnail>

JSON Sprite Array

<media-thumbnail time="12" style="max-width: 240px;"></media-thumbnail>

API Reference

Props

Prop Type Default
crossOrigin 'anonymous' | 'use-credentials' | '' ...
fetchPriority 'high' | 'low' | 'auto'
loading 'eager' | 'lazy'
time number

State

State is reflected as data attributes for CSS styling.

Property Type
loading boolean
error boolean
hidden boolean

Data attributes

Attribute Type
data-loading
data-error
data-hidden