Sakuga Back to Sakuga
Theme
Sound
Jump to a component

AniCanonKit · Productions

EditorShell

EditorShell is the full-screen editor (Cut). Slots: nav (the ProductionNav rail), header (EditorHeader), tool (the open tool’s panel, 312 px), inspector (the selected item, 300 px), overlay (a dialog over the editor). Its main content is the centre column: Monitor, MonitorBar, the ProgramBar and the Timeline.

@anicanon/sakuga/anicanonkitv1.0Used onWebFrom AniCanon™

Live, from @anicanon/sakuga 2.0.0

Sakuga for iOS and Android is coming

iOS

Web only

EditorShell is made for the web, and isn’t part of Sakuga for iOS yet.

Android

Web only

EditorShell is made for the web, and isn’t part of Sakuga for Android yet.

Use it for
The full-screen editor (Cut, and Art and Lettering in manga): the rail, header, tool panel, inspector and the centre column with the monitor, program bar and timeline, with focus for the canvas alone.
Not for
  • A production view outside the editorViewHeader
  • A full-screen flow that makes one thing step by stepFlowHeader
  • A task over the pageDialog

Guidelines

  • EditorHeader: title, timecode, an optional status (Rebuilds exactly) and the actions as children.
  • Monitor: the picture (image, imageStyle) with labels in its corner (labelsEnd for the other corner) and overlays as children; guides draws title-safe or an effect's area (accent for the selected one) and region the area an edit works on, with its label; centered puts a frame in the middle; fill lets it take the column's height (the manga page canvas); fit="contain" shows the whole picture (a take in Studio) instead of filling the frame.
  • MonitorBar: slots transport and end, the timecode, the edit buttons as children.
  • Nothing floats over the picture except the corner labels and what you are editing on it.
  • CanvasStage replaces the Monitor while an item is selected on the canvas: the frame, the item at its box (percent of the frame; it may run past the edges, shown dimmed), and a box with eight handles to move and resize it.
  • focus turns the shell into focus mode: the rail, header, tool panel and inspector fold away; the monitor grows and the transport and timeline stay, since editing needs them. The page sets it: F or Full screen enters focus, F or Esc leaves it.
  • The float slot holds what comes back on demand. The shell covers itself with it and shows it as focus starts and whenever the pointer moves, then fades it out after 2 s still, never while the pointer rests on it or focus is in it. The page lays it out, as the Productions focus board does: one row across the top, 20 px from the top and 24 px (inset-xl) from the sides, 10 px apart. In it, a FloatingToolbar named "Production" with the production's name and the timecode; a FloatingToolbar named "Tools" with the tools as media IconButtons; and at the far end Leave focus, a media-secondary Button (sm, the fullscreen icon). While the bars show, the Monitor's corner labels step aside (the Production bar carries the timecode), and they come back when the bars fade.
  • Motion follows the editor motion sheet: panels on motion-base, selection on motion-instant with ease-enter, focus on motion-slow; dragging never eases. Under reduced motion every move becomes a short fade or nothing.
  • CanvasStage takes onBox(box): the box becomes one Tab stop, arrows move it a percent and Shift with an arrow resizes it.
EditorShellExample.jsxReact
import { Button, FloatingToolbar, IconButton } from '@anicanon/sakuga/ui';
import {
  EditorHeader,
  EditorShell,
  Monitor,
  MonitorBar,
} from '@anicanon/sakuga/anicanonkit';

const on = {
  color: 'var(--text-on-media)',
  font: '700 14px/18px var(--font-display)',
  padding: '0 6px',
};

const onMuted = {
  color: 'var(--text-on-media-muted)',
  font: '600 12.5px/16px var(--font-sans)',
  paddingRight: 6,
};

const tools = [
  ['collection', 'Media'],
  ['template', 'Titles'],
  ['effect-sparks', 'Effects'],
  ['sliders', 'Adjust'],
  ['volume', 'Audio'],
];

const focusShell = (
  <EditorShell height={240} focus>
    <Monitor image="/art/eba-cinema.webp" height={150} />
    <MonitorBar timecode="2:41 + 04f">
      <Button variant="ghost" size="sm">
        Split
      </Button>
    </MonitorBar>
    <span slot="float">
      <div
        style={{
          position: 'absolute',
          left: 24,
          right: 24,
          top: 20,
          display: 'flex',
          alignItems: 'center',
          gap: 10,
        }}
      >
        <FloatingToolbar label="Production">
          <b style={on}>The First Watch</b>
          <span style={onMuted}>Cut · 2:41 + 04f</span>
        </FloatingToolbar>
        <FloatingToolbar label="Tools">
          {tools.map((t) => (
            <IconButton key={t[1]} variant="media" icon={t[0]} label={t[1]} />
          ))}
        </FloatingToolbar>
        <span style={{ flex: 1 }} />
        <Button variant="media-secondary" size="sm" icon="fullscreen">
          Leave focus
        </Button>
      </div>
    </span>
  </EditorShell>
);

export default function EditorShellExample() {
  return (
    <>
      <EditorShell height={240}>
        <span slot="header">
          <EditorHeader
            title="The First Watch"
            timecode="Cut · 2:41 + 04f of 6:40"
            status="Rebuilds exactly"
          >
            <Button variant="primary" size="sm">
              Screen the cut
            </Button>
          </EditorHeader>
        </span>
        <span slot="tool">
          <div style={{ font: '600 13px var(--font-sans)' }}>Media</div>
        </span>
        <Monitor
          image="/art/eba-cinema.webp"
          labels={['2C · take 3', '2:41 + 04f']}
          height={110}
        />
        <MonitorBar timecode="2:41 + 04f">
          <Button variant="ghost" size="sm">
            Split
          </Button>
        </MonitorBar>
        <span slot="inspector">
          <div style={{ font: '600 13px var(--font-sans)' }}>Cut 2C</div>
        </span>
      </EditorShell>
      {focusShell}
    </>
  );
}

PropsEditorShellProps

height
number
Slots: nav, header, tool, inspector, overlay, float (focus mode only). Children are the centre column.
focus
boolean
Focus mode: the panels fold away, the centre fills, float holds the bars that come back on demand.
inspectorLabel
string
children
ReactNode
className
string
EditorShellExample.swiftiOS · coming soon
EditorShellExample.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.

Space and shape

editor-center-focus-padding-top
inset-sm
8px
editor-center-focus-padding-x
inset-md
12px
editor-center-focus-padding-bottom
inset-md
12px
editor-center-focus-gap
gap-md
8px
editor-tool-width
its own value
312px
editor-tool-gap
gap-lg
12px
editor-tool-padding
inset-lg
16px
editor-tool-border-right-width
line-hairline
1px
editor-center-gap
gap-md
8px
editor-center-padding-y
inset-md
12px
editor-center-padding-x
inset-md
12px
editor-inspector-width
its own value
300px
editor-inspector-gap
gap-lg
12px
editor-inspector-padding
inset-lg
16px
editor-inspector-border-left-width
line-hairline
1px

Type

editor-font-family
font-sans
Funnel Sans

Motion

editor-tool-duration
motion-base
240ms
editor-tool-easing
ease-standard
cubic-bezier(0.2, 0, 0, 1)
editor-tool-opacity-duration
motion-fast
160ms
editor-float-duration
motion-base
240ms
editor-float-easing
ease-standard
cubic-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 layout with no keyboard handling of its own: Tab moves through its slots in order (nav, header, tool, centre, inspector), the inspector is a complementary region named by inspectorLabel (default "Inspector"), and EditorHeader's title is a level-1 heading. CanvasStage's selection is a group named by label and described by its position and size; with onBox it is an application (a "movable item") and one Tab stop where arrows move it and Shift with an arrow resizes it, each change said aloud, and its handles 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.