@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,462 @@
1
+ ---
2
+ name: frontend-craftsmanship
3
+ description: Use when building frontend, designing a screen, improving UI quality, establishing a design system, reverse-engineering premium interfaces, or when the user wants Shipd/Linear/Vercel-level output instead of generic AI slop. Load when the task involves product thinking, visual systems, interaction design, motion, typography, or frontend architecture. This is a core skill: it defines how the user wants frontend built, independent of any single project.
4
+ ---
5
+
6
+ # Frontend Craftsmanship
7
+
8
+ Purpose: enforce a specific standard for frontend quality across any project. Product-first thinking, design-system discipline, interaction states, motion rules, typography standards, reverse-engineering practice, and AI workflow for shipping polished interfaces.
9
+
10
+ > This is one of the user's core skills. It defines how the user wants frontend built, independent of any single project. See also `house-style` for philosophy/restraint rules, `ui/ui-core` for the build process, `ui/motion` for motion implementation, `ui/typography-picker` for type direction, and `ui/impeccable` for audit/verify commands.
11
+
12
+ ## Core principles
13
+
14
+ ### Product-first, not component-first
15
+
16
+ Developer-first:
17
+
18
+ ```
19
+ Idea
20
+ ↓
21
+ React
22
+ ↓
23
+ Components
24
+ ↓
25
+ API
26
+ ↓
27
+ Done
28
+ ```
29
+
30
+ Product-first:
31
+
32
+ ```
33
+ Problem
34
+ ↓
35
+ Product model
36
+ ↓
37
+ User journey
38
+ ↓
39
+ Information architecture
40
+ ↓
41
+ Visual language
42
+ ↓
43
+ Design system
44
+ ↓
45
+ Interaction model
46
+ ↓
47
+ Motion
48
+ ↓
49
+ Frontend implementation
50
+ ↓
51
+ States / edge cases
52
+ ↓
53
+ Polish
54
+ ↓
55
+ Done
56
+ ```
57
+
58
+ ### The homepage is a product demo
59
+
60
+ Shipd's homepage doesn't list features. It makes you experience the product: leaderboard, code editor, terminal, reviews, bounty, challenges, rankings, quests, community. The landing page itself is a miniature product demo. Linear makes a similar point: dense interfaces remain calm when visual weight is carefully controlled. Vercel's Geist system is a technical reference for systematizing typography, colors, grid, and components.
61
+
62
+ ### One clear action per screen
63
+
64
+ Every screen should have one obvious primary action. Color in small doses. Whitespace does the separating, not borders and shadows. Real type hierarchy: a headline, a sentence, a hint. Not five sizes of bold.
65
+
66
+ ### Feedback matches the action
67
+
68
+ Manipulation (press, drag) gets a visual state: pressed, hovered, active. Completed work (saved, sent) gets a quiet status: a checkmark, a toast. Destructive work gets confirmation. Nothing else moves.
69
+
70
+ ## Design standards
71
+
72
+ ### Typography
73
+
74
+ - One typeface family for UI, optionally one display face for headlines.
75
+ - Tight type scale, real hierarchy.
76
+ - `line-height` tuned per size: display tighter, body looser.
77
+ - `letter-spacing` explicit for all-caps labels and display type.
78
+ - Tabular figures for data columns.
79
+ - Variable fonts preferred over static weights.
80
+
81
+ ### Spacing and layout
82
+
83
+ - Think in tokens, not individual CSS values.
84
+ - One spacing scale, used everywhere.
85
+ - Grid over flex math.
86
+ - Cards only when elevation earns them. Never cards inside cards.
87
+ - Asymmetric layouts over perfect grids when the content allows.
88
+
89
+ ### Color
90
+
91
+ - One accent color, used only for things that matter. Restraint is the accent.
92
+ - One gray family, not five.
93
+ - No purple gradients, glowing buttons, or gradient text.
94
+ - Dark mode is designed, not inverted.
95
+
96
+ ### Motion
97
+
98
+ - Fast, physical, quiet, purposeful.
99
+ - State lands first. Nobody waits on a spring.
100
+ - Animate `transform` and `opacity` only.
101
+ - Nothing loops forever.
102
+ - `prefers-reduced-motion: reduce` = instant state changes.
103
+ - One motion per event. Pick the element that carries the change.
104
+ - 200ms in, 150ms out. Spring curves (`cubic-bezier(0.16, 1, 0.3, 1)`), not keywords.
105
+ - Exits exist. Whatever appears animated leaves animated.
106
+
107
+ ### Components
108
+
109
+ Every component must define its states:
110
+
111
+ ```
112
+ default
113
+ hover
114
+ active
115
+ focus
116
+ disabled
117
+ loading
118
+ error
119
+ empty
120
+ success
121
+ mobile
122
+ dark
123
+ ```
124
+
125
+ A `Card` is not a product pattern. A `ChallengeCard`, `SubmissionPanel`, `LeaderboardRow`, `CodeReviewPanel`, `QuestHeader` is closer to a product language.
126
+
127
+ ### Frontend architecture
128
+
129
+ Evolve from:
130
+
131
+ ```
132
+ components/
133
+ Button
134
+ Card
135
+ Navbar
136
+ ```
137
+
138
+ towards:
139
+
140
+ ```
141
+ design-system/
142
+ primitives/
143
+ typography/
144
+ layout/
145
+ controls/
146
+ feedback/
147
+ navigation/
148
+
149
+ patterns/
150
+ command-menu/
151
+ data-table/
152
+ activity-feed/
153
+ editor/
154
+ dashboard/
155
+ onboarding/
156
+
157
+ features/
158
+ challenges/
159
+ leaderboard/
160
+ submissions/
161
+ ```
162
+
163
+ ## Interaction design
164
+
165
+ Every interaction has a designed state:
166
+
167
+ ```
168
+ idle
169
+ ↓
170
+ hover
171
+ ↓
172
+ press
173
+ ↓
174
+ loading
175
+ ↓
176
+ partial progress
177
+ ↓
178
+ success
179
+ ↓
180
+ next available action
181
+ ↓
182
+ error / retry
183
+ ```
184
+
185
+ Be obsessive about: hover, focus, active, disabled, loading, optimistic updates, empty states, skeletons, errors, success, transitions, keyboard interaction.
186
+
187
+ ## Reverse engineering method
188
+
189
+ Don't just build products. **Copy excellent products.** Not by stealing their code. By rebuilding the experience.
190
+
191
+ Pick: Shipd, Linear, Vercel, Raycast, Stripe, Arc, Resend, Cursor, Supabase, Notion, Figma.
192
+
193
+ For each screen:
194
+
195
+ ```
196
+ Why is this element here?
197
+ Why this width?
198
+ Why this spacing?
199
+ Why this font?
200
+ Why this border?
201
+ Why does this section start here?
202
+ Why does this interaction happen this way?
203
+ What happens when there is no data?
204
+ What happens when the user hovers?
205
+ What happens when the user clicks?
206
+ What happens on mobile?
207
+ ```
208
+
209
+ Then rebuild it.
210
+
211
+ ## AI workflow for serious projects
212
+
213
+ Don't let AI invent the product. Give it a **design specification first**:
214
+
215
+ ```
216
+ PRODUCT:
217
+ Developer competition platform.
218
+
219
+ USER:
220
+ Software engineers solving difficult programming problems.
221
+
222
+ PRIMARY ACTION:
223
+ Start a challenge.
224
+
225
+ DESIGN DIRECTION:
226
+ Dense developer-tool interface.
227
+ Editorial typography.
228
+ Dark neutral canvas.
229
+ Very restrained color.
230
+ Strong monospace usage.
231
+ Thin borders.
232
+ Minimal rounded corners.
233
+ High information density.
234
+
235
+ UX PRINCIPLES:
236
+ Every screen should have one obvious primary action.
237
+ Avoid decorative cards.
238
+ Prefer information-rich panels.
239
+ Use progressive disclosure.
240
+ Keyboard-first where appropriate.
241
+ Every async action needs explicit feedback.
242
+
243
+ MOTION:
244
+ 150–250ms transitions.
245
+ No gratuitous animation.
246
+ Use motion to communicate hierarchy and state changes.
247
+
248
+ STATES:
249
+ Loading
250
+ Empty
251
+ Error
252
+ Success
253
+ Disabled
254
+ Hover
255
+ Focus
256
+ Mobile
257
+
258
+ TECH:
259
+ Next.js
260
+ TypeScript
261
+ Tailwind
262
+ ...
263
+ ```
264
+
265
+ Then: implement, then analyze, then implement P0/P1, then visual QA.
266
+
267
+ ```
268
+ Analyze this interface as a senior product designer.
269
+
270
+ Identify:
271
+ 1. visual hierarchy problems
272
+ 2. spacing inconsistencies
273
+ 3. typography problems
274
+ 4. interaction problems
275
+ 5. information architecture problems
276
+ 6. missing states
277
+ 7. accessibility problems
278
+ 8. responsive problems
279
+
280
+ Do not rewrite the code yet.
281
+
282
+ Give me a prioritized list of changes.
283
+ ```
284
+
285
+ ```
286
+ Now implement only P0 and P1 issues.
287
+
288
+ Do not change:
289
+ - product behavior
290
+ - information architecture
291
+ - API contracts
292
+ - existing design language
293
+
294
+ Preserve the current component structure where reasonable.
295
+ ```
296
+
297
+ ```
298
+ Now perform a visual QA pass.
299
+
300
+ Look for:
301
+ - inconsistent spacing
302
+ - unnecessary borders
303
+ - excessive cards
304
+ - typography hierarchy
305
+ - alignment
306
+ - visual noise
307
+ - interaction feedback
308
+ - mobile behavior
309
+
310
+ Make only changes that improve the product.
311
+ ```
312
+
313
+ The AI workflow order:
314
+
315
+ ```
316
+ IDEA
317
+ │
318
+ ▼
319
+ Product brief
320
+ │
321
+ ▼
322
+ User journey
323
+ │
324
+ ▼
325
+ Information architecture
326
+ │
327
+ ▼
328
+ Design specification
329
+ │
330
+ ▼
331
+ AI planning
332
+ │
333
+ ▼
334
+ Architecture
335
+ │
336
+ ▼
337
+ Design-system tokens
338
+ │
339
+ ▼
340
+ Components
341
+ │
342
+ ▼
343
+ Screens
344
+ │
345
+ ▼
346
+ Interactions/states
347
+ │
348
+ ▼
349
+ Polish
350
+ │
351
+ ▼
352
+ Evaluation
353
+ │
354
+ ▼
355
+ SHIP
356
+ ```
357
+
358
+ Coding is not step 1.
359
+
360
+ ## Taste database
361
+
362
+ Create a folder:
363
+
364
+ ```
365
+ /design-research
366
+ ```
367
+
368
+ Inside:
369
+
370
+ ```
371
+ shipd.md
372
+ linear.md
373
+ vercel.md
374
+ stripe.md
375
+ cursor.md
376
+ raycast.md
377
+ supabase.md
378
+ ```
379
+
380
+ Each file contains:
381
+
382
+ ```
383
+ Typography:
384
+ ...
385
+
386
+ Spacing:
387
+ ...
388
+
389
+ Colors:
390
+ ...
391
+
392
+ Borders:
393
+ ...
394
+
395
+ Radius:
396
+ ...
397
+
398
+ Motion:
399
+ ...
400
+
401
+ Navigation:
402
+ ...
403
+
404
+ Information density:
405
+ ...
406
+
407
+ Interesting interaction:
408
+ ...
409
+
410
+ What they avoid:
411
+ ...
412
+
413
+ What I want to steal conceptually:
414
+ ...
415
+ ```
416
+
417
+ Study what products **refuse to do**. That's one of the strongest lessons from good product design.
418
+
419
+ ## Anti-patterns
420
+
421
+ | Anti-pattern | Correct approach |
422
+ |---|---|
423
+ | Generic AI SaaS dashboard: Navbar, Sidebar, Card, Card, Card, Table | Product-specific interface with one clear action per screen |
424
+ | Purple gradients, glowing buttons, oversized rounded cards | Flat buttons, one accent, restraint |
425
+ | Component-first thinking before product model | Product model → UX → IA → visual language → design system → implementation |
426
+ | One-size-fits-all motion | Fast, physical, quiet, purposeful. 200ms in, 150ms out |
427
+ | Missing states: no loading, empty, error, disabled | Every component defines all states |
428
+ | Cards inside cards | Cards only when elevation earns them |
429
+ | Decorative animation | Animation communicates what changed, nothing else |
430
+ | AI inventing the product direction | Design specification first, then AI executes |
431
+ | Five bold sizes masquerading as hierarchy | Real type hierarchy: display, headline, body, hint |
432
+ | Individual CSS values instead of tokens | One spacing scale, one color family, one radius scale |
433
+
434
+ ## Checklist
435
+
436
+ Before shipping any frontend work:
437
+
438
+ - [ ] One clear primary action per screen
439
+ - [ ] Typography hierarchy is real, not just bold sizes
440
+ - [ ] Spacing uses tokens, not ad-hoc values
441
+ - [ ] Color is restrained: one accent, one gray family
442
+ - [ ] No purple gradients, glowing buttons, or gradient text
443
+ - [ ] Every component defines: default, hover, active, focus, disabled, loading, error, empty, success, mobile, dark
444
+ - [ ] Motion is transform/opacity only, 200ms in / 150ms out, spring curves
445
+ - [ ] `prefers-reduced-motion: reduce` respected
446
+ - [ ] Dark mode is designed, not inverted
447
+ - [ ] No cards inside cards
448
+ - [ ] Feedback matches action: manipulation gets visual state, completion gets quiet status
449
+ - [ ] Empty, loading, and error states designed for every screen
450
+ - [ ] Keyboard interaction works throughout
451
+ - [ ] AI was given a design spec, not a vague prompt
452
+
453
+ ## References
454
+
455
+ For implementation, refer to:
456
+
457
+ - `ui/house-style`: The law (philosophy, restraint, no purple slop)
458
+ - `ui/ui-core`: The process (pick direction, design system, build screen, verify)
459
+ - `ui/motion`: The motion job (name, decide, build, review, audit)
460
+ - `ui/typography-picker`: Font pairing, type scale, text motion
461
+ - `ui/impeccable`: Commands/detectors for audit, polish, animate, verify
462
+ - `ui/pick-ui-library`: Curated library picks for UI primitives
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: gsap-astro
3
+ description: "Build or review Astro animation: GSAP page transitions, ClientRouter swap hooks, persisted islands, repeated setup, and cleanup. Use for missing or duplicated motion after navigation and choosing transition:animate versus GSAP. Without ClientRouter, use gsap-vanilla. Also covers hidden-content recovery and first-load performance. Not for standalone island frameworks or isolated GSAP API questions."
4
+ license: MIT
5
+ metadata:
6
+ short-description: GSAP page and component lifecycles in Astro
7
+ ---
8
+
9
+ # GSAP Astro
10
+
11
+ **mount → initial state → intro → settled → outro → end state → unmount**
12
+
13
+ Without `<ClientRouter />`, use `gsap-vanilla` for full document loads. With it, mount and unmount correspond to body swaps; module scripts, global listeners, timelines, and persisted elements can survive. Animation owns the five phases between swaps.
14
+
15
+ Keep the requested look and existing project conventions. Add GSAP/plugins only as needed; do not replace the chosen animation library unless asked.
16
+
17
+ ## Start with the project
18
+
19
+ Read repository instructions, existing animation, layouts, navigation, CSS, accessibility conventions, and checks. Then:
20
+
21
+ 1. Read the installed Astro version. Read `node_modules/astro/dist/transitions/router.js`, `swap-functions.js`, and `node_modules/astro/components/ClientRouter.astro` before trusting memory; the package ships no changelog, so check the release notes for that version. Version gates: `<ClientRouter />` (5.0; `<ViewTransitions />` in 4.x, removed in 6.0), lifecycle events with `loader` and `newDocument` (3.6), form navigation (4.0), `transition:persist-props` and `data-astro-rerun` (4.5), `swapFunctions` (4.15).
22
+ 2. Find where `<ClientRouter />` is: the shared head, some pages, or nowhere, and its `fallback` prop. Nowhere means `gsap-vanilla`, including CSS `@view-transition`.
23
+ 3. Find which framework integrations render islands and which `client:*` directives are in use.
24
+ 4. Check `astro.config` for `prefetch` and `experimental.clientPrerender`.
25
+
26
+ ## Choose the engine
27
+
28
+ Use `transition:name` / `transition:animate` for snapshot morphs, fades, or slides under ClientRouter. Use GSAP for live-DOM outros that hold the swap, interruptible sequences, split text, or scroll-linked motion. One engine per element; see [combining engines](references/client-router-navigation.md#combining-with-astros-animations).
29
+
30
+ ## Read only what you need
31
+
32
+ - Invisible entrances, failed initialization, indexing, and first-load performance: [Initialization and recovery](references/initialization.md), plus the [framework integration](references/motion-system.md#initialization-and-recovery).
33
+ - The router's event sequence, outro before the swap, cleanup, initial state on the incoming page, direction, back and forward, scroll, focus, prefetch, fallback browsers: [ClientRouter navigation](references/client-router-navigation.md).
34
+ - Which scripts run again, listeners that outlive pages, custom elements, islands and `client:*` directives, `transition:persist`: [Scripts and islands](references/scripts-and-islands.md).
35
+ - The five phases, GSAP setup, contexts, show and hide, layout stability, scroll, text, plugins: [Lifecycle implementation](references/motion-system.md).
36
+ - Before calling work done: [Verification](references/verification.md).
37
+
38
+ Install the [official GSAP skills](https://github.com/greensock/gsap-skills) alongside this repository. Load `gsap-core` for API details and `gsap-frameworks` for component setup only as needed.
39
+
40
+ ## Rules
41
+
42
+ - Preserve invisible intros on successful setup; recover the current incoming owner on failure. Follow the initialization contract before adding hiding rules.
43
+ - GSAP runs after the DOM it targets exists. Scope selectors with `gsap.context` to the page or component root. Clean up every tween, trigger, split, and listener before the swap that removes its owner.
44
+ - A module script runs once per visit, not once per page. Setup runs from `astro:page-load` and is correct when it runs again on a new body or twice on the same one.
45
+ - Listeners on `document` and `window` outlive the page. Register router listeners once, in one place, and have each handler find the current page before acting.
46
+ - Reserve final geometry with normal CSS and a stable wrapper; overlap outgoing/incoming content without doubling layout space.
47
+ - Set initial values before paint, then reveal. On first load that is the inline head script; after a swap it is `astro:before-swap` and `astro:after-swap`. Successful initialization never flashes settled content before the intro, and never a blank page without JavaScript.
48
+ - Animate to one settled state and clear temporary styles there.
49
+ - The outro plays on live DOM inside `event.loader` in `astro:before-preparation`, and the router waits for it. Never animate in `astro:before-swap`: the user is looking at a snapshot.
50
+ - Back and forward get an intro-only path. A traverse fires every event, so skip the outro on `navigationType === "traverse"` on purpose.
51
+ - Keep `transition:persist` elements out of page-level cleanup and page-level intros. They cross the swap alive, timelines included.
52
+ - Keep native link behavior, the router's history, scroll restoration, and route announcement. Do not add a click interceptor beside the router for motion; the only click listener is the capture-phase guard that holds the lock while a navigation is in flight.
53
+ - Cleanup before the swap kills the page context; it does not revert it. A revert writes the intro's start values back onto a body that is still attached.
54
+ - Reduced motion reaches the same settled state and still fires every completion callback. The router already disables its own animations under `prefers-reduced-motion`.
55
+ - Use timelines for sequences. Decide up front what happens on rapid clicks and interrupted animations: the router lets a second click abort the first navigation while its outro is running, so first-click-wins needs the lock guard.
56
+ - Verify in a real browser when practical, including a page visited twice, back, forward, and a click during an outro.
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "GSAP Astro"
3
+ short_description: "GSAP page and component lifecycles in Astro"
4
+ default_prompt: "Use $gsap-astro to add GSAP page transitions and component animation to this Astro site."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,139 @@
1
+ # ClientRouter navigation
2
+
3
+ Read this when changing page-level motion or navigation on a site that uses `<ClientRouter />`.
4
+
5
+ ## Is the router running
6
+
7
+ `<ClientRouter />` from `astro:transitions` goes in `<head>`, usually through a shared layout, and only pages that include it navigate in place. `transitionEnabledOnThisPage()` from `astro:transitions/client` reports the current page; `supportsViewTransitions` reports the browser. A link to a page without the router is fetched, found wanting, and followed as a full load, so an outro still plays but nothing survives into the next page.
8
+
9
+ The `fallback` prop decides what browsers without View Transitions get. `animate` (default) simulates the transition by setting `data-astro-transition-fallback` to `old` and then `new` on `<html>` and waiting for the CSS animations those attributes start. `swap` replaces the page at once. `none` gives those browsers a full-page navigation and no router at all: no `astro:` event fires there, not even `astro:page-load` on first load. With `none`, keep `gsap-vanilla`'s load path as the baseline.
10
+
11
+ Do not add a click interceptor beside the router to run motion. It listens on `document`, respects `defaultPrevented`, and leaves native: modified clicks, non-primary buttons, other origins, `target` other than `_self`, `download`, and anything marked `data-astro-reload`. `astro:before-preparation` is the hook. The one legitimate use of a click listener is the lock below: a capture-phase listener that calls `preventDefault()` on internal links only while a navigation is in flight, so the router never sees the second click.
12
+
13
+ ## The navigation sequence
14
+
15
+ Verified against the router source. Read the installed version's `dist/transitions/router.js` if any step below carries the design.
16
+
17
+ 1. A link click, form submit, `navigate()`, or `popstate` starts a navigation. The previous navigation, if still running, is aborted.
18
+ 2. `astro:before-preparation` fires on `document` with the old page live and visible. Cancelable; `preventDefault()` hands the navigation to the browser as a full load.
19
+ 3. `event.loader()` runs: fetch, parse into `event.newDocument`, preload new stylesheets. Wrapping it delays everything after it.
20
+ 4. `astro:after-preparation` fires. The scroll position is saved to the history entry unless this is a traverse.
21
+ 5. `data-astro-transition` is set on `<html>` to the direction and `document.startViewTransition()` snapshots the old page. From here until the new page is revealed the user sees pixels, not DOM.
22
+ 6. `astro:before-swap` fires inside the transition callback with `event.newDocument`, `event.viewTransition`, and a replaceable `event.swap`. Not cancelable.
23
+ 7. The swap: scripts already run are deselected, `<html>` attributes are replaced with the new document's, `<head>` is diffed, focus is saved, `<body>` is replaced, `transition:persist` elements are moved into the new body, focus is restored if it was inside a persisted element.
24
+ 8. History is pushed or replaced, never on traverse. Scroll goes to the top or the hash, or is restored on traverse. This runs a microtask after the swap, so for a moment the incoming body is in the document under the outgoing URL. Anything that attributes DOM state to `location`, such as a phase log or analytics, sees the new page's initial state filed under the old path. Read the destination from `event.to`, not from `location`, until `astro:after-swap`.
25
+ 9. `astro:after-swap` fires. The new DOM is in place, history and scroll are updated, nothing has painted.
26
+ 10. The transition's update callback resolves. New scripts run in document order, then `astro:page-load` fires, then the route announcer reads the new title.
27
+ 11. The view transition animates and `finished` resolves; `data-astro-transition` is removed.
28
+
29
+ On first load `astro:page-load` fires at window `load`, after images, and the router's module and the page's modules have already run by then.
30
+
31
+ ## Page lifecycle
32
+
33
+ **mount → initial state → intro → settled → outro → end state → unmount**
34
+
35
+ 1. **Outro.** `astro:before-preparation`, inside the wrapped loader, on live DOM.
36
+ 2. **End state.** The outro's completion. Outgoing targets are finalized once; the loader promise resolves and the router proceeds.
37
+ 3. **Unmount and mount.** `astro:before-swap` is the last moment the old body exists; the swap replaces it.
38
+ 4. **Initial state.** `astro:before-swap` writes the pre-paint mark onto `event.newDocument`; `astro:after-swap` writes start values on the new body before paint.
39
+ 5. **Intro.** `astro:page-load`, after the new page's scripts ran.
40
+ 6. **Settled.** Clear temporary styles. CSS owns the page.
41
+
42
+ Store the phase on the page root. A controller may track `waiting` or `preparing`, but they serve these five phases.
43
+
44
+ ## Event attributes
45
+
46
+ `astro:before-preparation` and `astro:before-swap` share `from`, `to` (writable; its final value becomes the history entry), `direction`, `navigationType` (`push`, `replace`, `traverse`), `sourceElement` (the link, the form or submitter, or the element passed to `navigate()`), `info` from `navigate()`, `newDocument`, and `signal`, an `AbortSignal` that trips when a newer navigation starts (present in the router source, not in the docs; check the installed types). Before preparation adds `formData` and a writable `loader`, and its `direction` is writable and accepts any string. Before swap adds `viewTransition` (a same-shaped stand-in in fallback mode) and `swap`, and its `direction` is read-only. `astro:after-preparation`, `astro:after-swap`, and `astro:page-load` carry nothing.
47
+
48
+ `navigate(href, { history, formData, info, state, sourceElement })` from `astro:transitions/client` starts a navigation from a script or an island. It does not sanitize `href`. Use `history.back()` and `history.forward()` for programmatic history moves; they reach the router through `popstate`. `data-astro-history="replace"` on a link does what `history: "replace"` does.
49
+
50
+ ## Outro before the swap
51
+
52
+ Wrap the loader: capture `event.loader`, replace it with a function that starts the outro and the original loader together and resolves when both are done. The router waits, so the swap cannot show the end state early, and the outro's length is the only budget the fetch gets. Starting them together rather than in sequence keeps a slow route from adding its latency to the outro.
53
+
54
+ - Skip the outro when `event.navigationType === "traverse"`, when `event.formData` is set, and when `event.to` is the current URL.
55
+ - Same-page hash links fire no events; the router only scrolls.
56
+ - One navigation at a time. The router itself offers no lock: a second click unconditionally aborts the first navigation and fires a new `astro:before-preparation` while the first outro may still be running, so "first destination wins" cannot be built from the events alone. Build it from the router's respect for `defaultPrevented`: a capture-phase click listener on `document`, active only from an accepted `astro:before-preparation` until the incoming intro starts, that applies the router's own exclusions and calls `preventDefault()` on any further internal link. If the design wants the last click to win instead, drop the guard, keep one outro by killing the running one and building the next from current values, and let the first wrapped loader resolve as soon as its `signal` aborts so nothing awaits a dead navigation.
57
+ - A click during a running view transition skips that transition and starts over. The intro that was playing is killed by the new outro, not by the router.
58
+ - Race the outro against a timeout. GSAP's ticker stops in a hidden tab, and a loader that never resolves leaves the user on a page that no longer answers clicks.
59
+ - A killed timeline never resolves its promise. Await through a helper that also resolves on `onInterrupt`.
60
+ - Under reduced motion, resolve at once.
61
+ - A navigation the loader gives up on (fetch failed, next page has no router, cross-origin redirect) becomes a full load after the outro. The end state stays on screen until the new document paints; keep it presentable.
62
+ - The loader rewrites `event.to` on a redirect, so a destination read at the start of preparation can differ from the page that arrives. Decide the intro from `event.to` in `astro:before-swap`.
63
+
64
+ ## Cleanup before the swap
65
+
66
+ `astro:before-swap` is the last event with the old body in the DOM, and the user is watching a snapshot, so nothing done here is visible. Kill the page's GSAP context, kill its ScrollTriggers, revert splits, remove listeners and observers, and undo scroll locks and `<body>` classes. Kill, not revert: `revert()` restores the inline values recorded when the context was created, which for a settled page means writing the intro's start transform and opacity back onto nodes that are still attached, and that is what the fallback path or a late snapshot shows. The old body is about to be discarded, so its inline styles do not matter; the persisted subtrees and any split markup are the parts that do, and those get `revert()`. Skip `[data-astro-transition-persist]` subtrees; they leave with the new body. Killing after the swap leaves triggers listening to scroll on behalf of nodes that no longer exist.
67
+
68
+ Do not animate here, and do not measure `event.newDocument`: it is an inert parsed document, so every box is zero.
69
+
70
+ ## Initial state on the incoming page
71
+
72
+ Arm a per-navigation deadline before marking the incoming document. Dispose the outgoing entrance timer before its outro; never let it reveal the outgoing page. Use the [recovery integration](motion-system.md#initialization-and-recovery) for swap failure, persisted nodes, and late setup.
73
+
74
+ The inline head script that marks `<html>` before first paint runs once per visit, and its attributes do not survive the swap because `<html>` attributes are replaced by the new document's. So:
75
+
76
+ - In `astro:before-swap`, set the mark and the initial phase on `event.newDocument.documentElement`. The pre-paint CSS rule then hides intro targets in the new body from the first frame it exists.
77
+ - In `astro:after-swap`, write every target's start values with `set` or `fromTo` on the live new body. Nothing has painted yet, on either the native or the fallback path.
78
+ - In `astro:page-load`, build the page controller for the current body and start the intro. The new page's scripts have run by then.
79
+
80
+ Reserve final sizes with CSS, not with inline styles a context revert would clear. The root animation you chose plays over this: with `none` on the root the new body appears at the swap holding its initial state; with `fade` it fades in holding it, and the intro starts after `viewTransition.finished` or is designed to look right under a crossfade.
81
+
82
+ Setup must be correct when it runs twice on the same body: the layout module runs it on first execution because `astro:page-load` waits for window `load`, and the event then runs it again. Key the guard on the body node, not a boolean.
83
+
84
+ ## Direction
85
+
86
+ `event.direction` is `"forward"` or `"back"`, or any string a before-preparation listener writes there to name a custom pair. Astro puts it on `<html>` as `data-astro-transition` for the length of the transition, which is what `transition:animate` keys its backwards animations on. Carry the value from `astro:before-swap` into the controller for the intro; in fallback modes the attribute can be gone by `astro:page-load`.
87
+
88
+ ## Back and forward
89
+
90
+ History navigation goes through the same events with `navigationType === "traverse"`, and the old body is still live during preparation, so unlike a plain MPA an outro is possible. Do not use it. The URL has already changed, the user expects the page they left, and after a swipe gesture the browser has already animated: the router then drops its own animation and swaps at once. Give traverse an intro-only path with no travel. If the intro should also be skipped after a gesture, read `hasUAVisualTransition` from your own `popstate` listener; the router does not pass it on.
91
+
92
+ A history entry the router did not create, or a return to a page loaded without the router, is a full reload; the first-load path handles it.
93
+
94
+ The router keeps the document alive, so the bfcache is not involved while it handles navigation. A full load from `data-astro-reload`, a page without the router, or an external site still ends the document, and pressing back can restore it from the bfcache. Keep `gsap-vanilla`'s `pagehide` rule: finish any outro instantly and leave the page readable.
95
+
96
+ ## Scroll
97
+
98
+ The router sets `history.scrollRestoration` to `manual` and owns it: push and replace scroll to the top or the hash; traverse restores the position saved on the last `scrollend`. Both happen before `astro:after-swap`, which is where the docs put a scroll override. Do not add a second reset.
99
+
100
+ Create ScrollTriggers in `astro:page-load` and refresh after fonts and the new page's images, since window `load` does not fire again. On traverse the page is already scrolled when triggers are created; reveal targets above the restored position must not stay hidden. Refresh once more at settle if the intro changed heights above a trigger.
101
+
102
+ ## Focus and announcement
103
+
104
+ After the swap, focus is restored only if it was inside a `transition:persist` element. Otherwise it is on `body`. On intro completion, move focus to the page container or main heading if it is still on `body`, with `tabindex="-1"` and a focus style that fits the design. Never take focus from a control inside a persisted region.
105
+
106
+ The router appends an `aria-live="assertive"` announcer and reads the `<title>`, first `<h1>`, or pathname shortly after `astro:page-load`. Keep a `<title>` on every page and do not add a second live region.
107
+
108
+ ## Prefetch
109
+
110
+ With the router present, prefetch is on for every internal link with the `hover` strategy unless `astro.config` says otherwise: `prefetch: false` turns it off, `prefetchAll: false` limits it to links with `data-astro-prefetch`, and `data-astro-prefetch="tap"`, `"viewport"`, or `"load"` changes one link. Data saver and slow connections fall back to `tap`.
111
+
112
+ Hover prefetch means the fetch inside the wrapped loader usually hits cache and the outro is the whole wait. Where it cannot (tap, a link far from the viewport, Safari without cache headers), the fetch runs during the outro anyway because loader and outro start together. Importing `prefetch()` from `astro:prefetch` for programmatic warming needs the `prefetch` config even though the router turned prefetching on. `experimental.clientPrerender` turns prefetch into Speculation Rules (its `eagerness` option is 5.6+); `gsap-vanilla`'s prerender rules then apply to full loads only, since the router still fetches HTML for its own swaps.
113
+
114
+ ## Combining with Astro's animations
115
+
116
+ Every element with a `transition:*` directive gets a `view-transition-name` and, by default, `transition:animate="fade"`. An element with a directive but no `transition:name` is named from its component and position, so the same component in the same place on both pages pairs up automatically. Everything else rides the browser's root crossfade. The browser animates snapshots between the swap and `finished`; GSAP animates live DOM before the snapshot and after the swap. Keep their jobs separate:
117
+
118
+ - One engine per element per navigation. A named element under a GSAP tween during the transition fights its own snapshot, and the outro's end state becomes the old snapshot.
119
+ - When GSAP owns the page transition, put `transition:name="root"` and `transition:animate="none"` on `<html>`. `none` compiles to no animation on old, new, and group, so the new body appears at the swap in its initial state and the outro's end state is the last thing seen before it. Then name only the elements the browser should morph, once per page. The `<html>` tag must be the first thing in the layout template after the frontmatter: a leading JSX-style comment or any other node makes the compiler emit a fragment with no `html`, `head`, or `body`, and the directive is dropped without a warning. An HTML comment is fine.
120
+ - For a named element, start its GSAP intro after `event.viewTransition.finished` captured in `astro:before-swap`; until then the live element sits under its pseudo-element. Elements outside the transition start at `astro:page-load`.
121
+ - `fade({ duration })` and `slide({ duration })` from `astro:transitions` adjust the presets. A custom animation is an object with `forwards` and `backwards`, each holding `old` and `new` keyframe animations, declared in component frontmatter with the keyframes in global CSS. Keep GSAP out of those.
122
+ - `initial` hands the element to the browser's default and is not simulated in fallback mode.
123
+ - Add `::view-transition { pointer-events: none }` so a running transition does not swallow clicks.
124
+ - The router disables all of its animations, fallback included, under `prefers-reduced-motion`. GSAP takes its own reduced path.
125
+
126
+ ## Cases to design for
127
+
128
+ - A click during the outro, and a click during the intro.
129
+ - Back and forward, including a swipe gesture.
130
+ - A link to a page without the router, or marked `data-astro-reload`.
131
+ - A form submission.
132
+ - A hash link on the same page and a hash link to another page.
133
+ - A `transition:persist` element or island crossing the swap mid-animation.
134
+ - A page visited a second time, whose module script does not run again.
135
+ - A destination that redirects.
136
+ - A browser without View Transitions, on the `fallback` value the site ships.
137
+ - A click from a background tab on a prefetched link.
138
+
139
+ Each case must end on one visible, interactive page with stable layout and no stale inline styles.