picasso-skill 2.5.0 → 2.6.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.
@@ -20,38 +20,16 @@ Never use generic labels. Every button tells the user exactly what will happen.
20
20
 
21
21
  ### Pattern: Verb + Object
22
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
- ```
23
+ `Save changes`, `Create account`, `Delete 3 items`, `Export as PDF`, `Send invitation`, `Publish post`
33
24
 
34
25
  ### Destructive Actions: Name the Destruction + Show Count
35
26
 
36
27
  ```
37
- // BAD
38
- Are you sure? [Yes] [No]
39
-
40
- // GOOD
41
28
  Delete 14 messages permanently?
42
29
  This cannot be undone.
43
30
  [Keep messages] [Delete 14 messages]
44
31
  ```
45
32
 
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
33
  ### Paired Button Rules
56
34
 
57
35
  | Scenario | Primary | Secondary |
@@ -72,57 +50,20 @@ The safe/non-destructive action is always visually more prominent (filled button
72
50
 
73
51
  Every error message has three parts. Never skip "how to fix."
74
52
 
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
- ```
53
+ **Templates by type:**
54
+ - **Format error**: State what's wrong, show correct format, action to fix
55
+ - **Missing field**: Name the field, explain what's needed for context
56
+ - **Permission denied**: Explain who can do this, offer request access or go back
57
+ - **Network error**: Suggest checking connection, confirm data is saved locally
58
+ - **Server error (5xx)**: Acknowledge it's your fault, confirm data is safe, offer retry + support
59
+ - **Rate limit**: Show countdown timer, auto-enable retry button
118
60
 
119
61
  ### Rules
120
-
121
62
  - 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.
63
+ - Never use error codes alone. Always pair with human language.
64
+ - Never use "Oops!" or humor in error states.
65
+ - Place errors inline next to the field, not in a disappearing toast.
66
+ - Use red for error borders/icons, not for the entire message text.
126
67
 
127
68
  ---
128
69
 
@@ -131,49 +72,24 @@ Action: [auto-countdown button: "Try again in 28s"]
131
72
  ### Formula: Acknowledge + Explain Value + Action CTA + Optional Help
132
73
 
133
74
  ```
134
- // Project list empty state
135
-
136
- [illustration or icon]
137
-
138
75
  No projects yet
139
76
  Projects help you organize work, track progress, and collaborate with your team.
140
-
141
77
  [Create your first project]
142
-
143
78
  Need help getting started? Read the quick-start guide.
144
79
  ```
145
80
 
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
81
  ### 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.
82
+ - Keep acknowledgment to one short line
83
+ - Value proposition answers "why would I want things here?"
84
+ - CTA uses verb+object pattern
85
+ - Help links open in context, never navigate away
86
+ - Never show a completely blank screen
171
87
 
172
88
  ---
173
89
 
174
90
  ## 4. Voice vs Tone
175
91
 
176
- **Voice** is the personality. It never changes. Define it once.
92
+ **Voice** is the personality (never changes): Clear, Confident, Helpful, Human.
177
93
 
178
94
  | Voice Attribute | Means | Does Not Mean |
179
95
  |----------------|-------|---------------|
@@ -182,96 +98,38 @@ Completed tasks will appear here as your team finishes work.
182
98
  | Helpful | Guides next step, anticipates needs | Condescending or hand-holding |
183
99
  | Human | Natural phrasing, contractions OK | Slang, jokes, or emoji in UI text |
184
100
 
185
- **Tone** adapts to the moment.
101
+ **Tone** adapts to the moment:
186
102
 
187
103
  | Moment | Tone | Example |
188
104
  |--------|------|---------|
189
105
  | Success | Warm, encouraging | "Your account is ready. Let's set up your first project." |
190
106
  | 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." |
107
+ | Destructive | Serious, precise | "This will permanently delete 14 messages. This cannot be undone." |
192
108
  | Onboarding | Friendly, guiding | "Welcome. We'll walk you through the basics in about 2 minutes." |
193
109
  | Empty state | Neutral, inviting | "No notifications yet. You'll see updates from your team here." |
194
110
 
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.
111
+ Never use humor in error states, destructive actions, or security messages.
198
112
 
199
113
  ---
200
114
 
201
115
  ## 5. Accessibility Writing
202
116
 
203
117
  ### 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
- ```
118
+ Links must make sense when read alone (screen readers navigate by link list). "View our pricing plans" not "click here."
220
119
 
221
120
  ### 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.
121
+ Describe the information the image conveys, not the image itself. If the image were deleted, what information would be lost? That is your alt text. Use `alt=""` for purely decorative images.
238
122
 
239
123
  ### 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
- ```
124
+ Every icon-only button needs `aria-label`. Pair with `title` for sighted users.
255
125
 
256
126
  ### 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
- ```
127
+ Every input has a visible `<label>`. Placeholder text is not a label. Use both.
268
128
 
269
129
  ---
270
130
 
271
131
  ## 6. Translation Planning
272
132
 
273
- English is compact. Other languages expand. Design with this in mind.
274
-
275
133
  ### Expansion Percentages
276
134
 
277
135
  | Language | Expansion | 10-char English becomes |
@@ -279,235 +137,87 @@ English is compact. Other languages expand. Design with this in mind.
279
137
  | German | +30% | ~13 characters |
280
138
  | French | +20% | ~12 characters |
281
139
  | Finnish | +30-40% | ~13-14 characters |
282
- | Italian | +15% | ~11-12 characters |
283
140
  | Spanish | +15-20% | ~12 characters |
284
- | Portuguese | +20-25% | ~12-13 characters |
285
141
  | Chinese | -30% | ~7 characters |
286
- | Japanese | -20-30% | ~7-8 characters |
287
- | Korean | -10-20% | ~8-9 characters |
288
142
  | Arabic | +25% (RTL) | ~12-13 characters |
289
143
 
290
144
  ### 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).
145
+ - Buttons: allow at least 30% extra width, never fixed-width for text
146
+ - Use pseudolocalization to test
147
+ - Truncate with `...` + `title` attribute for full text
148
+ - Never concatenate strings; use full-sentence templates with placeholders
149
+ - Use ICU MessageFormat for pluralization (Arabic has 6 plural forms)
298
150
 
299
151
  ---
300
152
 
301
153
  ## 7. Terminology Consistency
302
154
 
303
- Pick one term. Use it everywhere. Document it here.
155
+ Pick one term. Use it everywhere.
304
156
 
305
157
  | Use This | Not This |
306
158
  |----------|----------|
307
- | Delete | Remove, Trash, Erase, Destroy |
159
+ | Delete | Remove, Trash, Erase |
308
160
  | 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 |
161
+ | Sign in | Log in, Login |
162
+ | Sign out | Log out, Logout |
163
+ | Sign up | Register, Create account |
164
+ | Search | Find, Look up |
165
+ | Edit | Modify, Change, Update |
166
+ | Save | Apply |
167
+ | Profile | Account |
168
+ | Workspace | Organization, Team |
317
169
  | Member | User (in team context) |
318
- | Notification | Alert (reserve "alert" for system-level) |
319
-
320
- ### Enforcement
170
+ | Notification | Alert (reserve for system-level) |
321
171
 
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.
172
+ Create a glossary. Lint against it. Search entire codebase when renaming.
325
173
 
326
174
  ---
327
175
 
328
176
  ## 8. Loading State Copy
329
177
 
330
- Never show "Loading..." for more than 2 seconds without context.
331
-
332
178
  ### Progressive Messages
179
+ - **0-2s**: Spinner only (no text)
180
+ - **2-5s**: "Loading your dashboard..."
181
+ - **5-15s**: "Crunching the numbers. This usually takes a few seconds."
182
+ - **15s+**: "Still working on it. Large datasets take a bit longer."
183
+ - **30s+**: "This is taking longer than usual. You can wait or [try again]."
333
184
 
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
- ```
185
+ Use skeleton screens for known layouts, spinners for unknown/variable layouts. For operations with known progress, show percentage or step count.
376
186
 
377
187
  ---
378
188
 
379
189
  ## 9. Confirmation Dialogs
380
190
 
381
191
  ### 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
- ```
192
+ - **Title**: State what will happen (verb + object)
193
+ - **Body**: Consequences in plain language. Irreversibility if applicable.
194
+ - **Actions**: [Safe option] [Destructive option]
418
195
 
419
196
  ### 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.
197
+ - Safe action is visually prominent (filled, primary color)
198
+ - Destructive action is secondary (outlined, red)
199
+ - Never pre-select the destructive option
200
+ - Focus lands on the safe action by default
201
+ - Escape key triggers the safe action
202
+ - For high-stakes destructive actions, require type-to-confirm
426
203
 
427
204
  ---
428
205
 
429
206
  ## 10. Microcopy
430
207
 
431
208
  ### 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
- ```
209
+ Placeholders vanish on input. Labels stay visible. Use both: visible `<label>` + helpful placeholder example.
443
210
 
444
211
  ### 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
- ```
212
+ Place below input. Format hints, constraints, or context: "Must be at least 8 characters with one number and one symbol."
457
213
 
458
214
  ### 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
- ```
215
+ Never dead-end after success. Always tell what comes next:
216
+ - "Account created. Check your email for a verification link."
217
+ - "Payment received. Your order #4821 will ship within 2 business days. [View order details]"
482
218
 
483
219
  ### 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
- ```
220
+ Show remaining characters (not total limit), and only when 80%+ of limit reached.
498
221
 
499
222
  ### 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
- ```
223
+ Label the current state, not the action. Or label both sides: `Notifications: Off [toggle] On`.