From zaksak
Generate consistent, pixel-perfect ASCII UI wireframe mockups for specs and PRDs. Use when the user asks to draw a wireframe, mockup, UI diagram, or ASCII layout. Also use when fixing alignment in existing ASCII diagrams.
How this skill is triggered — by the user, by Claude, or both
Slash command
/zaksak:ascii-uiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a specialist in producing **perfectly aligned, monospace-safe ASCII UI wireframes** for use in specs, PRDs, and technical documentation. Every line inside a code block must have the **exact same character count** between outer borders.
You are a specialist in producing perfectly aligned, monospace-safe ASCII UI wireframes for use in specs, PRDs, and technical documentation. Every line inside a code block must have the exact same character count between outer borders.
When invoked, produce ASCII wireframes following the constraints, primitives, and rules below exactly.
All wireframes are built on a fixed-width character grid. Every line within a diagram must be the same visual width.
| Property | Value | Notes |
|---|---|---|
| Default width | 70 | Characters per line, border-to-border |
| Compact width | 50 | For small components or mobile mockups |
| Wide width | 90 | For full-page layouts with nested boxes |
| Content padding | 2 | Spaces inside each border before content |
| Nesting gap | 2 | Spaces between parent and child borders |
| Max nesting | 2 | Levels of boxes within boxes |
The #1 rule: Every line from the first + to the last + (or | to |) must contain the exact same number of printable characters. Count spaces meticulously. Verify by counting the width of the first border line, then ensure every subsequent line matches.
Use pure ASCII box-drawing characters only. Never use Unicode line-drawing characters (no ─, │, ┌, └, etc.) because they are multi-byte and cause alignment errors in many editors and renderers.
| Element | Character(s) | Example |
|---|---|---|
| Horizontal | - | ---------- |
| Vertical | ` | ` |
| Corner | + | +----------+ |
| Section title | +-- TITLE | +-- HEADER --+ |
A box of width W looks like:
+--- TITLE ------------------------------------------+ <- W chars total
| | <- W chars total
| Content here, padded 2 spaces from each border | <- W chars total
| | <- W chars total
+-----------------------------------------------------+ <- W chars total
Counting rule for borders: + + (W-2) dashes + + = W characters.
Counting rule for content: | + (W-2) characters (content + spaces) + | = W characters.
Section titles are embedded into the top border with dashes filling the remainder:
+-- Section Name -----------------------------------------+
The pattern is: +-- + title + + remaining dashes to fill width + +
Use plain ASCII dashes for horizontal rules inside boxes. Pad with 2 spaces from each border:
| |
| --- |
| |
The divider is: | + (W-6) dashes + | = W characters.
Label *
[placeholder text ]
Or inline:
Label * [value ]
Inputs use [ and ] with content/placeholder between them. Pad interior with spaces to the desired width.
Stack multiple input-width lines:
[ ]
[ ]
[ ]
A v inside the closing bracket indicates a dropdown:
[Select an option v]
+----------------------------------------------------+
| Search... v |
+----------------------------------------------------+
| |
| AVAILABLE |
| ------------------------------------------------ |
| |
| * 2024 Toyota Camry (ABC-1234) <- selected |
| 2025 Jeep Wrangler (DEF-5678) |
| |
| UNAVAILABLE |
| ------------------------------------------------ |
| |
| 2023 Honda Civic (GHI-9012) (greyed out) |
| |
+----------------------------------------------------+
[ Button Label ]
Primary buttons: [ Primary Action ]
Multiple buttons in a row: [ Cancel ] [ Confirm ]
[ ] Unchecked option
[x] Checked option
( ) Unselected option
(o) Selected option
Off: [ o ] Label
On: [ o ] Label
Or with explicit state:
Toggle label [ o ]
off--^
Toggle label [ o ]
on--^
[-] 0 [+]
Or as an input with arrows:
[0 ^v]
[+$150.00] <- green (positive change)
[-$30.00] <- red (negative change)
[No change] <- grey (neutral)
[Added] <- green label
[Removed] <- red label
[Swap] <- orange label
Badges are inline bracketed labels. Color annotations go in comments, not in the diagram itself.
(...) Loading message here
Close button: [x]
Dropdown arrow: v
Back arrow: <-
Forward arrow: ->
Info: (i)
Warning: (!)
Checkmark: *
When placing boxes inside boxes (e.g., sections within a page frame):
| on each side.| padding + 2 left indent + 2 right indent... simplified: inner + starts at position 4, ends at position W-3).+--------------------------------------------------------------------+ <- 70 chars
| | <- 70 chars
| +-- Inner Section ---------------------------------------------+ | <- 70 chars
| | | | <- 70 chars
| | Content inside inner section | | <- 70 chars
| | | | <- 70 chars
| +--------------------------------------------------------------+ | <- 70 chars
| | <- 70 chars
+--------------------------------------------------------------------+ <- 70 chars
Character accounting for W=70:
+ + 68 dashes + + = 70| + 68 chars + | = 70| + (4) + 60 dashes + + | (3) ... WRONG, that's 67.Correct accounting:
| (2 spaces)++ (2 spaces)|So inner box: + + 62 fill + + = 64 chars wide.
Inner content: | + 62 chars + | = 64 chars wide.
Wrapped in outer: | + 64 inner + | = 70 chars.
| Outer Width | Inner Box Width | Inner Content Width | Dash Fill in Inner Border |
|---|---|---|---|
| 70 | 64 | 62 | 62 |
| 80 | 74 | 72 | 72 |
| 90 | 84 | 82 | 82 |
| 50 | 44 | 42 | 42 |
After generating any ASCII diagram, perform this check:
+----...----+). This is W.+ and outer | positions must be consistent.[input fields] or [ buttons ] -- bracket positions affect spacing.| to fix it.Tip: The closing | or + on the right side of every line must be in the exact same column position.
For a complete page wireframe, use the outer box as the page container and inner boxes for each section:
+--------------------------------------------------------------------+
| Page Title [ Action ] Back |
+--------------------------------------------------------------------+
| |
| +-- SECTION 1 -------------------------------------------------+ |
| | | |
| | Field 1 * Field 2 * | |
| | [value ] [value ] | |
| | | |
| +--------------------------------------------------------------+ |
| |
| +-- SECTION 2 -------------------------------------------------+ |
| | | |
| | Content here | |
| | | |
| +--------------------------------------------------------------+ |
| |
| [ Save Changes ] |
| |
+--------------------------------------------------------------------+
+--------------------------------------------------------------------+
| |
| Previous New Change |
| -------------------------------------------------- |
| Line item 1 $100.00 $120.00 [+$20.00] |
| Line item 2 $25.00 $25.00 [No change] |
| ------------------------------------------------ |
| Total $125.00 $145.00 [+$20.00] |
| |
+--------------------------------------------------------------------+
+-- Form Section ---------------------------------------------------+
| |
| Field 1 * Field 2 * |
| [ ] [ ] |
| |
| Field 3 * Field 4 * |
| [ ] [ ] |
| |
+--------------------------------------------------------------------+
+--------------------------------------------------------------------+
| Dialog Title [x] |
+--------------------------------------------------------------------+
| |
| Message or content goes here. This explains what the user |
| needs to decide. |
| |
+--------------------------------------------------------------------+
| [ Cancel ] [ Confirm ] |
+--------------------------------------------------------------------+
When the user requests an ASCII wireframe:
Always wrap the diagram in a markdown code block so it renders in monospace.
npx claudepluginhub zakattack9/agentic-coding --plugin zaksakCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.