themes/default.json — file map
Fonts, colours, dialogue-box presets, menus, and control chrome for the whole game. Most games start from an example themes/default.json and change colours and sizes. Choice and text-input packs are separate files under themes/ — see the Look pages. Extra root objects (or themes/<name>.json) are named button packs with the same keys as buttons.
The whole file
Keys with { … } open below. Linked names jump to that section. Grey notes say what each key does. Under each section, Keys lists type, If omitted, allowed values, and a short note.
{
"typography": { … }, // fonts and sizes
"colors": { … }, // fallback text and empty-stage colours
"panel": { … }, // named dialogue-box presets — any names you choose
"labelplate": { … }, // named name-plate styles
"buttons": { … }, // default menu / screen button chrome
"scrollbar": { … }, // menus and panel body scrollbars
"slider": { … }, // settings volume and similar rows
"toggle": { … }, // on/off settings controls
"card": { … }, // content cards on screens
"separator": { … }, // thin rules between blocks
"notification": { … }, // toast chrome (Saved, Loaded, …)
"settings_layout": { … }, // label / control columns on settings screens
"readonly_styles": { … }, // looks when a panel is readonly / not talking
"…": { … } // named button packs you add — same keys as buttons
}
typography
Fonts and sizes.
{
"typography": { // fonts and sizes
"font": "Jupiteroid", // base face under fonts/
"font_menu": null, // menus and settings
"font_dialogue": null, // dialogue and choices
"font_label": "Jupiteroid", // speaker name plate
"size_scale": 1.0, // size multiplier
"sizes": { // pixel sizes
"speaker": 45, // name plate
"dialogue": 30, // body text
"choice": 30, // choice captions
"button": 30, // menu buttons
"notification": 30 // toasts
}
}
}
Keys
font stringfonts/ (variants -Regular / -Bold when present).font_menu stringfontnull or omit → font.font_dialogue stringfontnull or omit → font.font_label stringfontsize_scale number1.0sizes.*. Player text-size builds on this.sizes.speaker numbersizes.dialogue numbersizes.choice numbersizes.button number20sizes.notification numberLearn more: typography
colors
Fallback text and empty-stage colours.
{
"colors": { // fallback text and empty-stage colours
"background_default": "#dfdcd7", // empty stage fill
"speaker_text": "#c4693a", // name plate text
"dialogue_text": "#e8e5e0", // body text
"choice_text": "#c5cad5", // choice captions
"notification_text": "#dfdcd7" // toast text
}
}
Keys
background_default color#1e2347speaker_text color#b3bfe6dialogue_text color#ffffffchoice_text color#c8d0ffnotification_text color#e6f0ffLearn more: colors
panel
Named dialogue-box presets — any names you choose.
{
"panel": { // named dialogue-box presets — any names you choose
"default": { // any name you choose
"extends": "default", // inherit another preset
"width": "80%", // panel width
"anchor_h": "center", // horizontal place
"anchor_v": "bottom", // vertical place
"offset_x": 0, // nudge X
"offset_y": -32, // nudge Y
"min_height": 160, // height floor
"max_height": "50%", // height ceiling
"padding": {"top": 15, "left": 20, "right": 20, "bottom": 20}, // inner margins
"speaker_gap": 6, // name to text gap
"choices_gap": 2, // text to choices gap
"choices_separation": 4, // between choices
"bg": "#343a52e0", // flat plate colour
"bg_texture": "sprites/panel-bg.png", // plate image
"bg_9slice": [15, 15, 15, 15], // nine-slice margins
"corner_radius": 0, // flat corner radius
"resize_duration": 0, // height ease
"scrollbar_layout": "default", // body scrollbar column
"typography": {"font": "JetBrainsMono", "sizes": {"dialogue": 18, "choice": 18}}, // panel font / sizes overlay
"colors": {"dialogue_text": "#c8ffd0", "speaker_text": "#7CFF8A"}, // panel body / speaker colours
"labelplate_style_key": "default", // name plate style
"labelplate_layout": {"anchor_h": "left", "anchor_v": "top", "offset_y": -47}, // docked name plate
"continue_button": {"visible": true}, // next / continue control
"back_button": {"visible": false}, // back control
"slots": [], // avatar / art slots
"default_plate": "them", // fallback plate name
"plates": { // named per-beat plates for text_mode plates
"them": { // any name you choose
"extends": "them", // inherit another plate
"anchor_h": "left", // side of text column
"width": "88%", // plate width
"speaker": "on_change", // in-plate speaker header
"speaker_gap": 4, // header to body gap
"bg": "#2b3552", // flat plate colour
"corner_radius": 14, // flat corner radius
"bg_texture": "sprites/plate-bg.png", // plate image
"bg_9slice": [12, 12, 12, 12], // nine-slice margins
"shader": {"name": "drop_shadow", "target": "bg"}, // background shader
"padding": {"top": 8, "left": 12, "right": 12, "bottom": 8}, // inner margins
"margin": {"top": 3, "bottom": 3, "left": 0, "right": 0}, // outer spacing
"group_gap": 6, // extra gap on speaker change
"typography": {"sizes": {"speaker": 13}}, // plate font / sizes overlay
"colors": {"dialogue_text": "#e8ecff", "speaker_text": "#8aa0c8"}, // plate body / speaker colours
"transition_in": "slide_right", // live plate enter
"transition_out": "fade", // validated; unused on fold
"transition_duration": 0.22, // enter duration
"transition": "fade", // enter fallback
"duration": 0.22 // duration alias
}
}
}
}
}
Keys
extends stringwidth string100%"NN%", "100%", "stretch", or a pixel number.anchor_h enumstretchleft · center · right · stretchanchor_v enumbottomtop · center · bottom · stretchoffset_x number0offset_y number0min_height number160"NN%", or "full".max_height number"NN%", or "full".padding objecttop / left / right / bottom pixels.speaker_gap number6choices_gap number2choices_separation number4bg color#343a52e0bg_texture.bg_texture pathbg onlybg_9slice array[left, top, right, bottom] for bg_texture.corner_radius number0resize_duration number00 snaps.scrollbar_layout enumdefaultdefault · reserve · overlayreserve keeps wrap width stable on scrolling plates.typography objectcolors objectlabelplate_style_key stringlabelplate.<name> styles the speaker.labelplate_layout objectcontinue_button objectstyle.back_button objectcontinue_button.slots arraydefault_plate stringplates.<name> to use when the beat does not pick one. Must name a key in plates.plates.*.extends stringplates.*.anchor_h enumleftleft · center · right · stretchplates.*.width string80%"NN%" of the text column, a pixel number, or "stretch".plates.*.speaker enumfalsefalse · true · on_changeon_change shows the header when the speaker changes.plates.*.speaker_gap numberplates.*.bg colorbg_texture.plates.*.corner_radius number0plates.*.bg_texture pathbg onlyplates.*.bg_9slice array[left, top, right, bottom] for bg_texture.plates.*.shader objecttarget: "bg" only on plates.plates.*.padding objecttop / left / right / bottom pixels.plates.*.margin objectplates.*.group_gap number0plates.*.typography objectplates.*.colors objectplates.*.transition_in enuminstantinstant · fade · slide_up · slide_down · slide_left · slide_rightslide_right enters from the left; slide_left from the right.plates.*.transition_out enuminstant · fade · slide_up · slide_down · slide_left · slide_rightplates.*.transition_duration number0transition_in. 0 or instant = no motion.plates.*.transition enuminstant · fade · slide_up · slide_down · slide_left · slide_righttransition_in is omitted.plates.*.duration numbertransition_duration when that key is absent.Learn more: panel
labelplate
Named name-plate styles.
{
"labelplate": { // named name-plate styles
"default": { // any name you choose
"bg_texture": "sprites/label-bg.png", // plate image
"bg_9slice": [7, 7, 7, 17], // nine-slice margins
"padding_left": 12, // inner left
"padding_right": 12, // inner right
"padding_top": 2, // inner top
"padding_bottom": 12, // inner bottom
"font_color": "#3a2a1a" // name colour
}
}
}
Keys
bg_texture pathbg_9slice arraybg_texture.padding_left numberpadding_right numberpadding_top numberpadding_bottom numberfont_color colorcolors.speaker_text for this style.Learn more: labelplate
buttons
Default menu / screen button chrome.
{
"buttons": { // default menu / screen button chrome
"spacing": 12, // menu separation
"min_width": 220, // minimum width
"corner_radius": 0, // corner radius
"border_width": 0, // border width
"padding_left": 18, // padding left
"padding_right": 18, // padding right
"padding_top": 4, // padding top
"padding_bottom": 6, // padding bottom
"normal_bg": "#d8c9a8", // normal fill
"hover_bg": "#e4d6b4", // hover fill
"pressed_bg": "#c4b48e", // pressed fill
"font_color": "#3a2a1a", // label colour
"font_hover_color": "#6b4420", // hover label
"font_pressed_color": "#8a5a28", // pressed label
"normal_texture": "sprites/button-normal.png", // idle image
"hover_texture": "sprites/button-hover.png", // hover image
"pressed_texture": "sprites/button-down.png" // pressed image
}
}
Keys
spacing numbermin_width number0corner_radius numberborder_width numberpadding_left numberpadding_right numberpadding_top numberpadding_bottom numbernormal_bg colorhover_bg colorpressed_bg colorfont_color colorfont_hover_color colorfont_pressed_color colornormal_texture pathhover_texture pathpressed_texture pathLearn more: buttons
scrollbar
Menus and panel body scrollbars.
{
"scrollbar": { // menus and panel body scrollbars
"width": 10, // bar width
"corner_radius": 4, // corner radius
"content_separation": 18, // gap from content
"track_color": "#8a6a4a40", // track colour
"grabber_color": "#6b4420", // grabber
"grabber_hover_color": "#8a5a28", // grabber hover
"grabber_pressed_color": "#3a2a1a", // grabber pressed
"track_9slice": [0, 0, 0, 0], // track nine-slice
"grabber_9slice": [0, 0, 0, 0] // grabber nine-slice
}
}
Keys
width number10corner_radius number4content_separation numbertrack_color color#4a559060grabber_color color#5b6a82grabber_hover_color color#6a75b0grabber_pressed_color color#a8b8eftrack_9slice arraygrabber_9slice arrayLearn more: scrollbar
slider
Settings volume and similar rows.
{
"slider": { // settings volume and similar rows
"track_height": 9, // track height
"corner_radius": 4, // corner radius
"grabber_size": 19, // knob size
"track_color": "#4a559060", // track colour
"fill_color": "#c4693a90", // filled track
"fill_hover_color": "#d4794ab0", // fill hover
"grabber_color": "#c5cad5", // knob colour
"grabber_hover_color": "#dfdcd7", // knob hover
"grabber": "sprites/slider-picker.png", // knob image
"grabber_hover": "sprites/slider-picker.png", // knob hover image
"track_texture": "sprites/slider-bg.png", // track image
"fill_texture": "", // fill image
"fill_hover_texture": "", // fill hover image
"track_9slice": [4, 6, 4, 6], // track nine-slice
"fill_9slice": [4, 6, 4, 6] // fill nine-slice
}
}
Keys
track_height number8corner_radius number4grabber_size number20track_color color#4a559060fill_color color#c4693a90fill_hover_color colorgrabber_color color#c5cad5grabber_hover_color color#dfdcd7grabber pathgrabber_hover pathtrack_texture pathfill_texture pathfill_hover_texture pathtrack_9slice arraytrack_texture.fill_9slice arrayfill_texture.Learn more: slider
toggle
On/off settings controls.
{
"toggle": { // on/off settings controls
"checked": "sprites/checked.png", // on image
"unchecked": "sprites/unchecked.png", // off image
"checked_hovered": "sprites/checked.png", // on hover image
"unchecked_hovered": "sprites/unchecked.png", // off hover image
"icon_size": 0, // icon size
"track_width": 48, // switch width
"track_height": 26, // switch height
"knob_size": 20, // knob size
"corner_radius": 13, // track radius
"track_on_color": "#c4693a90", // on track
"track_off_color": "#4a559060", // off track
"knob_color": "#dfdcd7", // switch knob
"knob_hover_color": "#dfdcd7", // knob hover
"track_on_hover_color": "#d4794acc", // on track hover
"track_off_hover_color": "#6a75a8a0" // off track hover
}
}
Keys
checked pathunchecked pathchecked_hovered pathunchecked_hovered pathicon_size number00 uses the texture size.track_width number48track_height number26knob_size number20corner_radius number13track_on_color color#c4693a90track_off_color color#4a559060knob_color color#dfdcd7knob_hover_color colortrack_on_hover_color colortrack_off_hover_color colorLearn more: toggle
card
Content cards on screens.
{
"card": { // content cards on screens
"max_width": 520, // card width cap
"padding_left": 36, // padding left
"padding_right": 36, // padding right
"padding_top": 28, // padding top
"padding_bottom": 28, // padding bottom
"spacing": 14, // inner gap
"bg": "#dfdcd7e0", // card fill
"corner_radius": 0, // corner radius
"bg_texture": "sprites/screen-bg.png", // card image
"bg_9slice": [7, 7, 7, 7] // nine-slice margins
}
}
Keys
max_width number500padding_left number40padding_right number40padding_top number30padding_bottom number30spacing number20bg color#1e234790corner_radius number12bg_texture pathbg_9slice arraybg_texture.Learn more: card
separator
Thin rules between blocks.
{
"separator": { // thin rules between blocks
"height": 2, // rule thickness
"color": "#8a6a4a60" // rule colour
}
}
Keys
height number2color color#ffffff60Learn more: separator
notification
Toast chrome (Saved, Loaded, …).
{
"notification": { // toast chrome (Saved, Loaded, …)
"bg": "#1e2347cc", // toast fill
"bg_texture": "", // toast image
"bg_9slice": [0, 0, 0, 0], // nine-slice margins
"corner_radius": 10, // corner radius
"padding_left": 24, // padding left
"padding_right": 24, // padding right
"padding_top": 10, // padding top
"padding_bottom": 12, // padding bottom
"min_width": 0, // minimum width
"offset_y": 0, // vertical nudge
"fade_in": 0.15, // fade in
"fade_out": 0.2 // fade out
}
}
Keys
bg color#1e2347ccbg_texture pathbg_9slice arraybg_texture.corner_radius number10padding_left number24padding_right number24padding_top number10padding_bottom number12min_width numberoffset_y numberfade_in numberfade_out numberLearn more: notification
settings_layout
Label / control columns on settings screens.
{
"settings_layout": { // label / control columns on settings screens
"title_font_size": 28, // section heading size
"label_min_width": 260, // label column
"slider_min_width": 200, // slider column
"value_min_width": 60, // value readout
"item_spacing": 16 // row gap
}
}
Keys
title_font_size number28label_min_width number180slider_min_width number200value_min_width number60item_spacing number16Learn more: settings_layout
readonly_styles
Looks when a panel is readonly / not talking.
{
"readonly_styles": { // looks when a panel is readonly / not talking
"default": { // any name you choose
"text_color": "#aaaaaa", // dimmed body
"speaker_color": "#888888", // dimmed name
"bg_opacity": 0.7, // plate alpha
"font_scale": 1.0 // size scale
}
}
}
Keys
text_color color#ffffffspeaker_color color#b3bfe6bg_opacity number1.0font_scale number1.0Learn more: readonly_styles