@jakkrichm/create-nexus-devflow 2.0.19 → 2.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/dist/lib/update.js +19 -8
  2. package/dist/lib/update.js.map +1 -1
  3. package/package.json +1 -1
  4. package/template/.agents/skills/00-discover/SKILL.md +28 -116
  5. package/template/.agents/skills/40-execute/SKILL.md +1 -1
  6. package/template/.agents/skills/50-verify/SKILL.md +28 -161
  7. package/template/.agents/skills/60-report/SKILL.md +19 -92
  8. package/template/.agents/skills/70-release/SKILL.md +36 -11
  9. package/template/.agents/skills/check/SKILL.md +19 -7
  10. package/template/.agents/skills/complete/SKILL.md +21 -10
  11. package/template/.claude/skills/00-discover/SKILL.md +28 -116
  12. package/template/.claude/skills/40-execute/SKILL.md +1 -1
  13. package/template/.claude/skills/50-verify/SKILL.md +28 -161
  14. package/template/.claude/skills/60-report/SKILL.md +19 -92
  15. package/template/.claude/skills/70-release/SKILL.md +36 -11
  16. package/template/.claude/skills/check/SKILL.md +19 -7
  17. package/template/.claude/skills/complete/SKILL.md +21 -10
  18. package/template/AGENTS.md +1 -1
  19. package/template/devflow/context/coding-standards.md +40 -29
  20. package/template/.agents/skills/agent/SKILL.md +0 -165
  21. package/template/.agents/skills/api-and-interface-design/SKILL.md +0 -294
  22. package/template/.agents/skills/app-builder/SKILL.md +0 -75
  23. package/template/.agents/skills/app-builder/agent-coordination.md +0 -71
  24. package/template/.agents/skills/app-builder/feature-building.md +0 -53
  25. package/template/.agents/skills/app-builder/project-detection.md +0 -34
  26. package/template/.agents/skills/app-builder/scaffolding.md +0 -118
  27. package/template/.agents/skills/app-builder/tech-stack.md +0 -40
  28. package/template/.agents/skills/app-builder/templates/SKILL.md +0 -39
  29. package/template/.agents/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  30. package/template/.agents/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  31. package/template/.agents/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  32. package/template/.agents/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  33. package/template/.agents/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  34. package/template/.agents/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  35. package/template/.agents/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  36. package/template/.agents/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  37. package/template/.agents/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  38. package/template/.agents/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  39. package/template/.agents/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  40. package/template/.agents/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  41. package/template/.agents/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  42. package/template/.agents/skills/architecture/SKILL.md +0 -55
  43. package/template/.agents/skills/architecture/context-discovery.md +0 -43
  44. package/template/.agents/skills/architecture/examples.md +0 -94
  45. package/template/.agents/skills/architecture/pattern-selection.md +0 -68
  46. package/template/.agents/skills/architecture/patterns-reference.md +0 -50
  47. package/template/.agents/skills/architecture/trade-off-analysis.md +0 -77
  48. package/template/.agents/skills/bash-linux/SKILL.md +0 -199
  49. package/template/.agents/skills/behavioral-modes/SKILL.md +0 -242
  50. package/template/.agents/skills/brainstorm/SKILL.md +0 -168
  51. package/template/.agents/skills/changelog/SKILL.md +0 -109
  52. package/template/.agents/skills/codebase-design/DEEPENING.md +0 -24
  53. package/template/.agents/skills/codebase-design/DESIGN-IT-TWICE.md +0 -28
  54. package/template/.agents/skills/codebase-design/SKILL.md +0 -58
  55. package/template/.agents/skills/commit/SKILL.md +0 -59
  56. package/template/.agents/skills/competitor-analysis/SKILL.md +0 -66
  57. package/template/.agents/skills/context-engineering/SKILL.md +0 -290
  58. package/template/.agents/skills/database-design/SKILL.md +0 -52
  59. package/template/.agents/skills/database-design/database-selection.md +0 -43
  60. package/template/.agents/skills/database-design/indexing.md +0 -39
  61. package/template/.agents/skills/database-design/migrations.md +0 -48
  62. package/template/.agents/skills/database-design/optimization.md +0 -36
  63. package/template/.agents/skills/database-design/orm-selection.md +0 -30
  64. package/template/.agents/skills/database-design/schema-design.md +0 -56
  65. package/template/.agents/skills/database-design/scripts/schema_validator.py +0 -172
  66. package/template/.agents/skills/deploy/SKILL.md +0 -63
  67. package/template/.agents/skills/documentation-and-adrs/SKILL.md +0 -278
  68. package/template/.agents/skills/domain-modeling/ADR-FORMAT.md +0 -47
  69. package/template/.agents/skills/domain-modeling/CONTEXT-FORMAT.md +0 -60
  70. package/template/.agents/skills/domain-modeling/SKILL.md +0 -74
  71. package/template/.agents/skills/followup/SKILL.md +0 -83
  72. package/template/.agents/skills/frontend-ui-engineering/SKILL.md +0 -326
  73. package/template/.agents/skills/frontend-ui-engineering/accessibility-checklist.md +0 -159
  74. package/template/.agents/skills/goal/SKILL.md +0 -148
  75. package/template/.agents/skills/handoff/SKILL.md +0 -46
  76. package/template/.agents/skills/help/SKILL.md +0 -253
  77. package/template/.agents/skills/i18n-localization/SKILL.md +0 -154
  78. package/template/.agents/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  79. package/template/.agents/skills/insight/SKILL.md +0 -42
  80. package/template/.agents/skills/issue-triage/SKILL.md +0 -115
  81. package/template/.agents/skills/lint-and-validate/SKILL.md +0 -45
  82. package/template/.agents/skills/lint-and-validate/scripts/lint_runner.py +0 -184
  83. package/template/.agents/skills/lint-and-validate/scripts/type_coverage.py +0 -173
  84. package/template/.agents/skills/mcp-builder/SKILL.md +0 -176
  85. package/template/.agents/skills/merge/SKILL.md +0 -76
  86. package/template/.agents/skills/mobile-design/SKILL.md +0 -394
  87. package/template/.agents/skills/mobile-design/decision-trees.md +0 -516
  88. package/template/.agents/skills/mobile-design/mobile-backend.md +0 -491
  89. package/template/.agents/skills/mobile-design/mobile-color-system.md +0 -420
  90. package/template/.agents/skills/mobile-design/mobile-debugging.md +0 -122
  91. package/template/.agents/skills/mobile-design/mobile-design-thinking.md +0 -357
  92. package/template/.agents/skills/mobile-design/mobile-navigation.md +0 -458
  93. package/template/.agents/skills/mobile-design/mobile-performance.md +0 -767
  94. package/template/.agents/skills/mobile-design/mobile-testing.md +0 -356
  95. package/template/.agents/skills/mobile-design/mobile-typography.md +0 -433
  96. package/template/.agents/skills/mobile-design/platform-android.md +0 -666
  97. package/template/.agents/skills/mobile-design/platform-ios.md +0 -561
  98. package/template/.agents/skills/mobile-design/scripts/mobile_audit.py +0 -670
  99. package/template/.agents/skills/mobile-design/touch-psychology.md +0 -537
  100. package/template/.agents/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  101. package/template/.agents/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  102. package/template/.agents/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  103. package/template/.agents/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  104. package/template/.agents/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  105. package/template/.agents/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  106. package/template/.agents/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  107. package/template/.agents/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  108. package/template/.agents/skills/nextjs-react-expert/SKILL.md +0 -286
  109. package/template/.agents/skills/nextjs-react-expert/scripts/convert_rules.py +0 -222
  110. package/template/.agents/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
  111. package/template/.agents/skills/nodejs-best-practices/SKILL.md +0 -333
  112. package/template/.agents/skills/package-json-generator/SKILL.md +0 -60
  113. package/template/.agents/skills/package-json-generator/scripts/generate.js +0 -120
  114. package/template/.agents/skills/package-json-generator/scripts/run.sh +0 -19
  115. package/template/.agents/skills/parallel-agents/SKILL.md +0 -144
  116. package/template/.agents/skills/performance-optimization/SKILL.md +0 -299
  117. package/template/.agents/skills/performance-optimization/performance-checklist.md +0 -113
  118. package/template/.agents/skills/powershell-windows/SKILL.md +0 -167
  119. package/template/.agents/skills/pr/SKILL.md +0 -93
  120. package/template/.agents/skills/prd/SKILL.md +0 -127
  121. package/template/.agents/skills/preview/SKILL.md +0 -42
  122. package/template/.agents/skills/python-patterns/SKILL.md +0 -441
  123. package/template/.agents/skills/research/SKILL.md +0 -143
  124. package/template/.agents/skills/review/SKILL.md +0 -71
  125. package/template/.agents/skills/roadmap-strategy/SKILL.md +0 -94
  126. package/template/.agents/skills/security-review/SKILL.md +0 -63
  127. package/template/.agents/skills/seo-fundamentals/SKILL.md +0 -129
  128. package/template/.agents/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
  129. package/template/.agents/skills/server-management/SKILL.md +0 -161
  130. package/template/.agents/skills/simplify/SKILL.md +0 -70
  131. package/template/.agents/skills/skill-development/SKILL.md +0 -86
  132. package/template/.agents/skills/spec/SKILL.md +0 -39
  133. package/template/.agents/skills/spec-driven-development/SKILL.md +0 -207
  134. package/template/.agents/skills/tailwind-patterns/SKILL.md +0 -269
  135. package/template/.agents/skills/type-design/SKILL.md +0 -84
  136. package/template/.agents/skills/ui-ux-pro-max/SKILL.md +0 -75
  137. package/template/.claude/skills/agent/SKILL.md +0 -165
  138. package/template/.claude/skills/api-and-interface-design/SKILL.md +0 -294
  139. package/template/.claude/skills/app-builder/SKILL.md +0 -75
  140. package/template/.claude/skills/app-builder/agent-coordination.md +0 -71
  141. package/template/.claude/skills/app-builder/feature-building.md +0 -53
  142. package/template/.claude/skills/app-builder/project-detection.md +0 -34
  143. package/template/.claude/skills/app-builder/scaffolding.md +0 -118
  144. package/template/.claude/skills/app-builder/tech-stack.md +0 -40
  145. package/template/.claude/skills/app-builder/templates/SKILL.md +0 -39
  146. package/template/.claude/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  147. package/template/.claude/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  148. package/template/.claude/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  149. package/template/.claude/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  150. package/template/.claude/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  151. package/template/.claude/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  152. package/template/.claude/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  153. package/template/.claude/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  154. package/template/.claude/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  155. package/template/.claude/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  156. package/template/.claude/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  157. package/template/.claude/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  158. package/template/.claude/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  159. package/template/.claude/skills/architecture/SKILL.md +0 -55
  160. package/template/.claude/skills/architecture/context-discovery.md +0 -43
  161. package/template/.claude/skills/architecture/examples.md +0 -94
  162. package/template/.claude/skills/architecture/pattern-selection.md +0 -68
  163. package/template/.claude/skills/architecture/patterns-reference.md +0 -50
  164. package/template/.claude/skills/architecture/trade-off-analysis.md +0 -77
  165. package/template/.claude/skills/bash-linux/SKILL.md +0 -199
  166. package/template/.claude/skills/behavioral-modes/SKILL.md +0 -242
  167. package/template/.claude/skills/brainstorm/SKILL.md +0 -168
  168. package/template/.claude/skills/changelog/SKILL.md +0 -109
  169. package/template/.claude/skills/codebase-design/DEEPENING.md +0 -24
  170. package/template/.claude/skills/codebase-design/DESIGN-IT-TWICE.md +0 -28
  171. package/template/.claude/skills/codebase-design/SKILL.md +0 -58
  172. package/template/.claude/skills/commit/SKILL.md +0 -59
  173. package/template/.claude/skills/competitor-analysis/SKILL.md +0 -66
  174. package/template/.claude/skills/context-engineering/SKILL.md +0 -290
  175. package/template/.claude/skills/database-design/SKILL.md +0 -52
  176. package/template/.claude/skills/database-design/database-selection.md +0 -43
  177. package/template/.claude/skills/database-design/indexing.md +0 -39
  178. package/template/.claude/skills/database-design/migrations.md +0 -48
  179. package/template/.claude/skills/database-design/optimization.md +0 -36
  180. package/template/.claude/skills/database-design/orm-selection.md +0 -30
  181. package/template/.claude/skills/database-design/schema-design.md +0 -56
  182. package/template/.claude/skills/database-design/scripts/schema_validator.py +0 -172
  183. package/template/.claude/skills/deploy/SKILL.md +0 -63
  184. package/template/.claude/skills/documentation-and-adrs/SKILL.md +0 -278
  185. package/template/.claude/skills/domain-modeling/ADR-FORMAT.md +0 -47
  186. package/template/.claude/skills/domain-modeling/CONTEXT-FORMAT.md +0 -60
  187. package/template/.claude/skills/domain-modeling/SKILL.md +0 -74
  188. package/template/.claude/skills/followup/SKILL.md +0 -83
  189. package/template/.claude/skills/frontend-ui-engineering/SKILL.md +0 -326
  190. package/template/.claude/skills/frontend-ui-engineering/accessibility-checklist.md +0 -159
  191. package/template/.claude/skills/goal/SKILL.md +0 -148
  192. package/template/.claude/skills/handoff/SKILL.md +0 -46
  193. package/template/.claude/skills/help/SKILL.md +0 -253
  194. package/template/.claude/skills/i18n-localization/SKILL.md +0 -154
  195. package/template/.claude/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  196. package/template/.claude/skills/insight/SKILL.md +0 -42
  197. package/template/.claude/skills/issue-triage/SKILL.md +0 -115
  198. package/template/.claude/skills/lint-and-validate/SKILL.md +0 -45
  199. package/template/.claude/skills/lint-and-validate/scripts/lint_runner.py +0 -184
  200. package/template/.claude/skills/lint-and-validate/scripts/type_coverage.py +0 -173
  201. package/template/.claude/skills/mcp-builder/SKILL.md +0 -176
  202. package/template/.claude/skills/merge/SKILL.md +0 -76
  203. package/template/.claude/skills/mobile-design/SKILL.md +0 -394
  204. package/template/.claude/skills/mobile-design/decision-trees.md +0 -516
  205. package/template/.claude/skills/mobile-design/mobile-backend.md +0 -491
  206. package/template/.claude/skills/mobile-design/mobile-color-system.md +0 -420
  207. package/template/.claude/skills/mobile-design/mobile-debugging.md +0 -122
  208. package/template/.claude/skills/mobile-design/mobile-design-thinking.md +0 -357
  209. package/template/.claude/skills/mobile-design/mobile-navigation.md +0 -458
  210. package/template/.claude/skills/mobile-design/mobile-performance.md +0 -767
  211. package/template/.claude/skills/mobile-design/mobile-testing.md +0 -356
  212. package/template/.claude/skills/mobile-design/mobile-typography.md +0 -433
  213. package/template/.claude/skills/mobile-design/platform-android.md +0 -666
  214. package/template/.claude/skills/mobile-design/platform-ios.md +0 -561
  215. package/template/.claude/skills/mobile-design/scripts/mobile_audit.py +0 -670
  216. package/template/.claude/skills/mobile-design/touch-psychology.md +0 -537
  217. package/template/.claude/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
  218. package/template/.claude/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
  219. package/template/.claude/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
  220. package/template/.claude/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
  221. package/template/.claude/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
  222. package/template/.claude/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
  223. package/template/.claude/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
  224. package/template/.claude/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
  225. package/template/.claude/skills/nextjs-react-expert/SKILL.md +0 -286
  226. package/template/.claude/skills/nextjs-react-expert/scripts/convert_rules.py +0 -222
  227. package/template/.claude/skills/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
  228. package/template/.claude/skills/nodejs-best-practices/SKILL.md +0 -333
  229. package/template/.claude/skills/package-json-generator/SKILL.md +0 -60
  230. package/template/.claude/skills/package-json-generator/scripts/generate.js +0 -120
  231. package/template/.claude/skills/package-json-generator/scripts/run.sh +0 -19
  232. package/template/.claude/skills/parallel-agents/SKILL.md +0 -144
  233. package/template/.claude/skills/performance-optimization/SKILL.md +0 -299
  234. package/template/.claude/skills/performance-optimization/performance-checklist.md +0 -113
  235. package/template/.claude/skills/powershell-windows/SKILL.md +0 -167
  236. package/template/.claude/skills/pr/SKILL.md +0 -93
  237. package/template/.claude/skills/prd/SKILL.md +0 -127
  238. package/template/.claude/skills/preview/SKILL.md +0 -42
  239. package/template/.claude/skills/python-patterns/SKILL.md +0 -441
  240. package/template/.claude/skills/research/SKILL.md +0 -143
  241. package/template/.claude/skills/review/SKILL.md +0 -71
  242. package/template/.claude/skills/roadmap-strategy/SKILL.md +0 -94
  243. package/template/.claude/skills/security-review/SKILL.md +0 -63
  244. package/template/.claude/skills/seo-fundamentals/SKILL.md +0 -129
  245. package/template/.claude/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
  246. package/template/.claude/skills/server-management/SKILL.md +0 -161
  247. package/template/.claude/skills/simplify/SKILL.md +0 -70
  248. package/template/.claude/skills/skill-development/SKILL.md +0 -86
  249. package/template/.claude/skills/spec/SKILL.md +0 -39
  250. package/template/.claude/skills/spec-driven-development/SKILL.md +0 -207
  251. package/template/.claude/skills/tailwind-patterns/SKILL.md +0 -269
  252. package/template/.claude/skills/type-design/SKILL.md +0 -84
  253. package/template/.claude/skills/ui-ux-pro-max/SKILL.md +0 -75
@@ -1,432 +0,0 @@
1
- # 6. Rendering Performance
2
-
3
- > **Impact:** MEDIUM
4
- > **Focus:** Optimizing the rendering process reduces the work the browser needs to do.
5
-
6
- ---
7
-
8
- ## Overview
9
-
10
- This section contains **9 rules** focused on rendering performance.
11
-
12
- ---
13
-
14
- ## Rule 6.1: Animate SVG Wrapper Instead of SVG Element
15
-
16
- **Impact:** LOW
17
- **Tags:** rendering, svg, css, animation, performance
18
-
19
- ## Animate SVG Wrapper Instead of SVG Element
20
-
21
- Many browsers don't have hardware acceleration for CSS3 animations on SVG elements. Wrap SVG in a `<div>` and animate the wrapper instead.
22
-
23
- **Incorrect (animating SVG directly - no hardware acceleration):**
24
-
25
- ```tsx
26
- function LoadingSpinner() {
27
- return (
28
- <svg
29
- className="animate-spin"
30
- width="24"
31
- height="24"
32
- viewBox="0 0 24 24"
33
- >
34
- <circle cx="12" cy="12" r="10" stroke="currentColor" />
35
- </svg>
36
- )
37
- }
38
- ```
39
-
40
- **Correct (animating wrapper div - hardware accelerated):**
41
-
42
- ```tsx
43
- function LoadingSpinner() {
44
- return (
45
- <div className="animate-spin">
46
- <svg
47
- width="24"
48
- height="24"
49
- viewBox="0 0 24 24"
50
- >
51
- <circle cx="12" cy="12" r="10" stroke="currentColor" />
52
- </svg>
53
- </div>
54
- )
55
- }
56
- ```
57
-
58
- This applies to all CSS transforms and transitions (`transform`, `opacity`, `translate`, `scale`, `rotate`). The wrapper div allows browsers to use GPU acceleration for smoother animations.
59
-
60
- ---
61
-
62
- ## Rule 6.2: CSS content-visibility for Long Lists
63
-
64
- **Impact:** HIGH
65
- **Tags:** rendering, css, content-visibility, long-lists
66
-
67
- ## CSS content-visibility for Long Lists
68
-
69
- Apply `content-visibility: auto` to defer off-screen rendering.
70
-
71
- **CSS:**
72
-
73
- ```css
74
- .message-item {
75
- content-visibility: auto;
76
- contain-intrinsic-size: 0 80px;
77
- }
78
- ```
79
-
80
- **Example:**
81
-
82
- ```tsx
83
- function MessageList({ messages }: { messages: Message[] }) {
84
- return (
85
- <div className="overflow-y-auto h-screen">
86
- {messages.map(msg => (
87
- <div key={msg.id} className="message-item">
88
- <Avatar user={msg.author} />
89
- <div>{msg.content}</div>
90
- </div>
91
- ))}
92
- </div>
93
- )
94
- }
95
- ```
96
-
97
- For 1000 messages, browser skips layout/paint for ~990 off-screen items (10× faster initial render).
98
-
99
- ---
100
-
101
- ## Rule 6.3: Hoist Static JSX Elements
102
-
103
- **Impact:** LOW
104
- **Tags:** rendering, jsx, static, optimization
105
-
106
- ## Hoist Static JSX Elements
107
-
108
- Extract static JSX outside components to avoid re-creation.
109
-
110
- **Incorrect (recreates element every render):**
111
-
112
- ```tsx
113
- function LoadingSkeleton() {
114
- return <div className="animate-pulse h-20 bg-gray-200" />
115
- }
116
-
117
- function Container() {
118
- return (
119
- <div>
120
- {loading && <LoadingSkeleton />}
121
- </div>
122
- )
123
- }
124
- ```
125
-
126
- **Correct (reuses same element):**
127
-
128
- ```tsx
129
- const loadingSkeleton = (
130
- <div className="animate-pulse h-20 bg-gray-200" />
131
- )
132
-
133
- function Container() {
134
- return (
135
- <div>
136
- {loading && loadingSkeleton}
137
- </div>
138
- )
139
- }
140
- ```
141
-
142
- This is especially helpful for large and static SVG nodes, which can be expensive to recreate on every render.
143
-
144
- **Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, the compiler automatically hoists static JSX elements and optimizes component re-renders, making manual hoisting unnecessary.
145
-
146
- ---
147
-
148
- ## Rule 6.4: Optimize SVG Precision
149
-
150
- **Impact:** LOW
151
- **Tags:** rendering, svg, optimization, svgo
152
-
153
- ## Optimize SVG Precision
154
-
155
- Reduce SVG coordinate precision to decrease file size. The optimal precision depends on the viewBox size, but in general reducing precision should be considered.
156
-
157
- **Incorrect (excessive precision):**
158
-
159
- ```svg
160
- <path d="M 10.293847 20.847362 L 30.938472 40.192837" />
161
- ```
162
-
163
- **Correct (1 decimal place):**
164
-
165
- ```svg
166
- <path d="M 10.3 20.8 L 30.9 40.2" />
167
- ```
168
-
169
- **Automate with SVGO:**
170
-
171
- ```bash
172
- npx svgo --precision=1 --multipass icon.svg
173
- ```
174
-
175
- ---
176
-
177
- ## Rule 6.5: Prevent Hydration Mismatch Without Flickering
178
-
179
- **Impact:** MEDIUM
180
- **Tags:** rendering, ssr, hydration, localStorage, flicker
181
-
182
- ## Prevent Hydration Mismatch Without Flickering
183
-
184
- When rendering content that depends on client-side storage (localStorage, cookies), avoid both SSR breakage and post-hydration flickering by injecting a synchronous script that updates the DOM before React hydrates.
185
-
186
- **Incorrect (breaks SSR):**
187
-
188
- ```tsx
189
- function ThemeWrapper({ children }: { children: ReactNode }) {
190
- // localStorage is not available on server - throws error
191
- const theme = localStorage.getItem('theme') || 'light'
192
-
193
- return (
194
- <div className={theme}>
195
- {children}
196
- </div>
197
- )
198
- }
199
- ```
200
-
201
- Server-side rendering will fail because `localStorage` is undefined.
202
-
203
- **Incorrect (visual flickering):**
204
-
205
- ```tsx
206
- function ThemeWrapper({ children }: { children: ReactNode }) {
207
- const [theme, setTheme] = useState('light')
208
-
209
- useEffect(() => {
210
- // Runs after hydration - causes visible flash
211
- const stored = localStorage.getItem('theme')
212
- if (stored) {
213
- setTheme(stored)
214
- }
215
- }, [])
216
-
217
- return (
218
- <div className={theme}>
219
- {children}
220
- </div>
221
- )
222
- }
223
- ```
224
-
225
- Component first renders with default value (`light`), then updates after hydration, causing a visible flash of incorrect content.
226
-
227
- **Correct (no flicker, no hydration mismatch):**
228
-
229
- ```tsx
230
- function ThemeWrapper({ children }: { children: ReactNode }) {
231
- return (
232
- <>
233
- <div id="theme-wrapper">
234
- {children}
235
- </div>
236
- <script
237
- dangerouslySetInnerHTML={{
238
- __html: `
239
- (function() {
240
- try {
241
- var theme = localStorage.getItem('theme') || 'light';
242
- var el = document.getElementById('theme-wrapper');
243
- if (el) el.className = theme;
244
- } catch (e) {}
245
- })();
246
- `,
247
- }}
248
- />
249
- </>
250
- )
251
- }
252
- ```
253
-
254
- The inline script executes synchronously before showing the element, ensuring the DOM already has the correct value. No flickering, no hydration mismatch.
255
-
256
- This pattern is especially useful for theme toggles, user preferences, authentication states, and any client-only data that should render immediately without flashing default values.
257
-
258
- ---
259
-
260
- ## Rule 6.6: Suppress Expected Hydration Mismatches
261
-
262
- **Impact:** LOW-MEDIUM
263
- **Tags:** rendering, hydration, ssr, nextjs
264
-
265
- ## Suppress Expected Hydration Mismatches
266
-
267
- In SSR frameworks (e.g., Next.js), some values are intentionally different on server vs client (random IDs, dates, locale/timezone formatting). For these *expected* mismatches, wrap the dynamic text in an element with `suppressHydrationWarning` to prevent noisy warnings. Do not use this to hide real bugs. Don’t overuse it.
268
-
269
- **Incorrect (known mismatch warnings):**
270
-
271
- ```tsx
272
- function Timestamp() {
273
- return <span>{new Date().toLocaleString()}</span>
274
- }
275
- ```
276
-
277
- **Correct (suppress expected mismatch only):**
278
-
279
- ```tsx
280
- function Timestamp() {
281
- return (
282
- <span suppressHydrationWarning>
283
- {new Date().toLocaleString()}
284
- </span>
285
- )
286
- }
287
- ```
288
-
289
- ---
290
-
291
- ## Rule 6.7: Use Activity Component for Show/Hide
292
-
293
- **Impact:** MEDIUM
294
- **Tags:** rendering, activity, visibility, state-preservation
295
-
296
- ## Use Activity Component for Show/Hide
297
-
298
- Use React's `<Activity>` to preserve state/DOM for expensive components that frequently toggle visibility.
299
-
300
- **Usage:**
301
-
302
- ```tsx
303
- import { Activity } from 'react'
304
-
305
- function Dropdown({ isOpen }: Props) {
306
- return (
307
- <Activity mode={isOpen ? 'visible' : 'hidden'}>
308
- <ExpensiveMenu />
309
- </Activity>
310
- )
311
- }
312
- ```
313
-
314
- Avoids expensive re-renders and state loss.
315
-
316
- ---
317
-
318
- ## Rule 6.8: Use Explicit Conditional Rendering
319
-
320
- **Impact:** LOW
321
- **Tags:** rendering, conditional, jsx, falsy-values
322
-
323
- ## Use Explicit Conditional Rendering
324
-
325
- Use explicit ternary operators (`? :`) instead of `&&` for conditional rendering when the condition can be `0`, `NaN`, or other falsy values that render.
326
-
327
- **Incorrect (renders "0" when count is 0):**
328
-
329
- ```tsx
330
- function Badge({ count }: { count: number }) {
331
- return (
332
- <div>
333
- {count && <span className="badge">{count}</span>}
334
- </div>
335
- )
336
- }
337
-
338
- // When count = 0, renders: <div>0</div>
339
- // When count = 5, renders: <div><span class="badge">5</span></div>
340
- ```
341
-
342
- **Correct (renders nothing when count is 0):**
343
-
344
- ```tsx
345
- function Badge({ count }: { count: number }) {
346
- return (
347
- <div>
348
- {count > 0 ? <span className="badge">{count}</span> : null}
349
- </div>
350
- )
351
- }
352
-
353
- // When count = 0, renders: <div></div>
354
- // When count = 5, renders: <div><span class="badge">5</span></div>
355
- ```
356
-
357
- ---
358
-
359
- ## Rule 6.9: Use useTransition Over Manual Loading States
360
-
361
- **Impact:** LOW
362
- **Tags:** rendering, transitions, useTransition, loading, state
363
-
364
- ## Use useTransition Over Manual Loading States
365
-
366
- Use `useTransition` instead of manual `useState` for loading states. This provides built-in `isPending` state and automatically manages transitions.
367
-
368
- **Incorrect (manual loading state):**
369
-
370
- ```tsx
371
- function SearchResults() {
372
- const [query, setQuery] = useState('')
373
- const [results, setResults] = useState([])
374
- const [isLoading, setIsLoading] = useState(false)
375
-
376
- const handleSearch = async (value: string) => {
377
- setIsLoading(true)
378
- setQuery(value)
379
- const data = await fetchResults(value)
380
- setResults(data)
381
- setIsLoading(false)
382
- }
383
-
384
- return (
385
- <>
386
- <input onChange={(e) => handleSearch(e.target.value)} />
387
- {isLoading && <Spinner />}
388
- <ResultsList results={results} />
389
- </>
390
- )
391
- }
392
- ```
393
-
394
- **Correct (useTransition with built-in pending state):**
395
-
396
- ```tsx
397
- import { useTransition, useState } from 'react'
398
-
399
- function SearchResults() {
400
- const [query, setQuery] = useState('')
401
- const [results, setResults] = useState([])
402
- const [isPending, startTransition] = useTransition()
403
-
404
- const handleSearch = (value: string) => {
405
- setQuery(value) // Update input immediately
406
-
407
- startTransition(async () => {
408
- // Fetch and update results
409
- const data = await fetchResults(value)
410
- setResults(data)
411
- })
412
- }
413
-
414
- return (
415
- <>
416
- <input onChange={(e) => handleSearch(e.target.value)} />
417
- {isPending && <Spinner />}
418
- <ResultsList results={results} />
419
- </>
420
- )
421
- }
422
- ```
423
-
424
- **Benefits:**
425
-
426
- - **Automatic pending state**: No need to manually manage `setIsLoading(true/false)`
427
- - **Error resilience**: Pending state correctly resets even if the transition throws
428
- - **Better responsiveness**: Keeps the UI responsive during updates
429
- - **Interrupt handling**: New transitions automatically cancel pending ones
430
-
431
- Reference: [useTransition](https://react.dev/reference/react/useTransition)
432
-