simvx.core.ui.theme

Shared application theme – single source of truth for colours and layout.

AppTheme extends the base Theme with named attributes covering backgrounds, text, accents, semantic colours, buttons, editor viewports, gizmos, IDE minimap, autocomplete, and scrollbar styling.

SyntaxTheme provides syntax highlighting colours for code editors.

Variants are driven by module-level palette dicts and StyleBoxConfig strategies. Factory classmethods (dark(), light(), monokai(), abyss(), midnight(), solarised_dark(), nord()) return pre-configured instances. Module-level get_theme() / set_theme() manage a runtime-swappable singleton.

Usage::

from simvx.core.ui.theme import AppTheme, get_theme, set_theme

theme = get_theme()           # module-level singleton (dark by default)
bg = theme.bg                 # direct attribute access
set_theme(AppTheme.monokai()) # runtime theme switch

Module Contents

Classes

StyleBox

Themed background with optional gradient and per-side embossed borders.

SyntaxTheme

Syntax highlighting colour set for code editors.

StyleBoxConfig

Strategy for building the per-state StyleBoxes from a colour palette.

AppTheme

Full application theme with named colour and layout attributes.

Functions

get_theme

Return the current application theme singleton.

theme_generation

Return the current theme generation counter.

set_theme

Swap the module-level theme singleton and bump the generation counter.

em

Return multiple of the theme font size in logical pixels.

Data

API

simvx.core.ui.theme.log

‘getLogger(…)’

simvx.core.ui.theme.Colour4

None

class simvx.core.ui.theme.StyleBox(bg_colour: simvx.core.ui.theme.Colour4 = (0.2, 0.2, 0.2, 1.0), bg_gradient: tuple[simvx.core.ui.theme.Colour4, simvx.core.ui.theme.Colour4] | None = None, border_colour: simvx.core.ui.theme.Colour4 = (0.3, 0.3, 0.3, 1.0), border_top: simvx.core.ui.theme.Colour4 | None = None, border_bottom: simvx.core.ui.theme.Colour4 | None = None, border_left: simvx.core.ui.theme.Colour4 | None = None, border_right: simvx.core.ui.theme.Colour4 | None = None, border_width: float = 1.0, content_margin: float = 2.0)[source]

Themed background with optional gradient and per-side embossed borders.

Use draw() to render the background and borders. Use inset to offset child content past the border + content margin.

Initialization

__slots__

(‘bg_colour’, ‘bg_gradient’, ‘border_colour’, ‘border_top’, ‘border_bottom’, ‘border_left’, ‘border_…

property inset: float[source]

Total inward offset (border + content margin) for child positioning.

draw(renderer, x: float, y: float, w: float, h: float)[source]

Render background and borders into renderer at the given rect.

class simvx.core.ui.theme.SyntaxTheme(keyword: simvx.core.ui.theme.Colour4 = (0.4, 0.6, 1.0, 1.0), string: simvx.core.ui.theme.Colour4 = (0.5, 0.9, 0.5, 1.0), comment: simvx.core.ui.theme.Colour4 = (0.5, 0.5, 0.5, 1.0), number: simvx.core.ui.theme.Colour4 = (1.0, 0.7, 0.3, 1.0), decorator: simvx.core.ui.theme.Colour4 = (1.0, 0.9, 0.4, 1.0), builtin: simvx.core.ui.theme.Colour4 = (0.4, 0.9, 0.9, 1.0), normal: simvx.core.ui.theme.Colour4 = (0.9, 0.9, 0.9, 1.0))[source]

Syntax highlighting colour set for code editors.

Initialization

__slots__

(‘keyword’, ‘string’, ‘comment’, ‘number’, ‘decorator’, ‘builtin’, ‘normal’)

class simvx.core.ui.theme.StyleBoxConfig[source]

Strategy for building the per-state StyleBoxes from a colour palette.

Defaults match the dark theme (classic emboss, tight margins). Variants override only the knobs that differ.

button_style: str

‘embossed_classic’

emboss_light: float

0.08

emboss_dark: float

0.06

gradient_amount: float

0.0

hover_uses_accent: bool

False

pressed_uses_accent: bool

False

disabled_bg_darken: float

0.04

disabled_border_darken: float

0.08

input_disabled_darken: float

0.02

flat_content_margin: float

0.0

popup_border_attr: str

‘border_light’

class simvx.core.ui.theme.AppTheme(palette: dict[str, Any] | None = None, stylebox_cfg: simvx.core.ui.theme.StyleBoxConfig | None = None)[source]

Bases: simvx.core.ui.types.Theme

Full application theme with named colour and layout attributes.

Subclasses :class:Theme so Control.get_theme() still works. All attributes are also written into self.colours / self.sizes so the dict-based get_colour() / get_size() API stays valid.

Initialization

bg_black: simvx.core.ui.theme.Colour4

None

bg_darkest: simvx.core.ui.theme.Colour4

None

bg_darker: simvx.core.ui.theme.Colour4

None

bg_dark: simvx.core.ui.theme.Colour4

None

bg: simvx.core.ui.theme.Colour4

None

bg_light: simvx.core.ui.theme.Colour4

None

bg_lighter: simvx.core.ui.theme.Colour4

None

bg_input: simvx.core.ui.theme.Colour4

None

panel_bg: simvx.core.ui.theme.Colour4

None

header_bg: simvx.core.ui.theme.Colour4

None

toolbar_bg: simvx.core.ui.theme.Colour4

None

status_bar_bg: simvx.core.ui.theme.Colour4

None

section_bg: simvx.core.ui.theme.Colour4

None

text: simvx.core.ui.theme.Colour4

None

text_bright: simvx.core.ui.theme.Colour4

None

text_label: simvx.core.ui.theme.Colour4

None

text_dim: simvx.core.ui.theme.Colour4

None

text_muted: simvx.core.ui.theme.Colour4

None

text_faint: simvx.core.ui.theme.Colour4

None

accent: simvx.core.ui.theme.Colour4

None

error: simvx.core.ui.theme.Colour4

None

warning: simvx.core.ui.theme.Colour4

None

success: simvx.core.ui.theme.Colour4

None

info: simvx.core.ui.theme.Colour4

None

selection: simvx.core.ui.theme.Colour4

None

selection_bg: simvx.core.ui.theme.Colour4

None

hover_bg: simvx.core.ui.theme.Colour4

None

highlight: simvx.core.ui.theme.Colour4

None

border: simvx.core.ui.theme.Colour4

None

border_light: simvx.core.ui.theme.Colour4

None

btn_bg: simvx.core.ui.theme.Colour4

None

btn_hover: simvx.core.ui.theme.Colour4

None

btn_pressed: simvx.core.ui.theme.Colour4

None

btn_border: simvx.core.ui.theme.Colour4

None

btn_primary: simvx.core.ui.theme.Colour4

None

btn_danger: simvx.core.ui.theme.Colour4

None

input_border: simvx.core.ui.theme.Colour4

None

input_focus: simvx.core.ui.theme.Colour4

None

placeholder: simvx.core.ui.theme.Colour4

None

scrollbar_hover: simvx.core.ui.theme.Colour4

None

scrollbar_track: simvx.core.ui.theme.Colour4

None

tab_bg: simvx.core.ui.theme.Colour4

None

tab_active: simvx.core.ui.theme.Colour4

None

tab_hover: simvx.core.ui.theme.Colour4

None

tab_text: simvx.core.ui.theme.Colour4

None

tab_active_text: simvx.core.ui.theme.Colour4

None

tree_bg: simvx.core.ui.theme.Colour4

None

tree_select: simvx.core.ui.theme.Colour4

None

tree_hover: simvx.core.ui.theme.Colour4

None

tree_arrow: simvx.core.ui.theme.Colour4

None

check_colour: simvx.core.ui.theme.Colour4

None

check_box: simvx.core.ui.theme.Colour4

None

slider_fill: simvx.core.ui.theme.Colour4

None

slider_handle: simvx.core.ui.theme.Colour4

None

dock_title_bg: simvx.core.ui.theme.Colour4

None

dock_title_text: simvx.core.ui.theme.Colour4

None

popup_bg: simvx.core.ui.theme.Colour4

None

popup_hover: simvx.core.ui.theme.Colour4

None

popup_separator: simvx.core.ui.theme.Colour4

None

divider: simvx.core.ui.theme.Colour4

None

divider_hover: simvx.core.ui.theme.Colour4

None

current_line: simvx.core.ui.theme.Colour4

None

bracket_match: simvx.core.ui.theme.Colour4

None

bracket_mismatch: simvx.core.ui.theme.Colour4

None

line_number: simvx.core.ui.theme.Colour4

None

gutter_bg: simvx.core.ui.theme.Colour4

None

syntax: simvx.core.ui.theme.SyntaxTheme

None

viewport_bg: simvx.core.ui.theme.Colour4

None

gizmo_x: simvx.core.ui.theme.Colour4

None

gizmo_y: simvx.core.ui.theme.Colour4

None

gizmo_z: simvx.core.ui.theme.Colour4

None

selection_outline: simvx.core.ui.theme.Colour4

None

grid_major: simvx.core.ui.theme.Colour4

None

grid_minor: simvx.core.ui.theme.Colour4

None

minimap_text: simvx.core.ui.theme.Colour4

None

minimap_keyword: simvx.core.ui.theme.Colour4

None

minimap_string: simvx.core.ui.theme.Colour4

None

minimap_comment: simvx.core.ui.theme.Colour4

None

autocomplete_bg: simvx.core.ui.theme.Colour4

None

autocomplete_selected: simvx.core.ui.theme.Colour4

None

autocomplete_border: simvx.core.ui.theme.Colour4

None

autocomplete_hover: simvx.core.ui.theme.Colour4

None

autocomplete_dim: simvx.core.ui.theme.Colour4

None

autocomplete_kind: simvx.core.ui.theme.Colour4

None

scrollbar_bg: simvx.core.ui.theme.Colour4

None

scrollbar_fg: simvx.core.ui.theme.Colour4

None

header_h: float

None

row_h: float

None

tab_h: float

None

font_size: float

None

ui_scale: float

None

scrollbar_width: float

None

dock_title_h: float

None

btn_style_normal: simvx.core.ui.theme.StyleBox

None

btn_style_hover: simvx.core.ui.theme.StyleBox

None

btn_style_pressed: simvx.core.ui.theme.StyleBox

None

btn_style_disabled: simvx.core.ui.theme.StyleBox

None

btn_style_focused: simvx.core.ui.theme.StyleBox

None

panel_style: simvx.core.ui.theme.StyleBox

None

input_style_normal: simvx.core.ui.theme.StyleBox

None

input_style_focused: simvx.core.ui.theme.StyleBox

None

input_style_disabled: simvx.core.ui.theme.StyleBox

None

tab_style_normal: simvx.core.ui.theme.StyleBox

None

tab_style_active: simvx.core.ui.theme.StyleBox

None

tab_style_hover: simvx.core.ui.theme.StyleBox

None

popup_style: simvx.core.ui.theme.StyleBox

None

popup_style_hover: simvx.core.ui.theme.StyleBox

None

dock_title_style: simvx.core.ui.theme.StyleBox

None

classmethod dark() simvx.core.ui.theme.AppTheme[source]

Dark theme (default).

classmethod abyss() simvx.core.ui.theme.AppTheme[source]

Abyss — near-black with a subtle cool-blue tint. OLED-friendly.

classmethod midnight() simvx.core.ui.theme.AppTheme[source]

Midnight — near-black with a subtle warm-green tint. OLED-friendly.

classmethod light() simvx.core.ui.theme.AppTheme[source]

Light theme with bright backgrounds and gradient buttons.

classmethod monokai() simvx.core.ui.theme.AppTheme[source]

Monokai-inspired theme.

classmethod solarised_dark() simvx.core.ui.theme.AppTheme[source]

Solarised Dark — Ethan Schoonover’s warm-tinted dark palette.

classmethod nord() simvx.core.ui.theme.AppTheme[source]

Nord — Arctic, north-bluish palette by Arctic Ice Studio.

get_colour(key: str, default=(1, 1, 1, 1)) tuple[float, float, float, float]
get_size(key: str, default: float = 0) float
simvx.core.ui.theme.get_theme() simvx.core.ui.theme.AppTheme[source]

Return the current application theme singleton.

simvx.core.ui.theme.theme_generation() int[source]

Return the current theme generation counter.

Incremented by set_theme(). Draw caches use this to detect global theme changes without walking the widget tree.

simvx.core.ui.theme.set_theme(theme: simvx.core.ui.theme.AppTheme) None[source]

Swap the module-level theme singleton and bump the generation counter.

simvx.core.ui.theme.em(multiple: float) float[source]

Return multiple of the theme font size in logical pixels.

Use for layout dimensions that should scale with the user’s font-size preference. Does NOT multiply by ui_scale — UI layout works in logical (window) coordinates; the GPU rendering pipeline handles the logical-to-physical conversion separately via Draw2DPass.