picasso-skill 1.5.1 → 2.0.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.
Files changed (44) hide show
  1. package/agents/picasso.md +14 -2
  2. package/checklists/pre-ship.md +83 -0
  3. package/commands/backlog.md +34 -0
  4. package/commands/variants.md +18 -0
  5. package/package.json +3 -1
  6. package/references/accessibility-wcag.md +245 -0
  7. package/references/anti-patterns.md +184 -0
  8. package/references/color-and-contrast.md +477 -0
  9. package/references/component-patterns.md +113 -0
  10. package/references/conversion-design.md +193 -0
  11. package/references/data-visualization.md +226 -0
  12. package/references/depth-and-elevation.md +211 -0
  13. package/references/design-system.md +176 -0
  14. package/references/generative-art.md +648 -0
  15. package/references/interaction-design.md +162 -0
  16. package/references/modern-css-performance.md +361 -0
  17. package/references/motion-and-animation.md +267 -0
  18. package/references/performance-optimization.md +746 -0
  19. package/references/react-patterns.md +318 -0
  20. package/references/responsive-design.md +452 -0
  21. package/references/sensory-design.md +369 -0
  22. package/references/spatial-design.md +176 -0
  23. package/references/style-presets.md +502 -0
  24. package/references/tools-catalog.md +103 -0
  25. package/references/typography.md +415 -0
  26. package/references/ux-psychology.md +235 -0
  27. package/references/ux-writing.md +513 -0
  28. package/skills/picasso/SKILL.md +58 -2
  29. package/skills/picasso/references/animation-performance.md +244 -0
  30. package/skills/picasso/references/brand-and-identity.md +136 -0
  31. package/skills/picasso/references/code-typography.md +222 -0
  32. package/skills/picasso/references/color-and-contrast.md +56 -2
  33. package/skills/picasso/references/dark-mode.md +199 -0
  34. package/skills/picasso/references/depth-and-elevation.md +211 -0
  35. package/skills/picasso/references/i18n-visual-patterns.md +177 -0
  36. package/skills/picasso/references/images-and-media.md +222 -0
  37. package/skills/picasso/references/loading-and-states.md +258 -0
  38. package/skills/picasso/references/micro-interactions.md +291 -0
  39. package/skills/picasso/references/motion-and-animation.md +9 -2
  40. package/skills/picasso/references/navigation-patterns.md +247 -0
  41. package/skills/picasso/references/style-presets.md +1 -1
  42. package/skills/picasso/references/tables-and-forms.md +227 -0
  43. package/skills/picasso/references/tools-catalog.md +103 -0
  44. package/skills/picasso/references/typography.md +45 -2
@@ -0,0 +1,513 @@
1
+ # UX Writing Reference
2
+
3
+ Rules and patterns for writing UI text. Every string a user reads is a design decision.
4
+
5
+ ---
6
+
7
+ ## 1. Button Labels
8
+
9
+ Never use generic labels. Every button tells the user exactly what will happen.
10
+
11
+ ### Banned Labels
12
+
13
+ | Never Use | Why |
14
+ |-----------|-----|
15
+ | OK | Tells user nothing about the action |
16
+ | Submit | Vague, form-era holdover |
17
+ | Yes / No | Forces user to re-read the question |
18
+ | Click here | Accessibility failure, no meaning |
19
+ | Cancel (alone) | Ambiguous without paired action context |
20
+
21
+ ### Pattern: Verb + Object
22
+
23
+ ```
24
+ Save changes
25
+ Create account
26
+ Delete 3 items
27
+ Export as PDF
28
+ Add to cart
29
+ Send invitation
30
+ Publish post
31
+ Archive conversation
32
+ ```
33
+
34
+ ### Destructive Actions: Name the Destruction + Show Count
35
+
36
+ ```
37
+ // BAD
38
+ Are you sure? [Yes] [No]
39
+
40
+ // GOOD
41
+ Delete 14 messages permanently?
42
+ This cannot be undone.
43
+ [Keep messages] [Delete 14 messages]
44
+ ```
45
+
46
+ ```
47
+ // BAD
48
+ Remove items? [OK] [Cancel]
49
+
50
+ // GOOD
51
+ Remove 3 items from your cart?
52
+ [Keep items] [Remove 3 items]
53
+ ```
54
+
55
+ ### Paired Button Rules
56
+
57
+ | Scenario | Primary | Secondary |
58
+ |----------|---------|-----------|
59
+ | Save flow | Save changes | Discard |
60
+ | Creation | Create project | Cancel |
61
+ | Destructive | Keep items | Delete 5 items |
62
+ | Confirmation | Send invitation | Go back |
63
+ | Upload | Upload file | Choose different file |
64
+
65
+ The safe/non-destructive action is always visually more prominent (filled button). The destructive action is secondary (outlined or text-only).
66
+
67
+ ---
68
+
69
+ ## 2. Error Messages
70
+
71
+ ### Formula: What Happened + Why + How to Fix
72
+
73
+ Every error message has three parts. Never skip "how to fix."
74
+
75
+ ### Templates
76
+
77
+ **Format error:**
78
+ ```
79
+ Title: Invalid email address
80
+ Body: Email addresses need an @ symbol and a domain (like name@example.com).
81
+ Action: [Fix email address]
82
+ ```
83
+
84
+ **Missing required field:**
85
+ ```
86
+ Title: Card number is required
87
+ Body: Enter your 16-digit card number to complete checkout.
88
+ // Inline: highlight the field, place message directly below it
89
+ ```
90
+
91
+ **Permission denied:**
92
+ ```
93
+ Title: You don't have access to this project
94
+ Body: Only project admins can change billing settings. Ask [Admin Name] to update your role or make this change for you.
95
+ Action: [Request access] [Go back]
96
+ ```
97
+
98
+ **Network error:**
99
+ ```
100
+ Title: Can't connect right now
101
+ Body: Check your internet connection and try again. Your draft has been saved locally.
102
+ Action: [Try again]
103
+ ```
104
+
105
+ **Server error (5xx):**
106
+ ```
107
+ Title: Something went wrong on our end
108
+ Body: We're looking into it. Your data is safe. Try again in a few minutes, or contact support if this keeps happening.
109
+ Action: [Try again] [Contact support]
110
+ ```
111
+
112
+ **Rate limit:**
113
+ ```
114
+ Title: Too many requests
115
+ Body: You've hit the rate limit. Try again in [X] seconds.
116
+ Action: [auto-countdown button: "Try again in 28s"]
117
+ ```
118
+
119
+ ### Rules
120
+
121
+ - Never blame the user. "Invalid input" becomes "This field needs a number between 1 and 100."
122
+ - Never use error codes alone. "Error 403" means nothing. Always pair with human language.
123
+ - Never use "Oops!" or humor in error states. The user is blocked; respect that.
124
+ - Place errors inline next to the field, not in a modal or toast that disappears.
125
+ - Use red (#DC2626 or equivalent) for error borders/icons, not for the entire message text.
126
+
127
+ ---
128
+
129
+ ## 3. Empty States
130
+
131
+ ### Formula: Acknowledge + Explain Value + Action CTA + Optional Help
132
+
133
+ ```
134
+ // Project list empty state
135
+
136
+ [illustration or icon]
137
+
138
+ No projects yet
139
+ Projects help you organize work, track progress, and collaborate with your team.
140
+
141
+ [Create your first project]
142
+
143
+ Need help getting started? Read the quick-start guide.
144
+ ```
145
+
146
+ ```
147
+ // Search with no results
148
+
149
+ No results for "exmple"
150
+ Did you mean "example"?
151
+
152
+ Try different keywords, remove filters, or [browse all items].
153
+ ```
154
+
155
+ ```
156
+ // Filtered view empty
157
+
158
+ No completed tasks this week
159
+ Completed tasks will appear here as your team finishes work.
160
+
161
+ [View all tasks]
162
+ ```
163
+
164
+ ### Rules
165
+
166
+ - Keep the acknowledgment to one short line. Don't over-explain emptiness.
167
+ - The value proposition should answer "why would I want things here?"
168
+ - The CTA button uses the same verb+object pattern as all buttons.
169
+ - Help links open in context (panel, tooltip, or new tab), never navigate away from the empty state.
170
+ - Never show a completely blank screen. Even loading-to-empty transitions need a state.
171
+
172
+ ---
173
+
174
+ ## 4. Voice vs Tone
175
+
176
+ **Voice** is the personality. It never changes. Define it once.
177
+
178
+ | Voice Attribute | Means | Does Not Mean |
179
+ |----------------|-------|---------------|
180
+ | Clear | Short sentences, common words | Dumbed down or robotic |
181
+ | Confident | Direct statements, no hedging | Arrogant or dismissive |
182
+ | Helpful | Guides next step, anticipates needs | Condescending or hand-holding |
183
+ | Human | Natural phrasing, contractions OK | Slang, jokes, or emoji in UI text |
184
+
185
+ **Tone** adapts to the moment.
186
+
187
+ | Moment | Tone | Example |
188
+ |--------|------|---------|
189
+ | Success | Warm, encouraging | "Your account is ready. Let's set up your first project." |
190
+ | Error | Calm, direct | "That file is too large. The maximum size is 25 MB." |
191
+ | Destructive confirmation | Serious, precise | "This will permanently delete 14 messages. This cannot be undone." |
192
+ | Onboarding | Friendly, guiding | "Welcome. We'll walk you through the basics in about 2 minutes." |
193
+ | Empty state | Neutral, inviting | "No notifications yet. You'll see updates from your team here." |
194
+
195
+ ### Hard Rule
196
+
197
+ Never use humor in error states, destructive actions, or security messages. A user who just lost data does not want a witty quip.
198
+
199
+ ---
200
+
201
+ ## 5. Accessibility Writing
202
+
203
+ ### Link Text
204
+
205
+ Links must make sense when read alone (screen readers navigate by link list).
206
+
207
+ ```
208
+ // BAD
209
+ To learn more about pricing, click here.
210
+
211
+ // GOOD
212
+ View our pricing plans.
213
+
214
+ // BAD
215
+ Read more
216
+
217
+ // GOOD
218
+ Read the full accessibility guidelines
219
+ ```
220
+
221
+ ### Alt Text
222
+
223
+ Describe the information the image conveys, not the image itself.
224
+
225
+ ```
226
+ // BAD
227
+ alt="photo"
228
+ alt="image of a chart"
229
+ alt="" (unless purely decorative)
230
+
231
+ // GOOD
232
+ alt="Revenue grew 34% from Q1 to Q4 2025"
233
+ alt="Team photo: 12 people standing in front of the office"
234
+ alt="" (decorative divider, background pattern)
235
+ ```
236
+
237
+ Rule: If the image were deleted, what information would be lost? That is your alt text.
238
+
239
+ ### Icon Buttons
240
+
241
+ Every icon-only button needs an `aria-label`.
242
+
243
+ ```html
244
+ <!-- BAD -->
245
+ <button><TrashIcon /></button>
246
+
247
+ <!-- GOOD -->
248
+ <button aria-label="Delete message"><TrashIcon /></button>
249
+
250
+ <!-- With tooltip for sighted users too -->
251
+ <button aria-label="Delete message" title="Delete message">
252
+ <TrashIcon />
253
+ </button>
254
+ ```
255
+
256
+ ### Form Labels
257
+
258
+ Every input has a visible `<label>`. Placeholder text is not a label.
259
+
260
+ ```html
261
+ <!-- BAD -->
262
+ <input placeholder="Enter your email" />
263
+
264
+ <!-- GOOD -->
265
+ <label for="email">Email address</label>
266
+ <input id="email" placeholder="name@example.com" />
267
+ ```
268
+
269
+ ---
270
+
271
+ ## 6. Translation Planning
272
+
273
+ English is compact. Other languages expand. Design with this in mind.
274
+
275
+ ### Expansion Percentages
276
+
277
+ | Language | Expansion | 10-char English becomes |
278
+ |----------|-----------|------------------------|
279
+ | German | +30% | ~13 characters |
280
+ | French | +20% | ~12 characters |
281
+ | Finnish | +30-40% | ~13-14 characters |
282
+ | Italian | +15% | ~11-12 characters |
283
+ | Spanish | +15-20% | ~12 characters |
284
+ | Portuguese | +20-25% | ~12-13 characters |
285
+ | Chinese | -30% | ~7 characters |
286
+ | Japanese | -20-30% | ~7-8 characters |
287
+ | Korean | -10-20% | ~8-9 characters |
288
+ | Arabic | +25% (RTL) | ~12-13 characters |
289
+
290
+ ### Design Rules
291
+
292
+ - Buttons: Allow at least 30% extra width. Never set fixed-width buttons for text.
293
+ - Navigation: Horizontal nav bars that barely fit in English will break in German. Test with pseudolocalization.
294
+ - Truncation: If you must truncate, truncate with `...` and provide the full text on hover/focus via `title` attribute.
295
+ - Icons + text: Always pair icons with text labels for translatability. Icon-only works only for universally understood symbols (close X, hamburger menu).
296
+ - Strings: Never concatenate strings. Use full-sentence templates with placeholders: `"Showing {count} of {total} results"` not `"Showing " + count + " of " + total + " results"`.
297
+ - Pluralization: Use ICU MessageFormat or equivalent. Never assume `count === 1` is the only singular rule (Arabic has 6 plural forms).
298
+
299
+ ---
300
+
301
+ ## 7. Terminology Consistency
302
+
303
+ Pick one term. Use it everywhere. Document it here.
304
+
305
+ | Use This | Not This |
306
+ |----------|----------|
307
+ | Delete | Remove, Trash, Erase, Destroy |
308
+ | Settings | Preferences, Options, Configuration |
309
+ | Sign in | Log in, Login, Sign on |
310
+ | Sign out | Log out, Logout, Sign off |
311
+ | Sign up | Register, Create account, Join |
312
+ | Search | Find, Look up, Query |
313
+ | Edit | Modify, Change, Update (in UI labels) |
314
+ | Save | Apply (for saving data, not filter application) |
315
+ | Profile | Account (for user identity page) |
316
+ | Workspace | Organization, Team, Company |
317
+ | Member | User (in team context) |
318
+ | Notification | Alert (reserve "alert" for system-level) |
319
+
320
+ ### Enforcement
321
+
322
+ - Create a glossary file in the project. Lint against it.
323
+ - When a new term is introduced, add it to the glossary before shipping.
324
+ - Search the entire codebase when renaming. Partial renames are worse than inconsistency.
325
+
326
+ ---
327
+
328
+ ## 8. Loading State Copy
329
+
330
+ Never show "Loading..." for more than 2 seconds without context.
331
+
332
+ ### Progressive Messages
333
+
334
+ ```
335
+ // Immediate (0-2s)
336
+ [spinner]
337
+
338
+ // Short wait (2-5s)
339
+ Loading your dashboard...
340
+
341
+ // Medium wait (5-15s)
342
+ Crunching the numbers. This usually takes a few seconds.
343
+
344
+ // Long wait (15s+)
345
+ Still working on it. Large datasets take a bit longer.
346
+
347
+ // Very long (30s+)
348
+ This is taking longer than usual. You can wait or [try again].
349
+ ```
350
+
351
+ ### Skeleton Screens Over Spinners
352
+
353
+ Use skeleton screens (gray placeholder shapes) for known layouts. Use spinners only for unknown or variable layouts.
354
+
355
+ ```
356
+ // Known layout: use skeleton
357
+ [====== skeleton heading ======]
358
+ [== skeleton line 1 ===========]
359
+ [== skeleton line 2 =======]
360
+ [== skeleton line 3 ==============]
361
+
362
+ // Unknown layout: use spinner with context
363
+ [spinner] Searching 12,000 records...
364
+ ```
365
+
366
+ ### Progress Indicators
367
+
368
+ For operations with known progress, show a percentage or step count.
369
+
370
+ ```
371
+ Uploading 3 of 7 files (42%)
372
+ [=========> ]
373
+
374
+ Importing contacts... Step 2 of 4: Validating email addresses
375
+ ```
376
+
377
+ ---
378
+
379
+ ## 9. Confirmation Dialogs
380
+
381
+ ### Structure
382
+
383
+ ```
384
+ Title: State what will happen (verb + object)
385
+ Body: Consequences in plain language. Irreversibility if applicable.
386
+ Actions: [Safe option] [Destructive option]
387
+ ```
388
+
389
+ ### Non-Destructive Confirmation
390
+
391
+ ```
392
+ Title: Publish this article?
393
+ Body: It will be visible to everyone in your workspace immediately.
394
+ Actions: [Go back] [Publish article]
395
+ ```
396
+
397
+ ### Destructive Confirmation
398
+
399
+ ```
400
+ Title: Delete "Q4 Report" and 3 attachments?
401
+ Body: This will permanently delete the document and its attachments.
402
+ This cannot be undone.
403
+ Actions: [Keep document] [Delete document and attachments]
404
+ ```
405
+
406
+ ### High-Stakes Destructive (Type-to-Confirm)
407
+
408
+ ```
409
+ Title: Delete workspace "Acme Corp"?
410
+ Body: This will permanently delete the workspace, all 47 projects,
411
+ and all member data. This cannot be undone.
412
+
413
+ Type "Acme Corp" to confirm:
414
+ [ ]
415
+
416
+ Actions: [Cancel] [Delete workspace] (disabled until typed)
417
+ ```
418
+
419
+ ### Rules
420
+
421
+ - The safe action (cancel/keep/go back) is the visually prominent button (filled, primary color).
422
+ - The destructive action is secondary (outlined, red text or red outline).
423
+ - Never pre-select the destructive option.
424
+ - For keyboard users, focus lands on the safe action by default.
425
+ - Escape key always triggers the safe action.
426
+
427
+ ---
428
+
429
+ ## 10. Microcopy
430
+
431
+ ### Placeholder vs Label
432
+
433
+ Placeholders vanish on input. Labels stay visible. Use both.
434
+
435
+ ```html
436
+ <!-- BAD: placeholder as only label -->
437
+ <input placeholder="Email" />
438
+
439
+ <!-- GOOD: visible label + helpful placeholder -->
440
+ <label for="email">Email address</label>
441
+ <input id="email" placeholder="name@example.com" />
442
+ ```
443
+
444
+ ### Helper Text
445
+
446
+ Place below the input. Use for format hints, constraints, or context.
447
+
448
+ ```
449
+ Password
450
+ [ ]
451
+ Must be at least 8 characters with one number and one symbol.
452
+
453
+ Phone number
454
+ [ ]
455
+ We'll only use this for two-factor authentication.
456
+ ```
457
+
458
+ ### Success Messages with Next Steps
459
+
460
+ Never dead-end a user after success. Always tell them what comes next.
461
+
462
+ ```
463
+ // BAD
464
+ Success!
465
+
466
+ // GOOD
467
+ Account created. Check your email for a verification link.
468
+
469
+ // BAD
470
+ Payment received.
471
+
472
+ // GOOD
473
+ Payment received. Your order #4821 will ship within 2 business days.
474
+ You'll get a tracking email when it does. [View order details]
475
+
476
+ // BAD
477
+ File uploaded.
478
+
479
+ // GOOD
480
+ "Q4-Report.pdf" uploaded. [Share with team] [Upload another]
481
+ ```
482
+
483
+ ### Character Counts
484
+
485
+ Show remaining characters, not total limit, and only when the user is close to the limit.
486
+
487
+ ```
488
+ // Show nothing until 80% of limit reached
489
+ // At 80%+:
490
+ 23 characters remaining
491
+
492
+ // At limit:
493
+ 0 characters remaining (input blocked or visual warning)
494
+
495
+ // Over limit (if allowed):
496
+ 12 characters over limit (red, with explanation of what happens)
497
+ ```
498
+
499
+ ### Toggle Labels
500
+
501
+ Label the current state, not the action. Or label both sides.
502
+
503
+ ```
504
+ // BAD (ambiguous: is it on or will clicking turn it on?)
505
+ [toggle] Notifications
506
+
507
+ // GOOD: label both states
508
+ Notifications: Off [toggle] On
509
+
510
+ // GOOD: describe what toggle does
511
+ [toggle] Receive email notifications
512
+ Currently: Off
513
+ ```
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: picasso
3
- version: 1.5.0
3
+ version: 2.0.0
4
4
  description: >
5
5
  The ultimate frontend design and UI engineering skill. Use this whenever the user asks to build, design, style, or improve any web interface, component, page, application, dashboard, landing page, artifact, poster, or visual output. Covers typography, color systems, spatial design, motion/animation, interaction design, responsive layouts, sound design, haptic feedback, icon systems, generative art, theming, React best practices, and DESIGN.md system generation. Also use when the user asks to audit, critique, polish, simplify, animate, or normalize a frontend. Triggers on any mention of "make it look good," "fix the design," "UI," "UX," "frontend," "component," "landing page," "dashboard," "artifact," "poster," "design system," "theme," "animation," "responsive," or any request to improve visual quality. Use this skill even when the user does not explicitly ask for design help but the task involves producing a visual interface.
6
6
  metadata:
@@ -31,6 +31,20 @@ When the user says "make it premium" or "luxury feel," drop VISUAL_DENSITY to 2-
31
31
 
32
32
  ---
33
33
 
34
+ ## Quick Start (30 seconds)
35
+
36
+ New to Picasso? Here's the minimum viable workflow:
37
+
38
+ 1. **Pick a font** that isn't Inter, Roboto, or Arial. Try: Satoshi, Cabinet Grotesk, Outfit, General Sans, Clash Display.
39
+ 2. **Pick a color** in OKLCH. Not Tailwind's default indigo. Try: `oklch(0.65 0.25 25)` (warm red), `oklch(0.55 0.20 160)` (teal), `oklch(0.60 0.22 300)` (violet).
40
+ 3. **Tint your grays** toward your accent hue. Never use pure `#808080` or `#000`.
41
+ 4. **Break the center.** Left-align content. Use asymmetric grids (2:1, 3:2). Only center heroes and CTAs.
42
+ 5. **Read `references/anti-patterns.md`** before writing any code. It's the most important file.
43
+
44
+ Then follow the full workflow below. Skip nothing.
45
+
46
+ ---
47
+
34
48
  ## Step 0: Read the Right References
35
49
 
36
50
  Before writing any code, read the reference files relevant to the task. Each covers a domain in depth with rules, examples, and anti-patterns. Load only what you need.
@@ -40,6 +54,7 @@ Before writing any code, read the reference files relevant to the task. Each cov
40
54
  | `references/typography.md` | Any task involving text, fonts, headings, or type hierarchy |
41
55
  | `references/color-and-contrast.md` | Color palettes, dark mode, accessibility, tinted neutrals |
42
56
  | `references/spatial-design.md` | Layout, spacing, grids, visual hierarchy, whitespace |
57
+ | `references/depth-and-elevation.md` | Dual shadows, layering technique, shadow scale, z-index, hover patterns |
43
58
  | `references/motion-and-animation.md` | Transitions, scroll effects, text morphing, micro-interactions |
44
59
  | `references/interaction-design.md` | Forms, focus states, loading, empty states, error handling |
45
60
  | `references/responsive-design.md` | Mobile-first, fluid, container queries, touch targets |
@@ -49,6 +64,16 @@ Before writing any code, read the reference files relevant to the task. Each cov
49
64
  | `references/design-system.md` | Generating DESIGN.md files, theming, systematic tokens |
50
65
  | `references/generative-art.md` | Algorithmic art, p5.js, seeded randomness, flow fields |
51
66
  | `references/component-patterns.md` | Standard component naming, taxonomy, and state patterns |
67
+ | `references/navigation-patterns.md` | Breadcrumbs, sidebar, tabs, bottom bar, mega menus, skip links |
68
+ | `references/tables-and-forms.md` | Sortable tables, inline editing, multi-step forms, validation |
69
+ | `references/loading-and-states.md` | Skeletons, spinners, empty states, error boundaries, offline |
70
+ | `references/dark-mode.md` | Preference hierarchy, surface elevation, transitions, testing |
71
+ | `references/images-and-media.md` | Format selection, responsive images, favicons, OG images |
72
+ | `references/micro-interactions.md` | Scroll animations, page transitions, gestures, magnetic effects |
73
+ | `references/i18n-visual-patterns.md` | RTL, logical properties, text expansion, CJK, number formatting |
74
+ | `references/brand-and-identity.md` | Logo sizing, brand color usage, consistency, lockup variants |
75
+ | `references/animation-performance.md` | Compositor-only props, will-change, layout thrashing, contain |
76
+ | `references/code-typography.md` | Monospace fonts, syntax highlighting, code blocks, diff views |
52
77
 
53
78
  ---
54
79
 
@@ -72,7 +97,7 @@ This step is non-negotiable. It takes 30 seconds and prevents hours of rework.
72
97
  - Same spacing everywhere
73
98
  - Three equal-width items in a row
74
99
 
75
- If you skip this gate, the output WILL look AI-generated. There are no exceptions.
100
+ **HALT CONDITION:** If you cannot fill out the commitments above with specific, non-default values, you MUST NOT proceed to Step 1. Go back to the references. Read anti-patterns.md. Try again. There is no "just do it" bypass for this step. The gate exists because without it, every output converges to the same generic AI aesthetic. This is not optional. No code until commitments are written.
76
101
 
77
102
  ---
78
103
 
@@ -224,6 +249,21 @@ These optional directives can be used to steer design refinement:
224
249
 
225
250
  ---
226
251
 
252
+ ## What Makes Design Feel Designed
253
+
254
+ The anti-slop gate catches what NOT to do. This section describes what good design feels like -- the positive traits to aim for.
255
+
256
+ - **Intentional asymmetry.** Not everything centered. A sidebar heavier than the main content. A grid where one card spans two rows. Deliberate imbalance creates visual interest.
257
+ - **Typographic personality.** The font choice says something about the product. A fintech app using Clash Display feels different from one using Instrument Serif. The choice is the message.
258
+ - **Color restraint with one brave moment.** A monochromatic palette with a single saturated accent on the primary CTA. The accent earns attention because everything else is quiet.
259
+ - **Depth as information architecture.** Shadows and elevation are not decoration. They tell the user what is interactive, what is background, and what demands attention right now.
260
+ - **Motion that teaches.** A staggered reveal shows the user where to look first, second, third. A hover lift says "this is clickable." Animation is communication.
261
+ - **Whitespace as confidence.** Generous spacing says the product is not desperate for attention. It trusts the content to speak for itself.
262
+
263
+ If you can describe these qualities in the output you are building, the design is probably good. If you cannot, revisit Step 1.
264
+
265
+ ---
266
+
227
267
  ## Gotchas (Real Failure Points)
228
268
 
229
269
  These are not best practices. These are things that actually break in production and that AI agents get wrong repeatedly. Each one has burned real time.
@@ -242,6 +282,22 @@ These are not best practices. These are things that actually break in production
242
282
 
243
283
  7. **Icon SVGs without `aria-hidden="true"`.** Every inline SVG icon announces itself to screen readers as "image" with no label. Decorative icons need `aria-hidden="true"`. Icons that ARE the only content (icon-only buttons) need `aria-label` on the button instead.
244
284
 
285
+ 8. **`forced-colors` mode breaks custom design.** Windows High Contrast mode (`@media (forced-colors: active)`) overrides custom focus rings, tinted neutrals, and subtle borders. Test with it. Custom focus indicators need `forced-color-adjust: none` or a `Highlight` system color fallback.
286
+
287
+ 9. **Missing `width`/`height` on images causes CLS.** Every `<img>` without explicit dimensions (or `aspect-ratio`) causes Cumulative Layout Shift when it loads. Always set dimensions or use `aspect-ratio` as a fallback. This is the #1 CLS offender in production.
288
+
289
+ 10. **Autofill styling overrides your inputs.** Browsers apply their own background color to autofilled inputs, ignoring your dark mode or custom input styles. Fix with `input:-webkit-autofill { -webkit-box-shadow: 0 0 0 1000px var(--surface-1) inset; }`.
290
+
291
+ 11. **`backdrop-filter: blur()` fails with `overflow: hidden` parent.** In some browsers (notably older Safari), `backdrop-filter` does not render if any ancestor has `overflow: hidden`. Move the blurred element outside the clipping context or restructure the DOM.
292
+
293
+ 12. **`position: fixed` breaks inside `transform` parents.** A `transform` on any ancestor creates a new containing block, making `position: fixed` behave like `position: absolute`. Move fixed elements to a body-level portal or remove the ancestor transform.
294
+
295
+ 13. **`content-visibility: auto` breaks `position: sticky`.** The `content-visibility: auto` optimization creates a new layout containment context that prevents `position: sticky` children from working. Either skip `content-visibility` on sticky containers or restructure the nesting.
296
+
297
+ 14. **`scroll-behavior: smooth` on `html` interferes with programmatic scrolling.** Setting `scroll-behavior: smooth` globally makes `scrollTo()`, `scrollIntoView()`, and anchor navigation all animate, which breaks instant programmatic jumps. Apply `scroll-behavior: smooth` per-container instead of on `<html>`.
298
+
299
+ 15. **Preset style exceptions are not contradictions.** Some presets (e.g., Swiss Modern using Archivo, or a retro terminal preset using monospace) intentionally use fonts that appear on the banned list. Presets are scoped exceptions with a clear aesthetic rationale. Do not flag them as anti-slop violations.
300
+
245
301
  ---
246
302
 
247
303
  ## The Non-Negotiables