Summary
Improve the existing ornaments and borders, and add more of both.
Current state
- Ornaments (
src/welchost/ornaments.py): none | ghosts | stars | bars | dots — predefined ASCII blocks flanking the banner.
- Borders (
decoration.border_style): panel | box | double | rounded | ascii | none.
Scope
- Add new ornament sets and richer border styles.
- Revisit the existing ones — the current sets were a first pass and some read better than others at different banner heights.
- Consider whether ornaments should adopt the banner palette the way the styled metadata row now does (
info.accent inherits the banner color), rather than rendering unstyled.
Requirements
- Stay data-driven. New ornaments are plain data in
ornaments.py, not rendering code. Same for border glyph sets. Adding an option should not mean touching the renderer.
- WYSIWYG in the preview. Every new option must render identically in the TUI
BannerPreview and in the generated welcome_banner.py. These are two separate code paths (render.py vs. the Jinja2 template) and they drift silently — cover new options with a parity test like the one added for the metadata row.
- Width-aware. Ornaments flank the banner and count toward measured width;
fit.art_width() already accounts for this, so new ornaments must feed the same measurement rather than bypassing it.
- Backward compatible. Existing
welchost.toml files naming today's ornaments keep working, round-trip lossless.
Areas
Decoration, Rendering · Effort M
Summary
Improve the existing ornaments and borders, and add more of both.
Current state
src/welchost/ornaments.py):none | ghosts | stars | bars | dots— predefined ASCII blocks flanking the banner.decoration.border_style):panel | box | double | rounded | ascii | none.Scope
info.accentinherits the banner color), rather than rendering unstyled.Requirements
ornaments.py, not rendering code. Same for border glyph sets. Adding an option should not mean touching the renderer.BannerPreviewand in the generatedwelcome_banner.py. These are two separate code paths (render.pyvs. the Jinja2 template) and they drift silently — cover new options with a parity test like the one added for the metadata row.fit.art_width()already accounts for this, so new ornaments must feed the same measurement rather than bypassing it.welchost.tomlfiles naming today's ornaments keep working, round-trip lossless.Areas
Decoration, Rendering · Effort M