@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,291 @@
1
+ ---
2
+ name: ask-vaul
3
+ description: Library guide for Vaul: accessible drawer/sheet component with gestures, snap points, spring physics. Load via ask-drawer pattern skill.
4
+ ---
5
+
6
+ # Ask Vaul: Mobile Drawers & Sheets
7
+
8
+ **When to use:** Bottom sheets, side drawers, mobile navigation, filter panels, any gesture-driven overlay.
9
+
10
+ **Package:** `vaul`
11
+
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm i vaul
17
+ ```
18
+
19
+
20
+ ## Core Components
21
+
22
+ ```tsx
23
+ import {
24
+ Drawer,
25
+ DrawerTrigger,
26
+ DrawerContent,
27
+ DrawerHeader,
28
+ DrawerTitle,
29
+ DrawerDescription,
30
+ DrawerClose,
31
+ DrawerOverlay,
32
+ } from 'vaul'
33
+ ```
34
+
35
+
36
+ ## Basic Bottom Sheet
37
+
38
+ ```tsx
39
+ import { Drawer, DrawerTrigger, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerClose } from 'vaul'
40
+
41
+ function BottomSheet() {
42
+ return (
43
+ <Drawer direction="bottom" snapPoints={[0.5, 0.9, 1]}>
44
+ <DrawerTrigger asChild>
45
+ <Button variant="outline">Open Sheet</Button>
46
+ </DrawerTrigger>
47
+ <DrawerContent className="rounded-t-2xl">
48
+ <DrawerHeader>
49
+ <DrawerTitle>Sheet Title</DrawerTitle>
50
+ <DrawerDescription>Optional description</DrawerDescription>
51
+ </DrawerHeader>
52
+ <div className="p-4 space-y-4">
53
+ {/* Content */}
54
+ </div>
55
+ </DrawerContent>
56
+ </Drawer>
57
+ )
58
+ }
59
+ ```
60
+
61
+
62
+ ## Side Drawer (Navigation)
63
+
64
+ ```tsx
65
+ function SideDrawer() {
66
+ return (
67
+ <Drawer direction="right" snapPoints={[1]}>
68
+ <DrawerTrigger asChild>
69
+ <Button variant="ghost" className="md:hidden"><Menu className="h-6 w-6" /></Button>
70
+ </DrawerTrigger>
71
+ <DrawerContent className="w-72 max-w-[85vw]">
72
+ <DrawerHeader className="flex items-center justify-between p-4 border-b">
73
+ <DrawerTitle>Menu</DrawerTitle>
74
+ <DrawerClose asChild>
75
+ <Button variant="ghost" size="icon" className="md:hidden"><X className="h-5 w-5" /></Button>
76
+ </DrawerClose>
77
+ </DrawerHeader>
78
+ <nav className="p-4 space-y-1">
79
+ <Link href="/" className="flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-gray-100">
80
+ <Home className="h-5 w-5" /> Dashboard
81
+ </Link>
82
+ <Link href="/projects" className="flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-gray-100">
83
+ <Folder className="h-5 w-5" /> Projects
84
+ </Link>
85
+ </nav>
86
+ </DrawerContent>
87
+ </Drawer>
88
+ )
89
+ }
90
+ ```
91
+
92
+
93
+ ## Snap Points Configuration
94
+
95
+ | Snap Points | Behavior |
96
+ |-------------|----------|
97
+ | `[0.5, 1]` | Half → Full |
98
+ | `[0.3, 0.6, 1]` | Three tiers |
99
+ | `[1]` | Full only (side drawers) |
100
+ | `[0.4, 0.85]` | Custom percentages |
101
+
102
+ ```tsx
103
+ // Half sheet for quick actions
104
+ <Drawer direction="bottom" snapPoints={[0.4]}>
105
+
106
+ // Full height for forms
107
+ <Drawer direction="bottom" snapPoints={[1]}>
108
+
109
+ // Multi-tier for filters
110
+ <Drawer direction="bottom" snapPoints={[0.3, 0.6, 1]}>
111
+ ```
112
+
113
+
114
+ ## Custom Handle / Trigger
115
+
116
+ ```tsx
117
+ function FilterDrawer() {
118
+ return (
119
+ <Drawer direction="bottom" snapPoints={[0.4, 0.85, 1]}>
120
+ <DrawerTrigger asChild>
121
+ <Button variant="outline" className="gap-2">
122
+ <Filter className="h-4 w-4" />
123
+ Filters
124
+ {hasActiveFilters && <Badge variant="secondary">{count}</Badge>}
125
+ </Button>
126
+ </DrawerTrigger>
127
+ <DrawerContent className="rounded-t-2xl">
128
+ {/* Custom handle area */}
129
+ <div className="flex items-center justify-between px-4 py-3 border-b">
130
+ <DrawerTitle>Filters</DrawerTitle>
131
+ <Button variant="ghost" size="icon" onClick={resetFilters} disabled={!hasActiveFilters}>
132
+ <RotateCcw className="h-4 w-4" />
133
+ </Button>
134
+ </div>
135
+ <div className="p-4 space-y-6 max-h-[70vh] overflow-y-auto">
136
+ {/* Filter sections */}
137
+ </div>
138
+ <div className="flex gap-2 p-4 border-t">
139
+ <Button variant="outline" className="flex-1" onClick={resetFilters}>Reset</Button>
140
+ <Button className="flex-1" onClick={applyFilters}>Apply ({activeCount})</Button>
141
+ </div>
142
+ </DrawerContent>
143
+ </Drawer>
144
+ )
145
+ }
146
+ ```
147
+
148
+
149
+ ## Nested Drawers (Drill-down)
150
+
151
+ ```tsx
152
+ function NestedCategoryDrawer({ categories, onSelect }) {
153
+ const [stack, setStack] = useState<Category[]>([rootCategory])
154
+
155
+ const current = stack[stack.length - 1]
156
+
157
+ return (
158
+ <Drawer direction="bottom" snapPoints={[1]}>
159
+ <DrawerContent className="rounded-t-2xl">
160
+ <DrawerHeader className="flex items-center justify-between p-4 border-b">
161
+ <DrawerTitle>{current.name}</DrawerTitle>
162
+ <div className="flex gap-2">
163
+ {stack.length > 1 && (
164
+ <DrawerClose asChild>
165
+ <Button variant="ghost" size="icon" onClick={() => setStack(s => s.slice(0, -1))}>
166
+ <ChevronLeft className="h-5 w-5" />
167
+ </Button>
168
+ </DrawerClose>
169
+ )}
170
+ <DrawerClose asChild>
171
+ <Button variant="ghost" size="icon"><X className="h-5 w-5" /></Button>
172
+ </DrawerClose>
173
+ </div>
174
+ </DrawerHeader>
175
+ <div className="p-4 space-y-2 max-h-[70vh] overflow-y-auto">
176
+ {current.children?.map((child) => (
177
+ <Button
178
+ key={child.id}
179
+ variant="outline"
180
+ className="w-full justify-between"
181
+ onClick={() => child.children ? setStack(s => [...s, child]) : onSelect(child)}
182
+ >
183
+ {child.name}
184
+ {child.children && <ChevronRight className="h-4 w-4" />}
185
+ </Button>
186
+ ))}
187
+ </div>
188
+ </DrawerContent>
189
+ </Drawer>
190
+ )
191
+ }
192
+ ```
193
+
194
+
195
+ ## Form in Drawer
196
+
197
+ ```tsx
198
+ function CreateProjectDrawer({ onSuccess }) {
199
+ const form = useForm<ProjectInput>({ resolver: zodResolver(projectSchema) })
200
+
201
+ return (
202
+ <Drawer direction="bottom" snapPoints={[0.9, 1]}>
203
+ <DrawerTrigger asChild>
204
+ <Button><Plus className="h-4 w-4 mr-2" />New Project</Button>
205
+ </DrawerTrigger>
206
+ <DrawerContent className="rounded-t-2xl">
207
+ <DrawerHeader>
208
+ <DrawerTitle>New Project</DrawerTitle>
209
+ </DrawerHeader>
210
+ <Form {...form}>
211
+ <form onSubmit={form.handleSubmit(onSubmit)} className="p-4 space-y-4 max-h-[75vh] overflow-y-auto">
212
+ <FormField name="name" label="Name" />
213
+ <FormField name="description" label="Description" type="textarea" />
214
+ <FormField name="visibility" label="Visibility" type="select" selectOptions={[
215
+ { value: 'private', label: 'Private' },
216
+ { value: 'team', label: 'Team' },
217
+ { value: 'public', label: 'Public' },
218
+ ]} />
219
+ <div className="flex gap-2 pt-4 border-t">
220
+ <Button type="button" variant="outline" className="flex-1" onClick={onClose}>Cancel</Button>
221
+ <Button type="submit" className="flex-1" disabled={form.formState.isSubmitting}>
222
+ {form.formState.isSubmitting ? 'Creating…' : 'Create'}
223
+ </Button>
224
+ </div>
225
+ </form>
226
+ </Form>
227
+ </DrawerContent>
228
+ </Drawer>
229
+ )
230
+ }
231
+ ```
232
+
233
+
234
+ ## Drawer Props Reference
235
+
236
+ | Prop | Type | Default | Description |
237
+ |------|------|---------|-------------|
238
+ | `direction` | `'bottom' \| 'top' \| 'left' \| 'right'` | `'bottom'` | Drawer direction |
239
+ | `snapPoints` | `number[]` | `[1]` | Array of 0-1 percentages |
240
+ | `open` | `boolean` | - | Controlled open |
241
+ | `onOpenChange` | `(open: boolean) => void` | - | Open change handler |
242
+ | `dismissible` | `boolean` | `true` | Allow swipe/backdrop dismiss |
243
+ | `snapTo` | `number` | - | Programmatic snap |
244
+ | `overscroll` | `boolean` | `false` | Allow overscroll past snap |
245
+
246
+
247
+ ## Motion Integration (House-Style)
248
+
249
+ Vaul uses spring physics internally. For custom animations:
250
+
251
+ ```tsx
252
+ import { motion, AnimatePresence } from 'motion/react'
253
+
254
+ // Vaul handles the drawer animation
255
+ // Wrap content for custom enter/exit if needed
256
+ <DrawerContent className="rounded-t-2xl">
257
+ <AnimatePresence mode="wait">
258
+ {isOpen && <DrawerContentInner />}
259
+ </AnimatePresence>
260
+ </DrawerContent>
261
+ ```
262
+
263
+
264
+ ## Accessibility (Built-in)
265
+
266
+ - Focus trap inside drawer
267
+ - ESC to close
268
+ - Backdrop click to close (configurable)
269
+ - Focus restore to trigger on close
270
+ - ARIA attributes on all elements
271
+ - Keyboard navigation (Tab, arrows)
272
+
273
+
274
+ ## Common Issues
275
+
276
+ | Issue | Fix |
277
+ |-------|-----|
278
+ | Drawer not opening | Check `DrawerTrigger` wraps a button, not a div |
279
+ | Snap points not working | Ensure values are 0-1, array not empty |
280
+ | Scroll not working | Content must be in `DrawerContent`, not `Drawer` |
281
+ | Z-index issues | Vaul portals to body: check global stacking |
282
+ | Mobile keyboard covers input | Vaul handles this: ensure `snapPoints` includes full height |
283
+ | Gesture conflicts | Set `overscroll={true}` if nested scrollable content |
284
+
285
+
286
+ ## Related Skills
287
+
288
+ - `ui/ask-drawer` - Pattern guide for drawers/sheets
289
+ - `ui/ask-base-ui` - Alternative: base-ui Sheet primitive
290
+ - `ui/ask-form` - Forms in drawers
291
+ - `ui/ui-engineering` - Master orchestrator
@@ -0,0 +1,304 @@
1
+ ---
2
+ name: ask-virtual-list
3
+ description: Pattern guide for virtualized lists: infinite scroll, variable heights, dynamic content, smooth scrolling. Load via ui-engineering. Invokes pick-ui-library → recommends Virtuoso → loads ask-virtuoso for implementation.
4
+ ---
5
+
6
+ # Ask Virtual List: Infinite Scroll, Variable Heights, Smooth Performance
7
+
8
+ **When to use:** Long lists: feeds, chat, logs, activity, notifications, search results, any list >100 items.
9
+
10
+
11
+ ## The Pattern
12
+
13
+ | Feature | Quality Bar |
14
+ |---------|-------------|
15
+ | **Smooth 60fps** | No jank at 10k+ items, variable heights |
16
+ | **Infinite scroll** | Load more at threshold, skeleton placeholders |
17
+ | **Variable heights** | Dynamic measurement, cache heights, no layout shift |
18
+ | **Scroll restoration** | Restore position on back navigation |
19
+ | **Jump to top/bottom** | Button appears after scroll, smooth scroll |
20
+ | **Pull to refresh** | Mobile: drag down to refresh |
21
+ | **Sticky headers** | Section headers stick during scroll |
22
+ | **End detection** | "No more items" state, not just spinner |
23
+ | **Keyboard** | Home/End, Page Up/Down, arrow keys |
24
+ | **Accessibility** | ARIA feed/listbox, live region for new items |
25
+
26
+
27
+ ## Quality Checklist
28
+
29
+ - [ ] **Virtuoso**: Handles variable heights, grouping, infinite scroll out of box
30
+ - [ ] **Overscan**: Render 5-10 items above/below viewport
31
+ - [ ] **Height caching**: Measure once, cache, invalidate on content change
32
+ - [ ] **Skeleton loading**: Same height as real items, shimmer animation
33
+ - [ ] **Intersection Observer**: For load-more trigger (not scroll listener)
34
+ - [ ] **Scroll restoration**: `history.scrollRestoration = 'manual'` + save/restore
35
+ - [ ] **No layout shift**: Reserve space for async images/avatars
36
+ - [ ] **Memory**: Unmount far items, don't accumulate DOM nodes
37
+
38
+
39
+ ## Anti-Patterns
40
+
41
+ - ❌ `react-window` fixed height only: Breaks with variable content
42
+ - ❌ No overscan: Flashing blank space on fast scroll
43
+ - ❌ Scroll listener for load-more: Jank, fires too often
44
+ - ❌ No skeleton: Content pops in, layout shift
45
+ - ❌ No scroll restoration: Back button loses position
46
+ - ❌ All items in DOM: 10k items = frozen tab
47
+ - ❌ No sticky headers: Sections lose context
48
+ - ❌ Images without dimensions: Layout shift on load
49
+
50
+
51
+ ## Implementation Flow
52
+
53
+ ```
54
+ User needs virtual list/infinite scroll
55
+ │
56
+ ├─► ui-engineering detects "list/feed/infinite scroll/chat/logs"
57
+ │
58
+ ├─► pick-ui-library → recommends Virtuoso
59
+ │
60
+ ├─► load ask-virtuoso (library skill)
61
+ │
62
+ └─► implement with Virtuoso + infinite scroll + skeletons
63
+ ```
64
+
65
+
66
+ ## Core Setup (Virtuoso)
67
+
68
+ ```tsx
69
+ // components/VirtualList.tsx
70
+ import { Virtuoso } from 'react-virtuoso'
71
+ import { useInView } from 'react-intersection-observer'
72
+
73
+ interface VirtualListProps<T> {
74
+ data: T[]
75
+ renderItem: (item: T, index: number) => React.ReactNode
76
+ renderSkeleton?: () => React.ReactNode
77
+ loadMore?: () => Promise<void>
78
+ hasMore?: boolean
79
+ isLoading?: boolean
80
+ endMessage?: string
81
+ overscan?: number
82
+ stickyHeader?: React.ReactNode
83
+ groupBy?: (item: T) => string
84
+ groupContent?: (key: string) => React.ReactNode
85
+ }
86
+
87
+ export function VirtualList<T>({
88
+ data,
89
+ renderItem,
90
+ renderSkeleton = DefaultSkeleton,
91
+ loadMore,
92
+ hasMore = false,
93
+ isLoading = false,
94
+ endMessage = 'No more items',
95
+ overscan = 100,
96
+ stickyHeader,
97
+ groupBy,
98
+ groupContent,
99
+ }: VirtualListProps<T>) {
100
+ const { ref: loadMoreRef, inView } = useInView({ threshold: 0.1 })
101
+
102
+ useEffect(() => {
103
+ if (inView && hasMore && !isLoading && loadMore) {
104
+ loadMore()
105
+ }
106
+ }, [inView, hasMore, isLoading, loadMore])
107
+
108
+ return (
109
+ <Virtuoso
110
+ data={data}
111
+ overscan={overscan}
112
+ itemContent={(index, item) => renderItem(item, index)}
113
+ endContent={
114
+ hasMore ? (
115
+ <div className="flex justify-center py-4" ref={loadMoreRef}>
116
+ {isLoading ? <Spinner className="h-6 w-6" /> : <EndDetector />}
117
+ </div>
118
+ ) : (
119
+ <div className="flex justify-center py-4 text-gray-500">{endMessage}</div>
120
+ )
121
+ }
122
+ header={stickyHeader}
123
+ groupCounts={groupBy ? data.reduce((acc, item) => {
124
+ const key = groupBy(item)
125
+ acc[key] = (acc[key] || 0) + 1
126
+ return acc
127
+ }, {} as Record<string, number>) : undefined}
128
+ groupContent={groupContent}
129
+ style={{ height: '100%', width: '100%' }}
130
+ listRef={(el) => { /* scroll restoration */ }}
131
+ />
132
+ )
133
+ }
134
+
135
+ function DefaultSkeleton() {
136
+ return (
137
+ <div className="h-16 animate-pulse bg-gray-200 dark:bg-gray-700 rounded" />
138
+ )
139
+ }
140
+
141
+ function EndDetector() {
142
+ return null // Just for intersection observer
143
+ }
144
+ ```
145
+
146
+
147
+ ## Feed Example (Linear/Twitter-style)
148
+
149
+ ```tsx
150
+ // components/ActivityFeed.tsx
151
+ 'use client'
152
+
153
+ import { useState, useCallback } from 'react'
154
+ import { VirtualList } from '@/components/VirtualList'
155
+ import { ActivityItem } from '@/components/ActivityItem'
156
+ import { api } from '@/lib/api'
157
+
158
+ export function ActivityFeed() {
159
+ const [activities, setActivities] = useState<Activity[]>([])
160
+ const [page, setPage] = useState(1)
161
+ const [hasMore, setHasMore] = useState(true)
162
+ const [isLoading, setIsLoading] = useState(false)
163
+
164
+ const loadMore = useCallback(async () => {
165
+ if (isLoading || !hasMore) return
166
+ setIsLoading(true)
167
+ try {
168
+ const { data, hasMore: more } = await api.getActivities({ page: page + 1 })
169
+ setActivities(prev => [...prev, ...data])
170
+ setPage(p => p + 1)
171
+ setHasMore(more)
172
+ } finally {
173
+ setIsLoading(false)
174
+ }
175
+ }, [page, hasMore, isLoading])
176
+
177
+ // Initial load
178
+ useEffect(() => {
179
+ loadMore()
180
+ }, [])
181
+
182
+ return (
183
+ <VirtualList
184
+ data={activities}
185
+ renderItem={(activity) => <ActivityItem activity={activity} />}
186
+ renderSkeleton={() => <ActivitySkeleton />}
187
+ loadMore={loadMore}
188
+ hasMore={hasMore}
189
+ isLoading={isLoading}
190
+ endMessage="All caught up!"
191
+ overscan={50}
192
+ />
193
+ )
194
+ }
195
+ ```
196
+
197
+
198
+ ## Chat/Message List (Variable Heights)
199
+
200
+ ```tsx
201
+ // components/ChatList.tsx
202
+ import { Virtuoso } from 'react-virtuoso'
203
+ import { useRef, useEffect } from 'react'
204
+
205
+ export function ChatList({ messages, onScrollToBottom }) {
206
+ const virtuosoRef = useRef<VirtuosoHandle>(null)
207
+ const [scrolledToBottom, setScrolledToBottom] = useState(true)
208
+
209
+ const handleScroll = useCallback((top: number) => {
210
+ const { scrollHeight, clientHeight, scrollTop } = virtuosoRef.current?.getScrollElement() || {}
211
+ setScrolledToBottom(scrollHeight - scrollTop - clientHeight < 100)
212
+ }, [])
213
+
214
+ // Auto-scroll on new message if at bottom
215
+ useEffect(() => {
216
+ if (scrolledToBottom && messages.length > 0) {
217
+ virtuosoRef.current?.scrollToIndex({ index: messages.length - 1, align: 'end' })
218
+ }
219
+ }, [messages, scrolledToBottom])
220
+
221
+ return (
222
+ <Virtuoso
223
+ ref={virtuosoRef}
224
+ data={messages}
225
+ itemContent={(index, message) => <MessageBubble message={message} />}
226
+ overscan={20}
227
+ style={{ height: '100%', width: '100%' }}
228
+ onScroll={handleScroll}
229
+ endContent={
230
+ !scrolledToBottom && (
231
+ <button
232
+ className="fixed bottom-4 right-4 z-10 px-3 py-1 rounded-full bg-primary text-primary-foreground shadow-lg"
233
+ onClick={() => virtuosoRef.current?.scrollToIndex({ index: messages.length - 1, align: 'end' })}
234
+ >
235
+ ↓ New messages
236
+ </button>
237
+ )
238
+ }
239
+ />
240
+ )
241
+ }
242
+ ```
243
+
244
+
245
+ ## Skeletons (Match Real Item Height)
246
+
247
+ ```tsx
248
+ // components/ActivitySkeleton.tsx
249
+ export function ActivitySkeleton() {
250
+ return (
251
+ <div className="p-4 border-b dark:border-gray-800">
252
+ <div className="flex gap-3">
253
+ <div className="h-10 w-10 rounded-full animate-pulse bg-gray-200 dark:bg-gray-700" />
254
+ <div className="flex-1 space-y-2">
255
+ <div className="h-4 w-3/4 animate-pulse bg-gray-200 dark:bg-gray-700 rounded" />
256
+ <div className="h-3 w-1/2 animate-pulse bg-gray-200 dark:bg-gray-700 rounded" />
257
+ </div>
258
+ </div>
259
+ </div>
260
+ )
261
+ }
262
+ ```
263
+
264
+
265
+ ## Scroll Restoration (Back Button)
266
+
267
+ ```tsx
268
+ // hooks/useScrollRestoration.ts
269
+ 'use client'
270
+
271
+ import { useEffect, useRef } from 'react'
272
+
273
+ export function useScrollRestoration(key: string) {
274
+ const saved = useRef<number | null>(null)
275
+
276
+ useEffect(() => {
277
+ // Save on unmount
278
+ return () => {
279
+ const el = document.querySelector('[data-virtuoso-scroller]')
280
+ if (el) saved.current = el.scrollTop
281
+ sessionStorage.setItem(`scroll:${key}`, String(saved.current ?? 0))
282
+ }
283
+ }, [key])
284
+
285
+ useEffect(() => {
286
+ // Restore on mount
287
+ const stored = sessionStorage.getItem(`scroll:${key}`)
288
+ if (stored) {
289
+ const el = document.querySelector('[data-virtuoso-scroller]')
290
+ if (el) el.scrollTop = Number(stored)
291
+ }
292
+ }, [key])
293
+ }
294
+ ```
295
+
296
+
297
+ ## When to Escalate
298
+
299
+ | Need | Escalate To |
300
+ |------|-------------|
301
+ | Table with columns | `ask-table` + `ask-tanstack-table` |
302
+ | Sticky section headers | `ask-virtual-list` built-in groups |
303
+ | Drag to reorder | `ask-animation` + `dnd-kit` |
304
+ | Real-time prepend | `ask-virtual-list` + WebSocket |