Conduct design interviews, generate five distinct UI variations in a temporary design lab, collect feedback, and produce implementation plans. Use when the user wants to explore UI design options, redesign existing components, or create new UI with multiple approaches to compare.
This skill implements a complete design exploration workflow: interview, generate variations, collect feedback, refine, preview, and finalize.
All temporary files MUST be deleted when the process ends, whether by:
Never leave .claude-design/ or __design_lab routes behind. If the user says "cancel", "abort", "stop", or "nevermind" at any point, confirm and then delete all temporary artifacts.
Before starting the interview, automatically detect:
Check for lock files in the project root:
pnpm-lock.yaml → use pnpmyarn.lock → use yarnpackage-lock.json → use npmbun.lockb → use bunCheck for config files:
next.config.js or next.config.mjs or next.config.ts → Next.js
app/ directory → App Routerpages/ directory → Pages Routervite.config.js or vite.config.ts → Viteremix.config.js → Remixnuxt.config.js or nuxt.config.ts → Nuxtastro.config.mjs → AstroCheck package.json dependencies and config files:
tailwind.config.js or tailwind.config.ts → Tailwind CSS@mui/material in dependencies → Material UI@chakra-ui/react in dependencies → Chakra UIantd in dependencies → Ant Designstyled-components in dependencies → styled-components@emotion/react in dependencies → Emotion.css or .module.css files → CSS ModulesLook for existing Design Memory file:
docs/design-memory.mdDESIGN_MEMORY.md.claude-design/design-memory.mdIf found, read it and use to prefill defaults and skip redundant questions.
DO NOT use generic/predefined styles. Extract visual language from the project:
If Tailwind detected, read tailwind.config.js or tailwind.config.ts:
// Extract and use:
theme.colors // Color palette
theme.spacing // Spacing scale
theme.borderRadius // Radius values
theme.fontFamily // Typography
theme.boxShadow // Elevation system
If CSS Variables exist, read globals.css, variables.css, or :root definitions:
:root {
--color-* /* Color tokens */
--spacing-* /* Spacing tokens */
--font-* /* Typography tokens */
--radius-* /* Border radius tokens */
}
If UI library detected (MUI, Chakra, Ant), read the theme configuration:
theme.ts or createTheme() calltheme/index.ts or extendTheme() callConfigProvider theme propAlways scan existing components to understand patterns:
Store inferred styles in the Design Brief for consistent use across all variants.
Use the AskUserQuestion tool for all interview steps. Adapt questions based on Design Memory if it exists.
Ask these questions (can combine into single AskUserQuestion with multiple questions):
Question 1: Scope
Question 2: New or Redesign
If "Redesign" selected, ask: Question 3: Existing Path
If target is unclear, propose a name based on repo patterns and confirm.
Question 1: Pain Points
Question 2: Visual Inspiration
Question 3: Functional Inspiration
Question 1: Brand Adjectives
Question 2: Density
Question 3: Dark Mode
Question 1: Primary User
Question 2: Context
Question 3: Key Tasks
Question 1: Must-Keep Elements
Question 2: Technical Constraints
After the interview, create a structured Design Brief as JSON and save to .claude-design/design-brief.json:
{
"scope": "component|page",
"isRedesign": true|false,
"targetPath": "src/components/Example.tsx",
"targetName": "Example",
"painPoints": ["Too dense", "Primary action unclear"],
"inspiration": {
"visual": ["Stripe", "Linear"],
"functional": ["Inline validation"]
},
"brand": {
"adjectives": ["minimal", "trustworthy"],
"density": "comfortable",
"darkMode": true
},
"persona": {
"primary": "Developer",
"context": "desktop-first",
"keyTasks": ["Complete checkout", "Review order", "Apply discount"]
},
"constraints": {
"mustKeep": ["existing fields"],
"technical": ["no new dependencies", "WCAG accessible"]
},
"framework": "nextjs-app",
"packageManager": "pnpm",
"stylingSystem": "tailwind"
}
Display a summary to the user before proceeding.
Create all files under .claude-design/:
.claude-design/
├── lab/
│ ├── page.tsx # Main lab page (framework-specific)
│ ├── variants/
│ │ ├── VariantA.tsx
│ │ ├── VariantB.tsx
│ │ ├── VariantC.tsx
│ │ ├── VariantD.tsx
│ │ └── VariantE.tsx
│ ├── components/
│ │ └── LabShell.tsx # Lab layout wrapper
│ ├── feedback/ # Interactive feedback system
│ │ ├── types.ts # TypeScript interfaces
│ │ ├── selector-utils.ts # Element identification
│ │ ├── format-utils.ts # Feedback formatting
│ │ ├── FeedbackOverlay.tsx # Main overlay component
│ │ └── index.ts # Module exports
│ └── data/
│ └── fixtures.ts # Shared mock data
├── design-brief.json
└── run-log.md
The FeedbackOverlay is the PRIMARY feature of the Design Lab. Without it, users cannot provide interactive feedback. NEVER generate a Design Lab without the FeedbackOverlay.
Reliability Strategy: To avoid import path issues across different project configurations, create the FeedbackOverlay directly in the route directory (e.g., app/design-lab/FeedbackOverlay.tsx), NOT in .claude-design/. This ensures a simple relative import (./FeedbackOverlay) always works.
Required Files in Route Directory:
app/design-lab/ # or app/__design_lab/ if underscores work
├── page.tsx # Main lab page with variants
└── FeedbackOverlay.tsx # Self-contained overlay component (copy from templates)
Template Source: design-and-refine/templates/feedback/FeedbackOverlay.tsx
Why this approach:
.claude-design/ paths can fail due to bundler configurationsNext.js App Router:
Create app/__design_lab/page.tsx that imports from .claude-design/lab/
Next.js Pages Router:
Create pages/__design_lab.tsx that imports from .claude-design/lab/
Vite React:
/__design_labApp.tsx based on ?design_lab=true query paramOther frameworks: Create the most appropriate temporary route for the detected framework.
IMPORTANT: Read DESIGN_PRINCIPLES.md for UX, interaction, and motion best practices. But DO NOT use predefined visual styles—infer them from the project.
Apply universal principles (from DESIGN_PRINCIPLES.md):
Infer visual styles from the project:
Each variant MUST explore a different design axis. Do not create minor variations—make them meaningfully distinct. Use the project's existing visual language for all variants.
Variant A: Information Hierarchy Focus
Variant B: Layout Model Exploration
Variant C: Density Variation
Variant D: Interaction Model
Variant E: Expressive Direction
The Design Lab page must include:
Header with:
Variant Grid with:
data-variant="X" attribute (where X is A, B, C, D, E, or F). This is required for the feedback system to identify which variant comments belong to.Responsive behavior:
Shared Data:
data/fixtures.tsFeedback Overlay (CRITICAL - NEVER OMIT):
⚠️ THIS IS THE MOST IMPORTANT REQUIREMENT ⚠️
The FeedbackOverlay enables users to click on elements and leave comments. Without it, the Design Lab is just a static page with no way to collect structured feedback.
FeedbackOverlay.tsx in the SAME directory as page.tsximport { FeedbackOverlay } from './FeedbackOverlay'targetName prop with the component/page nameExample integration:
import { FeedbackOverlay } from './FeedbackOverlay'; // Relative import - always works
export default function DesignLabPage() {
return (
<div className="min-h-screen bg-background">
<header>...</header>
<main>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div data-variant="A">
<VariantA />
</div>
<div data-variant="B">
<VariantB />
</div>
{/* ... more variants */}
</div>
</main>
{/* CRITICAL: FeedbackOverlay must be included */}
<FeedbackOverlay targetName="ComponentName" />
</div>
);
}
If you forget the FeedbackOverlay, the user CANNOT provide feedback. This defeats the entire purpose of the Design Lab.
Conventions:
Accessibility (from DESIGN_PRINCIPLES):
<button> not <div onclick>, <nav>, <main>, <section>:focus-visible with 2px ring and offsetStates (every component needs):
Motion:
prefers-reduced-motionAfter generating the lab files, immediately present the lab to the user. Do NOT attempt to:
Output the lab location and URL:
✅ Design Lab created!
I've generated 5 design variants in `.claude-design/lab/`
To view them:
1. Make sure your dev server is running (run `pnpm dev` if not)
2. Open: http://localhost:3000/__design_lab
Take your time reviewing the variants side-by-side, then come back and tell me:
- Which variant wins (A-E)
- What you like about it
- What should change
Immediately proceed to Phase 5 - ask for feedback. Do NOT wait for the user to say they've opened the browser. Just present the feedback questions right away so they're ready when the user returns.
Running pnpm dev or npm run dev starts a long-running process that never exits. If you run it, you'll wait forever. The user likely already has their dev server running, or can start it themselves in another terminal.
After presenting the lab URL, the user can provide feedback in two ways:
The Design Lab includes a Figma-like feedback overlay. When presenting the lab, include these instructions:
✅ Design Lab created!
I've generated 5 design variants in `.claude-design/lab/`
To view and provide feedback:
1. Make sure your dev server is running (run `pnpm dev` if not)
2. Open: http://localhost:3000/__design_lab
**To add feedback:**
1. Click the "Add Feedback" button (bottom-right corner)
2. Click any element you want to comment on
3. Type your feedback and click "Save"
4. Repeat for all elements you want to comment on
5. Fill in the "Overall Direction" field (required)
6. Click "Submit All Feedback"
7. Paste the copied text here in the terminal
Or just describe your feedback manually below!
When the user pastes feedback, it will be in this format:
## Design Lab Feedback
**Target:** ComponentName
**Comments:** 3
### Variant A
1. **Button** (`[data-testid='submit']`, button with "Submit")
"Make this more prominent"
### Variant B
1. **Card** (`.product-card`, div with "Product Name")
"Love this layout"
### Overall Direction
Go with Variant B's structure. Apply Variant A's button styling.
How to parse and act on this feedback:
[data-testid='submit'])If the user prefers not to use the interactive overlay (or pastes manual feedback), use the AskUserQuestion flow below:
Question 1: Ready to pick?
If user said "Yes", ask:
Question 2a: Which one?
Question 3a: Any tweaks?
If "Minor tweaks needed", ask user to describe changes via text input.
Then proceed to Phase 7: Final Preview.
If user said "No - I like parts of different ones", ask:
Question 2b: What do you like about each?
Example response format to guide user:
- A: Love the card layout and spacing
- B: The color scheme feels right
- C: The interaction on hover is great
- D: Nothing stands out
- E: The typography hierarchy is clearest
Then proceed to Phase 6: Synthesize New Variant.
Based on the user's feedback about what they liked from each variant:
Create a new hybrid variant (Variant F) that combines:
Replace the Design Lab with a comparison view:
Update the /__design_lab route to show the new arrangement
Ask for feedback again:
Question: How's the new variant?
If "Getting closer" or "Went the wrong direction", gather more specific feedback and iterate. Support multiple synthesis passes until user is satisfied.
Then proceed to Phase 7: Final Preview.
Once user is satisfied:
Create .claude-design/preview/ directory:
.claude-design/preview/
├── page.tsx # Preview page
└── FinalDesign.tsx # The winning design
Create route at /__design_preview
For redesigns, include before/after comparison:
Ask for final confirmation:
Question: Confirm final design?
If "No, needs changes": gather feedback and iterate. If "Abort": proceed to Abort Handling below.
If the user
<!-- Content truncated for initial SEO render. Open the source file tab for the full file. -->Google Workspace CLI for Gmail, Calendar, Drive, Contacts, Sheets, and Docs.
Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.
Work with Obsidian vaults (plain Markdown notes) and automate via obsidian-cli.
Use when you need to control Slack from OpenClaw via the slack tool, including reacting to messages or pinning/unpinning items in Slack channels or DMs.
Manage Apple Reminders via remindctl CLI (list, add, edit, complete, delete). Supports lists, date filters, and JSON/plain output.
Manage Trello boards, lists, and cards via the Trello REST API.
Category:productivity