@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.
- package/LICENSE +22 -0
- package/catalog/bundled/docs/doc-maintenance/SKILL.md +75 -0
- package/catalog/bundled/paperclip-operations/issue-triage/SKILL.md +74 -0
- package/catalog/bundled/paperclip-operations/reflection-coach/SKILL.md +202 -0
- package/catalog/bundled/paperclip-operations/status-card-query/SKILL.md +137 -0
- package/catalog/bundled/paperclip-operations/summarize-status/SKILL.md +121 -0
- package/catalog/bundled/paperclip-operations/task-planning/SKILL.md +84 -0
- package/catalog/bundled/product/paperclip-capsules/SKILL.md +99 -0
- package/catalog/bundled/product/paperclip-capsules/references/generator-workflows.md +120 -0
- package/catalog/bundled/product/paperclip-capsules/references/hero-capsule-bank.md +189 -0
- package/catalog/bundled/product/paperclip-capsules/references/identicon-prototyper.md +213 -0
- package/catalog/bundled/product/paperclip-capsules/references/individual-status-capsules.md +113 -0
- package/catalog/bundled/product/wireframe/SKILL.md +193 -0
- package/catalog/bundled/product/wireframe/assets/site-template.html +356 -0
- package/catalog/bundled/product/wireframe/assets/template-mobile.svg +21 -0
- package/catalog/bundled/product/wireframe/assets/template.svg +24 -0
- package/catalog/bundled/product/wireframe/references/components.md +482 -0
- package/catalog/bundled/product/wireframe/references/examples.md +362 -0
- package/catalog/bundled/product/wireframe/references/grid-system.md +107 -0
- package/catalog/bundled/quality/qa-acceptance/SKILL.md +93 -0
- package/catalog/bundled/software-development/github-pr-workflow/SKILL.md +93 -0
- package/catalog/optional/browser/agent-browser/SKILL.md +93 -0
- package/catalog/optional/content/release-announcement/SKILL.md +218 -0
- package/catalog/optional/content/simplified-english/SKILL.md +40 -0
- package/catalog/optional/finance/ramp/SKILL.md +98 -0
- package/catalog/optional/product/design-critique/SKILL.md +121 -0
- package/catalog/optional/research/last30days/catalog-ref.json +44 -0
- package/catalog/optional/software-development/prepare-mcp-integration/SKILL.md +230 -0
- package/catalog/optional/software-development/prepare-mcp-integration/examples/notion-mcp-research-gate.md +43 -0
- package/dist/generated/catalog.json +1165 -0
- package/dist/scripts/build-catalog-manifest.d.ts +2 -0
- package/dist/scripts/build-catalog-manifest.d.ts.map +1 -0
- package/dist/scripts/build-catalog-manifest.js +15 -0
- package/dist/scripts/build-catalog-manifest.js.map +1 -0
- package/dist/scripts/validate-catalog.d.ts +2 -0
- package/dist/scripts/validate-catalog.d.ts.map +1 -0
- package/dist/scripts/validate-catalog.js +15 -0
- package/dist/scripts/validate-catalog.js.map +1 -0
- package/dist/src/catalog-builder.d.ts +16 -0
- package/dist/src/catalog-builder.d.ts.map +1 -0
- package/dist/src/catalog-builder.js +688 -0
- package/dist/src/catalog-builder.js.map +1 -0
- package/dist/src/catalog-builder.test.d.ts +2 -0
- package/dist/src/catalog-builder.test.d.ts.map +1 -0
- package/dist/src/catalog-builder.test.js +355 -0
- package/dist/src/catalog-builder.test.js.map +1 -0
- package/dist/src/frontmatter.d.ts +3 -0
- package/dist/src/frontmatter.d.ts.map +1 -0
- package/dist/src/frontmatter.js +3 -0
- package/dist/src/frontmatter.js.map +1 -0
- package/dist/src/frontmatter.test.d.ts +2 -0
- package/dist/src/frontmatter.test.d.ts.map +1 -0
- package/dist/src/frontmatter.test.js +31 -0
- package/dist/src/frontmatter.test.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/packaged-artifacts.test.d.ts +2 -0
- package/dist/src/packaged-artifacts.test.d.ts.map +1 -0
- package/dist/src/packaged-artifacts.test.js +48 -0
- package/dist/src/packaged-artifacts.test.js.map +1 -0
- package/dist/src/release-content-cases-contract.test.d.ts +2 -0
- package/dist/src/release-content-cases-contract.test.d.ts.map +1 -0
- package/dist/src/release-content-cases-contract.test.js +37 -0
- package/dist/src/release-content-cases-contract.test.js.map +1 -0
- package/dist/src/shipped-catalog.test.d.ts +2 -0
- package/dist/src/shipped-catalog.test.d.ts.map +1 -0
- package/dist/src/shipped-catalog.test.js +179 -0
- package/dist/src/shipped-catalog.test.js.map +1 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/generated/catalog.json +1165 -0
- 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.
|