Theme
Sound
Jump to a component
AniCanonKit · Manga
IssueStrip
IssueStrip shows the issue as the reader turns it: the cover alone, then the content pages paired into spreads, with a rule at every page turn.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Web only
IssueStrip is made for the web, and isn’t part of Sakuga for iOS yet.
Android
Web only
IssueStrip is made for the web, and isn’t part of Sakuga for Android yet.
- Use it for
- The issue as the reader turns it, in Layout and under the editor's canvas: the cover alone, then the pages in spreads with a rule at every page turn.
- Not for
- Proof, every page with how far it has comePageWall
- One page on its ownMangaPage
- A page's panels, lettering and sound effectsLayerStrip
- An issue on a shelfMediaCard
Guidelines
spreadsis a list of spreads, each a list ofMangaPageprops. Mark the open pageselected.selectSpread(Spread mode) rings the whole spread that holds the selected page instead of the page.sizeis the page width: 56 in Layout, 30 or 18 under the editor's canvas.labelnames the strip;falsehides it.- It is a map, not a reader: it shows where a page sits and where the turns fall. Page turns matter to the story, so never hide them.
import { IssueStrip } from '@anicanon/sakuga/anicanonkit';
const spreads = [
[{ image: '/art/bad-memories-the-winter-p00.webp', label: 'Front cover' }],
[
{ image: '/art/bad-memories-the-winter-bruce.webp', label: 'Page 3' },
{ image: '/art/bad-memories-the-winter-p04.webp', label: 'Page 4' },
],
[
{
image: '/art/bad-memories-the-winter-alarm.webp',
label: 'Page 5',
selected: true,
},
{
frames: [
{ x: 4, y: 4, w: 92, h: 30 },
{ x: 4, y: 36, w: 44, h: 28, state: 'drawing' },
{ x: 52, y: 36, w: 44, h: 28 },
{ x: 4, y: 66, w: 92, h: 30 },
],
label: 'Page 6, drawing',
},
],
[
{
frames: [
{ x: 4, y: 4, w: 56, h: 44 },
{ x: 62, y: 4, w: 34, h: 44 },
{ x: 4, y: 50, w: 92, h: 46 },
],
label: 'Page 7, laid out',
},
{
frames: [
{ x: 4, y: 4, w: 92, h: 22 },
{ x: 4, y: 28, w: 44, h: 34 },
{ x: 52, y: 28, w: 44, h: 34 },
{ x: 4, y: 64, w: 30, h: 32 },
{ x: 36, y: 64, w: 60, h: 32 },
],
label: 'Page 8, laid out',
},
],
[
{
frames: [
{ x: 4, y: 4, w: 92, h: 58 },
{ x: 4, y: 64, w: 92, h: 32 },
],
label: 'Page 9, laid out',
},
{ blank: true, label: 'Back cover, not made' },
],
];
export default function IssueStripExample() {
return <IssueStrip size={30} spreads={spreads} />;
}PropsIssueStripProps
spreadsrequiredMangaPageProps[][]sizenumberPage width; 30 in the editor, 56 in Layout.
selectSpreadbooleanA selected page selects its whole spread (Spread mode).
labelstring | falseThe header; false hides it.
turnLabelstringclassNamestringTypes
interface MangaPageProps { /** The area an edit redraws, in percent. Slot: slot="action" beside the caption. */ mask?: Area; maskLabel?: string; width?: number; /** Height over width; defaults to the B5 trim. */ ratio?: number; image?: string; frames?: MangaFrame[]; numbers?: boolean; selected?: boolean; /** A page not made yet, e.g. the back cover. */ blank?: boolean; /** One item selected on the page, with handles, in percent. */ selection?: Area; selectionLabel?: string; label?: string; alt?: string; title?: string; meta?: string; /** The caption's alignment: the right page of a spread reads from its outer edge. */ align?: 'end'; children?: ReactNode; className?: string; }
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
istrip-turnIssueStrip and PageWall: a page turn.border-controlshade-a52rgba(11,10,16,0.52)border-controlwhite-a45rgba(255,255,255,0.45)istrip-textIssueStrip: its label and key.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7istrip-selectedIssueStrip: the selected spread in Spread mode.accentcamellia-600#c2335faccentcamellia-400#f4779fSpace and shape
istrip-gapgap-md8px
istrip-key-gapgap-sm6px
istrip-key-before-widthline-hairline1px
istrip-key-before-heightits own value
12px
istrip-row-gapgap-md8px
istrip-spread-gapgap-2xs2px
istrip-spread-radiusradius-xs4px
istrip-spread-selected-ring-widthline-strong2px
istrip-turn-widthline-hairline1px
istrip-turn-margin-ygap-sm6px
istrip-turn-radiusradius-xs4px
istrip-forced-selected-widthline-strong2px
Type
istrip-key-fonttext-micro700 12px/16px "Funnel Sans", system-ui, -apple-system, "Segoe UI", sans-serif
Motion
istrip-spread-durationmotion-base240ms
istrip-spread-easingease-standardcubic-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
- Not focusable; its label (default "The issue, spread by spread") and key read as text, then a list named "Spreads", each spread a list item holding its pages as images (named by
labeloralt, else "Page", with "selected"), the oneselectSpreadrings starting with "Selected spread", and the page-turn rules 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.