raven-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +629 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
- package/src/data/business/growth.json +48 -0
- package/src/data/business/metrics.json +48 -0
- package/src/data/business/monetization.json +56 -0
- package/src/data/business/onboarding.json +48 -0
- package/src/data/business/retention.json +48 -0
- package/src/data/patterns/cta.json +51 -0
- package/src/data/patterns/dashboard.json +51 -0
- package/src/data/patterns/empty-states.json +42 -0
- package/src/data/patterns/error-states.json +51 -0
- package/src/data/patterns/forms.json +53 -0
- package/src/data/patterns/landing-page.json +51 -0
- package/src/data/patterns/loading-states.json +51 -0
- package/src/data/patterns/mobile-conversion.json +51 -0
- package/src/data/patterns/modals-dialogs.json +51 -0
- package/src/data/patterns/navigation.json +50 -0
- package/src/data/patterns/pricing-page.json +59 -0
- package/src/data/patterns/signup-flow.json +52 -0
- package/src/data/patterns/social-proof.json +49 -0
- package/src/data/principles/accessibility.json +151 -0
- package/src/data/principles/color-theory.json +100 -0
- package/src/data/principles/d4d.json +113 -0
- package/src/data/principles/gestalt.json +129 -0
- package/src/data/principles/laws-of-ux.json +490 -0
- package/src/data/principles/mobile-ux.json +126 -0
- package/src/data/principles/nielsen-heuristics.json +258 -0
- package/src/data/principles/typography.json +117 -0
- package/src/data/tokens/registry.json +67 -0
- package/src/data/tokens/systems/linear.json +134 -0
- package/src/data/tokens/systems/stripe.json +147 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "color-contrast",
|
|
4
|
+
"name": "Color Contrast",
|
|
5
|
+
"category": "accessibility",
|
|
6
|
+
"summary": "Text and interactive elements must have sufficient contrast against their backgrounds.",
|
|
7
|
+
"description": "WCAG 2.1 requires minimum contrast ratios to ensure readability for users with low vision or color blindness. Normal text needs 4.5:1, large text (18px+ or 14px+ bold) needs 3:1, and UI components/graphics need 3:1. This is non-negotiable for any public-facing product. Test with tools like WebAIM's contrast checker.",
|
|
8
|
+
"implications": [
|
|
9
|
+
"Normal text: minimum 4.5:1 contrast ratio (WCAG AA)",
|
|
10
|
+
"Large text (18px+ regular or 14px+ bold): minimum 3:1",
|
|
11
|
+
"UI components and graphical objects: minimum 3:1",
|
|
12
|
+
"Enhanced accessibility (WCAG AAA): 7:1 for normal text, 4.5:1 for large",
|
|
13
|
+
"Don't rely on color alone to convey information — use icons, text, or patterns too",
|
|
14
|
+
"Test with grayscale to verify information is still clear without color",
|
|
15
|
+
"Check contrast on all background colors, not just the primary background"
|
|
16
|
+
],
|
|
17
|
+
"violations": [
|
|
18
|
+
"Light gray text on white background (#999 on #fff = 2.85:1 — fails)",
|
|
19
|
+
"Colored text on colored background without checking contrast",
|
|
20
|
+
"Placeholder text with insufficient contrast (common: #aaa on #fff)",
|
|
21
|
+
"Status indicators using only color (red/green dots with no label)",
|
|
22
|
+
"Links that are only distinguished from body text by color"
|
|
23
|
+
],
|
|
24
|
+
"applies_to": ["color", "typography", "buttons", "forms", "status-indicators", "links"],
|
|
25
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html"]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "keyboard-navigation",
|
|
29
|
+
"name": "Keyboard Navigation",
|
|
30
|
+
"category": "accessibility",
|
|
31
|
+
"summary": "All interactive content must be accessible and operable through keyboard alone.",
|
|
32
|
+
"description": "Many users navigate with keyboards — screen reader users, users with motor disabilities, and power users. All interactive elements must be reachable via Tab, operable via Enter/Space, and dismissible via Escape. Focus order should follow visual reading order. Custom interactive components need proper ARIA roles and keyboard event handlers.",
|
|
33
|
+
"implications": [
|
|
34
|
+
"All interactive elements must be focusable and have visible focus indicators",
|
|
35
|
+
"Tab order must follow the logical reading order of the page",
|
|
36
|
+
"Modals must trap focus and return focus to the trigger when closed",
|
|
37
|
+
"Custom dropdowns, tabs, and menus need arrow key navigation",
|
|
38
|
+
"Escape should close modals, dropdowns, and overlay elements",
|
|
39
|
+
"Skip navigation links for users to bypass repeated content",
|
|
40
|
+
"Never remove focus outlines without providing a visible alternative"
|
|
41
|
+
],
|
|
42
|
+
"violations": [
|
|
43
|
+
"Click-only interactions with no keyboard equivalent",
|
|
44
|
+
"Invisible or removed focus indicators (outline: none without replacement)",
|
|
45
|
+
"Modal that doesn't trap focus — Tab goes to elements behind the overlay",
|
|
46
|
+
"Custom dropdown that doesn't respond to arrow keys or Escape",
|
|
47
|
+
"Focus order that doesn't match visual order (e.g., due to CSS order/flex)"
|
|
48
|
+
],
|
|
49
|
+
"applies_to": ["navigation", "forms", "modals", "menus", "interactive-elements", "focus"],
|
|
50
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html"]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"id": "screen-reader-support",
|
|
54
|
+
"name": "Screen Reader Support",
|
|
55
|
+
"category": "accessibility",
|
|
56
|
+
"summary": "Content must be perceivable and understandable when read by assistive technologies.",
|
|
57
|
+
"description": "Screen readers translate visual interfaces into speech or braille. This requires semantic HTML, proper ARIA labels, meaningful alt text, and logical document structure. The goal is equivalent access — a screen reader user should be able to accomplish the same tasks and access the same information as a sighted user.",
|
|
58
|
+
"implications": [
|
|
59
|
+
"Use semantic HTML elements (nav, main, header, footer, article, section)",
|
|
60
|
+
"Provide alt text for all meaningful images; empty alt for decorative images",
|
|
61
|
+
"Use ARIA labels for interactive elements without visible text labels",
|
|
62
|
+
"Heading hierarchy should be logical (h1 > h2 > h3, no skipping levels)",
|
|
63
|
+
"Form inputs must have associated labels (label element or aria-label)",
|
|
64
|
+
"Live regions (aria-live) for dynamic content updates",
|
|
65
|
+
"Announce state changes (loading, error, success) to screen readers"
|
|
66
|
+
],
|
|
67
|
+
"violations": [
|
|
68
|
+
"Images without alt text or with unhelpful alt text ('image.png')",
|
|
69
|
+
"Div/span used for interactive elements instead of button/a",
|
|
70
|
+
"Form inputs without labels",
|
|
71
|
+
"Dynamic content updates that aren't announced to screen readers",
|
|
72
|
+
"Heading levels skipped or used for styling instead of structure"
|
|
73
|
+
],
|
|
74
|
+
"applies_to": ["html", "images", "forms", "navigation", "dynamic-content", "headings"],
|
|
75
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html"]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"id": "touch-target-size",
|
|
79
|
+
"name": "Touch Target Size",
|
|
80
|
+
"category": "accessibility",
|
|
81
|
+
"summary": "Interactive elements must be large enough to activate easily without accidental activation of adjacent targets.",
|
|
82
|
+
"description": "WCAG 2.5.5 (Enhanced, AAA) recommends 44x44 CSS pixels minimum. WCAG 2.5.8 (AA in WCAG 2.2) requires targets of at least 24x24px with adequate spacing. Apple HIG requires 44pt, Material Design requires 48dp. Small targets cause errors, frustration, and are inaccessible to users with motor impairments. This applies to buttons, links, checkboxes, and any tappable element.",
|
|
83
|
+
"implications": [
|
|
84
|
+
"Minimum 44x44px touch targets (Apple HIG) or 48x48dp (Material)",
|
|
85
|
+
"WCAG 2.2 minimum: 24x24px with adequate spacing",
|
|
86
|
+
"Adequate spacing between adjacent touch targets (at least 8px)",
|
|
87
|
+
"Inline links in text should have enough padding/line-height for tapping",
|
|
88
|
+
"Checkboxes and radio buttons need enlarged tap areas (label wrapping)",
|
|
89
|
+
"Small icons should have padding to extend the touch target beyond the visual"
|
|
90
|
+
],
|
|
91
|
+
"violations": [
|
|
92
|
+
"Icon buttons smaller than 44px without extended tap target",
|
|
93
|
+
"Adjacent links in text with no spacing between them",
|
|
94
|
+
"Tiny checkboxes without clickable labels",
|
|
95
|
+
"Close buttons on modals that are 16x16px",
|
|
96
|
+
"Dense data tables with row-level click targets on mobile"
|
|
97
|
+
],
|
|
98
|
+
"applies_to": ["buttons", "links", "mobile", "touch-targets", "forms", "icons"],
|
|
99
|
+
"sources": ["https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html"]
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id": "motion-sensitivity",
|
|
103
|
+
"name": "Motion and Animation Sensitivity",
|
|
104
|
+
"category": "accessibility",
|
|
105
|
+
"summary": "Provide mechanisms to pause, stop, or reduce motion for users who are sensitive to animation.",
|
|
106
|
+
"description": "Some users experience nausea, dizziness, or seizures from excessive motion, parallax effects, or flashing content. WCAG requires the ability to pause or disable motion, limits on flashing content, and respect for the prefers-reduced-motion media query. Auto-playing animations and videos must have pause controls.",
|
|
107
|
+
"implications": [
|
|
108
|
+
"Respect prefers-reduced-motion media query — reduce or eliminate animations",
|
|
109
|
+
"No content that flashes more than 3 times per second",
|
|
110
|
+
"Provide pause/stop controls for auto-playing content",
|
|
111
|
+
"Auto-playing videos must be muted and pausable",
|
|
112
|
+
"Parallax scrolling should be optional and smooth",
|
|
113
|
+
"Use subtle, purposeful animations — not gratuitous motion",
|
|
114
|
+
"Provide a motion preference toggle in app settings"
|
|
115
|
+
],
|
|
116
|
+
"violations": [
|
|
117
|
+
"Ignoring prefers-reduced-motion — animations play regardless",
|
|
118
|
+
"Auto-playing video backgrounds with no pause control",
|
|
119
|
+
"Excessive parallax that causes motion sickness",
|
|
120
|
+
"Content that flashes rapidly (seizure risk)",
|
|
121
|
+
"Large, sweeping page transitions with no reduced-motion alternative"
|
|
122
|
+
],
|
|
123
|
+
"applies_to": ["animation", "video", "transitions", "parallax", "auto-play", "motion"],
|
|
124
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html"]
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "text-readability",
|
|
128
|
+
"name": "Text Readability",
|
|
129
|
+
"category": "accessibility",
|
|
130
|
+
"summary": "Text must be resizable, reflowable, and formatted for comfortable reading.",
|
|
131
|
+
"description": "WCAG requires text be resizable up to 200% without loss of content. Content should reflow on zoom without horizontal scrolling. Line length, line height, letter spacing, and paragraph spacing all affect readability. Minimum body text of 16px on web. Text should be readable with user-customized fonts and spacing.",
|
|
132
|
+
"implications": [
|
|
133
|
+
"Minimum 16px (1rem) body text on web",
|
|
134
|
+
"Line height of 1.5 for body text (WCAG recommendation)",
|
|
135
|
+
"Line length of 45-75 characters for optimal readability",
|
|
136
|
+
"Text must be resizable to 200% without content loss",
|
|
137
|
+
"Use responsive units (rem, em) not fixed px for font sizes",
|
|
138
|
+
"Ensure text reflows properly at all zoom levels",
|
|
139
|
+
"Support user-customized text spacing without breaking layout"
|
|
140
|
+
],
|
|
141
|
+
"violations": [
|
|
142
|
+
"Body text smaller than 16px on web / 11pt on mobile",
|
|
143
|
+
"Line length exceeding 80 characters without a max-width",
|
|
144
|
+
"Fixed font sizes that don't scale with browser zoom",
|
|
145
|
+
"Text clipped or overflowing when zoomed to 200%",
|
|
146
|
+
"Single-line height (line-height: 1) on multi-line text"
|
|
147
|
+
],
|
|
148
|
+
"applies_to": ["typography", "responsive", "zoom", "readability", "content"],
|
|
149
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/text-spacing.html"]
|
|
150
|
+
}
|
|
151
|
+
]
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "color-60-30-10",
|
|
4
|
+
"name": "60-30-10 Color Rule",
|
|
5
|
+
"category": "color-theory",
|
|
6
|
+
"summary": "Use a 60% dominant color, 30% secondary color, and 10% accent color for balanced compositions.",
|
|
7
|
+
"description": "Borrowed from interior design, this ratio creates visual balance and hierarchy. 60% is the dominant/background color, 30% is the secondary/surface color, and 10% is the accent used for CTAs, highlights, and emphasis. This prevents the common mistake of overusing brand colors, which creates visual fatigue. The accent color's power comes from its scarcity.",
|
|
8
|
+
"implications": [
|
|
9
|
+
"60% dominant: background, large surfaces (white, off-white, or dark bg)",
|
|
10
|
+
"30% secondary: cards, sidebar, secondary surfaces",
|
|
11
|
+
"10% accent: CTAs, links, active states, key highlights",
|
|
12
|
+
"The accent color should be used sparingly — overuse destroys its impact",
|
|
13
|
+
"Neutral colors (gray spectrum) should make up most of the 60% and 30%",
|
|
14
|
+
"Test by blurring the page — the accent should pop against the dominant"
|
|
15
|
+
],
|
|
16
|
+
"violations": [
|
|
17
|
+
"Brand color used as background — creates visual fatigue",
|
|
18
|
+
"Accent color used on 30%+ of the page — loses emphasis power",
|
|
19
|
+
"No accent color — everything is gray and nothing stands out",
|
|
20
|
+
"Three equally competing bright colors with no clear hierarchy"
|
|
21
|
+
],
|
|
22
|
+
"applies_to": ["color", "visual-design", "branding", "layout", "cta", "hierarchy"],
|
|
23
|
+
"sources": ["https://www.interaction-design.org/literature/article/the-60-30-10-rule"]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "dark-ui-design",
|
|
27
|
+
"name": "Dark UI Design",
|
|
28
|
+
"category": "color-theory",
|
|
29
|
+
"summary": "Dark interfaces require different approaches to elevation, contrast, and color usage.",
|
|
30
|
+
"description": "Dark mode isn't just inverting colors. Material Design's dark theme guide establishes that lighter surfaces are 'elevated' (opposite of light mode). Use desaturated colors to reduce eye strain. Don't use pure black (#000) — it creates excessive contrast and halation. Background surfaces should use dark grays (#121212 to #1e1e1e). Color accents need more saturation to be visible on dark backgrounds.",
|
|
31
|
+
"implications": [
|
|
32
|
+
"Don't use pure black (#000000) — use dark grays (#121212, #1a1a1a, #1e1e1e)",
|
|
33
|
+
"Express elevation with lighter surfaces (dp0: #121212, dp1: #1e1e1e, dp2: #222222)",
|
|
34
|
+
"Use desaturated colors on dark backgrounds to reduce eye strain",
|
|
35
|
+
"Increase text opacity levels: primary 87%, secondary 60%, disabled 38%",
|
|
36
|
+
"Accent colors may need higher saturation to maintain visibility",
|
|
37
|
+
"Avoid pure white text on dark backgrounds — use off-white (rgba(255,255,255,0.87))",
|
|
38
|
+
"Shadows are less effective in dark mode — use borders or surface elevation instead",
|
|
39
|
+
"Test for dark mode contrast issues — WCAG ratios still apply"
|
|
40
|
+
],
|
|
41
|
+
"violations": [
|
|
42
|
+
"Pure black background with pure white text — harsh, causes halation",
|
|
43
|
+
"Inverted light mode colors without adjustment — saturated colors cause eye strain",
|
|
44
|
+
"Shadows as the primary elevation cue — invisible on dark backgrounds",
|
|
45
|
+
"Low-saturation accent colors that disappear on dark surfaces",
|
|
46
|
+
"Same opacity for text that works in light mode — appears washed out"
|
|
47
|
+
],
|
|
48
|
+
"applies_to": ["color", "dark-mode", "elevation", "contrast", "visual-design"],
|
|
49
|
+
"sources": ["https://m3.material.io/styles/color/dark-theme"]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "semantic-color",
|
|
53
|
+
"name": "Semantic Color Usage",
|
|
54
|
+
"category": "color-theory",
|
|
55
|
+
"summary": "Assign meaning to colors consistently — success is green, error is red, warning is amber.",
|
|
56
|
+
"description": "Colors carry meaning. Red signals error/danger, green signals success, amber/yellow signals warning, blue signals information. These mappings are deeply cultural (in Western markets) and should be consistent across the entire product. Always pair color with another signal (icon, text, pattern) for accessibility. Define semantic color tokens in your design system.",
|
|
57
|
+
"implications": [
|
|
58
|
+
"Red/destructive: errors, delete actions, critical alerts",
|
|
59
|
+
"Green/success: confirmations, completion, positive status",
|
|
60
|
+
"Amber/warning: caution states, approaching limits, non-critical issues",
|
|
61
|
+
"Blue/info: informational messages, links, primary actions",
|
|
62
|
+
"Gray/neutral: disabled states, secondary information, borders",
|
|
63
|
+
"Always pair color with text or icon — never color alone",
|
|
64
|
+
"Define semantic tokens: color-error, color-success, color-warning, color-info"
|
|
65
|
+
],
|
|
66
|
+
"violations": [
|
|
67
|
+
"Red used for a non-error primary CTA (confusing meaning)",
|
|
68
|
+
"Green and red used interchangeably for different UI elements",
|
|
69
|
+
"Inconsistent status colors across different pages",
|
|
70
|
+
"Color as the only indicator of state — fails for colorblind users"
|
|
71
|
+
],
|
|
72
|
+
"applies_to": ["color", "status", "error-states", "success", "warnings", "design-system"],
|
|
73
|
+
"sources": ["https://m3.material.io/styles/color/roles"]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "color-accessibility",
|
|
77
|
+
"name": "Color and Accessibility",
|
|
78
|
+
"category": "color-theory",
|
|
79
|
+
"summary": "8% of men and 0.5% of women have some form of color vision deficiency — design for it.",
|
|
80
|
+
"description": "Color blindness affects 1 in 12 men and 1 in 200 women. The most common type (deuteranopia/protanopia) makes red and green difficult to distinguish. Design should never rely on color alone. Use redundant coding: color + shape, color + text, color + pattern. Test designs with color blindness simulators. Ensure sufficient contrast between all color pairs that need to be distinguished.",
|
|
81
|
+
"implications": [
|
|
82
|
+
"Never use color as the sole indicator of meaning or state",
|
|
83
|
+
"Add icons or text labels alongside color-coded status indicators",
|
|
84
|
+
"Use patterns or hatching in charts/graphs in addition to color",
|
|
85
|
+
"Test with color blindness simulators (deuteranopia, protanopia, tritanopia)",
|
|
86
|
+
"Red-green combinations are the most problematic — use additional cues",
|
|
87
|
+
"Ensure adjacent colors in charts have sufficient contrast from each other",
|
|
88
|
+
"Consider colorblind-safe palettes (blue-orange instead of red-green)"
|
|
89
|
+
],
|
|
90
|
+
"violations": [
|
|
91
|
+
"Red/green only indicators for success/error states",
|
|
92
|
+
"Pie chart with color-only legend — indistinguishable segments",
|
|
93
|
+
"Form validation using only red outlines with no icon or text",
|
|
94
|
+
"Traffic light status indicators without labels",
|
|
95
|
+
"Data visualization using only color to distinguish series"
|
|
96
|
+
],
|
|
97
|
+
"applies_to": ["color", "accessibility", "charts", "status", "forms", "data-visualization"],
|
|
98
|
+
"sources": ["https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html"]
|
|
99
|
+
}
|
|
100
|
+
]
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "d4d-framework",
|
|
4
|
+
"name": "Design for Delight (D4D)",
|
|
5
|
+
"category": "d4d",
|
|
6
|
+
"summary": "A customer empathy framework for validating product decisions through structured hypothesis testing.",
|
|
7
|
+
"description": "Design for Delight is a framework that starts with deep customer empathy, generates multiple solution options, narrows through evidence-based evaluation, and validates through scrappy experiments. It prevents teams from jumping to solutions before understanding the problem, and ensures hypotheses are testable and measurable. Every step produces an artifact that feeds the next step.",
|
|
8
|
+
"implications": [
|
|
9
|
+
"Always start with a Customer Problem Statement before proposing solutions",
|
|
10
|
+
"Frame problems from the customer's perspective using first-person voice",
|
|
11
|
+
"Generate 3-5 solution options before committing to one",
|
|
12
|
+
"Every hypothesis must include a measurable signal and target timeframe",
|
|
13
|
+
"LOFAs (Leap of Faith Assumptions) must be falsifiable and ordered by risk",
|
|
14
|
+
"Experiments should be the smallest possible test that produces learning"
|
|
15
|
+
],
|
|
16
|
+
"violations": [
|
|
17
|
+
"Jumping to a solution without articulating the customer problem",
|
|
18
|
+
"Only considering one solution option",
|
|
19
|
+
"Hypotheses without measurable success criteria or timeframes",
|
|
20
|
+
"LOFAs that aren't falsifiable ('Users will like it')",
|
|
21
|
+
"Running experiments without clear decision rules (advance vs pivot)"
|
|
22
|
+
],
|
|
23
|
+
"applies_to": ["product-strategy", "research", "validation", "prioritization", "experimentation"],
|
|
24
|
+
"sources": ["Internal framework"],
|
|
25
|
+
"templates": {
|
|
26
|
+
"customer_problem_statement": {
|
|
27
|
+
"format": "- I am [narrow description of the customer/persona]\n- I am trying to [desired outcome]\n- But [problem/barrier]\n- Because [root cause]\n- Which makes me feel [emotion]",
|
|
28
|
+
"guidance": [
|
|
29
|
+
"First person, customer voice",
|
|
30
|
+
"'I am' must be narrow — not 'a user' but a specific persona with context",
|
|
31
|
+
"The barrier should be observable, not assumed",
|
|
32
|
+
"Root cause should be specific enough to act on",
|
|
33
|
+
"Emotion reveals the true impact and urgency"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"ideal_state": {
|
|
37
|
+
"format": "In the ideal state, [customer/segment] can [job/outcome] so that [benefit/emotion/impact], measurable by [customer benefit metric / outcome metric].",
|
|
38
|
+
"guidance": [
|
|
39
|
+
"Describes the end state without prescribing a solution",
|
|
40
|
+
"Includes a measurable indicator of success",
|
|
41
|
+
"Focuses on customer benefit, not feature delivery"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
"hypothesis_statement": {
|
|
45
|
+
"format": "We believe that [solution/approach] for [customer/segment] will [customer benefit/outcome]. We'll know this is true when [signal/metric] moves to [target] by [timeframe].",
|
|
46
|
+
"guidance": [
|
|
47
|
+
"'Moves to [target] by [timeframe]' is mandatory — never leave it vague",
|
|
48
|
+
"The signal should be something you can actually measure",
|
|
49
|
+
"The timeframe forces urgency and prevents infinite experiments",
|
|
50
|
+
"If you can't fill in the target, you don't understand the problem well enough"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"lofa": {
|
|
54
|
+
"format": "Assumption: [Statement that must be true for the solution to work]\nRisk level: [High/Medium/Low]\nHow to test: [Cheapest way to validate or invalidate]\nFalsification criteria: [What would prove this wrong]",
|
|
55
|
+
"guidance": [
|
|
56
|
+
"2-4 assumptions, ordered by risk (highest first)",
|
|
57
|
+
"Each must be falsifiable",
|
|
58
|
+
"Test the riskiest assumption first",
|
|
59
|
+
"If the highest-risk LOFA fails, the solution fails — don't proceed"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"scrappy_experiment": {
|
|
63
|
+
"format": "Test: [smallest test to learn fast]\nOwners: [who]\nStart date: [when]\nDecision rule: [advance if X, pivot if Y]",
|
|
64
|
+
"guidance": [
|
|
65
|
+
"The test should take days, not weeks",
|
|
66
|
+
"Decision rules must be specific and agreed upon before starting",
|
|
67
|
+
"The experiment tests the riskiest LOFA, not the full solution",
|
|
68
|
+
"If the decision rule is met, advance to the next LOFA or build"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"operating_loop": {
|
|
72
|
+
"stages": [
|
|
73
|
+
{
|
|
74
|
+
"stage": "frame",
|
|
75
|
+
"name": "Frame",
|
|
76
|
+
"description": "Define the customer, problem, desired benefit, and constraints.",
|
|
77
|
+
"outputs": ["Customer Problem Statement", "Ideal State"]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"stage": "empathy",
|
|
81
|
+
"name": "Empathy",
|
|
82
|
+
"description": "Key observations about the customer. What have you seen? What are you assuming?",
|
|
83
|
+
"outputs": ["Observation list", "Assumption list"]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"stage": "broad",
|
|
87
|
+
"name": "Go Broad",
|
|
88
|
+
"description": "Generate 3-5 distinct solution options. Keep each to 1-2 lines. No evaluation yet.",
|
|
89
|
+
"outputs": ["3-5 solution options"]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"stage": "narrow",
|
|
93
|
+
"name": "Go Narrow",
|
|
94
|
+
"description": "Compare options on customer benefit and feasibility. Pick 1-2 to pursue.",
|
|
95
|
+
"outputs": ["Comparison matrix", "Selected option(s)"]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"stage": "experiment",
|
|
99
|
+
"name": "Experiment",
|
|
100
|
+
"description": "Write hypothesis, identify LOFAs, define signals, and design the smallest test.",
|
|
101
|
+
"outputs": ["Hypothesis Statement", "LOFAs", "Scrappy Experiment"]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"stage": "recommendation",
|
|
105
|
+
"name": "Recommendation",
|
|
106
|
+
"description": "Clear call: build, pivot, or kill. Include risks, dependencies, and now vs. later.",
|
|
107
|
+
"outputs": ["Recommendation", "Risk assessment", "Timeline"]
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
]
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "gestalt-proximity",
|
|
4
|
+
"name": "Proximity",
|
|
5
|
+
"category": "gestalt",
|
|
6
|
+
"summary": "Elements placed close together are perceived as a group.",
|
|
7
|
+
"description": "The most fundamental spatial grouping principle. Objects near each other are automatically perceived as related. The space between groups must be significantly larger than the space within groups for grouping to be clear. This applies to form layouts, navigation, card grids, and any multi-element composition.",
|
|
8
|
+
"implications": [
|
|
9
|
+
"Keep related form fields close together with more space between groups",
|
|
10
|
+
"Use consistent spacing within groups and larger gaps between groups",
|
|
11
|
+
"Place labels immediately adjacent to their corresponding inputs",
|
|
12
|
+
"Group navigation items by section with visual separators",
|
|
13
|
+
"Use spacing ratios (inner spacing = base, outer spacing = 2-3x base)"
|
|
14
|
+
],
|
|
15
|
+
"violations": [
|
|
16
|
+
"Labels equidistant between two inputs — ambiguous association",
|
|
17
|
+
"Uniform spacing throughout — no grouping communicated",
|
|
18
|
+
"Action buttons far from the content they affect"
|
|
19
|
+
],
|
|
20
|
+
"applies_to": ["layout", "forms", "spacing", "grouping", "navigation", "cards"],
|
|
21
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "gestalt-similarity",
|
|
25
|
+
"name": "Similarity",
|
|
26
|
+
"category": "gestalt",
|
|
27
|
+
"summary": "Elements that share visual characteristics (color, shape, size) are perceived as related.",
|
|
28
|
+
"description": "When elements look alike, we assume they serve the same function or belong to the same category. This principle is the foundation of consistent component design — all buttons, all cards, all links should share visual characteristics within their type. Breaking similarity intentionally draws attention to the different element (see Von Restorff Effect).",
|
|
29
|
+
"implications": [
|
|
30
|
+
"Style all elements of the same type consistently",
|
|
31
|
+
"Use color coding consistently to represent categories or states",
|
|
32
|
+
"Differentiate interactive from non-interactive elements clearly",
|
|
33
|
+
"Use consistent icon styles throughout the product",
|
|
34
|
+
"Break similarity intentionally for emphasis (highlighted CTA, featured plan)"
|
|
35
|
+
],
|
|
36
|
+
"violations": [
|
|
37
|
+
"Same color used for links and static text",
|
|
38
|
+
"Interactive elements that look like non-interactive ones",
|
|
39
|
+
"Inconsistent icon styles (some outlined, some filled) without meaning"
|
|
40
|
+
],
|
|
41
|
+
"applies_to": ["consistency", "color", "icons", "buttons", "visual-design", "cards"],
|
|
42
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "gestalt-closure",
|
|
46
|
+
"name": "Closure",
|
|
47
|
+
"category": "gestalt",
|
|
48
|
+
"summary": "The brain completes incomplete shapes, perceiving them as whole forms.",
|
|
49
|
+
"description": "People perceive incomplete shapes as complete when enough visual information is provided. In UI, this means you don't need to fully enclose every element — partial borders, implied containers, and cropped images all work because the brain fills in the gaps. This enables cleaner, less cluttered designs that still communicate structure.",
|
|
50
|
+
"implications": [
|
|
51
|
+
"Use partial borders or open containers for a lighter visual feel",
|
|
52
|
+
"Cropped images at screen edges suggest more content beyond the viewport",
|
|
53
|
+
"Horizontal scroll indicators can show partial next items to imply scrollability",
|
|
54
|
+
"Progress indicators work because the brain completes the circle/bar",
|
|
55
|
+
"Card carousels showing partial next card encourage swiping"
|
|
56
|
+
],
|
|
57
|
+
"violations": [
|
|
58
|
+
"Fully enclosed sections with heavy borders creating visual clutter",
|
|
59
|
+
"Cropped content that looks broken rather than intentionally suggesting more",
|
|
60
|
+
"Hidden scrollable content with no partial element visible to indicate scrollability"
|
|
61
|
+
],
|
|
62
|
+
"applies_to": ["layout", "cards", "carousel", "progress", "visual-design", "scroll"],
|
|
63
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "gestalt-continuity",
|
|
67
|
+
"name": "Continuity",
|
|
68
|
+
"category": "gestalt",
|
|
69
|
+
"summary": "The eye follows smooth lines and curves, preferring continuous paths over abrupt changes.",
|
|
70
|
+
"description": "Elements arranged along a line or curve are perceived as related and following a direction. The eye follows the smoothest path. In UI, this applies to reading patterns (F-pattern, Z-pattern), timeline designs, step progressions, and flow visualizations. Alignment creates continuity — misalignment breaks it and creates friction.",
|
|
71
|
+
"implications": [
|
|
72
|
+
"Align elements to create clear reading paths (left-aligned text, grid alignment)",
|
|
73
|
+
"Design timelines and step indicators as continuous flows",
|
|
74
|
+
"Use consistent alignment across pages to create predictable scan patterns",
|
|
75
|
+
"Guide the eye through intentional visual flow (size, color, position)",
|
|
76
|
+
"Ensure data visualizations follow smooth, readable paths"
|
|
77
|
+
],
|
|
78
|
+
"violations": [
|
|
79
|
+
"Misaligned elements that break the reading flow",
|
|
80
|
+
"Step indicators that jump between different visual positions",
|
|
81
|
+
"Inconsistent alignment across different sections"
|
|
82
|
+
],
|
|
83
|
+
"applies_to": ["alignment", "timelines", "reading-patterns", "visual-flow", "layout"],
|
|
84
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "gestalt-figure-ground",
|
|
88
|
+
"name": "Figure-Ground",
|
|
89
|
+
"category": "gestalt",
|
|
90
|
+
"summary": "The brain separates visual input into foreground (figure) and background (ground).",
|
|
91
|
+
"description": "Users instantly perceive which elements are the focus (figure) and which are the background (ground). Modals with overlays, cards on backgrounds, and highlighted elements all leverage figure-ground separation. Ambiguity in figure-ground creates confusion. Strong contrast between figure and ground creates clarity.",
|
|
92
|
+
"implications": [
|
|
93
|
+
"Use overlays/scrims behind modals to establish clear figure-ground",
|
|
94
|
+
"Elevate cards above the background with subtle shadows or border contrast",
|
|
95
|
+
"Use background color to push non-essential content to the 'ground'",
|
|
96
|
+
"Create depth hierarchy: background → surface → elevated → overlay",
|
|
97
|
+
"Ensure sufficient contrast between foreground content and background"
|
|
98
|
+
],
|
|
99
|
+
"violations": [
|
|
100
|
+
"Modal without overlay — unclear what's foreground vs background",
|
|
101
|
+
"Cards that don't visually separate from the page background",
|
|
102
|
+
"Elements with ambiguous depth — unclear if they're clickable or decorative",
|
|
103
|
+
"Text on patterned backgrounds with insufficient contrast"
|
|
104
|
+
],
|
|
105
|
+
"applies_to": ["modals", "cards", "elevation", "depth", "contrast", "overlays"],
|
|
106
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "gestalt-common-fate",
|
|
110
|
+
"name": "Common Fate",
|
|
111
|
+
"category": "gestalt",
|
|
112
|
+
"summary": "Elements moving in the same direction are perceived as a group.",
|
|
113
|
+
"description": "Motion creates grouping. When multiple elements animate or move together, they're perceived as a unit. In UI, this applies to drag-and-drop selections, coordinated animations, parallax scrolling layers, and accordion expansions. Elements that move differently from the group are perceived as separate or special.",
|
|
114
|
+
"implications": [
|
|
115
|
+
"Animate related elements together (multi-select drag, group transitions)",
|
|
116
|
+
"Use coordinated animations for elements that belong together",
|
|
117
|
+
"Different scroll speeds (parallax) create distinct visual layers",
|
|
118
|
+
"Accordion animations should move all child content together",
|
|
119
|
+
"Loading sequences can animate related elements simultaneously"
|
|
120
|
+
],
|
|
121
|
+
"violations": [
|
|
122
|
+
"Elements in the same group animating at different speeds or directions",
|
|
123
|
+
"Unrelated elements animating together, creating false grouping",
|
|
124
|
+
"Drag-and-drop where selected items don't move together"
|
|
125
|
+
],
|
|
126
|
+
"applies_to": ["animation", "motion", "drag-and-drop", "transitions", "grouping"],
|
|
127
|
+
"sources": ["https://www.interaction-design.org/literature/topics/gestalt-principles"]
|
|
128
|
+
}
|
|
129
|
+
]
|