docs(site): add thumbnail reference page (#654)

This commit is contained in:
rahim
2026-02-28 00:40:44 -08:00
committed by GitHub
parent ed43d52f8f
commit e63d591d6e
20 changed files with 532 additions and 2 deletions
@@ -0,0 +1,205 @@
---
title: Thumbnail
frameworkTitle:
html: media-thumbnail
description: Time-based thumbnail preview component for timeline scrubbing and hover previews
---
import ComponentReference from "@/components/docs/api-reference/ComponentReference.astro";
import FrameworkCase from "@/components/docs/FrameworkCase.astro";
import StyleCase from "@/components/docs/StyleCase.astro";
import Demo from "@/components/docs/demos/Demo.astro";
{/* React demos */}
import TextTrackDemoReact from "@/components/docs/demos/thumbnail/react/css/BasicUsage";
import textTrackReactTsx from "@/components/docs/demos/thumbnail/react/css/BasicUsage.tsx?raw";
import textTrackReactCss from "@/components/docs/demos/thumbnail/react/css/BasicUsage.css?raw";
import JsonDemoReact from "@/components/docs/demos/thumbnail/react/css/JsonUsage";
import jsonReactTsx from "@/components/docs/demos/thumbnail/react/css/JsonUsage.tsx?raw";
import JsonSpriteDemoReact from "@/components/docs/demos/thumbnail/react/css/JsonSpriteUsage";
import jsonSpriteReactTsx from "@/components/docs/demos/thumbnail/react/css/JsonSpriteUsage.tsx?raw";
{/* HTML demos */}
import TextTrackDemoHtml from "@/components/docs/demos/thumbnail/html/css/BasicUsage.astro";
import textTrackHtml from "@/components/docs/demos/thumbnail/html/css/BasicUsage.html?raw";
import textTrackHtmlCss from "@/components/docs/demos/thumbnail/html/css/BasicUsage.css?raw";
import textTrackHtmlTs from "@/components/docs/demos/thumbnail/html/css/BasicUsage.ts?raw";
import JsonDemoHtml from "@/components/docs/demos/thumbnail/html/css/JsonUsage.astro";
import jsonHtml from "@/components/docs/demos/thumbnail/html/css/JsonUsage.html?raw";
import jsonHtmlTs from "@/components/docs/demos/thumbnail/html/css/JsonUsage.ts?raw";
import JsonSpriteDemoHtml from "@/components/docs/demos/thumbnail/html/css/JsonSpriteUsage.astro";
import jsonSpriteHtml from "@/components/docs/demos/thumbnail/html/css/JsonSpriteUsage.html?raw";
import jsonSpriteHtmlTs from "@/components/docs/demos/thumbnail/html/css/JsonSpriteUsage.ts?raw";
## 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`
<FrameworkCase frameworks={["react"]}>
```tsx
<Video src="video.mp4">
<track
kind="metadata"
label="thumbnails"
src="https://image.mux.com/lhnU49l1VGi3zrTAZhDm9LUUxSjpaPW9BL4jY25Kwo4/storyboard.vtt"
default
/>
</Video>
<Thumbnail time={12} />
```
</FrameworkCase>
<FrameworkCase frameworks={["html"]}>
```html
<video src="video.mp4">
<track
kind="metadata"
label="thumbnails"
src="https://image.mux.com/lhnU49l1VGi3zrTAZhDm9LUUxSjpaPW9BL4jY25Kwo4/storyboard.vtt"
default
/>
</video>
<media-thumbnail time="12"></media-thumbnail>
```
</FrameworkCase>
## Anatomy
<FrameworkCase frameworks={["react"]}>
```tsx
<Thumbnail time={12} />
```
</FrameworkCase>
<FrameworkCase frameworks={["html"]}>
```html
<media-thumbnail time="12"></media-thumbnail>
```
</FrameworkCase>
## 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:
```css
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)
<FrameworkCase frameworks={["react"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "App.tsx", code: textTrackReactTsx, lang: "tsx" },
{ title: "App.css", code: textTrackReactCss, lang: "css" },
]}
>
<TextTrackDemoReact client:idle />
</Demo>
</StyleCase>
</FrameworkCase>
<FrameworkCase frameworks={["html"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "index.html", code: textTrackHtml, lang: "html" },
{ title: "index.css", code: textTrackHtmlCss, lang: "css" },
{ title: "index.ts", code: textTrackHtmlTs, lang: "ts" },
]}
>
<TextTrackDemoHtml />
</Demo>
</StyleCase>
</FrameworkCase>
### JSON Array
<FrameworkCase frameworks={["react"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "App.tsx", code: jsonReactTsx, lang: "tsx" },
]}
>
<JsonDemoReact client:idle />
</Demo>
</StyleCase>
</FrameworkCase>
<FrameworkCase frameworks={["html"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "index.html", code: jsonHtml, lang: "html" },
{ title: "index.ts", code: jsonHtmlTs, lang: "ts" },
]}
>
<JsonDemoHtml />
</Demo>
</StyleCase>
</FrameworkCase>
### JSON Sprite Array
<FrameworkCase frameworks={["react"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "App.tsx", code: jsonSpriteReactTsx, lang: "tsx" },
]}
>
<JsonSpriteDemoReact client:idle />
</Demo>
</StyleCase>
</FrameworkCase>
<FrameworkCase frameworks={["html"]}>
<StyleCase styles={["css"]}>
<Demo
files={[
{ title: "index.html", code: jsonSpriteHtml, lang: "html" },
{ title: "index.ts", code: jsonSpriteHtmlTs, lang: "ts" },
]}
>
<JsonSpriteDemoHtml />
</Demo>
</StyleCase>
</FrameworkCase>
<ComponentReference component="Thumbnail" />