Theme
Sound
Jump to a component
AniCanonKit · Productions
ScreenplayLine
ScreenplayLine is one block of a screenplay inside a ManuscriptSection: slug, action, cue (with extension such as O.S.), paren, dialogue, transition.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Web only
ScreenplayLine is made for the web, and isn’t part of Sakuga for iOS yet.
Android
Web only
ScreenplayLine is made for the web, and isn’t part of Sakuga for Android yet.
- Use it for
- One block of a screenplay inside a section of the script: a slugline, action, a cue with its extension (O.S.), a parenthetical, dialogue or a transition.
- Not for
- A planned line with its delivery and translationDialogueLine
- A subtitle over videoCaption
Guidelines
flaggedunderlines a line Maki found a story conflict in.
import { ScreenplayLine } from '@anicanon/sakuga/anicanonkit';
export default function ScreenplayLineExample() {
return (
<>
<ScreenplayLine type="action" flagged>
A white room with no windows. A watch lies face down.
</ScreenplayLine>
<ScreenplayLine type="cue">Professor</ScreenplayLine>
<ScreenplayLine type="dialogue">You kept it.</ScreenplayLine>
<ScreenplayLine type="cue" extension="O.S.">
Kiko
</ScreenplayLine>
<ScreenplayLine type="paren">(not looking at it)</ScreenplayLine>
<ScreenplayLine type="transition">Cut to:</ScreenplayLine>
</>
);
}PropsScreenplayLineProps
type'slug' | 'action' | 'cue' | 'paren' | 'dialogue' | 'transition'extensionstringflaggedbooleanchildrenReactNodeThe block's words.
classNamestringEach 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
screenplay-textScreenplayLine: text.text-primaryneutral-925#0b0a10text-primaryneutral-0#ffffffscreenplay-metaScreenplayLine: parentheticals, extensions and transitions.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7screenplay-flagScreenplayLine: a line Maki flagged.accentcamellia-600#c2335faccentcamellia-400#f4779fSpace and shape
screenplay-max-widthits own value
600px
screenplay-slug-margin-topgap-xs4px
screenplay-action-margin-topgap-2xs2px
screenplay-action-margin-bottomgap-sm6px
screenplay-cue-margin-topgap-md8px
screenplay-cue-padding-leftits own value
200px
screenplay-paren-padding-leftits own value
160px
screenplay-paren-max-widthits own value
420px
screenplay-dialogue-padding-leftits own value
108px
screenplay-dialogue-max-widthits own value
468px
screenplay-dialogue-margin-bottomgap-sm6px
screenplay-flagged-underline-offsetunderline-offset3px
screenplay-flagged-underline-thicknessline-hairline1px
Type
screenplay-fonttext-body-lg400 15px/24px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
screenplay-slug-font-weightweight-bold700
screenplay-slug-letter-spacingtracking-caps.06em
screenplay-cue-font-weightweight-bold700
screenplay-cue-letter-spacingtracking-caps.06em
screenplay-cue-small-font-weightweight-strong600
Motion
screenplay-transition-margin-ygap-md8px
screenplay-transition-font-weightweight-bold700
screenplay-transition-letter-spacingtracking-caps.06em
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
- Not focusable; the block reads as plain text, a cue followed by its extension in brackets ("(O.S.)"), and a
flaggedblock ends with "story conflict". - 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.