aidenybai / aidenybai/stickies

React Review Audit

Abierto
#1 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
TypeScript
Estrellas
3
Forks
0
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

**Score: 86/100** · 1 error · 95 warnings

Copy as prompt

```text
Fix the following React Review diagnostics in my codebase.

## Errors (1)

1. [error] require-reduced-motion — kitchen-sink/package.json:0
Project uses a motion library but has no prefers-reduced-motion handling — required for accessibility (WCAG 2.3.3)

## Warnings (95)

2. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-infinite-scroll.tsx:53
A form label must be associated with a control.

3. [warning] no-derived-state-effect — kitchen-sink/src/demos/demo-infinite-scroll.tsx:23
Derived state in useEffect — wrap the calculation in useMemo([deps]) (or compute it directly during render if it isn't expensive)

4. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-infinite-scroll.tsx:52
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

5. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-infinite-scroll.tsx:79
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

6. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-infinite-scroll.tsx:96
14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

7. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:80
A form label must be associated with a control.

8. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:89
A form label must be associated with a control.

9. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:99
A form label must be associated with a control.

10. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:79
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

11. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:144
10 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

12. [warning] no-layout-transition-inline — kitchen-sink/src/demos/demo-flexbox-masonry.tsx:154
Transitioning layout property "height" causes layout thrash every frame — use transform and opacity instead

13. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-grid-shuffle.tsx:150
A form label must be associated with a control.

14. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-grid-shuffle.tsx:159
A form label must be associated with a control.

15. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-grid-shuffle.tsx:169
A form label must be associated with a control.

16. [warning] prefer-useReducer — kitchen-sink/src/demos/demo-grid-shuffle.tsx:117
Component "DemoGridShuffle" has 5 useState calls — consider useReducer for related state

17. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-grid-shuffle.tsx:149
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

18. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-horizontal-carousel.tsx:35
A form label must be associated with a control.

19. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-horizontal-carousel.tsx:44
A form label must be associated with a control.

20. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-horizontal-carousel.tsx:34
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

21. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-horizontal-carousel.tsx:90
11 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

22. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-fade-gallery.tsx:43
A form label must be associated with a control.

23. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-fade-gallery.tsx:52
A form label must be associated with a control.

24. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-fade-gallery.tsx:42
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

25. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-fade-gallery.tsx:97
13 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

26. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-framer-cards.tsx:27
A form label must be associated with a control.

27. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-framer-cards.tsx:36
A form label must be associated with a control.

28. [warning] use-lazy-motion — kitchen-sink/src/demos/demo-framer-cards.tsx:2
Import "m" with LazyMotion instead of "motion" — saves ~30kb in bundle size

29. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-framer-cards.tsx:26
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

30. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-framer-cards.tsx:82
11 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

31. [warning] no-pure-black-background — kitchen-sink/src/index.tsx:169
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

32. [warning] no-pure-black-background — kitchen-sink/src/index.tsx:170
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

33. [warning] design-no-bold-heading — kitchen-sink/src/index.tsx:171
font-bold on

crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

34. [warning] js-combine-iterations — kitchen-sink/src/index.tsx:180
.filter().map() iterates the array twice — combine into a single loop with .reduce() or for...of

35. [warning] no-pure-black-background — kitchen-sink/src/index.tsx:356
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

36. [warning] no-pure-black-background — kitchen-sink/src/index.tsx:363
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

37. [warning] design-no-redundant-padding-axes — kitchen-sink/src/index.tsx:363
px-6 py-6 → use the shorthand p-6

38. [warning] design-no-bold-heading — kitchen-sink/src/index.tsx:364
font-bold on

crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

39. [warning] design-no-three-period-ellipsis — kitchen-sink/src/index.tsx:367
Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)

40. [warning] no-cascading-set-state — kitchen-sink/src/demos/demo-floating-selection.tsx:18
4 setState calls in a single useEffect — consider using useReducer or deriving state

41. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-floating-selection.tsx:58
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

42. [warning] no-z-index-9999 — kitchen-sink/src/demos/demo-floating-selection.tsx:104
z-index: 1000 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix

43. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-floating-selection.tsx:92
12 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

44. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:82
A form label must be associated with a control.

45. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:91
A form label must be associated with a control.

46. [warning] no-static-element-interactions — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:111
Static HTML elements with event handlers require a role.

47. [warning] no-static-element-interactions — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:130
Static HTML elements with event handlers require a role.

48. [warning] prefer-useReducer — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:20
Component "DemoDragSnapGrid" has 5 useState calls — consider useReducer for related state

49. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:81
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

50. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-drag-snap-grid.tsx:134
17 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

51. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-container-query.tsx:62
A form label must be associated with a control.

52. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-container-query.tsx:71
A form label must be associated with a control.

53. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-container-query.tsx:61
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

54. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-stacked-layers.tsx:49
A form label must be associated with a control.

55. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-stacked-layers.tsx:58
A form label must be associated with a control.

56. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-stacked-layers.tsx:68
A form label must be associated with a control.

57. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-stacked-layers.tsx:48
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

58. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-stacked-layers.tsx:98
16 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

59. [warning] click-events-have-key-events — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:106
Enforce a clickable non-interactive element has at least one keyboard event listener.

60. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:60
A form label must be associated with a control.

61. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:69
A form label must be associated with a control.

62. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:79
A form label must be associated with a control.

63. [warning] no-static-element-interactions — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:106
Static HTML elements with event handlers require a role.

64. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:59
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

65. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:128
12 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

66. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-3d-flip-cards.tsx:146
13 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

67. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:48
A form label must be associated with a control.

68. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:57
A form label must be associated with a control.

69. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:67
A form label must be associated with a control.

70. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:47
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

71. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:99
12 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

72. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:50
A form label must be associated with a control.

73. [warning] client-passive-event-listeners — kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:34
"scroll" listener without { passive: true } — blocks scrolling performance. Only add { passive: true } if the handler does NOT call event.preventDefault() (passive listeners silently ignore preventDefault())

74. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:49
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

75. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:77
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

76. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:89
12 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

77. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-picture-in-picture.tsx:52
A form label must be associated with a control.

78. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-picture-in-picture.tsx:51
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

79. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-picture-in-picture.tsx:79
11 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

80. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-picture-in-picture.tsx:108
17 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

81. [warning] click-events-have-key-events — kitchen-sink/src/demos/demo-portal-modals.tsx:17
Enforce a clickable non-interactive element has at least one keyboard event listener.

82. [warning] click-events-have-key-events — kitchen-sink/src/demos/demo-portal-modals.tsx:24
Enforce a clickable non-interactive element has at least one keyboard event listener.

83. [warning] no-static-element-interactions — kitchen-sink/src/demos/demo-portal-modals.tsx:17
Static HTML elements with event handlers require a role.

84. [warning] no-static-element-interactions — kitchen-sink/src/demos/demo-portal-modals.tsx:24
Static HTML elements with event handlers require a role.

85. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-portal-modals.tsx:83
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

86. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-nested-scrollers.tsx:32
A form label must be associated with a control.

87. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-nested-scrollers.tsx:41
A form label must be associated with a control.

88. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-nested-scrollers.tsx:50
A form label must be associated with a control.

89. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-nested-scrollers.tsx:31
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

90. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-nested-scrollers.tsx:77
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

91. [warning] no-array-index-as-key — kitchen-sink/src/demos/demo-nested-scrollers.tsx:86
Array index "index" used as key — causes bugs when list is reordered or filtered

92. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-masked-carousel.tsx:44
A form label must be associated with a control.

93. [warning] label-has-associated-control — kitchen-sink/src/demos/demo-masked-carousel.tsx:53
A form label must be associated with a control.

94. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-masked-carousel.tsx:43
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

95. [warning] no-pure-black-background — kitchen-sink/src/demos/demo-masked-carousel.tsx:79
Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

96. [warning] no-inline-exhaustive-style — kitchen-sink/src/demos/demo-masked-carousel.tsx:97
9 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse
```

---

### ❌ Errors (1)

**`require-reduced-motion`**

Project uses a motion library but has no prefers-reduced-motion handling — required for accessibility (WCAG 2.3.3)

> Add `useReducedMotion()` from your animation library, or a `@media (prefers-reduced-motion: reduce)` CSS query

[`kitchen-sink/package.json:0`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/package.json#L0)

---

### ⚠️ Warnings (95)

**`label-has-associated-control`**

A form label must be associated with a control.

> Either give the label a `htmlFor` attribute with the id of the associated control, or wrap the label around the control.

[`kitchen-sink/src/demos/demo-infinite-scroll.tsx:53`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-infinite-scroll.tsx#L53)
[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:80`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L80)
[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:89`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L89)
[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:99`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L99)
[`kitchen-sink/src/demos/demo-grid-shuffle.tsx:150`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-grid-shuffle.tsx#L150)
[`kitchen-sink/src/demos/demo-grid-shuffle.tsx:159`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-grid-shuffle.tsx#L159)
[`kitchen-sink/src/demos/demo-grid-shuffle.tsx:169`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-grid-shuffle.tsx#L169)
[`kitchen-sink/src/demos/demo-horizontal-carousel.tsx:35`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-horizontal-carousel.tsx#L35)
[`kitchen-sink/src/demos/demo-horizontal-carousel.tsx:44`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-horizontal-carousel.tsx#L44)
[`kitchen-sink/src/demos/demo-fade-gallery.tsx:43`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-fade-gallery.tsx#L43)
[`kitchen-sink/src/demos/demo-fade-gallery.tsx:52`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-fade-gallery.tsx#L52)
[`kitchen-sink/src/demos/demo-framer-cards.tsx:27`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-framer-cards.tsx#L27)
[`kitchen-sink/src/demos/demo-framer-cards.tsx:36`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-framer-cards.tsx#L36)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:82`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L82)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:91`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L91)
[`kitchen-sink/src/demos/demo-container-query.tsx:62`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-container-query.tsx#L62)
[`kitchen-sink/src/demos/demo-container-query.tsx:71`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-container-query.tsx#L71)
[`kitchen-sink/src/demos/demo-stacked-layers.tsx:49`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-stacked-layers.tsx#L49)
[`kitchen-sink/src/demos/demo-stacked-layers.tsx:58`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-stacked-layers.tsx#L58)
[`kitchen-sink/src/demos/demo-stacked-layers.tsx:68`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-stacked-layers.tsx#L68)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:60`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L60)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:69`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L69)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:79`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L79)
[`kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:48`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx#L48)
[`kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:57`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx#L57)
[`kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:67`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx#L67)
[`kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:50`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scroll-snap-pager.tsx#L50)
[`kitchen-sink/src/demos/demo-picture-in-picture.tsx:52`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-picture-in-picture.tsx#L52)
[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:32`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L32)
[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:41`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L41)
[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:50`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L50)
[`kitchen-sink/src/demos/demo-masked-carousel.tsx:44`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-masked-carousel.tsx#L44)
[`kitchen-sink/src/demos/demo-masked-carousel.tsx:53`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-masked-carousel.tsx#L53)

**`no-pure-black-background`**

Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

> Tint the background slightly toward your brand hue — e.g. `#0a0a0f` or Tailwind's `bg-gray-950`. Pure black looks harsh on modern displays

[`kitchen-sink/src/demos/demo-infinite-scroll.tsx:52`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-infinite-scroll.tsx#L52)
[`kitchen-sink/src/demos/demo-infinite-scroll.tsx:79`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-infinite-scroll.tsx#L79)
[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:79`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L79)
[`kitchen-sink/src/demos/demo-grid-shuffle.tsx:149`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-grid-shuffle.tsx#L149)
[`kitchen-sink/src/demos/demo-horizontal-carousel.tsx:34`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-horizontal-carousel.tsx#L34)
[`kitchen-sink/src/demos/demo-fade-gallery.tsx:42`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-fade-gallery.tsx#L42)
[`kitchen-sink/src/demos/demo-framer-cards.tsx:26`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-framer-cards.tsx#L26)
[`kitchen-sink/src/index.tsx:169`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L169)
[`kitchen-sink/src/index.tsx:170`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L170)
[`kitchen-sink/src/index.tsx:356`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L356)
[`kitchen-sink/src/index.tsx:363`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L363)
[`kitchen-sink/src/demos/demo-floating-selection.tsx:58`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-floating-selection.tsx#L58)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:81`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L81)
[`kitchen-sink/src/demos/demo-container-query.tsx:61`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-container-query.tsx#L61)
[`kitchen-sink/src/demos/demo-stacked-layers.tsx:48`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-stacked-layers.tsx#L48)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:59`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L59)
[`kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:47`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx#L47)
[`kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:49`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scroll-snap-pager.tsx#L49)
[`kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:77`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scroll-snap-pager.tsx#L77)
[`kitchen-sink/src/demos/demo-picture-in-picture.tsx:51`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-picture-in-picture.tsx#L51)
[`kitchen-sink/src/demos/demo-portal-modals.tsx:83`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-portal-modals.tsx#L83)
[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:31`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L31)
[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:77`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L77)
[`kitchen-sink/src/demos/demo-masked-carousel.tsx:43`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-masked-carousel.tsx#L43)
[`kitchen-sink/src/demos/demo-masked-carousel.tsx:79`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-masked-carousel.tsx#L79)

**`no-inline-exhaustive-style`**

14 inline style properties — extract to a CSS class, CSS module, or styled component for maintainability and reuse

> Move styles to a CSS class, CSS module, Tailwind utilities, or a styled component — inline objects with many properties hurt readability and create new references every render

[`kitchen-sink/src/demos/demo-infinite-scroll.tsx:96`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-infinite-scroll.tsx#L96)
[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:144`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L144)
[`kitchen-sink/src/demos/demo-horizontal-carousel.tsx:90`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-horizontal-carousel.tsx#L90)
[`kitchen-sink/src/demos/demo-fade-gallery.tsx:97`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-fade-gallery.tsx#L97)
[`kitchen-sink/src/demos/demo-framer-cards.tsx:82`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-framer-cards.tsx#L82)
[`kitchen-sink/src/demos/demo-floating-selection.tsx:92`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-floating-selection.tsx#L92)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:134`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L134)
[`kitchen-sink/src/demos/demo-stacked-layers.tsx:98`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-stacked-layers.tsx#L98)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:128`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L128)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:146`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L146)
[`kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx:99`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scale-rotate-spiral.tsx#L99)
[`kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:89`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scroll-snap-pager.tsx#L89)
[`kitchen-sink/src/demos/demo-picture-in-picture.tsx:79`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-picture-in-picture.tsx#L79)
[`kitchen-sink/src/demos/demo-picture-in-picture.tsx:108`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-picture-in-picture.tsx#L108)
[`kitchen-sink/src/demos/demo-masked-carousel.tsx:97`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-masked-carousel.tsx#L97)

**`no-static-element-interactions`**

Static HTML elements with event handlers require a role.

> Add a role attribute to this element, or use a semantic HTML element instead.

[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:111`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L111)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:130`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L130)
[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:106`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L106)
[`kitchen-sink/src/demos/demo-portal-modals.tsx:17`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-portal-modals.tsx#L17)
[`kitchen-sink/src/demos/demo-portal-modals.tsx:24`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-portal-modals.tsx#L24)

**`click-events-have-key-events`**

Enforce a clickable non-interactive element has at least one keyboard event listener.

> Visible, non-interactive elements with click handlers must have one of `keyup`, `keydown`, or `keypress` listener.

[`kitchen-sink/src/demos/demo-3d-flip-cards.tsx:106`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-3d-flip-cards.tsx#L106)
[`kitchen-sink/src/demos/demo-portal-modals.tsx:17`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-portal-modals.tsx#L17)
[`kitchen-sink/src/demos/demo-portal-modals.tsx:24`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-portal-modals.tsx#L24)

**`prefer-useReducer`**

Component "DemoGridShuffle" has 5 useState calls — consider useReducer for related state

> Group related state: `const [state, dispatch] = useReducer(reducer, { field1, field2, ... })`

[`kitchen-sink/src/demos/demo-grid-shuffle.tsx:117`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-grid-shuffle.tsx#L117)
[`kitchen-sink/src/demos/demo-drag-snap-grid.tsx:20`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-drag-snap-grid.tsx#L20)

**`design-no-bold-heading`**

font-bold on <h1> crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

> Use `font-semibold` (600) or `font-medium` (500) on headings — 700+ crushes letter counter shapes at display sizes

[`kitchen-sink/src/index.tsx:171`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L171)
[`kitchen-sink/src/index.tsx:364`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L364)

**`no-derived-state-effect`**

Derived state in useEffect — wrap the calculation in useMemo([deps]) (or compute it directly during render if it isn't expensive)

> For derived state, compute inline: `const x = fn(dep)`. For state resets on prop change, use a key prop: `<Component key={prop} />`. See https://react.dev/learn/you-might-not-need-an-effect

[`kitchen-sink/src/demos/demo-infinite-scroll.tsx:23`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-infinite-scroll.tsx#L23)

**`no-layout-transition-inline`**

Transitioning layout property "height" causes layout thrash every frame — use transform and opacity instead

> Use `transform` and `opacity` for transitions — they run on the compositor thread. For height animations, use `grid-template-rows: 0fr → 1fr`

[`kitchen-sink/src/demos/demo-flexbox-masonry.tsx:154`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-flexbox-masonry.tsx#L154)

**`use-lazy-motion`**

Import "m" with LazyMotion instead of "motion" — saves ~30kb in bundle size

> Use `import { LazyMotion, m } from "framer-motion"` with `domAnimation` features — saves ~30kb

[`kitchen-sink/src/demos/demo-framer-cards.tsx:2`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-framer-cards.tsx#L2)

**`js-combine-iterations`**

.filter().map() iterates the array twice — combine into a single loop with .reduce() or for...of

> Combine `.map().filter()` (or similar chains) into a single pass with `.reduce()` or a `for...of` loop to avoid iterating the array twice

[`kitchen-sink/src/index.tsx:180`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L180)

**`design-no-redundant-padding-axes`**

px-6 py-6 → use the shorthand p-6

> Collapse `px-N py-N` to `p-N` when both axes match. Keep them split only when one axis varies at a breakpoint (`py-2 md:py-3`)

[`kitchen-sink/src/index.tsx:363`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L363)

**`design-no-three-period-ellipsis`**

Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)

> Use the typographic ellipsis "…" (or `…`) instead of three periods — pairs with action-with-followup labels ("Rename…", "Loading…")

[`kitchen-sink/src/index.tsx:367`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/index.tsx#L367)

**`no-cascading-set-state`**

4 setState calls in a single useEffect — consider using useReducer or deriving state

> Combine into useReducer: `const [state, dispatch] = useReducer(reducer, initialState)`

[`kitchen-sink/src/demos/demo-floating-selection.tsx:18`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-floating-selection.tsx#L18)

**`no-z-index-9999`**

z-index: 1000 is arbitrarily high — use a deliberate z-index scale (1–50). Extreme values signal a stacking context problem, not a fix

> Define a z-index scale in your design tokens (e.g. dropdown: 10, modal: 20, toast: 30). Create a new stacking context with `isolation: isolate` instead of escalating values

[`kitchen-sink/src/demos/demo-floating-selection.tsx:104`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-floating-selection.tsx#L104)

**`client-passive-event-listeners`**

"scroll" listener without { passive: true } — blocks scrolling performance. Only add { passive: true } if the handler does NOT call event.preventDefault() (passive listeners silently ignore preventDefault())

> Add `{ passive: true }` as the third argument: `addEventListener('scroll', handler, { passive: true })`. Only do this if the handler does NOT call `event.preventDefault()` — passive listeners silently ignore `preventDefault()`, which breaks features like pull-to-refresh suppression, custom gestures, and nested-scroll containment.

[`kitchen-sink/src/demos/demo-scroll-snap-pager.tsx:34`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-scroll-snap-pager.tsx#L34)

**`no-array-index-as-key`**

Array index "index" used as key — causes bugs when list is reordered or filtered

> Use a stable unique identifier: `key={item.id}` or `key={item.slug}` — index keys break on reorder/filter

[`kitchen-sink/src/demos/demo-nested-scrollers.tsx:86`](https://github.com/aidenybai/stickies/blob/b883abe43aa6573b4f964c207c8c5968a17ac42d/kitchen-sink/src/demos/demo-nested-scrollers.tsx#L86)

---

Last scored May 18, 2026 at 10:18 AM UTC. Maintained by [React Review](https://github.com/millionco/react-review).

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.