Rendering Style Guide¶
Use this guide when adding or modifying terminal output in rendering/ and reporting/terminal.py.
Width conventions¶
- Always use
get_output_width(console)for panel and table widths. - Keep terminal output capped at 88 columns.
- Avoid
expand=Truefor data panels; reserve it for layout regions — such as the welcome panel — that should fill the terminal like Typer's own help pages.
Box style hierarchy¶
| Content type | Constant | Rich box |
|---|---|---|
| Banner / Welcome | BOX_BANNER |
box.DOUBLE |
| Summary / Metrics | BOX_SUMMARY |
box.HEAVY |
| Standard content | BOX_CONTENT |
box.ROUNDED |
| Action lists | BOX_ACTION |
box.SIMPLE |
| Code blocks | BOX_CODE |
box.SQUARE |
Brand colour palette¶
All terminal colours are derived from the Caligo design system defined in
docs/stylesheets/tokens/palette.css. Import constants from
mcp_zen_of_languages.rendering.themes — never hard-code hex values.
| Constant | Hex | Caligo token | Role |
|---|---|---|---|
BRAND_PRIMARY |
#989cff |
--caligo-accent |
Primary UI — options, paths, usage, banner art |
BRAND_ACCENT |
#c8315a |
--caligo-cherry |
Vibrant highlight — required markers, high severity, scores |
BRAND_COOL |
#63c8ff |
--caligo-harmony-cool |
Success / switches / low-severity indicators |
BRAND_MUTED |
#9b95ad |
--caligo-fg-muted |
Dim text — defaults, env vars, subtle decorations |
BORDER_STYLE |
#767bd8 |
--caligo-accent-muted |
Panel borders — subdued purple coherent with primary |
Semantic Rich theme tokens (applied via ZEN_THEME, always prefer these over raw constants):
| Token | Mapped to | Use case |
|---|---|---|
banner |
bold {BRAND_PRIMARY} |
Pyfiglet banner art |
severity.high |
bold {BRAND_ACCENT} |
High-severity violations |
severity.medium |
{BRAND_PRIMARY} |
Medium-severity violations |
severity.low |
{BRAND_COOL} |
Low-severity violations |
path |
bold {BRAND_PRIMARY} |
File and module paths |
metric |
{BRAND_PRIMARY} |
Numeric metrics |
score |
bold {BRAND_ACCENT} |
Quality scores |
muted |
dim {BRAND_MUTED} |
Subdued / secondary text |
Backward-compatible aliases
The legacy names BRAND_ORANGE, BRAND_BLUE, BRAND_GREEN, and
BRAND_GRAY remain as aliases pointing to their Caligo equivalents so
existing code continues to compile. Prefer the semantic names
(BRAND_PRIMARY, BRAND_ACCENT, BRAND_COOL, BRAND_MUTED) in new code.
Prompt rendering¶
- Prefer Rich-native renderables (
Panel,Group,Table,Syntax) over raw markdown text. - Render code examples with
Syntax(...)and wrap them in aBOX_CODEpanel. - Use panel titles/subtitles for file context instead of markdown headers like
###.
Severity and glyph conventions¶
- Always use
severity_badge(...)for severity labels. - Keep severity columns fixed to width 12 (
Sev). - Use shared glyph helpers (
file_glyph,score_glyph,pass_fail_glyph) to keep fallback behavior consistent.
Typer + Rich consistency¶
uv run zenand subcommands should use one visual language (same width cap, same box hierarchy, same Caligo palette).- Help panels use
BORDER_STYLE(--caligo-accent-muted) for borders andBRAND_PRIMARYfor option names; switches useBRAND_COOL. - The welcome panel (
_build_welcome_panel) usesPaneldirectly — matching Typer's ownexpand=True, ROUNDED, left-aligned-title style — rather than the fixed-widthzen_panelfactory. - Rich and Typer are designed to work together; keep help and command output aligned.
- Pyfiglet banners are allowed, but always keep a plain-text fallback for non-interactive terminals.