opencodekit 0.9.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +116 -47
- package/dist/template/.opencode/agent/build.md +16 -48
- package/dist/template/.opencode/agent/explore.md +13 -34
- package/dist/template/.opencode/agent/planner.md +41 -11
- package/dist/template/.opencode/agent/review.md +2 -23
- package/dist/template/.opencode/agent/rush.md +24 -65
- package/dist/template/.opencode/agent/scout.md +5 -21
- package/dist/template/.opencode/agent/vision.md +0 -14
- package/dist/template/.opencode/command/accessibility-check.md +293 -30
- package/dist/template/.opencode/command/analyze-mockup.md +406 -20
- package/dist/template/.opencode/command/analyze-project.md +439 -30
- package/dist/template/.opencode/command/brainstorm.md +288 -5
- package/dist/template/.opencode/command/commit.md +226 -17
- package/dist/template/.opencode/command/create.md +138 -35
- package/dist/template/.opencode/command/design-audit.md +477 -29
- package/dist/template/.opencode/command/design.md +609 -6
- package/dist/template/.opencode/command/edit-image.md +223 -20
- package/dist/template/.opencode/command/finish.md +162 -71
- package/dist/template/.opencode/command/fix-ci.md +296 -24
- package/dist/template/.opencode/command/fix-types.md +345 -13
- package/dist/template/.opencode/command/fix-ui.md +293 -13
- package/dist/template/.opencode/command/fix.md +256 -9
- package/dist/template/.opencode/command/generate-diagram.md +327 -26
- package/dist/template/.opencode/command/generate-icon.md +266 -22
- package/dist/template/.opencode/command/generate-image.md +232 -12
- package/dist/template/.opencode/command/generate-pattern.md +234 -20
- package/dist/template/.opencode/command/generate-storyboard.md +231 -21
- package/dist/template/.opencode/command/handoff.md +202 -30
- package/dist/template/.opencode/command/implement.md +162 -50
- package/dist/template/.opencode/command/import-plan.md +247 -51
- package/dist/template/.opencode/command/init.md +154 -35
- package/dist/template/.opencode/command/integration-test.md +405 -24
- package/dist/template/.opencode/command/issue.md +171 -21
- package/dist/template/.opencode/command/new-feature.md +382 -54
- package/dist/template/.opencode/command/plan.md +144 -118
- package/dist/template/.opencode/command/pr.md +229 -28
- package/dist/template/.opencode/command/quick-build.md +234 -5
- package/dist/template/.opencode/command/research-and-implement.md +436 -12
- package/dist/template/.opencode/command/research-ui.md +444 -34
- package/dist/template/.opencode/command/research.md +173 -45
- package/dist/template/.opencode/command/restore-image.md +416 -22
- package/dist/template/.opencode/command/resume.md +439 -63
- package/dist/template/.opencode/command/revert-feature.md +341 -64
- package/dist/template/.opencode/command/review-codebase.md +193 -4
- package/dist/template/.opencode/command/skill-create.md +506 -14
- package/dist/template/.opencode/command/skill-optimize.md +487 -16
- package/dist/template/.opencode/command/status.md +320 -60
- package/dist/template/.opencode/command/summarize.md +374 -33
- package/dist/template/.opencode/command/triage.md +355 -0
- package/dist/template/.opencode/command/ui-review.md +292 -25
- package/dist/template/.opencode/plugin/README.md +110 -98
- package/dist/template/.opencode/plugin/compactor.ts +95 -171
- package/dist/template/.opencode/plugin/enforcer.ts +177 -127
- package/dist/template/.opencode/plugin/injector.ts +150 -0
- package/dist/template/.opencode/plugin/lib/notify.ts +86 -0
- package/dist/template/.opencode/plugin/notification.ts +57 -123
- package/dist/template/.opencode/plugin/truncator.ts +60 -166
- package/dist/template/.opencode/skill/mqdh/SKILL.md +161 -0
- package/dist/template/.opencode/skill/playwriter/SKILL.md +148 -0
- package/dist/template/.opencode/skill/v0/SKILL.md +154 -0
- package/package.json +1 -1
|
@@ -1,17 +1,620 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: UI/UX visual design and
|
|
3
|
-
argument-hint: "[topic
|
|
2
|
+
description: UI/UX visual design with aesthetic direction and code output
|
|
3
|
+
argument-hint: "<component|page|system|'review'> [topic] [--direction:<aesthetic>] [--quick|--deep]"
|
|
4
4
|
agent: vision
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Design: $ARGUMENTS
|
|
8
8
|
|
|
9
|
+
## Phase 1: Context Discovery
|
|
10
|
+
|
|
11
|
+
Parse `$ARGUMENTS` to determine design task:
|
|
12
|
+
|
|
13
|
+
| Task Type | Description | Output Focus |
|
|
14
|
+
| ------------------ | ------------------------------ | --------------------------- |
|
|
15
|
+
| `component <name>` | Design a specific component | Component spec + code |
|
|
16
|
+
| `page <name>` | Design a page layout | Layout structure + sections |
|
|
17
|
+
| `system` | Create/extend design system | Tokens + guidelines |
|
|
18
|
+
| `review <path>` | Review existing UI for quality | Findings + recommendations |
|
|
19
|
+
|
|
20
|
+
**Depth** (default: `--deep`):
|
|
21
|
+
|
|
22
|
+
- `--quick` - High-level direction + key decisions only (~5 min)
|
|
23
|
+
- `--deep` - Full design spec with code output (~15-20 min)
|
|
24
|
+
|
|
25
|
+
### Detect Existing Design System
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Check for design system in use
|
|
29
|
+
glob pattern="**/tailwind.config.{js,ts,mjs}"
|
|
30
|
+
glob pattern="**/globals.css"
|
|
31
|
+
glob pattern="**/components.json" # shadcn
|
|
32
|
+
|
|
33
|
+
# Read existing styles
|
|
34
|
+
read tailwind.config.js
|
|
35
|
+
read src/styles/globals.css
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Identify component library:**
|
|
39
|
+
|
|
40
|
+
| File/Pattern Found | Library |
|
|
41
|
+
| ------------------------------------ | ---------------- |
|
|
42
|
+
| `components.json` with shadcn schema | shadcn/ui |
|
|
43
|
+
| `@mui/material` in package.json | Material UI |
|
|
44
|
+
| `@chakra-ui/*` | Chakra UI |
|
|
45
|
+
| `@radix-ui/*` only | Radix Primitives |
|
|
46
|
+
| None detected | Custom system |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Phase 2: Aesthetic Direction (DECISION GATE)
|
|
51
|
+
|
|
9
52
|
skill({ name: "frontend-aesthetics" })
|
|
10
53
|
|
|
11
|
-
|
|
54
|
+
**BEFORE any design work, you MUST state:**
|
|
55
|
+
|
|
56
|
+
1. **Aesthetic direction** — Which style(s)?
|
|
57
|
+
2. **Why** — How does it fit the context/brand?
|
|
58
|
+
|
|
59
|
+
### Available Directions
|
|
60
|
+
|
|
61
|
+
Pick ONE (or combine 2 max):
|
|
62
|
+
|
|
63
|
+
| Direction | Character | Best For |
|
|
64
|
+
| -------------------- | ----------------------------------------------- | ---------------------------------- |
|
|
65
|
+
| **Neo-Brutalist** | Raw textures, bold type, harsh contrasts | Developer tools, creative agencies |
|
|
66
|
+
| **Soft Minimalism** | Muted palettes, generous whitespace | SaaS, productivity apps |
|
|
67
|
+
| **Retro-Futuristic** | CRT effects, scan lines, neon | Gaming, entertainment |
|
|
68
|
+
| **Editorial** | Dynamic grids, mixed media, bold type | Magazines, portfolios |
|
|
69
|
+
| **Glass Morphism** | Translucent layers, backdrop blur, depth | Dashboards, modern apps |
|
|
70
|
+
| **Dark Academia** | Rich textures, serif type, scholarly | Education, libraries |
|
|
71
|
+
| **Swiss Design** | Grid systems, sans-serif, functional | Enterprise, documentation |
|
|
72
|
+
| **Art Deco** | Geometric patterns, gold accents, luxury | Finance, premium products |
|
|
73
|
+
| **Y2K Revival** | Gradients, metallics, early-web nostalgia | Youth brands, creative |
|
|
74
|
+
| **Organic/Natural** | Flowing shapes, nature palettes, paper textures | Wellness, sustainability |
|
|
75
|
+
|
|
76
|
+
**Override with flag:** `--direction:neo-brutalist` or `--direction:soft-minimalism+swiss`
|
|
77
|
+
|
|
78
|
+
### Direction Declaration
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
## Aesthetic Direction
|
|
82
|
+
|
|
83
|
+
**Selected:** [Direction name(s)]
|
|
84
|
+
|
|
85
|
+
**Rationale:** [1-2 sentences explaining why this fits]
|
|
86
|
+
|
|
87
|
+
**Key characteristics I will apply:**
|
|
88
|
+
|
|
89
|
+
- [Specific element 1]
|
|
90
|
+
- [Specific element 2]
|
|
91
|
+
- [Specific element 3]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Phase 3: Typography Specification
|
|
97
|
+
|
|
98
|
+
### Font Selection
|
|
99
|
+
|
|
100
|
+
**Recommended fonts by context:**
|
|
101
|
+
|
|
102
|
+
| Context | Primary | Secondary |
|
|
103
|
+
| --------------- | ----------------------------------------------- | -------------------- |
|
|
104
|
+
| Code/Tech | JetBrains Mono, Fira Code, Space Mono | Inter, IBM Plex Sans |
|
|
105
|
+
| Editorial | Playfair Display, Crimson Pro, Instrument Serif | Source Sans 3 |
|
|
106
|
+
| Display/Bold | Bebas Neue, Oswald, Archivo Black | Work Sans |
|
|
107
|
+
| Technical/Clean | IBM Plex, Source Sans 3, Work Sans | JetBrains Mono |
|
|
108
|
+
| Distinctive | Bricolage Grotesque, Syne, Outfit | Space Grotesk |
|
|
109
|
+
|
|
110
|
+
**AVOID without purpose:** Inter, Roboto, Arial, system fonts
|
|
111
|
+
|
|
112
|
+
### Type Scale
|
|
113
|
+
|
|
114
|
+
```css
|
|
115
|
+
/* Type scale - adjust base for your design */
|
|
116
|
+
:root {
|
|
117
|
+
--font-sans: "Outfit", system-ui, sans-serif;
|
|
118
|
+
--font-mono: "JetBrains Mono", monospace;
|
|
119
|
+
|
|
120
|
+
/* Scale: 1.25 ratio (Major Third) */
|
|
121
|
+
--text-xs: 0.64rem; /* 10px */
|
|
122
|
+
--text-sm: 0.8rem; /* 13px */
|
|
123
|
+
--text-base: 1rem; /* 16px */
|
|
124
|
+
--text-lg: 1.25rem; /* 20px */
|
|
125
|
+
--text-xl: 1.563rem; /* 25px */
|
|
126
|
+
--text-2xl: 1.953rem; /* 31px */
|
|
127
|
+
--text-3xl: 2.441rem; /* 39px */
|
|
128
|
+
--text-4xl: 3.052rem; /* 49px */
|
|
129
|
+
|
|
130
|
+
/* Line heights */
|
|
131
|
+
--leading-tight: 1.1;
|
|
132
|
+
--leading-snug: 1.3;
|
|
133
|
+
--leading-normal: 1.5;
|
|
134
|
+
--leading-relaxed: 1.75;
|
|
135
|
+
|
|
136
|
+
/* Font weights - use extremes */
|
|
137
|
+
--font-light: 200;
|
|
138
|
+
--font-normal: 400;
|
|
139
|
+
--font-bold: 700;
|
|
140
|
+
--font-black: 900;
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Pairing Rules
|
|
145
|
+
|
|
146
|
+
- **High contrast = interesting**: Display + monospace, serif + geometric sans
|
|
147
|
+
- **Use weight extremes**: 200/300 vs 800/900, NOT 400 vs 600
|
|
148
|
+
- **Limit to 2 families**: One for headings, one for body
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Phase 4: Color Specification
|
|
153
|
+
|
|
154
|
+
### Color Palette Structure
|
|
155
|
+
|
|
156
|
+
```css
|
|
157
|
+
:root {
|
|
158
|
+
/* Primitives - raw color values */
|
|
159
|
+
--color-slate-50: #f8fafc;
|
|
160
|
+
--color-slate-100: #f1f5f9;
|
|
161
|
+
--color-slate-200: #e2e8f0;
|
|
162
|
+
--color-slate-300: #cbd5e1;
|
|
163
|
+
--color-slate-400: #94a3b8;
|
|
164
|
+
--color-slate-500: #64748b;
|
|
165
|
+
--color-slate-600: #475569;
|
|
166
|
+
--color-slate-700: #334155;
|
|
167
|
+
--color-slate-800: #1e293b;
|
|
168
|
+
--color-slate-900: #0f172a;
|
|
169
|
+
--color-slate-950: #020617;
|
|
170
|
+
|
|
171
|
+
/* Brand color (pick ONE dominant) */
|
|
172
|
+
--color-brand: #2563eb;
|
|
173
|
+
--color-brand-light: #3b82f6;
|
|
174
|
+
--color-brand-dark: #1d4ed8;
|
|
175
|
+
|
|
176
|
+
/* Accent (sharp contrast to brand) */
|
|
177
|
+
--color-accent: #f59e0b;
|
|
178
|
+
|
|
179
|
+
/* Semantic - light mode */
|
|
180
|
+
--background: var(--color-slate-50);
|
|
181
|
+
--foreground: var(--color-slate-900);
|
|
182
|
+
--muted: var(--color-slate-100);
|
|
183
|
+
--muted-foreground: var(--color-slate-500);
|
|
184
|
+
--primary: var(--color-brand);
|
|
185
|
+
--primary-foreground: white;
|
|
186
|
+
--secondary: var(--color-slate-100);
|
|
187
|
+
--secondary-foreground: var(--color-slate-900);
|
|
188
|
+
--accent: var(--color-accent);
|
|
189
|
+
--accent-foreground: var(--color-slate-900);
|
|
190
|
+
--destructive: #ef4444;
|
|
191
|
+
--destructive-foreground: white;
|
|
192
|
+
--success: #10b981;
|
|
193
|
+
--warning: #f59e0b;
|
|
194
|
+
--border: var(--color-slate-200);
|
|
195
|
+
--ring: var(--color-brand);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.dark {
|
|
199
|
+
--background: var(--color-slate-950);
|
|
200
|
+
--foreground: var(--color-slate-50);
|
|
201
|
+
--muted: var(--color-slate-800);
|
|
202
|
+
--muted-foreground: var(--color-slate-400);
|
|
203
|
+
--secondary: var(--color-slate-800);
|
|
204
|
+
--secondary-foreground: var(--color-slate-50);
|
|
205
|
+
--border: var(--color-slate-800);
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Color Anti-Patterns (NEVER DO)
|
|
210
|
+
|
|
211
|
+
| Anti-Pattern | Why It's Bad | Do Instead |
|
|
212
|
+
| --------------------------------- | -------------------------- | --------------------------------------- |
|
|
213
|
+
| Purple/blue gradient backgrounds | Overused AI slop signature | Solid colors or subtle texture |
|
|
214
|
+
| `#6366F1` or `#667eea` as primary | Generic "Tailwind indigo" | Choose distinctive brand color |
|
|
215
|
+
| Flat white `#FFFFFF` backgrounds | Harsh, sterile | Use warm white `#FAFAF9` or subtle gray |
|
|
216
|
+
| Rainbow gradients | Overwhelming, no hierarchy | Limited palette with one accent |
|
|
217
|
+
| Too many colors (>6 semantic) | Confusion, inconsistency | Stick to primary + accent + neutrals |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Phase 5: Spacing & Layout
|
|
222
|
+
|
|
223
|
+
### Spacing Scale
|
|
224
|
+
|
|
225
|
+
```css
|
|
226
|
+
:root {
|
|
227
|
+
/* Base unit: 4px (or 0.25rem) */
|
|
228
|
+
--space-0: 0;
|
|
229
|
+
--space-1: 0.25rem; /* 4px */
|
|
230
|
+
--space-2: 0.5rem; /* 8px */
|
|
231
|
+
--space-3: 0.75rem; /* 12px */
|
|
232
|
+
--space-4: 1rem; /* 16px */
|
|
233
|
+
--space-5: 1.25rem; /* 20px */
|
|
234
|
+
--space-6: 1.5rem; /* 24px */
|
|
235
|
+
--space-8: 2rem; /* 32px */
|
|
236
|
+
--space-10: 2.5rem; /* 40px */
|
|
237
|
+
--space-12: 3rem; /* 48px */
|
|
238
|
+
--space-16: 4rem; /* 64px */
|
|
239
|
+
--space-20: 5rem; /* 80px */
|
|
240
|
+
--space-24: 6rem; /* 96px */
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Layout Patterns
|
|
245
|
+
|
|
246
|
+
```css
|
|
247
|
+
/* Container */
|
|
248
|
+
.container {
|
|
249
|
+
width: 100%;
|
|
250
|
+
max-width: 1280px;
|
|
251
|
+
margin-inline: auto;
|
|
252
|
+
padding-inline: var(--space-4);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@media (min-width: 640px) {
|
|
256
|
+
.container {
|
|
257
|
+
padding-inline: var(--space-6);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@media (min-width: 1024px) {
|
|
262
|
+
.container {
|
|
263
|
+
padding-inline: var(--space-8);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Section spacing */
|
|
268
|
+
.section {
|
|
269
|
+
padding-block: var(--space-16);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@media (min-width: 768px) {
|
|
273
|
+
.section {
|
|
274
|
+
padding-block: var(--space-24);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Responsive Breakpoints
|
|
280
|
+
|
|
281
|
+
| Breakpoint | Width | Typical Use |
|
|
282
|
+
| ---------- | ------ | ---------------- |
|
|
283
|
+
| `sm` | 640px | Mobile landscape |
|
|
284
|
+
| `md` | 768px | Tablets |
|
|
285
|
+
| `lg` | 1024px | Small laptops |
|
|
286
|
+
| `xl` | 1280px | Desktops |
|
|
287
|
+
| `2xl` | 1536px | Large screens |
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Phase 6: Component Patterns
|
|
292
|
+
|
|
293
|
+
### For Component Design Tasks
|
|
294
|
+
|
|
295
|
+
**Component Specification Template:**
|
|
296
|
+
|
|
297
|
+
```markdown
|
|
298
|
+
## Component: [Name]
|
|
299
|
+
|
|
300
|
+
### Purpose
|
|
301
|
+
|
|
302
|
+
[What problem does this solve?]
|
|
303
|
+
|
|
304
|
+
### Variants
|
|
305
|
+
|
|
306
|
+
| Variant | Use Case | Visual Difference |
|
|
307
|
+
| ----------- | ------------------ | ----------------- |
|
|
308
|
+
| default | Standard usage | Base styling |
|
|
309
|
+
| primary | Primary action | Brand color fill |
|
|
310
|
+
| secondary | Secondary action | Muted background |
|
|
311
|
+
| outline | Tertiary action | Border only |
|
|
312
|
+
| ghost | Minimal prominence | No border/bg |
|
|
313
|
+
| destructive | Dangerous action | Red/warning color |
|
|
314
|
+
|
|
315
|
+
### Sizes
|
|
316
|
+
|
|
317
|
+
| Size | Padding | Font Size | Min Height |
|
|
318
|
+
| ---- | --------- | --------- | ---------- |
|
|
319
|
+
| sm | 8px 12px | 14px | 32px |
|
|
320
|
+
| md | 10px 16px | 14px | 40px |
|
|
321
|
+
| lg | 12px 24px | 16px | 48px |
|
|
322
|
+
|
|
323
|
+
### States
|
|
324
|
+
|
|
325
|
+
- Default
|
|
326
|
+
- Hover (subtle lightening/darkening)
|
|
327
|
+
- Focus (ring outline)
|
|
328
|
+
- Active (pressed state)
|
|
329
|
+
- Disabled (reduced opacity, no pointer)
|
|
330
|
+
- Loading (spinner, disabled interaction)
|
|
331
|
+
|
|
332
|
+
### Accessibility
|
|
333
|
+
|
|
334
|
+
- Keyboard: [Tab, Enter, Space behavior]
|
|
335
|
+
- ARIA: [Required attributes]
|
|
336
|
+
- Focus: [Visible ring, logical order]
|
|
337
|
+
- Contrast: [Minimum 4.5:1 for text]
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Code Output (shadcn/Tailwind pattern)
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
344
|
+
import { cn } from "@/lib/utils";
|
|
12
345
|
|
|
13
|
-
|
|
346
|
+
const buttonVariants = cva(
|
|
347
|
+
// Base styles
|
|
348
|
+
"inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
|
|
349
|
+
{
|
|
350
|
+
variants: {
|
|
351
|
+
variant: {
|
|
352
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
353
|
+
secondary:
|
|
354
|
+
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
355
|
+
outline: "border border-input bg-background hover:bg-accent",
|
|
356
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
357
|
+
destructive:
|
|
358
|
+
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
359
|
+
},
|
|
360
|
+
size: {
|
|
361
|
+
sm: "h-8 px-3 text-sm",
|
|
362
|
+
md: "h-10 px-4 text-sm",
|
|
363
|
+
lg: "h-12 px-6 text-base",
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
defaultVariants: {
|
|
367
|
+
variant: "default",
|
|
368
|
+
size: "md",
|
|
369
|
+
},
|
|
370
|
+
},
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
interface ButtonProps
|
|
374
|
+
extends
|
|
375
|
+
React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
376
|
+
VariantProps<typeof buttonVariants> {}
|
|
377
|
+
|
|
378
|
+
export function Button({ className, variant, size, ...props }: ButtonProps) {
|
|
379
|
+
return (
|
|
380
|
+
<button
|
|
381
|
+
className={cn(buttonVariants({ variant, size }), className)}
|
|
382
|
+
{...props}
|
|
383
|
+
/>
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## Phase 7: Animation Approach
|
|
391
|
+
|
|
392
|
+
### Recommended: Orchestrated Entrance
|
|
393
|
+
|
|
394
|
+
One coordinated animation beats scattered effects:
|
|
395
|
+
|
|
396
|
+
```css
|
|
397
|
+
@keyframes revealUp {
|
|
398
|
+
from {
|
|
399
|
+
opacity: 0;
|
|
400
|
+
transform: translateY(20px);
|
|
401
|
+
}
|
|
402
|
+
to {
|
|
403
|
+
opacity: 1;
|
|
404
|
+
transform: translateY(0);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.hero > * {
|
|
409
|
+
animation: revealUp 600ms cubic-bezier(0.19, 1, 0.22, 1) both;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.hero > *:nth-child(1) {
|
|
413
|
+
animation-delay: 0ms;
|
|
414
|
+
}
|
|
415
|
+
.hero > *:nth-child(2) {
|
|
416
|
+
animation-delay: 80ms;
|
|
417
|
+
}
|
|
418
|
+
.hero > *:nth-child(3) {
|
|
419
|
+
animation-delay: 160ms;
|
|
420
|
+
}
|
|
421
|
+
.hero > *:nth-child(4) {
|
|
422
|
+
animation-delay: 240ms;
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Micro-interactions
|
|
427
|
+
|
|
428
|
+
```css
|
|
429
|
+
/* Subtle hover lift */
|
|
430
|
+
.card {
|
|
431
|
+
transition:
|
|
432
|
+
transform 200ms ease,
|
|
433
|
+
box-shadow 200ms ease;
|
|
434
|
+
}
|
|
435
|
+
.card:hover {
|
|
436
|
+
transform: translateY(-2px);
|
|
437
|
+
box-shadow: 0 8px 16px -4px rgb(0 0 0 / 0.1);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/* Button press */
|
|
441
|
+
.button:active {
|
|
442
|
+
transform: scale(0.98);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/* Focus ring */
|
|
446
|
+
.interactive:focus-visible {
|
|
447
|
+
outline: none;
|
|
448
|
+
ring: 2px solid var(--ring);
|
|
449
|
+
ring-offset: 2px;
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Phase 8: AI Slop Check (MANDATORY)
|
|
456
|
+
|
|
457
|
+
Before finalizing, verify design does NOT have ALL of these together:
|
|
458
|
+
|
|
459
|
+
### AI Slop Signature (NEVER do all together)
|
|
460
|
+
|
|
461
|
+
| Element | Check |
|
|
462
|
+
| ------------------------------------------- | --------------- |
|
|
463
|
+
| Purple/blue gradient background | [ ] NOT present |
|
|
464
|
+
| Inter or system fonts only | [ ] NOT present |
|
|
465
|
+
| Centered hero with generic subheading | [ ] NOT present |
|
|
466
|
+
| 3-column feature cards with icons | [ ] NOT present |
|
|
467
|
+
| 16px rounded corners on everything | [ ] NOT present |
|
|
468
|
+
| Drop shadows on all cards | [ ] NOT present |
|
|
469
|
+
| "Modern, clean, simple" as only descriptors | [ ] NOT present |
|
|
470
|
+
|
|
471
|
+
**Rule:** Having 1-2 is fine. Having 5+ = AI slop. Redesign.
|
|
472
|
+
|
|
473
|
+
### Quality Checklist
|
|
474
|
+
|
|
475
|
+
- [ ] Clear aesthetic point of view? (Can you name it?)
|
|
476
|
+
- [ ] Avoids AI slop signature?
|
|
477
|
+
- [ ] Would someone remember this tomorrow?
|
|
478
|
+
- [ ] Responsive design considered?
|
|
479
|
+
- [ ] Accessible (contrast, focus, keyboard)?
|
|
480
|
+
- [ ] Dark mode supported?
|
|
481
|
+
- [ ] Performance-friendly (minimal JS animations)?
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Phase 9: Output Format
|
|
486
|
+
|
|
487
|
+
### For Component Design
|
|
488
|
+
|
|
489
|
+
```markdown
|
|
490
|
+
## Component Design: [Name]
|
|
491
|
+
|
|
492
|
+
### Aesthetic Direction
|
|
493
|
+
|
|
494
|
+
[Direction + rationale]
|
|
495
|
+
|
|
496
|
+
### Specification
|
|
497
|
+
|
|
498
|
+
[Variants, sizes, states table]
|
|
499
|
+
|
|
500
|
+
### Code
|
|
501
|
+
|
|
502
|
+
[Full component code with cva/cn pattern]
|
|
503
|
+
|
|
504
|
+
### Usage Examples
|
|
505
|
+
|
|
506
|
+
[3-4 usage examples]
|
|
507
|
+
|
|
508
|
+
### Accessibility Notes
|
|
509
|
+
|
|
510
|
+
[Keyboard, ARIA, contrast requirements]
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### For Page Design
|
|
514
|
+
|
|
515
|
+
```markdown
|
|
516
|
+
## Page Design: [Name]
|
|
517
|
+
|
|
518
|
+
### Aesthetic Direction
|
|
519
|
+
|
|
520
|
+
[Direction + rationale]
|
|
521
|
+
|
|
522
|
+
### Layout Structure
|
|
523
|
+
|
|
524
|
+
[ASCII diagram or section breakdown]
|
|
525
|
+
|
|
526
|
+
### Sections
|
|
527
|
+
|
|
528
|
+
1. [Section name] - [Purpose] - [Key elements]
|
|
529
|
+
2. ...
|
|
530
|
+
|
|
531
|
+
### Responsive Behavior
|
|
532
|
+
|
|
533
|
+
[How layout changes at breakpoints]
|
|
534
|
+
|
|
535
|
+
### Code Structure
|
|
536
|
+
|
|
537
|
+
[Component composition, layout CSS]
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### For System Design
|
|
541
|
+
|
|
542
|
+
```markdown
|
|
543
|
+
## Design System: [Name]
|
|
544
|
+
|
|
545
|
+
### Aesthetic Direction
|
|
546
|
+
|
|
547
|
+
[Direction + rationale]
|
|
548
|
+
|
|
549
|
+
### Tokens
|
|
550
|
+
|
|
551
|
+
[Full CSS variables: colors, typography, spacing]
|
|
552
|
+
|
|
553
|
+
### Component Guidelines
|
|
554
|
+
|
|
555
|
+
[Patterns to follow, anti-patterns to avoid]
|
|
556
|
+
|
|
557
|
+
### Tailwind Config
|
|
558
|
+
|
|
559
|
+
[Full tailwind.config.js extension]
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## Phase 10: Storage & Follow-up
|
|
565
|
+
|
|
566
|
+
### Save to Memory
|
|
567
|
+
|
|
568
|
+
**Quick design:** Output inline, no save needed
|
|
569
|
+
**Full design:** Save to `.opencode/memory/design/specs/[YYYY-MM-DD]-[topic].md`
|
|
570
|
+
|
|
571
|
+
### Create Implementation Tasks
|
|
572
|
+
|
|
573
|
+
For component/page designs:
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
bd_add({
|
|
577
|
+
title: "Implement [component/page] design",
|
|
578
|
+
desc: "Build [name] per design spec at .opencode/memory/design/specs/[file].md",
|
|
579
|
+
type: "task",
|
|
580
|
+
pri: 2,
|
|
581
|
+
tags: ["frontend", "design"]
|
|
582
|
+
})
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Bead Integration
|
|
586
|
+
|
|
587
|
+
If bead exists in `$ARGUMENTS`, design within `.beads/artifacts/<bead-id>/spec.md` constraints.
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Examples
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
# Design a component
|
|
595
|
+
/design component button --direction:neo-brutalist
|
|
596
|
+
|
|
597
|
+
# Design a page
|
|
598
|
+
/design page landing --direction:soft-minimalism+swiss --deep
|
|
599
|
+
|
|
600
|
+
# Create/extend design system
|
|
601
|
+
/design system --direction:editorial
|
|
602
|
+
|
|
603
|
+
# Review existing UI
|
|
604
|
+
/design review src/components/ --quick
|
|
605
|
+
|
|
606
|
+
# Quick design recommendation
|
|
607
|
+
/design component modal --quick
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
---
|
|
14
611
|
|
|
15
|
-
|
|
612
|
+
## Related Commands
|
|
16
613
|
|
|
17
|
-
|
|
614
|
+
| Need | Command |
|
|
615
|
+
| --------------------- | ---------------------- |
|
|
616
|
+
| Audit existing system | `/design-audit` |
|
|
617
|
+
| Analyze mockup | `/analyze-mockup` |
|
|
618
|
+
| Implement design | `/implement` |
|
|
619
|
+
| Check accessibility | `/accessibility-check` |
|
|
620
|
+
| Fix UI issues | `/fix-ui` |
|