Retro ASCII — Interface Design Skill
Purpose
Build authentic CRT phosphor terminal-style interfaces . The design language simulates an old-school terminal with tar-black canvas, P1 phosphor green primary color, amber + red alarm LEDs, JetBrains Mono typography, and distinctive bracket-corner panel surfaces.
When to Use
- Designing dashboards, landing pages, web apps, or any UI with a retro/terminal/CRT aesthetic
- User requests "retro", "ASCII", "terminal", "hacker", "green screen", or "phosphor" style
- Building dark-themed interfaces with monospace typography and glow effects
Design System Reference
Consult references/design-tokens.md for the complete color palette, typography scale, spacing grid, and component specifications.
Core Principles
- Tar-black canvas — Background is near-black with subtle green tint:
rgba(5, 9, 10, 1)(#05090A) - P1 phosphor green primary —
#00FF6Aas the dominant accent - Amber + Red as alarm-only LEDs —
#FFB000for warnings,#FF3B3Bfor errors. Never decorative. - JetBrains Mono everywhere — Single typeface family, all weights
- Zero border-radius — All corners are sharp. No rounding ever.
- No shadows — Surfaces separate via background step + 1px border + bracket corners
- 4px spacing grid — All spacing multiples of 4
Workflow
- Call
fetch_editor_state— Get current page context - Call
locate_available_space— Find empty area for new frames - Create design tokens as variables (if not already present) — See
references/design-tokens.md - Build components first — Create reusable panel, chip, meter, dot, cursor, line components
- Assemble screen — Compose screens using components and auto-layout
- Verify —
capture_screenshotafter each logical section
Panel Construction (.ra-panel)
Every content surface uses this pattern:
panel=I(parent, {type: "frame", name: "panel-name", layout: "vertical", width: 536, height: "hug_contents",
fills: [{type: "SOLID", color: {r: 0.02, g: 0.039, b: 0.027}, opacity: 0.6, visible: true, blendMode: "NORMAL"}],
strokes: [{type: "SOLID", color: {r: 0.059, g: 0.122, b: 0.078}, opacity: 1, visible: true, blendMode: "NORMAL"}],
strokeWeight: 1, strokeAlign: "INSIDE", padding: [24, 28], gap: 14})
Bracket Corners (Visual Signature)
Every panel has 7×7 right-angle bracket vectors at top-left and bottom-right corners. These are the defining visual element — never omit them.
// Top bracket row
bracketFrame=I(panel, {type: "frame", name: "brackets-top", layout: "none", width: "fill_container", height: 12})
// TL bracket: 7×7 vector with green stroke, positioned at (0,0)
// BR bracket: 7×7 vector with green stroke, positioned at (width-7, 0)
Typography Scale
| Role | Size | Weight | Color | Use |
|---|---|---|---|---|
| Display | 34px | Bold | #00FF6A |
Hero titles, ASCII art headers |
| Clock/Numerals | 26px | Medium | #B8FFB8 |
Large data values, time displays |
| Meter Value | 15px | Regular | #FFB000 |
Metric readings (amber only) |
| Body | 12px | Regular | #B8FFB8 |
Terminal copy, descriptions |
| Small/Boot | 11px | Regular | #2A4A32 (dim) / #B8FFB8 (bright) |
Boot logs, status lines |
| Caption/Label | 10px | Bold | #00FF6A |
Section headers, component names |
| Mini/Chip | 9px | Bold | varies | Chip labels, meter labels |
All text uses fontName: {family: "JetBrains Mono", style: "..."}.
CRITICAL: Always set fill on text nodes — text is invisible by default.
Color Palette
| Token | Hex | RGB (0-1) | Usage |
|---|---|---|---|
| bg-canvas | #05090A |
0.02, 0.035, 0.039 | Page/screen background |
| bg-panel | rgba(5,10,7,.6) |
0.02, 0.039, 0.027 @ 0.6 | Panel fill (translucent) |
| border-panel | #0F1F14 |
0.059, 0.122, 0.078 | Panel stroke, dividers |
| green-primary | #00FF6A |
0, 1, 0.416 | Primary accent, brackets, active states |
| green-text | #B8FFB8 |
0.722, 1, 0.722 | Body text, secondary content |
| green-dim | #2A4A32 |
0.165, 0.290, 0.196 | Disabled text, subtle labels |
| amber-warn | #FFB000 |
1, 0.690, 0 | Warning states, meter values |
| red-fatal | #FF3B3B |
1, 0.231, 0.231 | Error/fatal states only |
| surface-divider | #0F1F14 |
0.059, 0.122, 0.078 | 1px horizontal lines |
Component Library
.ra-chip — Status Badge
Small rectangular badge with 1px colored border:
- Fill: #0F1F14 (dark surface)
- Stroke: matches text color (green/amber/red)
- Padding: [6, 10]
- Text: 9px Bold, matching state color
- States: OK (green), WARN (amber), FATAL (red)
.ra-dot — LED Indicator
- 8×8 square frame, solid fill matching state color
DROP_SHADOWeffect with spread: 3, radius: 0, same color @ 0.7 opacity (creates glow)- Paired with 9px Bold label
.ra-cursor — Blinking Cursor
- 8×14 (or 16×28 for larger) solid green rectangle
- Represents terminal cursor insertion point
- Animation note: 1200ms blink via
steps(1, end)— NEVER transition numbers
.ra-meter — Level Bar
- Row of 8×10 rectangles with 2px gap
- Filled segments: green (low), amber (mid-high)
- Empty segments:
#0F1F14 - Label above: 9px Bold amber text (e.g.
[ INPUT // PEAK ]) - Value: 26px Medium amber (e.g.
-12 dB)
.ra-line — Horizontal Divider
- Frame:
fill_containerwidth, 1px height - Fill:
#0F1F14
.ra-topbar — Navigation Bar
- Horizontal layout,
SPACE_BETWEENalignment - Left: brand name (26px Bold green) + tagline
- Right: chip indicators + status values
- Background: panel fill + 1px bottom border
Boot Log Lines
- Each line: 11px Regular
- Format:
[timestamp] message - Colors: green-dim (loading), green-text (success/OK), amber (warning), red (error)
[ OK ]suffix right-aligned for completed steps
Layout Rules
- Screen container: Vertical layout,
#05090Afill, padding: 32, gap: 20 - Multi-column: Horizontal layout with 20px gap. Common: 3-col (left 536 / mid 948 / right 536)
- Section header: Horizontal layout,
SPACE_BETWEEN, contains title (11px Bold green) + "open ↗" link (10px Bold dim) - Below header: 1px divider line, then subsection label (10px Bold dim), then panel content
- Panel padding: 24px top/bottom, 28px left/right (adjustable per density)
- Item spacing within panels: 12-18px for vertical lists, 14px for horizontal items
Extending the System
When a needed component doesn't exist in the reference system, derive it by:
- Using the same color palette — no new colors
- Using JetBrains Mono at existing scale sizes
- Maintaining 0 border-radius
- Using panel + bracket pattern for any new surface
- Using 1px borders (never shadows) for depth
- Keeping dot/glow pattern for status indicators
- Using the established chip pattern for any tag/badge/label
- Prefixing custom component names with
.ra-convention
Common Extensions
| Need | Pattern |
|---|---|
| Button | .ra-chip with larger padding (10, 20), 10px Bold text |
| Input field | Panel-style frame with cursor, 12px Regular green-text |
| Card | .ra-panel with brackets, internal header + divider + content |
| Table | Panel with header row (10px Bold dim) + data rows (11px Regular green-text), 1px dividers between rows |
| Navigation | Horizontal chips row with active state (green border) vs inactive (dim border) |
| Progress | .ra-meter pattern, horizontal rectangles |
| Modal/Dialog | Larger .ra-panel with brackets, centered on screen with layoutPositioning: "ABSOLUTE" |
| Toast/Alert | .ra-chip variant, full-width, with .ra-dot + message text |
| Sidebar | Vertical panel, fixed width (200-300px), internal nav items as text with > prefix |
| Footer | Horizontal layout mimicking terminal prompt: user@host:~$ command + blinking cursor |
Text Content Style
- ALL CAPS for headers, labels, status text
//as separator in descriptive text::for key-value pairs in technical labels[ ]brackets around section numbers and status codes·(middle dot) as delimiter in navigation items- Monospace alignment: use consistent character widths for tabular data
- Terminal prompt format:
user@host:~/path$for footer/input areas
Do NOT
- Use rounded corners (cornerRadius must be 0)
- Use drop shadows for elevation (only for LED glow effects on
.ra-dot) - Use colors outside the defined palette
- Use any font other than JetBrains Mono
- Use gradients (except for rare decorative ASCII art backgrounds)
- Add images or photos (use ASCII art patterns instead)
- Use CSS transitions on numeric displays (step-function only)