From design-crit
Use when evaluating color palettes, theming, dark mode, contrast, and color tokens for a design system.
How this skill is triggered — by the user, by Claude, or both
Slash command
/design-crit:crit-color-systemThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Reference:** Read `../../reference/crit-loop.md` for compare view, feedback round-trip, convergence, and locking mechanics.
Reference: Read ../../reference/crit-loop.md for compare view, feedback round-trip, convergence, and locking mechanics.
You are a designer critiquing the color system for this project. Color is a sensory facet -- it applies to surfaces and content structures that are already locked. Your job: generate palette options, evaluate them against brand intent and accessibility requirements, and guide the user to a locked color direction.
Before generating any options, read these files in order:
.design-crit/state.json -- current facet state, round number, all prior locked decisions.design-crit/brief.md -- project brief (brand tone, platform, audience)../../reference/crit-loop.md -- shared crit loop mechanics../../reference/design-principles.md -- option generation principles, convergence toneRead every locked facet's winning option file. Color builds on top of all prior structure. Pay special attention to:
State in your critique: "Building on the locked [facet]: [summary]" for each.
Check for feedback-round-{N}.json in .design-crit/facets/color-system/. If found and
unprocessed, read it and continue the crit loop from that round. Do not regenerate round 1.
Every palette option must define these five color groups. Present them as organized swatches in the option HTML.
The primary and secondary colors that carry the product's identity. Derived from the brief's brand tone and differentiator. Typically 1-2 primary hues and 1-2 accent hues.
Background layers that establish depth and hierarchy. Define at minimum:
surface-base -- the page backgroundsurface-raised -- cards, panels, dialogs (one step above base)surface-sunken -- inset areas, grouped content backgroundssurface-overlay -- modals, popovers, dropdown menusForeground colors for content. Define at minimum:
text-primary -- body text, headingstext-secondary -- supporting text, labels, metadatatext-tertiary -- placeholder text, disabled statestext-inverse -- text on dark/colored backgroundstext-link -- hyperlinks, interactive textSemantic colors for system feedback. Each needs a background, foreground, and border variant:
success -- confirmations, completed states (green family)warning -- cautions, pending states (amber/orange family)error -- failures, destructive actions (red family)info -- neutral notifications, tips (blue family)Colors for interactive element states:
hover -- subtle background shift or overlayactive / pressed -- darker or more saturated shiftfocus -- visible focus ring color (often brand primary or high-contrast blue)disabled -- muted, reduced contrast (but still legible)selected -- active selection indicatorApply WCAG AA as the minimum standard. Check every text/background combination.
| Element | Minimum Ratio | Standard |
|---|---|---|
| Body text (< 18px) on any surface | 4.5:1 | WCAG AA |
| Large text (>= 18px or 14px bold) on any surface | 3:1 | WCAG AA |
| UI components and graphical objects | 3:1 | WCAG AA |
| Focus indicators | 3:1 against adjacent colors | WCAG AA |
For each option file, include a contrast audit section at the bottom. Render a table showing:
text-primary on surface-base)Calculate contrast ratios using the WCAG relative luminance formula. Embed the calculation in inline JavaScript so the audit is live and self-contained.
Note in the critique when status colors rely solely on hue. Suggest pattern or icon reinforcement for red/green distinctions. Options that depend on red vs green differentiation alone are a trade-off worth flagging, not an automatic failure.
If the brief specifies dark mode, or the platform convention expects it, generate both light and dark variants for EVERY option. Dark mode is not inverted light mode. It is a separate design decision.
Include a toggle in each option file that switches between light and dark. Use CSS custom
properties with a [data-theme="dark"] attribute on <html>. Define all colors as custom
properties so the toggle swaps the full palette.
The compare view's dark mode toggle (from crit-loop.md) sends a postMessage to each iframe. Each option file must listen for this message and toggle accordingly.
Use semantic names, not literal color names. Tokens describe purpose, not appearance.
{category}-{element}-{variant}
Examples:
surface-base, surface-raised, surface-overlaytext-primary, text-secondary, text-inversestatus-error-bg, status-error-text, status-error-borderinteractive-hover, interactive-focus, interactive-disabledbrand-primary, brand-secondaryblue-500 tells you nothing about where it goes. brand-primary does.In the option HTML, define all colors as CSS custom properties using semantic names. Do not
use hex values directly in component styles. This structure feeds directly into
design-tokens.json at the direction stage.
Each option should explore a different emotional direction tied to the brief.
Position each option on these spectrums and state where it sits in the rationale:
Read the differentiator and target users from the brief. A developer tool for daily use calls for a muted, cool palette with low visual fatigue. A consumer fitness app calls for saturated, warm energy. A financial dashboard needs authoritative neutrals with precise status colors. Tie every option to the brief, not abstract color theory.
Generate 2-4 palette options. Each must make a different bet about emotional tone, palette strategy, or brand expression. Maximize variety across the tone axes.
Example option set for a developer productivity tool:
Each option HTML must include:
Refine survivors based on feedback. Common refinements:
When merging two options, create a new option file (e.g., option-ab.html) and state
what was taken from each in the rationale.
Score every option against these questions in your critique. Be specific -- cite which color pairs pass or fail, which tone axes the option targets.
When generating compare.html for this facet, follow all rules from crit-loop.md with
these additions:
When the user locks a color system option:
state.json with status: "locked", locked_option, locked_summary,
decided_by, decision_rationale, rounds_completed.locked_summary must capture: primary brand color hex, surface strategy (warm/cool),
dark mode status (yes/no), and contrast compliance (AA pass/fail count).design-tokens.json at the direction stage.
Ensure all CSS custom properties are parseable.Use these to inform option generation and critique. Do not recite them to the user -- apply them to the specific project.
| Pattern | When It Works | Watch Out For |
|---|---|---|
| Monochromatic with one accent | Clean, cohesive, easy to maintain | Can feel monotonous; status colors may clash |
| Split-complementary | Strong visual interest, good contrast | Harder to balance; can feel busy |
| Neutral base + saturated accents | Professional, scalable, safe | Risk of feeling generic or corporate |
| Dark-mode-first design | Developer tools, media apps | Light mode may feel like an afterthought |
| High saturation throughout | Energetic, youthful, distinctive | Visual fatigue on daily-use tools; contrast issues |
npx claudepluginhub metedata/design-crit --plugin design-critBuilds a structured palette with semantic roles, accessible contrast ratios, and usage rules for light/dark modes. Includes tonal scales, verification, and token export.
Builds accessible color systems with palettes, semantic mappings, tonal scales, and contrast checks for UI components in digital products.
Discovers existing design patterns, defines curated palettes and typography, generates W3C DTCG tokens, and validates every color pair for WCAG compliance.