@nerdev/skillset 0.2.1

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 (567) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +351 -0
  3. package/bin/skillset.mjs +205 -0
  4. package/curations/README.md +53 -0
  5. package/curations/TEMPLATE/WHY.md +23 -0
  6. package/curations/TEMPLATE/overlay/SKILL.md +6 -0
  7. package/curations/impeccable/WHY.md +34 -0
  8. package/curations/impeccable/overlay/SKILL.md +116 -0
  9. package/package.json +43 -0
  10. package/scripts/ste-gate.mjs +39 -0
  11. package/scripts/ste-lint.py +201 -0
  12. package/scripts/sync.mjs +174 -0
  13. package/skills/ai-agent/agent-docs-writer/SKILL.md +105 -0
  14. package/skills/ai-agent/agent-docs-writer/references/principles.md +73 -0
  15. package/skills/ai-agent/agent-docs-writer/templates/AGENTS.template.md +44 -0
  16. package/skills/ai-agent/agent-docs-writer/templates/README.template.md +19 -0
  17. package/skills/ai-agent/ultra-context-engine/SKILL.md +941 -0
  18. package/skills/architecture/blueprint/SKILL.md +191 -0
  19. package/skills/architecture/code-tour/SKILL.md +204 -0
  20. package/skills/architecture/progress-guard/SKILL.md +148 -0
  21. package/skills/architecture/search-first/SKILL.md +97 -0
  22. package/skills/backend/api-design/SKILL.md +456 -0
  23. package/skills/backend/auth/SKILL.md +596 -0
  24. package/skills/backend/database/SKILL.md +431 -0
  25. package/skills/backend/realtime/SKILL.md +670 -0
  26. package/skills/backend/security/SKILL.md +590 -0
  27. package/skills/business/brag/SKILL.md +177 -0
  28. package/skills/business/brag/assets/music/README.md +20 -0
  29. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
  30. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
  31. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
  32. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
  33. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
  34. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
  35. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
  36. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
  37. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
  38. package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
  39. package/skills/business/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
  40. package/skills/business/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
  41. package/skills/business/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
  42. package/skills/business/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
  43. package/skills/business/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
  44. package/skills/business/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
  45. package/skills/business/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
  46. package/skills/business/brag/assets/sfx/casino/card-place-1.ogg +0 -0
  47. package/skills/business/brag/assets/sfx/casino/card-place-2.ogg +0 -0
  48. package/skills/business/brag/assets/sfx/casino/card-place-3.ogg +0 -0
  49. package/skills/business/brag/assets/sfx/casino/card-place-4.ogg +0 -0
  50. package/skills/business/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
  51. package/skills/business/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
  52. package/skills/business/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
  53. package/skills/business/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
  54. package/skills/business/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
  55. package/skills/business/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
  56. package/skills/business/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
  57. package/skills/business/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
  58. package/skills/business/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
  59. package/skills/business/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
  60. package/skills/business/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
  61. package/skills/business/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
  62. package/skills/business/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
  63. package/skills/business/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
  64. package/skills/business/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
  65. package/skills/business/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
  66. package/skills/business/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
  67. package/skills/business/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
  68. package/skills/business/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
  69. package/skills/business/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
  70. package/skills/business/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
  71. package/skills/business/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
  72. package/skills/business/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
  73. package/skills/business/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
  74. package/skills/business/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
  75. package/skills/business/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
  76. package/skills/business/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
  77. package/skills/business/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
  78. package/skills/business/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
  79. package/skills/business/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
  80. package/skills/business/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
  81. package/skills/business/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
  82. package/skills/business/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
  83. package/skills/business/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
  84. package/skills/business/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
  85. package/skills/business/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
  86. package/skills/business/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
  87. package/skills/business/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
  88. package/skills/business/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
  89. package/skills/business/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
  90. package/skills/business/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
  91. package/skills/business/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
  92. package/skills/business/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
  93. package/skills/business/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
  94. package/skills/business/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
  95. package/skills/business/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
  96. package/skills/business/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
  97. package/skills/business/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
  98. package/skills/business/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
  99. package/skills/business/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
  100. package/skills/business/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
  101. package/skills/business/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
  102. package/skills/business/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
  103. package/skills/business/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
  104. package/skills/business/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
  105. package/skills/business/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
  106. package/skills/business/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
  107. package/skills/business/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
  108. package/skills/business/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
  109. package/skills/business/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
  110. package/skills/business/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
  111. package/skills/business/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
  112. package/skills/business/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
  113. package/skills/business/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
  114. package/skills/business/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
  115. package/skills/business/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
  116. package/skills/business/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
  117. package/skills/business/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
  118. package/skills/business/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
  119. package/skills/business/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
  120. package/skills/business/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
  121. package/skills/business/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
  122. package/skills/business/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
  123. package/skills/business/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
  124. package/skills/business/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
  125. package/skills/business/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
  126. package/skills/business/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
  127. package/skills/business/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
  128. package/skills/business/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
  129. package/skills/business/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
  130. package/skills/business/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
  131. package/skills/business/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
  132. package/skills/business/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
  133. package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
  134. package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
  135. package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
  136. package/skills/business/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
  137. package/skills/business/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
  138. package/skills/business/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
  139. package/skills/business/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
  140. package/skills/business/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
  141. package/skills/business/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
  142. package/skills/business/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
  143. package/skills/business/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
  144. package/skills/business/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
  145. package/skills/business/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
  146. package/skills/business/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
  147. package/skills/business/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
  148. package/skills/business/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
  149. package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
  150. package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
  151. package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
  152. package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
  153. package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
  154. package/skills/business/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
  155. package/skills/business/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
  156. package/skills/business/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
  157. package/skills/business/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
  158. package/skills/business/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
  159. package/skills/business/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
  160. package/skills/business/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
  161. package/skills/business/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
  162. package/skills/business/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
  163. package/skills/business/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
  164. package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
  165. package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
  166. package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
  167. package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
  168. package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
  169. package/skills/business/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
  170. package/skills/business/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
  171. package/skills/business/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
  172. package/skills/business/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
  173. package/skills/business/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
  174. package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
  175. package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
  176. package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
  177. package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
  178. package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
  179. package/skills/business/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
  180. package/skills/business/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
  181. package/skills/business/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
  182. package/skills/business/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
  183. package/skills/business/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
  184. package/skills/business/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
  185. package/skills/business/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
  186. package/skills/business/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
  187. package/skills/business/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
  188. package/skills/business/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
  189. package/skills/business/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
  190. package/skills/business/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
  191. package/skills/business/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
  192. package/skills/business/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
  193. package/skills/business/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
  194. package/skills/business/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
  195. package/skills/business/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
  196. package/skills/business/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
  197. package/skills/business/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
  198. package/skills/business/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
  199. package/skills/business/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
  200. package/skills/business/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
  201. package/skills/business/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
  202. package/skills/business/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
  203. package/skills/business/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
  204. package/skills/business/brag/assets/sfx/interface/bong_001.ogg +0 -0
  205. package/skills/business/brag/assets/sfx/interface/click_001.ogg +0 -0
  206. package/skills/business/brag/assets/sfx/interface/click_002.ogg +0 -0
  207. package/skills/business/brag/assets/sfx/interface/click_003.ogg +0 -0
  208. package/skills/business/brag/assets/sfx/interface/click_004.ogg +0 -0
  209. package/skills/business/brag/assets/sfx/interface/click_005.ogg +0 -0
  210. package/skills/business/brag/assets/sfx/interface/drop_001.ogg +0 -0
  211. package/skills/business/brag/assets/sfx/interface/drop_002.ogg +0 -0
  212. package/skills/business/brag/assets/sfx/interface/drop_003.ogg +0 -0
  213. package/skills/business/brag/assets/sfx/interface/error_005.ogg +0 -0
  214. package/skills/business/brag/assets/sfx/interface/error_006.ogg +0 -0
  215. package/skills/business/brag/assets/sfx/interface/glitch_002.ogg +0 -0
  216. package/skills/business/brag/assets/sfx/interface/glitch_004.ogg +0 -0
  217. package/skills/business/brag/assets/sfx/interface/select_008.ogg +0 -0
  218. package/skills/business/brag/assets/sfx/interface/switch_001.ogg +0 -0
  219. package/skills/business/brag/assets/sfx/interface/switch_002.ogg +0 -0
  220. package/skills/business/brag/assets/sfx/interface/switch_004.ogg +0 -0
  221. package/skills/business/brag/assets/sfx/interface/switch_005.ogg +0 -0
  222. package/skills/business/brag/assets/sfx/interface/switch_006.ogg +0 -0
  223. package/skills/business/brag/assets/sfx/interface/switch_007.ogg +0 -0
  224. package/skills/business/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
  225. package/skills/business/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
  226. package/skills/business/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
  227. package/skills/business/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
  228. package/skills/business/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
  229. package/skills/business/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
  230. package/skills/business/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
  231. package/skills/business/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
  232. package/skills/business/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
  233. package/skills/business/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
  234. package/skills/business/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
  235. package/skills/business/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
  236. package/skills/business/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
  237. package/skills/business/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
  238. package/skills/business/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
  239. package/skills/business/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
  240. package/skills/business/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
  241. package/skills/business/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
  242. package/skills/business/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
  243. package/skills/business/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
  244. package/skills/business/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
  245. package/skills/business/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
  246. package/skills/business/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
  247. package/skills/business/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
  248. package/skills/business/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
  249. package/skills/business/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
  250. package/skills/business/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
  251. package/skills/business/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
  252. package/skills/business/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
  253. package/skills/business/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
  254. package/skills/business/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
  255. package/skills/business/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
  256. package/skills/business/brag/assets/sfx/sfx-analysis.json +15584 -0
  257. package/skills/business/brag/assets/sfx/sfx-analysis.md +75 -0
  258. package/skills/business/brag/assets/sfx/ui/click1.ogg +0 -0
  259. package/skills/business/brag/assets/sfx/ui/click2.ogg +0 -0
  260. package/skills/business/brag/assets/sfx/ui/click3.ogg +0 -0
  261. package/skills/business/brag/assets/sfx/ui/click4.ogg +0 -0
  262. package/skills/business/brag/assets/sfx/ui/click5.ogg +0 -0
  263. package/skills/business/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
  264. package/skills/business/brag/assets/sfx/ui/rollover1.ogg +0 -0
  265. package/skills/business/brag/assets/sfx/ui/rollover2.ogg +0 -0
  266. package/skills/business/brag/assets/sfx/ui/rollover4.ogg +0 -0
  267. package/skills/business/brag/assets/sfx/ui/rollover5.ogg +0 -0
  268. package/skills/business/brag/assets/sfx/ui/switch1.ogg +0 -0
  269. package/skills/business/brag/assets/sfx/ui/switch10.ogg +0 -0
  270. package/skills/business/brag/assets/sfx/ui/switch11.ogg +0 -0
  271. package/skills/business/brag/assets/sfx/ui/switch12.ogg +0 -0
  272. package/skills/business/brag/assets/sfx/ui/switch13.ogg +0 -0
  273. package/skills/business/brag/assets/sfx/ui/switch14.ogg +0 -0
  274. package/skills/business/brag/assets/sfx/ui/switch15.ogg +0 -0
  275. package/skills/business/brag/assets/sfx/ui/switch16.ogg +0 -0
  276. package/skills/business/brag/assets/sfx/ui/switch17.ogg +0 -0
  277. package/skills/business/brag/assets/sfx/ui/switch18.ogg +0 -0
  278. package/skills/business/brag/assets/sfx/ui/switch19.ogg +0 -0
  279. package/skills/business/brag/assets/sfx/ui/switch2.ogg +0 -0
  280. package/skills/business/brag/assets/sfx/ui/switch20.ogg +0 -0
  281. package/skills/business/brag/assets/sfx/ui/switch21.ogg +0 -0
  282. package/skills/business/brag/assets/sfx/ui/switch22.ogg +0 -0
  283. package/skills/business/brag/assets/sfx/ui/switch23.ogg +0 -0
  284. package/skills/business/brag/assets/sfx/ui/switch24.ogg +0 -0
  285. package/skills/business/brag/assets/sfx/ui/switch25.ogg +0 -0
  286. package/skills/business/brag/assets/sfx/ui/switch26.ogg +0 -0
  287. package/skills/business/brag/assets/sfx/ui/switch27.ogg +0 -0
  288. package/skills/business/brag/assets/sfx/ui/switch28.ogg +0 -0
  289. package/skills/business/brag/assets/sfx/ui/switch29.ogg +0 -0
  290. package/skills/business/brag/assets/sfx/ui/switch3.ogg +0 -0
  291. package/skills/business/brag/assets/sfx/ui/switch30.ogg +0 -0
  292. package/skills/business/brag/assets/sfx/ui/switch31.ogg +0 -0
  293. package/skills/business/brag/assets/sfx/ui/switch32.ogg +0 -0
  294. package/skills/business/brag/assets/sfx/ui/switch33.ogg +0 -0
  295. package/skills/business/brag/assets/sfx/ui/switch34.ogg +0 -0
  296. package/skills/business/brag/assets/sfx/ui/switch35.ogg +0 -0
  297. package/skills/business/brag/assets/sfx/ui/switch36.ogg +0 -0
  298. package/skills/business/brag/assets/sfx/ui/switch37.ogg +0 -0
  299. package/skills/business/brag/assets/sfx/ui/switch38.ogg +0 -0
  300. package/skills/business/brag/assets/sfx/ui/switch4.ogg +0 -0
  301. package/skills/business/brag/assets/sfx/ui/switch5.ogg +0 -0
  302. package/skills/business/brag/assets/sfx/ui/switch6.ogg +0 -0
  303. package/skills/business/brag/assets/sfx/ui/switch7.ogg +0 -0
  304. package/skills/business/brag/assets/sfx/ui/switch8.ogg +0 -0
  305. package/skills/business/brag/assets/sfx/ui/switch9.ogg +0 -0
  306. package/skills/business/brag/references/audio.md +307 -0
  307. package/skills/business/brag/references/step-1-inspect.md +133 -0
  308. package/skills/business/brag/references/step-2-plan.md +234 -0
  309. package/skills/business/brag/references/step-3-compose.md +210 -0
  310. package/skills/business/brag/references/step-4-deliver.md +168 -0
  311. package/skills/business/brag/references/tones.md +231 -0
  312. package/skills/business/brag/scripts/analyze_music_cues.py +309 -0
  313. package/skills/business/brag/scripts/pyproject.toml +14 -0
  314. package/skills/business/brag/scripts/uv.lock +819 -0
  315. package/skills/business/copywriting/SKILL.md +178 -0
  316. package/skills/business/customer-research/SKILL.md +259 -0
  317. package/skills/business/freelancing/SKILL.md +679 -0
  318. package/skills/business/launch/SKILL.md +273 -0
  319. package/skills/business/marketing-psychology/SKILL.md +364 -0
  320. package/skills/business/pricing/SKILL.md +233 -0
  321. package/skills/business/resume-revamp-jake-ats/SKILL.md +64 -0
  322. package/skills/business/startup-founder/SKILL.md +400 -0
  323. package/skills/business/startup-founder/references/funding.md +48 -0
  324. package/skills/business/startup-founder/references/further-reading.md +132 -0
  325. package/skills/business/startup-founder/references/gtm-tools.md +57 -0
  326. package/skills/business/startup-founder/references/legal-india.md +36 -0
  327. package/skills/business/startup-founder/references/marketing/README.md +16 -0
  328. package/skills/business/startup-founder/references/marketing/cold-email.md +172 -0
  329. package/skills/business/startup-founder/references/marketing/competitors.md +245 -0
  330. package/skills/business/startup-founder/references/marketing/customer-research.md +276 -0
  331. package/skills/business/startup-founder/references/marketing/free-tools.md +168 -0
  332. package/skills/business/startup-founder/references/marketing/launch.md +343 -0
  333. package/skills/business/startup-founder/references/marketing/marketing-plan.md +270 -0
  334. package/skills/business/startup-founder/references/marketing/pricing.md +237 -0
  335. package/skills/business/startup-founder/references/marketing/product-marketing.md +250 -0
  336. package/skills/business/startup-founder/references/validation.md +267 -0
  337. package/skills/devops/deployments/SKILL.md +339 -0
  338. package/skills/devops/git-ci/SKILL.md +372 -0
  339. package/skills/devops/performance/SKILL.md +523 -0
  340. package/skills/devops/testing/SKILL.md +558 -0
  341. package/skills/engineering/code-review/SKILL.md +149 -0
  342. package/skills/engineering/coding-standards/SKILL.md +229 -0
  343. package/skills/engineering/product-engineering/SKILL.md +219 -0
  344. package/skills/engineering/senior-engineer-prompts/SKILL.md +145 -0
  345. package/skills/engineering/tdd-workflow/SKILL.md +178 -0
  346. package/skills/engineering/verification-loop/SKILL.md +199 -0
  347. package/skills/nerdev/nerdev-abstraction/SKILL.md +412 -0
  348. package/skills/nerdev/nerdev-docs/SKILL.md +527 -0
  349. package/skills/nerdev/nerdev-docs/templates/adr-template.md +39 -0
  350. package/skills/nerdev/nerdev-docs/templates/contributing-template.md +140 -0
  351. package/skills/nerdev/nerdev-docs/templates/deploy-template.md +426 -0
  352. package/skills/nerdev/nerdev-docs/templates/design-template.md +105 -0
  353. package/skills/nerdev/nerdev-docs/templates/incident-template.md +66 -0
  354. package/skills/nerdev/nerdev-monorepo/SKILL.md +522 -0
  355. package/skills/quality/output-skill/SKILL.md +49 -0
  356. package/skills/quality/unslop/SKILL.md +67 -0
  357. package/skills/ui/animaxxing/SKILL.md +58 -0
  358. package/skills/ui/animaxxing/agents/openai.yaml +7 -0
  359. package/skills/ui/animaxxing/references/effect-restoration.md +26 -0
  360. package/skills/ui/animaxxing/references/motion-vocabulary.md +142 -0
  361. package/skills/ui/animaxxing/references/recipes/blast-off.md +119 -0
  362. package/skills/ui/animaxxing/references/recipes/particle-effects.md +718 -0
  363. package/skills/ui/animaxxing/references/recipes/particle-field.md +428 -0
  364. package/skills/ui/animaxxing/references/recipes/route-letters.md +205 -0
  365. package/skills/ui/animaxxing/references/recipes/speak-in.md +181 -0
  366. package/skills/ui/animaxxing/references/recipes/split-entrances.md +345 -0
  367. package/skills/ui/animaxxing/references/recipes/wave.md +144 -0
  368. package/skills/ui/animaxxing/references/text-stability.md +68 -0
  369. package/skills/ui/animaxxing/references/verification.md +44 -0
  370. package/skills/ui/ask-animation/SKILL.md +178 -0
  371. package/skills/ui/ask-base-ui/SKILL.md +400 -0
  372. package/skills/ui/ask-cmdk/SKILL.md +315 -0
  373. package/skills/ui/ask-command-menu/SKILL.md +262 -0
  374. package/skills/ui/ask-drawer/SKILL.md +235 -0
  375. package/skills/ui/ask-form/SKILL.md +229 -0
  376. package/skills/ui/ask-gsap/SKILL.md +435 -0
  377. package/skills/ui/ask-modal/SKILL.md +145 -0
  378. package/skills/ui/ask-motion/SKILL.md +339 -0
  379. package/skills/ui/ask-rhf/SKILL.md +388 -0
  380. package/skills/ui/ask-sonner/API.md +64 -0
  381. package/skills/ui/ask-sonner/SKILL.md +88 -0
  382. package/skills/ui/ask-table/SKILL.md +253 -0
  383. package/skills/ui/ask-tanstack-table/SKILL.md +490 -0
  384. package/skills/ui/ask-toast/SKILL.md +163 -0
  385. package/skills/ui/ask-vaul/SKILL.md +291 -0
  386. package/skills/ui/ask-virtual-list/SKILL.md +304 -0
  387. package/skills/ui/ask-virtuoso/SKILL.md +332 -0
  388. package/skills/ui/email-craft/SKILL.md +258 -0
  389. package/skills/ui/frontend-craftsmanship/SKILL.md +462 -0
  390. package/skills/ui/gsap-astro/SKILL.md +56 -0
  391. package/skills/ui/gsap-astro/agents/openai.yaml +7 -0
  392. package/skills/ui/gsap-astro/references/client-router-navigation.md +139 -0
  393. package/skills/ui/gsap-astro/references/initialization.md +87 -0
  394. package/skills/ui/gsap-astro/references/motion-system.md +152 -0
  395. package/skills/ui/gsap-astro/references/scripts-and-islands.md +65 -0
  396. package/skills/ui/gsap-astro/references/verification.md +44 -0
  397. package/skills/ui/gsap-core/SKILL.md +254 -0
  398. package/skills/ui/gsap-frameworks/SKILL.md +266 -0
  399. package/skills/ui/gsap-nextjs/SKILL.md +51 -0
  400. package/skills/ui/gsap-nextjs/agents/openai.yaml +7 -0
  401. package/skills/ui/gsap-nextjs/references/app-router-navigation.md +189 -0
  402. package/skills/ui/gsap-nextjs/references/initialization.md +87 -0
  403. package/skills/ui/gsap-nextjs/references/motion-system.md +158 -0
  404. package/skills/ui/gsap-nextjs/references/verification.md +40 -0
  405. package/skills/ui/gsap-nuxt/SKILL.md +56 -0
  406. package/skills/ui/gsap-nuxt/agents/openai.yaml +7 -0
  407. package/skills/ui/gsap-nuxt/references/initialization.md +87 -0
  408. package/skills/ui/gsap-nuxt/references/motion-system.md +161 -0
  409. package/skills/ui/gsap-nuxt/references/navigation.md +145 -0
  410. package/skills/ui/gsap-nuxt/references/page-transitions.md +107 -0
  411. package/skills/ui/gsap-nuxt/references/verification.md +42 -0
  412. package/skills/ui/gsap-performance/SKILL.md +79 -0
  413. package/skills/ui/gsap-plugins/SKILL.md +433 -0
  414. package/skills/ui/gsap-react/SKILL.md +136 -0
  415. package/skills/ui/gsap-react-router/SKILL.md +55 -0
  416. package/skills/ui/gsap-react-router/agents/openai.yaml +7 -0
  417. package/skills/ui/gsap-react-router/references/initialization.md +87 -0
  418. package/skills/ui/gsap-react-router/references/motion-system.md +158 -0
  419. package/skills/ui/gsap-react-router/references/react-router-navigation.md +165 -0
  420. package/skills/ui/gsap-react-router/references/route-lifetime.md +74 -0
  421. package/skills/ui/gsap-react-router/references/verification.md +42 -0
  422. package/skills/ui/gsap-scrolltrigger/SKILL.md +296 -0
  423. package/skills/ui/gsap-sveltekit/SKILL.md +54 -0
  424. package/skills/ui/gsap-sveltekit/agents/openai.yaml +7 -0
  425. package/skills/ui/gsap-sveltekit/references/initialization.md +87 -0
  426. package/skills/ui/gsap-sveltekit/references/motion-system.md +156 -0
  427. package/skills/ui/gsap-sveltekit/references/page-lifetime.md +63 -0
  428. package/skills/ui/gsap-sveltekit/references/sveltekit-navigation.md +160 -0
  429. package/skills/ui/gsap-sveltekit/references/verification.md +41 -0
  430. package/skills/ui/gsap-tanstack-router/SKILL.md +56 -0
  431. package/skills/ui/gsap-tanstack-router/agents/openai.yaml +7 -0
  432. package/skills/ui/gsap-tanstack-router/references/initialization.md +87 -0
  433. package/skills/ui/gsap-tanstack-router/references/motion-system.md +160 -0
  434. package/skills/ui/gsap-tanstack-router/references/route-lifetime.md +66 -0
  435. package/skills/ui/gsap-tanstack-router/references/tanstack-navigation.md +156 -0
  436. package/skills/ui/gsap-tanstack-router/references/verification.md +41 -0
  437. package/skills/ui/gsap-timeline/SKILL.md +107 -0
  438. package/skills/ui/gsap-utils/SKILL.md +284 -0
  439. package/skills/ui/gsap-vanilla/SKILL.md +63 -0
  440. package/skills/ui/gsap-vanilla/agents/openai.yaml +7 -0
  441. package/skills/ui/gsap-vanilla/references/cross-document-navigation.md +54 -0
  442. package/skills/ui/gsap-vanilla/references/initialization.md +87 -0
  443. package/skills/ui/gsap-vanilla/references/motion-system.md +150 -0
  444. package/skills/ui/gsap-vanilla/references/page-load.md +96 -0
  445. package/skills/ui/gsap-vanilla/references/spa-navigation.md +70 -0
  446. package/skills/ui/gsap-vanilla/references/verification.md +41 -0
  447. package/skills/ui/house-style/SKILL.md +366 -0
  448. package/skills/ui/imagegen/SKILL.md +49 -0
  449. package/skills/ui/imagegen/references/brandkit.md +48 -0
  450. package/skills/ui/imagegen/references/image-to-code.md +56 -0
  451. package/skills/ui/imagegen/references/mobile.md +58 -0
  452. package/skills/ui/imagegen/references/web.md +63 -0
  453. package/skills/ui/impeccable/SKILL.md +116 -0
  454. package/skills/ui/impeccable/reference/adapt.md +318 -0
  455. package/skills/ui/impeccable/reference/adapt.native.md +58 -0
  456. package/skills/ui/impeccable/reference/android.md +46 -0
  457. package/skills/ui/impeccable/reference/animate.md +89 -0
  458. package/skills/ui/impeccable/reference/audit.md +137 -0
  459. package/skills/ui/impeccable/reference/audit.native.md +139 -0
  460. package/skills/ui/impeccable/reference/bolder.md +33 -0
  461. package/skills/ui/impeccable/reference/clarify.md +94 -0
  462. package/skills/ui/impeccable/reference/colorize.md +86 -0
  463. package/skills/ui/impeccable/reference/craft-floor.md +44 -0
  464. package/skills/ui/impeccable/reference/craft.md +5 -0
  465. package/skills/ui/impeccable/reference/critique.md +806 -0
  466. package/skills/ui/impeccable/reference/degraded/asset-producer.md +37 -0
  467. package/skills/ui/impeccable/reference/degraded/documenter.md +24 -0
  468. package/skills/ui/impeccable/reference/degraded/finish-reviewer.md +38 -0
  469. package/skills/ui/impeccable/reference/degraded/manual-edit-applier.md +92 -0
  470. package/skills/ui/impeccable/reference/delight.md +70 -0
  471. package/skills/ui/impeccable/reference/distill.md +111 -0
  472. package/skills/ui/impeccable/reference/doctor.md +54 -0
  473. package/skills/ui/impeccable/reference/document.md +416 -0
  474. package/skills/ui/impeccable/reference/extract.md +69 -0
  475. package/skills/ui/impeccable/reference/generate.md +101 -0
  476. package/skills/ui/impeccable/reference/harden.md +345 -0
  477. package/skills/ui/impeccable/reference/hooks.md +111 -0
  478. package/skills/ui/impeccable/reference/init.md +131 -0
  479. package/skills/ui/impeccable/reference/ios.md +51 -0
  480. package/skills/ui/impeccable/reference/layout.md +84 -0
  481. package/skills/ui/impeccable/reference/live-setup.md +104 -0
  482. package/skills/ui/impeccable/reference/live.md +325 -0
  483. package/skills/ui/impeccable/reference/new-work.md +145 -0
  484. package/skills/ui/impeccable/reference/onboard.md +234 -0
  485. package/skills/ui/impeccable/reference/operate.md +61 -0
  486. package/skills/ui/impeccable/reference/optimize.md +258 -0
  487. package/skills/ui/impeccable/reference/overdrive.md +127 -0
  488. package/skills/ui/impeccable/reference/polish.md +105 -0
  489. package/skills/ui/impeccable/reference/quieter.md +99 -0
  490. package/skills/ui/impeccable/reference/routing.md +24 -0
  491. package/skills/ui/impeccable/reference/shape.md +59 -0
  492. package/skills/ui/impeccable/reference/typeset.md +80 -0
  493. package/skills/ui/impeccable/reference/visualize.md +46 -0
  494. package/skills/ui/impeccable/scripts/VERSION +1 -0
  495. package/skills/ui/impeccable/scripts/command-metadata.json +98 -0
  496. package/skills/ui/impeccable/scripts/data/font-index-failures.json +121 -0
  497. package/skills/ui/impeccable/scripts/data/font-index.json +1 -0
  498. package/skills/ui/impeccable/scripts/impeccable +206 -0
  499. package/skills/ui/impeccable/scripts/impeccable.cmd +214 -0
  500. package/skills/ui/impeccable/scripts/live-browser-dom.js +167 -0
  501. package/skills/ui/impeccable/scripts/live-browser-ignores.js +242 -0
  502. package/skills/ui/impeccable/scripts/live-browser-session.js +144 -0
  503. package/skills/ui/impeccable/scripts/live-browser.js +13510 -0
  504. package/skills/ui/impeccable/scripts/modern-screenshot.umd.js +14 -0
  505. package/skills/ui/motion/SKILL.md +207 -0
  506. package/skills/ui/pick-ui-library/SKILL.md +85 -0
  507. package/skills/ui/product-messaging/SKILL.md +163 -0
  508. package/skills/ui/product-site/SKILL.md +465 -0
  509. package/skills/ui/prototype/PICKER.md +197 -0
  510. package/skills/ui/prototype/SKILL.md +98 -0
  511. package/skills/ui/refero-design/SKILL.md +534 -0
  512. package/skills/ui/refero-design/agents/openai.yaml +4 -0
  513. package/skills/ui/refero-design/references/anti-ai-slop.md +292 -0
  514. package/skills/ui/refero-design/references/color.md +563 -0
  515. package/skills/ui/refero-design/references/copywriting.md +222 -0
  516. package/skills/ui/refero-design/references/craft-details.md +525 -0
  517. package/skills/ui/refero-design/references/example-workflow.md +264 -0
  518. package/skills/ui/refero-design/references/icons.md +166 -0
  519. package/skills/ui/refero-design/references/mcp-tools.md +258 -0
  520. package/skills/ui/refero-design/references/motion.md +504 -0
  521. package/skills/ui/refero-design/references/typography.md +737 -0
  522. package/skills/ui/refero-design/references/visual-workflow.md +105 -0
  523. package/skills/ui/style-animaxxing/SKILL.md +48 -0
  524. package/skills/ui/style-animaxxing/agents/openai.yaml +7 -0
  525. package/skills/ui/style-animaxxing/references/motion-vocabulary.md +51 -0
  526. package/skills/ui/style-animaxxing/references/tokens.md +288 -0
  527. package/skills/ui/style-animaxxing/references/typography-and-layout.md +149 -0
  528. package/skills/ui/style-animaxxing/references/verification.md +38 -0
  529. package/skills/ui/typography-picker/SKILL.md +305 -0
  530. package/skills/ui/ui-core/SKILL.md +345 -0
  531. package/skills/ui/ui-core/references/accessibility.md +85 -0
  532. package/skills/ui/ui-core/references/build.md +666 -0
  533. package/skills/ui/ui-core/references/copy.md +70 -0
  534. package/skills/ui/ui-core/references/dark-mode.md +76 -0
  535. package/skills/ui/ui-core/references/direction.md +99 -0
  536. package/skills/ui/ui-core/references/redesign.md +74 -0
  537. package/skills/ui/ui-core/references/responsive.md +77 -0
  538. package/skills/ui/ui-core/references/styles.md +42 -0
  539. package/skills/ui/ui-core/references/system.md +190 -0
  540. package/skills/ui/ui-core/references/verify.md +37 -0
  541. package/skills/ui/ui-engineering/SKILL.md +436 -0
  542. package/skills/ui/ui-engineering/references/avatars.md +74 -0
  543. package/skills/ui/ui-engineering/references/card-patterns.md +66 -0
  544. package/skills/ui/ui-engineering/references/floating-actions.md +65 -0
  545. package/skills/ui/ui-engineering/references/navigation.md +81 -0
  546. package/skills/ui/ui-engineering/references/overlays.md +74 -0
  547. package/skills/ui/ui-engineering/references/pagination.md +71 -0
  548. package/skills/ui/ui-engineering/references/progress-indicators.md +77 -0
  549. package/skills/ui/ui-engineering/references/quality-bar.md +293 -0
  550. package/skills/ui/ui-engineering/references/search.md +68 -0
  551. package/skills/ui/ui-engineering/references/tailwind-architecture.md +81 -0
  552. package/skills/ui/ui-theme-picker/SKILL.md +522 -0
  553. package/skills/ui/ui-theme-picker/references/component-sources.md +223 -0
  554. package/skills/ui/ui-theme-picker/references/styles.md +298 -0
  555. package/skills/ui/vitepress-docs/SKILL.md +439 -0
  556. package/skills/ui/vitepress-docs/references/components.md +333 -0
  557. package/skills/ui/vitepress-docs/references/layout.md +128 -0
  558. package/skills/ui/vitepress-docs/references/tokens.md +87 -0
  559. package/skills/ui/vitepress-docs/references/typography.md +76 -0
  560. package/skills/workflow/careful/SKILL.md +48 -0
  561. package/skills/workflow/context-restore/SKILL.md +69 -0
  562. package/skills/workflow/context-save/SKILL.md +96 -0
  563. package/skills/workflow/health/SKILL.md +99 -0
  564. package/skills/workflow/learn/SKILL.md +95 -0
  565. package/skills/workflow/office-hours/SKILL.md +136 -0
  566. package/skills/workflow/ship/SKILL.md +95 -0
  567. package/vendor.json +80 -0
@@ -0,0 +1,87 @@
1
+ <!-- Generated from shared/initialization.md; run scripts/sync_initialization.py. -->
2
+
3
+ # Invisible intros, recovery, and first load
4
+
5
+ Read this whenever an entrance hides meaningful content. The matching framework skill owns initialization, navigation, recovery, and interruption. Motion recipes own teardown and restoration of their changes. Styles select the look and pacing only.
6
+
7
+ ## Keep the successful intro
8
+
9
+ Build readable, settled HTML and CSS first. Preserve invisible-to-visible entrances with a small early script and scoped pre-paint CSS:
10
+
11
+ ```css
12
+ html[data-motion-boot="pending"] [data-motion-owner][data-phase="initial"][data-intro],
13
+ html[data-motion-boot="pending"] [data-motion-owner][data-phase="initial"] [data-intro] {
14
+ visibility: hidden;
15
+ }
16
+ ```
17
+
18
+ Names are examples. Use separate attributes for boot status, motion preference, and lifecycle phase. Rename a `data-motion="js"` boot example if the app already uses `data-motion="full|reduced"` for preference. Opt in only targets intended to enter visibly, including hidden ancestors, shell, cards, and footer. Give independent owners their own readiness records. One ready page must not cancel a footer's protection.
19
+
20
+ - Run the marker before content can paint, using the framework's document integration and CSP nonce/hash support. Arm its recovery timer before setting the marker. It must work without GSAP or the application bundle. If the marker is blocked, content stays readable.
21
+ - Never emit the active marker in server HTML. JavaScript disabled means no marker and readable HTML. A `noscript` override alone does not cover JavaScript enabled with a failed bundle.
22
+ - Skip hiding under reduced motion. Preserve completion, focus, navigation, and removal semantics through the instant path.
23
+ - Before releasing CSS hiding, prepare all required start values and attach the entrance's completion/interruption handlers. Start the timeline in the same turn. Do not flip the phase early to claim readiness: that can flash settled content.
24
+ - Do not hide server content through unconditional CSS, inline styles, client-only wrappers, or a hidden ancestor that the fallback cannot restore.
25
+
26
+ ## Bound initialization, not choreography
27
+
28
+ Give each incoming owner an initialization deadline, measured from its first pre-paint hiding. Choose and document a short budget; roughly one second is a starting point, not a universal performance target.
29
+
30
+ The early timer covers bundle delivery and hydration. Register recovery before any setup work, including plugin registration, selectors, initial writes, and splits. Keep the deadline armed through required font/media preparation and timeline construction. Registration or a `live` flag is not readiness. Handing off timers must leave no unprotected interval and must not restart the budget.
31
+
32
+ A successful handoff occurs only when the prepared intro can run with its handlers attached. Cancel the initialization timer then. A deliberate hold or stagger inside that timeline belongs to animation duration, even if it exceeds the initialization budget. Handle runtime exceptions and interruptions separately; if a running timeline needs a watchdog, derive it from its planned duration, delay, repeats, and pause policy. Never cut a healthy intro short with the boot timer. Recheck deadlines on return from a suspended tab; timers cannot recover a blocked main thread.
33
+
34
+ Wait only for dependencies the effect needs. Bound font readiness, image load/decode, SplitText auto-split preparation, and frame waits. Prefer reserved image dimensions and a fallback font or unsplit heading over waiting for every font, image, or window `load`. A timed-out promise may still resolve: racing it does not cancel its continuation.
35
+
36
+ ## Recover one owner
37
+
38
+ Track an owner, a visit/generation token, and a terminal recovery decision outside disposable effect setup. Use boot status such as `pending`, `running`, `recovered`, `disposed` separately from the framework's lifecycle phases. A recovery is permanent for that visit; a genuine later navigation may create a new visit. Repeated setup is not a new visit.
39
+
40
+ On timeout, rejection, setup exception, or failed entrance:
41
+
42
+ 1. Verify the captured owner and generation are still current and intended to be visible. Invalidate the generation first. Mark it recovered so reentrant handlers cannot restart it.
43
+ 2. Abort preparation where supported. Cancel queued frames, timers, event listeners, observers, and subscriptions that can recreate motion. Kill owned timelines, delayed calls, triggers, and ambient effects before restoring content. Do not kill unrelated GSAP work globally.
44
+ 3. Run registered effect teardown in reverse order. Each builder must roll back partial changes if it throws before returning a handle. Continue other cleanup if one disposer throws; always reach the final readable fallback.
45
+ 4. Revert split wrappers, masks, cloned accessibility text, and plugin DOM changes. Preserve framework-owned nodes and nested links/controls; never overwrite their subtree with a stale HTML snapshot. SplitText revert can reconstruct descendants: split a dedicated text leaf or visual copy when controls, state, or framework bindings must survive. Restore only owned inline properties to their original values, then apply the owner's readable settled state. A marker removal or `autoAlpha: 1` alone cannot undo clipping, transforms, child opacity, or a hidden parent. Avoid `clearProps: "all"` on application-owned styles.
46
+ 5. Release only this owner's hiding, cover, busy/inert state, and navigation lock. Apply essential settled completion once, including appropriate focus and transition `done`. Do not replay decorative effects or call an outgoing navigation callback as entrance completion.
47
+
48
+ The bootstrap must retain a terminal recovery record even before the bundle arrives. With no application changes yet, it can release its CSS gate alone. Once setup starts, it must invoke the registered rollback as well. Releasing a shared document gate must not expose other still-preparing owners; use per-owner gates or transfer every owner's initial values before releasing it.
49
+
50
+ Every async continuation and controller entry point checks its captured token **before any DOM write or effect creation**, including `set`, `fromTo`, `onSplit`, resize/font callbacks, and `contextSafe` callbacks. Context ownership does not cancel promises. Catch failures inside those callbacks too. Late controller registration reads the terminal boot record and settles without hiding or splitting. Do not infer recovery only from an absent marker that navigation can later recreate.
51
+
52
+ On navigation, deactivate the outgoing owner's entrance recovery before the outro. Cancel stale work without revealing that owner. Recovery must exclude outgoing/end-state pages, cached hidden routes, closed dialogs, inactive tabs/panels, and decorative clones. Restore the outgoing page only if navigation itself is cancelled and that page becomes current again. Persistent shell elements keep separate visits. Dispose obsolete recovery timers on removal; never let them unlock or focus a newer route.
53
+
54
+ ## Rendering and indexing
55
+
56
+ Keep primary text, headings, and meaningful links in server-rendered or prerendered HTML where supported. Preserve real `a[href]` links and independently accessible route URLs. Client-only rendering cannot reveal HTML that was never sent; provide a useful static shell/fallback and report that limit. Do not turn an entire page client-only to facilitate animation.
57
+
58
+ Google renders JavaScript and uses rendered HTML for indexing. An automatic intro does not inherently prevent indexing; that is an inference from Google's rendering model, not a guarantee for a particular page. Check rendered output when indexing is in question. Static hiding rules alone do not establish production indexing failures. See [JavaScript SEO basics](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics).
59
+
60
+ Do not require a click, scroll, or hover to load primary indexable content. Keep primary hero media eagerly discoverable; reserve lazy loading for appropriate offscreen content. See [Google's lazy-loading guidance](https://developers.google.com/search/docs/crawling-indexing/javascript/lazy-loading).
61
+
62
+ ## First-load performance
63
+
64
+ Initially hidden primary content can delay Largest Contentful Paint. LCP concerns eligible visible content painted in the viewport, not the end of a GSAP timeline. A heading or hero may become a candidate before the remaining stagger, footer, or ambient animation completes. Browser eligibility and candidate changes matter; do not calculate LCP from total timeline duration. See [Largest Contentful Paint](https://web.dev/articles/lcp).
65
+
66
+ Reveal primary headings and hero imagery without waiting for unrelated plugins, particle setup, below-fold media, or every font weight. Keep ambitious motion where requested; reduce unnecessary preparation and deliberate blank holds before weakening the effect. Never serve crawler-specific content or use near-zero opacity tricks to manipulate metrics.
67
+
68
+ Measure cold first loads separately from client-side transitions. Record the LCP element and timestamp, resource timing, layout shift, and a filmstrip under representative network/CPU conditions. Compare normal and reduced motion; use field data when available. Smooth route transitions do not prove fast document loads. Better performance does not promise ranking or indexing outcomes. See [Google's page-experience guidance](https://developers.google.com/search/docs/appearance/page-experience).
69
+
70
+ ## Failure verification
71
+
72
+ Use the framework's production build and actual rendering mode. For every supported failure, assert meaningful text, usable links, restored owned styles/DOM, and absence of stale cover, lock, focus, or completion effects. Check page and shell owners separately.
73
+
74
+ | Case | Required observation |
75
+ |---|---|
76
+ | JavaScript disabled | Server/static content and native links work. Client-only routes get their documented static fallback, not invented SSR content. |
77
+ | Bundle blocked after marker | Prove the early marker executed; let its deadline expire. Content becomes readable without application cleanup. |
78
+ | Setup throws before initial writes | Readable settled state; no unresolved completion or navigation wait. |
79
+ | Setup throws after styles or split DOM | Timelines stop, original text/links return, temporary styles and masks disappear. |
80
+ | Fonts/media stall or reject | Bounded fallback. Resolve them afterward and confirm no new hiding or splitting. |
81
+ | Initialization arrives after recovery | Observe multiple frames after release and beyond the old timeline/deadline. No hidden frame or duplicate completion. |
82
+ | Successful delayed startup within budget | Hidden first frame, then full intended intro. No flash of settled content; intentional duration may exceed the boot budget. |
83
+ | Reduced motion | Readable first paint, functional links, normal completion semantics without travel. |
84
+ | Navigation during preparation or intro | One correct destination; stale recovery cannot reveal outgoing/hidden content or unlock/focus the new visit. |
85
+ | Repeated setup, history, and preserved nodes | No duplicate wrappers, listeners, callbacks, or replay after recovery within the same visit. |
86
+
87
+ Block only application resources in the bundle test, not the early script or stylesheet. Distinguish an intentionally delayed intro from stalled preparation. Record what ran, rendering limitations, and remaining browser/production gaps; these checks do not prove Google indexed the page or establish field LCP.
@@ -0,0 +1,158 @@
1
+ # Lifecycle implementation
2
+
3
+ Read this to implement the five phases for pages and components without layout shift.
4
+
5
+ ## The contract
6
+
7
+ **mount → initial state → intro → settled → outro → end state → unmount**
8
+
9
+ One controller owns a node from mount to unmount and exposes one current phase:
10
+
11
+ 1. **Initial state.** Mounted, final size reserved, measured, start values applied, not yet shown.
12
+ 2. **Intro.** One timeline from initial values to settled.
13
+ 3. **Settled.** Visible, stable, interactive, and controlled by normal CSS.
14
+ 4. **Outro.** Still mounted while one timeline moves it toward removal.
15
+ 5. **End state.** Still mounted, final values applied, completion run once. Safe to unmount.
16
+
17
+ The user's request defines how each phase looks. If it only describes an intro or outro, implement the other phases as the minimum needed to enter and leave cleanly.
18
+
19
+ Store the current phase in state, a ref, or a data attribute. Do not infer it from opacity, DOM presence, or timeline progress.
20
+
21
+ ## Setup and React lifecycle
22
+
23
+ Register GSAP and required plugins once. In framework mode, use a `*.client.ts` side-effect import from the root route. Components import `gsap` and `useGSAP` from the packages, never from that module: `.client` exports are undefined during SSR.
24
+
25
+ Use `useGSAP` in components:
26
+
27
+ - Pass a root ref as `scope`.
28
+ - Use refs for single targets and scoped selectors for repeated ones.
29
+ - Add dependencies only when the animation must rebuild. A page that must run its lifecycle again on a param change depends on `pathname` with `revertOnUpdate`. Do not depend on `location`, `navigation`, or `loaderData` objects, which change more often than the screen does.
30
+ - Wrap callbacks and event handlers that create GSAP work in `contextSafe`.
31
+ - Return a teardown for listeners and other non-GSAP resources.
32
+
33
+ Never run GSAP or plugin code during server rendering. Route modules are evaluated on the server in framework mode; keep every call inside `useGSAP`, an effect, or an event handler.
34
+
35
+ Do not call another component's `contextSafe` synchronously inside `useGSAP`: its context becomes a child and dies on the outer revert. Hand shared-controller work off through a microtask, effect, or event.
36
+
37
+ Write setup so it is correct when it runs more than once on the same node. React development checks do this, and a reused route runs its lifecycle again with its settled DOM intact. Async work started by the first run can still be in flight when the second run starts, so anything a setup triggers outside its own context, such as a shared cover, must be safe to request twice. So: explicit initial writes (`set` or `fromTo`) rather than `from` tweens that trust a fresh node, and cleanup that leaves the node readable. Use a ref guard only for work that should happen once per visit rather than once per setup.
38
+
39
+ ## Initial state
40
+
41
+ Build the final layout with normal CSS first. The initial state changes appearance, not layout. The element that owns geometry must exist before the animated node mounts.
42
+
43
+ - Mount content before measuring or animating it.
44
+ - Give images and media dimensions or an aspect ratio.
45
+ - Reserve async regions, including `<Suspense>` fallbacks around `<Await>`, with a wrapper when their size is known.
46
+ - Prefer transforms, `autoAlpha`, masks, or clipping, which keep the layout box.
47
+
48
+ If the effect changes width, height, or position:
49
+
50
+ - Animate a transform on an inner element while an outer wrapper holds the settled size.
51
+ - For a real expand or collapse, measure start and end sizes first, animate the wrapper, and decide how surrounding content moves.
52
+ - For layout-to-layout changes, use Flip: capture the old state, apply the new layout, animate.
53
+ - When old and new content share one region, reserve the parent and overlap the children so only the parent affects layout.
54
+
55
+ Content must stay readable without JavaScript. Any pre-paint hiding rule needs a no-script path.
56
+
57
+ ## Initialization and recovery
58
+
59
+ Apply the [initialization contract](initialization.md) whenever content starts hidden. It includes recovery ordering, indexing/performance limits, and failure checks.
60
+
61
+ - Framework SSR and prerendered paths use the root `Layout` early script and independent deadline. Inspect emitted HTML and hydrate without pre-hydration split DOM changes. See [SSR and first paint](route-lifetime.md#ssr-and-first-paint).
62
+ - SPA mode can send only the root shell and `HydrateFallback`; data/declarative client-only roots may send no page HTML. Test that actual fallback with scripts disabled/blocked. Apply initial writes before the first client commit paints, with rollback registered first.
63
+ - Store visit recovery in the persistent transition boundary, keyed by the accepted location/owner. Keep it across React effect replay; a location update, revalidation, or late `clientLoader` result must not restart a recovered visit. Guard every `useGSAP` callback and promise before writes.
64
+ - Invalidate the outgoing entrance when a blocker/link wrapper accepts navigation. Clean up on unmount and resolve the matching blocker/cover wait once. A stale timer cannot release a newer navigation, focus another route, or expose a pending outgoing tree.
65
+
66
+ ## Intro and settled
67
+
68
+ Write reusable intro and outro builders only when behavior repeats. Each returns a timeline so the controller can compose, kill, reverse, or await it.
69
+
70
+ - Make settled the source of truth. It must not depend on a paused timeline.
71
+ - Clear temporary transform, visibility, transition, and `will-change` styles once settled.
72
+ - Run intro completion and settled callbacks once, including under reduced motion.
73
+ - On rapid state changes, replace, kill, or reverse the active timeline. Do not stack conflicting tweens.
74
+ - Update assistive text and state immediately. Animate the visual, not the meaning.
75
+
76
+ ## Outro and end state
77
+
78
+ Start the outro from current rendered values. Keep the node mounted, laid out, and owned until the timeline completes.
79
+
80
+ - Reject duplicate outro requests or define which wins.
81
+ - If an intro is running, reverse it only when the outro is its exact inverse. Otherwise kill it and build the outro from current values.
82
+ - Disable pointer events when the visual can no longer support them, without removing the layout box.
83
+ - Run end-state work once. Only then unmount, replace, hide, call `proceed()`, or hand off.
84
+ - Kill the active timeline on cleanup, but do not erase state the route cover still needs.
85
+ - No `display: none`, conditional removal, or DOM replacement before the outro completes.
86
+
87
+ ## Conditional show and hide
88
+
89
+ React unmounts conditional content before an outro can play. Add a presence controller where that matters. It should:
90
+
91
+ - Mount into initial state before the intro.
92
+ - Stay mounted through settled and outro.
93
+ - Keep the active timeline.
94
+ - On re-show during an outro, reverse only if that gives the intended intro. Otherwise kill, set from current values, and build a fresh intro.
95
+ - Remove the node only after the end-state callback.
96
+ - Keep all five phases under reduced motion.
97
+
98
+ When content in a shared region changes size, decide who owns the region's geometry before mounting either child. Overlap old and new inside a reserved wrapper, or animate a measured wrapper between known sizes. Do not let unmount then mount push surrounding content twice.
99
+
100
+ Do not use presence for content that can simply appear, or for routes the transition boundary already manages.
101
+
102
+ - Focus a panel when its intro completes, not when it mounts. An element at `visibility: hidden` refuses focus silently, and `autoAlpha: 0` is exactly that. Reduced motion jumps to completion synchronously, so the focus still lands.
103
+ - When the outro ends and React is asked to unmount the children, clear only `will-change` from the wrapper. The unmount is queued, not immediate; clearing the collapsed height or visibility in the same tick flashes the content at full size for a frame.
104
+
105
+ A modal route is a presence controller with the router as its unmount. Its close plays the outro and only then calls `navigate(-1)` or navigates to the parent. The parent route underneath is reused, not remounted, so everything the modal changed outside itself (scroll lock, key listener, focus, header state) is undone in the effect teardown, which also runs on a `POP` the user made. Treat opening it as an overlay navigation: no outro on the page underneath, no cover, no lock.
106
+
107
+ ## Reduced and responsive motion
108
+
109
+ The OS preference is the default. Add an app override only if the product needs one.
110
+
111
+ Every effect needs initial, settled, and end states under reduced motion. Do not just shorten a disorienting effect. Skip travel, rotation, scale, parallax, and scrambling unless essential. A zero-duration timeline or an immediate `set` still fires completion for anything that depends on it, including the callback that calls `proceed()`.
112
+
113
+ Use `gsap.matchMedia()` for responsive and reduced-motion variants that must rebuild when conditions change. Revert it through the owning component. Do not nest a second GSAP context for the same setup.
114
+
115
+ An app-level override is not a media query, so `matchMedia` cannot see it. Read it in a shared `prefersReducedMotion()` helper that every timeline consults, mirror it as a root attribute so CSS can key on it, and for setups that live inside a `matchMedia` block either gate the block on the store through a hook dependency or accept that the block follows the OS alone and say so.
116
+
117
+ ## Scroll
118
+
119
+ Use `gsap-scrolltrigger` for the API; these rules cover route lifetime and measurement.
120
+
121
+ - Create triggers in document order. Refresh after fonts, images, streamed regions, or dynamic content change layout.
122
+ - Create triggers inside the owning context. Do not kill all triggers globally when one page leaves.
123
+ - `<ScrollRestoration>` applies its position in a layout effect at commit, before effects run. Create triggers after that and refresh once more when the page settles if anything above the trigger changed height during the intro.
124
+ - A `useGSAP` context revert calls `revert()` on each trigger with no arguments, which ScrollTrigger treats as `kill(true)`: the pin spacer is removed and the pinned element's original inline styles are restored. Leaving a route mid-pin needs no extra cleanup. `gsap.matchMedia()` created inside the same setup registers with that context and is reverted with it; it is not a second context for the same setup.
125
+ - A `will-change` written from an `onToggle` callback is outside the context and survives its revert. Write it as a plain style and undo it in the matchMedia cleanup, or write it before the trigger is created.
126
+
127
+ Under reduced motion, go straight from initial to settled without unnecessary triggers. Keep outro and end callbacks that control navigation or unmount.
128
+
129
+ ## Text
130
+
131
+ Use SplitText when the effect needs per-character, word, or line targets.
132
+
133
+ - For character splits, keep scoped `font-kerning: none; text-rendering: optimizeSpeed` before, during, and after revert, including reduced motion. Wrappers disrupt kerning and can cause horizontal snapping; use words/lines if natural kerning is essential. See [SplitText limitations](https://gsap.com/docs/v3/Plugins/SplitText/#tips--limitations).
134
+ - Apparent weight changes can be clipped ink: check computed fonts/readiness, then mask edges, punctuation, and descenders. For confirmed clipping, add scoped mask padding with compensating negative margins; verify spacing and both hidden endpoints before trying compositing workarounds.
135
+ - Keep reading accessible with the plugin's ARIA support. If text contains links or controls, keep an unsplit accessible version instead of hiding them.
136
+ - Use word-aware wrapping for character animation. Use auto re-split for line animation that must survive width or font changes.
137
+ - When line measurement needs fonts, bound the wait or auto-split preparation by the [initialization deadline](initialization.md#bound-initialization-not-choreography). Reserve settled height before splitting if wrappers could shift layout.
138
+ - Keep a handle to the split's animation so re-split and cleanup can dispose of it. With `autoSplit`, build the animation inside `onSplit` and return it: the plugin records its playhead before a re-split and restores it on the new lines, and `revert()` undoes the tween's values. With line splitting and `autoSplit`, the plugin waits for fonts itself; no separate font wait is needed.
139
+ - A split heading inside a page takes its timing from the page phase, not its own clock. Hold at initial while the page is initial, rise when the page enters, drop when it leaves. Give it its own pre-paint rule rather than marking it as a page target, or the page's stagger and the split's rise fight over one element.
140
+ - Revert splits on interruption and unmount. Do not leave wrapper spans in stale content.
141
+
142
+ Revert when the owning phase no longer needs the split. Compare glyph appearance, character positions, wrapping, and height immediately before/after cleanup at desktop/mobile widths, with reduced motion and interruption. Stable boxes alone do not prove stable ink; distinguish subpixel rounding from visible movement.
143
+
144
+ ## Interaction
145
+
146
+ Pointer motion needs keyboard parity. Pair hover with focus on interactive elements. Do not animate a non-interactive element like a control.
147
+
148
+ Keep gestures bounded, provide a non-gesture path, and dispose of interaction plugins with their owner. See `gsap-plugins` for Draggable, Observer, and Flip APIs.
149
+
150
+ ## Layout stability and performance
151
+
152
+ - Prefer `x`, `y`, scale, rotation, and `autoAlpha` over layout properties.
153
+ - Use `clip-path`, filters, and variable-font axes deliberately; they can cost paint or shift layout.
154
+ - Batch reads before writes.
155
+ - The stable wrapper's box should not jump between mount, initial, settled, outro, end, and unmount. Intentional transforms move pixels; layout boxes do not.
156
+ - Set `will-change` just before animating and clear it after. Do not promote everything.
157
+ - Do not animate hundreds of nodes at once. Reduce targets, batch, or virtualize.
158
+ - Do not add a CSS transition on a property GSAP controls.
@@ -0,0 +1,165 @@
1
+ # React Router navigation
2
+
3
+ Read this when changing route-level motion or navigation.
4
+
5
+ ## Router APIs
6
+
7
+ Check the installed types before using these. Minimum versions in parentheses; modes in brackets where an API is not in all three.
8
+
9
+ - `<Link to replace state preventScrollReset viewTransition reloadDocument mask onClick>`: a real `<a>`. Its `onClick` runs before the router's handler, and `event.preventDefault()` there cancels that one navigation while the `href`, prefetch handlers, and `discover` stay intact. `prefetch` and `discover` exist only in framework mode; `preventScrollReset` and `viewTransition` only in framework and data mode.
10
+ - `<NavLink>`: `Link` plus `isActive`, `isPending` [framework, data], and `isTransitioning` (only when the link sets `viewTransition`) as render props, and `active`, `pending`, `transitioning` classes.
11
+ - `useNavigate()`: `navigate(to, { replace, state, relative, preventScrollReset, viewTransition, flushSync, mask })` or `navigate(delta)`. In framework and data mode it returns a promise that resolves when the navigation completes; in declarative mode it returns nothing.
12
+ - `useBlocker(shouldBlock)` (6.19) [framework, data]: the only hold on a navigation. See below.
13
+ - `useNavigation()` [framework, data]: `state` is `idle`, `loading`, or `submitting`; `location` is the destination while pending; `formMethod`, `formAction`, and `formData` describe a submission. It does not expose `historyAction`.
14
+ - `useLocation()`: `pathname`, `search`, `hash`, `state`, `key`. `key` changes on every navigation, including one to the same URL, and is `default` on the first document load.
15
+ - `useNavigationType()`: `POP`, `PUSH`, or `REPLACE` for how the current location was reached.
16
+ - `useViewTransitionState(to)` (6.27) [framework, data]: true while a view transition runs and `to` matches either side of it by pathname.
17
+ - `<ScrollRestoration getKey>` [framework, data]: render once, before `<Scripts>`.
18
+ - `useBeforeUnload(cb)`: the document unload. It cannot be delayed.
19
+ - `<Form>` GET submissions, `<Navigate>`, and `redirect` from a loader or action are navigations. `useFetcher` is not: `navigation.state` stays `idle` and the fetcher carries its own `state`.
20
+
21
+ Keep `<Link>` for every internal link so `href`, prefetching, and `NavLink` state keep working. Wrap it in a project-local transition-aware Link only when the outro must start on click without a blocker.
22
+
23
+ ## Page lifecycle
24
+
25
+ **mount → initial state → intro → settled → outro → end state → unmount**
26
+
27
+ 1. **Initial state.** The incoming route has committed or been reused in place, its final size is reserved, measurements are taken, and start values are set before anything is shown.
28
+ 2. **Intro.** Reveal the route and play one timeline to the final layout.
29
+ 3. **Settled.** Clear temporary styles. CSS owns the page. Everything is interactive.
30
+ 4. **Outro.** The outgoing route stays mounted while the router waits on the blocker, or before the navigation is issued. Stop competing component animations and play one outro timeline.
31
+ 5. **End state.** Finalize outgoing targets and run completion once while still mounted. Call `proceed()` or `navigate`. The outgoing tree goes away when the incoming one commits.
32
+
33
+ A controller may track internal states like `waiting` or `preparing`, but they serve these five phases.
34
+
35
+ Store the phase in React state or a ref owned by the boundary and render it as a data attribute on the route container, so CSS and tests can read it.
36
+
37
+ ## Outro before navigation: the blocker
38
+
39
+ There is no leave hook. `useBlocker` takes a boolean or `({ currentLocation, nextLocation, historyAction }) => boolean` and returns a blocker with `state` (`unblocked`, `blocked`, `proceeding`), `location`, `proceed()`, and `reset()`.
40
+
41
+ - The router checks the blocker before it touches history or runs a loader. While blocked the URL is unchanged, nothing has been fetched, and the old route is live and interactive. This is where the outro runs.
42
+ - `proceed()` moves the blocker to `proceeding` and re-issues the same navigation with the same options: `replace`, `state`, `preventScrollReset`, `viewTransition`, `mask`. The router skips the blocker function while `proceeding`, so no app-side guard is needed. Every blocker returns to `unblocked` when the navigation completes. From 8.2 a revalidation no longer clears a blocked state.
43
+ - The pattern: return true for every non-`POP` navigation whose destination is a different screen; an effect on `blocker.state === "blocked"` starts the outro toward `blocker.location`; the end callback calls `proceed()`. Call `reset()` for a destination the design rejects, such as the current pathname.
44
+ - A router supports one blocker. Registering a second logs a warning and the last one wins, and a blocker inside a route component is deleted when that route unmounts. Register it once in the boundary that outlives every navigation.
45
+ - Not covered: the initial document load, hard reloads, cross-origin URLs, `reloadDocument` links, and document unload. Those are `gsap-vanilla` territory or cannot be delayed at all. A redirect returned by a loader or action happens inside a navigation that already passed the blocker; treat its destination as unrequested.
46
+ - `POP` is blockable but costly. The router restores the URL at once with a reverse `history.go`, which flashes the destination in the address bar, and `proceed()` repeats the pop after that restore. A pop onto history the router did not create cannot be blocked at all. Return false for `historyAction === "POP"` and give back and forward the intro-only path.
47
+ - Two rapid clicks: the second navigation runs the blocker function again. If it blocks, the blocker retargets: `blocker.location` and `proceed` now belong to the second destination and the hook returns a new object, so the effect runs again. Decide which wins. Last click wins by letting the outro keep running and calling the current blocker's `proceed` at end state. First click wins by capturing `proceed` when the outro starts and calling that one. That capture is safe because each `proceed` closes over its own destination and options and re-issues that navigation whatever `blocker.location` says by then. Never start a second outro.
48
+ - Do not gate the blocker function on your own lock. Returning `false` while an outro runs looks like "one navigation at a time" but does the opposite: the router runs the function for the second click, `false` lets that navigation proceed under the running outro, and the second destination wins. Keep returning `true` for every requested navigation and enforce the lock by choosing which `proceed` to call.
49
+ - Type the function as `BlockerFunction` when wrapping it in `useCallback`, or its destructured parameters lose their contextual type and fail strict type checks.
50
+ - The cost of the blocker path: loaders run only after `proceed()`, so the end state sits on screen until the destination loads. Set `prefetch="intent"` on links in framework mode so data and modules are already cached, and cover the route container from end state until the incoming route is prepared. `useNavigation().state` is `loading` across the gap and `location.key` changes at commit.
51
+
52
+ A killed timeline never resolves its promise. Wrap `await` in a helper that also resolves on `onInterrupt` and returns whether the timeline completed, so an interrupted outro still reaches `proceed()` or `reset()`. A blocked navigation whose outro never finishes leaves the app stuck on the old page with the link apparently dead.
53
+
54
+ GSAP's ticker stops in a hidden tab. Race the outro against a timeout so a click from a background tab still navigates.
55
+
56
+ ## Outro before navigation: the transition-aware Link
57
+
58
+ This works in every mode and is the only option in declarative mode. Wrap `<Link>` or `<NavLink>`, forward unrelated props, and pass an `onClick` that:
59
+
60
+ - Calls the caller's `onClick` first and stops if it prevented default.
61
+ - Leaves native the clicks the router itself leaves native: non-primary buttons, modifier keys, a `target` other than `_self`, external URLs, `reloadDocument`, and hash-only or same-location links.
62
+ - Calls `event.preventDefault()`, runs the outro on the live page, then calls `navigate(to, { replace, state, preventScrollReset, viewTransition, mask, relative })` with the Link's own props.
63
+
64
+ The `href`, prefetch handlers, `discover`, and `NavLink` state survive because the anchor is still React Router's. What is lost: the automatic `replace` when the URL is unchanged (compute it), `useTransitions` wrapping (call `navigate` inside `startTransition` and return its promise), and coverage: `<Form>`, `<Navigate>`, redirects, and `navigate` calls elsewhere bypass the wrapper. Add a navigate helper for buttons. If a blocker also exists, the re-issued `navigate` is a fresh navigation the blocker will see; gate the blocker function with a ref the helper sets before navigating and clears after.
65
+
66
+ A custom `<a>` built on `useLinkClickHandler` also works but drops prefetch, `discover`, and `NavLink` state. Use a document-level click listener only when replacing existing links is impractical; it is a retrofit, not the default.
67
+
68
+ The link path starts the outro on click and holds the URL like the blocker does, and has the same swap gap, since loaders run after the outro.
69
+
70
+ ## One navigation at a time
71
+
72
+ - Hold a lock from the first accepted destination through outro, cover, and commit. With a blocker the router retargets on a second click; without one the wrapper must ignore or record later clicks itself.
73
+ - Release the lock when the incoming intro starts, not when it ends: a click during the intro must kill the intro and start the outro from current values, and holding the lock through the intro leaves every link dead until it finishes.
74
+ - A `POP` during an outro is not blocked. Kill the outro so its promise settles, drop the pending destination, and let the history navigation take the intro-only path.
75
+ - Repeated clicks must not create competing navigations or timelines.
76
+
77
+ ## Two kinds of navigation
78
+
79
+ - **Requested** (a link the boundary intercepted, the navigate helper, a blocked `Link`, `Form`, or `navigate`): the full lifecycle. The outgoing page plays its outro on live DOM, the router loads, the incoming page prepares behind the cover and plays its intro.
80
+ - **Unrequested** (`POP`, redirects, `<Navigate>` and `navigate` calls that bypass the helper, a fetcher revalidation that replaces content): the tree changes without an outro. Run initial state and intro only, without travel. Keep the shell stable. Optionally give these a `viewTransition` crossfade so the swap is not a hard cut.
81
+
82
+ Do not keep a copy of the old React tree to fake an outro for unrequested navigation. Support fewer outro paths instead.
83
+
84
+ ## Back and forward
85
+
86
+ - `useNavigationType()` reports `POP` after commit. A blocker function sees `historyAction === "POP"` before it. Neither runs an outro.
87
+ - `<ScrollRestoration>` restores the saved position in a layout effect at commit. A page's `useGSAP` layout effect runs in the same commit, so write initial state there but defer the step from `initial` to `intro` by a microtask; the intro then starts after restoration. Refresh ScrollTrigger at the same point, and reveal-on-scroll targets above the restored position must not stay hidden.
88
+ - If the pair of pathnames was navigated with `viewTransition`, the router remembers it in session storage and replays the transition on the pop with the roles reversed. Design the intro-only path to look right under that crossfade or morph.
89
+ - A route reached by back that was reused rather than remounted still holds settled values. Write initial state explicitly.
90
+ - A bfcache restore runs no router code except re-enabling manual scroll restoration. Leave the page readable whenever it can be unloaded.
91
+
92
+ ## Overlapping the old and new page
93
+
94
+ The router renders one route tree. An effect that needs both on screen at once has two honest options:
95
+
96
+ - **The browser.** A `viewTransition` navigation snapshots both trees. `useViewTransitionState` or a class on the root gives the CSS the direction and the names.
97
+ - **A DOM snapshot.** After the outgoing page reaches end state and before `proceed()`, deep-clone the route container into a fixed layer: strip ids and every data attribute your lifecycle selects on, set `inert` and `aria-hidden`, position it at the container's document offset shifted by the scroll. Proceed with no cover. The incoming intro reveals the new page over the clone and removes it at settle, on a ready timeout, on `POP`, and at the start of any new navigation.
98
+
99
+ The clone is a static picture, not a React tree: nothing in it updates, nothing in it is reachable, and it is gone before the page is interactive.
100
+
101
+ ## The swap gap and initial state
102
+
103
+ Between end state and the incoming intro, the old page sits at end state while loaders run and then unmounts as the new one commits. Cover the route container during that gap, inside the element that wraps route content and never fixed to the viewport, or the header and footer flash on every click. Uncover only after every incoming target has its size and start styles.
104
+
105
+ The initial state must occupy the same layout as the settled state. Prefer `autoAlpha` and transforms. Size images, media, masks, and async regions before the intro. If the effect changes geometry, reserve the settled size with a wrapper or measure both states before writing either.
106
+
107
+ The route container owns geometry during the swap: hold a stable height while trees exchange, or animate it between measured sizes on purpose; reserve scrollbar space if route height changes would shift it.
108
+
109
+ Server-rendered and prerendered HTML paints before hydration. Do not hide it unconditionally. If initial state must hide before first paint:
110
+
111
+ - Put an inline script first in `body` in the root route's `Layout` export, which wraps the app, `HydrateFallback`, and `ErrorBoundary` alike, that marks `html` as JavaScript-active. Add `suppressHydrationWarning` to `html`, since the server HTML does not carry the attribute.
112
+ - Add a CSS rule that hides intro targets only under that mark and only while the root is in its initial phase.
113
+ - Skip the mark under `prefers-reduced-motion` so the page paints settled.
114
+ - Keep the early failsafe active until preparation succeeds and the intro can run, not merely until a controller registers. Register rollback before setup, preserve the original deadline, and take the settled path after recovery. Follow [Initialization and recovery](initialization.md).
115
+ - Register rollback before setup. Advance the phase only after start values and completion handlers are ready, in the same turn that starts the intro.
116
+ - Keep content readable without JavaScript. Omitting `<Scripts>` is React Router's no-JavaScript mode, and the page must still read there.
117
+ - Keep the swap cover separate from the first-paint rule.
118
+
119
+ `ssr: false`, data mode, and declarative mode without server rendering paint nothing before React. `useGSAP` runs in a layout effect on the client, so explicit `set` calls there land before the first paint and no pre-paint rule is needed. A `HydrateFallback` is a skeleton that appears only on the initial load; give it the settled geometry and let the route enter through the unrequested path when its data lands.
120
+
121
+ Do not rely only on inline styles: a context revert clears them during a swap. The cover must survive cleanup until the new tree is ready.
122
+
123
+ ## Pending state, loaders, and streaming
124
+
125
+ - The router awaits loaders before rendering the next route, so during `loading` the outgoing page is mounted and interactive. Pending UI belongs there: a global indicator from `useNavigation().location`, or `isPending` on the `NavLink` that was clicked. Do not start the outro from `navigation.state`; by then the navigation is already committed to happen.
126
+ - A promise returned un-awaited from a loader streams. `<Await>` inside `<Suspense>`, or React 19 `use`, renders it when it lands, and after `streamTimeout` it rejects. Treat each streamed region as a component with its own controller: explicit initial state on arrival, a short intro, settled, cleanup. Reserve its block size so arrival moves nothing. Query outro targets when the outro is built, not at setup, so content that streamed in after setup leaves with the page.
127
+ - `clientLoader` runs in the browser on navigation and, with `hydrate`, on the initial load behind `HydrateFallback`. Neither changes the lifecycle; the route still commits once its data is ready.
128
+
129
+ ## Settled state, focus, and scroll
130
+
131
+ On intro completion, mark settled once, clear temporary transforms, visibility, and `will-change`, and do not keep the page inside an active timeline to hold values.
132
+
133
+ - React Router moves no focus and announces nothing on a route change. If navigation left focus on `body`, move it to the route container or main heading after the intro, with `tabIndex={-1}` and a visible focus style. Do not steal focus from an active control. Add a live region if the product needs announcements.
134
+ - `<ScrollRestoration>` runs in a layout effect at commit: a saved position on `POP`, the hash target when there is one, nothing when `preventScrollReset` was set, otherwise the top. Submissions and revalidations leave scroll alone. It keys on `location.key` by default; `getKey` with `pathname` restores across repeat visits to the same path.
135
+ - Keep that behavior. Do not add a second scroll reset unless the product needs it. Refresh ScrollTrigger after restoration, and after the intro if anything above a trigger changed height.
136
+ - Pass `preventScrollReset` through the transition-aware Link and helper; `proceed()` already carries it.
137
+
138
+ ## Combining with View Transitions
139
+
140
+ Set `viewTransition` on the Link, Form, or `navigate` call. `HydratedRouter` supports it; in data mode `RouterProvider` must come from `react-router/dom`, which wires `flushSync`, or `useViewTransitionState` throws. The router calls `document.startViewTransition` around the state update at commit and records the pathname pair so a later pop replays it. GSAP runs before it, outro on live DOM before `proceed()`, and after it, intro on the new tree once the transition finishes. Keep their jobs separate:
141
+
142
+ - One engine per element per transition. A named morph and a GSAP tween on the same node fight, and a GSAP end state becomes the old snapshot. Leave a shared element lit at end state or skip the view transition for that navigation.
143
+ - Name only elements that morph. `useViewTransitionState(to)` and the `NavLink` `isTransitioning` render prop are true only while that pair transitions, so use them to set `viewTransitionName` and clear it after.
144
+ - The router does not expose the `ViewTransition` object. `useViewTransitionState` returns to false when the transition finishes; start GSAP on elements the browser touched from an effect on that flip, or keep them out of the intro.
145
+ - A new navigation during a transition skips the active one and starts another. The GSAP lock must survive that.
146
+ - `proceed()` keeps `viewTransition`, so the blocker path and the browser path compose: GSAP outro, then proceed, then the browser morphs at commit.
147
+ - Add `::view-transition { pointer-events: none }` so a running transition does not swallow clicks.
148
+ - Where `startViewTransition` is missing the router updates plainly. Every GSAP path must run without it.
149
+ - Reduced motion covers both: zero view transition durations in CSS and take the GSAP reduced path.
150
+
151
+ ## Cases to design for
152
+
153
+ - Navigation requested mid-intro.
154
+ - Two destinations clicked quickly, with the blocker retargeting.
155
+ - Back or forward with no outro, including mid-outro.
156
+ - A route reused with new params, and a search-param-only change.
157
+ - A `Form` GET, `<Navigate>`, or `navigate` call that bypasses the wrapper.
158
+ - A hash-only link, which is same-page.
159
+ - A redirect from a loader or action.
160
+ - An external link, a `reloadDocument` link, and a document unload.
161
+ - Split text or scroll plugins that changed the DOM before cleanup.
162
+ - Streamed data arriving after the intro.
163
+ - React development double-mounting the boundary.
164
+
165
+ Each case must end on one visible, interactive route with stable layout and no stale inline styles.
@@ -0,0 +1,74 @@
1
+ # Route lifetime
2
+
3
+ Read this to know which router you have, when a route mounts, updates in place, or unmounts, and how server rendering changes the first paint.
4
+
5
+ ## Modes
6
+
7
+ Three top-level APIs, each adding features to the last. Check which one the project uses before reaching for a hook.
8
+
9
+ - **Declarative**: `<BrowserRouter>` with `<Routes>` and `<Route>`. `Link`, `NavLink`, `useNavigate` (returns nothing), `useLocation`, `useNavigationType`, `useLinkClickHandler`, `useBeforeUnload`. No loaders, no `useNavigation`, no `useBlocker`, no `viewTransition`, no `<ScrollRestoration>`. The transition-aware Link is the only way to run an outro before navigation, and the browser's own scroll restoration applies.
10
+ - **Data**: `createBrowserRouter` with `<RouterProvider>` from `react-router/dom`. Adds `loader`, `action`, `useNavigation`, `useBlocker`, `useFetcher`, `<Await>`, `<ScrollRestoration>`, `viewTransition`, `preventScrollReset`. No server rendering unless the project built its own.
11
+ - **Framework**: the Vite plugin, `routes.ts`, route modules with `loader`, `clientLoader`, `HydrateFallback`, `Layout`, `links`, `meta`, and `<HydratedRouter>` in `entry.client.tsx`. Adds `<Link prefetch discover>`, `<Links>`, `<Scripts>`, `middleware`, SSR by default, `prerender`, and SPA mode through `ssr: false`.
12
+
13
+ A Remix 2 app is framework mode with `@remix-run/react` names. A React Router 6.4+ data router is data mode with `unstable_` prefixes on older versions.
14
+
15
+ ## Reuse versus remount
16
+
17
+ The router renders matched routes as nested elements through `<Outlet>`. React reconciles by type and position, so a navigation swaps only the levels whose route changed.
18
+
19
+ - Same route, new params or search params: the route element stays mounted. `params` and `loaderData` change; `useGSAP` with no dependencies does not run again. Neither does a mount intro.
20
+ - Different route under the same layouts: the leaf unmounts and the new one mounts. Shared layouts stay, with their state, timelines, and listeners.
21
+ - The root route persists for the life of the document. Under `Layout`, switching between the app, `HydrateFallback`, and `ErrorBoundary` keeps the document shell mounted.
22
+ - A revalidation reruns loaders and updates props. Nothing remounts.
23
+
24
+ So a page intro tied to mount plays once per mount, not once per visit. Two fixes:
25
+
26
+ - **A `pathname` dependency in the page, the default for GSAP.** Give `useGSAP` `dependencies: [pathname]` and `revertOnUpdate: true`, or run the lifecycle from an effect keyed on `useLocation().pathname`. The page keeps its state, scroll, and form values, and the DOM already holds settled values, so kill the previous timeline first and write initial state with `set` or `fromTo`, never a `from` tween that trusts a fresh node. Compare pathnames, adding params only when they mean a different screen, and skip search-only changes.
27
+ - **`<Outlet key={location.pathname} />` in the layout.** Every pathname change destroys and recreates the subtree, so mount intros replay and page state is discarded. Key on `location.key` to remount on every navigation including the same URL. Use it when the page must be re-instantiated anyway. It also discards inner scroll positions and pending fetchers in the subtree.
28
+
29
+ Do not key the root route or a layout that holds chrome on `location`. That remounts the shell and its chrome on every navigation.
30
+
31
+ ## Layouts, Outlet, and the boundary
32
+
33
+ The root route mounts once per document and outlives every client-side navigation. That makes it the home of the route transition boundary: one stable route container around `<Outlet>`, the blocker, the phase, and the cover. When only part of the screen transitions, put the boundary in the layout route that wraps that part; its `<Outlet>` is the changing region and everything above it persists.
34
+
35
+ Pages register intro and outro builders with the boundary through context and unregister in their teardown. The boundary calls the outgoing page's outro when the blocker blocks or the wrapper intercepts, and the incoming page's intro when the new `location.key` commits and its targets are ready. A page that registers nothing gets the container-level default.
36
+
37
+ The outro belongs to the leaving leaf, not the layout. A layout that stays mounted has nothing to leave; a layout that also unmounts, because the navigation crosses out of it, leaves with its leaf and should register its own outro if it has one.
38
+
39
+ ## React lifecycle for GSAP
40
+
41
+ `gsap-react` covers `useGSAP`, `scope`, `contextSafe`, and cleanup. Points that matter under a router:
42
+
43
+ - Effects run after commit. `useGSAP` uses a layout effect on the client, so initial `set` calls inside it land before paint on a client-rendered tree. On a server-rendered tree the HTML has already painted; see [SSR and first paint](#ssr-and-first-paint).
44
+ - React development runs setup, cleanup, and setup again on the same node. Write setup that is correct twice: explicit initial writes, cleanup that leaves the node readable, and a ref guard for work that should happen once per visit.
45
+ - Reading `useLocation()`, `useNavigation()`, or `loaderData` inside a `useGSAP` with those as dependencies rebuilds the context on every change, including search-param and pending-state changes. Depend on `pathname` alone, or read the rest through refs.
46
+ - Store the phase in state or a ref and render it as a data attribute. Do not infer it from opacity or DOM presence.
47
+ - Never call another component's `contextSafe` function synchronously from inside a `useGSAP` callback; the inner context becomes a child of the outer one and dies with its next revert. Hand off through a microtask, an effect, or an event.
48
+
49
+ ## SSR and first paint
50
+
51
+ - Framework mode with `ssr: true`, the default, and any `prerender` path send full HTML. The page paints before hydration and before any effect. Hiding intro targets is only sanctioned through the root-attribute rule in [The swap gap and initial state](react-router-navigation.md#the-swap-gap-and-initial-state): an inline script first in `body` in the root `Layout`, `suppressHydrationWarning` on `html`, a no-JavaScript path, and a reduced-motion skip.
52
+ - Route modules are evaluated on the server. Importing GSAP is harmless; calling it is not. Keep registration in a `*.client.ts` module imported for its side effect from the root route, and every GSAP call inside `useGSAP`, an effect, or an event handler. Do not re-export `gsap` or `useGSAP` from the `.client` module: its exports are `undefined` on the server, so a component that imports the hook from there throws during server rendering. Import both from the packages.
53
+ - `ssr: false` prerenders only the root route and its `HydrateFallback` into `index.html`. Route content renders after hydration, so it can wait for mount and needs no pre-paint rule. The root shell still paints early; keep chrome motion out of it or treat the shell like a server-rendered page.
54
+ - `HydrateFallback` shows only on the initial document load while a `clientLoader` with `hydrate` runs or a route has no server loader. It never appears on client navigation. Give it the settled geometry so hydration moves nothing.
55
+ - Data and declarative mode without a server render paint nothing until React commits, so mount, `set`, then paint holds without any rule.
56
+ - `<Scripts>` omitted is the no-JavaScript build. Everything must read there.
57
+
58
+ ## Conditional content and modals
59
+
60
+ React removes conditional content synchronously. For GSAP-driven show and hide, keep the node mounted with a presence controller: render while `visible || leaving`, play the outro, and clear `leaving` from the end callback. See [Conditional show and hide](motion-system.md#conditional-show-and-hide).
61
+
62
+ A modal opened by a route is a presence controller with the router as its unmount. Common shapes:
63
+
64
+ - A nested route rendered into the parent's `<Outlet>`, so the parent stays mounted underneath. Close by playing the outro, then `navigate(-1)` or `navigate` to the parent path. The parent's own intro must not replay: the parent is reused, and the boundary should recognize the modal path as an overlay navigation with no outro, no cover, and no lock.
65
+ - A `Link mask` (7.15) that shows one URL while routing to another, for a gallery that opens a detail in place. The underlying route stays; the modal is conditional content keyed on the real location.
66
+
67
+ Undo scroll locks, key listeners, and focus in the modal's effect teardown, which also covers a `POP` you did not initiate. A blocker in the modal is deleted when it unmounts; do not put the page blocker there.
68
+
69
+ ## Fetchers, revalidation, and middleware
70
+
71
+ - `useFetcher` loads or submits without a navigation. `navigation.state` stays `idle`, `useBlocker` never fires, and a `Form` submission through a fetcher does not leave the page. Content a fetcher replaces is a component lifecycle, not a page one.
72
+ - A navigation `Form` POST is a navigation with `state === "submitting"`, then `loading` while loaders revalidate, then a commit that may be a redirect. The outgoing page is still mounted through all of it. Block it like a link if the design wants an outro; the blocker sees `nextLocation` and the submission.
73
+ - Revalidation after an action reruns every active loader and updates props in place. Nothing remounts and no outro runs. Regions whose content changes are components; give them explicit initial state on new data and keep their block size.
74
+ - `middleware` and `clientMiddleware` (7.9 behind `future.v8_middleware`, always on in 8) run around loaders and actions inside the data phase of a navigation. They can redirect or set context; they cannot hold the DOM or wait for an animation. They are not a transition hook.
@@ -0,0 +1,42 @@
1
+ # Verification
2
+
3
+ Check in proportion to what changed. Do not turn a focused animation task into a full audit.
4
+
5
+ ## Always
6
+
7
+ - Run the repo's type, lint, format, and test commands where they exist. In framework mode run `react-router typegen` before `tsc` if the project's typecheck script does not already, so route types are current.
8
+ - Confirm settled content is visible, interactive, and free of leftover GSAP inline styles.
9
+ - Confirm timelines, triggers, listeners, and plugin DOM changes are cleaned up.
10
+ - Test reduced motion when the change has a reduced-motion branch, including that `proceed()` still runs.
11
+
12
+ ## Initially hidden content
13
+
14
+ Run the [failure verification matrix](initialization.md#failure-verification) when adding or changing hiding, preparation, or recovery. It covers disabled JavaScript, a blocked bundle after the marker, throws before/after styles and splits, stalled fonts/media, late initialization, no-flash success, reduced motion, and interruption/repeated setup. Assert text and native links, not opacity alone. Include shell/footer and intentionally hidden content.
15
+
16
+ Use this framework's [integration rules](motion-system.md#initialization-and-recovery) for rendering and navigation expectations. Measure document-load LCP separately from transitions when first-load behavior changes; report measured results and untested paths.
17
+
18
+ ## Runtime changes
19
+
20
+ Check the changed lifecycle in a real browser when practical:
21
+
22
+ - Initial state is applied before reveal, including on a server-rendered or prerendered first load.
23
+ - Intro ends in one settled state.
24
+ - Outro keeps the route mounted until completion runs, and the URL does not change until then.
25
+ - Rapid or interrupted input ends in one coherent state.
26
+ - Layout boxes do not jump.
27
+
28
+ For route navigation, test the paths the change affects: an ordinary internal link, a link to the same route with new params, back and forward, and a rapid double navigation. Confirm URL, visible route, focus, history, and scroll agree. Confirm that no blocker is left in a `blocked` state with the page apparently dead, and that a `Form`, `<Navigate>`, or `navigate` call that bypasses the wrapper still lands on a readable page.
29
+
30
+ When both `viewTransition` and GSAP are involved, confirm no element is animated by both, that a pop replaying a recorded transition still looks right, and that clicks land during a running transition.
31
+
32
+ For streamed regions, throttle the network so `<Await>` resolves after the page intro and confirm the region enters on its own and leaves with the page.
33
+
34
+ For conditional components and modal routes, test show, hide, one interruption, and a `POP` close. Confirm unmount happens after the outro.
35
+
36
+ Use visibility-aware selectors in browser tests, such as role queries or an explicit visible filter, since a covered or `inert` route is still in the DOM.
37
+
38
+ ## Builds and wider checks
39
+
40
+ Run a production build for changes to routes, `react-router.config.ts`, dependencies, server and client boundaries, `.client` modules, or anything release-facing. In framework mode the server build evaluates route modules; a GSAP call outside an effect fails there, not in dev. Run wider browser, accessibility, responsive, streaming, and performance checks only when the change touches them or the user asks for a full audit.
41
+
42
+ Report which checks ran and which could not. Do not claim runtime behavior was verified when only static review was possible.