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).