#1

React Review Audit

Openreact-doctor[bot]opened 6mo ago

Score: 87/100 · 1 error · 107 warnings

Copy as prompt
Fix the following React Review diagnostics in my codebase.

## Errors (1)

1. [error] nextjs-no-side-effect-in-get-handler — app/api/stripe/route.ts:10
   GET handler has side effects (.create()) — use POST to prevent CSRF and unintended prefetch triggers

## Warnings (107)

2. [warning] design-no-redundant-size-axes — components/bot-avatar.tsx:5
   w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

3. [warning] rerender-state-only-in-handlers — components/modal-provider.tsx:8
   useState "isMounted" is updated but never read in the component's return — use useRef so updates don't trigger re-renders

4. [warning] rendering-hydration-no-flicker — components/modal-provider.tsx:10
   useEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning

5. [warning] no-react19-deprecated-apis — components/ui/select.tsx:15
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

6. [warning] design-no-redundant-size-axes — components/ui/select.tsx:29
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

7. [warning] no-react19-deprecated-apis — components/ui/select.tsx:35
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

8. [warning] no-react19-deprecated-apis — components/ui/select.tsx:65
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

9. [warning] no-react19-deprecated-apis — components/ui/select.tsx:77
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

10. [warning] design-no-redundant-size-axes — components/ui/select.tsx:89
   w-3.5 h-3.5 → use the shorthand size-3.5 (Tailwind v3.4+)

11. [warning] design-no-redundant-size-axes — components/ui/select.tsx:91
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

12. [warning] no-react19-deprecated-apis — components/ui/select.tsx:100
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

13. [warning] rerender-state-only-in-handlers — components/mobile-sidebar.tsx:17
   useState "isMounted" is updated but never read in the component's return — use useRef so updates don't trigger re-renders

14. [warning] rendering-hydration-no-flicker — components/mobile-sidebar.tsx:19
   useEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning

15. [warning] no-react19-deprecated-apis — components/ui/progress.tsx:8
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

16. [warning] design-no-redundant-size-axes — components/loader.tsx:6
   w-10 h-10 → use the shorthand size-10 (Tailwind v3.4+)

17. [warning] nextjs-image-missing-sizes — components/loader.tsx:7
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

18. [warning] design-no-three-period-ellipsis — components/loader.tsx:9
   Three-period ellipsis ("...") in JSX text — use the actual ellipsis character "…" (or `…`)

19. [warning] no-react19-deprecated-apis — components/ui/label.tsx:13
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

20. [warning] design-no-redundant-size-axes — components/landing-navbar.tsx:19
   w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

21. [warning] nextjs-image-missing-sizes — components/landing-navbar.tsx:20
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

22. [warning] no-react19-deprecated-apis — components/ui/input.tsx:8
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

23. [warning] no-gradient-text — components/landing-hero.tsx:16
   Gradient text (bg-clip-text + bg-gradient) is decorative rather than meaningful — a common AI tell. Use solid colors for text

24. [warning] no-react19-deprecated-apis — components/ui/form.tsx:43
   useContext is superseded by `use()` on React 19+ — `use()` reads context conditionally inside hooks, branches, and loops; switch to `import { use } from 'react'`

25. [warning] no-react19-deprecated-apis — components/ui/form.tsx:44
   useContext is superseded by `use()` on React 19+ — `use()` reads context conditionally inside hooks, branches, and loops; switch to `import { use } from 'react'`

26. [warning] no-react19-deprecated-apis — components/ui/form.tsx:73
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

27. [warning] no-react19-deprecated-apis — components/ui/form.tsx:87
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

28. [warning] no-react19-deprecated-apis — components/ui/form.tsx:104
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

29. [warning] no-react19-deprecated-apis — components/ui/form.tsx:126
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

30. [warning] no-react19-deprecated-apis — components/ui/form.tsx:143
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

31. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/conversation/page.tsx:56
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

32. [warning] design-no-bold-heading — components/landing-content.tsx:21
   font-extrabold on <h2> crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

33. [warning] design-no-redundant-size-axes — components/ui/empty.tsx:13
   w-72 h-72 → use the shorthand size-72 (Tailwind v3.4+)

34. [warning] nextjs-image-missing-sizes — components/ui/empty.tsx:14
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

35. [warning] design-no-bold-heading — components/heading.tsx:27
   font-bold on <h2> crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

36. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:21
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

37. [warning] design-no-redundant-size-axes — components/ui/dropdown-menu.tsx:37
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

38. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:43
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

39. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:59
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

40. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:77
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

41. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:95
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

42. [warning] design-no-redundant-size-axes — components/ui/dropdown-menu.tsx:108
   w-3.5 h-3.5 → use the shorthand size-3.5 (Tailwind v3.4+)

43. [warning] design-no-redundant-size-axes — components/ui/dropdown-menu.tsx:110
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

44. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:119
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

45. [warning] design-no-redundant-size-axes — components/ui/dropdown-menu.tsx:131
   w-3.5 h-3.5 → use the shorthand size-3.5 (Tailwind v3.4+)

46. [warning] design-no-redundant-size-axes — components/ui/dropdown-menu.tsx:133
   w-2 h-2 → use the shorthand size-2 (Tailwind v3.4+)

47. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:141
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

48. [warning] no-react19-deprecated-apis — components/ui/dropdown-menu.tsx:159
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

49. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/code/page.tsx:60
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

50. [warning] rerender-state-only-in-handlers — components/free-counter.tsx:17
   useState "mounted" is updated but never read in the component's return — use useRef so updates don't trigger re-renders

51. [warning] rendering-hydration-no-flicker — components/free-counter.tsx:20
   useEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning

52. [warning] design-no-redundant-size-axes — components/free-counter.tsx:45
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

53. [warning] no-react19-deprecated-apis — components/ui/dialog.tsx:21
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

54. [warning] no-react19-deprecated-apis — components/ui/dialog.tsx:36
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

55. [warning] design-no-redundant-size-axes — components/ui/dialog.tsx:52
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

56. [warning] no-react19-deprecated-apis — components/ui/dialog.tsx:88
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

57. [warning] no-react19-deprecated-apis — components/ui/dialog.tsx:103
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

58. [warning] no-unknown-property — components/ui/command.tsx:44
   Unknown property found

59. [warning] no-react19-deprecated-apis — components/ui/command.tsx:11
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

60. [warning] no-react19-deprecated-apis — components/ui/command.tsx:40
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

61. [warning] design-no-redundant-size-axes — components/ui/command.tsx:45
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

62. [warning] no-react19-deprecated-apis — components/ui/command.tsx:59
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

63. [warning] no-react19-deprecated-apis — components/ui/command.tsx:72
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

64. [warning] no-react19-deprecated-apis — components/ui/command.tsx:85
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

65. [warning] no-react19-deprecated-apis — components/ui/command.tsx:101
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

66. [warning] no-react19-deprecated-apis — components/ui/command.tsx:113
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

67. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/arabe/page.tsx:62
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

68. [warning] heading-has-content — components/ui/card.tsx:36
   Headings must have content and the content must be accessible by a screen reader.

69. [warning] no-react19-deprecated-apis — components/ui/card.tsx:5
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

70. [warning] no-react19-deprecated-apis — components/ui/card.tsx:20
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

71. [warning] no-react19-deprecated-apis — components/ui/card.tsx:32
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

72. [warning] no-react19-deprecated-apis — components/ui/card.tsx:47
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

73. [warning] no-react19-deprecated-apis — components/ui/card.tsx:59
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

74. [warning] no-react19-deprecated-apis — components/ui/card.tsx:67
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

75. [warning] nextjs-missing-metadata — app/(landing)/page.tsx:1
   Page without metadata or generateMetadata export — hurts SEO

76. [warning] no-react19-deprecated-apis — components/ui/button.tsx:43
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

77. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/music/page.tsx:52
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

78. [warning] no-react19-deprecated-apis — components/ui/avatar.tsx:8
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

79. [warning] no-react19-deprecated-apis — components/ui/avatar.tsx:23
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

80. [warning] no-react19-deprecated-apis — components/ui/avatar.tsx:35
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

81. [warning] server-sequential-independent-await — app/(dashboard)/layout.tsx:12
   Sequential `await` without a data dependency on the previous result — wrap the independent calls in `Promise.all([...])` so they race instead of waterfalling

82. [warning] design-no-default-tailwind-palette — app/(dashboard)/layout.tsx:16
   bg-gray-900 reads as the Tailwind template default — use zinc (true neutral), neutral (warmer), or stone (warmest)

83. [warning] react-compiler-destructure-method — components/tool-card.tsx:33
   Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

84. [warning] design-no-redundant-size-axes — components/tool-card.tsx:40
   w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

85. [warning] nextjs-image-missing-sizes — components/tool-card.tsx:41
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

86. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/image/page.tsx:57
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

87. [warning] nextjs-image-missing-sizes — app/(dashboard)/(routes)/image/page.tsx:179
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

88. [warning] design-no-redundant-size-axes — app/(dashboard)/(routes)/image/page.tsx:187
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

89. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/video/page.tsx:51
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

90. [warning] no-pure-black-background — app/(dashboard)/(routes)/video/page.tsx:103
   Pure black background (bg-black) looks harsh — use a near-black tinted toward your brand hue (e.g. bg-gray-950)

91. [warning] design-no-bold-heading — app/(dashboard)/(routes)/dashboard/page.tsx:17
   font-bold on <h2> crushes counter shapes at display sizes — use font-semibold (600) or font-medium (500)

92. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/dashboard/page.tsx:26
   Destructure for clarity: `const { push } = useRouter()` then call `push(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

93. [warning] design-no-redundant-size-axes — app/(dashboard)/(routes)/dashboard/page.tsx:35
   w-5 h-5 → use the shorthand size-5 (Tailwind v3.4+)

94. [warning] design-no-redundant-size-axes — components/subscription-button.tsx:34
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

95. [warning] react-compiler-destructure-method — app/(dashboard)/(routes)/translate/page.tsx:63
   Destructure for clarity: `const { refresh } = useRouter()` then call `refresh(...)` directly — easier for React Compiler to memoize and clearer about which methods this component depends on

96. [warning] design-no-space-on-flex-children — components/sidebar.tsx:92
   space-y-4 on a flex/grid parent — use gap-y-4 instead. Per-sibling margins phantom-gap on conditional render and don't mirror in RTL

97. [warning] design-no-redundant-size-axes — components/sidebar.tsx:95
   w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

98. [warning] nextjs-image-missing-sizes — components/sidebar.tsx:96
   next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

99. [warning] design-no-redundant-size-axes — components/user-avatar.tsx:9
   w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

100. [warning] design-no-redundant-size-axes — components/pro-modal.tsx:64
   w-5 h-5 → use the shorthand size-5 (Tailwind v3.4+)

101. [warning] design-no-redundant-size-axes — components/pro-modal.tsx:78
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

102. [warning] no-react19-deprecated-apis — components/ui/sheet.tsx:24
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

103. [warning] no-react19-deprecated-apis — components/ui/sheet.tsx:62
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

104. [warning] design-no-redundant-size-axes — components/ui/sheet.tsx:75
   w-4 h-4 → use the shorthand size-4 (Tailwind v3.4+)

105. [warning] no-react19-deprecated-apis — components/ui/sheet.tsx:111
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

106. [warning] no-react19-deprecated-apis — components/ui/sheet.tsx:123
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

107. [warning] server-sequential-independent-await — components/navbar.tsx:9
   Sequential `await` without a data dependency on the previous result — wrap the independent calls in `Promise.all([...])` so they race instead of waterfalling

108. [warning] no-react19-deprecated-apis — components/ui/separator.tsx:8
   forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

❌ Errors (1)

nextjs-no-side-effect-in-get-handler

GET handler has side effects (.create()) — use POST to prevent CSRF and unintended prefetch triggers

Move the side effect to a POST handler and use a <form> or fetch with method POST — GET requests can be triggered by prefetching and are vulnerable to CSRF

app/api/stripe/route.ts:10


⚠️ Warnings (107)

no-react19-deprecated-apis

forwardRef is no longer needed on React 19+ — refs are regular props on function components; remove forwardRef and pass ref directly

Pass ref as a regular prop on function components — forwardRef is no longer needed in React 19+. Replace useContext(X) with use(X) for branch-aware context reads. Only enabled on projects detected as React 19+.

components/ui/select.tsx:15
components/ui/select.tsx:35
components/ui/select.tsx:65
components/ui/select.tsx:77
components/ui/select.tsx:100
components/ui/progress.tsx:8
components/ui/label.tsx:13
components/ui/input.tsx:8
components/ui/form.tsx:43
components/ui/form.tsx:44
components/ui/form.tsx:73
components/ui/form.tsx:87
components/ui/form.tsx:104
components/ui/form.tsx:126
components/ui/form.tsx:143
components/ui/dropdown-menu.tsx:21
components/ui/dropdown-menu.tsx:43
components/ui/dropdown-menu.tsx:59
components/ui/dropdown-menu.tsx:77
components/ui/dropdown-menu.tsx:95
components/ui/dropdown-menu.tsx:119
components/ui/dropdown-menu.tsx:141
components/ui/dropdown-menu.tsx:159
components/ui/dialog.tsx:21
components/ui/dialog.tsx:36
components/ui/dialog.tsx:88
components/ui/dialog.tsx:103
components/ui/command.tsx:11
components/ui/command.tsx:40
components/ui/command.tsx:59
components/ui/command.tsx:72
components/ui/command.tsx:85
components/ui/command.tsx:101
components/ui/command.tsx:113
components/ui/card.tsx:5
components/ui/card.tsx:20
components/ui/card.tsx:32
components/ui/card.tsx:47
components/ui/card.tsx:59
components/ui/card.tsx:67
components/ui/button.tsx:43
components/ui/avatar.tsx:8
components/ui/avatar.tsx:23
components/ui/avatar.tsx:35
components/ui/sheet.tsx:24
components/ui/sheet.tsx:62
components/ui/sheet.tsx:111
components/ui/sheet.tsx:123
components/ui/separator.tsx:8

design-no-redundant-size-axes

w-8 h-8 → use the shorthand size-8 (Tailwind v3.4+)

Collapse w-N h-N to size-N (Tailwind v3.4+) when both axes match

components/bot-avatar.tsx:5
components/ui/select.tsx:29
components/ui/select.tsx:89
components/ui/select.tsx:91
components/loader.tsx:6
components/landing-navbar.tsx:19
components/ui/empty.tsx:13
components/ui/dropdown-menu.tsx:37
components/ui/dropdown-menu.tsx:108
components/ui/dropdown-menu.tsx:110
components/ui/dropdown-menu.tsx:131
components/ui/dropdown-menu.tsx:133
components/free-counter.tsx:45
components/ui/dialog.tsx:52
components/ui/command.tsx:45
components/tool-card.tsx:40
app/(dashboard)/(routes)/image/page.tsx:187
app/(dashboard)/(routes)/dashboard/page.tsx:35
components/subscription-button.tsx:34
components/sidebar.tsx:95
components/user-avatar.tsx:9
components/pro-modal.tsx:64
components/pro-modal.tsx:78
components/ui/sheet.tsx:75

react-compiler-destructure-method

Destructure for clarity: const { refresh } = useRouter() then call refresh(...) directly — easier for React Compiler to memoize and clearer about which methods this component depends on

Destructure the method up front: const { push } = useRouter() then call push(...) directly — clearer dependency graph and easier for React Compiler to memoize

app/(dashboard)/(routes)/conversation/page.tsx:56
app/(dashboard)/(routes)/code/page.tsx:60
app/(dashboard)/(routes)/arabe/page.tsx:62
app/(dashboard)/(routes)/music/page.tsx:52
components/tool-card.tsx:33
app/(dashboard)/(routes)/image/page.tsx:57
app/(dashboard)/(routes)/video/page.tsx:51
app/(dashboard)/(routes)/dashboard/page.tsx:26
app/(dashboard)/(routes)/translate/page.tsx:63

nextjs-image-missing-sizes

next/image with fill but no sizes — the browser downloads the largest image. Add a sizes attribute for responsive behavior

Add sizes for responsive behavior: sizes="(max-width: 768px) 100vw, 50vw" matching your layout breakpoints

components/loader.tsx:7
components/landing-navbar.tsx:20
components/ui/empty.tsx:14
components/tool-card.tsx:41
app/(dashboard)/(routes)/image/page.tsx:179
components/sidebar.tsx:96

rerender-state-only-in-handlers

useState "isMounted" is updated but never read in the component's return — use useRef so updates don't trigger re-renders

Replace useState with useRef when the value is only mutated and never read in render — ref.current = ... updates without re-rendering the component

components/modal-provider.tsx:8
components/mobile-sidebar.tsx:17
components/free-counter.tsx:17

rendering-hydration-no-flicker

useEffect(setState, []) on mount causes a flash — consider useSyncExternalStore or suppressHydrationWarning

Use useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) or add suppressHydrationWarning to the element

components/modal-provider.tsx:10
components/mobile-sidebar.tsx:19
components/free-counter.tsx:20

design-no-bold-heading

font-extrabold on <h2> 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

components/landing-content.tsx:21
components/heading.tsx:27
app/(dashboard)/(routes)/dashboard/page.tsx:17

server-sequential-independent-await

Sequential await without a data dependency on the previous result — wrap the independent calls in Promise.all([...]) so they race instead of waterfalling

Wrap independent awaits in Promise.all([...]) so they race instead of waterfalling — second call doesn't depend on the first

app/(dashboard)/layout.tsx:12
components/navbar.tsx:9

design-no-three-period-ellipsis

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

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

components/loader.tsx:9

no-gradient-text

Gradient text (bg-clip-text + bg-gradient) is decorative rather than meaningful — a common AI tell. Use solid colors for text

Use solid text colors for readability. If you need emphasis, use font weight, size, or a distinct color instead of gradients

components/landing-hero.tsx:16

no-unknown-property

Unknown property found

Remove unknown property

components/ui/command.tsx:44

heading-has-content

Headings must have content and the content must be accessible by a screen reader.

Provide screen reader accessible content when using heading elements.

components/ui/card.tsx:36

nextjs-missing-metadata

Page without metadata or generateMetadata export — hurts SEO

Add export const metadata = { title: '...', description: '...' } or export async function generateMetadata()

app/(landing)/page.tsx:1

design-no-default-tailwind-palette

bg-gray-900 reads as the Tailwind template default — use zinc (true neutral), neutral (warmer), or stone (warmest)

Replace indigo-* / gray-* / slate-* with project tokens, your brand color, or a less-default neutral (zinc, neutral, stone)

app/(dashboard)/layout.tsx:16

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

app/(dashboard)/(routes)/video/page.tsx:103

design-no-space-on-flex-children

space-y-4 on a flex/grid parent — use gap-y-4 instead. Per-sibling margins phantom-gap on conditional render and don't mirror in RTL

Use gap-* on the flex/grid parent. space-x-* / space-y-* produce phantom gaps when a sibling is conditionally rendered, lose vertical spacing on wrapped lines, and don't mirror in RTL

components/sidebar.tsx:92


Last scored May 14, 2026 at 7:35 AM UTC. Maintained by React Review.

Activity

0

No activity yet.