@tickernelz/paperclip-pro-skills-catalog 2026.925.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 (76) hide show
  1. package/LICENSE +22 -0
  2. package/catalog/bundled/docs/doc-maintenance/SKILL.md +75 -0
  3. package/catalog/bundled/paperclip-operations/issue-triage/SKILL.md +74 -0
  4. package/catalog/bundled/paperclip-operations/reflection-coach/SKILL.md +202 -0
  5. package/catalog/bundled/paperclip-operations/status-card-query/SKILL.md +137 -0
  6. package/catalog/bundled/paperclip-operations/summarize-status/SKILL.md +121 -0
  7. package/catalog/bundled/paperclip-operations/task-planning/SKILL.md +84 -0
  8. package/catalog/bundled/product/paperclip-capsules/SKILL.md +99 -0
  9. package/catalog/bundled/product/paperclip-capsules/references/generator-workflows.md +120 -0
  10. package/catalog/bundled/product/paperclip-capsules/references/hero-capsule-bank.md +189 -0
  11. package/catalog/bundled/product/paperclip-capsules/references/identicon-prototyper.md +213 -0
  12. package/catalog/bundled/product/paperclip-capsules/references/individual-status-capsules.md +113 -0
  13. package/catalog/bundled/product/wireframe/SKILL.md +193 -0
  14. package/catalog/bundled/product/wireframe/assets/site-template.html +356 -0
  15. package/catalog/bundled/product/wireframe/assets/template-mobile.svg +21 -0
  16. package/catalog/bundled/product/wireframe/assets/template.svg +24 -0
  17. package/catalog/bundled/product/wireframe/references/components.md +482 -0
  18. package/catalog/bundled/product/wireframe/references/examples.md +362 -0
  19. package/catalog/bundled/product/wireframe/references/grid-system.md +107 -0
  20. package/catalog/bundled/quality/qa-acceptance/SKILL.md +93 -0
  21. package/catalog/bundled/software-development/github-pr-workflow/SKILL.md +93 -0
  22. package/catalog/optional/browser/agent-browser/SKILL.md +93 -0
  23. package/catalog/optional/content/release-announcement/SKILL.md +218 -0
  24. package/catalog/optional/content/simplified-english/SKILL.md +40 -0
  25. package/catalog/optional/finance/ramp/SKILL.md +98 -0
  26. package/catalog/optional/product/design-critique/SKILL.md +121 -0
  27. package/catalog/optional/research/last30days/catalog-ref.json +44 -0
  28. package/catalog/optional/software-development/prepare-mcp-integration/SKILL.md +230 -0
  29. package/catalog/optional/software-development/prepare-mcp-integration/examples/notion-mcp-research-gate.md +43 -0
  30. package/dist/generated/catalog.json +1165 -0
  31. package/dist/scripts/build-catalog-manifest.d.ts +2 -0
  32. package/dist/scripts/build-catalog-manifest.d.ts.map +1 -0
  33. package/dist/scripts/build-catalog-manifest.js +15 -0
  34. package/dist/scripts/build-catalog-manifest.js.map +1 -0
  35. package/dist/scripts/validate-catalog.d.ts +2 -0
  36. package/dist/scripts/validate-catalog.d.ts.map +1 -0
  37. package/dist/scripts/validate-catalog.js +15 -0
  38. package/dist/scripts/validate-catalog.js.map +1 -0
  39. package/dist/src/catalog-builder.d.ts +16 -0
  40. package/dist/src/catalog-builder.d.ts.map +1 -0
  41. package/dist/src/catalog-builder.js +688 -0
  42. package/dist/src/catalog-builder.js.map +1 -0
  43. package/dist/src/catalog-builder.test.d.ts +2 -0
  44. package/dist/src/catalog-builder.test.d.ts.map +1 -0
  45. package/dist/src/catalog-builder.test.js +355 -0
  46. package/dist/src/catalog-builder.test.js.map +1 -0
  47. package/dist/src/frontmatter.d.ts +3 -0
  48. package/dist/src/frontmatter.d.ts.map +1 -0
  49. package/dist/src/frontmatter.js +3 -0
  50. package/dist/src/frontmatter.js.map +1 -0
  51. package/dist/src/frontmatter.test.d.ts +2 -0
  52. package/dist/src/frontmatter.test.d.ts.map +1 -0
  53. package/dist/src/frontmatter.test.js +31 -0
  54. package/dist/src/frontmatter.test.js.map +1 -0
  55. package/dist/src/index.d.ts +7 -0
  56. package/dist/src/index.d.ts.map +1 -0
  57. package/dist/src/index.js +21 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/dist/src/packaged-artifacts.test.d.ts +2 -0
  60. package/dist/src/packaged-artifacts.test.d.ts.map +1 -0
  61. package/dist/src/packaged-artifacts.test.js +48 -0
  62. package/dist/src/packaged-artifacts.test.js.map +1 -0
  63. package/dist/src/release-content-cases-contract.test.d.ts +2 -0
  64. package/dist/src/release-content-cases-contract.test.d.ts.map +1 -0
  65. package/dist/src/release-content-cases-contract.test.js +37 -0
  66. package/dist/src/release-content-cases-contract.test.js.map +1 -0
  67. package/dist/src/shipped-catalog.test.d.ts +2 -0
  68. package/dist/src/shipped-catalog.test.d.ts.map +1 -0
  69. package/dist/src/shipped-catalog.test.js +179 -0
  70. package/dist/src/shipped-catalog.test.js.map +1 -0
  71. package/dist/src/types.d.ts +54 -0
  72. package/dist/src/types.d.ts.map +1 -0
  73. package/dist/src/types.js +2 -0
  74. package/dist/src/types.js.map +1 -0
  75. package/generated/catalog.json +1165 -0
  76. package/package.json +54 -0
@@ -0,0 +1,482 @@
1
+ # Component primitives
2
+
3
+ Copy these snippets directly into your SVG. Each primitive is wrapped in a `<g transform="translate(0, 0)">` so you can position it by changing the translate values. All sizes follow the 8px grid and the type scale defined in `grid-system.md`.
4
+
5
+ ## Conventions used below
6
+
7
+ - `W`, `H` placeholders mean "pick a multiple of 8 that fits your layout".
8
+ - `Label`, `Placeholder`, etc. mean "replace with the actual copy".
9
+ - The root `<svg>` is assumed to set: `font-family="-apple-system, system-ui, sans-serif" fill="#fff" stroke="#000" stroke-width="1.5"`.
10
+ - Always set `stroke="none"` on `<text>` elements.
11
+
12
+ ---
13
+
14
+ ## Inputs
15
+
16
+ ### Button (filled)
17
+
18
+ ```svg
19
+ <g transform="translate(0,0)">
20
+ <rect width="120" height="40" rx="4" fill="#000" />
21
+ <text x="60" y="25" font-size="14" text-anchor="middle" stroke="none" fill="#fff">Continue</text>
22
+ </g>
23
+ ```
24
+
25
+ ### Button (outlined / secondary)
26
+
27
+ ```svg
28
+ <g transform="translate(0,0)">
29
+ <rect width="120" height="40" rx="4" />
30
+ <text x="60" y="25" font-size="14" text-anchor="middle" stroke="none" fill="#000">Cancel</text>
31
+ </g>
32
+ ```
33
+
34
+ ### Button (icon-only square)
35
+
36
+ ```svg
37
+ <g transform="translate(0,0)">
38
+ <rect width="40" height="40" rx="4" />
39
+ <!-- glyph: a plus -->
40
+ <line x1="14" y1="20" x2="26" y2="20" />
41
+ <line x1="20" y1="14" x2="20" y2="26" />
42
+ </g>
43
+ ```
44
+
45
+ ### Text input
46
+
47
+ ```svg
48
+ <g transform="translate(0,0)">
49
+ <rect width="320" height="40" rx="4" />
50
+ <text x="12" y="25" font-size="14" stroke="none" fill="#666">Placeholder text</text>
51
+ </g>
52
+ ```
53
+
54
+ ### Search input (with magnifier)
55
+
56
+ ```svg
57
+ <g transform="translate(0,0)">
58
+ <rect width="480" height="40" rx="20" />
59
+ <circle cx="20" cy="20" r="6" />
60
+ <line x1="24" y1="24" x2="30" y2="30" />
61
+ <text x="40" y="25" font-size="14" stroke="none" fill="#666">Search…</text>
62
+ </g>
63
+ ```
64
+
65
+ ### Textarea
66
+
67
+ ```svg
68
+ <g transform="translate(0,0)">
69
+ <rect width="480" height="120" rx="4" />
70
+ <text x="12" y="24" font-size="14" stroke="none" fill="#666">Type your message…</text>
71
+ </g>
72
+ ```
73
+
74
+ ### Dropdown (collapsed)
75
+
76
+ ```svg
77
+ <g transform="translate(0,0)">
78
+ <rect width="200" height="40" rx="4" />
79
+ <text x="12" y="25" font-size="14" stroke="none" fill="#000">Selected value</text>
80
+ <!-- chevron -->
81
+ <polyline points="180,17 188,25 180,33" fill="none" />
82
+ </g>
83
+ ```
84
+
85
+ ### Checkbox (unchecked / checked)
86
+
87
+ ```svg
88
+ <!-- unchecked -->
89
+ <g transform="translate(0,0)">
90
+ <rect width="20" height="20" rx="2" />
91
+ </g>
92
+
93
+ <!-- checked -->
94
+ <g transform="translate(0,0)">
95
+ <rect width="20" height="20" rx="2" fill="#000" />
96
+ <polyline points="4,11 9,16 16,6" stroke="#fff" fill="none" />
97
+ </g>
98
+ ```
99
+
100
+ ### Radio (unselected / selected)
101
+
102
+ ```svg
103
+ <!-- unselected -->
104
+ <g transform="translate(0,0)">
105
+ <circle cx="10" cy="10" r="9" />
106
+ </g>
107
+
108
+ <!-- selected -->
109
+ <g transform="translate(0,0)">
110
+ <circle cx="10" cy="10" r="9" />
111
+ <circle cx="10" cy="10" r="4" fill="#000" />
112
+ </g>
113
+ ```
114
+
115
+ ### Toggle (off / on)
116
+
117
+ ```svg
118
+ <!-- off -->
119
+ <g transform="translate(0,0)">
120
+ <rect width="40" height="20" rx="10" />
121
+ <circle cx="10" cy="10" r="6" fill="#000" />
122
+ </g>
123
+
124
+ <!-- on -->
125
+ <g transform="translate(0,0)">
126
+ <rect width="40" height="20" rx="10" fill="#000" />
127
+ <circle cx="30" cy="10" r="6" fill="#fff" />
128
+ </g>
129
+ ```
130
+
131
+ ### Form field (label + input + help)
132
+
133
+ ```svg
134
+ <g transform="translate(0,0)">
135
+ <text x="0" y="14" font-size="14" font-weight="600" stroke="none" fill="#000">Email address</text>
136
+ <g transform="translate(0,24)">
137
+ <rect width="320" height="40" rx="4" />
138
+ <text x="12" y="25" font-size="14" stroke="none" fill="#666">you@example.com</text>
139
+ </g>
140
+ <text x="0" y="84" font-size="12" stroke="none" fill="#666">We'll never share this with anyone.</text>
141
+ </g>
142
+ ```
143
+
144
+ ---
145
+
146
+ ## Layout
147
+
148
+ ### Card
149
+
150
+ ```svg
151
+ <g transform="translate(0,0)">
152
+ <rect width="384" height="200" rx="6" />
153
+ <text x="24" y="40" font-size="20" font-weight="600" stroke="none" fill="#000">Card title</text>
154
+ <text x="24" y="68" font-size="14" stroke="none" fill="#666">Supporting copy goes here.</text>
155
+ <line x1="0" y1="160" x2="384" y2="160" />
156
+ <text x="24" y="184" font-size="14" stroke="none" fill="#000">Footer action</text>
157
+ </g>
158
+ ```
159
+
160
+ ### Section divider
161
+
162
+ ```svg
163
+ <g transform="translate(0,0)">
164
+ <line x1="0" y1="0" x2="1184" y2="0" stroke="#666" />
165
+ </g>
166
+ ```
167
+
168
+ ### Two-column split (60 / 40)
169
+
170
+ ```svg
171
+ <g transform="translate(0,0)">
172
+ <rect width="704" height="400" />
173
+ <rect x="728" width="456" height="400" />
174
+ </g>
175
+ ```
176
+
177
+ ---
178
+
179
+ ## Navigation
180
+
181
+ ### Navbar (top)
182
+
183
+ ```svg
184
+ <g transform="translate(0,0)">
185
+ <rect width="1280" height="64" />
186
+ <!-- logo placeholder -->
187
+ <rect x="24" y="16" width="32" height="32" rx="4" fill="#e6e6e6" />
188
+ <!-- nav items -->
189
+ <text x="80" y="40" font-size="14" stroke="none" fill="#000">Dashboard</text>
190
+ <text x="184" y="40" font-size="14" stroke="none" fill="#666">Projects</text>
191
+ <text x="272" y="40" font-size="14" stroke="none" fill="#666">Reports</text>
192
+ <text x="352" y="40" font-size="14" stroke="none" fill="#666">Settings</text>
193
+ <!-- right side: avatar -->
194
+ <circle cx="1240" cy="32" r="16" fill="#e6e6e6" />
195
+ </g>
196
+ ```
197
+
198
+ ### Sidebar nav
199
+
200
+ ```svg
201
+ <g transform="translate(0,0)">
202
+ <rect width="240" height="800" />
203
+ <text x="24" y="40" font-size="20" font-weight="600" stroke="none" fill="#000">App</text>
204
+ <!-- active item -->
205
+ <rect x="0" y="80" width="240" height="40" fill="#e6e6e6" />
206
+ <text x="24" y="105" font-size="14" stroke="none" fill="#000">Dashboard</text>
207
+ <!-- inactive items -->
208
+ <text x="24" y="153" font-size="14" stroke="none" fill="#666">Projects</text>
209
+ <text x="24" y="201" font-size="14" stroke="none" fill="#666">Reports</text>
210
+ <text x="24" y="249" font-size="14" stroke="none" fill="#666">Team</text>
211
+ <text x="24" y="297" font-size="14" stroke="none" fill="#666">Settings</text>
212
+ </g>
213
+ ```
214
+
215
+ ### Tab bar
216
+
217
+ ```svg
218
+ <g transform="translate(0,0)">
219
+ <line x1="0" y1="48" x2="640" y2="48" />
220
+ <!-- active tab -->
221
+ <text x="24" y="32" font-size="14" font-weight="600" stroke="none" fill="#000">Overview</text>
222
+ <line x1="16" y1="48" x2="104" y2="48" stroke-width="3" />
223
+ <!-- inactive tabs -->
224
+ <text x="136" y="32" font-size="14" stroke="none" fill="#666">Activity</text>
225
+ <text x="232" y="32" font-size="14" stroke="none" fill="#666">Members</text>
226
+ <text x="328" y="32" font-size="14" stroke="none" fill="#666">Settings</text>
227
+ </g>
228
+ ```
229
+
230
+ ### Breadcrumb
231
+
232
+ ```svg
233
+ <g transform="translate(0,0)">
234
+ <text x="0" y="14" font-size="14" stroke="none" fill="#666">Workspace</text>
235
+ <text x="80" y="14" font-size="14" stroke="none" fill="#666">/</text>
236
+ <text x="96" y="14" font-size="14" stroke="none" fill="#666">Projects</text>
237
+ <text x="160" y="14" font-size="14" stroke="none" fill="#666">/</text>
238
+ <text x="176" y="14" font-size="14" font-weight="600" stroke="none" fill="#000">Project name</text>
239
+ </g>
240
+ ```
241
+
242
+ ### Pagination
243
+
244
+ ```svg
245
+ <g transform="translate(0,0)">
246
+ <rect width="32" height="32" />
247
+ <text x="16" y="21" font-size="14" text-anchor="middle" stroke="none" fill="#666">‹</text>
248
+ <rect x="40" width="32" height="32" fill="#000" />
249
+ <text x="56" y="21" font-size="14" text-anchor="middle" stroke="none" fill="#fff">1</text>
250
+ <rect x="80" width="32" height="32" />
251
+ <text x="96" y="21" font-size="14" text-anchor="middle" stroke="none" fill="#000">2</text>
252
+ <rect x="120" width="32" height="32" />
253
+ <text x="136" y="21" font-size="14" text-anchor="middle" stroke="none" fill="#000">3</text>
254
+ <rect x="160" width="32" height="32" />
255
+ <text x="176" y="21" font-size="14" text-anchor="middle" stroke="none" fill="#666">›</text>
256
+ </g>
257
+ ```
258
+
259
+ ---
260
+
261
+ ## Content
262
+
263
+ ### Heading
264
+
265
+ ```svg
266
+ <text x="0" y="28" font-size="28" font-weight="700" stroke="none" fill="#000">Page title</text>
267
+ ```
268
+
269
+ ### Section heading
270
+
271
+ ```svg
272
+ <text x="0" y="20" font-size="20" font-weight="600" stroke="none" fill="#000">Section</text>
273
+ ```
274
+
275
+ ### Paragraph block (placeholder lines)
276
+
277
+ ```svg
278
+ <g transform="translate(0,0)">
279
+ <line x1="0" y1="8" x2="480" y2="8" stroke="#666" />
280
+ <line x1="0" y1="24" x2="480" y2="24" stroke="#666" />
281
+ <line x1="0" y1="40" x2="320" y2="40" stroke="#666" />
282
+ </g>
283
+ ```
284
+
285
+ ### List row (avatar + title + subtitle + chevron)
286
+
287
+ ```svg
288
+ <g transform="translate(0,0)">
289
+ <rect width="800" height="56" />
290
+ <circle cx="32" cy="28" r="16" fill="#e6e6e6" />
291
+ <text x="64" y="24" font-size="14" font-weight="600" stroke="none" fill="#000">Primary text</text>
292
+ <text x="64" y="40" font-size="12" stroke="none" fill="#666">Secondary text</text>
293
+ <polyline points="772,20 780,28 772,36" fill="none" />
294
+ </g>
295
+ ```
296
+
297
+ ### Table
298
+
299
+ ```svg
300
+ <g transform="translate(0,0)">
301
+ <!-- header -->
302
+ <rect width="800" height="48" fill="#f4f4f4" />
303
+ <text x="16" y="30" font-size="12" font-weight="600" stroke="none" fill="#000">Name</text>
304
+ <text x="280" y="30" font-size="12" font-weight="600" stroke="none" fill="#000">Status</text>
305
+ <text x="480" y="30" font-size="12" font-weight="600" stroke="none" fill="#000">Updated</text>
306
+ <text x="680" y="30" font-size="12" font-weight="600" stroke="none" fill="#000">Owner</text>
307
+
308
+ <!-- rows -->
309
+ <g transform="translate(0,48)">
310
+ <rect width="800" height="48" />
311
+ <text x="16" y="30" font-size="14" stroke="none" fill="#000">Row title 1</text>
312
+ <text x="280" y="30" font-size="14" stroke="none" fill="#666">Active</text>
313
+ <text x="480" y="30" font-size="14" stroke="none" fill="#666">2h ago</text>
314
+ <text x="680" y="30" font-size="14" stroke="none" fill="#666">Alex</text>
315
+ </g>
316
+ <g transform="translate(0,96)">
317
+ <rect width="800" height="48" />
318
+ <text x="16" y="30" font-size="14" stroke="none" fill="#000">Row title 2</text>
319
+ <text x="280" y="30" font-size="14" stroke="none" fill="#666">Pending</text>
320
+ <text x="480" y="30" font-size="14" stroke="none" fill="#666">5h ago</text>
321
+ <text x="680" y="30" font-size="14" stroke="none" fill="#666">Sam</text>
322
+ </g>
323
+ </g>
324
+ ```
325
+
326
+ ### Key-value pair
327
+
328
+ ```svg
329
+ <g transform="translate(0,0)">
330
+ <text x="0" y="14" font-size="12" stroke="none" fill="#666">Created</text>
331
+ <text x="0" y="34" font-size="14" stroke="none" fill="#000">Mar 12, 2026</text>
332
+ </g>
333
+ ```
334
+
335
+ ### Metric tile
336
+
337
+ ```svg
338
+ <g transform="translate(0,0)">
339
+ <rect width="240" height="120" rx="6" />
340
+ <text x="24" y="40" font-size="12" stroke="none" fill="#666">Active users</text>
341
+ <text x="24" y="80" font-size="28" font-weight="700" stroke="none" fill="#000">1,284</text>
342
+ <text x="24" y="104" font-size="12" stroke="none" fill="#666">+12% vs last week</text>
343
+ </g>
344
+ ```
345
+
346
+ ---
347
+
348
+ ## Media
349
+
350
+ ### Image placeholder (with diagonal cross)
351
+
352
+ ```svg
353
+ <g transform="translate(0,0)">
354
+ <rect width="240" height="160" fill="#e6e6e6" />
355
+ <line x1="0" y1="0" x2="240" y2="160" stroke="#666" />
356
+ <line x1="240" y1="0" x2="0" y2="160" stroke="#666" />
357
+ </g>
358
+ ```
359
+
360
+ ### Avatar (circular, with cross)
361
+
362
+ ```svg
363
+ <g transform="translate(0,0)">
364
+ <circle cx="24" cy="24" r="24" fill="#e6e6e6" />
365
+ <line x1="7" y1="7" x2="41" y2="41" stroke="#666" />
366
+ <line x1="41" y1="7" x2="7" y2="41" stroke="#666" />
367
+ </g>
368
+ ```
369
+
370
+ ### Video placeholder (image + play triangle)
371
+
372
+ ```svg
373
+ <g transform="translate(0,0)">
374
+ <rect width="320" height="180" fill="#e6e6e6" />
375
+ <line x1="0" y1="0" x2="320" y2="180" stroke="#666" />
376
+ <line x1="320" y1="0" x2="0" y2="180" stroke="#666" />
377
+ <circle cx="160" cy="90" r="32" fill="#fff" />
378
+ <polygon points="150,76 150,104 178,90" fill="#000" stroke="none" />
379
+ </g>
380
+ ```
381
+
382
+ ---
383
+
384
+ ## Overlay
385
+
386
+ ### Modal (with backdrop)
387
+
388
+ ```svg
389
+ <!-- backdrop dims the canvas; render this inside an SVG that already has the underlying screen -->
390
+ <rect x="0" y="0" width="1280" height="800" fill="#000" fill-opacity="0.4" stroke="none" />
391
+
392
+ <g transform="translate(320, 200)">
393
+ <rect width="640" height="400" rx="6" />
394
+ <text x="24" y="48" font-size="20" font-weight="600" stroke="none" fill="#000">Confirm action</text>
395
+ <line x1="0" y1="72" x2="640" y2="72" />
396
+ <text x="24" y="112" font-size="14" stroke="none" fill="#000">Body copy goes here describing what's about to happen.</text>
397
+ <line x1="0" y1="328" x2="640" y2="328" />
398
+ <!-- footer actions -->
399
+ <g transform="translate(384, 348)">
400
+ <rect width="120" height="40" rx="4" />
401
+ <text x="60" y="25" font-size="14" text-anchor="middle" stroke="none" fill="#000">Cancel</text>
402
+ </g>
403
+ <g transform="translate(512, 348)">
404
+ <rect width="104" height="40" rx="4" fill="#000" />
405
+ <text x="52" y="25" font-size="14" text-anchor="middle" stroke="none" fill="#fff">Confirm</text>
406
+ </g>
407
+ </g>
408
+ ```
409
+
410
+ ### Toast
411
+
412
+ ```svg
413
+ <g transform="translate(0,0)">
414
+ <rect width="320" height="56" rx="6" fill="#000" />
415
+ <text x="24" y="34" font-size="14" stroke="none" fill="#fff">Saved successfully</text>
416
+ <text x="280" y="34" font-size="14" stroke="none" fill="#fff">×</text>
417
+ </g>
418
+ ```
419
+
420
+ ### Tooltip
421
+
422
+ ```svg
423
+ <g transform="translate(0,0)">
424
+ <rect width="160" height="32" rx="4" fill="#000" />
425
+ <text x="80" y="20" font-size="12" text-anchor="middle" stroke="none" fill="#fff">Helpful explanation</text>
426
+ <polygon points="76,32 80,40 84,32" fill="#000" stroke="none" />
427
+ </g>
428
+ ```
429
+
430
+ ### Dropdown menu (open state)
431
+
432
+ ```svg
433
+ <g transform="translate(0,0)">
434
+ <rect width="200" height="160" rx="4" />
435
+ <text x="16" y="28" font-size="14" stroke="none" fill="#000">Menu item one</text>
436
+ <text x="16" y="60" font-size="14" stroke="none" fill="#000">Menu item two</text>
437
+ <text x="16" y="92" font-size="14" stroke="none" fill="#000">Menu item three</text>
438
+ <line x1="0" y1="108" x2="200" y2="108" />
439
+ <text x="16" y="136" font-size="14" stroke="none" fill="#000">Sign out</text>
440
+ </g>
441
+ ```
442
+
443
+ ---
444
+
445
+ ## Annotation layer
446
+
447
+ Use these for callouts and reviewer notes. Render them in a final `<g data-region="annotations">` so reviewers can hide them by toggling the group.
448
+
449
+ ### Numbered callout
450
+
451
+ ```svg
452
+ <g transform="translate(0,0)">
453
+ <circle cx="0" cy="0" r="12" fill="#fff" stroke="#d33" stroke-dasharray="4 2" />
454
+ <text x="0" y="4" font-size="12" font-weight="700" text-anchor="middle" stroke="none" fill="#d33">1</text>
455
+ </g>
456
+ ```
457
+
458
+ ### Dashed region highlight
459
+
460
+ ```svg
461
+ <rect x="0" y="0" width="240" height="120" fill="none" stroke="#d33" stroke-dasharray="6 3" />
462
+ ```
463
+
464
+ ### Arrow connector (between two screens)
465
+
466
+ ```svg
467
+ <g transform="translate(0,0)">
468
+ <line x1="0" y1="0" x2="120" y2="0" stroke="#000" />
469
+ <polygon points="120,0 110,-6 110,6" fill="#000" stroke="none" />
470
+ </g>
471
+ ```
472
+
473
+ ---
474
+
475
+ ## Common composition mistakes (avoid)
476
+
477
+ - **Text with halo:** forgetting `stroke="none"` on `<text>`. The text inherits the parent stroke.
478
+ - **Off-grid coordinates:** values like `x="37"` instead of `x="40"`. Snap everything to multiples of 8.
479
+ - **Solid fills sneaking in:** anything other than `#fff`, `#e6e6e6`, `#f4f4f4`, or `#000` is a mistake.
480
+ - **Multiple typefaces:** stick to one font-family across the whole file.
481
+ - **Annotation colour bleeding into UI:** `#d33` only ever appears inside the annotation `<g>`.
482
+ - **Missing `viewBox`:** without it, the SVG won't scale when embedded in different containers.