Jump to a component
AniCanonKit · Productions
ProgramBar
ProgramBar is the whole cut at a glance: sections in planned proportion (cut, partial with gaps, missing), the window the Timeline shows, the playhead, and numbered note marks from screening. A mark sits on its own rail above the bar, its number centred in its badge, with a hairline down to its exact point, as Timeline's markers do, so it never covers a section's label.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Web only
ProgramBar is made for the web, and isn’t part of Sakuga for iOS yet.
Android
Web only
ProgramBar is made for the web, and isn’t part of Sakuga for Android yet.
- Use it for
- The whole cut at a glance: its sections in planned proportion, the window the Timeline shows, the playhead and numbered notes from screening.
- Not for
- The cut's tracks to editTimeline
- The playhead of an episode or a short being watchedScrubber
- How far something being made has comeProgress
- Moving through the story in story orderStoryScrubber
import { ProgramBar } from '@anicanon/sakuga/anicanonkit';
export default function ProgramBarExample() {
return (
<ProgramBar
duration={400}
planned={660}
total="6:40 of 11:00"
window={{ start: 140, length: 40 }}
playhead={161}
marks={[
{ at: 96, label: '1', done: true },
{ at: 402, label: '2' },
]}
sections={[
{ label: '#1', start: 0, length: 110 },
{ label: '#2 The roof', start: 110, length: 160, state: 'partial' },
{ label: '#3', start: 270, length: 90 },
{ label: '#4', start: 360, length: 120, state: 'partial' },
{ label: '#5 Red Line', start: 480, length: 180, state: 'missing' },
]}
/>
);
}PropsProgramBarProps
durationrequirednumberplannednumbertotalstringplayheadnumberwindow{ start: number; length: number; }sections{ label: string; start: number; length: number; state?: 'cut' | 'partial' | 'missing'; }[]marks{ at: number; label: string; done?: boolean; }[]labelstringclassNamestringEach 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
pbar-bgProgramBar: the track.bg-fill-subtleshade-a06rgba(11,10,16,0.06)bg-fill-subtlewhite-a08rgba(255,255,255,0.08)pbar-borderProgramBar: track edge.border-hairlineshade-a08rgba(11,10,16,0.08)border-hairlinewhite-a06rgba(255,255,255,0.06)pbar-cutProgramBar: a section in the cut.bg-surface-raisedneutral-100#ececf0bg-surface-raisedneutral-875#1a1a21pbar-partialProgramBar: dashed edge on a section with gaps.border-controlshade-a52rgba(11,10,16,0.52)border-controlwhite-a45rgba(255,255,255,0.45)pbar-missingProgramBar: a planned section not cut yet.border-placeholdershade-a24rgba(11,10,16,0.24)border-placeholderwhite-a22rgba(255,255,255,0.22)pbar-labelProgramBar: section label.text-secondaryneutral-800#2e2d36text-secondaryneutral-200#dcdcdepbar-metaProgramBar: total and missing labels.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7pbar-windowProgramBar: the part the timeline shows, the playhead and open notes.accentcamellia-600#c2335faccentcamellia-400#f4779fpbar-mark-fgProgramBar: note number.on-accentneutral-0#ffffffon-accentneutral-925#0b0a10Space and shape
pbar-gapgap-mdpbar-track-heightpbar-track-radiusradius-smpbar-track-inset-ring-widthline-hairlinepbar-sec-insetinset-2xspbar-sec-padding-xinset-xspbar-sec-radiusradius-xspbar-sec-border-right-widthline-hairlinepbar-sec-partial-outline-widthline-strongpbar-sec-partial-outline-offsetpbar-sec-missing-outline-widthline-strongpbar-sec-missing-outline-offsetpbar-window-radiusradius-smpbar-window-inset-ring-widthline-strongpbar-playhead-insetpbar-playhead-border-left-widthline-strongpbar-mark-toppbar-mark-min-widthicon-size-mdpbar-mark-heighticon-size-mdpbar-mark-padding-xinset-xspbar-mark-radiusradius-fullpbar-mark-gapgap-xspbar-mark-line-widthline-hairlineType
pbar-sec-b-fonttext-small-strongpbar-mark-fonttext-micropbar-total-fonttext-small-strongMotion
pbar-sec-durationmotion-basepbar-sec-easingease-standardChecked 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
- Not focusable; a group named by
label(default "The whole cut") whose section labels (with "partly cut" or "missing"), mark labels (with "done"), the window ("Timeline shows 0:30 to 1:00"), the playhead ("Playhead at 0:42") and the total read as text. - 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.