UI Theming
NeoOrigins lets addon packs reskin the origin selection / info screens (panel texture, font, text colours, 9-slice insets) without code. As of the addon-pack rewrite the system is multi-theme aware: pack authors register themes by id, then declare which one is active from inside the pack itself. Players don’t have to install separate resource packs and datapacks; a single addon (zip or mod jar) carries everything.
Quickstart: make your own theme
A copy-and-edit template lives in docs/theme-template/. The short version:
- Copy
docs/theme-template/somewhere. - Rename every
_replace_folder + string to your pack’s namespace (e.g.mymodpack) and renamemy_theme.jsonto whatever you want the id to be. - (Optional) drop a 256x256
panel.pngintoassets/<ns>/textures/gui/themes/<id>/. - (Optional) put a
.ttfinassets/<ns>/font/and update<id>_font.json. - Zip it (or wrap it in a mod jar) and ship.
The template’s README walks through each step in more detail.
Theme discovery
The mod scans every loaded resource pack for files matching:
assets/<any_ns>/ui_themes/<id>.json
Each file is registered as the theme <ns>:<id>. The built-in neoorigins:parchment is always present even when no JSON ships for it, so themes that omit fields fall through to its defaults.
Theme selection (which theme is active)
Two layers, applied in order. The first that resolves to a loaded theme wins:
- Player override.
config/neoorigins/client.toml:[ui] theme_override = "examplepack:dark_woods"Leave empty (the default) to defer to the server.
- Datapack-declared theme. Any pack can ship
data/<ns>/neoorigins/active_theme.json:{ "theme": "examplepack:dark_woods" }The server reads these on world load + each
/reloadand broadcasts the selection to every client at login. Conflict rule: if multiple packs each declare anactive_theme.json, the one loaded last wins and a warning is logged listing every contributor. Adjust pack load order if you want a different outcome. - Falls back to
neoorigins:parchmentwhen neither resolves.
An id that names a theme no loaded pack registered is logged at warn and skipped, so resolution falls through to the next layer rather than failing.
The classic-picker accessibility override
classic_picker_style under [ui] in config/neoorigins/client.toml outranks every layer listed above. Selection itself still runs (an unknown id is still warned about, and the resolved theme is still stored), but while the option is true the screens read the built-in flat high-contrast skin (dark navy panels, light text, vanilla font) instead, so whatever resolved has no visible effect. If a pack’s theme appears to do nothing, check this setting first.
Theme JSON schema
assets/<ns>/ui_themes/<id>.json. All fields optional: missing fields keep the parchment default. Colours are ARGB hex strings ("0xFF2A1810") or raw ints.
| Field | Type | Default |
|---|---|---|
panel_background | Identifier | neoorigins:textures/gui/themes/parchment/panel.png |
overlay_color | ARGB | 0xCC060610 (full-screen scrim) |
name_color | ARGB | 0xFF2A1810 (origin display name) |
description_color | ARGB | 0xFF3A2410 (body description) |
power_name_color | ARGB | 0xFF6B3B10 |
power_description_color | ARGB | 0xFF4A2A10 |
header_color | ARGB | 0xFF2A1810 (section headers) |
border_color | ARGB | 0xFF6B4A20 |
muted_color | ARGB | 0xFF4A2A10 (secondary text) |
accent_color | ARGB | 0xFFB87328 (bullets, dots) |
font | Identifier | neoorigins:parchment |
inset_left / top / right / bottom | int (px) | 12 each |
texture_width / texture_height | int (px) | 256 |
flat | bool | false: paint plain fill + outline instead of the 9-slice panel art; panel_background and the inset_* / texture_* fields are ignored |
panel_color | ARGB | 0x00000000: panel fill used only when flat is true |
Direct resource-pack overrides
You don’t have to author a new theme; a resource pack can also swap the parchment texture or font in place:
- Panel PNG: drop a file at
assets/neoorigins/textures/gui/themes/parchment/panel.png. 256x256 with a 12 px 9-slice border, or override theinset_*/texture_*fields. - Font provider:
assets/neoorigins/font/parchment.jsonis a standard Minecraft font-provider JSON; replace it to swap in your own TTF. - Theme JSON:
assets/neoorigins/ui_themes/parchment.json. Same schema as above; ships overrides for the built-in theme directly.
The new-theme workflow is preferred (cleaner, doesn’t collide with other packs touching the parchment assets), but the in-place overrides are kept for small “I just want different colours” packs.
Bundled font license
newsreader_regular.ttf (Newsreader 16pt Regular, static cut) is redistributed under the SIL Open Font License 1.1. The licence text ships at assets/neoorigins/font/ofl.txt. If you rebundle the TTF in your own pack you must keep ofl.txt alongside it.