Jump to a component
AniCanonKit · Productions
ProductionNav
ProductionNav is the side bar inside a production (an episode, a short, and later a manga issue). The app's SideNav is not shown there: a production is a focused, full-screen workspace.
@anicanon/sakuga/anicanonkitv1.0Used onWebFrom AniCanon™
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Web only
ProductionNav is made for the web, and isn’t part of Sakuga for iOS yet.
Android
Web only
ProductionNav is made for the web, and isn’t part of Sakuga for Android yet.
- Use it for
- The side bar inside a production (an episode, a short, a manga issue): its views, scenes and the facts that matter while making it, folding to a rail of views and tools in the editor.
- Not for
- The creator sidebar outside a productionSideNav
- The top of a view with its title and actionsViewHeader
- The steps of a full-screen flowStepper
- The desktop header across the appTopNav
Guidelines
- Expanded (Script, Plan, Make, Screen, Publish): back to the list, the production's cover, title and format; the views with their state (
note, andstate: 'attention'when something needs you); the scenes with their picture and state; the facts that matter while making it (runtime against plan, story place, video plan); the fragments balance. collapsed(Cut): one 72px rail with the cover, the views as icons, a separator and the editor'stools(currentToolmarks the open one), so the picture gets the room.- Every place it can take you is a link:
back.href, andhrefon each view, scene and tool;balanceHrefis where the balance leads. Without an address, an item is a button that runs itsonClick(onBalancefor the balance), never a link to #. - The current view, scene and tool read in ink weight with the small state dot (
state-dot) beside the name; on the rail the dot sits at the edge, centred on the icon. No fill, no edge.
import { ProductionNav } from '@anicanon/sakuga/anicanonkit';
const views = [
{ icon: 'document', label: 'Script', note: '5 scenes' },
{ icon: 'frame-cinematic', label: 'Plan', note: '22 cuts' },
{ icon: 'video', label: 'Make', note: '3 to review', state: 'attention' },
{ icon: 'film', label: 'Cut', note: '6:40' },
{ icon: 'eye', label: 'Screen' },
{ icon: 'share', label: 'Publish' },
];
export default function ProductionNavExample() {
return (
<Fragment>
<ProductionNav
back={{ label: 'Episodes' }}
production={{
title: 'The First Watch',
meta: 'Episode 2 · Directed · 16:9',
}}
views={views}
current="Make"
sections={{
title: 'Scenes',
selected: 2,
items: [
{ number: 1, title: 'Toddy’s bedroom', note: 'In the cut' },
{
number: 2,
title: 'Smith’s apartment',
note: '2 to review',
state: 'attention',
},
{ number: 3, title: 'The stairs', note: 'In the cut' },
],
}}
facts={[
{ label: 'Cut', value: '6:40 of 11:00', percent: 60 },
{ label: 'Story', value: 'After Kiko’s offer' },
]}
balance="9,427"
/>
<ProductionNav
collapsed
views={views}
current="Cut"
tools={[
{ icon: 'collection', label: 'Media' },
{ icon: 'effect-sparks', label: 'Effects' },
{ icon: 'volume', label: 'Audio' },
{ icon: 'captions', label: 'Captions' },
]}
currentTool="Effects"
balance="9,427"
/>
</Fragment>
);
}PropsProductionNavProps
viewsrequired{ icon: IconName; label: string; note?: string; state?: 'attention'; href?: string; onClick?: MouseEventHandler; }[]back{ label: string; href?: string; onClick?: MouseEventHandler; }production{ title: string; meta?: string; image?: string; }currentstringsections{ title?: string; selected?: number; items: { number: number; title: string; image?: string; note?: string; state?: 'attention'; href?: string; onClick?: MouseEventHandler; }[]; }facts{ label: string; value: string; percent?: number; }[]balancestringbalanceHrefstringonBalanceMouseEventHandlercollapsedbooleantools{ icon: IconName; label: string; short?: string; href?: string; onClick?: MouseEventHandler; }[]currentToolstringlabelstringclassNamestringAn IconName is any of the names Icon lists.
Each 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
prodnav-bgProductionNav: background (the production's own side bar).bg-surface→neutral-0#ffffffbg-surface→neutral-900#111117prodnav-borderProductionNav: edge and rail separator.border-hairline→shade-a08rgba(11,10,16,0.08)border-hairline→white-a06rgba(255,255,255,0.06)prodnav-fgProductionNav: title and current items.text-primary→neutral-925#0b0a10text-primary→neutral-0#ffffffprodnav-itemProductionNav: items.text-secondary→neutral-800#2e2d36text-secondary→neutral-200#dcdcdeprodnav-mutedProductionNav: labels, notes and meta.text-muted→neutral-600#5c5b67text-muted→neutral-400#a3a3a7prodnav-attentionProductionNav: a note that needs you.text-accent→camellia-700#b42354text-accent→camellia-400#f4779fprodnav-mediaProductionNav: behind thumbnails.bg-media→neutral-950#07070abg-media→neutral-950#07070aprodnav-placeholderProductionNav: a scene with no picture yet.border-placeholder→shade-a24rgba(11,10,16,0.24)border-placeholder→white-a22rgba(255,255,255,0.22)prodnav-trackProductionNav: runtime track.bg-fill→shade-a12rgba(11,10,16,0.12)bg-fill→white-a14rgba(255,255,255,0.14)prodnav-fillProductionNav: runtime made.text-secondary→neutral-800#2e2d36text-secondary→neutral-200#dcdcdeSpace and shape
prodnav-railhead-icon-sizeicon-size-smprodnav-ricon-icon-sizeicon-size-mdprodnav-fill-mark-sizeicon-size-mdprodnav-back-icon-sizeicon-size-smprodnav-item-icon-sizeicon-size-smprodnav-widthprodnav-gapgap-lgprodnav-padding-topinset-lgprodnav-padding-xinset-lgprodnav-padding-bottominset-xlprodnav-edge-right-widthprodnav-back-gapgap-smprodnav-back-padding-xinset-smprodnav-head-gapgap-2xsprodnav-head-padding-xinset-smprodnav-head-img-aspect-ratioratio-videoprodnav-head-img-radiusradius-smprodnav-head-img-margin-bottomgap-mdprodnav-group-gapgap-2xsprodnav-title-margin-bottomgap-xsprodnav-title-padding-xinset-mdprodnav-item-gapgap-lgprodnav-item-heightsize-control-smprodnav-item-padding-xinset-mdprodnav-item-radiusradius-smprodnav-scenes-gapgap-2xsprodnav-scene-gapgap-mdprodnav-scene-padding-yinset-xsprodnav-scene-padding-xinset-mdprodnav-scene-radiusradius-smprodnav-scene-img-widthprodnav-scene-img-heightprodnav-scene-img-radiusradius-xsprodnav-noimg-inset-ring-widthline-hairlineprodnav-facts-row-gapgap-smprodnav-facts-column-gapgap-lgprodnav-facts-padding-xinset-smprodnav-facts-dd-i-heightprodnav-facts-dd-i-margin-topgap-xsprodnav-facts-dd-i-radiusradius-fullprodnav-facts-dd-em-radiusradius-fullprodnav-collapsed-widthprodnav-collapsed-gapgap-mdprodnav-collapsed-padding-topinset-mdprodnav-collapsed-padding-bottominset-lgprodnav-railhead-active-scalescale-press-smprodnav-railhead-sizeprodnav-railhead-radiusradius-smprodnav-railhead-img-sizeprodnav-rail-gapgap-2xsprodnav-ricon-gapgap-2xsprodnav-ricon-widthprodnav-ricon-min-heightprodnav-ricon-radiusradius-smprodnav-ricon-tool-min-heightprodnav-ricon-i-topinset-smprodnav-ricon-i-rightinset-mdprodnav-sep-widthprodnav-sep-heightline-hairlineprodnav-sep-margin-ygap-xsprodnav-active-scalescale-pressprodnav-ricon-after-current-leftinset-2xsprodnav-ricon-after-current-margin-topprodnav-forced-current-widthline-strongprodnav-focus-outline-offsetfocus-ring-offsetprodnav-row-focus-outline-offsetType
prodnav-font-familyfont-sansprodnav-back-fonttext-caption-strongprodnav-head-b-fonttext-title-4prodnav-head-span-fonttext-smallprodnav-title-fonttext-microprodnav-item-fonttext-bodyprodnav-small-fonttext-smallprodnav-small-attention-font-weightweight-strongprodnav-item-page-font-weightweight-boldprodnav-scene-b-fonttext-caption-strongprodnav-scene-b-current-font-weightweight-boldprodnav-facts-fonttext-smallprodnav-ricon-small-fonttext-small-strongprodnav-ricon-small-current-font-weightweight-boldMotion
prodnav-railhead-press-durationmotion-fastprodnav-railhead-press-easingease-standardprodnav-railhead-active-durationmotion-instantprodnav-item-durationmotion-fastprodnav-item-easingease-standardprodnav-active-durationmotion-instantChecked 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 complementary region named by
label(default "Production"): Tab moves through Back, the links of a navigation named "Views" (the current one "current page", with its note), the scene links ("current" on the selected one) and the balance link, while the production's title is a level-2 heading, the scenes' title a level-3 one, and each fact reads its value and percent. Collapsed, the rail's links are named by their titles ("Cast · 3 waiting"), the tools sit in a navigation named "Tools" and are named by theirlabel(not the short word under them), and the balance is the mark alone, still a link named "Fragments balance: 1,240"; pictures, icons and the attention dot are hidden. - 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.