Theme
Sound
Jump to a component
Core · Media
Scrubber
Scrubber shows and sets the playhead: played, buffered and remaining time, with the current time and total length.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Coming soon
Scrubber for iOS is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
Android
Coming soon
Scrubber for Android is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
- Use it for
- Showing and setting the playhead of an episode or a short, over video or the player bar: played, buffered and remaining time, with chapter marks.
- Not for
- How far something being made has comeProgress
- Seeking inside a voice line or a soundAudioPlayer
- The playhead across the cut's tracksTimeline
- Moving through the story in story orderStoryScrubber
Guidelines
- It is a
sliderwith spoken values ("3 minutes 12 seconds of 11 minutes 36 seconds"). Arrow keys move 10 seconds, Page keys a minute, Home and End jump to the ends. - Always over video or the player bar, so it uses the media tokens and stays the same in both themes.
showTimes={false}when the times are shown elsewhere (phone shorts).markersdraws chapter marks (in seconds) cut into the track.- The thumb grows and the track thickens under the pointer. Dragging follows the pointer with no easing; playback moves the fill linearly.
import { useState } from 'react';
import { Scrubber } from '@anicanon/sakuga/ui';
export default function ScrubberExample() {
const [value, setValue] = useState(192);
return (
<Scrubber value={value} max={696} buffered={320} onChange={setValue} />
);
}PropsScrubberProps
valuerequirednumbermaxrequirednumbermarkersnumber[]Chapter marks, in seconds.
bufferednumberstepnumberlabelstringshowTimesbooleanonChange(seconds: number) => voidclassNamestringEach token reads a role, and the role lands on a value in each theme. Change the role and every component that reads it follows.
Colour
scrubber-trackScrubber: unplayed range.bg-unplayed-mediawhite-a28rgba(255,255,255,0.28)bg-unplayed-mediawhite-a28rgba(255,255,255,0.28)scrubber-bufferScrubber: buffered range.bg-buffered-mediawhite-a45rgba(255,255,255,0.45)bg-buffered-mediawhite-a45rgba(255,255,255,0.45)scrubber-fillScrubber: played range.accentcamellia-600#c2335faccentcamellia-400#f4779fscrubber-thumbScrubber: handle.text-on-medianeutral-0#fffffftext-on-medianeutral-0#ffffffscrubber-timeScrubber: timecodes.text-on-medianeutral-0#fffffftext-on-medianeutral-0#ffffffscrubber-markerScrubber: chapter marks cut into the track.bg-medianeutral-950#07070abg-medianeutral-950#07070aSpace and shape
scrubber-wrap-gapgap-lg12px
scrubber-heightits own value
24px
scrubber-track-heightits own value
4px
scrubber-track-before-radiusradius-full9999px
scrubber-buf-heightits own value
4px
scrubber-buf-radiusradius-full9999px
scrubber-fill-heightits own value
4px
scrubber-fill-radiusradius-full9999px
scrubber-mark-topits own value
calc(-1 * 2px)
scrubber-mark-widthline-strong2px
scrubber-mark-heightits own value
8px
scrubber-mark-margin-leftits own value
calc(2px / -2)
scrubber-thumb-sizeits own value
16px
scrubber-thumb-margin-topits own value
calc(16px / -2)
scrubber-thumb-margin-leftits own value
calc(16px / -2)
scrubber-thumb-scaleits own value
.75
scrubber-track-before-hover-scale-yits own value
1.5
scrubber-thumb-dragging-scaleits own value
1.25
scrubber-forced-thumb-edge-widthline-strong2px
Type
scrubber-wrap-fonttext-caption-strong600 13px/18px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
Motion
scrubber-track-before-durationmotion-fast160ms
scrubber-track-before-easingease-standardcubic-bezier(0.2, 0, 0, 1)
scrubber-thumb-durationmotion-fast160ms
scrubber-thumb-easingease-standardcubic-bezier(0.2, 0, 0, 1)
Checked automatically with axe-core 4.11.4 against WCAG 2.2 A and AA, on the live preview above, in light and dark, on 26 October 2026.
- Result
- No issues found, in light or in dark.
- By design
- A slider named by
label(default "Seek") that Tab reaches: arrows move it bystepseconds (default 10), Page Up and Page Down by six steps, Home and End to either end, and its value is spoken as "1 minute 5 seconds of 3 minutes 0 seconds". The times beside it read as text and the markers are hidden; withoutonChangeit reads as read-only. - Not tested
- The automated check doesn't test keyboard use, focus order or what a screen reader says. The lines above are the design system's own account of them.