niahere 0.2.61 → 0.2.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/defaults/memory-promoter.md +99 -0
  2. package/defaults/self/staging.md +48 -0
  3. package/package.json +7 -3
  4. package/skills/code-review/pr-review.md +14 -1
  5. package/skills/cro/page.md +22 -0
  6. package/skills/frontend-design/SKILL.md +7 -3
  7. package/skills/frontend-design/building.md +17 -2
  8. package/skills/qa/SKILL.md +108 -72
  9. package/skills/userinterface-wiki/AGENTS.md +3749 -0
  10. package/skills/userinterface-wiki/SKILL.md +253 -0
  11. package/skills/userinterface-wiki/metadata.json +26 -0
  12. package/skills/userinterface-wiki/rules/_sections.md +66 -0
  13. package/skills/userinterface-wiki/rules/_template.md +24 -0
  14. package/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
  15. package/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
  16. package/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
  17. package/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
  18. package/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
  19. package/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
  20. package/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
  21. package/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
  22. package/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
  23. package/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
  24. package/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
  25. package/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
  26. package/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
  27. package/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
  28. package/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
  29. package/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
  30. package/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
  31. package/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
  32. package/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
  33. package/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
  34. package/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
  35. package/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
  36. package/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
  37. package/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
  38. package/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
  39. package/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
  40. package/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
  41. package/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
  42. package/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
  43. package/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
  44. package/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
  45. package/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
  46. package/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
  47. package/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
  48. package/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
  49. package/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
  50. package/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
  51. package/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
  52. package/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
  53. package/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
  54. package/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
  55. package/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
  56. package/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
  57. package/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
  58. package/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
  59. package/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
  60. package/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
  61. package/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
  62. package/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
  63. package/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
  64. package/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
  65. package/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
  66. package/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
  67. package/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
  68. package/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
  69. package/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
  70. package/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
  71. package/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
  72. package/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
  73. package/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
  74. package/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
  75. package/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
  76. package/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
  77. package/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
  78. package/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
  79. package/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
  80. package/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
  81. package/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
  82. package/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
  83. package/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
  84. package/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
  85. package/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
  86. package/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
  87. package/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
  88. package/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
  89. package/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
  90. package/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
  91. package/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
  92. package/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
  93. package/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
  94. package/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
  95. package/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
  96. package/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
  97. package/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
  98. package/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
  99. package/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
  100. package/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
  101. package/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
  102. package/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
  103. package/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
  104. package/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
  105. package/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
  106. package/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
  107. package/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
  108. package/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
  109. package/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
  110. package/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
  111. package/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
  112. package/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
  113. package/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
  114. package/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
  115. package/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
  116. package/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
  117. package/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
  118. package/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
  119. package/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
  120. package/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
  121. package/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
  122. package/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
  123. package/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
  124. package/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
  125. package/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
  126. package/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
  127. package/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
  128. package/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
  129. package/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
  130. package/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
  131. package/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
  132. package/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
  133. package/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
  134. package/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
  135. package/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
  136. package/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
  137. package/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
  138. package/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
  139. package/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
  140. package/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
  141. package/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
  142. package/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
  143. package/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
  144. package/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
  145. package/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
  146. package/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
  147. package/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
  148. package/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
  149. package/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
  150. package/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
  151. package/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
  152. package/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
  153. package/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
  154. package/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
  155. package/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
  156. package/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
  157. package/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
  158. package/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
  159. package/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
  160. package/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
  161. package/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
  162. package/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
  163. package/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
  164. package/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
  165. package/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
  166. package/src/cli/index.ts +23 -73
  167. package/src/cli/job.ts +25 -92
  168. package/src/cli/status.ts +17 -9
  169. package/src/commands/init.ts +1 -0
  170. package/src/commands/validate.ts +12 -10
  171. package/src/core/agents.ts +6 -19
  172. package/src/core/consolidator.ts +97 -91
  173. package/src/core/daemon.ts +71 -43
  174. package/src/core/finalizer.ts +31 -3
  175. package/src/core/health.ts +5 -17
  176. package/src/core/runner.ts +8 -44
  177. package/src/core/scheduler.ts +12 -49
  178. package/src/core/skills.ts +4 -11
  179. package/src/core/summarizer.ts +7 -21
  180. package/src/db/connection.ts +0 -11
  181. package/src/db/models/job.ts +23 -22
  182. package/src/db/with-db.ts +11 -0
  183. package/src/mcp/server.ts +1 -1
  184. package/src/prompts/environment.md +44 -41
  185. package/src/utils/pid.ts +44 -0
  186. package/src/utils/schedule.ts +39 -0
@@ -0,0 +1,16 @@
1
+ ---
2
+ title: Use text-wrap pretty for Body Text
3
+ impact: MEDIUM
4
+ tags: type, text-wrap, orphans, pretty
5
+ ---
6
+
7
+ ## Use text-wrap pretty for Body Text
8
+
9
+ Use text-wrap: pretty for body text to reduce orphans. Use text-wrap: balance for headings.
10
+
11
+ **Correct:**
12
+
13
+ ```css
14
+ p { text-wrap: pretty; }
15
+ h1, h2, h3 { text-wrap: balance; }
16
+ ```
@@ -0,0 +1,25 @@
1
+ ---
2
+ title: Offset Underlines from Descenders
3
+ impact: MEDIUM
4
+ tags: type, underline, offset, decoration
5
+ ---
6
+
7
+ ## Offset Underlines from Descenders
8
+
9
+ Use text-underline-offset to push underlines below descenders so they look intentional.
10
+
11
+ **Incorrect (underline collides with descenders):**
12
+
13
+ ```css
14
+ a { text-decoration: underline; }
15
+ ```
16
+
17
+ **Correct (offset underline):**
18
+
19
+ ```css
20
+ a {
21
+ text-decoration: underline;
22
+ text-underline-offset: 3px;
23
+ text-decoration-skip-ink: auto;
24
+ }
25
+ ```
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: Use Continuous Weight Values with Variable Fonts
3
+ impact: LOW
4
+ tags: type, variable-font, weight
5
+ ---
6
+
7
+ ## Use Continuous Weight Values with Variable Fonts
8
+
9
+ Variable fonts accept any integer from 100-900, not just the standard stops at 400, 500, 600, 700.
10
+
11
+ **Incorrect (limited to standard stops):**
12
+
13
+ ```css
14
+ .medium { font-weight: 500; }
15
+ .semibold { font-weight: 600; }
16
+ ```
17
+
18
+ **Correct (precise weight control):**
19
+
20
+ ```css
21
+ .medium { font-weight: 450; }
22
+ .semibold { font-weight: 550; }
23
+ ```
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: Visual Polish Increases Perceived Usability
3
+ impact: MEDIUM
4
+ tags: ux, aesthetic, usability, polish
5
+ ---
6
+
7
+ ## Visual Polish Increases Perceived Usability
8
+
9
+ Users perceive aesthetically pleasing design as more usable. Small visual details compound into trust.
10
+
11
+ **Incorrect (unstyled, raw elements):**
12
+
13
+ ```css
14
+ .card {
15
+ border: 1px solid black;
16
+ padding: 10px;
17
+ }
18
+ ```
19
+
20
+ **Correct (considered visual treatment):**
21
+
22
+ ```css
23
+ .card {
24
+ padding: 16px;
25
+ background: var(--gray-2);
26
+ border: 1px solid var(--gray-a4);
27
+ border-radius: 12px;
28
+ box-shadow: var(--shadow-1);
29
+ }
30
+ ```
31
+
32
+ Reference: [Aesthetic-Usability Effect](https://lawsofux.com/aesthetic-usability-effect/)
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: Minimize Extraneous Cognitive Load
3
+ impact: HIGH
4
+ tags: ux, cognitive-load, simplicity, noise
5
+ ---
6
+
7
+ ## Minimize Extraneous Cognitive Load
8
+
9
+ Remove anything that doesn't help the user complete their task. Decoration, redundant labels, and unnecessary options all add load.
10
+
11
+ **Incorrect (extraneous elements):**
12
+
13
+ ```tsx
14
+ function DeleteDialog() {
15
+ return (
16
+ <dialog>
17
+ <Icon name="warning" size={64} />
18
+ <h2>Warning!</h2>
19
+ <p>Are you absolutely sure you want to delete?</p>
20
+ <p>This action is permanent and cannot be undone.</p>
21
+ <p>All associated data will be lost forever.</p>
22
+ <div>
23
+ <button>Cancel</button>
24
+ <button>Delete</button>
25
+ <button>Learn More</button>
26
+ </div>
27
+ </dialog>
28
+ );
29
+ }
30
+ ```
31
+
32
+ **Correct (essential information only):**
33
+
34
+ ```tsx
35
+ function DeleteDialog() {
36
+ return (
37
+ <dialog>
38
+ <h2>Delete this item?</h2>
39
+ <p>This can't be undone.</p>
40
+ <div>
41
+ <button>Cancel</button>
42
+ <button>Delete</button>
43
+ </div>
44
+ </dialog>
45
+ );
46
+ }
47
+ ```
48
+
49
+ Reference: [Cognitive Load](https://lawsofux.com/cognitive-load/)
@@ -0,0 +1,50 @@
1
+ ---
2
+ title: Use Boundaries to Group Related Content
3
+ impact: MEDIUM
4
+ tags: ux, common-region, boundaries, grouping
5
+ ---
6
+
7
+ ## Use Boundaries to Group Related Content
8
+
9
+ Elements sharing a clearly defined boundary are perceived as a group.
10
+
11
+ **Incorrect (flat list with no visual grouping):**
12
+
13
+ ```tsx
14
+ function Settings() {
15
+ return (
16
+ <div>
17
+ <Toggle label="Dark mode" />
18
+ <Toggle label="Notifications" />
19
+ <Input label="Email" />
20
+ <Input label="Password" />
21
+ </div>
22
+ );
23
+ }
24
+ ```
25
+
26
+ **Correct (bounded sections):**
27
+
28
+ ```tsx
29
+ function Settings() {
30
+ return (
31
+ <div>
32
+ <section className={styles.group}>
33
+ <h3>Appearance</h3>
34
+ <Toggle label="Dark mode" />
35
+ </section>
36
+ <section className={styles.group}>
37
+ <h3>Notifications</h3>
38
+ <Toggle label="Notifications" />
39
+ </section>
40
+ <section className={styles.group}>
41
+ <h3>Account</h3>
42
+ <Input label="Email" />
43
+ <Input label="Password" />
44
+ </section>
45
+ </div>
46
+ );
47
+ }
48
+ ```
49
+
50
+ Reference: [Law of Common Region](https://lawsofux.com/law-of-common-region/)
@@ -0,0 +1,29 @@
1
+ ---
2
+ title: Fake Speed When Actual Speed Isn't Possible
3
+ impact: HIGH
4
+ tags: ux, doherty, perceived-speed, skeleton
5
+ ---
6
+
7
+ ## Fake Speed When Actual Speed Isn't Possible
8
+
9
+ If you can't make something fast, make it feel fast with optimistic UI, skeletons, or progress indicators.
10
+
11
+ **Incorrect (blank screen during load):**
12
+
13
+ ```tsx
14
+ function Page() {
15
+ const { data, isLoading } = useFetch("/api/data");
16
+ if (isLoading) return null;
17
+ return <Content data={data} />;
18
+ }
19
+ ```
20
+
21
+ **Correct (skeleton during load):**
22
+
23
+ ```tsx
24
+ function Page() {
25
+ const { data, isLoading } = useFetch("/api/data");
26
+ if (isLoading) return <Skeleton />;
27
+ return <Content data={data} />;
28
+ }
29
+ ```
@@ -0,0 +1,30 @@
1
+ ---
2
+ title: Respond Within 400ms
3
+ impact: CRITICAL
4
+ tags: ux, doherty, latency, response-time
5
+ ---
6
+
7
+ ## Respond Within 400ms
8
+
9
+ Interactions must respond within 400ms to feel instant. Above this threshold, users notice delay.
10
+
11
+ **Incorrect (no feedback during loading):**
12
+
13
+ ```tsx
14
+ async function handleClick() {
15
+ const data = await fetchData();
16
+ setResult(data);
17
+ }
18
+ ```
19
+
20
+ **Correct (immediate optimistic feedback):**
21
+
22
+ ```tsx
23
+ async function handleClick() {
24
+ setResult(optimisticData);
25
+ const data = await fetchData();
26
+ setResult(data);
27
+ }
28
+ ```
29
+
30
+ Reference: Doherty, W. J. (1979). Managing VM/CMS systems for user effectiveness.
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: Expand Hit Areas with Invisible Padding
3
+ impact: HIGH
4
+ tags: ux, fitts, hit-area, pseudo
5
+ ---
6
+
7
+ ## Expand Hit Areas with Invisible Padding
8
+
9
+ Use pseudo-elements or invisible padding to expand clickable areas beyond visible bounds.
10
+
11
+ **Incorrect (visible size equals hit area):**
12
+
13
+ ```css
14
+ .link {
15
+ font-size: 14px;
16
+ /* Hit area matches text only */
17
+ }
18
+ ```
19
+
20
+ **Correct (expanded invisible hit area):**
21
+
22
+ ```css
23
+ .link {
24
+ position: relative;
25
+ }
26
+
27
+ .link::before {
28
+ content: "";
29
+ position: absolute;
30
+ inset: -8px -12px;
31
+ }
32
+ ```
@@ -0,0 +1,31 @@
1
+ ---
2
+ title: Size Interactive Targets for Easy Clicking
3
+ impact: HIGH
4
+ tags: ux, fitts, target-size
5
+ ---
6
+
7
+ ## Size Interactive Targets for Easy Clicking
8
+
9
+ The bigger something is, the easier it is to click. Make interactive elements large enough to hit comfortably.
10
+
11
+ **Incorrect (tiny click target):**
12
+
13
+ ```css
14
+ .icon-button {
15
+ width: 16px;
16
+ height: 16px;
17
+ padding: 0;
18
+ }
19
+ ```
20
+
21
+ **Correct (comfortable target):**
22
+
23
+ ```css
24
+ .icon-button {
25
+ width: 32px;
26
+ height: 32px;
27
+ padding: 8px;
28
+ }
29
+ ```
30
+
31
+ Reference: Fitts, P. M. (1954). The information capacity of the human motor system.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Show Progress Toward Completion
3
+ impact: HIGH
4
+ tags: ux, goal-gradient, progress, motivation
5
+ ---
6
+
7
+ ## Show Progress Toward Completion
8
+
9
+ People accelerate behavior as they approach a goal. Show how close they are to finishing.
10
+
11
+ **Incorrect (no sense of progress):**
12
+
13
+ ```tsx
14
+ function Onboarding({ step }) {
15
+ return <OnboardingStep step={step} />;
16
+ }
17
+ ```
18
+
19
+ **Correct (progress visible):**
20
+
21
+ ```tsx
22
+ function Onboarding({ step, totalSteps }) {
23
+ return (
24
+ <div>
25
+ <ProgressBar value={step} max={totalSteps} />
26
+ <span>Step {step} of {totalSteps}</span>
27
+ <OnboardingStep step={step} />
28
+ </div>
29
+ );
30
+ }
31
+ ```
32
+
33
+ Reference: [Goal-Gradient Effect](https://lawsofux.com/goal-gradient-effect/)
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: Minimize Choices to Reduce Decision Time
3
+ impact: HIGH
4
+ tags: ux, hicks, choices, cognitive-load
5
+ ---
6
+
7
+ ## Minimize Choices to Reduce Decision Time
8
+
9
+ Decision time increases logarithmically with the number of choices. Use progressive disclosure.
10
+
11
+ **Incorrect (all options at once):**
12
+
13
+ ```tsx
14
+ function Settings() {
15
+ return (
16
+ <div>
17
+ {allSettings.map(setting => (
18
+ <SettingRow key={setting.id} {...setting} />
19
+ ))}
20
+ </div>
21
+ );
22
+ }
23
+ ```
24
+
25
+ **Correct (progressive disclosure):**
26
+
27
+ ```tsx
28
+ function Settings() {
29
+ return (
30
+ <div>
31
+ {commonSettings.map(setting => (
32
+ <SettingRow key={setting.id} {...setting} />
33
+ ))}
34
+ <details>
35
+ <summary>Advanced</summary>
36
+ {advancedSettings.map(setting => (
37
+ <SettingRow key={setting.id} {...setting} />
38
+ ))}
39
+ </details>
40
+ </div>
41
+ );
42
+ }
43
+ ```
44
+
45
+ Reference: Hick, W. E. (1952). On the rate of gain of information.
@@ -0,0 +1,37 @@
1
+ ---
2
+ title: Use Familiar UI Patterns
3
+ impact: HIGH
4
+ tags: ux, jakobs, familiarity, patterns
5
+ ---
6
+
7
+ ## Use Familiar UI Patterns
8
+
9
+ Users spend most of their time on other sites. They expect yours to work the same way (Jakob's Law).
10
+
11
+ **Incorrect (custom unconventional navigation):**
12
+
13
+ ```tsx
14
+ function Nav() {
15
+ return (
16
+ <nav>
17
+ <button onClick={() => navigate("/")}>⬡</button>
18
+ <button onClick={() => navigate("/search")}>⬢</button>
19
+ </nav>
20
+ );
21
+ }
22
+ ```
23
+
24
+ **Correct (standard recognizable patterns):**
25
+
26
+ ```tsx
27
+ function Nav() {
28
+ return (
29
+ <nav>
30
+ <Link href="/">Home</Link>
31
+ <Link href="/search">Search</Link>
32
+ </nav>
33
+ );
34
+ }
35
+ ```
36
+
37
+ Reference: [Jakob's Law](https://lawsofux.com/jakobs-law/)
@@ -0,0 +1,23 @@
1
+ ---
2
+ title: Chunk Data into Groups of 5-9
3
+ impact: HIGH
4
+ tags: ux, millers, chunking, memory
5
+ ---
6
+
7
+ ## Chunk Data into Groups of 5-9
8
+
9
+ Working memory holds about 7 items. Group and chunk large data sets so they're scannable.
10
+
11
+ **Incorrect (raw unformatted data):**
12
+
13
+ ```tsx
14
+ <span>4532015112830366</span>
15
+ ```
16
+
17
+ **Correct (chunked for readability):**
18
+
19
+ ```tsx
20
+ <span>4532 0151 1283 0366</span>
21
+ ```
22
+
23
+ Reference: Miller, G. A. (1956). The magical number seven, plus or minus two.
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: Prioritize the Critical 20% of Features
3
+ impact: MEDIUM
4
+ tags: ux, pareto, prioritization, features
5
+ ---
6
+
7
+ ## Prioritize the Critical 20% of Features
8
+
9
+ 80% of users use 20% of features (Pareto Principle). Optimize the critical path first.
10
+
11
+ **Incorrect (all features equally prominent):**
12
+
13
+ ```tsx
14
+ function Toolbar() {
15
+ return (
16
+ <div>
17
+ {allFeatures.map(f => <Button key={f.id}>{f.label}</Button>)}
18
+ </div>
19
+ );
20
+ }
21
+ ```
22
+
23
+ **Correct (critical features prominent, rest accessible):**
24
+
25
+ ```tsx
26
+ function Toolbar() {
27
+ return (
28
+ <div>
29
+ {criticalFeatures.map(f => <Button key={f.id}>{f.label}</Button>)}
30
+ <MoreMenu features={secondaryFeatures} />
31
+ </div>
32
+ );
33
+ }
34
+ ```
35
+
36
+ Reference: [Pareto Principle](https://lawsofux.com/pareto-principle/)
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: End Experiences with Clear Success States
3
+ impact: MEDIUM
4
+ tags: ux, peak-end, success, completion
5
+ ---
6
+
7
+ ## End Experiences with Clear Success States
8
+
9
+ People judge experiences by their peak moment and their end. Invest in success and completion states.
10
+
11
+ **Incorrect (abrupt end after action):**
12
+
13
+ ```tsx
14
+ async function handleSubmit() {
15
+ await submitForm(data);
16
+ router.push("/");
17
+ }
18
+ ```
19
+
20
+ **Correct (satisfying completion state):**
21
+
22
+ ```tsx
23
+ async function handleSubmit() {
24
+ await submitForm(data);
25
+ setStatus("success");
26
+ }
27
+
28
+ return status === "success" ? (
29
+ <SuccessScreen message="You're all set." />
30
+ ) : (
31
+ <Form onSubmit={handleSubmit} />
32
+ );
33
+ ```
34
+
35
+ Reference: [Peak-End Rule](https://lawsofux.com/peak-end-rule/)
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: Accept Messy Input, Output Clean Data
3
+ impact: MEDIUM
4
+ tags: ux, postels, input, validation
5
+ ---
6
+
7
+ ## Accept Messy Input, Output Clean Data
8
+
9
+ Inputs should accept messy human data and normalize it. Validate generously, format strictly.
10
+
11
+ **Incorrect (rigid format required):**
12
+
13
+ ```tsx
14
+ function DateInput({ onChange }) {
15
+ return (
16
+ <input
17
+ type="text"
18
+ placeholder="YYYY-MM-DD"
19
+ pattern="\d{4}-\d{2}-\d{2}"
20
+ onChange={onChange}
21
+ />
22
+ );
23
+ }
24
+ ```
25
+
26
+ **Correct (accepts multiple formats):**
27
+
28
+ ```tsx
29
+ function DateInput({ onChange }) {
30
+ function handleChange(e) {
31
+ const parsed = parseFlexibleDate(e.target.value);
32
+ if (parsed) onChange(parsed);
33
+ }
34
+
35
+ return (
36
+ <input
37
+ type="text"
38
+ placeholder="Any date format"
39
+ onChange={handleChange}
40
+ />
41
+ );
42
+ }
43
+ ```
44
+
45
+ Reference: Postel, J. (1980). RFC 761 — Transmission Control Protocol.
@@ -0,0 +1,33 @@
1
+ ---
2
+ title: Simplify Complex Visuals into Clear Forms
3
+ impact: MEDIUM
4
+ tags: ux, pragnanz, simplicity, clarity
5
+ ---
6
+
7
+ ## Simplify Complex Visuals into Clear Forms
8
+
9
+ People interpret complex visuals as the simplest form possible. Reduce visual noise to aid comprehension.
10
+
11
+ **Incorrect (visually noisy layout):**
12
+
13
+ ```css
14
+ .card {
15
+ border: 2px dashed red;
16
+ background: linear-gradient(45deg, #f0f, #0ff);
17
+ box-shadow: 5px 5px 0 black, 10px 10px 0 gray;
18
+ outline: 3px dotted blue;
19
+ }
20
+ ```
21
+
22
+ **Correct (clear, simple form):**
23
+
24
+ ```css
25
+ .card {
26
+ background: var(--gray-2);
27
+ border: 1px solid var(--gray-a4);
28
+ border-radius: 12px;
29
+ box-shadow: var(--shadow-1);
30
+ }
31
+ ```
32
+
33
+ Reference: [Law of Prägnanz](https://lawsofux.com/law-of-pragnanz/)
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Show What Matters Now, Reveal Complexity Later
3
+ impact: HIGH
4
+ tags: ux, progressive-disclosure, complexity
5
+ ---
6
+
7
+ ## Show What Matters Now, Reveal Complexity Later
8
+
9
+ Don't overwhelm users with everything at once. Reveal complexity incrementally as needed.
10
+
11
+ **Incorrect (all controls visible):**
12
+
13
+ ```tsx
14
+ function Editor() {
15
+ return (
16
+ <div>
17
+ <BasicTools />
18
+ <AdvancedTools />
19
+ <ExpertTools />
20
+ <DebugTools />
21
+ </div>
22
+ );
23
+ }
24
+ ```
25
+
26
+ **Correct (progressive disclosure):**
27
+
28
+ ```tsx
29
+ function Editor() {
30
+ const [showAdvanced, setShowAdvanced] = useState(false);
31
+ return (
32
+ <div>
33
+ <BasicTools />
34
+ {showAdvanced && <AdvancedTools />}
35
+ <button onClick={() => setShowAdvanced(!showAdvanced)}>
36
+ Toggle
37
+ </button>
38
+ </div>
39
+ );
40
+ }
41
+ ```