mcp-probe-kit 3.0.14 → 3.0.16
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/README.md +17 -11
- package/build/lib/__tests__/gitnexus-bridge.unit.test.js +9 -1
- package/build/lib/gitnexus-bridge.d.ts +1 -0
- package/build/lib/gitnexus-bridge.js +29 -1
- package/build/lib/skill-bridge.d.ts +31 -0
- package/build/lib/skill-bridge.js +100 -0
- package/build/resources/ui-ux-data/charts.json +302 -0
- package/build/resources/ui-ux-data/colors.json +1058 -0
- package/build/resources/ui-ux-data/icons.json +1102 -0
- package/build/resources/ui-ux-data/landing.json +262 -0
- package/build/resources/ui-ux-data/metadata.json +6 -0
- package/build/resources/ui-ux-data/products.json +1058 -0
- package/build/resources/ui-ux-data/react-performance.json +574 -0
- package/build/resources/ui-ux-data/stacks/astro.json +266 -0
- package/build/resources/ui-ux-data/stacks/flutter.json +626 -0
- package/build/resources/ui-ux-data/stacks/html-tailwind.json +662 -0
- package/build/resources/ui-ux-data/stacks/jetpack-compose.json +626 -0
- package/build/resources/ui-ux-data/stacks/nextjs.json +218 -0
- package/build/resources/ui-ux-data/stacks/nuxt-ui.json +14 -0
- package/build/resources/ui-ux-data/stacks/nuxtjs.json +182 -0
- package/build/resources/ui-ux-data/stacks/react-native.json +350 -0
- package/build/resources/ui-ux-data/stacks/react.json +530 -0
- package/build/resources/ui-ux-data/stacks/shadcn.json +566 -0
- package/build/resources/ui-ux-data/stacks/svelte.json +134 -0
- package/build/resources/ui-ux-data/stacks/swiftui.json +26 -0
- package/build/resources/ui-ux-data/stacks/vue.json +170 -0
- package/build/resources/ui-ux-data/styles.json +1610 -0
- package/build/resources/ui-ux-data/typography.json +743 -0
- package/build/resources/ui-ux-data/ui-reasoning.json +1431 -0
- package/build/resources/ui-ux-data/ux-guidelines.json +1190 -0
- package/build/resources/ui-ux-data/web-interface.json +389 -0
- package/build/schemas/ui-ux-schemas.js +1 -1
- package/build/tools/start_product.js +8 -1
- package/build/tools/start_ui.js +14 -3
- package/build/tools/ui-ux-tools.js +21 -17
- package/build/utils/ui-data-loader.d.ts +18 -2
- package/build/utils/ui-data-loader.js +74 -12
- package/docs/i18n/en.json +4 -2
- package/docs/i18n/ja.json +4 -2
- package/docs/i18n/ko.json +4 -2
- package/docs/i18n/zh-CN.json +4 -2
- package/docs/pages/getting-started.html +3 -0
- package/package.json +2 -1
|
@@ -0,0 +1,1190 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"No": "1",
|
|
4
|
+
"Category": "Navigation",
|
|
5
|
+
"Issue": "Smooth Scroll",
|
|
6
|
+
"Platform": "Web",
|
|
7
|
+
"Description": "Anchor links should scroll smoothly to target section",
|
|
8
|
+
"Do": "Use scroll-behavior: smooth on html element",
|
|
9
|
+
"Don't": "Jump directly without transition",
|
|
10
|
+
"Code Example Good": "html { scroll-behavior: smooth; }",
|
|
11
|
+
"Code Example Bad": "<a href='#section'> without CSS",
|
|
12
|
+
"Severity": "High"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"No": "2",
|
|
16
|
+
"Category": "Navigation",
|
|
17
|
+
"Issue": "Sticky Navigation",
|
|
18
|
+
"Platform": "Web",
|
|
19
|
+
"Description": "Fixed nav should not obscure content",
|
|
20
|
+
"Do": "Add padding-top to body equal to nav height",
|
|
21
|
+
"Don't": "Let nav overlap first section content",
|
|
22
|
+
"Code Example Good": "pt-20 (if nav is h-20)",
|
|
23
|
+
"Code Example Bad": "No padding compensation",
|
|
24
|
+
"Severity": "Medium"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"No": "3",
|
|
28
|
+
"Category": "Navigation",
|
|
29
|
+
"Issue": "Active State",
|
|
30
|
+
"Platform": "All",
|
|
31
|
+
"Description": "Current page/section should be visually indicated",
|
|
32
|
+
"Do": "Highlight active nav item with color/underline",
|
|
33
|
+
"Don't": "No visual feedback on current location",
|
|
34
|
+
"Code Example Good": "text-primary border-b-2",
|
|
35
|
+
"Code Example Bad": "All links same style",
|
|
36
|
+
"Severity": "Medium"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"No": "4",
|
|
40
|
+
"Category": "Navigation",
|
|
41
|
+
"Issue": "Back Button",
|
|
42
|
+
"Platform": "Mobile",
|
|
43
|
+
"Description": "Users expect back to work predictably",
|
|
44
|
+
"Do": "Preserve navigation history properly",
|
|
45
|
+
"Don't": "Break browser/app back button behavior",
|
|
46
|
+
"Code Example Good": "history.pushState()",
|
|
47
|
+
"Code Example Bad": "location.replace()",
|
|
48
|
+
"Severity": "High"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"No": "5",
|
|
52
|
+
"Category": "Navigation",
|
|
53
|
+
"Issue": "Deep Linking",
|
|
54
|
+
"Platform": "All",
|
|
55
|
+
"Description": "URLs should reflect current state for sharing",
|
|
56
|
+
"Do": "Update URL on state/view changes",
|
|
57
|
+
"Don't": "Static URLs for dynamic content",
|
|
58
|
+
"Code Example Good": "Use query params or hash",
|
|
59
|
+
"Code Example Bad": "Single URL for all states",
|
|
60
|
+
"Severity": "Medium"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"No": "6",
|
|
64
|
+
"Category": "Navigation",
|
|
65
|
+
"Issue": "Breadcrumbs",
|
|
66
|
+
"Platform": "Web",
|
|
67
|
+
"Description": "Show user location in site hierarchy",
|
|
68
|
+
"Do": "Use for sites with 3+ levels of depth",
|
|
69
|
+
"Don't": "Use for flat single-level sites",
|
|
70
|
+
"Code Example Good": "Home > Category > Product",
|
|
71
|
+
"Code Example Bad": "Only on deep nested pages",
|
|
72
|
+
"Severity": "Low"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"No": "7",
|
|
76
|
+
"Category": "Animation",
|
|
77
|
+
"Issue": "Excessive Motion",
|
|
78
|
+
"Platform": "All",
|
|
79
|
+
"Description": "Too many animations cause distraction and motion sickness",
|
|
80
|
+
"Do": "Animate 1-2 key elements per view maximum",
|
|
81
|
+
"Don't": "Animate everything that moves",
|
|
82
|
+
"Code Example Good": "Single hero animation",
|
|
83
|
+
"Code Example Bad": "animate-bounce on 5+ elements",
|
|
84
|
+
"Severity": "High"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"No": "8",
|
|
88
|
+
"Category": "Animation",
|
|
89
|
+
"Issue": "Duration Timing",
|
|
90
|
+
"Platform": "All",
|
|
91
|
+
"Description": "Animations should feel responsive not sluggish",
|
|
92
|
+
"Do": "Use 150-300ms for micro-interactions",
|
|
93
|
+
"Don't": "Use animations longer than 500ms for UI",
|
|
94
|
+
"Code Example Good": "transition-all duration-200",
|
|
95
|
+
"Code Example Bad": "duration-1000",
|
|
96
|
+
"Severity": "Medium"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"No": "9",
|
|
100
|
+
"Category": "Animation",
|
|
101
|
+
"Issue": "Reduced Motion",
|
|
102
|
+
"Platform": "All",
|
|
103
|
+
"Description": "Respect user's motion preferences",
|
|
104
|
+
"Do": "Check prefers-reduced-motion media query",
|
|
105
|
+
"Don't": "Ignore accessibility motion settings",
|
|
106
|
+
"Code Example Good": "@media (prefers-reduced-motion: reduce)",
|
|
107
|
+
"Code Example Bad": "No motion query check",
|
|
108
|
+
"Severity": "High"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"No": "10",
|
|
112
|
+
"Category": "Animation",
|
|
113
|
+
"Issue": "Loading States",
|
|
114
|
+
"Platform": "All",
|
|
115
|
+
"Description": "Show feedback during async operations",
|
|
116
|
+
"Do": "Use skeleton screens or spinners",
|
|
117
|
+
"Don't": "Leave UI frozen with no feedback",
|
|
118
|
+
"Code Example Good": "animate-pulse skeleton",
|
|
119
|
+
"Code Example Bad": "Blank screen while loading",
|
|
120
|
+
"Severity": "High"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"No": "11",
|
|
124
|
+
"Category": "Animation",
|
|
125
|
+
"Issue": "Hover vs Tap",
|
|
126
|
+
"Platform": "All",
|
|
127
|
+
"Description": "Hover effects don't work on touch devices",
|
|
128
|
+
"Do": "Use click/tap for primary interactions",
|
|
129
|
+
"Don't": "Rely only on hover for important actions",
|
|
130
|
+
"Code Example Good": "onClick handler",
|
|
131
|
+
"Code Example Bad": "onMouseEnter only",
|
|
132
|
+
"Severity": "High"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"No": "12",
|
|
136
|
+
"Category": "Animation",
|
|
137
|
+
"Issue": "Continuous Animation",
|
|
138
|
+
"Platform": "All",
|
|
139
|
+
"Description": "Infinite animations are distracting",
|
|
140
|
+
"Do": "Use for loading indicators only",
|
|
141
|
+
"Don't": "Use for decorative elements",
|
|
142
|
+
"Code Example Good": "animate-spin on loader",
|
|
143
|
+
"Code Example Bad": "animate-bounce on icons",
|
|
144
|
+
"Severity": "Medium"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"No": "13",
|
|
148
|
+
"Category": "Animation",
|
|
149
|
+
"Issue": "Transform Performance",
|
|
150
|
+
"Platform": "Web",
|
|
151
|
+
"Description": "Some CSS properties trigger expensive repaints",
|
|
152
|
+
"Do": "Use transform and opacity for animations",
|
|
153
|
+
"Don't": "Animate width/height/top/left properties",
|
|
154
|
+
"Code Example Good": "transform: translateY()",
|
|
155
|
+
"Code Example Bad": "top: 10px animation",
|
|
156
|
+
"Severity": "Medium"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"No": "14",
|
|
160
|
+
"Category": "Animation",
|
|
161
|
+
"Issue": "Easing Functions",
|
|
162
|
+
"Platform": "All",
|
|
163
|
+
"Description": "Linear motion feels robotic",
|
|
164
|
+
"Do": "Use ease-out for entering ease-in for exiting",
|
|
165
|
+
"Don't": "Use linear for UI transitions",
|
|
166
|
+
"Code Example Good": "ease-out",
|
|
167
|
+
"Code Example Bad": "linear",
|
|
168
|
+
"Severity": "Low"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"No": "15",
|
|
172
|
+
"Category": "Layout",
|
|
173
|
+
"Issue": "Z-Index Management",
|
|
174
|
+
"Platform": "Web",
|
|
175
|
+
"Description": "Stacking context conflicts cause hidden elements",
|
|
176
|
+
"Do": "Define z-index scale system (10 20 30 50)",
|
|
177
|
+
"Don't": "Use arbitrary large z-index values",
|
|
178
|
+
"Code Example Good": "z-10 z-20 z-50",
|
|
179
|
+
"Code Example Bad": "z-[9999]",
|
|
180
|
+
"Severity": "High"
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"No": "16",
|
|
184
|
+
"Category": "Layout",
|
|
185
|
+
"Issue": "Overflow Hidden",
|
|
186
|
+
"Platform": "Web",
|
|
187
|
+
"Description": "Hidden overflow can clip important content",
|
|
188
|
+
"Do": "Test all content fits within containers",
|
|
189
|
+
"Don't": "Blindly apply overflow-hidden",
|
|
190
|
+
"Code Example Good": "overflow-auto with scroll",
|
|
191
|
+
"Code Example Bad": "overflow-hidden truncating content",
|
|
192
|
+
"Severity": "Medium"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"No": "17",
|
|
196
|
+
"Category": "Layout",
|
|
197
|
+
"Issue": "Fixed Positioning",
|
|
198
|
+
"Platform": "Web",
|
|
199
|
+
"Description": "Fixed elements can overlap or be inaccessible",
|
|
200
|
+
"Do": "Account for safe areas and other fixed elements",
|
|
201
|
+
"Don't": "Stack multiple fixed elements carelessly",
|
|
202
|
+
"Code Example Good": "Fixed nav + fixed bottom with gap",
|
|
203
|
+
"Code Example Bad": "Multiple overlapping fixed elements",
|
|
204
|
+
"Severity": "Medium"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"No": "18",
|
|
208
|
+
"Category": "Layout",
|
|
209
|
+
"Issue": "Stacking Context",
|
|
210
|
+
"Platform": "Web",
|
|
211
|
+
"Description": "New stacking contexts reset z-index",
|
|
212
|
+
"Do": "Understand what creates new stacking context",
|
|
213
|
+
"Don't": "Expect z-index to work across contexts",
|
|
214
|
+
"Code Example Good": "Parent with z-index isolates children",
|
|
215
|
+
"Code Example Bad": "z-index: 9999 not working",
|
|
216
|
+
"Severity": "Medium"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"No": "19",
|
|
220
|
+
"Category": "Layout",
|
|
221
|
+
"Issue": "Content Jumping",
|
|
222
|
+
"Platform": "Web",
|
|
223
|
+
"Description": "Layout shift when content loads is jarring",
|
|
224
|
+
"Do": "Reserve space for async content",
|
|
225
|
+
"Don't": "Let images/content push layout around",
|
|
226
|
+
"Code Example Good": "aspect-ratio or fixed height",
|
|
227
|
+
"Code Example Bad": "No dimensions on images",
|
|
228
|
+
"Severity": "High"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"No": "20",
|
|
232
|
+
"Category": "Layout",
|
|
233
|
+
"Issue": "Viewport Units",
|
|
234
|
+
"Platform": "Web",
|
|
235
|
+
"Description": "100vh can be problematic on mobile browsers",
|
|
236
|
+
"Do": "Use dvh or account for mobile browser chrome",
|
|
237
|
+
"Don't": "Use 100vh for full-screen mobile layouts",
|
|
238
|
+
"Code Example Good": "min-h-dvh or min-h-screen",
|
|
239
|
+
"Code Example Bad": "h-screen on mobile",
|
|
240
|
+
"Severity": "Medium"
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"No": "21",
|
|
244
|
+
"Category": "Layout",
|
|
245
|
+
"Issue": "Container Width",
|
|
246
|
+
"Platform": "Web",
|
|
247
|
+
"Description": "Content too wide is hard to read",
|
|
248
|
+
"Do": "Limit max-width for text content (65-75ch)",
|
|
249
|
+
"Don't": "Let text span full viewport width",
|
|
250
|
+
"Code Example Good": "max-w-prose or max-w-3xl",
|
|
251
|
+
"Code Example Bad": "Full width paragraphs",
|
|
252
|
+
"Severity": "Medium"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"No": "22",
|
|
256
|
+
"Category": "Touch",
|
|
257
|
+
"Issue": "Touch Target Size",
|
|
258
|
+
"Platform": "Mobile",
|
|
259
|
+
"Description": "Small buttons are hard to tap accurately",
|
|
260
|
+
"Do": "Minimum 44x44px touch targets",
|
|
261
|
+
"Don't": "Tiny clickable areas",
|
|
262
|
+
"Code Example Good": "min-h-[44px] min-w-[44px]",
|
|
263
|
+
"Code Example Bad": "w-6 h-6 buttons",
|
|
264
|
+
"Severity": "High"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"No": "23",
|
|
268
|
+
"Category": "Touch",
|
|
269
|
+
"Issue": "Touch Spacing",
|
|
270
|
+
"Platform": "Mobile",
|
|
271
|
+
"Description": "Adjacent touch targets need adequate spacing",
|
|
272
|
+
"Do": "Minimum 8px gap between touch targets",
|
|
273
|
+
"Don't": "Tightly packed clickable elements",
|
|
274
|
+
"Code Example Good": "gap-2 between buttons",
|
|
275
|
+
"Code Example Bad": "gap-0 or gap-1",
|
|
276
|
+
"Severity": "Medium"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"No": "24",
|
|
280
|
+
"Category": "Touch",
|
|
281
|
+
"Issue": "Gesture Conflicts",
|
|
282
|
+
"Platform": "Mobile",
|
|
283
|
+
"Description": "Custom gestures can conflict with system",
|
|
284
|
+
"Do": "Avoid horizontal swipe on main content",
|
|
285
|
+
"Don't": "Override system gestures",
|
|
286
|
+
"Code Example Good": "Vertical scroll primary",
|
|
287
|
+
"Code Example Bad": "Horizontal swipe carousel only",
|
|
288
|
+
"Severity": "Medium"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"No": "25",
|
|
292
|
+
"Category": "Touch",
|
|
293
|
+
"Issue": "Tap Delay",
|
|
294
|
+
"Platform": "Mobile",
|
|
295
|
+
"Description": "300ms tap delay feels laggy",
|
|
296
|
+
"Do": "Use touch-action CSS or fastclick",
|
|
297
|
+
"Don't": "Default mobile tap handling",
|
|
298
|
+
"Code Example Good": "touch-action: manipulation",
|
|
299
|
+
"Code Example Bad": "No touch optimization",
|
|
300
|
+
"Severity": "Medium"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"No": "26",
|
|
304
|
+
"Category": "Touch",
|
|
305
|
+
"Issue": "Pull to Refresh",
|
|
306
|
+
"Platform": "Mobile",
|
|
307
|
+
"Description": "Accidental refresh is frustrating",
|
|
308
|
+
"Do": "Disable where not needed",
|
|
309
|
+
"Don't": "Enable by default everywhere",
|
|
310
|
+
"Code Example Good": "overscroll-behavior: contain",
|
|
311
|
+
"Code Example Bad": "Default overscroll",
|
|
312
|
+
"Severity": "Low"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"No": "27",
|
|
316
|
+
"Category": "Touch",
|
|
317
|
+
"Issue": "Haptic Feedback",
|
|
318
|
+
"Platform": "Mobile",
|
|
319
|
+
"Description": "Tactile feedback improves interaction feel",
|
|
320
|
+
"Do": "Use for confirmations and important actions",
|
|
321
|
+
"Don't": "Overuse vibration feedback",
|
|
322
|
+
"Code Example Good": "navigator.vibrate(10)",
|
|
323
|
+
"Code Example Bad": "Vibrate on every tap",
|
|
324
|
+
"Severity": "Low"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"No": "28",
|
|
328
|
+
"Category": "Interaction",
|
|
329
|
+
"Issue": "Focus States",
|
|
330
|
+
"Platform": "All",
|
|
331
|
+
"Description": "Keyboard users need visible focus indicators",
|
|
332
|
+
"Do": "Use visible focus rings on interactive elements",
|
|
333
|
+
"Don't": "Remove focus outline without replacement",
|
|
334
|
+
"Code Example Good": "focus:ring-2 focus:ring-blue-500",
|
|
335
|
+
"Code Example Bad": "outline-none without alternative",
|
|
336
|
+
"Severity": "High"
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"No": "29",
|
|
340
|
+
"Category": "Interaction",
|
|
341
|
+
"Issue": "Hover States",
|
|
342
|
+
"Platform": "Web",
|
|
343
|
+
"Description": "Visual feedback on interactive elements",
|
|
344
|
+
"Do": "Change cursor and add subtle visual change",
|
|
345
|
+
"Don't": "No hover feedback on clickable elements",
|
|
346
|
+
"Code Example Good": "hover:bg-gray-100 cursor-pointer",
|
|
347
|
+
"Code Example Bad": "No hover style",
|
|
348
|
+
"Severity": "Medium"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"No": "30",
|
|
352
|
+
"Category": "Interaction",
|
|
353
|
+
"Issue": "Active States",
|
|
354
|
+
"Platform": "All",
|
|
355
|
+
"Description": "Show immediate feedback on press/click",
|
|
356
|
+
"Do": "Add pressed/active state visual change",
|
|
357
|
+
"Don't": "No feedback during interaction",
|
|
358
|
+
"Code Example Good": "active:scale-95",
|
|
359
|
+
"Code Example Bad": "No active state",
|
|
360
|
+
"Severity": "Medium"
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"No": "31",
|
|
364
|
+
"Category": "Interaction",
|
|
365
|
+
"Issue": "Disabled States",
|
|
366
|
+
"Platform": "All",
|
|
367
|
+
"Description": "Clearly indicate non-interactive elements",
|
|
368
|
+
"Do": "Reduce opacity and change cursor",
|
|
369
|
+
"Don't": "Confuse disabled with normal state",
|
|
370
|
+
"Code Example Good": "opacity-50 cursor-not-allowed",
|
|
371
|
+
"Code Example Bad": "Same style as enabled",
|
|
372
|
+
"Severity": "Medium"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"No": "32",
|
|
376
|
+
"Category": "Interaction",
|
|
377
|
+
"Issue": "Loading Buttons",
|
|
378
|
+
"Platform": "All",
|
|
379
|
+
"Description": "Prevent double submission during async actions",
|
|
380
|
+
"Do": "Disable button and show loading state",
|
|
381
|
+
"Don't": "Allow multiple clicks during processing",
|
|
382
|
+
"Code Example Good": "disabled={loading} spinner",
|
|
383
|
+
"Code Example Bad": "Button clickable while loading",
|
|
384
|
+
"Severity": "High"
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
"No": "33",
|
|
388
|
+
"Category": "Interaction",
|
|
389
|
+
"Issue": "Error Feedback",
|
|
390
|
+
"Platform": "All",
|
|
391
|
+
"Description": "Users need to know when something fails",
|
|
392
|
+
"Do": "Show clear error messages near problem",
|
|
393
|
+
"Don't": "Silent failures with no feedback",
|
|
394
|
+
"Code Example Good": "Red border + error message",
|
|
395
|
+
"Code Example Bad": "No indication of error",
|
|
396
|
+
"Severity": "High"
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"No": "34",
|
|
400
|
+
"Category": "Interaction",
|
|
401
|
+
"Issue": "Success Feedback",
|
|
402
|
+
"Platform": "All",
|
|
403
|
+
"Description": "Confirm successful actions to users",
|
|
404
|
+
"Do": "Show success message or visual change",
|
|
405
|
+
"Don't": "No confirmation of completed action",
|
|
406
|
+
"Code Example Good": "Toast notification or checkmark",
|
|
407
|
+
"Code Example Bad": "Action completes silently",
|
|
408
|
+
"Severity": "Medium"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"No": "35",
|
|
412
|
+
"Category": "Interaction",
|
|
413
|
+
"Issue": "Confirmation Dialogs",
|
|
414
|
+
"Platform": "All",
|
|
415
|
+
"Description": "Prevent accidental destructive actions",
|
|
416
|
+
"Do": "Confirm before delete/irreversible actions",
|
|
417
|
+
"Don't": "Delete without confirmation",
|
|
418
|
+
"Code Example Good": "Are you sure modal",
|
|
419
|
+
"Code Example Bad": "Direct delete on click",
|
|
420
|
+
"Severity": "High"
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"No": "36",
|
|
424
|
+
"Category": "Accessibility",
|
|
425
|
+
"Issue": "Color Contrast",
|
|
426
|
+
"Platform": "All",
|
|
427
|
+
"Description": "Text must be readable against background",
|
|
428
|
+
"Do": "Minimum 4.5:1 ratio for normal text",
|
|
429
|
+
"Don't": "Low contrast text",
|
|
430
|
+
"Code Example Good": "#333 on white (7:1)",
|
|
431
|
+
"Code Example Bad": "#999 on white (2.8:1)",
|
|
432
|
+
"Severity": "High"
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"No": "37",
|
|
436
|
+
"Category": "Accessibility",
|
|
437
|
+
"Issue": "Color Only",
|
|
438
|
+
"Platform": "All",
|
|
439
|
+
"Description": "Don't convey information by color alone",
|
|
440
|
+
"Do": "Use icons/text in addition to color",
|
|
441
|
+
"Don't": "Red/green only for error/success",
|
|
442
|
+
"Code Example Good": "Red text + error icon",
|
|
443
|
+
"Code Example Bad": "Red border only for error",
|
|
444
|
+
"Severity": "High"
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"No": "38",
|
|
448
|
+
"Category": "Accessibility",
|
|
449
|
+
"Issue": "Alt Text",
|
|
450
|
+
"Platform": "All",
|
|
451
|
+
"Description": "Images need text alternatives",
|
|
452
|
+
"Do": "Descriptive alt text for meaningful images",
|
|
453
|
+
"Don't": "Empty or missing alt attributes",
|
|
454
|
+
"Code Example Good": "alt='Dog playing in park'",
|
|
455
|
+
"Code Example Bad": "alt='' for content images",
|
|
456
|
+
"Severity": "High"
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"No": "39",
|
|
460
|
+
"Category": "Accessibility",
|
|
461
|
+
"Issue": "Heading Hierarchy",
|
|
462
|
+
"Platform": "Web",
|
|
463
|
+
"Description": "Screen readers use headings for navigation",
|
|
464
|
+
"Do": "Use sequential heading levels h1-h6",
|
|
465
|
+
"Don't": "Skip heading levels or misuse for styling",
|
|
466
|
+
"Code Example Good": "h1 then h2 then h3",
|
|
467
|
+
"Code Example Bad": "h1 then h4",
|
|
468
|
+
"Severity": "Medium"
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
"No": "40",
|
|
472
|
+
"Category": "Accessibility",
|
|
473
|
+
"Issue": "ARIA Labels",
|
|
474
|
+
"Platform": "All",
|
|
475
|
+
"Description": "Interactive elements need accessible names",
|
|
476
|
+
"Do": "Add aria-label for icon-only buttons",
|
|
477
|
+
"Don't": "Icon buttons without labels",
|
|
478
|
+
"Code Example Good": "aria-label='Close menu'",
|
|
479
|
+
"Code Example Bad": "<button><Icon/></button>",
|
|
480
|
+
"Severity": "High"
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"No": "41",
|
|
484
|
+
"Category": "Accessibility",
|
|
485
|
+
"Issue": "Keyboard Navigation",
|
|
486
|
+
"Platform": "Web",
|
|
487
|
+
"Description": "All functionality accessible via keyboard",
|
|
488
|
+
"Do": "Tab order matches visual order",
|
|
489
|
+
"Don't": "Keyboard traps or illogical tab order",
|
|
490
|
+
"Code Example Good": "tabIndex for custom order",
|
|
491
|
+
"Code Example Bad": "Unreachable elements",
|
|
492
|
+
"Severity": "High"
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"No": "42",
|
|
496
|
+
"Category": "Accessibility",
|
|
497
|
+
"Issue": "Screen Reader",
|
|
498
|
+
"Platform": "All",
|
|
499
|
+
"Description": "Content should make sense when read aloud",
|
|
500
|
+
"Do": "Use semantic HTML and ARIA properly",
|
|
501
|
+
"Don't": "Div soup with no semantics",
|
|
502
|
+
"Code Example Good": "<nav> <main> <article>",
|
|
503
|
+
"Code Example Bad": "<div> for everything",
|
|
504
|
+
"Severity": "Medium"
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"No": "43",
|
|
508
|
+
"Category": "Accessibility",
|
|
509
|
+
"Issue": "Form Labels",
|
|
510
|
+
"Platform": "All",
|
|
511
|
+
"Description": "Inputs must have associated labels",
|
|
512
|
+
"Do": "Use label with for attribute or wrap input",
|
|
513
|
+
"Don't": "Placeholder-only inputs",
|
|
514
|
+
"Code Example Good": "<label for='email'>",
|
|
515
|
+
"Code Example Bad": "placeholder='Email' only",
|
|
516
|
+
"Severity": "High"
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
"No": "44",
|
|
520
|
+
"Category": "Accessibility",
|
|
521
|
+
"Issue": "Error Messages",
|
|
522
|
+
"Platform": "All",
|
|
523
|
+
"Description": "Error messages must be announced",
|
|
524
|
+
"Do": "Use aria-live or role=alert for errors",
|
|
525
|
+
"Don't": "Visual-only error indication",
|
|
526
|
+
"Code Example Good": "role='alert'",
|
|
527
|
+
"Code Example Bad": "Red border only",
|
|
528
|
+
"Severity": "High"
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
"No": "45",
|
|
532
|
+
"Category": "Accessibility",
|
|
533
|
+
"Issue": "Skip Links",
|
|
534
|
+
"Platform": "Web",
|
|
535
|
+
"Description": "Allow keyboard users to skip navigation",
|
|
536
|
+
"Do": "Provide skip to main content link",
|
|
537
|
+
"Don't": "No skip link on nav-heavy pages",
|
|
538
|
+
"Code Example Good": "Skip to main content link",
|
|
539
|
+
"Code Example Bad": "100 tabs to reach content",
|
|
540
|
+
"Severity": "Medium"
|
|
541
|
+
},
|
|
542
|
+
{
|
|
543
|
+
"No": "46",
|
|
544
|
+
"Category": "Performance",
|
|
545
|
+
"Issue": "Image Optimization",
|
|
546
|
+
"Platform": "All",
|
|
547
|
+
"Description": "Large images slow page load",
|
|
548
|
+
"Do": "Use appropriate size and format (WebP)",
|
|
549
|
+
"Don't": "Unoptimized full-size images",
|
|
550
|
+
"Code Example Good": "srcset with multiple sizes",
|
|
551
|
+
"Code Example Bad": "4000px image for 400px display",
|
|
552
|
+
"Severity": "High"
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"No": "47",
|
|
556
|
+
"Category": "Performance",
|
|
557
|
+
"Issue": "Lazy Loading",
|
|
558
|
+
"Platform": "All",
|
|
559
|
+
"Description": "Load content as needed",
|
|
560
|
+
"Do": "Lazy load below-fold images and content",
|
|
561
|
+
"Don't": "Load everything upfront",
|
|
562
|
+
"Code Example Good": "loading='lazy'",
|
|
563
|
+
"Code Example Bad": "All images eager load",
|
|
564
|
+
"Severity": "Medium"
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"No": "48",
|
|
568
|
+
"Category": "Performance",
|
|
569
|
+
"Issue": "Code Splitting",
|
|
570
|
+
"Platform": "Web",
|
|
571
|
+
"Description": "Large bundles slow initial load",
|
|
572
|
+
"Do": "Split code by route/feature",
|
|
573
|
+
"Don't": "Single large bundle",
|
|
574
|
+
"Code Example Good": "dynamic import()",
|
|
575
|
+
"Code Example Bad": "All code in main bundle",
|
|
576
|
+
"Severity": "Medium"
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"No": "49",
|
|
580
|
+
"Category": "Performance",
|
|
581
|
+
"Issue": "Caching",
|
|
582
|
+
"Platform": "Web",
|
|
583
|
+
"Description": "Repeat visits should be fast",
|
|
584
|
+
"Do": "Set appropriate cache headers",
|
|
585
|
+
"Don't": "No caching strategy",
|
|
586
|
+
"Code Example Good": "Cache-Control headers",
|
|
587
|
+
"Code Example Bad": "Every request hits server",
|
|
588
|
+
"Severity": "Medium"
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
"No": "50",
|
|
592
|
+
"Category": "Performance",
|
|
593
|
+
"Issue": "Font Loading",
|
|
594
|
+
"Platform": "Web",
|
|
595
|
+
"Description": "Web fonts can block rendering",
|
|
596
|
+
"Do": "Use font-display swap or optional",
|
|
597
|
+
"Don't": "Invisible text during font load",
|
|
598
|
+
"Code Example Good": "font-display: swap",
|
|
599
|
+
"Code Example Bad": "FOIT (Flash of Invisible Text)",
|
|
600
|
+
"Severity": "Medium"
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
"No": "51",
|
|
604
|
+
"Category": "Performance",
|
|
605
|
+
"Issue": "Third Party Scripts",
|
|
606
|
+
"Platform": "Web",
|
|
607
|
+
"Description": "External scripts can block rendering",
|
|
608
|
+
"Do": "Load non-critical scripts async/defer",
|
|
609
|
+
"Don't": "Synchronous third-party scripts",
|
|
610
|
+
"Code Example Good": "async or defer attribute",
|
|
611
|
+
"Code Example Bad": "<script src='...'> in head",
|
|
612
|
+
"Severity": "Medium"
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"No": "52",
|
|
616
|
+
"Category": "Performance",
|
|
617
|
+
"Issue": "Bundle Size",
|
|
618
|
+
"Platform": "Web",
|
|
619
|
+
"Description": "Large JavaScript slows interaction",
|
|
620
|
+
"Do": "Monitor and minimize bundle size",
|
|
621
|
+
"Don't": "Ignore bundle size growth",
|
|
622
|
+
"Code Example Good": "Bundle analyzer",
|
|
623
|
+
"Code Example Bad": "No size monitoring",
|
|
624
|
+
"Severity": "Medium"
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
"No": "53",
|
|
628
|
+
"Category": "Performance",
|
|
629
|
+
"Issue": "Render Blocking",
|
|
630
|
+
"Platform": "Web",
|
|
631
|
+
"Description": "CSS/JS can block first paint",
|
|
632
|
+
"Do": "Inline critical CSS defer non-critical",
|
|
633
|
+
"Don't": "Large blocking CSS files",
|
|
634
|
+
"Code Example Good": "Critical CSS inline",
|
|
635
|
+
"Code Example Bad": "All CSS in head",
|
|
636
|
+
"Severity": "Medium"
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
"No": "54",
|
|
640
|
+
"Category": "Forms",
|
|
641
|
+
"Issue": "Input Labels",
|
|
642
|
+
"Platform": "All",
|
|
643
|
+
"Description": "Every input needs a visible label",
|
|
644
|
+
"Do": "Always show label above or beside input",
|
|
645
|
+
"Don't": "Placeholder as only label",
|
|
646
|
+
"Code Example Good": "<label>Email</label><input>",
|
|
647
|
+
"Code Example Bad": "placeholder='Email' only",
|
|
648
|
+
"Severity": "High"
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
"No": "55",
|
|
652
|
+
"Category": "Forms",
|
|
653
|
+
"Issue": "Error Placement",
|
|
654
|
+
"Platform": "All",
|
|
655
|
+
"Description": "Errors should appear near the problem",
|
|
656
|
+
"Do": "Show error below related input",
|
|
657
|
+
"Don't": "Single error message at top of form",
|
|
658
|
+
"Code Example Good": "Error under each field",
|
|
659
|
+
"Code Example Bad": "All errors at form top",
|
|
660
|
+
"Severity": "Medium"
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"No": "56",
|
|
664
|
+
"Category": "Forms",
|
|
665
|
+
"Issue": "Inline Validation",
|
|
666
|
+
"Platform": "All",
|
|
667
|
+
"Description": "Validate as user types or on blur",
|
|
668
|
+
"Do": "Validate on blur for most fields",
|
|
669
|
+
"Don't": "Validate only on submit",
|
|
670
|
+
"Code Example Good": "onBlur validation",
|
|
671
|
+
"Code Example Bad": "Submit-only validation",
|
|
672
|
+
"Severity": "Medium"
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
"No": "57",
|
|
676
|
+
"Category": "Forms",
|
|
677
|
+
"Issue": "Input Types",
|
|
678
|
+
"Platform": "All",
|
|
679
|
+
"Description": "Use appropriate input types",
|
|
680
|
+
"Do": "Use email tel number url etc",
|
|
681
|
+
"Don't": "Text input for everything",
|
|
682
|
+
"Code Example Good": "type='email'",
|
|
683
|
+
"Code Example Bad": "type='text' for email",
|
|
684
|
+
"Severity": "Medium"
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"No": "58",
|
|
688
|
+
"Category": "Forms",
|
|
689
|
+
"Issue": "Autofill Support",
|
|
690
|
+
"Platform": "Web",
|
|
691
|
+
"Description": "Help browsers autofill correctly",
|
|
692
|
+
"Do": "Use autocomplete attribute properly",
|
|
693
|
+
"Don't": "Block or ignore autofill",
|
|
694
|
+
"Code Example Good": "autocomplete='email'",
|
|
695
|
+
"Code Example Bad": "autocomplete='off' everywhere",
|
|
696
|
+
"Severity": "Medium"
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
"No": "59",
|
|
700
|
+
"Category": "Forms",
|
|
701
|
+
"Issue": "Required Indicators",
|
|
702
|
+
"Platform": "All",
|
|
703
|
+
"Description": "Mark required fields clearly",
|
|
704
|
+
"Do": "Use asterisk or (required) text",
|
|
705
|
+
"Don't": "No indication of required fields",
|
|
706
|
+
"Code Example Good": "* required indicator",
|
|
707
|
+
"Code Example Bad": "Guess which are required",
|
|
708
|
+
"Severity": "Medium"
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"No": "60",
|
|
712
|
+
"Category": "Forms",
|
|
713
|
+
"Issue": "Password Visibility",
|
|
714
|
+
"Platform": "All",
|
|
715
|
+
"Description": "Let users see password while typing",
|
|
716
|
+
"Do": "Toggle to show/hide password",
|
|
717
|
+
"Don't": "No visibility toggle",
|
|
718
|
+
"Code Example Good": "Show/hide password button",
|
|
719
|
+
"Code Example Bad": "Password always hidden",
|
|
720
|
+
"Severity": "Medium"
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"No": "61",
|
|
724
|
+
"Category": "Forms",
|
|
725
|
+
"Issue": "Submit Feedback",
|
|
726
|
+
"Platform": "All",
|
|
727
|
+
"Description": "Confirm form submission status",
|
|
728
|
+
"Do": "Show loading then success/error state",
|
|
729
|
+
"Don't": "No feedback after submit",
|
|
730
|
+
"Code Example Good": "Loading -> Success message",
|
|
731
|
+
"Code Example Bad": "Button click with no response",
|
|
732
|
+
"Severity": "High"
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
"No": "62",
|
|
736
|
+
"Category": "Forms",
|
|
737
|
+
"Issue": "Input Affordance",
|
|
738
|
+
"Platform": "All",
|
|
739
|
+
"Description": "Inputs should look interactive",
|
|
740
|
+
"Do": "Use distinct input styling",
|
|
741
|
+
"Don't": "Inputs that look like plain text",
|
|
742
|
+
"Code Example Good": "Border/background on inputs",
|
|
743
|
+
"Code Example Bad": "Borderless inputs",
|
|
744
|
+
"Severity": "Medium"
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"No": "63",
|
|
748
|
+
"Category": "Forms",
|
|
749
|
+
"Issue": "Mobile Keyboards",
|
|
750
|
+
"Platform": "Mobile",
|
|
751
|
+
"Description": "Show appropriate keyboard for input type",
|
|
752
|
+
"Do": "Use inputmode attribute",
|
|
753
|
+
"Don't": "Default keyboard for all inputs",
|
|
754
|
+
"Code Example Good": "inputmode='numeric'",
|
|
755
|
+
"Code Example Bad": "Text keyboard for numbers",
|
|
756
|
+
"Severity": "Medium"
|
|
757
|
+
},
|
|
758
|
+
{
|
|
759
|
+
"No": "64",
|
|
760
|
+
"Category": "Responsive",
|
|
761
|
+
"Issue": "Mobile First",
|
|
762
|
+
"Platform": "Web",
|
|
763
|
+
"Description": "Design for mobile then enhance for larger",
|
|
764
|
+
"Do": "Start with mobile styles then add breakpoints",
|
|
765
|
+
"Don't": "Desktop-first causing mobile issues",
|
|
766
|
+
"Code Example Good": "Default mobile + md: lg: xl:",
|
|
767
|
+
"Code Example Bad": "Desktop default + max-width queries",
|
|
768
|
+
"Severity": "Medium"
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"No": "65",
|
|
772
|
+
"Category": "Responsive",
|
|
773
|
+
"Issue": "Breakpoint Testing",
|
|
774
|
+
"Platform": "Web",
|
|
775
|
+
"Description": "Test at all common screen sizes",
|
|
776
|
+
"Do": "Test at 320 375 414 768 1024 1440",
|
|
777
|
+
"Don't": "Only test on your device",
|
|
778
|
+
"Code Example Good": "Multiple device testing",
|
|
779
|
+
"Code Example Bad": "Single device development",
|
|
780
|
+
"Severity": "Medium"
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"No": "66",
|
|
784
|
+
"Category": "Responsive",
|
|
785
|
+
"Issue": "Touch Friendly",
|
|
786
|
+
"Platform": "Web",
|
|
787
|
+
"Description": "Mobile layouts need touch-sized targets",
|
|
788
|
+
"Do": "Increase touch targets on mobile",
|
|
789
|
+
"Don't": "Same tiny buttons on mobile",
|
|
790
|
+
"Code Example Good": "Larger buttons on mobile",
|
|
791
|
+
"Code Example Bad": "Desktop-sized targets on mobile",
|
|
792
|
+
"Severity": "High"
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
"No": "67",
|
|
796
|
+
"Category": "Responsive",
|
|
797
|
+
"Issue": "Readable Font Size",
|
|
798
|
+
"Platform": "All",
|
|
799
|
+
"Description": "Text must be readable on all devices",
|
|
800
|
+
"Do": "Minimum 16px body text on mobile",
|
|
801
|
+
"Don't": "Tiny text on mobile",
|
|
802
|
+
"Code Example Good": "text-base or larger",
|
|
803
|
+
"Code Example Bad": "text-xs for body text",
|
|
804
|
+
"Severity": "High"
|
|
805
|
+
},
|
|
806
|
+
{
|
|
807
|
+
"No": "68",
|
|
808
|
+
"Category": "Responsive",
|
|
809
|
+
"Issue": "Viewport Meta",
|
|
810
|
+
"Platform": "Web",
|
|
811
|
+
"Description": "Set viewport for mobile devices",
|
|
812
|
+
"Do": "Use width=device-width initial-scale=1",
|
|
813
|
+
"Don't": "Missing or incorrect viewport",
|
|
814
|
+
"Code Example Good": "<meta name='viewport'...>",
|
|
815
|
+
"Code Example Bad": "No viewport meta tag",
|
|
816
|
+
"Severity": "High"
|
|
817
|
+
},
|
|
818
|
+
{
|
|
819
|
+
"No": "69",
|
|
820
|
+
"Category": "Responsive",
|
|
821
|
+
"Issue": "Horizontal Scroll",
|
|
822
|
+
"Platform": "Web",
|
|
823
|
+
"Description": "Avoid horizontal scrolling",
|
|
824
|
+
"Do": "Ensure content fits viewport width",
|
|
825
|
+
"Don't": "Content wider than viewport",
|
|
826
|
+
"Code Example Good": "max-w-full overflow-x-hidden",
|
|
827
|
+
"Code Example Bad": "Horizontal scrollbar on mobile",
|
|
828
|
+
"Severity": "High"
|
|
829
|
+
},
|
|
830
|
+
{
|
|
831
|
+
"No": "70",
|
|
832
|
+
"Category": "Responsive",
|
|
833
|
+
"Issue": "Image Scaling",
|
|
834
|
+
"Platform": "Web",
|
|
835
|
+
"Description": "Images should scale with container",
|
|
836
|
+
"Do": "Use max-width: 100% on images",
|
|
837
|
+
"Don't": "Fixed width images overflow",
|
|
838
|
+
"Code Example Good": "max-w-full h-auto",
|
|
839
|
+
"Code Example Bad": "width='800' fixed",
|
|
840
|
+
"Severity": "Medium"
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
"No": "71",
|
|
844
|
+
"Category": "Responsive",
|
|
845
|
+
"Issue": "Table Handling",
|
|
846
|
+
"Platform": "Web",
|
|
847
|
+
"Description": "Tables can overflow on mobile",
|
|
848
|
+
"Do": "Use horizontal scroll or card layout",
|
|
849
|
+
"Don't": "Wide tables breaking layout",
|
|
850
|
+
"Code Example Good": "overflow-x-auto wrapper",
|
|
851
|
+
"Code Example Bad": "Table overflows viewport",
|
|
852
|
+
"Severity": "Medium"
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
"No": "72",
|
|
856
|
+
"Category": "Typography",
|
|
857
|
+
"Issue": "Line Height",
|
|
858
|
+
"Platform": "All",
|
|
859
|
+
"Description": "Adequate line height improves readability",
|
|
860
|
+
"Do": "Use 1.5-1.75 for body text",
|
|
861
|
+
"Don't": "Cramped or excessive line height",
|
|
862
|
+
"Code Example Good": "leading-relaxed (1.625)",
|
|
863
|
+
"Code Example Bad": "leading-none (1)",
|
|
864
|
+
"Severity": "Medium"
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"No": "73",
|
|
868
|
+
"Category": "Typography",
|
|
869
|
+
"Issue": "Line Length",
|
|
870
|
+
"Platform": "Web",
|
|
871
|
+
"Description": "Long lines are hard to read",
|
|
872
|
+
"Do": "Limit to 65-75 characters per line",
|
|
873
|
+
"Don't": "Full-width text on large screens",
|
|
874
|
+
"Code Example Good": "max-w-prose",
|
|
875
|
+
"Code Example Bad": "Full viewport width text",
|
|
876
|
+
"Severity": "Medium"
|
|
877
|
+
},
|
|
878
|
+
{
|
|
879
|
+
"No": "74",
|
|
880
|
+
"Category": "Typography",
|
|
881
|
+
"Issue": "Font Size Scale",
|
|
882
|
+
"Platform": "All",
|
|
883
|
+
"Description": "Consistent type hierarchy aids scanning",
|
|
884
|
+
"Do": "Use consistent modular scale",
|
|
885
|
+
"Don't": "Random font sizes",
|
|
886
|
+
"Code Example Good": "Type scale (12 14 16 18 24 32)",
|
|
887
|
+
"Code Example Bad": "Arbitrary sizes",
|
|
888
|
+
"Severity": "Medium"
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
"No": "75",
|
|
892
|
+
"Category": "Typography",
|
|
893
|
+
"Issue": "Font Loading",
|
|
894
|
+
"Platform": "Web",
|
|
895
|
+
"Description": "Fonts should load without layout shift",
|
|
896
|
+
"Do": "Reserve space with fallback font",
|
|
897
|
+
"Don't": "Layout shift when fonts load",
|
|
898
|
+
"Code Example Good": "font-display: swap + similar fallback",
|
|
899
|
+
"Code Example Bad": "No fallback font",
|
|
900
|
+
"Severity": "Medium"
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
"No": "76",
|
|
904
|
+
"Category": "Typography",
|
|
905
|
+
"Issue": "Contrast Readability",
|
|
906
|
+
"Platform": "All",
|
|
907
|
+
"Description": "Body text needs good contrast",
|
|
908
|
+
"Do": "Use darker text on light backgrounds",
|
|
909
|
+
"Don't": "Gray text on gray background",
|
|
910
|
+
"Code Example Good": "text-gray-900 on white",
|
|
911
|
+
"Code Example Bad": "text-gray-400 on gray-100",
|
|
912
|
+
"Severity": "High"
|
|
913
|
+
},
|
|
914
|
+
{
|
|
915
|
+
"No": "77",
|
|
916
|
+
"Category": "Typography",
|
|
917
|
+
"Issue": "Heading Clarity",
|
|
918
|
+
"Platform": "All",
|
|
919
|
+
"Description": "Headings should stand out from body",
|
|
920
|
+
"Do": "Clear size/weight difference",
|
|
921
|
+
"Don't": "Headings similar to body text",
|
|
922
|
+
"Code Example Good": "Bold + larger size",
|
|
923
|
+
"Code Example Bad": "Same size as body",
|
|
924
|
+
"Severity": "Medium"
|
|
925
|
+
},
|
|
926
|
+
{
|
|
927
|
+
"No": "78",
|
|
928
|
+
"Category": "Feedback",
|
|
929
|
+
"Issue": "Loading Indicators",
|
|
930
|
+
"Platform": "All",
|
|
931
|
+
"Description": "Show system status during waits",
|
|
932
|
+
"Do": "Show spinner/skeleton for operations > 300ms",
|
|
933
|
+
"Don't": "No feedback during loading",
|
|
934
|
+
"Code Example Good": "Skeleton or spinner",
|
|
935
|
+
"Code Example Bad": "Frozen UI",
|
|
936
|
+
"Severity": "High"
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
"No": "79",
|
|
940
|
+
"Category": "Feedback",
|
|
941
|
+
"Issue": "Empty States",
|
|
942
|
+
"Platform": "All",
|
|
943
|
+
"Description": "Guide users when no content exists",
|
|
944
|
+
"Do": "Show helpful message and action",
|
|
945
|
+
"Don't": "Blank empty screens",
|
|
946
|
+
"Code Example Good": "No items yet. Create one!",
|
|
947
|
+
"Code Example Bad": "Empty white space",
|
|
948
|
+
"Severity": "Medium"
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
"No": "80",
|
|
952
|
+
"Category": "Feedback",
|
|
953
|
+
"Issue": "Error Recovery",
|
|
954
|
+
"Platform": "All",
|
|
955
|
+
"Description": "Help users recover from errors",
|
|
956
|
+
"Do": "Provide clear next steps",
|
|
957
|
+
"Don't": "Error without recovery path",
|
|
958
|
+
"Code Example Good": "Try again button + help link",
|
|
959
|
+
"Code Example Bad": "Error message only",
|
|
960
|
+
"Severity": "Medium"
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"No": "81",
|
|
964
|
+
"Category": "Feedback",
|
|
965
|
+
"Issue": "Progress Indicators",
|
|
966
|
+
"Platform": "All",
|
|
967
|
+
"Description": "Show progress for multi-step processes",
|
|
968
|
+
"Do": "Step indicators or progress bar",
|
|
969
|
+
"Don't": "No indication of progress",
|
|
970
|
+
"Code Example Good": "Step 2 of 4 indicator",
|
|
971
|
+
"Code Example Bad": "No step information",
|
|
972
|
+
"Severity": "Medium"
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
"No": "82",
|
|
976
|
+
"Category": "Feedback",
|
|
977
|
+
"Issue": "Toast Notifications",
|
|
978
|
+
"Platform": "All",
|
|
979
|
+
"Description": "Transient messages for non-critical info",
|
|
980
|
+
"Do": "Auto-dismiss after 3-5 seconds",
|
|
981
|
+
"Don't": "Toasts that never disappear",
|
|
982
|
+
"Code Example Good": "Auto-dismiss toast",
|
|
983
|
+
"Code Example Bad": "Persistent toast",
|
|
984
|
+
"Severity": "Medium"
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"No": "83",
|
|
988
|
+
"Category": "Feedback",
|
|
989
|
+
"Issue": "Confirmation Messages",
|
|
990
|
+
"Platform": "All",
|
|
991
|
+
"Description": "Confirm successful actions",
|
|
992
|
+
"Do": "Brief success message",
|
|
993
|
+
"Don't": "Silent success",
|
|
994
|
+
"Code Example Good": "Saved successfully toast",
|
|
995
|
+
"Code Example Bad": "No confirmation",
|
|
996
|
+
"Severity": "Medium"
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"No": "84",
|
|
1000
|
+
"Category": "Content",
|
|
1001
|
+
"Issue": "Truncation",
|
|
1002
|
+
"Platform": "All",
|
|
1003
|
+
"Description": "Handle long content gracefully",
|
|
1004
|
+
"Do": "Truncate with ellipsis and expand option",
|
|
1005
|
+
"Don't": "Overflow or broken layout",
|
|
1006
|
+
"Code Example Good": "line-clamp-2 with expand",
|
|
1007
|
+
"Code Example Bad": "Overflow or cut off",
|
|
1008
|
+
"Severity": "Medium"
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"No": "85",
|
|
1012
|
+
"Category": "Content",
|
|
1013
|
+
"Issue": "Date Formatting",
|
|
1014
|
+
"Platform": "All",
|
|
1015
|
+
"Description": "Use locale-appropriate date formats",
|
|
1016
|
+
"Do": "Use relative or locale-aware dates",
|
|
1017
|
+
"Don't": "Ambiguous date formats",
|
|
1018
|
+
"Code Example Good": "2 hours ago or locale format",
|
|
1019
|
+
"Code Example Bad": "01/02/03",
|
|
1020
|
+
"Severity": "Low"
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"No": "86",
|
|
1024
|
+
"Category": "Content",
|
|
1025
|
+
"Issue": "Number Formatting",
|
|
1026
|
+
"Platform": "All",
|
|
1027
|
+
"Description": "Format large numbers for readability",
|
|
1028
|
+
"Do": "Use thousand separators or abbreviations",
|
|
1029
|
+
"Don't": "Long unformatted numbers",
|
|
1030
|
+
"Code Example Good": "1.2K or 1,234",
|
|
1031
|
+
"Code Example Bad": "1234567",
|
|
1032
|
+
"Severity": "Low"
|
|
1033
|
+
},
|
|
1034
|
+
{
|
|
1035
|
+
"No": "87",
|
|
1036
|
+
"Category": "Content",
|
|
1037
|
+
"Issue": "Placeholder Content",
|
|
1038
|
+
"Platform": "All",
|
|
1039
|
+
"Description": "Show realistic placeholders during dev",
|
|
1040
|
+
"Do": "Use realistic sample data",
|
|
1041
|
+
"Don't": "Lorem ipsum everywhere",
|
|
1042
|
+
"Code Example Good": "Real sample content",
|
|
1043
|
+
"Code Example Bad": "Lorem ipsum",
|
|
1044
|
+
"Severity": "Low"
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
"No": "88",
|
|
1048
|
+
"Category": "Onboarding",
|
|
1049
|
+
"Issue": "User Freedom",
|
|
1050
|
+
"Platform": "All",
|
|
1051
|
+
"Description": "Users should be able to skip tutorials",
|
|
1052
|
+
"Do": "Provide Skip and Back buttons",
|
|
1053
|
+
"Don't": "Force linear unskippable tour",
|
|
1054
|
+
"Code Example Good": "Skip Tutorial button",
|
|
1055
|
+
"Code Example Bad": "Locked overlay until finished",
|
|
1056
|
+
"Severity": "Medium"
|
|
1057
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
"No": "89",
|
|
1060
|
+
"Category": "Search",
|
|
1061
|
+
"Issue": "Autocomplete",
|
|
1062
|
+
"Platform": "Web",
|
|
1063
|
+
"Description": "Help users find results faster",
|
|
1064
|
+
"Do": "Show predictions as user types",
|
|
1065
|
+
"Don't": "Require full type and enter",
|
|
1066
|
+
"Code Example Good": "Debounced fetch + dropdown",
|
|
1067
|
+
"Code Example Bad": "No suggestions",
|
|
1068
|
+
"Severity": "Medium"
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
"No": "90",
|
|
1072
|
+
"Category": "Search",
|
|
1073
|
+
"Issue": "No Results",
|
|
1074
|
+
"Platform": "Web",
|
|
1075
|
+
"Description": "Dead ends frustrate users",
|
|
1076
|
+
"Do": "Show 'No results' with suggestions",
|
|
1077
|
+
"Don't": "Blank screen or '0 results'",
|
|
1078
|
+
"Code Example Good": "Try searching for X instead",
|
|
1079
|
+
"Code Example Bad": "No results found.",
|
|
1080
|
+
"Severity": "Medium"
|
|
1081
|
+
},
|
|
1082
|
+
{
|
|
1083
|
+
"No": "91",
|
|
1084
|
+
"Category": "Data Entry",
|
|
1085
|
+
"Issue": "Bulk Actions",
|
|
1086
|
+
"Platform": "Web",
|
|
1087
|
+
"Description": "Editing one by one is tedious",
|
|
1088
|
+
"Do": "Allow multi-select and bulk edit",
|
|
1089
|
+
"Don't": "Single row actions only",
|
|
1090
|
+
"Code Example Good": "Checkbox column + Action bar",
|
|
1091
|
+
"Code Example Bad": "Repeated actions per row",
|
|
1092
|
+
"Severity": "Low"
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"No": "92",
|
|
1096
|
+
"Category": "AI Interaction",
|
|
1097
|
+
"Issue": "Disclaimer",
|
|
1098
|
+
"Platform": "All",
|
|
1099
|
+
"Description": "Users need to know they talk to AI",
|
|
1100
|
+
"Do": "Clearly label AI generated content",
|
|
1101
|
+
"Don't": "Present AI as human",
|
|
1102
|
+
"Code Example Good": "AI Assistant label",
|
|
1103
|
+
"Code Example Bad": "Fake human name without label",
|
|
1104
|
+
"Severity": "High"
|
|
1105
|
+
},
|
|
1106
|
+
{
|
|
1107
|
+
"No": "93",
|
|
1108
|
+
"Category": "AI Interaction",
|
|
1109
|
+
"Issue": "Streaming",
|
|
1110
|
+
"Platform": "All",
|
|
1111
|
+
"Description": "Waiting for full text is slow",
|
|
1112
|
+
"Do": "Stream text response token by token",
|
|
1113
|
+
"Don't": "Show loading spinner for 10s+",
|
|
1114
|
+
"Code Example Good": "Typewriter effect",
|
|
1115
|
+
"Code Example Bad": "Spinner until 100% complete",
|
|
1116
|
+
"Severity": "Medium"
|
|
1117
|
+
},
|
|
1118
|
+
{
|
|
1119
|
+
"No": "94",
|
|
1120
|
+
"Category": "Spatial UI",
|
|
1121
|
+
"Issue": "Gaze Hover",
|
|
1122
|
+
"Platform": "VisionOS",
|
|
1123
|
+
"Description": "Elements should respond to eye tracking before pinch",
|
|
1124
|
+
"Do": "Scale/highlight element on look",
|
|
1125
|
+
"Don't": "Static element until pinch",
|
|
1126
|
+
"Code Example Good": "hoverEffect()",
|
|
1127
|
+
"Code Example Bad": "onTap only",
|
|
1128
|
+
"Severity": "High"
|
|
1129
|
+
},
|
|
1130
|
+
{
|
|
1131
|
+
"No": "95",
|
|
1132
|
+
"Category": "Spatial UI",
|
|
1133
|
+
"Issue": "Depth Layering",
|
|
1134
|
+
"Platform": "VisionOS",
|
|
1135
|
+
"Description": "UI needs Z-depth to separate content from environment",
|
|
1136
|
+
"Do": "Use glass material and z-offset",
|
|
1137
|
+
"Don't": "Flat opaque panels blocking view",
|
|
1138
|
+
"Code Example Good": ".glassBackgroundEffect()",
|
|
1139
|
+
"Code Example Bad": "bg-white",
|
|
1140
|
+
"Severity": "Medium"
|
|
1141
|
+
},
|
|
1142
|
+
{
|
|
1143
|
+
"No": "96",
|
|
1144
|
+
"Category": "Sustainability",
|
|
1145
|
+
"Issue": "Auto-Play Video",
|
|
1146
|
+
"Platform": "Web",
|
|
1147
|
+
"Description": "Video consumes massive data and energy",
|
|
1148
|
+
"Do": "Click-to-play or pause when off-screen",
|
|
1149
|
+
"Don't": "Auto-play high-res video loops",
|
|
1150
|
+
"Code Example Good": "playsInline muted preload='none'",
|
|
1151
|
+
"Code Example Bad": "autoplay loop",
|
|
1152
|
+
"Severity": "Medium"
|
|
1153
|
+
},
|
|
1154
|
+
{
|
|
1155
|
+
"No": "97",
|
|
1156
|
+
"Category": "Sustainability",
|
|
1157
|
+
"Issue": "Asset Weight",
|
|
1158
|
+
"Platform": "Web",
|
|
1159
|
+
"Description": "Heavy 3D/Image assets increase carbon footprint",
|
|
1160
|
+
"Do": "Compress and lazy load 3D models",
|
|
1161
|
+
"Don't": "Load 50MB textures",
|
|
1162
|
+
"Code Example Good": "Draco compression",
|
|
1163
|
+
"Code Example Bad": "Raw .obj files",
|
|
1164
|
+
"Severity": "Medium"
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
"No": "98",
|
|
1168
|
+
"Category": "AI Interaction",
|
|
1169
|
+
"Issue": "Feedback Loop",
|
|
1170
|
+
"Platform": "All",
|
|
1171
|
+
"Description": "AI needs user feedback to improve",
|
|
1172
|
+
"Do": "Thumps up/down or 'Regenerate'",
|
|
1173
|
+
"Don't": "Static output only",
|
|
1174
|
+
"Code Example Good": "Feedback component",
|
|
1175
|
+
"Code Example Bad": "Read-only text",
|
|
1176
|
+
"Severity": "Low"
|
|
1177
|
+
},
|
|
1178
|
+
{
|
|
1179
|
+
"No": "99",
|
|
1180
|
+
"Category": "Accessibility",
|
|
1181
|
+
"Issue": "Motion Sensitivity",
|
|
1182
|
+
"Platform": "All",
|
|
1183
|
+
"Description": "Parallax/Scroll-jacking causes nausea",
|
|
1184
|
+
"Do": "Respect prefers-reduced-motion",
|
|
1185
|
+
"Don't": "Force scroll effects",
|
|
1186
|
+
"Code Example Good": "@media (prefers-reduced-motion)",
|
|
1187
|
+
"Code Example Bad": "ScrollTrigger.create()",
|
|
1188
|
+
"Severity": "High"
|
|
1189
|
+
}
|
|
1190
|
+
]
|