Sakuga Back to Sakuga
Theme
Sound
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, and state: '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's tools (currentTool marks the open one), so the picture gets the room.
  • Every place it can take you is a link: back.href, and href on each view, scene and tool; balanceHref is where the balance leads. Without an address, an item is a button that runs its onClick (onBalance for 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.
ProductionNavExample.jsxReact
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; }
current
string
sections
{ 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; }[]
balance
string
balanceHref
string
Where the balance leads (the Fragments page), open or collapsed.
onBalance
MouseEventHandler
collapsed
boolean
tools
{ icon: IconName; label: string; short?: string; href?: string; onClick?: MouseEventHandler; }[]
currentTool
string
label
string
Names the region; "Production" without it.
className
string

An IconName is any of the names Icon lists.

ProductionNavExample.swiftiOS · coming soon
ProductionNavExample.ktAndroid · coming soon

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-surfaceneutral-0#ffffff
bg-surfaceneutral-900#111117
prodnav-borderProductionNav: edge and rail separator.
border-hairlineshade-a08rgba(11,10,16,0.08)
border-hairlinewhite-a06rgba(255,255,255,0.06)
prodnav-fgProductionNav: title and current items.
text-primaryneutral-925#0b0a10
text-primaryneutral-0#ffffff
prodnav-itemProductionNav: items.
text-secondaryneutral-800#2e2d36
text-secondaryneutral-200#dcdcde
prodnav-mutedProductionNav: labels, notes and meta.
text-mutedneutral-600#5c5b67
text-mutedneutral-400#a3a3a7
prodnav-attentionProductionNav: a note that needs you.
text-accentcamellia-700#b42354
text-accentcamellia-400#f4779f
prodnav-mediaProductionNav: behind thumbnails.
bg-medianeutral-950#07070a
bg-medianeutral-950#07070a
prodnav-placeholderProductionNav: a scene with no picture yet.
border-placeholdershade-a24rgba(11,10,16,0.24)
border-placeholderwhite-a22rgba(255,255,255,0.22)
prodnav-trackProductionNav: runtime track.
bg-fillshade-a12rgba(11,10,16,0.12)
bg-fillwhite-a14rgba(255,255,255,0.14)
prodnav-fillProductionNav: runtime made.
text-secondaryneutral-800#2e2d36
text-secondaryneutral-200#dcdcde

Space and shape

prodnav-railhead-icon-size
icon-size-sm
16px
prodnav-ricon-icon-size
icon-size-md
20px
prodnav-fill-mark-size
icon-size-md
20px
prodnav-back-icon-size
icon-size-sm
16px
prodnav-item-icon-size
icon-size-sm
16px
prodnav-width
its own value
248px
prodnav-gap
gap-lg
12px
prodnav-padding-top
inset-lg
16px
prodnav-padding-x
inset-lg
16px
prodnav-padding-bottom
inset-xl
24px
prodnav-edge-right-width
its own value
1px
prodnav-back-gap
gap-sm
6px
prodnav-back-padding-x
inset-sm
8px
prodnav-head-gap
gap-2xs
2px
prodnav-head-padding-x
inset-sm
8px
prodnav-head-img-aspect-ratio
ratio-video
16/9
prodnav-head-img-radius
radius-sm
8px
prodnav-head-img-margin-bottom
gap-md
8px
prodnav-group-gap
gap-2xs
2px
prodnav-title-margin-bottom
gap-xs
4px
prodnav-title-padding-x
inset-md
12px
prodnav-item-gap
gap-lg
12px
prodnav-item-height
size-control-sm
36px
prodnav-item-padding-x
inset-md
12px
prodnav-item-radius
radius-sm
8px
prodnav-scenes-gap
gap-2xs
2px
prodnav-scene-gap
gap-md
8px
prodnav-scene-padding-y
inset-xs
4px
prodnav-scene-padding-x
inset-md
12px
prodnav-scene-radius
radius-sm
8px
prodnav-scene-img-width
its own value
44px
prodnav-scene-img-height
its own value
24px
prodnav-scene-img-radius
radius-xs
4px
prodnav-noimg-inset-ring-width
line-hairline
1px
prodnav-facts-row-gap
gap-sm
6px
prodnav-facts-column-gap
gap-lg
12px
prodnav-facts-padding-x
inset-sm
8px
prodnav-facts-dd-i-height
its own value
4px
prodnav-facts-dd-i-margin-top
gap-xs
4px
prodnav-facts-dd-i-radius
radius-full
9999px
prodnav-facts-dd-em-radius
radius-full
9999px
prodnav-collapsed-width
its own value
72px
prodnav-collapsed-gap
gap-md
8px
prodnav-collapsed-padding-top
inset-md
12px
prodnav-collapsed-padding-bottom
inset-lg
16px
prodnav-railhead-active-scale
scale-press-sm
.94
prodnav-railhead-size
its own value
48px
prodnav-railhead-radius
radius-sm
8px
prodnav-railhead-img-size
its own value
48px
prodnav-rail-gap
gap-2xs
2px
prodnav-ricon-gap
gap-2xs
2px
prodnav-ricon-width
its own value
56px
prodnav-ricon-min-height
its own value
40px
prodnav-ricon-radius
radius-sm
8px
prodnav-ricon-tool-min-height
its own value
44px
prodnav-ricon-i-top
inset-sm
8px
prodnav-ricon-i-right
inset-md
12px
prodnav-sep-width
its own value
32px
prodnav-sep-height
line-hairline
1px
prodnav-sep-margin-y
gap-xs
4px
prodnav-active-scale
scale-press
.97
prodnav-ricon-after-current-left
inset-2xs
2px
prodnav-ricon-after-current-margin-top
its own value
calc(-1 * 2px)
prodnav-forced-current-width
line-strong
2px
prodnav-focus-outline-offset
focus-ring-offset
3px
prodnav-row-focus-outline-offset
its own value
calc(-1 * 2px)

Type

prodnav-font-family
font-sans
Funnel Sans
prodnav-back-font
text-caption-strong
600 13px/18px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-head-b-font
text-title-4
700 17px/22px "Funnel Display", "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-head-span-font
text-small
500 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-title-font
text-micro
700 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-item-font
text-body
400 14px/20px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-small-font
text-small
500 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-small-attention-font-weight
weight-strong
600
prodnav-item-page-font-weight
weight-bold
700
prodnav-scene-b-font
text-caption-strong
600 13px/18px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-scene-b-current-font-weight
weight-bold
700
prodnav-facts-font
text-small
500 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-ricon-small-font
text-small-strong
600 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
prodnav-ricon-small-current-font-weight
weight-bold
700

Motion

prodnav-railhead-press-duration
motion-fast
160ms
prodnav-railhead-press-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)
prodnav-railhead-active-duration
motion-instant
100ms
prodnav-item-duration
motion-fast
160ms
prodnav-item-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)
prodnav-active-duration
motion-instant
100ms

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 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 their label (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.