Fix the following React Review diagnostics in my codebase.
## Errors (40)
1. [error] require-reduced-motion — skills/budge/budge/package.json:0
Project uses a motion library but has no prefers-reduced-motion handling — required for accessibility (WCAG 2.3.3)
2. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:342
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
3. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:351
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
4. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:352
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
5. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:353
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
6. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:354
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
7. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:355
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
8. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:356
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
9. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:357
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
10. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:358
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
11. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:359
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
12. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:360
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
13. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:363
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
14. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:364
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
15. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:365
React Hook "useState" is called conditionally. React Hooks must be called in the exact same order in every component render.
16. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:366
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
17. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:367
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
18. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:369
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
19. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:370
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
20. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:371
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
21. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:372
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
22. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:373
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
23. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:374
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
24. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:375
React Hook "useRef" is called conditionally. React Hooks must be called in the exact same order in every component render.
25. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:377
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
26. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:379
React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render.
27. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:394
React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render.
28. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:402
React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render.
29. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:415
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
30. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:420
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
31. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:453
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
32. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:460
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
33. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:473
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
34. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:507
React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render.
35. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:521
React Hook "useCallback" is called conditionally. React Hooks must be called in the exact same order in every component render.
36. [error] rules-of-hooks — skills/budge/website/app/__budge.tsx:533
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render.
37. [error] effect-needs-cleanup — skills/budge/website/components/budge-me-paper-preview.tsx:422
useEffect schedules `setTimeout(...)` but never returns a cleanup — leaks the registration on every re-run and on unmount. Return a cleanup function that calls clearTimeout(...)
38. [error] effect-needs-cleanup — skills/budge/website/components/budge-me-paper-preview.tsx:716
useEffect schedules `setTimeout(...)` but never returns a cleanup — leaks the registration on every re-run and on unmount. Return a cleanup function that calls clearTimeout(...)
39. [error] rules-of-hooks — skills/budge/website/public/budge.iife.js:82
React Hook "useEffect" is called in function "Anonymous" that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word "use".
40. [error] no-nested-component-definition — skills/budge/website/public/budge.iife.js:82
Component "C" defined inside "Zu" — creates new instance every render, destroying state
## Warnings (143)
41. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:240
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
42. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:241
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
43. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:242
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
44. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:243
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
45. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:244
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
46. [warning] js-batch-dom-css — skills/budge/budge/src/entry.tsx:245
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
47. [warning] js-flatmap-filter — skills/budge/budge/src/entry.tsx:429
.map().filter(Boolean) iterates twice — use .flatMap() to transform and filter in a single pass
48. [warning] async-defer-await — skills/budge/budge/src/entry.tsx:680
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
49. [warning] js-flatmap-filter — skills/budge/budge/src/budge.tsx:109
.map().filter(Boolean) iterates twice — use .flatMap() to transform and filter in a single pass
50. [warning] no-giant-component — skills/budge/budge/src/budge.tsx:446
Component "Budge" is 800 lines — consider breaking it into smaller focused components
51. [warning] prefer-useReducer — skills/budge/budge/src/budge.tsx:446
Component "Budge" has 19 useState calls — consider useReducer for related state
52. [warning] rerender-state-only-in-handlers — skills/budge/budge/src/budge.tsx:457
useState "showPrompt" is updated but never read in the component's return — use useRef so updates don't trigger re-renders
53. [warning] rerender-state-only-in-handlers — skills/budge/budge/src/budge.tsx:458
useState "pressedButton" is updated but never read in the component's return — use useRef so updates don't trigger re-renders
54. [warning] no-cascading-set-state — skills/budge/budge/src/budge.tsx:529
8 setState calls in a single useEffect — consider using useReducer or deriving state
55. [warning] no-cascading-set-state — skills/budge/budge/src/budge.tsx:870
27 setState calls in a single useEffect — consider using useReducer or deriving state
56. [warning] no-outline-none — skills/budge/budge/src/budge.tsx:1032
outline: none removes keyboard focus visibility — use :focus-visible styling instead, or provide a box-shadow focus ring
57. [warning] no-z-index-9999 — skills/budge/budge/src/budge.tsx:1032
z-index: 2147483646 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix
58. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1041
14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
59. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1064
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
60. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1089
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
61. [warning] no-inline-bounce-easing — skills/budge/budge/src/budge.tsx:1112
Bounce/elastic easing feels dated — real objects decelerate smoothly. Use ease-out or cubic-bezier(0.16, 1, 0.3, 1) instead
62. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1138
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
63. [warning] no-tiny-text — skills/budge/budge/src/budge.tsx:1155
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
64. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1161
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
65. [warning] no-tiny-text — skills/budge/budge/src/budge.tsx:1165
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
66. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1178
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
67. [warning] no-tiny-text — skills/budge/budge/src/budge.tsx:1195
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
68. [warning] no-inline-exhaustive-style — skills/budge/budge/src/budge.tsx:1201
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
69. [warning] no-tiny-text — skills/budge/budge/src/budge.tsx:1205
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
70. [warning] no-array-index-as-key — skills/budge/website/app/claude-spinner.tsx:42
Array index "index" used as key — causes bugs when list is reordered or filtered
71. [warning] nextjs-missing-metadata — skills/budge/website/app/building-the-preview/page.tsx:1
Page without metadata or generateMetadata export — hurts SEO
72. [warning] nextjs-no-a-element — skills/budge/website/app/building-the-preview/page.tsx:99
Use next/link instead of <a> for internal links — enables client-side navigation and prefetching
73. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:108
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
74. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:119
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
75. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:128
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
76. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:137
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
77. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:150
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
78. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:170
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
79. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:181
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
80. [warning] design-no-em-dash-in-jsx-text — skills/budge/website/app/building-the-preview/page.tsx:191
Em dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses
81. [warning] no-giant-component — skills/budge/website/app/__budge.tsx:339
Component "Budge" is 376 lines — consider breaking it into smaller focused components
82. [warning] prefer-useReducer — skills/budge/website/app/__budge.tsx:339
Component "Budge" has 11 useState calls — consider useReducer for related state
83. [warning] rerender-state-only-in-handlers — skills/budge/website/app/__budge.tsx:352
useState "targetEl" is updated but never read in the component's return — use useRef so updates don't trigger re-renders
84. [warning] rerender-state-only-in-handlers — skills/budge/website/app/__budge.tsx:354
useState "dismissed" is updated but never read in the component's return — use useRef so updates don't trigger re-renders
85. [warning] rendering-hydration-no-flicker — skills/budge/website/app/__budge.tsx:415
useEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning
86. [warning] no-cascading-set-state — skills/budge/website/app/__budge.tsx:420
5 setState calls in a single useEffect — consider using useReducer or deriving state
87. [warning] no-cascading-set-state — skills/budge/website/app/__budge.tsx:460
6 setState calls in a single useEffect — consider using useReducer or deriving state
88. [warning] no-cascading-set-state — skills/budge/website/app/__budge.tsx:473
3 setState calls in a single useEffect — consider using useReducer or deriving state
89. [warning] no-cascading-set-state — skills/budge/website/app/__budge.tsx:533
18 setState calls in a single useEffect — consider using useReducer or deriving state
90. [warning] no-cascading-set-state — skills/budge/website/app/__budge.tsx:759
3 setState calls in a single useEffect — consider using useReducer or deriving state
91. [warning] no-inline-exhaustive-style — skills/budge/website/app/__budge.tsx:1034
17 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
92. [warning] no-z-index-9999 — skills/budge/website/app/__budge.tsx:1040
z-index: 2147483647 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix
93. [warning] no-inline-exhaustive-style — skills/budge/website/app/__budge.tsx:1059
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
94. [warning] no-inline-exhaustive-style — skills/budge/website/app/__budge.tsx:1085
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
95. [warning] no-inline-bounce-easing — skills/budge/website/app/__budge.tsx:1107
Bounce/elastic easing feels dated — real objects decelerate smoothly. Use ease-out or cubic-bezier(0.16, 1, 0.3, 1) instead
96. [warning] no-inline-exhaustive-style — skills/budge/website/app/__budge.tsx:1132
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
97. [warning] no-tiny-text — skills/budge/website/app/__budge.tsx:1150
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
98. [warning] no-inline-exhaustive-style — skills/budge/website/app/__budge.tsx:1184
14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
99. [warning] no-z-index-9999 — skills/budge/website/app/__budge.tsx:1196
z-index: 2147483647 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix
100. [warning] use-lazy-motion — skills/budge/website/components/ui/accordion.tsx:5
Import "m" with LazyMotion instead of "motion" — saves ~30kb in bundle size
101. [warning] no-polymorphic-children — skills/budge/website/components/ui/accordion.tsx:113
Polymorphic `typeof children === "string"` check — expose explicit subcomponents (e.g. `<Button.Text>`) instead of branching on what the consumer passed
102. [warning] no-react19-deprecated-apis — skills/budge/website/components/ui/toggle-group.tsx:64
useContext is superseded by `use()` on React 19+ — `use()` reads context conditionally inside hooks, branches, and loops; switch to `import { use } from 'react'`
103. [warning] no-giant-component — skills/budge/website/app/terms/page.tsx:8
Component "TermsPage" is 350 lines — consider breaking it into smaller focused components
104. [warning] nextjs-missing-metadata — skills/budge/website/app/replay/page.tsx:1
Page without metadata or generateMetadata export — hurts SEO
105. [warning] react-compiler-destructure-method — skills/budge/website/app/replay/page.tsx:82
Destructure for clarity: `const { get } = useSearchParams()` then call `get(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
106. [warning] react-compiler-destructure-method — skills/budge/website/app/replay/page.tsx:83
Destructure for clarity: `const { get } = useSearchParams()` then call `get(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
107. [warning] nextjs-no-client-side-redirect — skills/budge/website/app/replay/page.tsx:87
router.replace() in useEffect — use redirect() from next/navigation or handle navigation in an event handler
108. [warning] react-compiler-destructure-method — skills/budge/website/app/replay/page.tsx:87
Destructure for clarity: `const { replace } = useRouter()` then call `replace(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on
109. [warning] click-events-have-key-events — skills/budge/website/components/budge-me-paper-preview.tsx:869
Enforce a clickable non-interactive element has at least one keyboard event listener.
110. [warning] no-static-element-interactions — skills/budge/website/components/budge-me-paper-preview.tsx:869
Static HTML elements with event handlers require a role.
111. [warning] js-tosorted-immutable — skills/budge/website/components/budge-me-paper-preview.tsx:67
[...array].sort() — use array.toSorted() for immutable sorting (ES2023)
112. [warning] no-giant-component — skills/budge/website/components/budge-me-paper-preview.tsx:370
Component "BudgeMePaperPreview" is 945 lines — consider breaking it into smaller focused components
113. [warning] prefer-useReducer — skills/budge/website/components/budge-me-paper-preview.tsx:370
Component "BudgeMePaperPreview" has 18 useState calls — consider useReducer for related state
114. [warning] no-cascading-set-state — skills/budge/website/components/budge-me-paper-preview.tsx:422
6 setState calls in a single useEffect — consider using useReducer or deriving state
115. [warning] js-tosorted-immutable — skills/budge/website/components/budge-me-paper-preview.tsx:531
[...array].sort() — use array.toSorted() for immutable sorting (ES2023)
116. [warning] no-cascading-set-state — skills/budge/website/components/budge-me-paper-preview.tsx:622
25 setState calls in a single useEffect — consider using useReducer or deriving state
117. [warning] no-cascading-set-state — skills/budge/website/components/budge-me-paper-preview.tsx:716
19 setState calls in a single useEffect — consider using useReducer or deriving state
118. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:743
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
119. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:746
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
120. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:772
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
121. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:791
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
122. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:766
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
123. [warning] async-defer-await — skills/budge/website/components/budge-me-paper-preview.tsx:785
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
124. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:827
9 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
125. [warning] no-layout-transition-inline — skills/budge/website/components/budge-me-paper-preview.tsx:914
Transitioning layout property "padding" causes layout thrash every frame — use transform and opacity instead
126. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:927
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
127. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:955
14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
128. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:978
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
129. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1003
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
130. [warning] no-inline-bounce-easing — skills/budge/website/components/budge-me-paper-preview.tsx:1026
Bounce/elastic easing feels dated — real objects decelerate smoothly. Use ease-out or cubic-bezier(0.16, 1, 0.3, 1) instead
131. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1052
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
132. [warning] no-tiny-text — skills/budge/website/components/budge-me-paper-preview.tsx:1069
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
133. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1075
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
134. [warning] no-tiny-text — skills/budge/website/components/budge-me-paper-preview.tsx:1079
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
135. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1092
8 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
136. [warning] no-tiny-text — skills/budge/website/components/budge-me-paper-preview.tsx:1109
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
137. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1115
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
138. [warning] no-tiny-text — skills/budge/website/components/budge-me-paper-preview.tsx:1119
Font size 11px is too small — body text should be at least 12px for readability, 16px is ideal
139. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1161
9 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
140. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1207
9 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
141. [warning] no-inline-exhaustive-style — skills/budge/website/components/budge-me-paper-preview.tsx:1257
13 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
142. [warning] no-autofocus — skills/budge/website/app/page.tsx:36
The `autoFocus` attribute is found here, which can cause usability issues for sighted and non-sighted users.
143. [warning] nextjs-missing-metadata — skills/budge/website/app/page.tsx:6
Page without metadata or generateMetadata export — hurts SEO
144. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:15
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
145. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:15
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
146. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:16
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
147. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:18
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
148. [warning] js-cache-property-access — skills/budge/website/public/budge.iife.js:18
t.memoizedProps.revealOrder is read 4 times inside this loop — hoist into a const at the top of the loop body
149. [warning] js-cache-property-access — skills/budge/website/public/budge.iife.js:19
n.style.display is read 3 times inside this loop — hoist into a const at the top of the loop body
150. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:22
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
151. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:25
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
152. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:25
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
153. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:25
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
154. [warning] js-combine-iterations — skills/budge/website/public/budge.iife.js:28
.map().filter() iterates the array twice — combine into a single loop with .reduce() or for...of
155. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:46
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
156. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:63
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
157. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:82
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
158. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:82
array.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups
159. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:82
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
160. [warning] js-hoist-intl — skills/budge/website/public/budge.iife.js:82
new Intl.Segmenter() inside a function — hoist to module scope or wrap in useMemo so it isn't recreated each call
161. [warning] js-flatmap-filter — skills/budge/website/public/budge.iife.js:82
.map().filter(Boolean) iterates twice — use .flatMap() to transform and filter in a single pass
162. [warning] js-set-map-lookups — skills/budge/website/public/budge.iife.js:83
array.indexOf() in a loop is O(n) per call — convert to a Set for O(1) lookups
163. [warning] js-flatmap-filter — skills/budge/website/public/budge.iife.js:84
.map().filter(Boolean) iterates twice — use .flatMap() to transform and filter in a single pass
164. [warning] async-defer-await — skills/budge/website/public/budge.iife.js:84
await blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast
165. [warning] click-events-have-key-events — skills/budge/website/components/replay/replay-viewer.tsx:1097
Enforce a clickable non-interactive element has at least one keyboard event listener.
166. [warning] no-static-element-interactions — skills/budge/website/components/replay/replay-viewer.tsx:1097
Static HTML elements with event handlers require a role.
167. [warning] use-lazy-motion — skills/budge/website/components/replay/replay-viewer.tsx:7
Import "m" with LazyMotion instead of "motion" — saves ~30kb in bundle size
168. [warning] no-giant-component — skills/budge/website/components/replay/replay-viewer.tsx:339
Component "ReplayViewer" is 1002 lines — consider breaking it into smaller focused components
169. [warning] prefer-useReducer — skills/budge/website/components/replay/replay-viewer.tsx:345
Component "ReplayViewer" has 5 useState calls — consider useReducer for related state
170. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:600
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
171. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:601
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
172. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:602
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
173. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:603
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
174. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:604
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
175. [warning] js-batch-dom-css — skills/budge/website/components/replay/replay-viewer.tsx:605
Multiple sequential element.style assignments — batch with cssText or classList for fewer reflows
176. [warning] design-no-three-period-ellipsis — skills/budge/website/components/replay/replay-viewer.tsx:1136
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
177. [warning] design-no-three-period-ellipsis — skills/budge/website/components/replay/replay-viewer.tsx:1155
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)
178. [warning] prefer-use-effect-event — skills/budge/website/components/budge-logo.tsx:85
"scheduleNext" is read only inside `setTimeout` — wrap it with useEffectEvent and remove it from the dep array so the effect doesn't re-synchronize on every parent render
179. [warning] no-cascading-set-state — skills/budge/website/components/budge-logo.tsx:62
8 setState calls in a single useEffect — consider using useReducer or deriving state
180. [warning] nextjs-missing-metadata — skills/grug/website/app/page.tsx:1
Page without metadata or generateMetadata export — hurts SEO
181. [warning] prefer-use-effect-event — skills/grug/website/components/grug-logo.tsx:49
"scheduleNext" is read only inside `setTimeout` — wrap it with useEffectEvent and remove it from the dep array so the effect doesn't re-synchronize on every parent render
182. [warning] no-cascading-set-state — skills/grug/website/components/grug-logo.tsx:29
6 setState calls in a single useEffect — consider using useReducer or deriving state
183. [warning] no-cascading-set-state — skills/grug/website/components/grug-demo.tsx:48
12 setState calls in a single useEffect — consider using useReducer or deriving state
Copy as prompt
❌ Errors (40)
React Hook "useEffect" is called conditionally. React Hooks must be called in the exact same order in every component render. · 36 in 2 files
rules-of-hooksskills/budge/website/app/__budge.tsxskills/budge/website/public/budge.iife.jsuseEffect schedules `setTimeout(...)` but never returns a cleanup — leaks the registration on every re-run and on unmount. Return a cleanup function that calls clearTimeout(...) · 2 in 1 file
effect-needs-cleanupskills/budge/website/components/budge-me-paper-preview.tsxProject uses a motion library but has no prefers-reduced-motion handling — required for accessibility (WCAG 2.3.3) · 1 in 1 file
require-reduced-motionskills/budge/budge/package.jsonComponent "C" defined inside "Zu" — creates new instance every render, destroying state · 1 in 1 file
no-nested-component-definitionskills/budge/website/public/budge.iife.js14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse · 24 in 3 files
no-inline-exhaustive-styleskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/budge/src/budge.tsxskills/budge/website/app/__budge.tsxarray.includes() in a loop is O(n) per call — convert to a Set for O(1) lookups · 14 in 1 file
js-set-map-lookupsskills/budge/website/public/budge.iife.js8 setState calls in a single useEffect — consider using useReducer or deriving state · 13 in 6 files
no-cascading-set-stateskills/budge/website/app/__budge.tsxskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/budge/src/budge.tsxskills/budge/website/components/budge-logo.tsxskills/grug/website/components/grug-logo.tsxMultiple sequential element.style assignments — batch with cssText or classList for fewer reflows · 12 in 2 files
js-batch-dom-cssskills/budge/budge/src/entry.tsxskills/budge/website/components/replay/replay-viewer.tsxFont size 11px is too small — body text should be at least 12px for readability, 16px is ideal · 9 in 3 files
no-tiny-textskills/budge/budge/src/budge.tsxskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/website/app/__budge.tsxawait blocks the function before an early-return that doesn't use the awaited value — move the await after the synchronous guard so the skip path stays fast · 8 in 3 files
async-defer-awaitskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/budge/src/entry.tsxskills/budge/website/public/budge.iife.jsEm dash (—) in JSX text reads as model output — replace with comma, colon, semicolon, or parentheses · 8 in 1 file
design-no-em-dash-in-jsx-textskills/budge/website/app/building-the-preview/page.tsxComponent "Budge" is 800 lines — consider breaking it into smaller focused components · 5 in 5 files
no-giant-componentskills/budge/budge/src/budge.tsxskills/budge/website/app/__budge.tsxskills/budge/website/app/terms/page.tsxskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/website/components/replay/replay-viewer.tsx.map().filter(Boolean) iterates twice — use .flatMap() to transform and filter in a single pass · 4 in 3 files
js-flatmap-filterskills/budge/website/public/budge.iife.jsskills/budge/budge/src/entry.tsxskills/budge/budge/src/budge.tsxComponent "Budge" has 19 useState calls — consider useReducer for related state · 4 in 4 files
prefer-useReducerskills/budge/budge/src/budge.tsxskills/budge/website/app/__budge.tsxskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/website/components/replay/replay-viewer.tsxuseState "showPrompt" is updated but never read in the component's return — use useRef so updates don't trigger re-renders · 4 in 2 files
rerender-state-only-in-handlersskills/budge/budge/src/budge.tsxskills/budge/website/app/__budge.tsxPage without metadata or generateMetadata export — hurts SEO · 4 in 4 files
nextjs-missing-metadataskills/budge/website/app/building-the-preview/page.tsxskills/budge/website/app/replay/page.tsxskills/budge/website/app/page.tsxskills/grug/website/app/page.tsxz-index: 2147483646 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix · 3 in 2 files
no-z-index-9999skills/budge/website/app/__budge.tsxskills/budge/budge/src/budge.tsxBounce/elastic easing feels dated — real objects decelerate smoothly. Use ease-out or cubic-bezier(0.16, 1, 0.3, 1) instead · 3 in 3 files
no-inline-bounce-easingskills/budge/budge/src/budge.tsxskills/budge/website/app/__budge.tsxskills/budge/website/components/budge-me-paper-preview.tsxDestructure for clarity: `const { get } = useSearchParams()` then call `get(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on · 3 in 1 file
react-compiler-destructure-methodskills/budge/website/app/replay/page.tsxImport "m" with LazyMotion instead of "motion" — saves ~30kb in bundle size · 2 in 2 files
use-lazy-motionskills/budge/website/components/ui/accordion.tsxskills/budge/website/components/replay/replay-viewer.tsxEnforce a clickable non-interactive element has at least one keyboard event listener. · 2 in 2 files
click-events-have-key-eventsskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/website/components/replay/replay-viewer.tsxStatic HTML elements with event handlers require a role. · 2 in 2 files
no-static-element-interactionsskills/budge/website/components/budge-me-paper-preview.tsxskills/budge/website/components/replay/replay-viewer.tsx[...array].sort() — use array.toSorted() for immutable sorting (ES2023) · 2 in 1 file
js-tosorted-immutableskills/budge/website/components/budge-me-paper-preview.tsxt.memoizedProps.revealOrder is read 4 times inside this loop — hoist into a const at the top of the loop body · 2 in 1 file
js-cache-property-accessskills/budge/website/public/budge.iife.jsThree-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`) · 2 in 1 file
design-no-three-period-ellipsisskills/budge/website/components/replay/replay-viewer.tsx"scheduleNext" is read only inside `setTimeout` — wrap it with useEffectEvent and remove it from the dep array so the effect doesn't re-synchronize on every parent render · 2 in 2 files
prefer-use-effect-eventskills/budge/website/components/budge-logo.tsxskills/grug/website/components/grug-logo.tsxoutline: none removes keyboard focus visibility — use :focus-visible styling instead, or provide a box-shadow focus ring · 1 in 1 file
no-outline-noneskills/budge/budge/src/budge.tsxArray index "index" used as key — causes bugs when list is reordered or filtered · 1 in 1 file
no-array-index-as-keyskills/budge/website/app/claude-spinner.tsxUse next/link instead of <a> for internal links — enables client-side navigation and prefetching · 1 in 1 file
nextjs-no-a-elementskills/budge/website/app/building-the-preview/page.tsxuseEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning · 1 in 1 file
rendering-hydration-no-flickerskills/budge/website/app/__budge.tsxPolymorphic `typeof children === "string"` check — expose explicit subcomponents (e.g. `<Button.Text>`) instead of branching on what the consumer passed · 1 in 1 file
no-polymorphic-childrenskills/budge/website/components/ui/accordion.tsxuseContext is superseded by `use()` on React 19+ — `use()` reads context conditionally inside hooks, branches, and loops; switch to `import { use } from 'react'` · 1 in 1 file
no-react19-deprecated-apisskills/budge/website/components/ui/toggle-group.tsxrouter.replace() in useEffect — use redirect() from next/navigation or handle navigation in an event handler · 1 in 1 file
nextjs-no-client-side-redirectskills/budge/website/app/replay/page.tsxTransitioning layout property "padding" causes layout thrash every frame — use transform and opacity instead · 1 in 1 file
no-layout-transition-inlineskills/budge/website/components/budge-me-paper-preview.tsxThe `autoFocus` attribute is found here, which can cause usability issues for sighted and non-sighted users. · 1 in 1 file
no-autofocusskills/budge/website/app/page.tsx.map().filter() iterates the array twice — combine into a single loop with .reduce() or for...of · 1 in 1 file
js-combine-iterationsskills/budge/website/public/budge.iife.jsnew Intl.Segmenter() inside a function — hoist to module scope or wrap in useMemo so it isn't recreated each call · 1 in 1 file
js-hoist-intlIssue body truncated. See the full report at react.review/dashboard.