Settings
The Settings section — typography defaults, reader UI defaults, preload strategy, and per-output-format presets in a PanelWave manifest.
settings is an optional top-level section holding work-wide defaults: typography and balloon styling, reader UI behavior, asset preloading, and per-output-format presets. Everything here is a default — many values cascade down and can be overridden at more specific levels (character, panel, layer).
Settings has four optional property groups: typography, ui, preload, and outputPresets.
settings.typography
Global text and page styling defaults for the work.
| Property | Type | Default | Constraints | Description |
|---|---|---|---|---|
default_font | string | "Roboto" | — | Default font family for text |
default_font_size | integer | 14 | 8–72 | Default font size in points |
default_page_bg_color | ColorHex | — | hex color | Default background color for pages |
balloon_config | BalloonConfig | — | — | Default balloon styling for all speech bubbles in this work; start of the balloon cascade (work → character → bubble). See Speech Bubbles |
panel_border_style | object | — | — | Default panel border: color (ColorHex), thickness (integer 0–10, default 1, px), style (solid | dashed | dotted | none, default solid) |
gutter_width | integer | 10 | 0–50 | Space between panels in pixels |
textStyles | map of TextStyle | — | keys are Identifiers | Schema 1.3+. Named, reusable text style presets referenced by TextLayer.styleRef. See below |
balloonPresets | map of BalloonConfigOverride | — | keys are Identifiers | Schema 1.3+. Named, reusable balloon presets referenced by SpeechBubble.styleRef. See below |
Reusable style presets
Both maps work like CSS classes for the manifest: define shared styling once, reference it by name, and restyle every referencing element by editing the preset in one place.
textStylesmaps a preset name to aTextStyle(font,sizePt,color,strokeColor,strokeWidth). A text layer opts in withstyleRef; its inlinestylefields override the preset field-by-field.balloonPresetsmaps a preset name to aBalloonConfigOverride. A speech bubble opts in withstyleRef; the preset slots into the balloon cascade as work → character → preset → bubble.
{
"settings": {
"typography": {
"textStyles": {
"caption": { "font": "CrimsonPro", "sizePt": 14, "color": "#fdf6e3", "strokeColor": "#0a1a24", "strokeWidth": 3 }
},
"balloonPresets": {
"speech-down-right": { "tail": { "position": 150, "length": 50 } },
"shout-down-right": { "balloonType": "shout", "strokeWidth": 4, "tail": { "position": 150, "length": 50 } }
}
}
}
}
Before presets, restyling the captions of a 61-page album meant editing 100+ identical inline style blocks. Sample 11 uses one caption text style and six balloon presets for all of its 104 captions and 79 bubbles.
A styleRef that names no existing preset is ignored by consumers (the element renders as if styleRef were unset). Authoring tools should warn about dangling references — the CMS validation panel does.
settings.ui
Reader-behavior defaults. The player exposes matching toggles (controlled via UI settings); these values seed them.
| Property | Type | Default | Constraints | Description |
|---|---|---|---|---|
mangaMode | boolean | false | — | Right-to-left reading direction |
autoplayDefault | boolean | false | — | Start in autoplay mode |
secondsPerPanel | number | — | 0.5–120 | Autoplay dwell time per panel; a panel's own durationMs overrides this |
speechDefault | boolean | true | — | Initial state of the reader's speech-bubble toggle. Schema 1.3+: every speech bubble is implicitly gated by this toggle — see Speech Bubbles |
audioDefault | boolean | true | — | Music/ambient audio on by default |
sfxDefault | boolean | true | — | Sound effects on by default |
scrollingDefault | boolean | true | — | Scrolling navigation enabled by default |
videoPlayModeDefault | string | "once" | once | loop | pingpong | loop-from | Work-level default for VideoLayer.playMode (schema 1.1+); cascades to per-layer overrides |
videoStartModeDefault | string | "on-view" | on-view | on-hover | on-click | Work-level default for VideoLayer.startMode (schema 1.1+) |
videoMutedDefault | boolean | true | — | Work-level default for VideoLayer.muted (schema 1.1+) |
The three video*Default fields follow the same cascade pattern as balloon config: the work default applies whenever a video layer does not specify its own value.
settings.preload
Controls how aggressively the player prefetches upcoming panel assets.
| Property | Type | Default | Constraints | Description |
|---|---|---|---|---|
strategy | string | "lookahead" | none | lookahead | aggressive | Preload strategy |
panelsAhead | integer | 2 | ≥ 0 | How many panels ahead to prefetch (for lookahead) |
maxConcurrent | integer | 4 | ≥ 1 | Maximum parallel asset downloads |
Panels can additionally hint specific assets via preloadHints — see Panels.
settings.outputPresets and FormatPreset
outputPresets maps an OutputFormat name to a FormatPreset. The schema lists the eight classic formats as named properties (flex-landscape, mobile-portrait, bigscreen-landscape, a4-portrait, a4-landscape, us-portrait, us-landscape, video-16-9) and additionally accepts any other key with a FormatPreset value (covering square, desktop-landscape, tablet-portrait).
FormatPreset
| Property | Type | Default | Description |
|---|---|---|---|
panelView | boolean | true | Allow panel-by-panel viewing in this format |
pageView | boolean | false | Allow whole-page viewing in this format (requires page layouts) |
canvasView | boolean | false | Enable infinite-canvas view in this format (1.4+). Renders only for chapters that define a canvas; players fall back to panel view otherwise |
defaultTransition | Transition | — | Default transition between panels in this format; individual edges override it |
defaultCameraMove | CameraMove | — | Default canvas-view camera move for edges without an explicit cameraMove (1.4+) |
Individual panels can further restrict views per format with formatViews (allowPageView / allowPanelView / minimalFocusRect) — see Panels.
Example
{
"settings": {
"typography": {
"default_font": "Roboto",
"default_font_size": 14,
"default_page_bg_color": "#111111",
"gutter_width": 10,
"panel_border_style": { "color": "#000000", "thickness": 1, "style": "solid" },
"textStyles": {
"caption": { "font": "Roboto", "sizePt": 14, "color": "#ffffff", "strokeColor": "#000000", "strokeWidth": 3 }
},
"balloonPresets": {
"whisper-soft": { "balloonType": "whisper", "strokeWidth": 1 }
}
},
"ui": {
"mangaMode": false,
"autoplayDefault": false,
"secondsPerPanel": 4,
"speechDefault": true,
"audioDefault": true,
"sfxDefault": true,
"scrollingDefault": true,
"videoPlayModeDefault": "once",
"videoStartModeDefault": "on-view",
"videoMutedDefault": true
},
"preload": {
"strategy": "lookahead",
"panelsAhead": 2,
"maxConcurrent": 4
},
"outputPresets": {
"bigscreen-landscape": {
"panelView": true,
"pageView": true,
"defaultTransition": { "type": "slide", "dir": "left", "durationMs": 400 }
},
"mobile-portrait": {
"panelView": true,
"pageView": false,
"defaultTransition": { "type": "fade", "durationMs": 200 }
}
}
}
}
How the player applies these defaults at runtime is described in Player Configuration.