Docs

UI + theme

Helix UI + theme instructions.

Pulled from the Helix repo (docs/instructions.md): how we generate themes, package icons, lint colors, run snapshots, and control startup UI.

Theme system

Tokens drive generated palette + QSS outputs; no hand-edited hex in code.

  • Tokens live in `helix/theme/tokens.json`; generation outputs land in `helix/theme/out/theme_generated.qss` and `helix/theme/out/theme_palette_generated.py`.
  • Regenerate with `python helix/theme/generate_theme.py --tokens helix/theme/tokens.json --out helix/theme/out --theme dark`.
  • App startup should load the generated palette and QSS instead of custom literals.

Icon resources

SVGs compile into a Qt resource module tracked in git.

  • Source SVGs sit in `helix/theme/icons/` with the manifest at `helix/theme/icons.qrc`.
  • Regenerate the bundled module via `pyside6-rcc helix/theme/icons.qrc -o helix/theme/icons_rc.py`.
  • CI uses `tools/check_icons_rc.py` to ensure `icons_rc.py` matches the qrc contents.

Color lint policy

New raw color literals are tightly gated to keep themes centralized.

  • Strict no-new-literal zones: `src/helix/gui` and `src/helix/studio` when touched.
  • Everywhere else, legacy literals can stay untouched; new ones are blocked and tracked in `tools/lint_colors_baseline.json`.
  • Commands: `python tools/lint_colors.py`, `python tools/lint_colors.py --staged`, `python tools/lint_colors.py --report artifacts/lint/colors.json`, `python tools/lint_colors.py baseline update` (clean git unless you pass `--force`).

Exit codes: 0 clean; 2 new literals; 3 strict ratchet increased; 4 both.

Snapshot validation

Use headless UI snapshots to verify polish and regressions.

  • Run `QT_QPA_PLATFORM=offscreen python tools/snap_ui.py --chrome-extras --sizes 1440x900 --welcome-size 1100x760`.

Welcome dialog controls

Skip or suppress the welcome flow for automated runs and demos.

  • Set `HELIX_STUDIO_SKIP_WELCOME=1` or launch with `python -m helix.studio.app --skip-welcome`.

Window sizing & chrome

Force geometry for demos, CI captures, or multi-screen setups.

  • Force maximize via `HELIX_STUDIO_FORCE_MAXIMIZED=1` or `python -m helix.studio.app --force-maximized`.
  • Choose a display with `HELIX_STUDIO_FORCE_SCREEN=cursor|primary|<screen_name>` or `python -m helix.studio.app --screen cursor`.
  • WSL/XWayland default to native chrome; set `HELIX_NATIVE_CHROME=0` to force frameless (not recommended on WSL).