@harness-engineering/cli 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/personas/planner.yaml +27 -0
- package/dist/agents/personas/verifier.yaml +30 -0
- package/dist/agents/skills/claude-code/enforce-architecture/SKILL.md +19 -0
- package/dist/agents/skills/claude-code/harness-accessibility/SKILL.md +274 -0
- package/dist/agents/skills/claude-code/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/claude-code/harness-autopilot/SKILL.md +111 -72
- package/dist/agents/skills/claude-code/harness-autopilot/skill.yaml +4 -2
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/claude-code/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/claude-code/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/claude-code/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/claude-code/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/claude-code/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/claude-code/harness-design-web/skill.yaml +52 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-impact-analysis/SKILL.md +16 -0
- package/dist/agents/skills/claude-code/harness-integrity/SKILL.md +19 -1
- package/dist/agents/skills/claude-code/harness-knowledge-mapper/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-onboarding/SKILL.md +19 -1
- package/dist/agents/skills/claude-code/harness-release-readiness/SKILL.md +13 -9
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +1 -1
- package/dist/agents/skills/claude-code/harness-verify/SKILL.md +26 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/SKILL.md +274 -0
- package/dist/agents/skills/gemini-cli/harness-accessibility/skill.yaml +51 -0
- package/dist/agents/skills/gemini-cli/harness-autopilot/SKILL.md +111 -72
- package/dist/agents/skills/gemini-cli/harness-autopilot/skill.yaml +4 -2
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-design/SKILL.md +265 -0
- package/dist/agents/skills/gemini-cli/harness-design/skill.yaml +53 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/SKILL.md +336 -0
- package/dist/agents/skills/gemini-cli/harness-design-mobile/skill.yaml +49 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/SKILL.md +282 -0
- package/dist/agents/skills/gemini-cli/harness-design-system/skill.yaml +50 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/SKILL.md +360 -0
- package/dist/agents/skills/gemini-cli/harness-design-web/skill.yaml +52 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-impact-analysis/SKILL.md +16 -0
- package/dist/agents/skills/gemini-cli/harness-knowledge-mapper/skill.yaml +1 -1
- package/dist/agents/skills/gemini-cli/harness-release-readiness/SKILL.md +13 -9
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +1 -1
- package/dist/agents/skills/node_modules/.bin/vitest +2 -2
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/color.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/layout.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/motion.yaml +109 -0
- package/dist/agents/skills/shared/design-knowledge/anti-patterns/typography.yaml +112 -0
- package/dist/agents/skills/shared/design-knowledge/industries/creative.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/ecommerce.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/emerging-tech.yaml +83 -0
- package/dist/agents/skills/shared/design-knowledge/industries/fintech.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/healthcare.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/lifestyle.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/saas.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/industries/services.yaml +80 -0
- package/dist/agents/skills/shared/design-knowledge/palettes/curated.yaml +234 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/android.yaml +125 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/flutter.yaml +144 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/ios.yaml +106 -0
- package/dist/agents/skills/shared/design-knowledge/platform-rules/web.yaml +102 -0
- package/dist/agents/skills/shared/design-knowledge/typography/pairings.yaml +274 -0
- package/dist/bin/harness.js +3 -2
- package/dist/{chunk-3U5VZYR7.js → chunk-4WUGOJQ7.js} +6 -3
- package/dist/{chunk-O6NEKDYP.js → chunk-FFIX3QVG.js} +697 -349
- package/dist/chunk-GA6GN5J2.js +6150 -0
- package/dist/dist-C4J67MPP.js +242 -0
- package/dist/dist-N4D4QWFV.js +2809 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +3 -2
- package/dist/validate-cross-check-WGXQ7K62.js +7 -0
- package/package.json +12 -8
- package/dist/validate-cross-check-LNIZ7KGZ.js +0 -6
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
description: "Layout anti-patterns — common mistakes in spacing, composition, and responsive design"
|
|
2
|
+
|
|
3
|
+
patterns:
|
|
4
|
+
- name: "Inconsistent spacing values"
|
|
5
|
+
severity: warning
|
|
6
|
+
scope: all
|
|
7
|
+
detect:
|
|
8
|
+
method: "Check for margin/padding values that don't align with the spacing scale defined in tokens.json"
|
|
9
|
+
context: "Custom pixel values like 13px, 7px, 22px that don't match the 4px/8px grid or token scale"
|
|
10
|
+
reason: "Arbitrary spacing values create visual noise. Elements that are 'almost aligned' feel more wrong than elements that are clearly different."
|
|
11
|
+
instead: "Use spacing tokens from the design system scale (e.g., 4, 8, 12, 16, 24, 32, 48, 64). Every spacing value should reference a token."
|
|
12
|
+
strictness:
|
|
13
|
+
permissive: info
|
|
14
|
+
standard: warn
|
|
15
|
+
strict: warn
|
|
16
|
+
|
|
17
|
+
- name: "Content wider than 80ch for reading"
|
|
18
|
+
severity: warning
|
|
19
|
+
scope: web
|
|
20
|
+
detect:
|
|
21
|
+
method: "Check max-width of text content containers"
|
|
22
|
+
threshold: "> 80ch or > 720px without max-width constraint"
|
|
23
|
+
context: "Applies to prose/article content, not dashboards or data tables"
|
|
24
|
+
reason: "Lines longer than 65-80 characters are hard to track from the end of one line to the beginning of the next. Reading speed and comprehension drop significantly."
|
|
25
|
+
instead: "Set max-width: 65ch to 75ch for prose content. Use wider layouts only for data-dense views like dashboards and tables."
|
|
26
|
+
strictness:
|
|
27
|
+
permissive: info
|
|
28
|
+
standard: warn
|
|
29
|
+
strict: warn
|
|
30
|
+
|
|
31
|
+
- name: "Fixed pixel widths on containers"
|
|
32
|
+
severity: warning
|
|
33
|
+
scope: web
|
|
34
|
+
detect:
|
|
35
|
+
css_properties: ["width"]
|
|
36
|
+
values: ["px values on layout containers"]
|
|
37
|
+
exclude: ["max-width", "min-width", "icons", "avatars"]
|
|
38
|
+
reason: "Fixed-width containers break on screen sizes they weren't designed for. A 1200px container is unusable on a 1024px laptop."
|
|
39
|
+
instead: "Use relative units (%, rem, ch) or max-width constraints. Let containers be fluid within min/max bounds."
|
|
40
|
+
strictness:
|
|
41
|
+
permissive: info
|
|
42
|
+
standard: warn
|
|
43
|
+
strict: warn
|
|
44
|
+
|
|
45
|
+
- name: "Missing touch targets on mobile"
|
|
46
|
+
severity: error
|
|
47
|
+
scope: mobile
|
|
48
|
+
detect:
|
|
49
|
+
method: "Check interactive element dimensions"
|
|
50
|
+
threshold: "< 44x44px (iOS) or < 48x48dp (Android)"
|
|
51
|
+
context: "Buttons, links, toggles, checkboxes, and other tappable elements"
|
|
52
|
+
reason: "Small touch targets cause mis-taps, frustration, and accessibility failures. WCAG 2.5.8 requires minimum 24x24 CSS pixels, but platform guidelines recommend 44-48px."
|
|
53
|
+
instead: "Ensure all interactive elements have a minimum tappable area of 44x44px (iOS) or 48x48dp (Android). Use padding to increase hit area without changing visual size."
|
|
54
|
+
strictness:
|
|
55
|
+
permissive: info
|
|
56
|
+
standard: warn
|
|
57
|
+
strict: error
|
|
58
|
+
|
|
59
|
+
- name: "Horizontal scrolling on mobile"
|
|
60
|
+
severity: error
|
|
61
|
+
scope: all
|
|
62
|
+
detect:
|
|
63
|
+
method: "Check for content overflow causing horizontal scroll on viewports < 375px"
|
|
64
|
+
context: "Excludes intentional horizontal scroll components like carousels and code blocks"
|
|
65
|
+
reason: "Unintended horizontal scroll breaks the vertical reading flow and confuses users. It often indicates a layout bug."
|
|
66
|
+
instead: "Use overflow-x: hidden on the body, ensure all images have max-width: 100%, and test layouts at 320px minimum viewport width."
|
|
67
|
+
strictness:
|
|
68
|
+
permissive: info
|
|
69
|
+
standard: warn
|
|
70
|
+
strict: error
|
|
71
|
+
|
|
72
|
+
- name: "Z-index escalation"
|
|
73
|
+
severity: warning
|
|
74
|
+
scope: web
|
|
75
|
+
detect:
|
|
76
|
+
method: "Check for z-index values"
|
|
77
|
+
threshold: "> 100 or more than 10 distinct z-index values in the codebase"
|
|
78
|
+
reason: "Z-index wars create unpredictable stacking. When values escalate to 9999, every new overlay needs 99999, and the system becomes unmaintainable."
|
|
79
|
+
instead: "Define a z-index scale in tokens (e.g., base: 0, dropdown: 10, sticky: 20, modal: 30, toast: 40, tooltip: 50). Never use arbitrary values."
|
|
80
|
+
strictness:
|
|
81
|
+
permissive: info
|
|
82
|
+
standard: warn
|
|
83
|
+
strict: warn
|
|
84
|
+
|
|
85
|
+
- name: "Nested scroll containers"
|
|
86
|
+
severity: warning
|
|
87
|
+
scope: all
|
|
88
|
+
detect:
|
|
89
|
+
method: "Check for scrollable elements inside other scrollable elements"
|
|
90
|
+
context: "Especially problematic when both scroll in the same direction"
|
|
91
|
+
reason: "Nested scrolling creates confusing interaction — users don't know which container will scroll when they swipe. Trackpad momentum makes it worse."
|
|
92
|
+
instead: "Flatten the layout so only one element scrolls at a time. If nested scroll is unavoidable, ensure they scroll in different directions (e.g., vertical page + horizontal carousel)."
|
|
93
|
+
strictness:
|
|
94
|
+
permissive: info
|
|
95
|
+
standard: warn
|
|
96
|
+
strict: warn
|
|
97
|
+
|
|
98
|
+
- name: "Magic number breakpoints"
|
|
99
|
+
severity: info
|
|
100
|
+
scope: web
|
|
101
|
+
detect:
|
|
102
|
+
method: "Check for media query breakpoints that don't match standard device widths or design system breakpoints"
|
|
103
|
+
values: ["arbitrary values like 743px, 1023px, 867px"]
|
|
104
|
+
reason: "Non-standard breakpoints are hard to reason about and don't correspond to real device classes. They suggest the layout was 'fixed' at a specific size rather than designed responsively."
|
|
105
|
+
instead: "Use standard breakpoints (640, 768, 1024, 1280, 1536) or define custom breakpoints in the design system tokens and reuse them consistently."
|
|
106
|
+
strictness:
|
|
107
|
+
permissive: info
|
|
108
|
+
standard: info
|
|
109
|
+
strict: warn
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
description: "Motion and animation anti-patterns — common mistakes in transitions, animations, and interactive feedback"
|
|
2
|
+
|
|
3
|
+
patterns:
|
|
4
|
+
- name: "Animation without prefers-reduced-motion"
|
|
5
|
+
severity: error
|
|
6
|
+
scope: all
|
|
7
|
+
detect:
|
|
8
|
+
method: "Check for CSS animations or transitions without a @media (prefers-reduced-motion: reduce) override"
|
|
9
|
+
context: "Applies to all non-essential animations. Essential animations (progress indicators, loading states) should reduce, not remove."
|
|
10
|
+
reason: "Motion can trigger vestibular disorders, migraines, and seizures. WCAG 2.3.3 requires respecting user motion preferences."
|
|
11
|
+
instead: "Wrap animations in a motion-safe media query or provide a prefers-reduced-motion: reduce override that disables or minimizes the animation."
|
|
12
|
+
strictness:
|
|
13
|
+
permissive: info
|
|
14
|
+
standard: warn
|
|
15
|
+
strict: error
|
|
16
|
+
|
|
17
|
+
- name: "Animations longer than 500ms"
|
|
18
|
+
severity: warning
|
|
19
|
+
scope: all
|
|
20
|
+
detect:
|
|
21
|
+
css_properties: ["animation-duration", "transition-duration"]
|
|
22
|
+
threshold: "> 500ms"
|
|
23
|
+
exclude: ["page transitions", "skeleton loaders", "progress bars"]
|
|
24
|
+
reason: "Long animations feel sluggish and block user interaction. Users perceive delays over 400ms as 'slow'. Interface animations should feel instant and responsive."
|
|
25
|
+
instead: "Keep UI transitions between 150-300ms. Use 200ms as the default. Reserve longer durations (300-500ms) for complex multi-element orchestrations."
|
|
26
|
+
strictness:
|
|
27
|
+
permissive: info
|
|
28
|
+
standard: warn
|
|
29
|
+
strict: warn
|
|
30
|
+
|
|
31
|
+
- name: "Linear easing on UI transitions"
|
|
32
|
+
severity: info
|
|
33
|
+
scope: all
|
|
34
|
+
detect:
|
|
35
|
+
css_properties: ["transition-timing-function", "animation-timing-function"]
|
|
36
|
+
values: ["linear"]
|
|
37
|
+
context: "Flagged for UI element transitions, not progress bars or loading animations"
|
|
38
|
+
reason: "Linear motion feels mechanical and unnatural. Real objects accelerate and decelerate — interfaces should too."
|
|
39
|
+
instead: "Use ease-out for entrances (elements arriving), ease-in for exits (elements leaving), and ease-in-out for state changes. Default: cubic-bezier(0.4, 0, 0.2, 1)."
|
|
40
|
+
strictness:
|
|
41
|
+
permissive: info
|
|
42
|
+
standard: info
|
|
43
|
+
strict: warn
|
|
44
|
+
|
|
45
|
+
- name: "Auto-playing animation loops"
|
|
46
|
+
severity: warning
|
|
47
|
+
scope: all
|
|
48
|
+
detect:
|
|
49
|
+
css_properties: ["animation-iteration-count"]
|
|
50
|
+
values: ["infinite"]
|
|
51
|
+
context: "Excludes loading spinners and progress indicators that are temporary"
|
|
52
|
+
reason: "Infinite animation loops are distracting, increase CPU/GPU usage, and can trigger motion sensitivity issues. They compete with content for attention."
|
|
53
|
+
instead: "Play animations once on entrance, or limit to 3 iterations. If continuous animation is needed, provide a pause control and respect prefers-reduced-motion."
|
|
54
|
+
strictness:
|
|
55
|
+
permissive: info
|
|
56
|
+
standard: warn
|
|
57
|
+
strict: error
|
|
58
|
+
|
|
59
|
+
- name: "Scroll-jacking"
|
|
60
|
+
severity: error
|
|
61
|
+
scope: web
|
|
62
|
+
detect:
|
|
63
|
+
method: "Check for JavaScript that overrides native scroll behavior (custom scroll speed, snap-to-section, parallax scroll hijacking)"
|
|
64
|
+
exclude: ["scroll-snap-type CSS (native)", "smooth-scroll for anchor links"]
|
|
65
|
+
reason: "Overriding native scroll breaks user expectations, disables accessibility features (keyboard scroll, screen reader navigation), and creates motion sickness. It is the single most complained-about UX pattern."
|
|
66
|
+
instead: "Use native CSS scroll-snap for section snapping. For parallax, use CSS transform with will-change, not scroll event listeners. Never change scroll speed or direction."
|
|
67
|
+
strictness:
|
|
68
|
+
permissive: warn
|
|
69
|
+
standard: error
|
|
70
|
+
strict: error
|
|
71
|
+
|
|
72
|
+
- name: "Flash or strobe effects"
|
|
73
|
+
severity: error
|
|
74
|
+
scope: all
|
|
75
|
+
detect:
|
|
76
|
+
method: "Check for elements that flash more than 3 times per second"
|
|
77
|
+
threshold: "> 3 flashes per second"
|
|
78
|
+
reason: "Flashing content can cause seizures in people with photosensitive epilepsy. WCAG 2.3.1 requires no more than 3 flashes per second."
|
|
79
|
+
instead: "Avoid flashing entirely. If attention is needed, use a subtle pulse (opacity 0.8-1.0) at no more than 2 cycles per second."
|
|
80
|
+
strictness:
|
|
81
|
+
permissive: warn
|
|
82
|
+
standard: error
|
|
83
|
+
strict: error
|
|
84
|
+
|
|
85
|
+
- name: "Entrance animations on above-the-fold content"
|
|
86
|
+
severity: warning
|
|
87
|
+
scope: web
|
|
88
|
+
detect:
|
|
89
|
+
method: "Check for fade-in, slide-in, or scale animations on elements visible in the initial viewport"
|
|
90
|
+
context: "Hero sections, navigation, primary CTAs"
|
|
91
|
+
reason: "Animating content that should be immediately visible delays the user's ability to orient and act. It adds perceived load time to an already-loaded page."
|
|
92
|
+
instead: "Show above-the-fold content immediately. Reserve entrance animations for below-the-fold content revealed on scroll (intersection observer pattern)."
|
|
93
|
+
strictness:
|
|
94
|
+
permissive: info
|
|
95
|
+
standard: warn
|
|
96
|
+
strict: warn
|
|
97
|
+
|
|
98
|
+
- name: "Transition on color-scheme change"
|
|
99
|
+
severity: info
|
|
100
|
+
scope: web
|
|
101
|
+
detect:
|
|
102
|
+
method: "Check for transitions applied during dark/light mode toggle that affect all elements"
|
|
103
|
+
context: "Global transition: all on :root or body during theme switch"
|
|
104
|
+
reason: "Transitioning every element's colors during theme change causes a jarring ripple effect and high paint cost. Individual element transitions compound into visual chaos."
|
|
105
|
+
instead: "Apply transition only to background-color and color on specific containers (body, main sections), not globally. Or use instant switch with no transition."
|
|
106
|
+
strictness:
|
|
107
|
+
permissive: info
|
|
108
|
+
standard: info
|
|
109
|
+
strict: info
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
description: "Typography anti-patterns — common mistakes that degrade readability, hierarchy, and brand consistency"
|
|
2
|
+
|
|
3
|
+
patterns:
|
|
4
|
+
- name: "System font in user-facing UI"
|
|
5
|
+
severity: warning
|
|
6
|
+
scope: all
|
|
7
|
+
detect:
|
|
8
|
+
css_properties: ["font-family"]
|
|
9
|
+
values: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif", "serif", "monospace"]
|
|
10
|
+
context: "Only flagged when used as the sole font-family without a branded font preceding it in the stack"
|
|
11
|
+
reason: "System fonts vary across platforms, creating inconsistent brand identity. Users on Windows see Segoe UI while macOS users see SF Pro — the product looks different on every device."
|
|
12
|
+
instead: "Declare a branded font first in the stack with system fonts as fallbacks: `font-family: 'Inter', system-ui, sans-serif`"
|
|
13
|
+
strictness:
|
|
14
|
+
permissive: info
|
|
15
|
+
standard: warn
|
|
16
|
+
strict: warn
|
|
17
|
+
|
|
18
|
+
- name: "More than 3 font families on a single page"
|
|
19
|
+
severity: warning
|
|
20
|
+
scope: all
|
|
21
|
+
detect:
|
|
22
|
+
method: "Count distinct font-family values in rendered page"
|
|
23
|
+
threshold: 3
|
|
24
|
+
reason: "Multiple typefaces create visual noise and weaken typographic hierarchy. Each additional font competes for attention."
|
|
25
|
+
instead: "Use a single font family with weight/size variation for hierarchy, or a deliberate display + body pairing (max 2-3 families including monospace)."
|
|
26
|
+
strictness:
|
|
27
|
+
permissive: info
|
|
28
|
+
standard: warn
|
|
29
|
+
strict: warn
|
|
30
|
+
|
|
31
|
+
- name: "Body text below 14px / 0.875rem"
|
|
32
|
+
severity: error
|
|
33
|
+
scope: all
|
|
34
|
+
detect:
|
|
35
|
+
css_properties: ["font-size"]
|
|
36
|
+
threshold: "< 14px or < 0.875rem"
|
|
37
|
+
context: "Applies to body/paragraph text, not labels or captions"
|
|
38
|
+
reason: "Text below 14px is difficult to read on mobile devices and fails accessibility guidelines for users with low vision."
|
|
39
|
+
instead: "Use 16px (1rem) as the body text baseline. Use 14px only for secondary labels and metadata."
|
|
40
|
+
strictness:
|
|
41
|
+
permissive: info
|
|
42
|
+
standard: warn
|
|
43
|
+
strict: error
|
|
44
|
+
|
|
45
|
+
- name: "Line height below 1.4 for body text"
|
|
46
|
+
severity: warning
|
|
47
|
+
scope: all
|
|
48
|
+
detect:
|
|
49
|
+
css_properties: ["line-height"]
|
|
50
|
+
threshold: "< 1.4"
|
|
51
|
+
context: "Applies to body/paragraph text with font-size >= 14px"
|
|
52
|
+
reason: "Tight line height reduces readability, especially for longer passages. Users with dyslexia or cognitive disabilities are disproportionately affected."
|
|
53
|
+
instead: "Use line-height 1.5-1.6 for body text. Display headings can use tighter spacing (1.1-1.2)."
|
|
54
|
+
strictness:
|
|
55
|
+
permissive: info
|
|
56
|
+
standard: warn
|
|
57
|
+
strict: warn
|
|
58
|
+
|
|
59
|
+
- name: "All-caps body text"
|
|
60
|
+
severity: warning
|
|
61
|
+
scope: all
|
|
62
|
+
detect:
|
|
63
|
+
css_properties: ["text-transform"]
|
|
64
|
+
values: ["uppercase"]
|
|
65
|
+
context: "Flagged when applied to paragraphs or text blocks longer than 50 characters"
|
|
66
|
+
reason: "ALL CAPS reduces reading speed by 10-20% because word shapes become uniform rectangles. Acceptable for short labels and headings, not for body content."
|
|
67
|
+
instead: "Reserve text-transform: uppercase for buttons, labels, and section headers under 30 characters."
|
|
68
|
+
strictness:
|
|
69
|
+
permissive: info
|
|
70
|
+
standard: warn
|
|
71
|
+
strict: warn
|
|
72
|
+
|
|
73
|
+
- name: "Insufficient heading size contrast"
|
|
74
|
+
severity: warning
|
|
75
|
+
scope: all
|
|
76
|
+
detect:
|
|
77
|
+
method: "Compare h1-h6 font sizes — flag when adjacent heading levels differ by less than 20%"
|
|
78
|
+
threshold: "< 1.2x ratio between adjacent levels"
|
|
79
|
+
reason: "When heading sizes are too similar, the visual hierarchy collapses. Users cannot scan the page structure at a glance."
|
|
80
|
+
instead: "Use a consistent type scale ratio (1.2 minor third, 1.25 major third, or 1.333 perfect fourth) to ensure clear size differentiation."
|
|
81
|
+
strictness:
|
|
82
|
+
permissive: info
|
|
83
|
+
standard: warn
|
|
84
|
+
strict: warn
|
|
85
|
+
|
|
86
|
+
- name: "Justified text without hyphenation"
|
|
87
|
+
severity: info
|
|
88
|
+
scope: web
|
|
89
|
+
detect:
|
|
90
|
+
css_properties: ["text-align"]
|
|
91
|
+
values: ["justify"]
|
|
92
|
+
absent: ["hyphens: auto"]
|
|
93
|
+
reason: "Justified text without hyphenation creates uneven word spacing ('rivers of white') that disrupts reading flow, especially in narrow columns."
|
|
94
|
+
instead: "Use text-align: left for most content. If justified text is required, enable CSS hyphens: auto and ensure column width is at least 45 characters."
|
|
95
|
+
strictness:
|
|
96
|
+
permissive: info
|
|
97
|
+
standard: info
|
|
98
|
+
strict: warn
|
|
99
|
+
|
|
100
|
+
- name: "Font weight below 400 for body text"
|
|
101
|
+
severity: warning
|
|
102
|
+
scope: all
|
|
103
|
+
detect:
|
|
104
|
+
css_properties: ["font-weight"]
|
|
105
|
+
threshold: "< 400"
|
|
106
|
+
context: "Applies to body/paragraph text"
|
|
107
|
+
reason: "Light and thin font weights (100-300) reduce legibility on low-resolution screens and for users with vision impairments."
|
|
108
|
+
instead: "Use font-weight 400 (regular) as the minimum for body text. Light weights are acceptable only for large display text (24px+)."
|
|
109
|
+
strictness:
|
|
110
|
+
permissive: info
|
|
111
|
+
standard: warn
|
|
112
|
+
strict: error
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: "Creative"
|
|
2
|
+
description: "Expressive, editorial design with bold typography, intentional whitespace, and distinctive visual identity"
|
|
3
|
+
|
|
4
|
+
styles:
|
|
5
|
+
primary: "Editorial layouts with strong typographic hierarchy and intentional use of whitespace as a design element"
|
|
6
|
+
secondary: "Portfolio-driven presentation with immersive imagery, grid-breaking layouts, and art-directed content"
|
|
7
|
+
avoid: ["Generic stock photography that undermines creative credibility", "Template-feeling layouts that contradict the creative message", "Overly uniform grids that feel corporate rather than curated", "Decorative effects without purpose (gratuitous parallax, unnecessary animation)"]
|
|
8
|
+
|
|
9
|
+
palette:
|
|
10
|
+
primary:
|
|
11
|
+
- name: "Charcoal"
|
|
12
|
+
hex: "#1a1a1a"
|
|
13
|
+
usage: "Primary text, editorial headlines, strong contrast backgrounds"
|
|
14
|
+
- name: "Off-Black"
|
|
15
|
+
hex: "#2d2d2d"
|
|
16
|
+
usage: "Secondary surfaces, navigation backgrounds, card overlays"
|
|
17
|
+
- name: "Warm White"
|
|
18
|
+
hex: "#faf8f5"
|
|
19
|
+
usage: "Page backgrounds, content surfaces, breathing space"
|
|
20
|
+
accent:
|
|
21
|
+
- name: "Coral 500"
|
|
22
|
+
hex: "#f97066"
|
|
23
|
+
usage: "Primary accent, CTAs, highlighted portfolio items"
|
|
24
|
+
- name: "Electric Blue"
|
|
25
|
+
hex: "#3b82f6"
|
|
26
|
+
usage: "Links, interactive elements, secondary accent"
|
|
27
|
+
- name: "Saffron"
|
|
28
|
+
hex: "#e8a838"
|
|
29
|
+
usage: "Awards, featured work, premium tier indicators"
|
|
30
|
+
neutral:
|
|
31
|
+
- name: "Stone 800"
|
|
32
|
+
hex: "#292524"
|
|
33
|
+
usage: "Body text, primary readable content"
|
|
34
|
+
- name: "Stone 400"
|
|
35
|
+
hex: "#a8a29e"
|
|
36
|
+
usage: "Captions, metadata, subtle labels"
|
|
37
|
+
- name: "Stone 100"
|
|
38
|
+
hex: "#f5f5f4"
|
|
39
|
+
usage: "Section dividers, subtle background shifts"
|
|
40
|
+
- name: "White"
|
|
41
|
+
hex: "#ffffff"
|
|
42
|
+
usage: "Image framing, overlay text backgrounds, modal surfaces"
|
|
43
|
+
semantic:
|
|
44
|
+
success: "#22c55e"
|
|
45
|
+
warning: "#f59e0b"
|
|
46
|
+
error: "#ef4444"
|
|
47
|
+
info: "#6366f1"
|
|
48
|
+
|
|
49
|
+
typography:
|
|
50
|
+
display:
|
|
51
|
+
families: ["Instrument Serif", "Playfair Display", "Fraunces"]
|
|
52
|
+
weights: [400, 700, 900]
|
|
53
|
+
characteristics: "Expressive serif typefaces with distinctive character for headlines. High contrast between thick and thin strokes creates visual drama at large sizes."
|
|
54
|
+
body:
|
|
55
|
+
families: ["Inter", "Geist", "DM Sans"]
|
|
56
|
+
weights: [400, 500]
|
|
57
|
+
characteristics: "Clean sans-serif paired with serif display creates editorial contrast. Body type should recede, letting display type and imagery lead."
|
|
58
|
+
mono:
|
|
59
|
+
families: ["Geist Mono", "Space Mono"]
|
|
60
|
+
usage: "Code examples in case studies, technical specifications, date stamps on editorial content"
|
|
61
|
+
|
|
62
|
+
anti_patterns:
|
|
63
|
+
- pattern: "Using generic stock photography on a creative portfolio or agency site"
|
|
64
|
+
reason: "Stock imagery directly contradicts the message of original creative work; it signals inauthenticity"
|
|
65
|
+
instead: "Use original photography, custom illustrations, or carefully art-directed imagery that reflects actual creative capability"
|
|
66
|
+
- pattern: "Uniform grid layouts for all content types"
|
|
67
|
+
reason: "Creative sites should demonstrate design range; predictable grids feel template-driven and corporate"
|
|
68
|
+
instead: "Vary layout rhythm with full-bleed images, asymmetric grids, and intentional whitespace; let content dictate layout"
|
|
69
|
+
- pattern: "Autoplay background video on every page"
|
|
70
|
+
reason: "Overuse dilutes impact, increases load time, and creates accessibility issues; it becomes wallpaper rather than storytelling"
|
|
71
|
+
instead: "Use video intentionally for hero moments or case study intros; provide play controls and poster frames"
|
|
72
|
+
- pattern: "Cramming every project into the portfolio with equal weight"
|
|
73
|
+
reason: "Undifferentiated project lists signal lack of editorial judgment; the portfolio itself is a design artifact"
|
|
74
|
+
instead: "Curate 8-12 best projects with clear hierarchy; feature 2-3 as hero case studies with deeper storytelling"
|
|
75
|
+
- pattern: "Tiny body text to appear more 'design-forward'"
|
|
76
|
+
reason: "Sacrificing readability for aesthetics alienates users and fails accessibility standards"
|
|
77
|
+
instead: "Use generous body text (16px+) and let typographic hierarchy, spacing, and weight create sophistication"
|
|
78
|
+
|
|
79
|
+
examples:
|
|
80
|
+
reference_sites: ["pentagram.com", "itsnicethat.com", "awwwards.com", "siteinspire.com", "creativeboom.com"]
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: "E-Commerce"
|
|
2
|
+
description: "Conversion-focused design with bold CTAs, clear product hierarchy, and friction-minimized purchase flows"
|
|
3
|
+
|
|
4
|
+
styles:
|
|
5
|
+
primary: "Conversion-optimized layouts with clear visual hierarchy driving users toward purchase decisions"
|
|
6
|
+
secondary: "Editorial product storytelling with immersive imagery and aspirational lifestyle positioning"
|
|
7
|
+
avoid: ["Overwhelming product grids without filtering or visual breathing room", "Hidden or ambiguous pricing that erodes buyer confidence", "Aggressive pop-ups that interrupt the shopping flow", "Cluttered product pages with competing calls-to-action"]
|
|
8
|
+
|
|
9
|
+
palette:
|
|
10
|
+
primary:
|
|
11
|
+
- name: "Orange 600"
|
|
12
|
+
hex: "#ea580c"
|
|
13
|
+
usage: "Primary CTAs (Add to Cart, Buy Now), urgency indicators"
|
|
14
|
+
- name: "Orange 700"
|
|
15
|
+
hex: "#c2410c"
|
|
16
|
+
usage: "Hover states on primary actions, active button states"
|
|
17
|
+
- name: "Orange 50"
|
|
18
|
+
hex: "#fff7ed"
|
|
19
|
+
usage: "Sale banners, promotional section backgrounds"
|
|
20
|
+
accent:
|
|
21
|
+
- name: "Rose 500"
|
|
22
|
+
hex: "#f43f5e"
|
|
23
|
+
usage: "Sale badges, discount indicators, wishlist hearts"
|
|
24
|
+
- name: "Amber 400"
|
|
25
|
+
hex: "#fbbf24"
|
|
26
|
+
usage: "Star ratings, featured product highlights, best-seller badges"
|
|
27
|
+
- name: "Emerald 500"
|
|
28
|
+
hex: "#10b981"
|
|
29
|
+
usage: "In-stock indicators, free shipping badges, trust seals"
|
|
30
|
+
neutral:
|
|
31
|
+
- name: "Zinc 900"
|
|
32
|
+
hex: "#18181b"
|
|
33
|
+
usage: "Product titles, prices, primary text"
|
|
34
|
+
- name: "Zinc 500"
|
|
35
|
+
hex: "#71717a"
|
|
36
|
+
usage: "Product descriptions, secondary information, metadata"
|
|
37
|
+
- name: "Zinc 100"
|
|
38
|
+
hex: "#f4f4f5"
|
|
39
|
+
usage: "Category backgrounds, filter panels, page surfaces"
|
|
40
|
+
- name: "White"
|
|
41
|
+
hex: "#ffffff"
|
|
42
|
+
usage: "Product cards, checkout forms, content backgrounds"
|
|
43
|
+
semantic:
|
|
44
|
+
success: "#16a34a"
|
|
45
|
+
warning: "#eab308"
|
|
46
|
+
error: "#dc2626"
|
|
47
|
+
info: "#0284c7"
|
|
48
|
+
|
|
49
|
+
typography:
|
|
50
|
+
display:
|
|
51
|
+
families: ["DM Sans", "Plus Jakarta Sans"]
|
|
52
|
+
weights: [600, 700, 800]
|
|
53
|
+
characteristics: "Bold geometric sans-serifs that command attention for hero sections, sale headers, and category titles. Strong at large sizes."
|
|
54
|
+
body:
|
|
55
|
+
families: ["Inter", "DM Sans", "system-ui"]
|
|
56
|
+
weights: [400, 500]
|
|
57
|
+
characteristics: "Highly legible at small sizes for product specs, reviews, and policy text. Clear distinction between regular and medium weights for scannability."
|
|
58
|
+
mono:
|
|
59
|
+
families: ["JetBrains Mono", "SF Mono"]
|
|
60
|
+
usage: "Order numbers, tracking codes, promo codes, SKU references"
|
|
61
|
+
|
|
62
|
+
anti_patterns:
|
|
63
|
+
- pattern: "Hiding the total price until checkout"
|
|
64
|
+
reason: "Price surprises at checkout are the #1 cause of cart abandonment (48% of users cite unexpected costs)"
|
|
65
|
+
instead: "Show running total including estimated tax and shipping on the cart page; surface free-shipping thresholds early"
|
|
66
|
+
- pattern: "Requiring account creation before purchase"
|
|
67
|
+
reason: "Forced registration causes 24% of shoppers to abandon; it adds friction at the highest-intent moment"
|
|
68
|
+
instead: "Offer guest checkout as the default path; invite account creation after purchase with order-tracking incentive"
|
|
69
|
+
- pattern: "Product images that don't zoom or show only one angle"
|
|
70
|
+
reason: "Users cannot evaluate products they can't inspect; lack of imagery increases return rates"
|
|
71
|
+
instead: "Provide 4+ images per product with zoom, multiple angles, lifestyle context, and size reference"
|
|
72
|
+
- pattern: "Infinite scroll on product listing pages without pagination controls"
|
|
73
|
+
reason: "Users lose their place, cannot bookmark results, and experience scroll fatigue; footer content becomes unreachable"
|
|
74
|
+
instead: "Use paginated results with 'Load more' option; preserve scroll position on back navigation"
|
|
75
|
+
- pattern: "Using carousel sliders for critical product information"
|
|
76
|
+
reason: "Users interact with fewer than 1% of carousel slides past the first; important products get buried"
|
|
77
|
+
instead: "Use static grids or curated featured sections; if using carousels, show partial next-slide indicators"
|
|
78
|
+
|
|
79
|
+
examples:
|
|
80
|
+
reference_sites: ["shopify.com/themes", "everlane.com", "apple.com/shop", "allbirds.com", "glossier.com"]
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: "Emerging Tech"
|
|
2
|
+
description: "Innovative, forward-looking design with dark themes, accent neons, and geometric precision for cutting-edge technology products"
|
|
3
|
+
|
|
4
|
+
styles:
|
|
5
|
+
primary: "Dark-first interfaces with precise geometric layouts, neon accents, and futuristic visual language"
|
|
6
|
+
secondary: "Data-rich dashboards with real-time visualization, 3D elements, and immersive product experiences"
|
|
7
|
+
avoid: ["Retro-futurism cliches (chrome text, star fields, 80s synthwave aesthetics)", "Inaccessible contrast ratios from neon-on-dark combinations", "Overuse of 3D elements that slow performance and add no information", "Gratuitous particle effects and WebGL demos that distract from product value"]
|
|
8
|
+
|
|
9
|
+
palette:
|
|
10
|
+
primary:
|
|
11
|
+
- name: "Deep Space"
|
|
12
|
+
hex: "#0a0a0f"
|
|
13
|
+
usage: "Primary background, immersive dark surfaces"
|
|
14
|
+
- name: "Dark Surface"
|
|
15
|
+
hex: "#141420"
|
|
16
|
+
usage: "Card backgrounds, elevated surfaces, modal backgrounds"
|
|
17
|
+
- name: "Midnight Blue"
|
|
18
|
+
hex: "#1a1a2e"
|
|
19
|
+
usage: "Secondary surfaces, sidebar backgrounds, section dividers"
|
|
20
|
+
accent:
|
|
21
|
+
- name: "Electric Cyan"
|
|
22
|
+
hex: "#00d4ff"
|
|
23
|
+
usage: "Primary interactive elements, data visualization highlights, key metrics"
|
|
24
|
+
- name: "Neon Green"
|
|
25
|
+
hex: "#00ff88"
|
|
26
|
+
usage: "Success states, active indicators, real-time status"
|
|
27
|
+
- name: "Electric Purple"
|
|
28
|
+
hex: "#a855f7"
|
|
29
|
+
usage: "Premium features, AI/ML indicators, secondary accent"
|
|
30
|
+
- name: "Hot Pink"
|
|
31
|
+
hex: "#ec4899"
|
|
32
|
+
usage: "Alerts, critical notifications, tertiary accent"
|
|
33
|
+
neutral:
|
|
34
|
+
- name: "Light Gray"
|
|
35
|
+
hex: "#e2e8f0"
|
|
36
|
+
usage: "Primary text on dark backgrounds"
|
|
37
|
+
- name: "Cool Gray"
|
|
38
|
+
hex: "#94a3b8"
|
|
39
|
+
usage: "Secondary text, labels, descriptions"
|
|
40
|
+
- name: "Dark Gray"
|
|
41
|
+
hex: "#334155"
|
|
42
|
+
usage: "Borders, dividers, inactive states"
|
|
43
|
+
- name: "Near Black"
|
|
44
|
+
hex: "#0f172a"
|
|
45
|
+
usage: "Deepest surface level, page background in ultra-dark mode"
|
|
46
|
+
semantic:
|
|
47
|
+
success: "#00ff88"
|
|
48
|
+
warning: "#fbbf24"
|
|
49
|
+
error: "#ef4444"
|
|
50
|
+
info: "#00d4ff"
|
|
51
|
+
|
|
52
|
+
typography:
|
|
53
|
+
display:
|
|
54
|
+
families: ["Space Grotesk", "Outfit"]
|
|
55
|
+
weights: [500, 700]
|
|
56
|
+
characteristics: "Geometric sans-serifs with distinctive character at large sizes. Slightly technical feel without being cold -- conveys precision and innovation."
|
|
57
|
+
body:
|
|
58
|
+
families: ["Inter", "Space Grotesk", "system-ui"]
|
|
59
|
+
weights: [400, 500]
|
|
60
|
+
characteristics: "Clean and highly legible on dark backgrounds. Slightly increased letter-spacing (0.01em) for improved readability on dark surfaces."
|
|
61
|
+
mono:
|
|
62
|
+
families: ["JetBrains Mono", "Fira Code", "Geist Mono"]
|
|
63
|
+
usage: "Terminal output, API responses, blockchain addresses, configuration code, real-time data streams"
|
|
64
|
+
|
|
65
|
+
anti_patterns:
|
|
66
|
+
- pattern: "Neon text on dark background without sufficient contrast ratio"
|
|
67
|
+
reason: "Many neon colors (cyan, green, pink) on near-black fail WCAG AA (4.5:1); vibrant does not mean readable"
|
|
68
|
+
instead: "Test all neon accent text against backgrounds; use brighter tints for text (e.g., lighten cyan to #67e8f9 for readability) or increase font size"
|
|
69
|
+
- pattern: "Using 3D renders and WebGL for purely decorative purposes"
|
|
70
|
+
reason: "Heavy 3D adds seconds to load time, drains mobile batteries, and often communicates nothing about the product"
|
|
71
|
+
instead: "Use 3D only when it serves understanding (product visualization, spatial data); offer 2D fallbacks for performance"
|
|
72
|
+
- pattern: "Retro-futurism aesthetics (chrome text, grid floors, star fields)"
|
|
73
|
+
reason: "Dated sci-fi visuals signal that the team's vision of the future is stuck in the past; it undermines credibility for genuinely novel technology"
|
|
74
|
+
instead: "Reference current cutting-edge design (spatial computing UI, ambient interfaces, adaptive layouts) rather than pop-culture futurism"
|
|
75
|
+
- pattern: "Auto-playing demos that consume resources without user initiation"
|
|
76
|
+
reason: "Real-time visualizations and simulations consume CPU/GPU; auto-playing them causes fan noise, battery drain, and poor first impressions"
|
|
77
|
+
instead: "Show a compelling static frame with a clear 'Run demo' CTA; respect the user's device and battery"
|
|
78
|
+
- pattern: "Dark mode only with no light mode option"
|
|
79
|
+
reason: "Some users have visual conditions that make dark interfaces harder to read; accessibility requires options"
|
|
80
|
+
instead: "Offer both dark and light modes; dark can be default but light must be available and well-designed"
|
|
81
|
+
|
|
82
|
+
examples:
|
|
83
|
+
reference_sites: ["openai.com", "vercel.com", "linear.app", "github.com/features/copilot", "replit.com"]
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: "Fintech"
|
|
2
|
+
description: "Trust-driven, precision-focused design conveying security, reliability, and financial expertise"
|
|
3
|
+
|
|
4
|
+
styles:
|
|
5
|
+
primary: "Conservative elegance with precise data presentation and trust-building visual cues"
|
|
6
|
+
secondary: "Institutional authority balanced with modern approachability for consumer-facing products"
|
|
7
|
+
avoid: ["Playful or whimsical typography that undermines financial credibility", "Bright gradients or neon accents that feel unserious", "Overly complex data visualizations without progressive disclosure", "Gamification patterns that trivialize financial decisions"]
|
|
8
|
+
|
|
9
|
+
palette:
|
|
10
|
+
primary:
|
|
11
|
+
- name: "Navy 800"
|
|
12
|
+
hex: "#1e3a5f"
|
|
13
|
+
usage: "Primary brand, navigation, headers conveying institutional trust"
|
|
14
|
+
- name: "Navy 900"
|
|
15
|
+
hex: "#0f2440"
|
|
16
|
+
usage: "Dark mode surfaces, footer backgrounds, high-emphasis text"
|
|
17
|
+
- name: "Navy 100"
|
|
18
|
+
hex: "#dbeafe"
|
|
19
|
+
usage: "Selected states, info banners, subtle highlights"
|
|
20
|
+
accent:
|
|
21
|
+
- name: "Emerald 600"
|
|
22
|
+
hex: "#059669"
|
|
23
|
+
usage: "Positive financial indicators, gains, completed transactions"
|
|
24
|
+
- name: "Teal 500"
|
|
25
|
+
hex: "#14b8a6"
|
|
26
|
+
usage: "Secondary actions, chart accents, interactive elements"
|
|
27
|
+
- name: "Gold 500"
|
|
28
|
+
hex: "#d4a853"
|
|
29
|
+
usage: "Premium tier indicators, high-value account badges"
|
|
30
|
+
neutral:
|
|
31
|
+
- name: "Gray 900"
|
|
32
|
+
hex: "#111827"
|
|
33
|
+
usage: "Primary text, financial figures, account balances"
|
|
34
|
+
- name: "Gray 600"
|
|
35
|
+
hex: "#4b5563"
|
|
36
|
+
usage: "Secondary text, transaction descriptions, timestamps"
|
|
37
|
+
- name: "Gray 100"
|
|
38
|
+
hex: "#f3f4f6"
|
|
39
|
+
usage: "Page backgrounds, table alternating rows"
|
|
40
|
+
- name: "White"
|
|
41
|
+
hex: "#ffffff"
|
|
42
|
+
usage: "Card surfaces, input fields, modal backgrounds"
|
|
43
|
+
semantic:
|
|
44
|
+
success: "#059669"
|
|
45
|
+
warning: "#d97706"
|
|
46
|
+
error: "#dc2626"
|
|
47
|
+
info: "#2563eb"
|
|
48
|
+
|
|
49
|
+
typography:
|
|
50
|
+
display:
|
|
51
|
+
families: ["Inter", "SF Pro Display"]
|
|
52
|
+
weights: [500, 600, 700]
|
|
53
|
+
characteristics: "Clean sans-serifs with excellent tabular figures. Numeral clarity is paramount -- every digit must be unambiguous at any size."
|
|
54
|
+
body:
|
|
55
|
+
families: ["Inter", "SF Pro Text", "system-ui"]
|
|
56
|
+
weights: [400, 500]
|
|
57
|
+
characteristics: "High legibility at small sizes for transaction lists and account details. Tabular lining figures for aligned number columns."
|
|
58
|
+
mono:
|
|
59
|
+
families: ["SF Mono", "JetBrains Mono", "Fira Code"]
|
|
60
|
+
usage: "Account numbers, routing numbers, transaction IDs, API references, and any numerical data requiring exact alignment"
|
|
61
|
+
|
|
62
|
+
anti_patterns:
|
|
63
|
+
- pattern: "Displaying financial amounts without proper locale formatting"
|
|
64
|
+
reason: "Misformatted currency (e.g., missing commas, wrong decimal separator) erodes trust and can cause costly user errors"
|
|
65
|
+
instead: "Use Intl.NumberFormat with the user's locale and currency; always show currency symbol and appropriate decimal places"
|
|
66
|
+
- pattern: "Using red and green as the only differentiator for gains and losses"
|
|
67
|
+
reason: "8% of men and 0.5% of women have red-green color blindness; financial data must be accessible to all users"
|
|
68
|
+
instead: "Pair color with icons (up/down arrows), text labels (+/-), or positional cues; never rely on color alone"
|
|
69
|
+
- pattern: "Auto-refreshing account balances without user consent"
|
|
70
|
+
reason: "Unexpected balance changes cause anxiety; users viewing their balance are in a sensitive emotional state"
|
|
71
|
+
instead: "Show a 'Balance updated' indicator with timestamp; let users pull-to-refresh or tap to update"
|
|
72
|
+
- pattern: "Placing transfer/send buttons where they can be accidentally tapped"
|
|
73
|
+
reason: "Accidental financial transactions create support burden and erode trust; money movement must be intentional"
|
|
74
|
+
instead: "Require confirmation for all financial actions; use adequate spacing and distinct visual treatment for destructive actions"
|
|
75
|
+
- pattern: "Hiding fees or exchange rates behind expandable sections"
|
|
76
|
+
reason: "Perceived fee hiding destroys trust and may violate financial transparency regulations"
|
|
77
|
+
instead: "Show total cost including all fees upfront; use clear breakdowns before any confirmation step"
|
|
78
|
+
|
|
79
|
+
examples:
|
|
80
|
+
reference_sites: ["mercury.com", "wise.com", "stripe.com", "robinhood.com", "brex.com"]
|