@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,145 @@
1
+ # Navigation
2
+
3
+ Read this when changing how pages live and die: keys, keepalive, Nuxt app hooks, scroll, focus, links, history, View Transitions, and SSR.
4
+
5
+ ## Page lifecycle
6
+
7
+ **mount → initial state → intro → settled → outro → end state → unmount**
8
+
9
+ On a Nuxt route change with GSAP in the transition hooks:
10
+
11
+ 1. **Navigation.** A `<NuxtLink>` click or `navigateTo`. `page:loading:start`, route middleware, guards, the page chunk (usually prefetched), `beforeResolve`, commit. The old page is untouched.
12
+ 2. **Incoming setup.** `<NuxtPage>` renders the new page under Suspense: `page:start`, then its setup and data run off-screen. The old page stays visible and interactive.
13
+ 3. **Outro.** Suspense resolves: `page:finish`, then `page:loading:end`. Vue unmounts the old page component and hands its root to `onBeforeLeave` and `onLeave`. Under `out-in` the new root waits; without `mode` it is inserted now.
14
+ 4. **End state.** The outro's `done`. Vue removes the old root; `onAfterLeave` and `page:transition:finish` fire; Nuxt scrolls one frame later.
15
+ 5. **Initial state and intro.** `onBeforeEnter` before insertion, `onEnter` after, the page's `onMounted` in the same flush. Write start values, then play.
16
+ 6. **Settled.** The intro's `done`, then `onAfterEnter`. Clear temporary styles. CSS owns the page.
17
+
18
+ One navigation at a time is Vue Router's job: a new navigation cancels a pending one, and Nuxt remounts the Suspense. Your job is that every hook call ends in `done` and every timeline can be killed.
19
+
20
+ ## When a page is reused versus remounted
21
+
22
+ `<NuxtPage>` keys the page on the `pageKey` prop, else `definePageMeta({ key })`, else the matched route path with params filled in. So:
23
+
24
+ - `/posts/1` to `/posts/2` changes the key: remount, full transition, `page:start` and `page:finish`.
25
+ - Query or hash changes keep the key: the component is reused, no transition, no `page:start`. `page:loading:start` and `page:loading:end` still fire. Animate in place from `onBeforeRouteUpdate` or a `watch` on the route.
26
+ - `key: route => route.fullPath` remounts on query changes too. Use it only when a query means a different screen.
27
+ - `key: 'static'` or `<NuxtPage page-key="static">` never remounts across params. Param changes become in-page updates and the hooks never run.
28
+ - Hash-only links are same-page. Leave them native; Nuxt scrolls to the target with the router's `scrollBehaviorType`.
29
+
30
+ Nuxt's own test for "this navigation changes the page" is the same: the key differs or the matched components differ. View transitions and scroll use it.
31
+
32
+ ## Route lifetime under keepalive
33
+
34
+ `definePageMeta({ keepalive: true })`, `<NuxtPage keepalive>`, or `app.keepalive` wraps pages in `<KeepAlive>`. A page is then deactivated instead of unmounted and reactivated instead of remounted. DOM and state survive; the lifecycle does not.
35
+
36
+ - **Deactivate is unmount.** `onDeactivated` fires when the leave starts. Revert the page's context there. The root still plays `onLeave`, then moves to KeepAlive's off-document storage.
37
+ - **Stored pages measure zero.** Do not create or refresh ScrollTrigger, Flip, or split instances while deactivated.
38
+ - **Activate is mount.** `onActivated` fires after the root is inserted, and also once after `onMounted` on first mount. Setup runs again on DOM that holds settled or half-reverted values. Write initial state explicitly with `set` or `fromTo`; a `from` tween that trusts a fresh node is wrong. `onMounted` does not run again.
39
+ - **The hooks run the same.** `onBeforeEnter` and `onEnter` fire on reactivation with the stored root as `el`; `onLeave` fires on deactivation.
40
+ - **Cached pages leak.** Scope page-level CSS variables, `overflow` locks, and `will-change` to the page root, or undo them in `onDeactivated`.
41
+ - `include` and `exclude` match component names. Under `future.compatibilityVersion: 5` page component names are normalized to route names.
42
+
43
+ Without keepalive the page unmounts at leave start. Design for the keepalive case anyway; it costs nothing when unmount happens.
44
+
45
+ ## Nuxt app hooks
46
+
47
+ Register with `useNuxtApp().hook(name, fn)` in a plugin, or `useRuntimeHook` (3.14+) in a component so it unregisters with the scope. In navigation order:
48
+
49
+ - `page:loading:start`: in `router.beforeEach`, before middleware. Also when the `pageKey` prop changes. Fires for query-only changes and for navigations that later fail.
50
+ - `page:start`: the incoming page's Suspense went pending. Its setup and data are running; the old page is on screen.
51
+ - `page:finish`: that Suspense resolved. This is when the leave starts, not the end of the transition.
52
+ - `page:loading:end`: after `page:finish`, or on navigation failure or router error. Pair with `page:loading:start` for a global navigating state, lock, or cover.
53
+ - `page:transition:finish`: the outgoing page's `onAfterLeave`. Under `out-in` the new root has just been inserted and its `onEnter` has not run yet.
54
+ - `page:view-transition:start`: only with `experimental.viewTransition`; passes the `ViewTransition`.
55
+ - `app:suspense:resolve`: the root Suspense resolved on the client, the first-load counterpart of `page:finish`. `app:mounted` fires earlier, when `mount()` returns.
56
+ - `link:prefetch`: a `<NuxtLink>` is about to prefetch.
57
+
58
+ Use these for app-level state: cover, lock, loading indicator, analytics, announcing. Use the transition hooks for anything that touches the page's elements. For work after the intro, `onAfterEnter` is the only hook that fires then.
59
+
60
+ ## Scroll and focus
61
+
62
+ Nuxt's default `scrollBehavior` (override it in `app/router.options.ts`) waits for `page:loading:end`, then for the outgoing leave to finish, then one animation frame, then scrolls: `savedPosition` on back and forward, the hash target if any, otherwise top. `definePageMeta({ scrollToTop: false })`, or a function of `to` and `from`, disables it per route. Same-path hash changes scroll at once.
63
+
64
+ So the window moves after the outro and around the first frame of the intro. Keep initial state independent of scroll position (transforms, `autoAlpha`), create ScrollTrigger instances after that scroll (`onAfterEnter`, or `page:transition:finish` plus a frame), and refresh in `onAfterEnter`. Do not add a second scroll reset.
65
+
66
+ Override `scrollBehavior` only to change the position logic. Keep the wait: returning a promise that resolves after `page:transition:finish` is Vue Router's documented way to delay scroll for a transition.
67
+
68
+ Focus: in `onAfterEnter`, move focus to the page root or its heading only if focus is on `body`. Give the target `tabindex="-1"` and a visible focus style. `autoAlpha: 0` is `visibility: hidden` and refuses focus, so focus at settled, not at insert. Keep `<NuxtRouteAnnouncer>` for the announcement.
69
+
70
+ ## Outro before navigation
71
+
72
+ Vue keeps the old page through `onLeave`, so an outro that merely plays before the old page disappears needs no interception. But Vue Router commits the URL before `onLeave` runs: by the time the hooks see the old root, the address bar already shows the destination and the incoming page has loaded. If the outro must play with the URL unchanged, which is what "outro before navigation" usually means, the hooks cannot do it; the outro has to run in a global route middleware that awaits it, and `onLeave` then only hands `done` over for an element that is already at its end state. Do not port a Next.js transition-aware link that prevents default, animates, then pushes; here it doubles the outro or races the hooks.
73
+
74
+ The ways to move the outro earlier:
75
+
76
+ - **The outro must cover the load.** By default the leave waits for the incoming page. To start the outro at click time, use `<NuxtLink custom v-slot="{ href, navigate }">`, start the outro and call `navigate()` together, and let `onLeave` call `done` at once when the outro has already reached end state, or attach `done` to the running timeline. Make the page non-interactive from the click. Leave modified clicks, external URLs, `target`, and `download` to the native anchor.
77
+ - **Nothing may load and the URL must wait until the outro ends.** A global route middleware `await`s the outro on the client (`import.meta.client && !useNuxtApp().isHydrating`) and then returns. Route middleware runs after `page:loading:start` and before guards, chunk loading, the URL commit, and the incoming setup. Never await it on history navigation. The lock cannot live in this middleware: returning `false` for a second click while the first is awaiting makes Vue Router cancel the first as well, since the pending navigation is now the second, and both are lost. Put the lock in front of the router, in the link component, so the second click never becomes a navigation.
78
+ - **A leave must be refused.** `onBeforeRouteLeave` returning `false` cancels the navigation before anything moves. Use it for unsaved work, not for animation locks; returning `false` on back or forward also rewrites the URL back.
79
+
80
+ Shared elements need no interception. `Flip.getState` in `onBeforeLeave` (the old page is laid out and the new page is not yet inserted in either mode), hand the state through the transition module, `Flip.from(state, { targets })` in `onEnter`. Under no `mode` the old element is still in the DOM, so pass `targets` explicitly.
81
+
82
+ ## Back and forward
83
+
84
+ History navigation runs the same middleware, hooks, and transition as a click, and Vue Router does not tell a guard how a navigation started. What works:
85
+
86
+ - `useRouter().options.history.listen((to, from, info) => ...)` fires for `popstate` navigations only, before the router runs, with `info.direction` of `back`, `forward`, or empty. Record the destination it reports and let the hooks compare it with the route they are entering; do not clear a boolean on `page:loading:end`, which fires before `onLeave` and `onEnter` and so wipes the flag before the hooks read it. Vue Router marks this API alpha; check `node_modules/vue-router` after upgrades.
87
+ - A `popstate` listener on `window` fires in the same dispatch, before any guard. `event.hasUAVisualTransition` means the browser already animated a swipe gesture; skip the intro then, as Nuxt's own view-transition plugin does.
88
+ - `scrollBehavior` receives `savedPosition` only on history navigation, but that is after commit and after the leave.
89
+
90
+ Give history navigation a quieter path: a short outro or an immediate `done`, then intro-only with no travel, since the user is returning. The hooks still fire; do not skip `done`.
91
+
92
+ The bfcache does not apply to same-document navigation. A full reload of a Nuxt page is a fresh hydration and takes the first-load path.
93
+
94
+ ## View Transitions
95
+
96
+ `experimental.viewTransition: true` (or `'always'`, or `{ enabled, types }`) calls `document.startViewTransition` in `router.beforeResolve` for navigations that change the page, runs the route swap and Suspense inside its update callback, and finishes it on `page:finish`. `true` skips it under `prefers-reduced-motion`; `'always'` does not. Per page: `definePageMeta({ viewTransition })` with `enabled`, `types`, `toTypes`, and `fromTypes` (4.4+; functions of `to` and `from` work here, not in `nuxt.config`). Style with `::view-transition-*` and `html:active-view-transition-type(...)`. `page:view-transition:start` hands you the `ViewTransition` to read or add types. A `popstate` with `hasUAVisualTransition` skips it.
97
+
98
+ Vue's `<Transition>` has no View Transitions mode of its own; this plugin is the integration.
99
+
100
+ Rules for mixing:
101
+
102
+ - Never run the `pageTransition` hooks and a view transition on the same navigation. The DOM is frozen while the browser captures, and Suspense resolves while the old page is still leaving, so the new snapshot is wrong or blank. Follow Nuxt's recipe: a global middleware sets `to.meta.pageTransition = false` and `to.meta.layoutTransition = false` when `document.startViewTransition` exists, and your GSAP path lives in the page's `onMounted`.
103
+ - One engine per element per transition. Name only elements that morph, set the name only for that navigation, and clear it.
104
+ - GSAP intros for elements the transition touched start after `transition.finished`; take the `ViewTransition` from `page:view-transition:start`. Elements outside it can start at `onMounted`.
105
+ - Data fetched in page setup runs inside the frozen update; Nuxt's docs list this as a known issue. Prefer prefetched or cached data on routes that use it.
106
+ - Add `::view-transition { pointer-events: none }`.
107
+ - Reduced motion covers both: `true` already skips the browser side; take the GSAP reduced path.
108
+
109
+ Use view transitions for a shared-element morph or a whole-page slide keyed by types. Use the GSAP hooks for everything sequenced, interruptible, or scroll-linked. Pick per route, not per element.
110
+
111
+ ## SSR and first paint
112
+
113
+ GSAP runs only in the browser.
114
+
115
+ - Register GSAP and plugins in a `.client.ts` plugin or the `useGSAP` composable from `gsap-frameworks`; guard module-level side effects with `import.meta.client`.
116
+ - `onMounted`, `onActivated`, and the transition hooks never run on the server. `<script setup>` top level and `watchEffect` do.
117
+ - `<ClientOnly>` renders its slot only after mount and its `fallback` on the server; the slot is not in the server HTML at all. Use it for a canvas or a plugin-driven widget that cannot render as HTML, not to hide a page.
118
+ - With `ssr: false` the client renders everything and first-paint hiding is unnecessary.
119
+
120
+ Hydration happens after the server HTML has painted, so a first-load intro needs initial state before first paint, applied by CSS under a mark that only JavaScript sets:
121
+
122
+ - Add an inline script through `app.head.script` in `nuxt.config` with `innerHTML` and `tagPosition: 'head'`. It runs before the body parses. It sets a root mark such as `data-motion="js"` on `<html>`, and skips the mark under `prefers-reduced-motion` so that path paints settled. Do not put a `data-phase` on `<html>`: the page root owns that attribute, and a second one on the document root reads to CSS, tests, and observers as another page changing phase.
123
+ - Vue hydrates `#__nuxt`, not `<html>`, so attributes set there cause no hydration mismatch.
124
+ - One CSS rule hides intro targets only under the mark and only while the page root is in its initial phase, such as `html[data-motion="js"] [data-page][data-phase="initial"] [data-intro] { visibility: hidden }`. The server renders the page root with `data-phase="initial"`, so the rule applies from first paint and releases when the controller advances the phase. Use `visibility`, not `display`, so layout is measured with the elements in place.
125
+ - The first `onMounted` registers recovery, writes start values, attaches completion handlers, then advances the phase and plays. A setup exception rolls back partial changes before revealing content.
126
+ - 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).
127
+ - Content stays readable without JavaScript: no mark, no rule.
128
+ - `onPrehydrate` inlines a callback before `</body>`, after the content has parsed and possibly painted. It is for DOM fixes right before hydration, not for the pre-paint mark.
129
+
130
+ Route navigations do not go through this: `onBeforeEnter` runs before the incoming root is inserted.
131
+
132
+ ## Cases to design for
133
+
134
+ - Navigation requested mid-intro.
135
+ - Two destinations clicked before the first resolves.
136
+ - Back or forward, including a swipe the browser already animated.
137
+ - A keepalive page shown again with settled DOM.
138
+ - A change of only query or hash.
139
+ - A slow incoming page: the old page stays on screen. Decide what the user sees for two seconds.
140
+ - A layout change, where the page transition does not run.
141
+ - A leave that reverts a pinned ScrollTrigger.
142
+ - Reload on a slow network: no settled flash, then a clean intro.
143
+ - Development hot reload, which re-runs setup on a live page.
144
+
145
+ Each case must end on one visible, interactive page with stable layout, no stale inline styles, and every `done` called.
@@ -0,0 +1,107 @@
1
+ # Page transitions
2
+
3
+ Read this when changing route-level motion: the hooks, `done`, modes, what dies when the leave starts, first load, layouts, direction, and interruptions.
4
+
5
+ ## What Nuxt gives you
6
+
7
+ `<NuxtPage>` renders `<RouterView>` → `<Transition>` → `<KeepAlive>` → `<Suspense>` → page. The `<Transition>` and `<KeepAlive>` layers exist only when configured. Nothing is on by default: `app.pageTransition`, `app.layoutTransition`, and `app.keepalive` all default to `false`.
8
+
9
+ `pageTransition` and `layoutTransition` take Vue `TransitionProps`: `name`, `mode`, `css`, `appear`, `duration`, the class props, and the JavaScript hooks. Three places set them, merged key by key with the first defined value winning:
10
+
11
+ 1. `<NuxtPage :transition="...">` in `app.vue`. Keys set here cannot be overridden by a page.
12
+ 2. `definePageMeta({ pageTransition })` in the page. It is a compiler macro: the object is hoisted out of the component, so hook functions must be imported or module-level, never closures over refs, template refs, or component state.
13
+ 3. `app.pageTransition` in `nuxt.config`. JSON-serializable only, so no hooks; use it for `name`, `mode`, and `css` defaults.
14
+
15
+ Nuxt appends its own `onAfterLeave`, which fires the `page:transition:finish` app hook, alongside yours.
16
+
17
+ `pageTransition: false` in `definePageMeta` (or in `nuxt.config` with no prop) removes the `<Transition>` for that route: the old page unmounts at once and nothing leaves. Use it for routes that must swap with no motion.
18
+
19
+ Pages and layouts must render a single root element. A fragment root cannot be animated; Nuxt warns in development and the transition does not run. A layout's root cannot be its `<slot />`.
20
+
21
+ ## GSAP owns the hooks
22
+
23
+ Set `css: false` and implement the JavaScript hooks. With `css: false`, Vue adds no `*-enter-*` or `*-leave-*` classes and does not wait for `transitionend`; the transition ends when you call `done`. Without it, a leftover `.page-enter-active` rule runs a CSS transition on the element GSAP is tweening.
24
+
25
+ Declare the `done` parameter. Vue calls a hook declared with only `el` synchronously and finishes the transition at once.
26
+
27
+ The hooks and the phases they own:
28
+
29
+ - `onBeforeEnter(el)`. The incoming root exists with its children but is not in the document: selectors work, measurement does not. Write initial values that need no layout, such as `autoAlpha` and transforms.
30
+ - `onEnter(el, done)`. The root is in the document, in the same task as insertion and before paint. Measure, finish initial state, then advance the phase to `intro` and build the intro from a microtask, not in the same task as the `initial` write, or `initial` is never observable. Call `done` on completion.
31
+ - `onAfterEnter(el)`. Settled. Clear temporary styles with `clearProps`, refresh ScrollTrigger, move focus. Do not revert the enter context here: a revert restores the inline values from before the tween, which are the `autoAlpha: 0` and transform written in `onBeforeEnter`, and the settled page vanishes.
32
+ - `onEnterCancelled(el)`. A new navigation arrived mid-intro. Kill the intro; the element is about to leave.
33
+ - `onBeforeLeave(el)` and `onLeave(el, done)`. The outgoing root is still in the document with its layout. Build the outro from current values, call `done` on completion.
34
+ - `onAfterLeave(el)`. `el` has been removed. End state and cleanup of anything the outro owned.
35
+ - `onLeaveCancelled` fires only for `v-show`. Page roots never get it.
36
+
37
+ Hooks receive `el` and nothing else. By `onLeave` the page component is gone, so there are no template refs, no component state, and `useRoute()` already means the new page. Mark targets with data attributes and query them inside `el`, or run the builder inside `gsap.context(fn, el)`.
38
+
39
+ `done` is a contract:
40
+
41
+ - Call it once per hook call. Extra calls are ignored.
42
+ - Call it from the timeline's `onComplete` and from `onInterrupt`, since a killed timeline never completes. Put that in one helper every builder uses.
43
+ - Call it synchronously under reduced motion after writing end values.
44
+ - An enter that never calls `done` never fires `onAfterEnter`, and the next leave cancels it.
45
+ - A leave that never calls `done` keeps the old root in the DOM forever, never fires `page:transition:finish`, holds Nuxt's scroll, and under `out-in` never inserts the new page. If something outside the hook can kill the timeline, keep the `done` call outside the timeline too.
46
+
47
+ Race the leave's `done` against a short timeout. GSAP's ticker and `requestAnimationFrame` stop in a hidden tab, and a navigation started from a background tab must still finish.
48
+
49
+ ## The component dies when the leave starts
50
+
51
+ When Vue removes a page whose root has a leave transition, it unmounts the component first and keeps only the root element: `onBeforeUnmount` runs synchronously, the component's effect scope stops, the element is handed to `onLeave`, and `onUnmounted` runs in the same flush. All of that happens before the outro plays a frame. Under keepalive, `onDeactivated` fires at that moment instead.
52
+
53
+ What this means:
54
+
55
+ - A `gsap.context` the page reverts on unmount kills the page's tweens and triggers, and restores their inline styles, as the outro begins. Let it. It must leave the DOM readable, because that is the picture the outro starts from.
56
+ - Build the outro in `onLeave` inside a context the transition module owns, scoped to `el`. Revert that context in `onAfterLeave`.
57
+ - The outgoing page loses its reactivity, watchers, and listeners at leave start. Nothing in it updates during the outro. Do not plan on it responding.
58
+ - A ScrollTrigger reverted at leave start removes its pin spacer and restores the pinned element, so a page leaving mid-pin changes height as the outro begins. Hold the stable wrapper's height through the outro, or design the outro so the collapse is covered.
59
+ - Template refs are null in `onLeave`. `el` is the only handle.
60
+
61
+ ## Modes and who is on screen
62
+
63
+ `mode` decides overlap. Nuxt's examples use `out-in`; Vue's default is simultaneous.
64
+
65
+ - **`out-in`.** The outro plays alone. When `done` is called, Vue removes the old root, inserts the new one, and runs `onBeforeEnter` and `onEnter`. One page owns the geometry at a time.
66
+ - **No `mode`.** The old root starts leaving and the new root is inserted in the same tick. Both are in the document through the outro. Give the container the geometry: reserve its size, or overlap the children so only the wrapper takes space in flow.
67
+ - **`in-out`** behaves like no `mode` under `<NuxtPage>`. Do not use it.
68
+
69
+ In both modes the outro cannot start before the incoming page is ready. `<NuxtPage>` renders the incoming page under `<Suspense>`: its setup, top-level `await`, `useAsyncData`, and `useFetch` run off-screen while the outgoing page stays visible and interactive. The leave begins when that resolves. So the outro never overlaps loading, the user never sees a half-loaded page, and a slow page shows only the old page and the loading indicator until it is ready. If the design wants the outro to cover the wait, see [Outro before navigation](navigation.md#outro-before-navigation).
70
+
71
+ Under `out-in` the incoming page's `onMounted` runs after the old root is gone and the new one is inserted; under no `mode` it runs at leave start. The order between that `onMounted` and `onEnter` differs between modes. Do not depend on it. Page-level phases belong to the hooks; component-level setup belongs to `onMounted`.
72
+
73
+ ## First load and `appear`
74
+
75
+ Do not use `appear` on a server-rendered page. Vue's SSR compiler wraps the child of `<Transition appear>` in `<template>`, so the server HTML ships the page inert and invisible until hydration replaces it. No JavaScript, no page. On hydration, `appear` also runs the enter hooks after the server HTML has painted, so it cannot hide the settled state either.
76
+
77
+ The first load is its own lifecycle:
78
+
79
+ - Mount is hydration. The page's `onMounted` runs after hydration, which is after first paint.
80
+ - Initial state must be written before first paint by an inline head script plus a CSS rule, not by GSAP. See [SSR and first paint](navigation.md#ssr-and-first-paint).
81
+ - The intro starts in the page's `onMounted` (or on `app:suspense:resolve` for a shell-level intro) and releases the pre-paint rule as its first act.
82
+ - Without `appear`, the hooks do not run on first load, so first load and navigation are two entry points to the same intro builder.
83
+
84
+ With `ssr: false` nothing paints before Vue renders, so `onMounted` is early enough, no pre-paint rule is needed, and `appear` is safe.
85
+
86
+ ## Layouts
87
+
88
+ `layoutTransition` wraps the layout's root the same way. When a navigation changes layouts, the page transition does not run; the layout transition does, and the layout's chrome leaves and enters with the page. Give layout changes their own hooks or disable one of the two. Do not make `<NuxtLayout>` the root element of a page.
89
+
90
+ Chrome that must never move on navigation lives in `app.vue` outside `<NuxtLayout>`, or in one layout every route shares.
91
+
92
+ ## Direction and dynamic transitions
93
+
94
+ Route middleware runs before the transition starts and may rewrite `to.meta.pageTransition`; check it is not `false` first. Nuxt documents changing `name` this way. The hooks can read the same object through `useRouter().currentRoute.value.meta.pageTransition`, because the route has already changed when `onLeave` fires. Keep `name` in sync even with `css: false`; it lets a CSS fallback share the vocabulary.
95
+
96
+ Alternatives: a `useState` the middleware writes and the hooks read, or a computed `:transition` on `<NuxtPage>`.
97
+
98
+ Direction from the route pair is the honest signal. History direction is a separate problem; see [Back and forward](navigation.md#back-and-forward).
99
+
100
+ ## Interruptions
101
+
102
+ Nuxt remounts the `<Suspense>` when a navigation starts while another is still pending, and Vue cancels a running enter when its element must leave. Handle:
103
+
104
+ - `onEnterCancelled`: kill the intro. The same element then gets `onBeforeLeave` and `onLeave`; start the outro from current values.
105
+ - A leave still running when a third route arrives: Vue removes the element through the pending `done` guard, so your `done` may run late or twice. Both are harmless. Kill the timeline in `onAfterLeave`.
106
+ - A killed timeline never resolves its promise. Use the `done` helper for every `await`.
107
+ - Two clicks before the first navigation is confirmed: Vue Router cancels the first as a navigation failure and Nuxt fires `page:loading:end` for it. No hooks run for the cancelled one.
@@ -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, including `nuxt typecheck` when the project uses it.
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, on unmount and on deactivate.
10
+ - Confirm every transition hook calls `done` on completion, on interruption, and under reduced motion.
11
+ - On server-rendered projects, confirm the page is readable with JavaScript disabled and with the pre-paint mark set but the client bundle blocked.
12
+ - Test reduced motion when the change has a reduced-motion branch.
13
+
14
+ ## Initially hidden content
15
+
16
+ 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.
17
+
18
+ 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.
19
+
20
+ ## Runtime changes
21
+
22
+ Check the changed lifecycle in a real browser when practical:
23
+
24
+ - Initial state is applied before reveal. For the first load, throttle the network and reload; no settled content flashes.
25
+ - Intro ends in one settled state.
26
+ - Outro keeps the node in the DOM until `done`, and the node is gone right after.
27
+ - Rapid or interrupted input ends in one coherent state.
28
+ - Layout boxes do not jump, including at leave start when the page's context reverts.
29
+
30
+ For route navigation, test the paths the change affects: an ordinary `<NuxtLink>`, back and forward, a second click before the first navigation resolves, a query-only change (no transition should run), a route with `pageTransition: false`, and a layout change. Confirm URL, visible page, focus, history, and scroll agree, and that exactly one page root remains in the DOM after each transition.
31
+
32
+ With keepalive, also navigate away and back. The returning page must re-run initial state and intro on its preserved DOM with no doubled tweens, and scroll triggers must measure correctly after reactivation.
33
+
34
+ With `experimental.viewTransition`, confirm the Vue transition is disabled on those navigations, no element is animated by both engines, names are cleared afterward, and clicks land during a running transition.
35
+
36
+ For conditional components, test show, hide, and one interruption. Confirm removal happens after the outro, and that a `v-show` re-show during an outro reverses or restarts as intended.
37
+
38
+ ## Builds and wider checks
39
+
40
+ Run `nuxt build` and check the output with `nuxt preview` for changes to pages, layouts, `nuxt.config`, router options, middleware, dependencies, or client and server boundaries. Run wider browser, accessibility, responsive, 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.
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: gsap-performance
3
+ description: Official GSAP skill for performance — prefer transforms, avoid layout thrashing, will-change, batching. Use when optimizing GSAP animations, reducing jank, or when the user asks about animation performance, FPS, or smooth 60fps.
4
+ license: MIT
5
+ ---
6
+
7
+ # GSAP Performance
8
+
9
+ ## When to Use This Skill
10
+
11
+ Apply when optimizing GSAP animations for smooth 60fps, reducing layout/paint cost, or when the user asks about performance, jank, or best practices for fast animations.
12
+
13
+ **Related skills:** Build animations with **gsap-core** (transforms, autoAlpha) and **gsap-timeline**; for ScrollTrigger performance see **gsap-scrolltrigger**.
14
+
15
+ ## Prefer Transform and Opacity
16
+
17
+ Animating **transform** (`x`, `y`, `scaleX`, `scaleY`, `rotation`, `rotationX`, `rotationY`, `skewX`, `skewY`) and **opacity** keeps work on the compositor and avoids layout and most paint. Avoid animating layout-heavy properties when a transform can achieve the same effect.
18
+
19
+ - ✅ Prefer: **x**, **y**, **scale**, **rotation**, **opacity**.
20
+ - ❌ Avoid when possible: **width**, **height**, **top**, **left**, **margin**, **padding** (they trigger layout and can cause jank).
21
+
22
+ GSAP’s **x** and **y** use transforms (translate) by default; use them instead of **left**/**top** for movement.
23
+
24
+ ## will-change
25
+
26
+ Use **will-change** in CSS on elements that will animate. It hints the browser to promote the layer.
27
+
28
+ ```css
29
+ will-change: transform;
30
+ ```
31
+
32
+ ## Batch Reads and Writes
33
+
34
+ GSAP batches updates internally. When mixing GSAP with direct DOM reads/writes or layout-dependent code, avoid interleaving reads and writes in a way that causes repeated layout thrashing. Prefer doing all reads first, then all writes (or let GSAP handle the writes in one go).
35
+
36
+ ## Many Elements (Stagger, Lists)
37
+
38
+ - Use **stagger** instead of many separate tweens with manual delays when the animation is the same; it’s more efficient.
39
+ - For long lists, consider **virtualization** or animating only visible items; avoid creating hundreds of simultaneous tweens if it causes jank.
40
+ - Reuse timelines where possible; avoid creating new timelines every frame.
41
+
42
+ ## Frequently updated properties (e.g. mouse followers)
43
+
44
+ Prefer **gsap.quickTo()** for properties that are updated often (e.g. mouse-follower x/y). It reuses a single tween instead of creating new tweens on each update.
45
+
46
+ ```javascript
47
+ let xTo = gsap.quickTo("#id", "x", { duration: 0.4, ease: "power3" }),
48
+ yTo = gsap.quickTo("#id", "y", { duration: 0.4, ease: "power3" });
49
+
50
+ document.querySelector("#container").addEventListener("mousemove", (e) => {
51
+ xTo(e.pageX);
52
+ yTo(e.pageY);
53
+ });
54
+ ```
55
+
56
+ ## ScrollTrigger and Performance
57
+
58
+ - **pin: true** promotes the pinned element; pin only what’s needed.
59
+ - **scrub** with a small value (e.g. `scrub: 1`) can reduce work during scroll; test on low-end devices.
60
+ - Call **ScrollTrigger.refresh()** only when layout actually changes (e.g. after content load), not on every resize; debounce when possible.
61
+
62
+ ## Reduce Simultaneous Work
63
+
64
+ - Pause or kill off-screen or inactive animations when they’re not visible (e.g. when the user navigates away).
65
+ - Avoid animating huge numbers of properties on many elements at once; simplify or sequence if needed.
66
+
67
+ ## Best practices
68
+
69
+ - ✅ Animate **transform** and **opacity**; use **will-change** in CSS only on elements that animate.
70
+ - ✅ Use **stagger** instead of many separate tweens with manual delays when the animation is the same.
71
+ - ✅ Use **gsap.quickTo()** for frequently updated properties (e.g. mouse followers).
72
+ - ✅ Clean up or kill off-screen animations; call **ScrollTrigger.refresh()** when layout changes, debounced when possible.
73
+
74
+ ## Do Not
75
+
76
+ - ❌ Animate **width**/ **height**/ **top**/ **left** for movement when **x**/ **y**/ **scale** can achieve the same look.
77
+ - ❌ Set **will-change** or **force3D** on every element “just in case”; use for elements that are actually animating.
78
+ - ❌ Create hundreds of overlapping tweens or ScrollTriggers without testing on low-end devices.
79
+ - ❌ Ignore cleanup; stray tweens and ScrollTriggers keep running and can hurt performance and correctness.