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.
- package/agents/picasso.md +14 -2
- package/checklists/pre-ship.md +83 -0
- package/commands/backlog.md +34 -0
- package/commands/variants.md +18 -0
- package/package.json +3 -1
- package/references/accessibility-wcag.md +245 -0
- package/references/anti-patterns.md +184 -0
- package/references/color-and-contrast.md +477 -0
- package/references/component-patterns.md +113 -0
- package/references/conversion-design.md +193 -0
- package/references/data-visualization.md +226 -0
- package/references/depth-and-elevation.md +211 -0
- package/references/design-system.md +176 -0
- package/references/generative-art.md +648 -0
- package/references/interaction-design.md +162 -0
- package/references/modern-css-performance.md +361 -0
- package/references/motion-and-animation.md +267 -0
- package/references/performance-optimization.md +746 -0
- package/references/react-patterns.md +318 -0
- package/references/responsive-design.md +452 -0
- package/references/sensory-design.md +369 -0
- package/references/spatial-design.md +176 -0
- package/references/style-presets.md +502 -0
- package/references/tools-catalog.md +103 -0
- package/references/typography.md +415 -0
- package/references/ux-psychology.md +235 -0
- package/references/ux-writing.md +513 -0
- package/skills/picasso/SKILL.md +58 -2
- package/skills/picasso/references/animation-performance.md +244 -0
- package/skills/picasso/references/brand-and-identity.md +136 -0
- package/skills/picasso/references/code-typography.md +222 -0
- package/skills/picasso/references/color-and-contrast.md +56 -2
- package/skills/picasso/references/dark-mode.md +199 -0
- package/skills/picasso/references/depth-and-elevation.md +211 -0
- package/skills/picasso/references/i18n-visual-patterns.md +177 -0
- package/skills/picasso/references/images-and-media.md +222 -0
- package/skills/picasso/references/loading-and-states.md +258 -0
- package/skills/picasso/references/micro-interactions.md +291 -0
- package/skills/picasso/references/motion-and-animation.md +9 -2
- package/skills/picasso/references/navigation-patterns.md +247 -0
- package/skills/picasso/references/style-presets.md +1 -1
- package/skills/picasso/references/tables-and-forms.md +227 -0
- package/skills/picasso/references/tools-catalog.md +103 -0
- 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
|
+
```
|
package/skills/picasso/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: picasso
|
|
3
|
-
version:
|
|
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
|
|
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
|