Consolidate skills from 21 to 18: rename, merge, and fold

- Rename /arrange to /layout for clarity
- Merge /normalize into /polish (design system discovery + cleanup phases)
- Merge /onboard into /harden (onboarding, empty states, progressive disclosure)
- Fold /extract into /impeccable extract sub-mode (reference file, sidebar link)
- Update all counts, cross-references, data files, demos, and metadata
- Remove System category (now empty)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Paul Bakaus
2026-04-09 20:39:02 -07:00
co-authored by Claude Opus 4.6
parent e79873621b
commit faa7453db7
27 changed files with 437 additions and 112 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
"name": "impeccable",
"metadata": {
"description": "Design fluency for AI harnesses. 1 skill, 21 commands, and curated anti-patterns for impeccable frontend design."
"description": "Design fluency for AI harnesses. 1 skill, 18 commands, and curated anti-patterns for impeccable frontend design."
},
"owner": {
"name": "Paul Bakaus",
@@ -11,7 +11,7 @@
"plugins": [
{
"name": "impeccable",
"description": "Design vocabulary and skills for frontend development. Includes 21 commands (/polish, /distill, /audit, /typeset, /overdrive, etc.) and an enhanced impeccable skill with curated anti-patterns.",
"description": "Design vocabulary and skills for frontend development. Includes 18 commands (/polish, /distill, /audit, /typeset, /overdrive, etc.) and an enhanced impeccable skill with curated anti-patterns.",
"version": "2.0.7",
"author": {
"name": "Paul Bakaus",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "impeccable",
"description": "Design vocabulary and skills for frontend development. Includes 21 commands (/polish, /distill, /audit, /typeset, /overdrive, etc.) and an enhanced impeccable skill with curated anti-patterns.",
"description": "Design vocabulary and skills for frontend development. Includes 18 commands (/polish, /distill, /audit, /typeset, /overdrive, etc.) and an enhanced impeccable skill with curated anti-patterns.",
"version": "2.0.7",
"author": {
"name": "Paul Bakaus",
+1 -1
View File
@@ -1,6 +1,6 @@
# Impeccable
The vocabulary you didn't know you needed. 1 skill, 21 commands, and curated anti-patterns for impeccable style. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.
The vocabulary you didn't know you needed. 1 skill, 18 commands, and curated anti-patterns for impeccable style. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.
## Repository Purpose
+1 -1
View File
@@ -13,5 +13,5 @@ The `impeccable` skill in this project builds on Anthropic's original frontend-d
This project extends the original with:
- 7 domain-specific reference files (typography, color-and-contrast, spatial-design, motion-design, interaction-design, responsive-design, ux-writing)
- 21 steering commands
- 18 steering commands
- Expanded patterns and anti-patterns
+8 -9
View File
@@ -1,6 +1,6 @@
# Impeccable
The vocabulary you didn't know you needed. 1 skill, 21 commands, and curated anti-patterns for impeccable frontend design.
The vocabulary you didn't know you needed. 1 skill, 18 commands, and curated anti-patterns for impeccable frontend design.
> **Quick start:** Visit [impeccable.style](https://impeccable.style) to download ready-to-use bundles.
@@ -12,7 +12,7 @@ Every LLM learned from the same generic templates. Without guidance, you get the
Impeccable fights that bias with:
- **An expanded skill** with 7 domain-specific reference files ([view source](source/skills/impeccable/))
- **21 steering commands** to audit, review, polish, distill, animate, and more
- **18 steering commands** to audit, review, polish, distill, animate, and more
- **Curated anti-patterns** that explicitly tell the AI what NOT to do
## What's Included
@@ -31,29 +31,28 @@ A comprehensive design skill with 7 domain-specific references ([view skill](sou
| [responsive-design](source/skills/impeccable/reference/responsive-design.md) | Mobile-first, fluid design, container queries |
| [ux-writing](source/skills/impeccable/reference/ux-writing.md) | Button labels, error messages, empty states |
### 21 Commands
### 18 Commands
| Command | What it does |
|---------|--------------|
| `/impeccable teach` | One-time setup: gather design context, save to config |
| `/impeccable craft` | Full shape-then-build flow with visual iteration |
| `/impeccable extract` | Pull reusable components and tokens into the design system |
| `/audit` | Run technical quality checks (a11y, performance, responsive) |
| `/critique` | UX design review: hierarchy, clarity, emotional resonance |
| `/normalize` | Align with design system standards |
| `/polish` | Final pass before shipping |
| `/polish` | Final pass, design system alignment, and shipping readiness |
| `/distill` | Strip to essence |
| `/clarify` | Improve unclear UX copy |
| `/optimize` | Performance improvements |
| `/harden` | Error handling, i18n, edge cases |
| `/harden` | Error handling, onboarding, i18n, edge cases |
| `/animate` | Add purposeful motion |
| `/colorize` | Introduce strategic color |
| `/bolder` | Amplify boring designs |
| `/quieter` | Tone down overly bold designs |
| `/delight` | Add moments of joy |
| `/extract` | Pull into reusable components |
| `/adapt` | Adapt for different devices |
| `/onboard` | Design onboarding flows |
| `/typeset` | Fix font choices, hierarchy, sizing |
| `/arrange` | Fix layout, spacing, visual rhythm |
| `/layout` | Fix layout, spacing, visual rhythm |
| `/overdrive` | Add technically extraordinary effects |
#### Usage Examples
+2 -2
View File
@@ -20,7 +20,7 @@ The skill scans your code across five dimensions:
Each dimension gets a 0 to 4 score. Each finding gets a severity: P0 blocks the release, P1 should fix this sprint, P2 is next cycle, P3 is polish. You get back a single document you can paste into a ticket tracker.
Audit does not fix anything. It documents. Route the findings to `/polish`, `/harden`, `/normalize`, or `/optimize` depending on the category.
Audit does not fix anything. It documents. Route the findings to `/polish`, `/harden`, or `/optimize` depending on the category.
## Try it
@@ -41,7 +41,7 @@ Performance: 3/4 (good)
...
```
Hand the P0s to `/harden`, the theming and typography P1s to `/normalize` and `/typeset`, the rest to `/polish`.
Hand the P0s to `/harden`, the theming and typography P1s to `/typeset` and `/polish`, the rest to `/polish`.
## Pitfalls
+1 -1
View File
@@ -35,6 +35,6 @@ Expected changes:
## Pitfalls
- **Running it on the wrong page.** Product dashboards, settings, and forms should not be bold. They should be legible. Use `/arrange` or `/polish` instead.
- **Running it on the wrong page.** Product dashboards, settings, and forms should not be bold. They should be legible. Use `/layout` or `/polish` instead.
- **Confusing bold with loud.** Bold means committed and confident. Loud means shouting. Bolder is the former. If the result feels aggressive, follow up with `/quieter`.
- **Pairing it with `/delight` in the same pass.** Delight works best against a stable visual baseline. Bold first, stabilize, then delight.
+1 -1
View File
@@ -41,4 +41,4 @@ Fewer things. Each one clearer.
- **Confusing distill with delete.** Distill removes obstacles. It does not remove features users need. If a user relies on something daily, find a way to keep it quietly, not a way to cut it.
- **Running it too early.** If the feature is still growing, distilling it now means distilling the same thing again next week. Wait until the shape is stable.
- **Expecting it to replace hierarchy work.** Sometimes the right fix is not removing things, it is arranging them. Reach for `/arrange` when the problem is layout, not quantity.
- **Expecting it to replace hierarchy work.** Sometimes the right fix is not removing things, it is arranging them. Reach for `/layout` when the problem is layout, not quantity.
+5 -4
View File
@@ -1,5 +1,5 @@
---
tagline: "Make interfaces production-ready. Edge cases, i18n, error states, overflow."
tagline: "Make interfaces production-ready. Edge cases, onboarding, i18n, error states, overflow."
---
## When to use it
@@ -10,12 +10,13 @@ Reach for it before launch, before opening to a new market, or any time a bug re
## How it works
The skill works through four dimensions of real-world resilience:
The skill works through five dimensions of real-world resilience:
1. **Text and data extremes**. Long text, short text, special characters, emoji, RTL, numbers in the billions, 1000-item lists, zero-data empty states.
2. **Error scenarios**. Network failures, API 4xx/5xx, validation errors, permission errors, rate limits, concurrent operations.
3. **Internationalization**. Long translations (German is often 30% longer than English), RTL languages, date and number formats, currency symbols, character sets.
4. **Device and context**. Touch targets, offline behavior, slow connections, low-power mode.
4. **Onboarding and empty states**. First-run experiences, empty state design, progressive disclosure, feature discovery. Making the feature work for someone who has never seen it before.
5. **Device and context**. Touch targets, offline behavior, slow connections, low-power mode.
For each dimension it identifies the failure mode, then applies the concrete fix: overflow handling, proper empty states, informative error UI, i18n-safe layouts, pluralization, sensible fallbacks.
@@ -40,5 +41,5 @@ Run it per-page, not all at once. The first run is the biggest; subsequent runs
## Pitfalls
- **Waiting for a bug report.** Harden is preventative. If you find yourself fixing the same class of bug twice, run `/harden` across the feature.
- **Treating error states as an afterthought.** Most hardening work is error UI. Budget time for it, not just a `catch` block.
- **Treating error and empty states as an afterthought.** Most hardening work is error and empty state UI. Budget time for it, not just a `catch` block.
- **Skipping i18n because "we are English-only for now".** i18n-safe layouts are still better layouts. Flexible containers, proper text wrapping, generous line-height. None of that hurts English.
+4
View File
@@ -16,6 +16,10 @@ The full shape-then-build flow. It starts by running `/shape` internally (a stru
One-time project setup. Runs a short discovery interview about your brand, audience, and aesthetic direction, then writes a `.impeccable.md` file that every future skill call reads automatically. Run this once per project before doing any design work.
### /impeccable extract {#extract}
Pull reusable components, design tokens, and patterns out of your code and into the design system. Finds repeated UI patterns (buttons in 12 places, three card variants, scattered hex colors), extracts them into shared primitives, and migrates all callers. Best used after a product has shipped enough features to reveal the patterns -- premature extraction creates abstractions that do not match reality.
## How it works
Most AI-generated UIs fail the same way: generic fonts, purple gradients, card grids on card grids, glassmorphism everywhere. `/impeccable` gives your AI a strong point of view. It loads an opinionated design handbook plus a long list of anti-patterns, then pushes the model to commit to a specific aesthetic direction before writing a single line of code.
+41
View File
@@ -0,0 +1,41 @@
---
tagline: "Fix layout, spacing, and visual rhythm."
---
## When to use it
`/layout` is for pages where nothing is technically wrong but nothing is breathing either. Equal padding everywhere, monotonous card grids, content that runs edge to edge, hierarchy that relies on size alone. Reach for it when a layout "feels off" and you cannot articulate why.
Good triggers: "everything feels crowded", "it reads like a wall", "I do not know where to look first".
## How it works
The skill runs through five layout dimensions:
1. **Spacing**: is the spacing scale consistent or are there random 13px gaps, are related elements grouped tightly with generous space between groups, is there any rhythm at all.
2. **Visual hierarchy**: does the eye land on the primary action within 2 seconds, is the hierarchy doing real work or is everything shouting.
3. **Grid and structure**: is there an underlying grid or is the layout random, are elements aligned to baselines.
4. **Rhythm**: does the page alternate between tight and generous spacing, or is everything uniform.
5. **Density**: is the layout cramped or is it wasteful, does density match the content type.
Fixes usually involve rebuilding the spacing scale, introducing asymmetry, collapsing monotonous grids into a mixed layout with hero and supporting elements, and giving the primary action real space.
## Try it
```
/layout the settings page
```
Typical changes:
- Spacing scale unified to 8 / 16 / 24 / 48 / 96px
- Section breaks at 48px, row gaps at 16px, form field groups at 8px
- Primary actions pulled out of the form flow with 32px buffer
- Decorative borders removed, replaced with spacing-driven grouping
- Sidebar and main column proportions rebalanced (280 / flex vs 25 / 75)
## Pitfalls
- **Confusing arrange with distill.** If the problem is too many things, run `/distill` first. Layout is for arranging what is already the right set.
- **Expecting it to rescue a broken grid.** If the page has no grid at all, arrange will build one. Just know that the diff is going to be larger than you expect.
- **Ignoring the hierarchy verdict.** If arrange says "nothing is primary", no amount of spacing work fixes that. You need a content decision, not a layout tweak.
+4 -4
View File
@@ -4,13 +4,13 @@ tagline: "The meticulous final pass between good and great."
## When to use it
`/polish` is the last thing you run before shipping. It hunts down the small details that separate a shipped feature from a polished one: half-pixel misalignments, inconsistent spacing, forgotten focus states, loading transitions that flash, copy that drifts in tone.
`/polish` is the last thing you run before shipping. It hunts down the small details that separate a shipped feature from a polished one: half-pixel misalignments, inconsistent spacing, forgotten focus states, loading transitions that flash, copy that drifts in tone. It also aligns the feature with your design system -- replacing hard-coded values with tokens, swapping custom components for shared ones, and fixing any drift from established patterns.
Reach for it when the feature is functionally complete, nothing is broken, and something still feels off.
Reach for it when the feature is functionally complete, nothing is broken, and something still feels off. Also reach for it when a feature has drifted from the design system and needs to be pulled back in line.
## How it works
Polish works methodically across six dimensions:
Polish starts by discovering the design system (tokens, spacing scale, shared components), then works methodically across six dimensions:
1. **Visual alignment and spacing**: pixel-perfect grid adherence, consistent spacing scale, optical alignment on icons.
2. **Typography**: hierarchy consistency, line length, widows and orphans, kerning on headlines.
@@ -42,5 +42,5 @@ Five small fixes, no rewrites. That is the shape of a good polish pass.
## Pitfalls
- **Polishing work that is not done.** If there are TODOs in the code, you are not ready. Run `/polish` on finished features only.
- **Treating polish as redesign.** Polish refines what exists. If you find yourself rearchitecting a layout, you needed `/critique` or `/arrange` instead.
- **Treating polish as redesign.** Polish refines what exists. If you find yourself rearchitecting a layout, you needed `/critique` or `/layout` instead.
- **Running `/polish` without `/audit` first.** Polish catches feel-based issues. Audit catches measurable ones. Use both.
+1 -1
View File
@@ -38,5 +38,5 @@ Expected diff:
## Pitfalls
- **Asking for a new font without context.** Typeset will pick based on the `.impeccable.md` brand voice. If you have not run `/impeccable teach`, the suggestion will be generic.
- **Reaching for typeset when the issue is layout.** If paragraphs are fine but the page feels cramped, you want `/arrange`.
- **Reaching for typeset when the issue is layout.** If paragraphs are fine but the page feels cramped, you want `/layout`.
- **Expecting fluid clamp scales on app UIs.** Typeset uses fixed rem scales for app interfaces. Fluid typography is for marketing and content pages where line length varies dramatically.
+12 -18
View File
@@ -13,7 +13,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impeccable Command Cheatsheet</title>
<meta name="description" content="Quick reference for all 22 Impeccable commands. Print-friendly cheatsheet for design fluency in AI harnesses.">
<meta name="description" content="Quick reference for all 18 Impeccable commands. Print-friendly cheatsheet for design fluency in AI harnesses.">
<link rel="icon" type="image/svg+xml" href="./favicon.svg">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -188,7 +188,7 @@
<div class="cheatsheet-page-header">
<h1>Impeccable Commands</h1>
<p class="subtitle">Quick reference for all 21 design commands</p>
<p class="subtitle">Quick reference for all 18 design commands</p>
</div>
<main id="commands-container">
@@ -215,7 +215,6 @@
'impeccable': 'system',
'audit': 'diagnostic',
'critique': 'diagnostic',
'normalize': 'quality',
'polish': 'quality',
'optimize': 'quality',
'harden': 'quality',
@@ -226,34 +225,29 @@
'animate': 'enhancement',
'colorize': 'enhancement',
'delight': 'enhancement',
'extract': 'system',
'adapt': 'adaptation',
'onboard': 'enhancement',
'typeset': 'enhancement',
'arrange': 'enhancement',
'layout': 'enhancement',
'overdrive': 'enhancement'
};
const commandRelationships = {
'impeccable': { flow: 'One-time project context gathering' },
'audit': { leadsTo: ['normalize', 'harden', 'optimize', 'adapt', 'clarify'], flow: 'Technical quality audit' },
'critique': { leadsTo: ['polish', 'distill', 'bolder', 'quieter', 'typeset', 'arrange'], flow: 'UX and design review' },
'normalize': { combinesWith: ['clarify', 'adapt'], flow: 'Align with design system' },
'polish': { flow: 'Final pass before shipping' },
'audit': { leadsTo: ['harden', 'optimize', 'adapt', 'clarify'], flow: 'Technical quality audit' },
'critique': { leadsTo: ['polish', 'distill', 'bolder', 'quieter', 'typeset', 'layout'], flow: 'UX and design review' },
'polish': { flow: 'Final pass and design system alignment' },
'optimize': { flow: 'Performance improvements' },
'harden': { combinesWith: ['optimize'], flow: 'Error handling & edge cases' },
'clarify': { combinesWith: ['normalize', 'adapt'], flow: 'Improve UX copy' },
'harden': { combinesWith: ['optimize'], flow: 'Edge cases, onboarding, and error handling' },
'clarify': { combinesWith: ['polish', 'adapt'], flow: 'Improve UX copy' },
'quieter': { pairs: 'bolder', flow: 'Tone down bold designs' },
'bolder': { pairs: 'quieter', flow: 'Amplify timid designs' },
'distill': { combinesWith: ['quieter', 'normalize'], flow: 'Strip to essence' },
'distill': { combinesWith: ['quieter', 'polish'], flow: 'Strip to essence' },
'animate': { combinesWith: ['delight'], flow: 'Add motion' },
'colorize': { combinesWith: ['bolder', 'delight'], flow: 'Add strategic color' },
'delight': { combinesWith: ['bolder', 'animate'], flow: 'Add personality' },
'extract': { flow: 'Create design system elements' },
'adapt': { combinesWith: ['normalize', 'clarify'], flow: 'Different devices/contexts' },
'onboard': { combinesWith: ['clarify', 'delight'], flow: 'Onboarding & empty states' },
'typeset': { combinesWith: ['bolder', 'normalize'], flow: 'Fix typography' },
'arrange': { combinesWith: ['distill', 'adapt'], flow: 'Fix layout & spacing' },
'adapt': { combinesWith: ['polish', 'clarify'], flow: 'Different devices/contexts' },
'typeset': { combinesWith: ['bolder', 'polish'], flow: 'Fix typography' },
'layout': { combinesWith: ['distill', 'adapt'], flow: 'Fix layout & spacing' },
'overdrive': { combinesWith: ['animate', 'delight'], flow: 'Technically extraordinary effects' }
};
+9 -9
View File
@@ -13,7 +13,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impeccable: The missing upgrade to Anthropic's impeccable skill</title>
<meta name="description" content="1 skill, 21 commands, and curated anti-patterns for impeccable frontend design. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.">
<meta name="description" content="1 skill, 18 commands, and curated anti-patterns for impeccable frontend design. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.">
<meta name="theme-color" content="#fafafa">
<link rel="canonical" href="https://impeccable.style">
@@ -21,7 +21,7 @@
<meta property="og:type" content="website">
<meta property="og:url" content="https://impeccable.style">
<meta property="og:title" content="Impeccable: Design skills for AI harnesses">
<meta property="og:description" content="1 skill, 21 commands, and curated anti-patterns for impeccable frontend design. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.">
<meta property="og:description" content="1 skill, 18 commands, and curated anti-patterns for impeccable frontend design. Works with Cursor, Claude Code, Gemini CLI, and Codex CLI.">
<meta property="og:image" content="https://impeccable.style/og-image.jpg">
<!-- Twitter -->
@@ -29,7 +29,7 @@
<meta name="twitter:site" content="@pbakaus">
<meta name="twitter:creator" content="@pbakaus">
<meta name="twitter:title" content="Impeccable: Design skills for AI harnesses">
<meta name="twitter:description" content="1 skill, 21 commands, and curated anti-patterns for impeccable frontend design.">
<meta name="twitter:description" content="1 skill, 18 commands, and curated anti-patterns for impeccable frontend design.">
<meta name="twitter:image" content="https://impeccable.style/og-image.jpg">
<link rel="icon" type="image/svg+xml" href="./favicon.svg">
@@ -88,15 +88,15 @@
<h1 class="hero-title-combined">Impeccable</h1>
<p class="hero-tagline-combined">Design fluency for AI harnesses</p>
<p class="hero-hook-text hero-hook-text--full">Great design prompts require design vocabulary. Most people don't have it. Impeccable teaches your AI deep design knowledge and gives you 21 commands to steer the result.</p>
<p class="hero-hook-text hero-hook-text--short">Impeccable teaches your AI real design and gives you 21 commands to steer the result.</p>
<p class="hero-hook-text hero-hook-text--full">Great design prompts require design vocabulary. Most people don't have it. Impeccable teaches your AI deep design knowledge and gives you 18 commands to steer the result.</p>
<p class="hero-hook-text hero-hook-text--short">Impeccable teaches your AI real design and gives you 18 commands to steer the result.</p>
<div class="hero-included-box">
<span class="hero-included-title">What's included</span>
<div class="hero-included-items">
<span>Enhanced <em>impeccable</em> skill + anti-patterns</span>
<span class="hero-included-sep">·</span>
<span>21 design commands: /polish, /audit, /typeset, /overdrive...</span>
<span>18 design commands: /polish, /audit, /typeset, /overdrive...</span>
</div>
</div>
@@ -203,7 +203,7 @@
<h2 class="section-title">The Language</h2>
</div>
<div class="language-content">
<p class="section-lead" data-reveal>21 commands form a shared vocabulary between you and your AI. Each one encodes a specific design discipline, so you can steer with precision.</p>
<p class="section-lead" data-reveal>18 commands form a shared vocabulary between you and your AI. Each one encodes a specific design discipline, so you can steer with precision.</p>
<div class="solution-visual-interactive" id="framework-viz-container" data-reveal>
<!-- Periodic table generated by JS -->
@@ -331,7 +331,7 @@
<div class="install-row-primary" data-reveal>
<div class="install-primary-main">
<h3 class="install-path-title"><span class="install-path-step">1</span>Install the skills <span class="install-path-badge">Recommended</span></h3>
<p class="install-path-desc">21 commands that steer your AI toward better design, in real time. The full Impeccable experience.</p>
<p class="install-path-desc">18 commands that steer your AI toward better design, in real time. The full Impeccable experience.</p>
<div class="install-path-terminal">
<div class="glass-terminal">
@@ -489,7 +489,7 @@
<li><strong>Chrome DevTools extension.</strong> One-click detection on any page: yours, staging, production, or someone else's. Reads live computed styles, surfaces findings in an interactive panel, and highlights elements on the page. In Chrome Web Store review.</li>
<li><strong><code>/critique</code> got teeth.</strong> Persona sub-agents review in parallel, score against Nielsen's heuristics, run the detector automatically, and open a live browser overlay so you can walk each finding in place.</li>
<li><strong>New ways to create with Impeccable.</strong> <code>/shape</code> runs a structured discovery interview about purpose, audience, and goals, then produces a design brief before any code is written. <code>/impeccable craft</code> chains that brief straight into the full implementation flow so you ship a designed feature instead of a reflex card grid.</li>
<li><strong>New docs site.</strong> Top-level <a href="/skills">Docs</a>, <a href="/anti-patterns">Anti-Patterns</a>, and <a href="/visual-mode">Visual Mode</a> sections. 21 per-skill pages with before/after demos and the canonical SKILL.md inline, two <a href="/tutorials">tutorials</a>, and 38 rule cards with inline visual examples.</li>
<li><strong>New docs site.</strong> Top-level <a href="/skills">Docs</a>, <a href="/anti-patterns">Anti-Patterns</a>, and <a href="/visual-mode">Visual Mode</a> sections. 18 per-skill pages with before/after demos and the canonical SKILL.md inline, two <a href="/tutorials">tutorials</a>, and 38 rule cards with inline visual examples.</li>
<li><strong>New harness: Rovo Dev.</strong> 11 supported AI tools total.</li>
</ul>
</div>
+10 -11
View File
@@ -28,12 +28,11 @@ const commandSymbols = {
'shape': 'Sh',
'impeccable craft': 'Ic',
'impeccable': 'Im',
'onboard': 'On',
'overdrive': 'Od',
'critique': 'Cr',
'audit': 'Au',
'typeset': 'Ty',
'arrange': 'Ar',
'layout': 'La',
'colorize': 'Co',
'animate': 'An',
'delight': 'De',
@@ -42,29 +41,29 @@ const commandSymbols = {
'distill': 'Di',
'clarify': 'Cl',
'adapt': 'Ad',
'normalize': 'No',
'polish': 'Po',
'optimize': 'Op',
'harden': 'Ha',
'impeccable teach': 'It',
'extract': 'Ex'
'impeccable extract': 'Ie'
};
const commandNumbers = {
'shape': 0,
'impeccable craft': 1, 'impeccable': 2, 'onboard': 3, 'overdrive': 4,
'critique': 5, 'audit': 6,
'typeset': 7, 'arrange': 8, 'colorize': 9, 'animate': 10,
'delight': 11, 'bolder': 12, 'quieter': 13,
'distill': 14, 'clarify': 15, 'adapt': 16,
'normalize': 17, 'polish': 18, 'optimize': 19, 'harden': 20,
'impeccable teach': 21, 'extract': 22
'impeccable craft': 1, 'impeccable': 2, 'overdrive': 3,
'critique': 4, 'audit': 5,
'typeset': 6, 'layout': 7, 'colorize': 8, 'animate': 9,
'delight': 10, 'bolder': 11, 'quieter': 12,
'distill': 13, 'clarify': 14, 'adapt': 15,
'polish': 16, 'optimize': 17, 'harden': 18,
'impeccable teach': 19, 'impeccable extract': 20
};
// Map sub-commands to their display label and scroll target
const commandDisplay = {
'impeccable craft': { label: '/impeccable craft', scrollTo: 'impeccable' },
'impeccable teach': { label: '/impeccable teach', scrollTo: 'impeccable' },
'impeccable extract': { label: '/impeccable extract', scrollTo: 'impeccable' },
};
export class PeriodicTable {
+1 -1
View File
@@ -72,7 +72,7 @@ function renderDesktopLayout(container, commands) {
let startIndex = -1;
// Filter out deprecated shims and sub-commands (no standalone demos)
const deprecated = new Set(['teach-impeccable', 'frontend-design', 'impeccable craft', 'impeccable teach']);
const deprecated = new Set(['teach-impeccable', 'frontend-design', 'arrange', 'normalize', 'onboard', 'extract', 'impeccable craft', 'impeccable teach', 'impeccable extract']);
const filteredCommands = commands.filter(c => !deprecated.has(c.id));
const categoryOrder = ['create', 'evaluate', 'refine', 'simplify', 'harden', 'system'];
+17 -24
View File
@@ -9,7 +9,7 @@ export const readySkills = [
];
export const readyCommands = [
'normalize' // First command to be fully completed
'layout' // First command to be fully completed
];
// Commands marked as beta — shown with a badge in the UI
@@ -56,12 +56,11 @@ export const commandProcessSteps = {
'shape': ['Interview', 'Synthesize', 'Brief', 'Confirm'],
'impeccable craft': ['Shape', 'Reference', 'Build', 'Iterate'],
'impeccable': ['Direct', 'Design', 'Build', 'Refine'],
'onboard': ['Map', 'Design', 'Guide'],
'overdrive': ['Assess', 'Choose', 'Build', 'Polish'],
'critique': ['Evaluate', 'Critique', 'Prioritize', 'Suggest'],
'audit': ['Scan', 'Document', 'Prioritize', 'Recommend'],
'typeset': ['Assess', 'Select', 'Scale', 'Refine'],
'arrange': ['Assess', 'Grid', 'Rhythm', 'Balance'],
'layout': ['Assess', 'Grid', 'Rhythm', 'Balance'],
'colorize': ['Analyze', 'Strategy', 'Apply', 'Balance'],
'animate': ['Identify', 'Design', 'Implement', 'Polish'],
'delight': ['Identify', 'Design', 'Implement'],
@@ -70,12 +69,11 @@ export const commandProcessSteps = {
'distill': ['Audit', 'Remove', 'Clarify'],
'clarify': ['Read', 'Simplify', 'Improve', 'Test'],
'adapt': ['Analyze', 'Adjust', 'Optimize'],
'normalize': ['Analyze', 'Identify', 'Align', 'Verify'],
'polish': ['Review', 'Refine', 'Verify'],
'polish': ['Discover', 'Review', 'Refine', 'Verify'],
'optimize': ['Profile', 'Identify', 'Improve', 'Measure'],
'harden': ['Test', 'Handle', 'Wrap', 'Validate'],
'harden': ['Test', 'Handle', 'Onboard', 'Validate'],
'impeccable teach': ['Explore', 'Interview', 'Synthesize', 'Save'],
'extract': ['Identify', 'Abstract', 'Document']
'impeccable extract': ['Identify', 'Abstract', 'Migrate', 'Document']
};
export const commandCategories = {
@@ -88,26 +86,24 @@ export const commandCategories = {
'audit': 'evaluate',
// REFINE - improve existing design
'typeset': 'refine',
'arrange': 'refine',
'layout': 'refine',
'colorize': 'refine',
'animate': 'refine',
'delight': 'refine',
'bolder': 'refine',
'quieter': 'refine',
'onboard': 'refine',
'overdrive': 'refine',
// SIMPLIFY - reduce and clarify
'distill': 'simplify',
'clarify': 'simplify',
'adapt': 'simplify',
// HARDEN - production-ready
'normalize': 'harden',
'polish': 'harden',
'optimize': 'harden',
'harden': 'harden',
// SYSTEM - setup and tooling
'impeccable teach': 'system',
'extract': 'system'
'impeccable extract': 'system'
};
// Skill relationships - now consolidated into impeccable skill
@@ -123,25 +119,22 @@ export const commandRelationships = {
'shape': { flow: 'Create: Plan UX and UI through structured discovery' },
'impeccable craft': { flow: 'Create: Full shape-then-build flow with visual iteration' },
'impeccable': { flow: 'Create: Freeform design with full design intelligence' },
'onboard': { combinesWith: ['clarify', 'delight'], flow: 'Create: Onboarding flows and empty states' },
'overdrive': { combinesWith: ['animate', 'delight'], flow: 'Refine: Technically extraordinary effects' },
'critique': { leadsTo: ['polish', 'distill', 'bolder', 'quieter', 'typeset', 'arrange'], flow: 'Evaluate: UX and design review with scoring' },
'audit': { leadsTo: ['normalize', 'harden', 'optimize', 'adapt', 'clarify'], flow: 'Evaluate: Technical quality audit' },
'typeset': { combinesWith: ['bolder', 'normalize'], flow: 'Refine: Fix typography and type hierarchy' },
'arrange': { combinesWith: ['distill', 'adapt'], flow: 'Refine: Fix layout and spacing' },
'critique': { leadsTo: ['polish', 'distill', 'bolder', 'quieter', 'typeset', 'layout'], flow: 'Evaluate: UX and design review with scoring' },
'audit': { leadsTo: ['harden', 'optimize', 'adapt', 'clarify'], flow: 'Evaluate: Technical quality audit' },
'typeset': { combinesWith: ['bolder', 'polish'], flow: 'Refine: Fix typography and type hierarchy' },
'layout': { combinesWith: ['distill', 'adapt'], flow: 'Refine: Fix layout and spacing' },
'colorize': { combinesWith: ['bolder', 'delight'], flow: 'Refine: Add strategic color' },
'animate': { combinesWith: ['delight'], flow: 'Refine: Add purposeful motion' },
'delight': { combinesWith: ['bolder', 'animate'], flow: 'Refine: Add personality and joy' },
'bolder': { pairs: 'quieter', flow: 'Refine: Amplify timid designs' },
'quieter': { pairs: 'bolder', flow: 'Refine: Tone down aggressive designs' },
'distill': { combinesWith: ['quieter', 'normalize'], flow: 'Simplify: Strip to essence' },
'clarify': { combinesWith: ['normalize', 'adapt'], flow: 'Simplify: Improve UX copy' },
'adapt': { combinesWith: ['normalize', 'clarify'], flow: 'Simplify: Adapt for different contexts' },
'normalize': { combinesWith: ['clarify', 'adapt'], flow: 'Harden: Align with design system' },
'polish': { flow: 'Harden: Final pass before shipping' },
'distill': { combinesWith: ['quieter', 'polish'], flow: 'Simplify: Strip to essence' },
'clarify': { combinesWith: ['polish', 'adapt'], flow: 'Simplify: Improve UX copy' },
'adapt': { combinesWith: ['polish', 'clarify'], flow: 'Simplify: Adapt for different contexts' },
'polish': { flow: 'Harden: Final pass and design system alignment' },
'optimize': { flow: 'Harden: Performance improvements' },
'harden': { combinesWith: ['optimize'], flow: 'Harden: Error handling and edge cases' },
'harden': { combinesWith: ['optimize'], flow: 'Harden: Edge cases, onboarding, and error handling' },
'impeccable teach': { flow: 'System: One-time project design context setup' },
'extract': { flow: 'System: Create design system components and tokens' }
'impeccable extract': { flow: 'System: Extract design system components and tokens' }
};
+2 -11
View File
@@ -2,7 +2,6 @@
import animate from "./animate.js";
import bolder from "./bolder.js";
import normalize from "./normalize.js";
import audit from "./audit.js";
import critique from "./critique.js";
import polish from "./polish.js";
@@ -13,15 +12,12 @@ import quieter from "./quieter.js";
import distill from "./distill.js";
import colorize from "./colorize.js";
import delight from "./delight.js";
import extract from "./extract.js";
import adapt from "./adapt.js";
import onboard from "./onboard.js";
import typeset from "./typeset.js";
import arrange from "./arrange.js";
import layout from "./layout.js";
import overdrive from "./overdrive.js";
export const commandDemos = {
normalize,
bolder,
animate,
audit,
@@ -34,17 +30,12 @@ export const commandDemos = {
distill,
colorize,
delight,
extract,
adapt,
onboard,
typeset,
arrange,
layout,
overdrive,
};
export function getCommandDemo(commandId) {
return commandDemos[commandId] || null;
}
+47
View File
@@ -0,0 +1,47 @@
// Layout command demo - shows monotonous equal spacing becoming rhythmic and intentional
export default {
id: 'layout',
caption: 'Equal spacing everywhere → Intentional rhythm and hierarchy',
before: `
<div style="width: 100%; max-width: 240px; padding: 16px;">
<div style="text-align: center; margin-bottom: 16px;">
<div style="font-size: 14px; font-weight: bold; color: #333;">Team Members</div>
</div>
<div style="display: flex; flex-direction: column; gap: 16px;">
<div style="padding: 16px; background: #f5f5f5; border: 1px solid #e0e0e0; border-radius: 8px; text-align: center;">
<div style="width: 32px; height: 32px; background: #ddd; border-radius: 50%; margin: 0 auto 8px;"></div>
<div style="font-size: 13px; color: #333;">Alice Chen</div>
<div style="font-size: 12px; color: #888;">Designer</div>
</div>
<div style="padding: 16px; background: #f5f5f5; border: 1px solid #e0e0e0; border-radius: 8px; text-align: center;">
<div style="width: 32px; height: 32px; background: #ddd; border-radius: 50%; margin: 0 auto 8px;"></div>
<div style="font-size: 13px; color: #333;">Bob Park</div>
<div style="font-size: 12px; color: #888;">Engineer</div>
</div>
</div>
</div>
`,
after: `
<div style="width: 100%; max-width: 240px; padding: 16px; font-family: 'Instrument Sans', sans-serif;">
<div style="font-size: 0.8125rem; font-weight: 600; color: var(--color-ink); margin-bottom: 16px;">Team Members</div>
<div style="display: flex; flex-direction: column; gap: 6px;">
<div style="display: flex; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--color-mist);">
<div style="width: 28px; height: 28px; background: var(--color-accent); border-radius: 50%; flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: white; font-size: 11px; font-weight: 600;">AC</div>
<div style="flex: 1;">
<div style="font-size: 0.8125rem; font-weight: 500; color: var(--color-ink);">Alice Chen</div>
<div style="font-size: 0.6875rem; color: var(--color-ash);">Designer</div>
</div>
</div>
<div style="display: flex; align-items: center; gap: 12px; padding: 10px 0;">
<div style="width: 28px; height: 28px; background: color-mix(in oklch, var(--color-accent) 60%, var(--color-ink)); border-radius: 50%; flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: white; font-size: 11px; font-weight: 600;">BP</div>
<div style="flex: 1;">
<div style="font-size: 0.8125rem; font-weight: 500; color: var(--color-ink);">Bob Park</div>
<div style="font-size: 0.6875rem; color: var(--color-ash);">Engineer</div>
</div>
</div>
</div>
</div>
`
};
+3 -2
View File
@@ -202,6 +202,7 @@ ${tutorials
impeccable: [
{ id: 'impeccable-craft', label: '/impeccable craft', href: '/skills/impeccable#craft' },
{ id: 'impeccable-teach', label: '/impeccable teach', href: '/skills/impeccable#teach' },
{ id: 'impeccable-extract', label: '/impeccable extract', href: '/skills/impeccable#extract' },
],
};
@@ -280,7 +281,7 @@ ${skillChips}
<header class="skills-overview-header">
<p class="sub-page-eyebrow">${totalSkills} commands</p>
<h1 class="sub-page-title">Skills</h1>
<p class="sub-page-lede">One skill, <a href="/skills/impeccable">/impeccable</a>, teaches your AI design. Twenty commands steer the result. Each command does one job with an opinion about what good looks like.</p>
<p class="sub-page-lede">One skill, <a href="/skills/impeccable">/impeccable</a>, teaches your AI design. Eighteen commands steer the result. Each command does one job with an opinion about what good looks like.</p>
</header>
<section class="skills-overview-howto">
@@ -632,7 +633,7 @@ export async function generateSubPages(rootDir) {
const html = renderPage({
title: 'Skills | Impeccable',
description:
'21 commands that teach your AI harness how to design. Browse by category: create, evaluate, refine, simplify, harden, system.',
'18 commands that teach your AI harness how to design. Browse by category: create, evaluate, refine, simplify, harden.',
bodyHtml: wrapInDocsLayout(sidebar, main),
activeNav: 'docs',
canonicalPath: '/skills',
+6 -6
View File
@@ -34,6 +34,10 @@ export {
const EXCLUDED_SKILLS = new Set([
'frontend-design', // deprecated, renamed to impeccable
'teach-impeccable', // deprecated, folded into /impeccable teach
'arrange', // renamed to layout
'normalize', // merged into /polish
'onboard', // merged into /harden
'extract', // merged into /impeccable extract
]);
/**
@@ -50,28 +54,24 @@ const SKILL_CATEGORIES = {
audit: 'evaluate',
// REFINE - improve existing design
typeset: 'refine',
arrange: 'refine',
layout: 'refine',
colorize: 'refine',
animate: 'refine',
delight: 'refine',
bolder: 'refine',
quieter: 'refine',
onboard: 'refine',
overdrive: 'refine',
// SIMPLIFY - reduce and clarify
distill: 'simplify',
clarify: 'simplify',
adapt: 'simplify',
// HARDEN - production-ready
normalize: 'harden',
polish: 'harden',
optimize: 'harden',
harden: 'harden',
// SYSTEM - setup and tooling
extract: 'system',
};
export const CATEGORY_ORDER = ['create', 'evaluate', 'refine', 'simplify', 'harden', 'system'];
export const CATEGORY_ORDER = ['create', 'evaluate', 'refine', 'simplify', 'harden'];
export const CATEGORY_LABELS = {
create: 'Create',
+35 -1
View File
@@ -1,6 +1,6 @@
---
name: harden
description: "Improve interface resilience through better error handling, i18n support, text overflow handling, and edge case management. Makes interfaces robust and production-ready. Use when the user asks to harden, make production-ready, handle edge cases, add error states, or fix overflow and i18n issues."
description: "Make interfaces production-ready: error handling, empty states, onboarding flows, i18n, text overflow, and edge case management. Use when the user asks to harden, make production-ready, handle edge cases, add error states, design empty states, improve onboarding, or fix overflow and i18n issues."
argument-hint: "[target]"
user-invocable: true
---
@@ -224,6 +224,40 @@ t('items', { count }) // Handles complex plural rules
- Feature detection (not browser detection)
- Test in target browsers
### Onboarding & First-Run Experience
Production-ready features work for first-time users, not just power users. Design the paths that get new users to value:
**Empty states**: Every zero-data screen needs:
- What will appear here (description or illustration)
- Why it matters to the user
- Clear CTA to create the first item or start from a template
- Visual interest (not just blank space with "No items yet")
Empty state types to handle:
- **First use**: emphasize value, provide templates
- **User cleared**: light touch, easy to recreate
- **No results**: suggest a different query, offer to clear filters
- **No permissions**: explain why, how to get access
**First-run experience**: Get users to their "aha moment" as quickly as possible.
- Show, don't tell -- working examples over descriptions
- Progressive disclosure -- teach one thing at a time, not everything upfront
- Make onboarding optional -- let experienced users skip
- Provide smart defaults so required setup is minimal
**Feature discovery**: Teach features when users need them, not upfront.
- Contextual tooltips at point of use (brief, dismissable, one-time)
- Badges or indicators on new or unused features
- Celebrate activation events quietly (a toast, not a modal)
**NEVER**:
- Force long onboarding before users can touch the product
- Show the same tooltip repeatedly (track and respect dismissals)
- Block the entire UI during a guided tour
- Create separate tutorial modes disconnected from the real product
- Design empty states that just say "No items" with no next action
### Input Validation & Sanitization
**Client-side validation**:
+8 -2
View File
@@ -1,7 +1,7 @@
---
name: impeccable
description: "Create distinctive, production-grade frontend interfaces with high design quality. Generates creative, polished code that avoids generic AI aesthetics. Use when the user asks to build web components, pages, artifacts, posters, or applications, or when any design skill requires project context. Call with 'craft' to run the full shape-then-build flow, or 'teach' for design context setup."
argument-hint: "[craft|teach]"
description: "Create distinctive, production-grade frontend interfaces with high design quality. Generates creative, polished code that avoids generic AI aesthetics. Use when the user asks to build web components, pages, artifacts, posters, or applications, or when any design skill requires project context. Call with 'craft' for shape-then-build, 'teach' for design context setup, or 'extract' to pull reusable components and tokens into the design system."
argument-hint: "[craft|teach|extract]"
user-invocable: true
license: Apache 2.0. Based on Anthropic's frontend-design skill. See NOTICE.md for attribution.
---
@@ -340,3 +340,9 @@ Write this section to `.impeccable.md` in the project root. If the file already
Then {{ask_instruction}} whether they'd also like the Design Context appended to {{config_file}}. If yes, append or update the section there as well.
Confirm completion and summarize the key design principles that will now guide all future work.
---
## Extract Mode
If this skill is invoked with the argument "extract" (e.g., `{{command_prefix}}impeccable extract [target]`), follow the [extract flow](reference/extract.md). Pass any additional arguments as the extraction target.
@@ -0,0 +1,70 @@
# Extract Flow
Identify reusable patterns, components, and design tokens, then extract and consolidate them into the design system for systematic reuse.
## Step 1: Discover the Design System
Find the design system, component library, or shared UI directory. Understand its structure: component organization, naming conventions, design token structure, import/export conventions.
**CRITICAL**: If no design system exists, {{ask_instruction}} before creating one. Understand the preferred location and structure first.
## Step 2: Identify Patterns
Look for extraction opportunities in the target area:
- **Repeated components**: Similar UI patterns used 3+ times (buttons, cards, inputs)
- **Hard-coded values**: Colors, spacing, typography, shadows that should be tokens
- **Inconsistent variations**: Multiple implementations of the same concept
- **Composition patterns**: Layout or interaction patterns that repeat (form rows, toolbar groups, empty states)
- **Type styles**: Repeated font-size + weight + line-height combinations
- **Animation patterns**: Repeated easing, duration, or keyframe combinations
Assess value: only extract things used 3+ times with the same intent. Premature abstraction is worse than duplication.
## Step 3: Plan Extraction
Create a systematic plan:
- **Components to extract**: Which UI elements become reusable components?
- **Tokens to create**: Which hard-coded values become design tokens?
- **Variants to support**: What variations does each component need?
- **Naming conventions**: Component names, token names, prop names that match existing patterns
- **Migration path**: How to refactor existing uses to consume the new shared versions
**IMPORTANT**: Design systems grow incrementally. Extract what is clearly reusable now, not everything that might someday be reusable.
## Step 4: Extract & Enrich
Build improved, reusable versions:
- **Components**: Clear props API with sensible defaults, proper variants for different use cases, accessibility built in (ARIA, keyboard navigation, focus management), documentation and usage examples
- **Design tokens**: Clear naming (primitive vs semantic), proper hierarchy and organization, documentation of when to use each token
- **Patterns**: When to use this pattern, code examples, variations and combinations
## Step 5: Migrate
Replace existing uses with the new shared versions:
- **Find all instances**: Search for the patterns you extracted
- **Replace systematically**: Update each use to consume the shared version
- **Test thoroughly**: Ensure visual and functional parity
- **Delete dead code**: Remove the old implementations
## Step 6: Document
Update design system documentation:
- Add new components to the component library
- Document token usage and values
- Add examples and guidelines
- Update any Storybook or component catalog
**NEVER**:
- Extract one-off, context-specific implementations without generalization
- Create components so generic they are useless
- Extract without considering existing design system conventions
- Skip proper TypeScript types or prop documentation
- Create tokens for every single value (tokens should have semantic meaning)
- Extract things that differ in intent (two buttons that look similar but serve different purposes should stay separate)
Remember: A good design system is a living system. Extract patterns as they emerge, enrich them thoughtfully, and maintain them consistently.
+124
View File
@@ -0,0 +1,124 @@
---
name: layout
description: "Improve layout, spacing, and visual rhythm. Fixes monotonous grids, inconsistent spacing, and weak visual hierarchy. Use when the user mentions layout feeling off, spacing issues, visual hierarchy, crowded UI, alignment problems, or wanting better composition."
argument-hint: "[target]"
user-invocable: true
---
Assess and improve layout and spacing that feels monotonous, crowded, or structurally weak — turning generic arrangements into intentional, rhythmic compositions.
## MANDATORY PREPARATION
Invoke {{command_prefix}}impeccable — it contains design principles, anti-patterns, and the **Context Gathering Protocol**. Follow the protocol before proceeding — if no design context exists yet, you MUST run {{command_prefix}}impeccable teach first.
---
## Assess Current Layout
Analyze what's weak about the current spatial design:
1. **Spacing**:
- Is spacing consistent or arbitrary? (Random padding/margin values)
- Is all spacing the same? (Equal padding everywhere = no rhythm)
- Are related elements grouped tightly, with generous space between groups?
2. **Visual hierarchy**:
- Apply the squint test: blur your (metaphorical) eyes — can you still identify the most important element, second most important, and clear groupings?
- Is hierarchy achieved effectively? (Space and weight alone can be enough — but is the current approach working?)
- Does whitespace guide the eye to what matters?
3. **Grid & structure**:
- Is there a clear underlying structure, or does the layout feel random?
- Are identical card grids used everywhere? (Icon + heading + text, repeated endlessly)
- Is everything centered? (Left-aligned with asymmetric layouts feels more designed, but not a hard and fast rule)
4. **Rhythm & variety**:
- Does the layout have visual rhythm? (Alternating tight/generous spacing)
- Is every section structured the same way? (Monotonous repetition)
- Are there intentional moments of surprise or emphasis?
5. **Density**:
- Is the layout too cramped? (Not enough breathing room)
- Is the layout too sparse? (Excessive whitespace without purpose)
- Does density match the content type? (Data-dense UIs need tighter spacing; marketing pages need more air)
**CRITICAL**: Layout problems are often the root cause of interfaces feeling "off" even when colors and fonts are fine. Space is a design material — use it with intention.
## Plan Layout Improvements
Consult the [spatial design reference](reference/spatial-design.md) from the impeccable skill for detailed guidance on grids, rhythm, and container queries.
Create a systematic plan:
- **Spacing system**: Use a consistent scale — whether that's a framework's built-in scale (e.g., Tailwind), rem-based tokens, or a custom system. The specific values matter less than consistency.
- **Hierarchy strategy**: How will space communicate importance?
- **Layout approach**: What structure fits the content? Flex for 1D, Grid for 2D, named areas for complex page layouts.
- **Rhythm**: Where should spacing be tight vs generous?
## Improve Layout Systematically
### Establish a Spacing System
- Use a consistent spacing scale — framework scales (Tailwind, etc.), rem-based tokens, or a custom scale all work. What matters is that values come from a defined set, not arbitrary numbers.
- Name tokens semantically if using custom properties: `--space-xs` through `--space-xl`, not `--spacing-8`
- Use `gap` for sibling spacing instead of margins — eliminates margin collapse hacks
- Apply `clamp()` for fluid spacing that breathes on larger screens
### Create Visual Rhythm
- **Tight grouping** for related elements (8-12px between siblings)
- **Generous separation** between distinct sections (48-96px)
- **Varied spacing** within sections — not every row needs the same gap
- **Asymmetric compositions** — break the predictable centered-content pattern when it makes sense
### Choose the Right Layout Tool
- **Use Flexbox for 1D layouts**: Rows of items, nav bars, button groups, card contents, most component internals. Flex is simpler and more appropriate for the majority of layout tasks.
- **Use Grid for 2D layouts**: Page-level structure, dashboards, data-dense interfaces, anything where rows AND columns need coordinated control.
- **Don't default to Grid** when Flexbox with `flex-wrap` would be simpler and more flexible.
- Use `repeat(auto-fit, minmax(280px, 1fr))` for responsive grids without breakpoints.
- Use named grid areas (`grid-template-areas`) for complex page layouts — redefine at breakpoints.
### Break Card Grid Monotony
- Don't default to card grids for everything — spacing and alignment create visual grouping naturally
- Use cards only when content is truly distinct and actionable — never nest cards inside cards
- Vary card sizes, span columns, or mix cards with non-card content to break repetition
### Strengthen Visual Hierarchy
- Use the fewest dimensions needed for clear hierarchy. Space alone can be enough — generous whitespace around an element draws the eye. Some of the most sophisticated designs achieve rhythm with just space and weight. Add color or size contrast only when simpler means aren't sufficient.
- Be aware of reading flow — in LTR languages, the eye naturally scans top-left to bottom-right, but primary action placement depends on context (e.g., bottom-right in dialogs, top in navigation).
- Create clear content groupings through proximity and separation.
### Manage Depth & Elevation
- Create a semantic z-index scale (dropdown → sticky → modal-backdrop → modal → toast → tooltip)
- Build a consistent shadow scale (sm → md → lg → xl) — shadows should be subtle
- Use elevation to reinforce hierarchy, not as decoration
### Optical Adjustments
- If an icon looks visually off-center despite being geometrically centered, nudge it — but only if you're confident it actually looks wrong. Don't adjust speculatively.
**NEVER**:
- Use arbitrary spacing values outside your scale
- Make all spacing equal — variety creates hierarchy
- Wrap everything in cards — not everything needs a container
- Nest cards inside cards — use spacing and dividers for hierarchy within
- Use identical card grids everywhere (icon + heading + text, repeated)
- Center everything — left-aligned with asymmetry feels more designed
- Default to the hero metric layout (big number, small label, stats, gradient) as a template. If showing real user data, a prominent metric can work — but it should display actual data, not decorative numbers.
- Default to CSS Grid when Flexbox would be simpler — use the simplest tool for the job
- Use arbitrary z-index values (999, 9999) — build a semantic scale
## Verify Layout Improvements
- **Squint test**: Can you identify primary, secondary, and groupings with blurred vision?
- **Rhythm**: Does the page have a satisfying beat of tight and generous spacing?
- **Hierarchy**: Is the most important content obvious within 2 seconds?
- **Breathing room**: Does the layout feel comfortable, not cramped or wasteful?
- **Consistency**: Is the spacing system applied uniformly?
- **Responsiveness**: Does the layout adapt gracefully across screen sizes?
Remember: Space is the most underused design tool. A layout with the right rhythm and hierarchy can make even simple content feel polished and intentional.
+21
View File
@@ -13,6 +13,16 @@ Invoke {{command_prefix}}impeccable — it contains design principles, anti-patt
Perform a meticulous final pass to catch all the small details that separate good work from great work. The difference between shipped and polished.
## Design System Discovery
Before polishing, understand the system you are polishing toward:
1. **Find the design system**: Search for design system documentation, component libraries, style guides, or token definitions. Study the core patterns: color tokens, spacing scale, typography styles, component API.
2. **Note the conventions**: How are shared components imported? What spacing scale is used? Which colors come from tokens vs hard-coded values? What motion and interaction patterns are established?
3. **Identify drift**: Where does the target feature deviate from the system? Hard-coded values that should be tokens, custom components that duplicate shared ones, spacing that doesn't match the scale.
If a design system exists, polish should align the feature with it. If none exists, polish against the conventions visible in the codebase.
## Pre-Polish Assessment
Understand the current state and goals:
@@ -188,6 +198,8 @@ Go through systematically:
- Introduce bugs while polishing (test thoroughly)
- Ignore systematic issues (if spacing is off everywhere, fix the system)
- Perfect one thing while leaving others rough (consistent quality level)
- Create new one-off components when design system equivalents exist
- Hard-code values that should use design tokens
## Final Verification
@@ -199,5 +211,14 @@ Before marking as done:
- **Compare to design**: Match intended design
- **Check all states**: Don't just test happy path
## Clean Up
After polishing, ensure code quality:
- **Replace custom implementations**: If the design system provides a component you reimplemented, switch to the shared version.
- **Remove orphaned code**: Delete unused styles, components, or files made obsolete by polish.
- **Consolidate tokens**: If you introduced new values, check whether they should be tokens.
- **Verify DRYness**: Look for duplication introduced during polishing and consolidate.
Remember: You have impeccable attention to detail and exquisite taste. Polish until it feels effortless, looks intentional, and works flawlessly. Sweat the details - they matter.