mcp-probe-kit 3.0.19 → 3.0.22

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 (81) hide show
  1. package/README.md +12 -5
  2. package/build/index.js +3 -1
  3. package/build/lib/__tests__/agents-md-template.unit.test.js +2 -0
  4. package/build/lib/__tests__/memory-config.unit.test.js +9 -0
  5. package/build/lib/__tests__/memory-injection.unit.test.d.ts +1 -0
  6. package/build/lib/__tests__/memory-injection.unit.test.js +51 -0
  7. package/build/lib/__tests__/memory-orchestration.unit.test.d.ts +1 -0
  8. package/build/lib/__tests__/memory-orchestration.unit.test.js +84 -0
  9. package/build/lib/__tests__/memory-payload.unit.test.d.ts +1 -0
  10. package/build/lib/__tests__/memory-payload.unit.test.js +35 -0
  11. package/build/lib/agents-md-template.js +7 -5
  12. package/build/lib/memory-client.d.ts +8 -1
  13. package/build/lib/memory-client.js +53 -44
  14. package/build/lib/memory-config.d.ts +8 -0
  15. package/build/lib/memory-config.js +19 -0
  16. package/build/lib/memory-orchestration.d.ts +7 -2
  17. package/build/lib/memory-orchestration.js +81 -8
  18. package/build/lib/memory-payload.d.ts +21 -0
  19. package/build/lib/memory-payload.js +65 -0
  20. package/build/lib/shadcn-ui.d.ts +11 -0
  21. package/build/lib/shadcn-ui.js +78 -0
  22. package/build/resources/ui-ux-data/guidelines/vercel-web-interface.json +1632 -0
  23. package/build/resources/ui-ux-data/metadata.json +27 -3
  24. package/build/resources/ui-ux-data/shadcn/blocks.json +2541 -0
  25. package/build/resources/ui-ux-data/shadcn/components.json +997 -0
  26. package/build/resources/ui-ux-data/themes/presets.json +483 -0
  27. package/build/schemas/index.d.ts +38 -9
  28. package/build/schemas/memory-tools.d.ts +38 -9
  29. package/build/schemas/memory-tools.js +24 -9
  30. package/build/schemas/output/ui-ux-tools.d.ts +16 -0
  31. package/build/schemas/output/ui-ux-tools.js +4 -0
  32. package/build/schemas/ui-ux-schemas.js +3 -3
  33. package/build/tools/__tests__/start_ui.property.test.js +4 -3
  34. package/build/tools/index.d.ts +1 -0
  35. package/build/tools/index.js +1 -0
  36. package/build/tools/memorize_asset.js +12 -0
  37. package/build/tools/scan_and_extract_patterns.js +7 -7
  38. package/build/tools/search_memory.d.ts +7 -0
  39. package/build/tools/search_memory.js +57 -0
  40. package/build/tools/start_bugfix.js +3 -3
  41. package/build/tools/start_feature.js +3 -3
  42. package/build/tools/start_ui.js +33 -6
  43. package/build/tools/ui-ux-tools.js +322 -244
  44. package/build/utils/__tests__/shadcn-sync.unit.test.d.ts +1 -0
  45. package/build/utils/__tests__/shadcn-sync.unit.test.js +49 -0
  46. package/build/utils/__tests__/theme-pick.unit.test.d.ts +1 -0
  47. package/build/utils/__tests__/theme-pick.unit.test.js +9 -0
  48. package/build/utils/__tests__/themes-sync.unit.test.d.ts +1 -0
  49. package/build/utils/__tests__/themes-sync.unit.test.js +21 -0
  50. package/build/utils/__tests__/ui-metadata.unit.test.d.ts +1 -0
  51. package/build/utils/__tests__/ui-metadata.unit.test.js +35 -0
  52. package/build/utils/__tests__/vercel-guidelines-sync.unit.test.d.ts +1 -0
  53. package/build/utils/__tests__/vercel-guidelines-sync.unit.test.js +34 -0
  54. package/build/utils/bm25.d.ts +2 -1
  55. package/build/utils/bm25.js +17 -5
  56. package/build/utils/shadcn-sync.d.ts +55 -0
  57. package/build/utils/shadcn-sync.js +146 -0
  58. package/build/utils/themes-sync.d.ts +32 -0
  59. package/build/utils/themes-sync.js +201 -0
  60. package/build/utils/ui-data-loader.js +13 -2
  61. package/build/utils/ui-metadata.d.ts +27 -0
  62. package/build/utils/ui-metadata.js +39 -0
  63. package/build/utils/ui-search-engine.d.ts +1 -0
  64. package/build/utils/ui-search-engine.js +20 -6
  65. package/build/utils/ui-sync.d.ts +24 -2
  66. package/build/utils/ui-sync.js +152 -86
  67. package/build/utils/vercel-guidelines-sync.d.ts +30 -0
  68. package/build/utils/vercel-guidelines-sync.js +133 -0
  69. package/docs/data/tools.js +18 -0
  70. package/docs/i18n/all-tools/en.json +6 -1
  71. package/docs/i18n/all-tools/ja.json +2 -1
  72. package/docs/i18n/all-tools/ko.json +2 -1
  73. package/docs/i18n/all-tools/zh-CN.json +7 -2
  74. package/docs/i18n/en.json +5 -5
  75. package/docs/i18n/ja.json +2 -2
  76. package/docs/i18n/ko.json +2 -2
  77. package/docs/i18n/zh-CN.json +7 -7
  78. package/docs/memory-local-setup.md +1 -1
  79. package/docs/memory-local-setup.zh-CN.md +5 -2
  80. package/docs/pages/getting-started.html +3 -2
  81. package/package.json +2 -2
@@ -0,0 +1,1632 @@
1
+ [
2
+ {
3
+ "id": "vercel-interactions-keyboard-1",
4
+ "title": "MUST: Full keyboard support per [WAI-ARIA APG](https://www.w3.org/WAI/ARIA/apg/pattern…",
5
+ "section": "Interactions",
6
+ "subsection": "Keyboard",
7
+ "level": "MUST",
8
+ "rule": "Full keyboard support per [WAI-ARIA APG](https://www.w3.org/WAI/ARIA/apg/patterns/)",
9
+ "description": "Full keyboard support per [WAI-ARIA APG](https://www.w3.org/WAI/ARIA/apg/patterns/)",
10
+ "category": "ui-guidelines-vercel",
11
+ "source": "vercel-labs/web-interface-guidelines",
12
+ "tags": [
13
+ "vercel",
14
+ "web-interface",
15
+ "keyboard",
16
+ "aria"
17
+ ]
18
+ },
19
+ {
20
+ "id": "vercel-interactions-keyboard-2",
21
+ "title": "MUST: Visible focus rings (`:focus-visible`; group with `:focus-within`)",
22
+ "section": "Interactions",
23
+ "subsection": "Keyboard",
24
+ "level": "MUST",
25
+ "rule": "Visible focus rings (`:focus-visible`; group with `:focus-within`)",
26
+ "description": "Visible focus rings (`:focus-visible`; group with `:focus-within`)",
27
+ "category": "ui-guidelines-vercel",
28
+ "source": "vercel-labs/web-interface-guidelines",
29
+ "tags": [
30
+ "vercel",
31
+ "web-interface",
32
+ "focus"
33
+ ]
34
+ },
35
+ {
36
+ "id": "vercel-interactions-keyboard-3",
37
+ "title": "MUST: Manage focus (trap, move, return) per APG patterns",
38
+ "section": "Interactions",
39
+ "subsection": "Keyboard",
40
+ "level": "MUST",
41
+ "rule": "Manage focus (trap, move, return) per APG patterns",
42
+ "description": "Manage focus (trap, move, return) per APG patterns",
43
+ "category": "ui-guidelines-vercel",
44
+ "source": "vercel-labs/web-interface-guidelines",
45
+ "tags": [
46
+ "vercel",
47
+ "web-interface",
48
+ "focus"
49
+ ]
50
+ },
51
+ {
52
+ "id": "vercel-interactions-keyboard-4",
53
+ "title": "NEVER: `outline: none` without visible focus replacement",
54
+ "section": "Interactions",
55
+ "subsection": "Keyboard",
56
+ "level": "NEVER",
57
+ "rule": "`outline: none` without visible focus replacement",
58
+ "description": "`outline: none` without visible focus replacement",
59
+ "category": "ui-guidelines-vercel",
60
+ "source": "vercel-labs/web-interface-guidelines",
61
+ "tags": [
62
+ "vercel",
63
+ "web-interface",
64
+ "focus"
65
+ ]
66
+ },
67
+ {
68
+ "id": "vercel-interactions-targets-input-5",
69
+ "title": "MUST: Hit target ≥24px (mobile ≥44px); if visual <24px, expand hit area",
70
+ "section": "Interactions",
71
+ "subsection": "Targets & Input",
72
+ "level": "MUST",
73
+ "rule": "Hit target ≥24px (mobile ≥44px); if visual <24px, expand hit area",
74
+ "description": "Hit target ≥24px (mobile ≥44px); if visual <24px, expand hit area",
75
+ "category": "ui-guidelines-vercel",
76
+ "source": "vercel-labs/web-interface-guidelines",
77
+ "tags": [
78
+ "vercel",
79
+ "web-interface",
80
+ "mobile"
81
+ ]
82
+ },
83
+ {
84
+ "id": "vercel-interactions-targets-input-6",
85
+ "title": "MUST: Mobile `<input>` font-size ≥16px to prevent iOS zoom",
86
+ "section": "Interactions",
87
+ "subsection": "Targets & Input",
88
+ "level": "MUST",
89
+ "rule": "Mobile `<input>` font-size ≥16px to prevent iOS zoom",
90
+ "description": "Mobile `<input>` font-size ≥16px to prevent iOS zoom",
91
+ "category": "ui-guidelines-vercel",
92
+ "source": "vercel-labs/web-interface-guidelines",
93
+ "tags": [
94
+ "vercel",
95
+ "web-interface",
96
+ "mobile"
97
+ ]
98
+ },
99
+ {
100
+ "id": "vercel-interactions-targets-input-7",
101
+ "title": "NEVER: Disable browser zoom (`user-scalable=no`, `maximum-scale=1`)",
102
+ "section": "Interactions",
103
+ "subsection": "Targets & Input",
104
+ "level": "NEVER",
105
+ "rule": "Disable browser zoom (`user-scalable=no`, `maximum-scale=1`)",
106
+ "description": "Disable browser zoom (`user-scalable=no`, `maximum-scale=1`)",
107
+ "category": "ui-guidelines-vercel",
108
+ "source": "vercel-labs/web-interface-guidelines",
109
+ "tags": [
110
+ "vercel",
111
+ "web-interface"
112
+ ]
113
+ },
114
+ {
115
+ "id": "vercel-interactions-targets-input-8",
116
+ "title": "MUST: `touch-action: manipulation` to prevent double-tap zoom",
117
+ "section": "Interactions",
118
+ "subsection": "Targets & Input",
119
+ "level": "MUST",
120
+ "rule": "`touch-action: manipulation` to prevent double-tap zoom",
121
+ "description": "`touch-action: manipulation` to prevent double-tap zoom",
122
+ "category": "ui-guidelines-vercel",
123
+ "source": "vercel-labs/web-interface-guidelines",
124
+ "tags": [
125
+ "vercel",
126
+ "web-interface",
127
+ "touch"
128
+ ]
129
+ },
130
+ {
131
+ "id": "vercel-interactions-targets-input-9",
132
+ "title": "SHOULD: Set `-webkit-tap-highlight-color` to match design",
133
+ "section": "Interactions",
134
+ "subsection": "Targets & Input",
135
+ "level": "SHOULD",
136
+ "rule": "Set `-webkit-tap-highlight-color` to match design",
137
+ "description": "Set `-webkit-tap-highlight-color` to match design",
138
+ "category": "ui-guidelines-vercel",
139
+ "source": "vercel-labs/web-interface-guidelines",
140
+ "tags": [
141
+ "vercel",
142
+ "web-interface"
143
+ ]
144
+ },
145
+ {
146
+ "id": "vercel-interactions-forms-10",
147
+ "title": "MUST: Hydration-safe inputs (no lost focus/value)",
148
+ "section": "Interactions",
149
+ "subsection": "Forms",
150
+ "level": "MUST",
151
+ "rule": "Hydration-safe inputs (no lost focus/value)",
152
+ "description": "Hydration-safe inputs (no lost focus/value)",
153
+ "category": "ui-guidelines-vercel",
154
+ "source": "vercel-labs/web-interface-guidelines",
155
+ "tags": [
156
+ "vercel",
157
+ "web-interface",
158
+ "focus",
159
+ "hydration"
160
+ ]
161
+ },
162
+ {
163
+ "id": "vercel-interactions-forms-11",
164
+ "title": "NEVER: Block paste in `<input>`/`<textarea>`",
165
+ "section": "Interactions",
166
+ "subsection": "Forms",
167
+ "level": "NEVER",
168
+ "rule": "Block paste in `<input>`/`<textarea>`",
169
+ "description": "Block paste in `<input>`/`<textarea>`",
170
+ "category": "ui-guidelines-vercel",
171
+ "source": "vercel-labs/web-interface-guidelines",
172
+ "tags": [
173
+ "vercel",
174
+ "web-interface"
175
+ ]
176
+ },
177
+ {
178
+ "id": "vercel-interactions-forms-12",
179
+ "title": "MUST: Loading buttons show spinner and keep original label",
180
+ "section": "Interactions",
181
+ "subsection": "Forms",
182
+ "level": "MUST",
183
+ "rule": "Loading buttons show spinner and keep original label",
184
+ "description": "Loading buttons show spinner and keep original label",
185
+ "category": "ui-guidelines-vercel",
186
+ "source": "vercel-labs/web-interface-guidelines",
187
+ "tags": [
188
+ "vercel",
189
+ "web-interface"
190
+ ]
191
+ },
192
+ {
193
+ "id": "vercel-interactions-forms-13",
194
+ "title": "MUST: Enter submits focused input; in `<textarea>`, ⌘/Ctrl+Enter submits",
195
+ "section": "Interactions",
196
+ "subsection": "Forms",
197
+ "level": "MUST",
198
+ "rule": "Enter submits focused input; in `<textarea>`, ⌘/Ctrl+Enter submits",
199
+ "description": "Enter submits focused input; in `<textarea>`, ⌘/Ctrl+Enter submits",
200
+ "category": "ui-guidelines-vercel",
201
+ "source": "vercel-labs/web-interface-guidelines",
202
+ "tags": [
203
+ "vercel",
204
+ "web-interface",
205
+ "focus"
206
+ ]
207
+ },
208
+ {
209
+ "id": "vercel-interactions-forms-14",
210
+ "title": "MUST: Keep submit enabled until request starts; then disable with spinner",
211
+ "section": "Interactions",
212
+ "subsection": "Forms",
213
+ "level": "MUST",
214
+ "rule": "Keep submit enabled until request starts; then disable with spinner",
215
+ "description": "Keep submit enabled until request starts; then disable with spinner",
216
+ "category": "ui-guidelines-vercel",
217
+ "source": "vercel-labs/web-interface-guidelines",
218
+ "tags": [
219
+ "vercel",
220
+ "web-interface"
221
+ ]
222
+ },
223
+ {
224
+ "id": "vercel-interactions-forms-15",
225
+ "title": "MUST: Accept free text, validate after—don't block typing",
226
+ "section": "Interactions",
227
+ "subsection": "Forms",
228
+ "level": "MUST",
229
+ "rule": "Accept free text, validate after—don't block typing",
230
+ "description": "Accept free text, validate after—don't block typing",
231
+ "category": "ui-guidelines-vercel",
232
+ "source": "vercel-labs/web-interface-guidelines",
233
+ "tags": [
234
+ "vercel",
235
+ "web-interface"
236
+ ]
237
+ },
238
+ {
239
+ "id": "vercel-interactions-forms-16",
240
+ "title": "MUST: Allow incomplete form submission to surface validation",
241
+ "section": "Interactions",
242
+ "subsection": "Forms",
243
+ "level": "MUST",
244
+ "rule": "Allow incomplete form submission to surface validation",
245
+ "description": "Allow incomplete form submission to surface validation",
246
+ "category": "ui-guidelines-vercel",
247
+ "source": "vercel-labs/web-interface-guidelines",
248
+ "tags": [
249
+ "vercel",
250
+ "web-interface",
251
+ "form"
252
+ ]
253
+ },
254
+ {
255
+ "id": "vercel-interactions-forms-17",
256
+ "title": "MUST: Errors inline next to fields; on submit, focus first error",
257
+ "section": "Interactions",
258
+ "subsection": "Forms",
259
+ "level": "MUST",
260
+ "rule": "Errors inline next to fields; on submit, focus first error",
261
+ "description": "Errors inline next to fields; on submit, focus first error",
262
+ "category": "ui-guidelines-vercel",
263
+ "source": "vercel-labs/web-interface-guidelines",
264
+ "tags": [
265
+ "vercel",
266
+ "web-interface",
267
+ "focus"
268
+ ]
269
+ },
270
+ {
271
+ "id": "vercel-interactions-forms-18",
272
+ "title": "MUST: `autocomplete` + meaningful `name`; correct `type` and `inputmode`",
273
+ "section": "Interactions",
274
+ "subsection": "Forms",
275
+ "level": "MUST",
276
+ "rule": "`autocomplete` + meaningful `name`; correct `type` and `inputmode`",
277
+ "description": "`autocomplete` + meaningful `name`; correct `type` and `inputmode`",
278
+ "category": "ui-guidelines-vercel",
279
+ "source": "vercel-labs/web-interface-guidelines",
280
+ "tags": [
281
+ "vercel",
282
+ "web-interface"
283
+ ]
284
+ },
285
+ {
286
+ "id": "vercel-interactions-forms-19",
287
+ "title": "SHOULD: Disable spellcheck for emails/codes/usernames",
288
+ "section": "Interactions",
289
+ "subsection": "Forms",
290
+ "level": "SHOULD",
291
+ "rule": "Disable spellcheck for emails/codes/usernames",
292
+ "description": "Disable spellcheck for emails/codes/usernames",
293
+ "category": "ui-guidelines-vercel",
294
+ "source": "vercel-labs/web-interface-guidelines",
295
+ "tags": [
296
+ "vercel",
297
+ "web-interface"
298
+ ]
299
+ },
300
+ {
301
+ "id": "vercel-interactions-forms-20",
302
+ "title": "SHOULD: Placeholders end with `…` and show example pattern",
303
+ "section": "Interactions",
304
+ "subsection": "Forms",
305
+ "level": "SHOULD",
306
+ "rule": "Placeholders end with `…` and show example pattern",
307
+ "description": "Placeholders end with `…` and show example pattern",
308
+ "category": "ui-guidelines-vercel",
309
+ "source": "vercel-labs/web-interface-guidelines",
310
+ "tags": [
311
+ "vercel",
312
+ "web-interface"
313
+ ]
314
+ },
315
+ {
316
+ "id": "vercel-interactions-forms-21",
317
+ "title": "MUST: Warn on unsaved changes before navigation",
318
+ "section": "Interactions",
319
+ "subsection": "Forms",
320
+ "level": "MUST",
321
+ "rule": "Warn on unsaved changes before navigation",
322
+ "description": "Warn on unsaved changes before navigation",
323
+ "category": "ui-guidelines-vercel",
324
+ "source": "vercel-labs/web-interface-guidelines",
325
+ "tags": [
326
+ "vercel",
327
+ "web-interface",
328
+ "navigation"
329
+ ]
330
+ },
331
+ {
332
+ "id": "vercel-interactions-forms-22",
333
+ "title": "MUST: Compatible with password managers & 2FA; allow pasting codes",
334
+ "section": "Interactions",
335
+ "subsection": "Forms",
336
+ "level": "MUST",
337
+ "rule": "Compatible with password managers & 2FA; allow pasting codes",
338
+ "description": "Compatible with password managers & 2FA; allow pasting codes",
339
+ "category": "ui-guidelines-vercel",
340
+ "source": "vercel-labs/web-interface-guidelines",
341
+ "tags": [
342
+ "vercel",
343
+ "web-interface"
344
+ ]
345
+ },
346
+ {
347
+ "id": "vercel-interactions-forms-23",
348
+ "title": "MUST: Trim values to handle text expansion trailing spaces",
349
+ "section": "Interactions",
350
+ "subsection": "Forms",
351
+ "level": "MUST",
352
+ "rule": "Trim values to handle text expansion trailing spaces",
353
+ "description": "Trim values to handle text expansion trailing spaces",
354
+ "category": "ui-guidelines-vercel",
355
+ "source": "vercel-labs/web-interface-guidelines",
356
+ "tags": [
357
+ "vercel",
358
+ "web-interface"
359
+ ]
360
+ },
361
+ {
362
+ "id": "vercel-interactions-forms-24",
363
+ "title": "MUST: No dead zones on checkboxes/radios; label+control share one hit target",
364
+ "section": "Interactions",
365
+ "subsection": "Forms",
366
+ "level": "MUST",
367
+ "rule": "No dead zones on checkboxes/radios; label+control share one hit target",
368
+ "description": "No dead zones on checkboxes/radios; label+control share one hit target",
369
+ "category": "ui-guidelines-vercel",
370
+ "source": "vercel-labs/web-interface-guidelines",
371
+ "tags": [
372
+ "vercel",
373
+ "web-interface"
374
+ ]
375
+ },
376
+ {
377
+ "id": "vercel-interactions-state-navigation-25",
378
+ "title": "MUST: URL reflects state (deep-link filters/tabs/pagination/expanded panels)",
379
+ "section": "Interactions",
380
+ "subsection": "State & Navigation",
381
+ "level": "MUST",
382
+ "rule": "URL reflects state (deep-link filters/tabs/pagination/expanded panels)",
383
+ "description": "URL reflects state (deep-link filters/tabs/pagination/expanded panels)",
384
+ "category": "ui-guidelines-vercel",
385
+ "source": "vercel-labs/web-interface-guidelines",
386
+ "tags": [
387
+ "vercel",
388
+ "web-interface"
389
+ ]
390
+ },
391
+ {
392
+ "id": "vercel-interactions-state-navigation-26",
393
+ "title": "MUST: Back/Forward restores scroll position",
394
+ "section": "Interactions",
395
+ "subsection": "State & Navigation",
396
+ "level": "MUST",
397
+ "rule": "Back/Forward restores scroll position",
398
+ "description": "Back/Forward restores scroll position",
399
+ "category": "ui-guidelines-vercel",
400
+ "source": "vercel-labs/web-interface-guidelines",
401
+ "tags": [
402
+ "vercel",
403
+ "web-interface"
404
+ ]
405
+ },
406
+ {
407
+ "id": "vercel-interactions-state-navigation-27",
408
+ "title": "MUST: Links use `<a>`/`<Link>` for navigation (support Cmd/Ctrl/middle-click)",
409
+ "section": "Interactions",
410
+ "subsection": "State & Navigation",
411
+ "level": "MUST",
412
+ "rule": "Links use `<a>`/`<Link>` for navigation (support Cmd/Ctrl/middle-click)",
413
+ "description": "Links use `<a>`/`<Link>` for navigation (support Cmd/Ctrl/middle-click)",
414
+ "category": "ui-guidelines-vercel",
415
+ "source": "vercel-labs/web-interface-guidelines",
416
+ "tags": [
417
+ "vercel",
418
+ "web-interface",
419
+ "navigation"
420
+ ]
421
+ },
422
+ {
423
+ "id": "vercel-interactions-state-navigation-28",
424
+ "title": "NEVER: Use `<div onClick>` for navigation",
425
+ "section": "Interactions",
426
+ "subsection": "State & Navigation",
427
+ "level": "NEVER",
428
+ "rule": "Use `<div onClick>` for navigation",
429
+ "description": "Use `<div onClick>` for navigation",
430
+ "category": "ui-guidelines-vercel",
431
+ "source": "vercel-labs/web-interface-guidelines",
432
+ "tags": [
433
+ "vercel",
434
+ "web-interface",
435
+ "navigation"
436
+ ]
437
+ },
438
+ {
439
+ "id": "vercel-interactions-feedback-29",
440
+ "title": "SHOULD: Optimistic UI; reconcile on response; on failure rollback or offer Undo",
441
+ "section": "Interactions",
442
+ "subsection": "Feedback",
443
+ "level": "SHOULD",
444
+ "rule": "Optimistic UI; reconcile on response; on failure rollback or offer Undo",
445
+ "description": "Optimistic UI; reconcile on response; on failure rollback or offer Undo",
446
+ "category": "ui-guidelines-vercel",
447
+ "source": "vercel-labs/web-interface-guidelines",
448
+ "tags": [
449
+ "vercel",
450
+ "web-interface"
451
+ ]
452
+ },
453
+ {
454
+ "id": "vercel-interactions-feedback-30",
455
+ "title": "MUST: Confirm destructive actions or provide Undo window",
456
+ "section": "Interactions",
457
+ "subsection": "Feedback",
458
+ "level": "MUST",
459
+ "rule": "Confirm destructive actions or provide Undo window",
460
+ "description": "Confirm destructive actions or provide Undo window",
461
+ "category": "ui-guidelines-vercel",
462
+ "source": "vercel-labs/web-interface-guidelines",
463
+ "tags": [
464
+ "vercel",
465
+ "web-interface"
466
+ ]
467
+ },
468
+ {
469
+ "id": "vercel-interactions-feedback-31",
470
+ "title": "MUST: Use polite `aria-live` for toasts/inline validation",
471
+ "section": "Interactions",
472
+ "subsection": "Feedback",
473
+ "level": "MUST",
474
+ "rule": "Use polite `aria-live` for toasts/inline validation",
475
+ "description": "Use polite `aria-live` for toasts/inline validation",
476
+ "category": "ui-guidelines-vercel",
477
+ "source": "vercel-labs/web-interface-guidelines",
478
+ "tags": [
479
+ "vercel",
480
+ "web-interface",
481
+ "aria"
482
+ ]
483
+ },
484
+ {
485
+ "id": "vercel-interactions-feedback-32",
486
+ "title": "SHOULD: Ellipsis (`…`) for options opening follow-ups (\"Rename…\") and loading states (\"L…",
487
+ "section": "Interactions",
488
+ "subsection": "Feedback",
489
+ "level": "SHOULD",
490
+ "rule": "Ellipsis (`…`) for options opening follow-ups (\"Rename…\") and loading states (\"Loading…\")",
491
+ "description": "Ellipsis (`…`) for options opening follow-ups (\"Rename…\") and loading states (\"Loading…\")",
492
+ "category": "ui-guidelines-vercel",
493
+ "source": "vercel-labs/web-interface-guidelines",
494
+ "tags": [
495
+ "vercel",
496
+ "web-interface"
497
+ ]
498
+ },
499
+ {
500
+ "id": "vercel-interactions-touch-drag-33",
501
+ "title": "MUST: Generous targets, clear affordances; avoid finicky interactions",
502
+ "section": "Interactions",
503
+ "subsection": "Touch & Drag",
504
+ "level": "MUST",
505
+ "rule": "Generous targets, clear affordances; avoid finicky interactions",
506
+ "description": "Generous targets, clear affordances; avoid finicky interactions",
507
+ "category": "ui-guidelines-vercel",
508
+ "source": "vercel-labs/web-interface-guidelines",
509
+ "tags": [
510
+ "vercel",
511
+ "web-interface"
512
+ ]
513
+ },
514
+ {
515
+ "id": "vercel-interactions-touch-drag-34",
516
+ "title": "MUST: Delay first tooltip; subsequent peers instant",
517
+ "section": "Interactions",
518
+ "subsection": "Touch & Drag",
519
+ "level": "MUST",
520
+ "rule": "Delay first tooltip; subsequent peers instant",
521
+ "description": "Delay first tooltip; subsequent peers instant",
522
+ "category": "ui-guidelines-vercel",
523
+ "source": "vercel-labs/web-interface-guidelines",
524
+ "tags": [
525
+ "vercel",
526
+ "web-interface"
527
+ ]
528
+ },
529
+ {
530
+ "id": "vercel-interactions-touch-drag-35",
531
+ "title": "MUST: `overscroll-behavior: contain` in modals/drawers",
532
+ "section": "Interactions",
533
+ "subsection": "Touch & Drag",
534
+ "level": "MUST",
535
+ "rule": "`overscroll-behavior: contain` in modals/drawers",
536
+ "description": "`overscroll-behavior: contain` in modals/drawers",
537
+ "category": "ui-guidelines-vercel",
538
+ "source": "vercel-labs/web-interface-guidelines",
539
+ "tags": [
540
+ "vercel",
541
+ "web-interface"
542
+ ]
543
+ },
544
+ {
545
+ "id": "vercel-interactions-touch-drag-36",
546
+ "title": "MUST: During drag, disable text selection and set `inert` on dragged elements",
547
+ "section": "Interactions",
548
+ "subsection": "Touch & Drag",
549
+ "level": "MUST",
550
+ "rule": "During drag, disable text selection and set `inert` on dragged elements",
551
+ "description": "During drag, disable text selection and set `inert` on dragged elements",
552
+ "category": "ui-guidelines-vercel",
553
+ "source": "vercel-labs/web-interface-guidelines",
554
+ "tags": [
555
+ "vercel",
556
+ "web-interface"
557
+ ]
558
+ },
559
+ {
560
+ "id": "vercel-interactions-touch-drag-37",
561
+ "title": "MUST: If it looks clickable, it must be clickable",
562
+ "section": "Interactions",
563
+ "subsection": "Touch & Drag",
564
+ "level": "MUST",
565
+ "rule": "If it looks clickable, it must be clickable",
566
+ "description": "If it looks clickable, it must be clickable",
567
+ "category": "ui-guidelines-vercel",
568
+ "source": "vercel-labs/web-interface-guidelines",
569
+ "tags": [
570
+ "vercel",
571
+ "web-interface"
572
+ ]
573
+ },
574
+ {
575
+ "id": "vercel-interactions-autofocus-38",
576
+ "title": "SHOULD: Autofocus on desktop with single primary input; rarely on mobile",
577
+ "section": "Interactions",
578
+ "subsection": "Autofocus",
579
+ "level": "SHOULD",
580
+ "rule": "Autofocus on desktop with single primary input; rarely on mobile",
581
+ "description": "Autofocus on desktop with single primary input; rarely on mobile",
582
+ "category": "ui-guidelines-vercel",
583
+ "source": "vercel-labs/web-interface-guidelines",
584
+ "tags": [
585
+ "vercel",
586
+ "web-interface",
587
+ "focus",
588
+ "mobile"
589
+ ]
590
+ },
591
+ {
592
+ "id": "vercel-animation-animation-39",
593
+ "title": "MUST: Honor `prefers-reduced-motion` (provide reduced variant or disable)",
594
+ "section": "Animation",
595
+ "subsection": "Animation",
596
+ "level": "MUST",
597
+ "rule": "Honor `prefers-reduced-motion` (provide reduced variant or disable)",
598
+ "description": "Honor `prefers-reduced-motion` (provide reduced variant or disable)",
599
+ "category": "ui-guidelines-vercel",
600
+ "source": "vercel-labs/web-interface-guidelines",
601
+ "tags": [
602
+ "vercel",
603
+ "web-interface",
604
+ "animation",
605
+ "aria"
606
+ ]
607
+ },
608
+ {
609
+ "id": "vercel-animation-animation-40",
610
+ "title": "SHOULD: Prefer CSS > Web Animations API > JS libraries",
611
+ "section": "Animation",
612
+ "subsection": "Animation",
613
+ "level": "SHOULD",
614
+ "rule": "Prefer CSS > Web Animations API > JS libraries",
615
+ "description": "Prefer CSS > Web Animations API > JS libraries",
616
+ "category": "ui-guidelines-vercel",
617
+ "source": "vercel-labs/web-interface-guidelines",
618
+ "tags": [
619
+ "vercel",
620
+ "web-interface",
621
+ "animation"
622
+ ]
623
+ },
624
+ {
625
+ "id": "vercel-animation-animation-41",
626
+ "title": "MUST: Animate compositor-friendly props (`transform`, `opacity`) only",
627
+ "section": "Animation",
628
+ "subsection": "Animation",
629
+ "level": "MUST",
630
+ "rule": "Animate compositor-friendly props (`transform`, `opacity`) only",
631
+ "description": "Animate compositor-friendly props (`transform`, `opacity`) only",
632
+ "category": "ui-guidelines-vercel",
633
+ "source": "vercel-labs/web-interface-guidelines",
634
+ "tags": [
635
+ "vercel",
636
+ "web-interface",
637
+ "form",
638
+ "animation"
639
+ ]
640
+ },
641
+ {
642
+ "id": "vercel-animation-animation-42",
643
+ "title": "NEVER: Animate layout props (`top`, `left`, `width`, `height`)",
644
+ "section": "Animation",
645
+ "subsection": "Animation",
646
+ "level": "NEVER",
647
+ "rule": "Animate layout props (`top`, `left`, `width`, `height`)",
648
+ "description": "Animate layout props (`top`, `left`, `width`, `height`)",
649
+ "category": "ui-guidelines-vercel",
650
+ "source": "vercel-labs/web-interface-guidelines",
651
+ "tags": [
652
+ "vercel",
653
+ "web-interface",
654
+ "animation",
655
+ "layout"
656
+ ]
657
+ },
658
+ {
659
+ "id": "vercel-animation-animation-43",
660
+ "title": "NEVER: `transition: all`—list properties explicitly",
661
+ "section": "Animation",
662
+ "subsection": "Animation",
663
+ "level": "NEVER",
664
+ "rule": "`transition: all`—list properties explicitly",
665
+ "description": "`transition: all`—list properties explicitly",
666
+ "category": "ui-guidelines-vercel",
667
+ "source": "vercel-labs/web-interface-guidelines",
668
+ "tags": [
669
+ "vercel",
670
+ "web-interface",
671
+ "animation"
672
+ ]
673
+ },
674
+ {
675
+ "id": "vercel-animation-animation-44",
676
+ "title": "SHOULD: Animate only to clarify cause/effect or add deliberate delight",
677
+ "section": "Animation",
678
+ "subsection": "Animation",
679
+ "level": "SHOULD",
680
+ "rule": "Animate only to clarify cause/effect or add deliberate delight",
681
+ "description": "Animate only to clarify cause/effect or add deliberate delight",
682
+ "category": "ui-guidelines-vercel",
683
+ "source": "vercel-labs/web-interface-guidelines",
684
+ "tags": [
685
+ "vercel",
686
+ "web-interface",
687
+ "animation"
688
+ ]
689
+ },
690
+ {
691
+ "id": "vercel-animation-animation-45",
692
+ "title": "SHOULD: Choose easing to match the change (size/distance/trigger)",
693
+ "section": "Animation",
694
+ "subsection": "Animation",
695
+ "level": "SHOULD",
696
+ "rule": "Choose easing to match the change (size/distance/trigger)",
697
+ "description": "Choose easing to match the change (size/distance/trigger)",
698
+ "category": "ui-guidelines-vercel",
699
+ "source": "vercel-labs/web-interface-guidelines",
700
+ "tags": [
701
+ "vercel",
702
+ "web-interface",
703
+ "animation"
704
+ ]
705
+ },
706
+ {
707
+ "id": "vercel-animation-animation-46",
708
+ "title": "MUST: Animations interruptible and input-driven (no autoplay)",
709
+ "section": "Animation",
710
+ "subsection": "Animation",
711
+ "level": "MUST",
712
+ "rule": "Animations interruptible and input-driven (no autoplay)",
713
+ "description": "Animations interruptible and input-driven (no autoplay)",
714
+ "category": "ui-guidelines-vercel",
715
+ "source": "vercel-labs/web-interface-guidelines",
716
+ "tags": [
717
+ "vercel",
718
+ "web-interface",
719
+ "animation"
720
+ ]
721
+ },
722
+ {
723
+ "id": "vercel-animation-animation-47",
724
+ "title": "MUST: Correct `transform-origin` (motion starts where it \"physically\" should)",
725
+ "section": "Animation",
726
+ "subsection": "Animation",
727
+ "level": "MUST",
728
+ "rule": "Correct `transform-origin` (motion starts where it \"physically\" should)",
729
+ "description": "Correct `transform-origin` (motion starts where it \"physically\" should)",
730
+ "category": "ui-guidelines-vercel",
731
+ "source": "vercel-labs/web-interface-guidelines",
732
+ "tags": [
733
+ "vercel",
734
+ "web-interface",
735
+ "form",
736
+ "animation"
737
+ ]
738
+ },
739
+ {
740
+ "id": "vercel-animation-animation-48",
741
+ "title": "MUST: SVG transforms on `<g>` wrapper with `transform-box: fill-box`",
742
+ "section": "Animation",
743
+ "subsection": "Animation",
744
+ "level": "MUST",
745
+ "rule": "SVG transforms on `<g>` wrapper with `transform-box: fill-box`",
746
+ "description": "SVG transforms on `<g>` wrapper with `transform-box: fill-box`",
747
+ "category": "ui-guidelines-vercel",
748
+ "source": "vercel-labs/web-interface-guidelines",
749
+ "tags": [
750
+ "vercel",
751
+ "web-interface",
752
+ "form",
753
+ "animation"
754
+ ]
755
+ },
756
+ {
757
+ "id": "vercel-layout-layout-49",
758
+ "title": "SHOULD: Optical alignment; adjust ±1px when perception beats geometry",
759
+ "section": "Layout",
760
+ "subsection": "Layout",
761
+ "level": "SHOULD",
762
+ "rule": "Optical alignment; adjust ±1px when perception beats geometry",
763
+ "description": "Optical alignment; adjust ±1px when perception beats geometry",
764
+ "category": "ui-guidelines-vercel",
765
+ "source": "vercel-labs/web-interface-guidelines",
766
+ "tags": [
767
+ "vercel",
768
+ "web-interface",
769
+ "layout"
770
+ ]
771
+ },
772
+ {
773
+ "id": "vercel-layout-layout-50",
774
+ "title": "MUST: Deliberate alignment to grid/baseline/edges—no accidental placement",
775
+ "section": "Layout",
776
+ "subsection": "Layout",
777
+ "level": "MUST",
778
+ "rule": "Deliberate alignment to grid/baseline/edges—no accidental placement",
779
+ "description": "Deliberate alignment to grid/baseline/edges—no accidental placement",
780
+ "category": "ui-guidelines-vercel",
781
+ "source": "vercel-labs/web-interface-guidelines",
782
+ "tags": [
783
+ "vercel",
784
+ "web-interface",
785
+ "layout"
786
+ ]
787
+ },
788
+ {
789
+ "id": "vercel-layout-layout-51",
790
+ "title": "SHOULD: Balance icon/text lockups (weight/size/spacing/color)",
791
+ "section": "Layout",
792
+ "subsection": "Layout",
793
+ "level": "SHOULD",
794
+ "rule": "Balance icon/text lockups (weight/size/spacing/color)",
795
+ "description": "Balance icon/text lockups (weight/size/spacing/color)",
796
+ "category": "ui-guidelines-vercel",
797
+ "source": "vercel-labs/web-interface-guidelines",
798
+ "tags": [
799
+ "vercel",
800
+ "web-interface",
801
+ "layout"
802
+ ]
803
+ },
804
+ {
805
+ "id": "vercel-layout-layout-52",
806
+ "title": "MUST: Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)",
807
+ "section": "Layout",
808
+ "subsection": "Layout",
809
+ "level": "MUST",
810
+ "rule": "Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)",
811
+ "description": "Verify mobile, laptop, ultra-wide (simulate ultra-wide at 50% zoom)",
812
+ "category": "ui-guidelines-vercel",
813
+ "source": "vercel-labs/web-interface-guidelines",
814
+ "tags": [
815
+ "vercel",
816
+ "web-interface",
817
+ "mobile",
818
+ "layout"
819
+ ]
820
+ },
821
+ {
822
+ "id": "vercel-layout-layout-53",
823
+ "title": "MUST: Respect safe areas (`env(safe-area-inset-*)`)",
824
+ "section": "Layout",
825
+ "subsection": "Layout",
826
+ "level": "MUST",
827
+ "rule": "Respect safe areas (`env(safe-area-inset-*)`)",
828
+ "description": "Respect safe areas (`env(safe-area-inset-*)`)",
829
+ "category": "ui-guidelines-vercel",
830
+ "source": "vercel-labs/web-interface-guidelines",
831
+ "tags": [
832
+ "vercel",
833
+ "web-interface",
834
+ "layout"
835
+ ]
836
+ },
837
+ {
838
+ "id": "vercel-layout-layout-54",
839
+ "title": "MUST: Avoid unwanted scrollbars; fix overflows",
840
+ "section": "Layout",
841
+ "subsection": "Layout",
842
+ "level": "MUST",
843
+ "rule": "Avoid unwanted scrollbars; fix overflows",
844
+ "description": "Avoid unwanted scrollbars; fix overflows",
845
+ "category": "ui-guidelines-vercel",
846
+ "source": "vercel-labs/web-interface-guidelines",
847
+ "tags": [
848
+ "vercel",
849
+ "web-interface",
850
+ "layout"
851
+ ]
852
+ },
853
+ {
854
+ "id": "vercel-layout-layout-55",
855
+ "title": "SHOULD: Flex/grid over JS measurement for layout",
856
+ "section": "Layout",
857
+ "subsection": "Layout",
858
+ "level": "SHOULD",
859
+ "rule": "Flex/grid over JS measurement for layout",
860
+ "description": "Flex/grid over JS measurement for layout",
861
+ "category": "ui-guidelines-vercel",
862
+ "source": "vercel-labs/web-interface-guidelines",
863
+ "tags": [
864
+ "vercel",
865
+ "web-interface",
866
+ "layout"
867
+ ]
868
+ },
869
+ {
870
+ "id": "vercel-content-accessibility-content-accessibility-56",
871
+ "title": "SHOULD: Inline help first; tooltips last resort",
872
+ "section": "Content & Accessibility",
873
+ "subsection": "Content & Accessibility",
874
+ "level": "SHOULD",
875
+ "rule": "Inline help first; tooltips last resort",
876
+ "description": "Inline help first; tooltips last resort",
877
+ "category": "ui-guidelines-vercel",
878
+ "source": "vercel-labs/web-interface-guidelines",
879
+ "tags": [
880
+ "vercel",
881
+ "web-interface",
882
+ "accessibility"
883
+ ]
884
+ },
885
+ {
886
+ "id": "vercel-content-accessibility-content-accessibility-57",
887
+ "title": "MUST: Skeletons mirror final content to avoid layout shift",
888
+ "section": "Content & Accessibility",
889
+ "subsection": "Content & Accessibility",
890
+ "level": "MUST",
891
+ "rule": "Skeletons mirror final content to avoid layout shift",
892
+ "description": "Skeletons mirror final content to avoid layout shift",
893
+ "category": "ui-guidelines-vercel",
894
+ "source": "vercel-labs/web-interface-guidelines",
895
+ "tags": [
896
+ "vercel",
897
+ "web-interface",
898
+ "accessibility",
899
+ "layout"
900
+ ]
901
+ },
902
+ {
903
+ "id": "vercel-content-accessibility-content-accessibility-58",
904
+ "title": "MUST: `<title>` matches current context",
905
+ "section": "Content & Accessibility",
906
+ "subsection": "Content & Accessibility",
907
+ "level": "MUST",
908
+ "rule": "`<title>` matches current context",
909
+ "description": "`<title>` matches current context",
910
+ "category": "ui-guidelines-vercel",
911
+ "source": "vercel-labs/web-interface-guidelines",
912
+ "tags": [
913
+ "vercel",
914
+ "web-interface",
915
+ "accessibility"
916
+ ]
917
+ },
918
+ {
919
+ "id": "vercel-content-accessibility-content-accessibility-59",
920
+ "title": "MUST: No dead ends; always offer next step/recovery",
921
+ "section": "Content & Accessibility",
922
+ "subsection": "Content & Accessibility",
923
+ "level": "MUST",
924
+ "rule": "No dead ends; always offer next step/recovery",
925
+ "description": "No dead ends; always offer next step/recovery",
926
+ "category": "ui-guidelines-vercel",
927
+ "source": "vercel-labs/web-interface-guidelines",
928
+ "tags": [
929
+ "vercel",
930
+ "web-interface",
931
+ "accessibility"
932
+ ]
933
+ },
934
+ {
935
+ "id": "vercel-content-accessibility-content-accessibility-60",
936
+ "title": "MUST: Design empty/sparse/dense/error states",
937
+ "section": "Content & Accessibility",
938
+ "subsection": "Content & Accessibility",
939
+ "level": "MUST",
940
+ "rule": "Design empty/sparse/dense/error states",
941
+ "description": "Design empty/sparse/dense/error states",
942
+ "category": "ui-guidelines-vercel",
943
+ "source": "vercel-labs/web-interface-guidelines",
944
+ "tags": [
945
+ "vercel",
946
+ "web-interface",
947
+ "accessibility"
948
+ ]
949
+ },
950
+ {
951
+ "id": "vercel-content-accessibility-content-accessibility-61",
952
+ "title": "SHOULD: Curly quotes (\" \"); avoid widows/orphans (`text-wrap: balance`)",
953
+ "section": "Content & Accessibility",
954
+ "subsection": "Content & Accessibility",
955
+ "level": "SHOULD",
956
+ "rule": "Curly quotes (\" \"); avoid widows/orphans (`text-wrap: balance`)",
957
+ "description": "Curly quotes (\" \"); avoid widows/orphans (`text-wrap: balance`)",
958
+ "category": "ui-guidelines-vercel",
959
+ "source": "vercel-labs/web-interface-guidelines",
960
+ "tags": [
961
+ "vercel",
962
+ "web-interface",
963
+ "accessibility"
964
+ ]
965
+ },
966
+ {
967
+ "id": "vercel-content-accessibility-content-accessibility-62",
968
+ "title": "MUST: `font-variant-numeric: tabular-nums` for number comparisons",
969
+ "section": "Content & Accessibility",
970
+ "subsection": "Content & Accessibility",
971
+ "level": "MUST",
972
+ "rule": "`font-variant-numeric: tabular-nums` for number comparisons",
973
+ "description": "`font-variant-numeric: tabular-nums` for number comparisons",
974
+ "category": "ui-guidelines-vercel",
975
+ "source": "vercel-labs/web-interface-guidelines",
976
+ "tags": [
977
+ "vercel",
978
+ "web-interface",
979
+ "accessibility",
980
+ "aria"
981
+ ]
982
+ },
983
+ {
984
+ "id": "vercel-content-accessibility-content-accessibility-63",
985
+ "title": "MUST: Redundant status cues (not color-only); icons have text labels",
986
+ "section": "Content & Accessibility",
987
+ "subsection": "Content & Accessibility",
988
+ "level": "MUST",
989
+ "rule": "Redundant status cues (not color-only); icons have text labels",
990
+ "description": "Redundant status cues (not color-only); icons have text labels",
991
+ "category": "ui-guidelines-vercel",
992
+ "source": "vercel-labs/web-interface-guidelines",
993
+ "tags": [
994
+ "vercel",
995
+ "web-interface",
996
+ "accessibility"
997
+ ]
998
+ },
999
+ {
1000
+ "id": "vercel-content-accessibility-content-accessibility-64",
1001
+ "title": "MUST: Accessible names exist even when visuals omit labels",
1002
+ "section": "Content & Accessibility",
1003
+ "subsection": "Content & Accessibility",
1004
+ "level": "MUST",
1005
+ "rule": "Accessible names exist even when visuals omit labels",
1006
+ "description": "Accessible names exist even when visuals omit labels",
1007
+ "category": "ui-guidelines-vercel",
1008
+ "source": "vercel-labs/web-interface-guidelines",
1009
+ "tags": [
1010
+ "vercel",
1011
+ "web-interface",
1012
+ "accessibility"
1013
+ ]
1014
+ },
1015
+ {
1016
+ "id": "vercel-content-accessibility-content-accessibility-65",
1017
+ "title": "MUST: Use `…` character (not `...`)",
1018
+ "section": "Content & Accessibility",
1019
+ "subsection": "Content & Accessibility",
1020
+ "level": "MUST",
1021
+ "rule": "Use `…` character (not `...`)",
1022
+ "description": "Use `…` character (not `...`)",
1023
+ "category": "ui-guidelines-vercel",
1024
+ "source": "vercel-labs/web-interface-guidelines",
1025
+ "tags": [
1026
+ "vercel",
1027
+ "web-interface",
1028
+ "accessibility"
1029
+ ]
1030
+ },
1031
+ {
1032
+ "id": "vercel-content-accessibility-content-accessibility-66",
1033
+ "title": "MUST: `scroll-margin-top` on headings; \"Skip to content\" link; hierarchical `<h1>`–`<h…",
1034
+ "section": "Content & Accessibility",
1035
+ "subsection": "Content & Accessibility",
1036
+ "level": "MUST",
1037
+ "rule": "`scroll-margin-top` on headings; \"Skip to content\" link; hierarchical `<h1>`–`<h6>`",
1038
+ "description": "`scroll-margin-top` on headings; \"Skip to content\" link; hierarchical `<h1>`–`<h6>`",
1039
+ "category": "ui-guidelines-vercel",
1040
+ "source": "vercel-labs/web-interface-guidelines",
1041
+ "tags": [
1042
+ "vercel",
1043
+ "web-interface",
1044
+ "accessibility"
1045
+ ]
1046
+ },
1047
+ {
1048
+ "id": "vercel-content-accessibility-content-accessibility-67",
1049
+ "title": "MUST: Resilient to user-generated content (short/avg/very long)",
1050
+ "section": "Content & Accessibility",
1051
+ "subsection": "Content & Accessibility",
1052
+ "level": "MUST",
1053
+ "rule": "Resilient to user-generated content (short/avg/very long)",
1054
+ "description": "Resilient to user-generated content (short/avg/very long)",
1055
+ "category": "ui-guidelines-vercel",
1056
+ "source": "vercel-labs/web-interface-guidelines",
1057
+ "tags": [
1058
+ "vercel",
1059
+ "web-interface",
1060
+ "accessibility"
1061
+ ]
1062
+ },
1063
+ {
1064
+ "id": "vercel-content-accessibility-content-accessibility-68",
1065
+ "title": "MUST: Locale-aware dates/times/numbers (`Intl.DateTimeFormat`, `Intl.NumberFormat`)",
1066
+ "section": "Content & Accessibility",
1067
+ "subsection": "Content & Accessibility",
1068
+ "level": "MUST",
1069
+ "rule": "Locale-aware dates/times/numbers (`Intl.DateTimeFormat`, `Intl.NumberFormat`)",
1070
+ "description": "Locale-aware dates/times/numbers (`Intl.DateTimeFormat`, `Intl.NumberFormat`)",
1071
+ "category": "ui-guidelines-vercel",
1072
+ "source": "vercel-labs/web-interface-guidelines",
1073
+ "tags": [
1074
+ "vercel",
1075
+ "web-interface",
1076
+ "form",
1077
+ "accessibility"
1078
+ ]
1079
+ },
1080
+ {
1081
+ "id": "vercel-content-accessibility-content-accessibility-69",
1082
+ "title": "SHOULD: `translate=\"no\"` on brand names, code tokens, & identifiers to prevent garbled a…",
1083
+ "section": "Content & Accessibility",
1084
+ "subsection": "Content & Accessibility",
1085
+ "level": "SHOULD",
1086
+ "rule": "`translate=\"no\"` on brand names, code tokens, & identifiers to prevent garbled auto-translation",
1087
+ "description": "`translate=\"no\"` on brand names, code tokens, & identifiers to prevent garbled auto-translation",
1088
+ "category": "ui-guidelines-vercel",
1089
+ "source": "vercel-labs/web-interface-guidelines",
1090
+ "tags": [
1091
+ "vercel",
1092
+ "web-interface",
1093
+ "accessibility"
1094
+ ]
1095
+ },
1096
+ {
1097
+ "id": "vercel-content-accessibility-content-accessibility-70",
1098
+ "title": "MUST: Accurate `aria-label`; decorative elements `aria-hidden`",
1099
+ "section": "Content & Accessibility",
1100
+ "subsection": "Content & Accessibility",
1101
+ "level": "MUST",
1102
+ "rule": "Accurate `aria-label`; decorative elements `aria-hidden`",
1103
+ "description": "Accurate `aria-label`; decorative elements `aria-hidden`",
1104
+ "category": "ui-guidelines-vercel",
1105
+ "source": "vercel-labs/web-interface-guidelines",
1106
+ "tags": [
1107
+ "vercel",
1108
+ "web-interface",
1109
+ "accessibility",
1110
+ "aria"
1111
+ ]
1112
+ },
1113
+ {
1114
+ "id": "vercel-content-accessibility-content-accessibility-71",
1115
+ "title": "MUST: Icon-only buttons have descriptive `aria-label`",
1116
+ "section": "Content & Accessibility",
1117
+ "subsection": "Content & Accessibility",
1118
+ "level": "MUST",
1119
+ "rule": "Icon-only buttons have descriptive `aria-label`",
1120
+ "description": "Icon-only buttons have descriptive `aria-label`",
1121
+ "category": "ui-guidelines-vercel",
1122
+ "source": "vercel-labs/web-interface-guidelines",
1123
+ "tags": [
1124
+ "vercel",
1125
+ "web-interface",
1126
+ "accessibility",
1127
+ "aria"
1128
+ ]
1129
+ },
1130
+ {
1131
+ "id": "vercel-content-accessibility-content-accessibility-72",
1132
+ "title": "MUST: Prefer native semantics (`button`, `a`, `label`, `table`) before ARIA",
1133
+ "section": "Content & Accessibility",
1134
+ "subsection": "Content & Accessibility",
1135
+ "level": "MUST",
1136
+ "rule": "Prefer native semantics (`button`, `a`, `label`, `table`) before ARIA",
1137
+ "description": "Prefer native semantics (`button`, `a`, `label`, `table`) before ARIA",
1138
+ "category": "ui-guidelines-vercel",
1139
+ "source": "vercel-labs/web-interface-guidelines",
1140
+ "tags": [
1141
+ "vercel",
1142
+ "web-interface",
1143
+ "accessibility",
1144
+ "aria"
1145
+ ]
1146
+ },
1147
+ {
1148
+ "id": "vercel-content-accessibility-content-accessibility-73",
1149
+ "title": "MUST: Non-breaking spaces: `10&nbsp;MB`, `⌘&nbsp;K`, brand names",
1150
+ "section": "Content & Accessibility",
1151
+ "subsection": "Content & Accessibility",
1152
+ "level": "MUST",
1153
+ "rule": "Non-breaking spaces: `10&nbsp;MB`, `⌘&nbsp;K`, brand names",
1154
+ "description": "Non-breaking spaces: `10&nbsp;MB`, `⌘&nbsp;K`, brand names",
1155
+ "category": "ui-guidelines-vercel",
1156
+ "source": "vercel-labs/web-interface-guidelines",
1157
+ "tags": [
1158
+ "vercel",
1159
+ "web-interface",
1160
+ "accessibility"
1161
+ ]
1162
+ },
1163
+ {
1164
+ "id": "vercel-content-handling-content-handling-74",
1165
+ "title": "MUST: Text containers handle long content (`truncate`, `line-clamp-*`, `break-words`)",
1166
+ "section": "Content Handling",
1167
+ "subsection": "Content Handling",
1168
+ "level": "MUST",
1169
+ "rule": "Text containers handle long content (`truncate`, `line-clamp-*`, `break-words`)",
1170
+ "description": "Text containers handle long content (`truncate`, `line-clamp-*`, `break-words`)",
1171
+ "category": "ui-guidelines-vercel",
1172
+ "source": "vercel-labs/web-interface-guidelines",
1173
+ "tags": [
1174
+ "vercel",
1175
+ "web-interface"
1176
+ ]
1177
+ },
1178
+ {
1179
+ "id": "vercel-content-handling-content-handling-75",
1180
+ "title": "MUST: Flex children need `min-w-0` to allow truncation",
1181
+ "section": "Content Handling",
1182
+ "subsection": "Content Handling",
1183
+ "level": "MUST",
1184
+ "rule": "Flex children need `min-w-0` to allow truncation",
1185
+ "description": "Flex children need `min-w-0` to allow truncation",
1186
+ "category": "ui-guidelines-vercel",
1187
+ "source": "vercel-labs/web-interface-guidelines",
1188
+ "tags": [
1189
+ "vercel",
1190
+ "web-interface"
1191
+ ]
1192
+ },
1193
+ {
1194
+ "id": "vercel-content-handling-content-handling-76",
1195
+ "title": "MUST: Handle empty states—no broken UI for empty strings/arrays",
1196
+ "section": "Content Handling",
1197
+ "subsection": "Content Handling",
1198
+ "level": "MUST",
1199
+ "rule": "Handle empty states—no broken UI for empty strings/arrays",
1200
+ "description": "Handle empty states—no broken UI for empty strings/arrays",
1201
+ "category": "ui-guidelines-vercel",
1202
+ "source": "vercel-labs/web-interface-guidelines",
1203
+ "tags": [
1204
+ "vercel",
1205
+ "web-interface"
1206
+ ]
1207
+ },
1208
+ {
1209
+ "id": "vercel-performance-performance-77",
1210
+ "title": "SHOULD: Test iOS Low Power Mode and macOS Safari",
1211
+ "section": "Performance",
1212
+ "subsection": "Performance",
1213
+ "level": "SHOULD",
1214
+ "rule": "Test iOS Low Power Mode and macOS Safari",
1215
+ "description": "Test iOS Low Power Mode and macOS Safari",
1216
+ "category": "ui-guidelines-vercel",
1217
+ "source": "vercel-labs/web-interface-guidelines",
1218
+ "tags": [
1219
+ "vercel",
1220
+ "web-interface",
1221
+ "form",
1222
+ "performance"
1223
+ ]
1224
+ },
1225
+ {
1226
+ "id": "vercel-performance-performance-78",
1227
+ "title": "MUST: Measure reliably (disable extensions that skew runtime)",
1228
+ "section": "Performance",
1229
+ "subsection": "Performance",
1230
+ "level": "MUST",
1231
+ "rule": "Measure reliably (disable extensions that skew runtime)",
1232
+ "description": "Measure reliably (disable extensions that skew runtime)",
1233
+ "category": "ui-guidelines-vercel",
1234
+ "source": "vercel-labs/web-interface-guidelines",
1235
+ "tags": [
1236
+ "vercel",
1237
+ "web-interface",
1238
+ "form",
1239
+ "performance"
1240
+ ]
1241
+ },
1242
+ {
1243
+ "id": "vercel-performance-performance-79",
1244
+ "title": "MUST: Track and minimize re-renders (React DevTools/React Scan)",
1245
+ "section": "Performance",
1246
+ "subsection": "Performance",
1247
+ "level": "MUST",
1248
+ "rule": "Track and minimize re-renders (React DevTools/React Scan)",
1249
+ "description": "Track and minimize re-renders (React DevTools/React Scan)",
1250
+ "category": "ui-guidelines-vercel",
1251
+ "source": "vercel-labs/web-interface-guidelines",
1252
+ "tags": [
1253
+ "vercel",
1254
+ "web-interface",
1255
+ "form",
1256
+ "performance"
1257
+ ]
1258
+ },
1259
+ {
1260
+ "id": "vercel-performance-performance-80",
1261
+ "title": "MUST: Profile with CPU/network throttling",
1262
+ "section": "Performance",
1263
+ "subsection": "Performance",
1264
+ "level": "MUST",
1265
+ "rule": "Profile with CPU/network throttling",
1266
+ "description": "Profile with CPU/network throttling",
1267
+ "category": "ui-guidelines-vercel",
1268
+ "source": "vercel-labs/web-interface-guidelines",
1269
+ "tags": [
1270
+ "vercel",
1271
+ "web-interface",
1272
+ "form",
1273
+ "performance"
1274
+ ]
1275
+ },
1276
+ {
1277
+ "id": "vercel-performance-performance-81",
1278
+ "title": "MUST: Batch layout reads/writes; avoid reflows/repaints",
1279
+ "section": "Performance",
1280
+ "subsection": "Performance",
1281
+ "level": "MUST",
1282
+ "rule": "Batch layout reads/writes; avoid reflows/repaints",
1283
+ "description": "Batch layout reads/writes; avoid reflows/repaints",
1284
+ "category": "ui-guidelines-vercel",
1285
+ "source": "vercel-labs/web-interface-guidelines",
1286
+ "tags": [
1287
+ "vercel",
1288
+ "web-interface",
1289
+ "form",
1290
+ "performance",
1291
+ "layout"
1292
+ ]
1293
+ },
1294
+ {
1295
+ "id": "vercel-performance-performance-82",
1296
+ "title": "MUST: Mutations (`POST`/`PATCH`/`DELETE`) target <500ms",
1297
+ "section": "Performance",
1298
+ "subsection": "Performance",
1299
+ "level": "MUST",
1300
+ "rule": "Mutations (`POST`/`PATCH`/`DELETE`) target <500ms",
1301
+ "description": "Mutations (`POST`/`PATCH`/`DELETE`) target <500ms",
1302
+ "category": "ui-guidelines-vercel",
1303
+ "source": "vercel-labs/web-interface-guidelines",
1304
+ "tags": [
1305
+ "vercel",
1306
+ "web-interface",
1307
+ "form",
1308
+ "performance"
1309
+ ]
1310
+ },
1311
+ {
1312
+ "id": "vercel-performance-performance-83",
1313
+ "title": "SHOULD: Prefer uncontrolled inputs; controlled inputs cheap per keystroke",
1314
+ "section": "Performance",
1315
+ "subsection": "Performance",
1316
+ "level": "SHOULD",
1317
+ "rule": "Prefer uncontrolled inputs; controlled inputs cheap per keystroke",
1318
+ "description": "Prefer uncontrolled inputs; controlled inputs cheap per keystroke",
1319
+ "category": "ui-guidelines-vercel",
1320
+ "source": "vercel-labs/web-interface-guidelines",
1321
+ "tags": [
1322
+ "vercel",
1323
+ "web-interface",
1324
+ "form",
1325
+ "performance"
1326
+ ]
1327
+ },
1328
+ {
1329
+ "id": "vercel-performance-performance-84",
1330
+ "title": "MUST: Virtualize large lists (>50 items)",
1331
+ "section": "Performance",
1332
+ "subsection": "Performance",
1333
+ "level": "MUST",
1334
+ "rule": "Virtualize large lists (>50 items)",
1335
+ "description": "Virtualize large lists (>50 items)",
1336
+ "category": "ui-guidelines-vercel",
1337
+ "source": "vercel-labs/web-interface-guidelines",
1338
+ "tags": [
1339
+ "vercel",
1340
+ "web-interface",
1341
+ "form",
1342
+ "performance"
1343
+ ]
1344
+ },
1345
+ {
1346
+ "id": "vercel-performance-performance-85",
1347
+ "title": "MUST: Preload above-fold images; lazy-load the rest",
1348
+ "section": "Performance",
1349
+ "subsection": "Performance",
1350
+ "level": "MUST",
1351
+ "rule": "Preload above-fold images; lazy-load the rest",
1352
+ "description": "Preload above-fold images; lazy-load the rest",
1353
+ "category": "ui-guidelines-vercel",
1354
+ "source": "vercel-labs/web-interface-guidelines",
1355
+ "tags": [
1356
+ "vercel",
1357
+ "web-interface",
1358
+ "form",
1359
+ "performance"
1360
+ ]
1361
+ },
1362
+ {
1363
+ "id": "vercel-performance-performance-86",
1364
+ "title": "MUST: Prevent CLS (explicit image dimensions)",
1365
+ "section": "Performance",
1366
+ "subsection": "Performance",
1367
+ "level": "MUST",
1368
+ "rule": "Prevent CLS (explicit image dimensions)",
1369
+ "description": "Prevent CLS (explicit image dimensions)",
1370
+ "category": "ui-guidelines-vercel",
1371
+ "source": "vercel-labs/web-interface-guidelines",
1372
+ "tags": [
1373
+ "vercel",
1374
+ "web-interface",
1375
+ "form",
1376
+ "performance"
1377
+ ]
1378
+ },
1379
+ {
1380
+ "id": "vercel-performance-performance-87",
1381
+ "title": "SHOULD: `<link rel=\"preconnect\">` for CDN domains",
1382
+ "section": "Performance",
1383
+ "subsection": "Performance",
1384
+ "level": "SHOULD",
1385
+ "rule": "`<link rel=\"preconnect\">` for CDN domains",
1386
+ "description": "`<link rel=\"preconnect\">` for CDN domains",
1387
+ "category": "ui-guidelines-vercel",
1388
+ "source": "vercel-labs/web-interface-guidelines",
1389
+ "tags": [
1390
+ "vercel",
1391
+ "web-interface",
1392
+ "form",
1393
+ "performance"
1394
+ ]
1395
+ },
1396
+ {
1397
+ "id": "vercel-performance-performance-88",
1398
+ "title": "SHOULD: Critical fonts: `<link rel=\"preload\" as=\"font\">` with `font-display: swap`",
1399
+ "section": "Performance",
1400
+ "subsection": "Performance",
1401
+ "level": "SHOULD",
1402
+ "rule": "Critical fonts: `<link rel=\"preload\" as=\"font\">` with `font-display: swap`",
1403
+ "description": "Critical fonts: `<link rel=\"preload\" as=\"font\">` with `font-display: swap`",
1404
+ "category": "ui-guidelines-vercel",
1405
+ "source": "vercel-labs/web-interface-guidelines",
1406
+ "tags": [
1407
+ "vercel",
1408
+ "web-interface",
1409
+ "form",
1410
+ "performance"
1411
+ ]
1412
+ },
1413
+ {
1414
+ "id": "vercel-dark-mode-theming-dark-mode-theming-89",
1415
+ "title": "MUST: `color-scheme: dark` on `<html>` for dark themes",
1416
+ "section": "Dark Mode & Theming",
1417
+ "subsection": "Dark Mode & Theming",
1418
+ "level": "MUST",
1419
+ "rule": "`color-scheme: dark` on `<html>` for dark themes",
1420
+ "description": "`color-scheme: dark` on `<html>` for dark themes",
1421
+ "category": "ui-guidelines-vercel",
1422
+ "source": "vercel-labs/web-interface-guidelines",
1423
+ "tags": [
1424
+ "vercel",
1425
+ "web-interface",
1426
+ "dark"
1427
+ ]
1428
+ },
1429
+ {
1430
+ "id": "vercel-dark-mode-theming-dark-mode-theming-90",
1431
+ "title": "SHOULD: `<meta name=\"theme-color\">` matches page background",
1432
+ "section": "Dark Mode & Theming",
1433
+ "subsection": "Dark Mode & Theming",
1434
+ "level": "SHOULD",
1435
+ "rule": "`<meta name=\"theme-color\">` matches page background",
1436
+ "description": "`<meta name=\"theme-color\">` matches page background",
1437
+ "category": "ui-guidelines-vercel",
1438
+ "source": "vercel-labs/web-interface-guidelines",
1439
+ "tags": [
1440
+ "vercel",
1441
+ "web-interface",
1442
+ "dark"
1443
+ ]
1444
+ },
1445
+ {
1446
+ "id": "vercel-dark-mode-theming-dark-mode-theming-91",
1447
+ "title": "MUST: Native `<select>`: explicit `background-color` and `color` (Windows fix)",
1448
+ "section": "Dark Mode & Theming",
1449
+ "subsection": "Dark Mode & Theming",
1450
+ "level": "MUST",
1451
+ "rule": "Native `<select>`: explicit `background-color` and `color` (Windows fix)",
1452
+ "description": "Native `<select>`: explicit `background-color` and `color` (Windows fix)",
1453
+ "category": "ui-guidelines-vercel",
1454
+ "source": "vercel-labs/web-interface-guidelines",
1455
+ "tags": [
1456
+ "vercel",
1457
+ "web-interface",
1458
+ "dark"
1459
+ ]
1460
+ },
1461
+ {
1462
+ "id": "vercel-hydration-hydration-92",
1463
+ "title": "MUST: Inputs with `value` need `onChange` (or use `defaultValue`)",
1464
+ "section": "Hydration",
1465
+ "subsection": "Hydration",
1466
+ "level": "MUST",
1467
+ "rule": "Inputs with `value` need `onChange` (or use `defaultValue`)",
1468
+ "description": "Inputs with `value` need `onChange` (or use `defaultValue`)",
1469
+ "category": "ui-guidelines-vercel",
1470
+ "source": "vercel-labs/web-interface-guidelines",
1471
+ "tags": [
1472
+ "vercel",
1473
+ "web-interface",
1474
+ "hydration"
1475
+ ]
1476
+ },
1477
+ {
1478
+ "id": "vercel-hydration-hydration-93",
1479
+ "title": "SHOULD: Guard date/time rendering against hydration mismatch",
1480
+ "section": "Hydration",
1481
+ "subsection": "Hydration",
1482
+ "level": "SHOULD",
1483
+ "rule": "Guard date/time rendering against hydration mismatch",
1484
+ "description": "Guard date/time rendering against hydration mismatch",
1485
+ "category": "ui-guidelines-vercel",
1486
+ "source": "vercel-labs/web-interface-guidelines",
1487
+ "tags": [
1488
+ "vercel",
1489
+ "web-interface",
1490
+ "hydration"
1491
+ ]
1492
+ },
1493
+ {
1494
+ "id": "vercel-design-design-94",
1495
+ "title": "SHOULD: Layered shadows (ambient + direct)",
1496
+ "section": "Design",
1497
+ "subsection": "Design",
1498
+ "level": "SHOULD",
1499
+ "rule": "Layered shadows (ambient + direct)",
1500
+ "description": "Layered shadows (ambient + direct)",
1501
+ "category": "ui-guidelines-vercel",
1502
+ "source": "vercel-labs/web-interface-guidelines",
1503
+ "tags": [
1504
+ "vercel",
1505
+ "web-interface"
1506
+ ]
1507
+ },
1508
+ {
1509
+ "id": "vercel-design-design-95",
1510
+ "title": "SHOULD: Crisp edges via semi-transparent borders + shadows",
1511
+ "section": "Design",
1512
+ "subsection": "Design",
1513
+ "level": "SHOULD",
1514
+ "rule": "Crisp edges via semi-transparent borders + shadows",
1515
+ "description": "Crisp edges via semi-transparent borders + shadows",
1516
+ "category": "ui-guidelines-vercel",
1517
+ "source": "vercel-labs/web-interface-guidelines",
1518
+ "tags": [
1519
+ "vercel",
1520
+ "web-interface"
1521
+ ]
1522
+ },
1523
+ {
1524
+ "id": "vercel-design-design-96",
1525
+ "title": "SHOULD: Nested radii: child ≤ parent; concentric",
1526
+ "section": "Design",
1527
+ "subsection": "Design",
1528
+ "level": "SHOULD",
1529
+ "rule": "Nested radii: child ≤ parent; concentric",
1530
+ "description": "Nested radii: child ≤ parent; concentric",
1531
+ "category": "ui-guidelines-vercel",
1532
+ "source": "vercel-labs/web-interface-guidelines",
1533
+ "tags": [
1534
+ "vercel",
1535
+ "web-interface"
1536
+ ]
1537
+ },
1538
+ {
1539
+ "id": "vercel-design-design-97",
1540
+ "title": "SHOULD: Hue consistency: tint borders/shadows/text toward bg hue",
1541
+ "section": "Design",
1542
+ "subsection": "Design",
1543
+ "level": "SHOULD",
1544
+ "rule": "Hue consistency: tint borders/shadows/text toward bg hue",
1545
+ "description": "Hue consistency: tint borders/shadows/text toward bg hue",
1546
+ "category": "ui-guidelines-vercel",
1547
+ "source": "vercel-labs/web-interface-guidelines",
1548
+ "tags": [
1549
+ "vercel",
1550
+ "web-interface"
1551
+ ]
1552
+ },
1553
+ {
1554
+ "id": "vercel-design-design-98",
1555
+ "title": "MUST: Accessible charts (color-blind-friendly palettes)",
1556
+ "section": "Design",
1557
+ "subsection": "Design",
1558
+ "level": "MUST",
1559
+ "rule": "Accessible charts (color-blind-friendly palettes)",
1560
+ "description": "Accessible charts (color-blind-friendly palettes)",
1561
+ "category": "ui-guidelines-vercel",
1562
+ "source": "vercel-labs/web-interface-guidelines",
1563
+ "tags": [
1564
+ "vercel",
1565
+ "web-interface"
1566
+ ]
1567
+ },
1568
+ {
1569
+ "id": "vercel-design-design-99",
1570
+ "title": "MUST: Meet contrast—prefer [APCA](https://apcacontrast.com/) over WCAG 2",
1571
+ "section": "Design",
1572
+ "subsection": "Design",
1573
+ "level": "MUST",
1574
+ "rule": "Meet contrast—prefer [APCA](https://apcacontrast.com/) over WCAG 2",
1575
+ "description": "Meet contrast—prefer [APCA](https://apcacontrast.com/) over WCAG 2",
1576
+ "category": "ui-guidelines-vercel",
1577
+ "source": "vercel-labs/web-interface-guidelines",
1578
+ "tags": [
1579
+ "vercel",
1580
+ "web-interface",
1581
+ "contrast"
1582
+ ]
1583
+ },
1584
+ {
1585
+ "id": "vercel-design-design-100",
1586
+ "title": "MUST: Increase contrast on `:hover`/`:active`/`:focus`",
1587
+ "section": "Design",
1588
+ "subsection": "Design",
1589
+ "level": "MUST",
1590
+ "rule": "Increase contrast on `:hover`/`:active`/`:focus`",
1591
+ "description": "Increase contrast on `:hover`/`:active`/`:focus`",
1592
+ "category": "ui-guidelines-vercel",
1593
+ "source": "vercel-labs/web-interface-guidelines",
1594
+ "tags": [
1595
+ "vercel",
1596
+ "web-interface",
1597
+ "focus",
1598
+ "contrast"
1599
+ ]
1600
+ },
1601
+ {
1602
+ "id": "vercel-design-design-101",
1603
+ "title": "SHOULD: Match browser UI to bg",
1604
+ "section": "Design",
1605
+ "subsection": "Design",
1606
+ "level": "SHOULD",
1607
+ "rule": "Match browser UI to bg",
1608
+ "description": "Match browser UI to bg",
1609
+ "category": "ui-guidelines-vercel",
1610
+ "source": "vercel-labs/web-interface-guidelines",
1611
+ "tags": [
1612
+ "vercel",
1613
+ "web-interface"
1614
+ ]
1615
+ },
1616
+ {
1617
+ "id": "vercel-design-design-102",
1618
+ "title": "SHOULD: Avoid dark color gradient banding (use background images when needed)",
1619
+ "section": "Design",
1620
+ "subsection": "Design",
1621
+ "level": "SHOULD",
1622
+ "rule": "Avoid dark color gradient banding (use background images when needed)",
1623
+ "description": "Avoid dark color gradient banding (use background images when needed)",
1624
+ "category": "ui-guidelines-vercel",
1625
+ "source": "vercel-labs/web-interface-guidelines",
1626
+ "tags": [
1627
+ "vercel",
1628
+ "web-interface",
1629
+ "dark"
1630
+ ]
1631
+ }
1632
+ ]