Themes

Turian's Studio and its shipped games share one GUI layer (DVUI, internally called "Guinevere"), and one theme system on top of it. A .uitheme asset describes colors and corner rounding; the same asset can be picked as the Studio's own chrome, or as the theme a built game boots its UI with.


The .uitheme asset

A .uitheme file is JSON. It covers:

  • Base colors: fill, fill_hover, fill_press, text, text_hover, text_press, border, focus, and a dark flag.
  • Seven style groups, each overriding the base colors for a role: control (buttons), window (root canvas and tab strip), highlight (selection/menu items), err (destructive actions), app1 (dock panel body chrome — see below), and app2/app3 (reserved for project-specific use).
  • corner — default widget corner kind (square/round/chamfer/…) and radius.
  • panel_border_width — dock panel border thickness, in logical pixels. A theme can leave it at its default or set it to 0 to hide panel borders entirely.
  • font_family — an optional suggested font family name (must already be loaded — see Fonts below). Empty keeps the base theme's fonts.

window (the root canvas and tab strip) and app1 (dock panel bodies) are deliberately given distinct fill/border colors in every built-in preset, so a panel's boundary is identifiable at a glance instead of blending into the rest of the chrome.

Font size is intentionally not part of a .uitheme — it stays an independent Studio-wide setting (see Font size and zoom below) so it doesn't change every time you switch themes.

Create one from the Asset Browser: right-click → Create → UI/Theme → one of the five built-in presets (a starting point you then edit), or double- click an existing .uitheme asset to open its Inspector editor — a color picker per role plus a live preview panel.

Built-in presets

Five themes ship with the engine and are always available, even with no project open: Dark, Light, Dark High Contrast, Darcula, and Catppuccin.

Studio theme, font size, and zoom

Two equivalent places control how Studio itself looks:

  • Settings → UI — a panel with a Theme dropdown, Font Size and Zoom sliders, Import/Export buttons, and the System Font picker below. Changes apply on Save.
  • View → Theme — a menu for quick changes with no separate Save step. Hovering a theme entry previews it instantly (moving off it, or closing the menu without clicking, reverts to whatever was actually selected); clicking an entry selects and persists it immediately. The Font Size and Zoom sliders here apply and persist instantly too, with no hover-preview step.

Both write to the same Studio-wide preference, stored in ~/.turian/settings.json / <project>/.turian/settings.json — independent of any single project's .uitheme assets.

Zoom (0.7×–1.5×) scales button/tab/menu chrome on top of your OS's display scaling, but deliberately does not change how large text renders — Font Size (8–20) is a separate, absolute setting so you can dial in a comfortable reading size independent of how zoomed-in the rest of the chrome is.

Import and export

Studio keeps user themes in a global folder, ~/.turian/themes/, separate from any one project. Import Theme… (next to the theme dropdown) copies a .uitheme file from anywhere on disk into that folder, making it available in the dropdown immediately. Export Theme… writes the currently-selected theme back out to a file you can share or version outside a project.

Fonts

A .uitheme can suggest a font family via font_family (Settings → UI or the theme's Inspector editor), applied best-effort — dvui falls back silently if that family isn't loaded.

For a family that genuinely isn't built in, use Settings → UI → System Font → Browse… to pick any .ttf/.otf file reachable through your OS's file dialog (which is, in practice, how you reach installed system fonts on Windows, macOS, and Linux alike). It overrides every theme's fonts until cleared, independent of which .uitheme is active.

The shipped game's theme

A project's Project Settings has a UI Theme field under Boot, holding a .uitheme asset's GUID. When set, the built game loads that theme at startup and boots its UI with it instead of the OS light/dark default — the exact same asset format and color-resolution code Studio itself uses, so what you see in the .uitheme Inspector preview matches what ships.

Leave it empty to keep today's behavior: the game follows the OS's light/dark preference with no theme override.


← All docs Edit this page