@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.
- package/LICENSE +21 -0
- package/README.md +351 -0
- package/bin/skillset.mjs +205 -0
- package/curations/README.md +53 -0
- package/curations/TEMPLATE/WHY.md +23 -0
- package/curations/TEMPLATE/overlay/SKILL.md +6 -0
- package/curations/impeccable/WHY.md +34 -0
- package/curations/impeccable/overlay/SKILL.md +116 -0
- package/package.json +43 -0
- package/scripts/ste-gate.mjs +39 -0
- package/scripts/ste-lint.py +201 -0
- package/scripts/sync.mjs +174 -0
- package/skills/ai-agent/agent-docs-writer/SKILL.md +105 -0
- package/skills/ai-agent/agent-docs-writer/references/principles.md +73 -0
- package/skills/ai-agent/agent-docs-writer/templates/AGENTS.template.md +44 -0
- package/skills/ai-agent/agent-docs-writer/templates/README.template.md +19 -0
- package/skills/ai-agent/ultra-context-engine/SKILL.md +941 -0
- package/skills/architecture/blueprint/SKILL.md +191 -0
- package/skills/architecture/code-tour/SKILL.md +204 -0
- package/skills/architecture/progress-guard/SKILL.md +148 -0
- package/skills/architecture/search-first/SKILL.md +97 -0
- package/skills/backend/api-design/SKILL.md +456 -0
- package/skills/backend/auth/SKILL.md +596 -0
- package/skills/backend/database/SKILL.md +431 -0
- package/skills/backend/realtime/SKILL.md +670 -0
- package/skills/backend/security/SKILL.md +590 -0
- package/skills/business/brag/SKILL.md +177 -0
- package/skills/business/brag/assets/music/README.md +20 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
- package/skills/business/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
- package/skills/business/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/business/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/business/brag/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/business/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/business/brag/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/business/brag/assets/sfx/sfx-analysis.md +75 -0
- package/skills/business/brag/assets/sfx/ui/click1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click3.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/click5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/business/brag/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/business/brag/references/audio.md +307 -0
- package/skills/business/brag/references/step-1-inspect.md +133 -0
- package/skills/business/brag/references/step-2-plan.md +234 -0
- package/skills/business/brag/references/step-3-compose.md +210 -0
- package/skills/business/brag/references/step-4-deliver.md +168 -0
- package/skills/business/brag/references/tones.md +231 -0
- package/skills/business/brag/scripts/analyze_music_cues.py +309 -0
- package/skills/business/brag/scripts/pyproject.toml +14 -0
- package/skills/business/brag/scripts/uv.lock +819 -0
- package/skills/business/copywriting/SKILL.md +178 -0
- package/skills/business/customer-research/SKILL.md +259 -0
- package/skills/business/freelancing/SKILL.md +679 -0
- package/skills/business/launch/SKILL.md +273 -0
- package/skills/business/marketing-psychology/SKILL.md +364 -0
- package/skills/business/pricing/SKILL.md +233 -0
- package/skills/business/resume-revamp-jake-ats/SKILL.md +64 -0
- package/skills/business/startup-founder/SKILL.md +400 -0
- package/skills/business/startup-founder/references/funding.md +48 -0
- package/skills/business/startup-founder/references/further-reading.md +132 -0
- package/skills/business/startup-founder/references/gtm-tools.md +57 -0
- package/skills/business/startup-founder/references/legal-india.md +36 -0
- package/skills/business/startup-founder/references/marketing/README.md +16 -0
- package/skills/business/startup-founder/references/marketing/cold-email.md +172 -0
- package/skills/business/startup-founder/references/marketing/competitors.md +245 -0
- package/skills/business/startup-founder/references/marketing/customer-research.md +276 -0
- package/skills/business/startup-founder/references/marketing/free-tools.md +168 -0
- package/skills/business/startup-founder/references/marketing/launch.md +343 -0
- package/skills/business/startup-founder/references/marketing/marketing-plan.md +270 -0
- package/skills/business/startup-founder/references/marketing/pricing.md +237 -0
- package/skills/business/startup-founder/references/marketing/product-marketing.md +250 -0
- package/skills/business/startup-founder/references/validation.md +267 -0
- package/skills/devops/deployments/SKILL.md +339 -0
- package/skills/devops/git-ci/SKILL.md +372 -0
- package/skills/devops/performance/SKILL.md +523 -0
- package/skills/devops/testing/SKILL.md +558 -0
- package/skills/engineering/code-review/SKILL.md +149 -0
- package/skills/engineering/coding-standards/SKILL.md +229 -0
- package/skills/engineering/product-engineering/SKILL.md +219 -0
- package/skills/engineering/senior-engineer-prompts/SKILL.md +145 -0
- package/skills/engineering/tdd-workflow/SKILL.md +178 -0
- package/skills/engineering/verification-loop/SKILL.md +199 -0
- package/skills/nerdev/nerdev-abstraction/SKILL.md +412 -0
- package/skills/nerdev/nerdev-docs/SKILL.md +527 -0
- package/skills/nerdev/nerdev-docs/templates/adr-template.md +39 -0
- package/skills/nerdev/nerdev-docs/templates/contributing-template.md +140 -0
- package/skills/nerdev/nerdev-docs/templates/deploy-template.md +426 -0
- package/skills/nerdev/nerdev-docs/templates/design-template.md +105 -0
- package/skills/nerdev/nerdev-docs/templates/incident-template.md +66 -0
- package/skills/nerdev/nerdev-monorepo/SKILL.md +522 -0
- package/skills/quality/output-skill/SKILL.md +49 -0
- package/skills/quality/unslop/SKILL.md +67 -0
- package/skills/ui/animaxxing/SKILL.md +58 -0
- package/skills/ui/animaxxing/agents/openai.yaml +7 -0
- package/skills/ui/animaxxing/references/effect-restoration.md +26 -0
- package/skills/ui/animaxxing/references/motion-vocabulary.md +142 -0
- package/skills/ui/animaxxing/references/recipes/blast-off.md +119 -0
- package/skills/ui/animaxxing/references/recipes/particle-effects.md +718 -0
- package/skills/ui/animaxxing/references/recipes/particle-field.md +428 -0
- package/skills/ui/animaxxing/references/recipes/route-letters.md +205 -0
- package/skills/ui/animaxxing/references/recipes/speak-in.md +181 -0
- package/skills/ui/animaxxing/references/recipes/split-entrances.md +345 -0
- package/skills/ui/animaxxing/references/recipes/wave.md +144 -0
- package/skills/ui/animaxxing/references/text-stability.md +68 -0
- package/skills/ui/animaxxing/references/verification.md +44 -0
- package/skills/ui/ask-animation/SKILL.md +178 -0
- package/skills/ui/ask-base-ui/SKILL.md +400 -0
- package/skills/ui/ask-cmdk/SKILL.md +315 -0
- package/skills/ui/ask-command-menu/SKILL.md +262 -0
- package/skills/ui/ask-drawer/SKILL.md +235 -0
- package/skills/ui/ask-form/SKILL.md +229 -0
- package/skills/ui/ask-gsap/SKILL.md +435 -0
- package/skills/ui/ask-modal/SKILL.md +145 -0
- package/skills/ui/ask-motion/SKILL.md +339 -0
- package/skills/ui/ask-rhf/SKILL.md +388 -0
- package/skills/ui/ask-sonner/API.md +64 -0
- package/skills/ui/ask-sonner/SKILL.md +88 -0
- package/skills/ui/ask-table/SKILL.md +253 -0
- package/skills/ui/ask-tanstack-table/SKILL.md +490 -0
- package/skills/ui/ask-toast/SKILL.md +163 -0
- package/skills/ui/ask-vaul/SKILL.md +291 -0
- package/skills/ui/ask-virtual-list/SKILL.md +304 -0
- package/skills/ui/ask-virtuoso/SKILL.md +332 -0
- package/skills/ui/email-craft/SKILL.md +258 -0
- package/skills/ui/frontend-craftsmanship/SKILL.md +462 -0
- package/skills/ui/gsap-astro/SKILL.md +56 -0
- package/skills/ui/gsap-astro/agents/openai.yaml +7 -0
- package/skills/ui/gsap-astro/references/client-router-navigation.md +139 -0
- package/skills/ui/gsap-astro/references/initialization.md +87 -0
- package/skills/ui/gsap-astro/references/motion-system.md +152 -0
- package/skills/ui/gsap-astro/references/scripts-and-islands.md +65 -0
- package/skills/ui/gsap-astro/references/verification.md +44 -0
- package/skills/ui/gsap-core/SKILL.md +254 -0
- package/skills/ui/gsap-frameworks/SKILL.md +266 -0
- package/skills/ui/gsap-nextjs/SKILL.md +51 -0
- package/skills/ui/gsap-nextjs/agents/openai.yaml +7 -0
- package/skills/ui/gsap-nextjs/references/app-router-navigation.md +189 -0
- package/skills/ui/gsap-nextjs/references/initialization.md +87 -0
- package/skills/ui/gsap-nextjs/references/motion-system.md +158 -0
- package/skills/ui/gsap-nextjs/references/verification.md +40 -0
- package/skills/ui/gsap-nuxt/SKILL.md +56 -0
- package/skills/ui/gsap-nuxt/agents/openai.yaml +7 -0
- package/skills/ui/gsap-nuxt/references/initialization.md +87 -0
- package/skills/ui/gsap-nuxt/references/motion-system.md +161 -0
- package/skills/ui/gsap-nuxt/references/navigation.md +145 -0
- package/skills/ui/gsap-nuxt/references/page-transitions.md +107 -0
- package/skills/ui/gsap-nuxt/references/verification.md +42 -0
- package/skills/ui/gsap-performance/SKILL.md +79 -0
- package/skills/ui/gsap-plugins/SKILL.md +433 -0
- package/skills/ui/gsap-react/SKILL.md +136 -0
- package/skills/ui/gsap-react-router/SKILL.md +55 -0
- package/skills/ui/gsap-react-router/agents/openai.yaml +7 -0
- package/skills/ui/gsap-react-router/references/initialization.md +87 -0
- package/skills/ui/gsap-react-router/references/motion-system.md +158 -0
- package/skills/ui/gsap-react-router/references/react-router-navigation.md +165 -0
- package/skills/ui/gsap-react-router/references/route-lifetime.md +74 -0
- package/skills/ui/gsap-react-router/references/verification.md +42 -0
- package/skills/ui/gsap-scrolltrigger/SKILL.md +296 -0
- package/skills/ui/gsap-sveltekit/SKILL.md +54 -0
- package/skills/ui/gsap-sveltekit/agents/openai.yaml +7 -0
- package/skills/ui/gsap-sveltekit/references/initialization.md +87 -0
- package/skills/ui/gsap-sveltekit/references/motion-system.md +156 -0
- package/skills/ui/gsap-sveltekit/references/page-lifetime.md +63 -0
- package/skills/ui/gsap-sveltekit/references/sveltekit-navigation.md +160 -0
- package/skills/ui/gsap-sveltekit/references/verification.md +41 -0
- package/skills/ui/gsap-tanstack-router/SKILL.md +56 -0
- package/skills/ui/gsap-tanstack-router/agents/openai.yaml +7 -0
- package/skills/ui/gsap-tanstack-router/references/initialization.md +87 -0
- package/skills/ui/gsap-tanstack-router/references/motion-system.md +160 -0
- package/skills/ui/gsap-tanstack-router/references/route-lifetime.md +66 -0
- package/skills/ui/gsap-tanstack-router/references/tanstack-navigation.md +156 -0
- package/skills/ui/gsap-tanstack-router/references/verification.md +41 -0
- package/skills/ui/gsap-timeline/SKILL.md +107 -0
- package/skills/ui/gsap-utils/SKILL.md +284 -0
- package/skills/ui/gsap-vanilla/SKILL.md +63 -0
- package/skills/ui/gsap-vanilla/agents/openai.yaml +7 -0
- package/skills/ui/gsap-vanilla/references/cross-document-navigation.md +54 -0
- package/skills/ui/gsap-vanilla/references/initialization.md +87 -0
- package/skills/ui/gsap-vanilla/references/motion-system.md +150 -0
- package/skills/ui/gsap-vanilla/references/page-load.md +96 -0
- package/skills/ui/gsap-vanilla/references/spa-navigation.md +70 -0
- package/skills/ui/gsap-vanilla/references/verification.md +41 -0
- package/skills/ui/house-style/SKILL.md +366 -0
- package/skills/ui/imagegen/SKILL.md +49 -0
- package/skills/ui/imagegen/references/brandkit.md +48 -0
- package/skills/ui/imagegen/references/image-to-code.md +56 -0
- package/skills/ui/imagegen/references/mobile.md +58 -0
- package/skills/ui/imagegen/references/web.md +63 -0
- package/skills/ui/impeccable/SKILL.md +116 -0
- package/skills/ui/impeccable/reference/adapt.md +318 -0
- package/skills/ui/impeccable/reference/adapt.native.md +58 -0
- package/skills/ui/impeccable/reference/android.md +46 -0
- package/skills/ui/impeccable/reference/animate.md +89 -0
- package/skills/ui/impeccable/reference/audit.md +137 -0
- package/skills/ui/impeccable/reference/audit.native.md +139 -0
- package/skills/ui/impeccable/reference/bolder.md +33 -0
- package/skills/ui/impeccable/reference/clarify.md +94 -0
- package/skills/ui/impeccable/reference/colorize.md +86 -0
- package/skills/ui/impeccable/reference/craft-floor.md +44 -0
- package/skills/ui/impeccable/reference/craft.md +5 -0
- package/skills/ui/impeccable/reference/critique.md +806 -0
- package/skills/ui/impeccable/reference/degraded/asset-producer.md +37 -0
- package/skills/ui/impeccable/reference/degraded/documenter.md +24 -0
- package/skills/ui/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/skills/ui/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/skills/ui/impeccable/reference/delight.md +70 -0
- package/skills/ui/impeccable/reference/distill.md +111 -0
- package/skills/ui/impeccable/reference/doctor.md +54 -0
- package/skills/ui/impeccable/reference/document.md +416 -0
- package/skills/ui/impeccable/reference/extract.md +69 -0
- package/skills/ui/impeccable/reference/generate.md +101 -0
- package/skills/ui/impeccable/reference/harden.md +345 -0
- package/skills/ui/impeccable/reference/hooks.md +111 -0
- package/skills/ui/impeccable/reference/init.md +131 -0
- package/skills/ui/impeccable/reference/ios.md +51 -0
- package/skills/ui/impeccable/reference/layout.md +84 -0
- package/skills/ui/impeccable/reference/live-setup.md +104 -0
- package/skills/ui/impeccable/reference/live.md +325 -0
- package/skills/ui/impeccable/reference/new-work.md +145 -0
- package/skills/ui/impeccable/reference/onboard.md +234 -0
- package/skills/ui/impeccable/reference/operate.md +61 -0
- package/skills/ui/impeccable/reference/optimize.md +258 -0
- package/skills/ui/impeccable/reference/overdrive.md +127 -0
- package/skills/ui/impeccable/reference/polish.md +105 -0
- package/skills/ui/impeccable/reference/quieter.md +99 -0
- package/skills/ui/impeccable/reference/routing.md +24 -0
- package/skills/ui/impeccable/reference/shape.md +59 -0
- package/skills/ui/impeccable/reference/typeset.md +80 -0
- package/skills/ui/impeccable/reference/visualize.md +46 -0
- package/skills/ui/impeccable/scripts/VERSION +1 -0
- package/skills/ui/impeccable/scripts/command-metadata.json +98 -0
- package/skills/ui/impeccable/scripts/data/font-index-failures.json +121 -0
- package/skills/ui/impeccable/scripts/data/font-index.json +1 -0
- package/skills/ui/impeccable/scripts/impeccable +206 -0
- package/skills/ui/impeccable/scripts/impeccable.cmd +214 -0
- package/skills/ui/impeccable/scripts/live-browser-dom.js +167 -0
- package/skills/ui/impeccable/scripts/live-browser-ignores.js +242 -0
- package/skills/ui/impeccable/scripts/live-browser-session.js +144 -0
- package/skills/ui/impeccable/scripts/live-browser.js +13510 -0
- package/skills/ui/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/skills/ui/motion/SKILL.md +207 -0
- package/skills/ui/pick-ui-library/SKILL.md +85 -0
- package/skills/ui/product-messaging/SKILL.md +163 -0
- package/skills/ui/product-site/SKILL.md +465 -0
- package/skills/ui/prototype/PICKER.md +197 -0
- package/skills/ui/prototype/SKILL.md +98 -0
- package/skills/ui/refero-design/SKILL.md +534 -0
- package/skills/ui/refero-design/agents/openai.yaml +4 -0
- package/skills/ui/refero-design/references/anti-ai-slop.md +292 -0
- package/skills/ui/refero-design/references/color.md +563 -0
- package/skills/ui/refero-design/references/copywriting.md +222 -0
- package/skills/ui/refero-design/references/craft-details.md +525 -0
- package/skills/ui/refero-design/references/example-workflow.md +264 -0
- package/skills/ui/refero-design/references/icons.md +166 -0
- package/skills/ui/refero-design/references/mcp-tools.md +258 -0
- package/skills/ui/refero-design/references/motion.md +504 -0
- package/skills/ui/refero-design/references/typography.md +737 -0
- package/skills/ui/refero-design/references/visual-workflow.md +105 -0
- package/skills/ui/style-animaxxing/SKILL.md +48 -0
- package/skills/ui/style-animaxxing/agents/openai.yaml +7 -0
- package/skills/ui/style-animaxxing/references/motion-vocabulary.md +51 -0
- package/skills/ui/style-animaxxing/references/tokens.md +288 -0
- package/skills/ui/style-animaxxing/references/typography-and-layout.md +149 -0
- package/skills/ui/style-animaxxing/references/verification.md +38 -0
- package/skills/ui/typography-picker/SKILL.md +305 -0
- package/skills/ui/ui-core/SKILL.md +345 -0
- package/skills/ui/ui-core/references/accessibility.md +85 -0
- package/skills/ui/ui-core/references/build.md +666 -0
- package/skills/ui/ui-core/references/copy.md +70 -0
- package/skills/ui/ui-core/references/dark-mode.md +76 -0
- package/skills/ui/ui-core/references/direction.md +99 -0
- package/skills/ui/ui-core/references/redesign.md +74 -0
- package/skills/ui/ui-core/references/responsive.md +77 -0
- package/skills/ui/ui-core/references/styles.md +42 -0
- package/skills/ui/ui-core/references/system.md +190 -0
- package/skills/ui/ui-core/references/verify.md +37 -0
- package/skills/ui/ui-engineering/SKILL.md +436 -0
- package/skills/ui/ui-engineering/references/avatars.md +74 -0
- package/skills/ui/ui-engineering/references/card-patterns.md +66 -0
- package/skills/ui/ui-engineering/references/floating-actions.md +65 -0
- package/skills/ui/ui-engineering/references/navigation.md +81 -0
- package/skills/ui/ui-engineering/references/overlays.md +74 -0
- package/skills/ui/ui-engineering/references/pagination.md +71 -0
- package/skills/ui/ui-engineering/references/progress-indicators.md +77 -0
- package/skills/ui/ui-engineering/references/quality-bar.md +293 -0
- package/skills/ui/ui-engineering/references/search.md +68 -0
- package/skills/ui/ui-engineering/references/tailwind-architecture.md +81 -0
- package/skills/ui/ui-theme-picker/SKILL.md +522 -0
- package/skills/ui/ui-theme-picker/references/component-sources.md +223 -0
- package/skills/ui/ui-theme-picker/references/styles.md +298 -0
- package/skills/ui/vitepress-docs/SKILL.md +439 -0
- package/skills/ui/vitepress-docs/references/components.md +333 -0
- package/skills/ui/vitepress-docs/references/layout.md +128 -0
- package/skills/ui/vitepress-docs/references/tokens.md +87 -0
- package/skills/ui/vitepress-docs/references/typography.md +76 -0
- package/skills/workflow/careful/SKILL.md +48 -0
- package/skills/workflow/context-restore/SKILL.md +69 -0
- package/skills/workflow/context-save/SKILL.md +96 -0
- package/skills/workflow/health/SKILL.md +99 -0
- package/skills/workflow/learn/SKILL.md +95 -0
- package/skills/workflow/office-hours/SKILL.md +136 -0
- package/skills/workflow/ship/SKILL.md +95 -0
- package/vendor.json +80 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: product-site
|
|
3
|
+
description: Use when designing, auditing, or planning the public-facing website and supporting pages for a software product, SaaS, startup, developer tool, consumer app, marketplace, or community product. Determines which pages are needed, what each page should accomplish, how pages relate to the product funnel, and which legal, trust, support, authentication, and operational pages are appropriate. Also use when asking "what pages does my product site need," "what should my about/pricing/features page contain," or when a site exists but is missing structural pages or has pages that don't serve a clear purpose.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Product Site
|
|
7
|
+
|
|
8
|
+
Build the product's public-facing site as a complete product surface, not merely a homepage.
|
|
9
|
+
|
|
10
|
+
The goal is to answer:
|
|
11
|
+
|
|
12
|
+
1. What is this product?
|
|
13
|
+
2. Who is it for?
|
|
14
|
+
3. Why should someone care?
|
|
15
|
+
4. What can it do?
|
|
16
|
+
5. Why should someone trust it?
|
|
17
|
+
6. What should they do next?
|
|
18
|
+
7. Where can they get help?
|
|
19
|
+
8. What legal/privacy information do they need?
|
|
20
|
+
9. What happens when something goes wrong?
|
|
21
|
+
|
|
22
|
+
Do not automatically create every possible page. Determine the appropriate surface from the product type, business model, audience, maturity, and user journey.
|
|
23
|
+
|
|
24
|
+
## Core page architecture
|
|
25
|
+
|
|
26
|
+
A typical product site consists of these groups.
|
|
27
|
+
|
|
28
|
+
### Marketing
|
|
29
|
+
|
|
30
|
+
- Home
|
|
31
|
+
- Features / Product
|
|
32
|
+
- Use Cases
|
|
33
|
+
- Pricing
|
|
34
|
+
- About
|
|
35
|
+
- Contact
|
|
36
|
+
|
|
37
|
+
Not every product needs all six.
|
|
38
|
+
|
|
39
|
+
### Trust and legal
|
|
40
|
+
|
|
41
|
+
- Privacy Policy
|
|
42
|
+
- Terms of Service
|
|
43
|
+
- Cookie Policy, when applicable
|
|
44
|
+
- Security
|
|
45
|
+
- Compliance / DPA, when applicable
|
|
46
|
+
|
|
47
|
+
Legal pages should reflect the actual product and jurisdiction. Never invent certifications, compliance claims, security practices, or legal obligations.
|
|
48
|
+
|
|
49
|
+
### Support and education
|
|
50
|
+
|
|
51
|
+
- Documentation
|
|
52
|
+
- Help Center
|
|
53
|
+
- FAQ
|
|
54
|
+
- Changelog
|
|
55
|
+
- Status
|
|
56
|
+
|
|
57
|
+
These become increasingly important as the product becomes more mature or operationally important.
|
|
58
|
+
|
|
59
|
+
### Authentication
|
|
60
|
+
|
|
61
|
+
If the product has accounts, consider:
|
|
62
|
+
|
|
63
|
+
- Sign in
|
|
64
|
+
- Sign up
|
|
65
|
+
- Forgot password
|
|
66
|
+
- Reset password
|
|
67
|
+
- Email verification
|
|
68
|
+
- Invitation acceptance
|
|
69
|
+
- Account recovery
|
|
70
|
+
|
|
71
|
+
These are product flows rather than marketing pages, but they are part of the complete website architecture.
|
|
72
|
+
|
|
73
|
+
### System states
|
|
74
|
+
|
|
75
|
+
A production product should account for:
|
|
76
|
+
|
|
77
|
+
- 404
|
|
78
|
+
- 500 / unexpected error
|
|
79
|
+
- Maintenance
|
|
80
|
+
- Unauthorized
|
|
81
|
+
- Forbidden
|
|
82
|
+
- Empty states
|
|
83
|
+
- Offline / connection failure where applicable
|
|
84
|
+
|
|
85
|
+
Do not treat these as optional visual polish. They are part of the product experience.
|
|
86
|
+
|
|
87
|
+
## Decide pages from the product
|
|
88
|
+
|
|
89
|
+
Before generating pages, determine:
|
|
90
|
+
|
|
91
|
+
- Product type
|
|
92
|
+
- Target audience
|
|
93
|
+
- B2B vs B2C
|
|
94
|
+
- Self-serve vs sales-led
|
|
95
|
+
- Free vs paid
|
|
96
|
+
- Subscription vs one-time purchase
|
|
97
|
+
- Product-led vs marketing-led acquisition
|
|
98
|
+
- Whether users need accounts
|
|
99
|
+
- Whether the product handles sensitive data
|
|
100
|
+
- Whether integrations exist
|
|
101
|
+
- Whether documentation is necessary
|
|
102
|
+
- Whether uptime is important to users
|
|
103
|
+
- Whether there are multiple user roles
|
|
104
|
+
- Product maturity
|
|
105
|
+
|
|
106
|
+
Then select the required pages.
|
|
107
|
+
|
|
108
|
+
Do not add pages simply because another SaaS company has them.
|
|
109
|
+
|
|
110
|
+
## Minimum credible product site
|
|
111
|
+
|
|
112
|
+
For a new software product, the default starting point is:
|
|
113
|
+
|
|
114
|
+
Home
|
|
115
|
+
Features / Product
|
|
116
|
+
About or Company
|
|
117
|
+
Contact
|
|
118
|
+
Privacy Policy
|
|
119
|
+
Terms of Service
|
|
120
|
+
|
|
121
|
+
Add Pricing when pricing is public.
|
|
122
|
+
|
|
123
|
+
Add Security when users need meaningful assurance about data or infrastructure.
|
|
124
|
+
|
|
125
|
+
Add Documentation / Help when the product requires explanation.
|
|
126
|
+
|
|
127
|
+
Add Status when service availability is important.
|
|
128
|
+
|
|
129
|
+
Add Changelog when the product is actively shipping and users benefit from release visibility.
|
|
130
|
+
|
|
131
|
+
## Homepage
|
|
132
|
+
|
|
133
|
+
The homepage should establish the product's primary communication hierarchy.
|
|
134
|
+
|
|
135
|
+
Typical structure:
|
|
136
|
+
|
|
137
|
+
Navbar
|
|
138
|
+
Hero
|
|
139
|
+
Proof / trust
|
|
140
|
+
Problem
|
|
141
|
+
Solution
|
|
142
|
+
Key benefits
|
|
143
|
+
Product demonstration
|
|
144
|
+
Use cases
|
|
145
|
+
How it works
|
|
146
|
+
Differentiation
|
|
147
|
+
Social proof
|
|
148
|
+
FAQ / objections
|
|
149
|
+
Final CTA
|
|
150
|
+
Footer
|
|
151
|
+
|
|
152
|
+
This is a starting structure, not a mandatory template.
|
|
153
|
+
|
|
154
|
+
The page should answer progressively:
|
|
155
|
+
|
|
156
|
+
Hero:
|
|
157
|
+
"What is this and why should I care?"
|
|
158
|
+
|
|
159
|
+
Problem:
|
|
160
|
+
"Is this relevant to me?"
|
|
161
|
+
|
|
162
|
+
Solution:
|
|
163
|
+
"How does it solve the problem?"
|
|
164
|
+
|
|
165
|
+
Product demonstration:
|
|
166
|
+
"What does the actual product look like?"
|
|
167
|
+
|
|
168
|
+
Benefits:
|
|
169
|
+
"What do I get from using it?"
|
|
170
|
+
|
|
171
|
+
Proof:
|
|
172
|
+
"Why should I believe these claims?"
|
|
173
|
+
|
|
174
|
+
Differentiation:
|
|
175
|
+
"Why this product rather than the alternatives?"
|
|
176
|
+
|
|
177
|
+
FAQ:
|
|
178
|
+
"What concerns might stop me?"
|
|
179
|
+
|
|
180
|
+
CTA:
|
|
181
|
+
"What should I do next?"
|
|
182
|
+
|
|
183
|
+
## Features page
|
|
184
|
+
|
|
185
|
+
A features page should not simply reproduce the application's sidebar.
|
|
186
|
+
|
|
187
|
+
Group functionality around user outcomes.
|
|
188
|
+
|
|
189
|
+
Prefer:
|
|
190
|
+
|
|
191
|
+
"Manage your community in one place"
|
|
192
|
+
|
|
193
|
+
over:
|
|
194
|
+
|
|
195
|
+
"Member Management"
|
|
196
|
+
|
|
197
|
+
when the broader outcome is the meaningful concept.
|
|
198
|
+
|
|
199
|
+
For each major capability explain:
|
|
200
|
+
|
|
201
|
+
- What it does
|
|
202
|
+
- Who uses it
|
|
203
|
+
- What problem it addresses
|
|
204
|
+
- What outcome it enables
|
|
205
|
+
- Relevant product evidence
|
|
206
|
+
|
|
207
|
+
Avoid turning every minor feature into a marketing section.
|
|
208
|
+
|
|
209
|
+
## Use Cases
|
|
210
|
+
|
|
211
|
+
Use cases are useful when the same product serves different workflows, roles, or audiences.
|
|
212
|
+
|
|
213
|
+
Examples:
|
|
214
|
+
|
|
215
|
+
- For administrators
|
|
216
|
+
- For teams
|
|
217
|
+
- For developers
|
|
218
|
+
- For families
|
|
219
|
+
- For organizations
|
|
220
|
+
|
|
221
|
+
Only create separate use-case pages when the audience or workflow is meaningfully different.
|
|
222
|
+
|
|
223
|
+
A use-case page should change the messaging and workflow explanation, not merely replace a heading.
|
|
224
|
+
|
|
225
|
+
## Pricing
|
|
226
|
+
|
|
227
|
+
When pricing exists, make the pricing page answer:
|
|
228
|
+
|
|
229
|
+
- What plans exist?
|
|
230
|
+
- Who is each plan for?
|
|
231
|
+
- What is included?
|
|
232
|
+
- What are the limits?
|
|
233
|
+
- What happens when limits are exceeded?
|
|
234
|
+
- Is billing monthly or annually?
|
|
235
|
+
- Can the user cancel?
|
|
236
|
+
- Is there a trial?
|
|
237
|
+
- Is there a refund policy?
|
|
238
|
+
- Is there a free tier?
|
|
239
|
+
|
|
240
|
+
Do not create fake pricing just to complete the page architecture.
|
|
241
|
+
|
|
242
|
+
## About
|
|
243
|
+
|
|
244
|
+
An About page is useful when company/product context increases trust or explains the product's origin.
|
|
245
|
+
|
|
246
|
+
Possible content:
|
|
247
|
+
|
|
248
|
+
- What the company/product is
|
|
249
|
+
- Why it exists
|
|
250
|
+
- Product philosophy
|
|
251
|
+
- Team/founders
|
|
252
|
+
- Company information
|
|
253
|
+
- Contact information
|
|
254
|
+
|
|
255
|
+
Do not manufacture a startup story, mission, team, or traction.
|
|
256
|
+
|
|
257
|
+
## Contact
|
|
258
|
+
|
|
259
|
+
Provide an appropriate contact mechanism.
|
|
260
|
+
|
|
261
|
+
Depending on the product:
|
|
262
|
+
|
|
263
|
+
- General email
|
|
264
|
+
- Sales
|
|
265
|
+
- Support
|
|
266
|
+
- Partnerships
|
|
267
|
+
- Security contact
|
|
268
|
+
- Abuse/reporting contact
|
|
269
|
+
|
|
270
|
+
Do not create unnecessary forms when a simple contact method is sufficient.
|
|
271
|
+
|
|
272
|
+
## Privacy
|
|
273
|
+
|
|
274
|
+
Privacy should explain the actual data lifecycle.
|
|
275
|
+
|
|
276
|
+
At minimum consider:
|
|
277
|
+
|
|
278
|
+
- Information collected
|
|
279
|
+
- How information is collected
|
|
280
|
+
- Why it is used
|
|
281
|
+
- Account information
|
|
282
|
+
- User-generated content
|
|
283
|
+
- Analytics
|
|
284
|
+
- Cookies
|
|
285
|
+
- Third-party services
|
|
286
|
+
- Data retention
|
|
287
|
+
- Data deletion
|
|
288
|
+
- Data sharing
|
|
289
|
+
- Security
|
|
290
|
+
- User rights
|
|
291
|
+
- Contact information
|
|
292
|
+
|
|
293
|
+
The implementation must match the actual product. Do not copy generic privacy language that describes services the product does not use.
|
|
294
|
+
|
|
295
|
+
## Terms
|
|
296
|
+
|
|
297
|
+
Terms should cover the actual relationship between the product and its users.
|
|
298
|
+
|
|
299
|
+
Depending on the product:
|
|
300
|
+
|
|
301
|
+
- Account responsibilities
|
|
302
|
+
- Acceptable use
|
|
303
|
+
- User content
|
|
304
|
+
- Intellectual property
|
|
305
|
+
- Payments
|
|
306
|
+
- Subscriptions
|
|
307
|
+
- Termination
|
|
308
|
+
- Disclaimers
|
|
309
|
+
- Limitation of liability
|
|
310
|
+
- Governing law
|
|
311
|
+
- Contact
|
|
312
|
+
|
|
313
|
+
Legal language should be reviewed appropriately for the jurisdiction and business.
|
|
314
|
+
|
|
315
|
+
## Security
|
|
316
|
+
|
|
317
|
+
A security page is appropriate when security is an important purchasing or trust consideration.
|
|
318
|
+
|
|
319
|
+
Potential content:
|
|
320
|
+
|
|
321
|
+
- Authentication
|
|
322
|
+
- Authorization
|
|
323
|
+
- Encryption
|
|
324
|
+
- Infrastructure
|
|
325
|
+
- Data isolation
|
|
326
|
+
- Backups
|
|
327
|
+
- Monitoring
|
|
328
|
+
- Incident response
|
|
329
|
+
- Vulnerability reporting
|
|
330
|
+
- Security contact
|
|
331
|
+
- Certifications, only if actually held
|
|
332
|
+
|
|
333
|
+
Never claim:
|
|
334
|
+
|
|
335
|
+
- SOC 2
|
|
336
|
+
- ISO certification
|
|
337
|
+
- GDPR compliance
|
|
338
|
+
- HIPAA compliance
|
|
339
|
+
- Encryption standards
|
|
340
|
+
- Penetration testing
|
|
341
|
+
- 99.99% uptime
|
|
342
|
+
|
|
343
|
+
unless the product actually has the corresponding evidence.
|
|
344
|
+
|
|
345
|
+
## Documentation / Help Center
|
|
346
|
+
|
|
347
|
+
Documentation should reduce dependency on support.
|
|
348
|
+
|
|
349
|
+
Typical structure:
|
|
350
|
+
|
|
351
|
+
Getting Started
|
|
352
|
+
Account / Setup
|
|
353
|
+
Core workflows
|
|
354
|
+
Configuration
|
|
355
|
+
Integrations
|
|
356
|
+
Troubleshooting
|
|
357
|
+
FAQ
|
|
358
|
+
Permissions / Roles
|
|
359
|
+
Billing
|
|
360
|
+
Security / Privacy
|
|
361
|
+
|
|
362
|
+
For developer products also consider:
|
|
363
|
+
|
|
364
|
+
API Reference
|
|
365
|
+
SDKs
|
|
366
|
+
Examples
|
|
367
|
+
Webhooks
|
|
368
|
+
Authentication
|
|
369
|
+
Rate limits
|
|
370
|
+
Errors
|
|
371
|
+
|
|
372
|
+
## Changelog
|
|
373
|
+
|
|
374
|
+
A changelog should communicate actual product changes.
|
|
375
|
+
|
|
376
|
+
Typical entry:
|
|
377
|
+
|
|
378
|
+
Version / Date
|
|
379
|
+
What changed
|
|
380
|
+
Why it matters
|
|
381
|
+
Relevant screenshots or links
|
|
382
|
+
|
|
383
|
+
Do not use a changelog as fabricated traction.
|
|
384
|
+
|
|
385
|
+
## Status
|
|
386
|
+
|
|
387
|
+
A status page is useful when users depend on the service being operational.
|
|
388
|
+
|
|
389
|
+
Typical components:
|
|
390
|
+
|
|
391
|
+
Current status
|
|
392
|
+
Active incidents
|
|
393
|
+
Affected services
|
|
394
|
+
Incident history
|
|
395
|
+
Maintenance
|
|
396
|
+
Resolution updates
|
|
397
|
+
|
|
398
|
+
## Footer
|
|
399
|
+
|
|
400
|
+
The footer should provide the secondary navigation users expect.
|
|
401
|
+
|
|
402
|
+
Typical groups:
|
|
403
|
+
|
|
404
|
+
Product
|
|
405
|
+
- Features
|
|
406
|
+
- Pricing
|
|
407
|
+
- Documentation
|
|
408
|
+
|
|
409
|
+
Company
|
|
410
|
+
- About
|
|
411
|
+
- Contact
|
|
412
|
+
|
|
413
|
+
Legal
|
|
414
|
+
- Privacy
|
|
415
|
+
- Terms
|
|
416
|
+
- Cookies
|
|
417
|
+
|
|
418
|
+
Resources
|
|
419
|
+
- Help
|
|
420
|
+
- Changelog
|
|
421
|
+
- Status
|
|
422
|
+
|
|
423
|
+
Social / external links only when those destinations actually exist.
|
|
424
|
+
|
|
425
|
+
## Product vs marketing surface
|
|
426
|
+
|
|
427
|
+
Keep these concepts separate.
|
|
428
|
+
|
|
429
|
+
Marketing pages answer "why this product."
|
|
430
|
+
|
|
431
|
+
Product surfaces answer "how do I use this product."
|
|
432
|
+
|
|
433
|
+
Both are part of the complete site, but they serve different purposes and should not be conflated.
|
|
434
|
+
|
|
435
|
+
## Relationship with messaging and UI skills
|
|
436
|
+
|
|
437
|
+
This skill decides:
|
|
438
|
+
|
|
439
|
+
"What pages should exist?"
|
|
440
|
+
"What should each page accomplish?"
|
|
441
|
+
"What is the user's journey?"
|
|
442
|
+
"What information belongs on each page?"
|
|
443
|
+
|
|
444
|
+
Use the product messaging skill for:
|
|
445
|
+
|
|
446
|
+
- Positioning
|
|
447
|
+
- ICP
|
|
448
|
+
- Value proposition
|
|
449
|
+
- Headlines
|
|
450
|
+
- Subheadlines
|
|
451
|
+
- Benefits
|
|
452
|
+
- Feature-to-benefit translation
|
|
453
|
+
- CTA strategy
|
|
454
|
+
- Objection handling
|
|
455
|
+
- Messaging hierarchy
|
|
456
|
+
|
|
457
|
+
Then use the UI/theme skill to translate that content into an interface.
|
|
458
|
+
|
|
459
|
+
## Architectural rule
|
|
460
|
+
|
|
461
|
+
Product Site = page architecture
|
|
462
|
+
Product Messaging = communication architecture
|
|
463
|
+
UI Theme = visual architecture
|
|
464
|
+
|
|
465
|
+
These three skills are distinct layers. Do not collapse them into one.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# The Picker
|
|
2
|
+
|
|
3
|
+
The picker's appearance is **not a design decision** , it is this spec. Copy the markup, CSS, and wiring below verbatim; the only values that change per run are the variant names and count. It stays identical across every project so it always reads as harness chrome, never as part of the design being judged. Do not restyle it with the project's tokens, fonts, or colors.
|
|
4
|
+
|
|
5
|
+
It is a floating dark pill, bottom-center. Dark glass works on top of any page , light or dark , which is why it is not theme-aware.
|
|
6
|
+
|
|
7
|
+
## Markup
|
|
8
|
+
|
|
9
|
+
The sliding highlight span first, one button per variant, a hairline divider, then the replay button (only when at least one variant has motion to re-trigger):
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<nav class="proto-picker" aria-label="Prototype variants">
|
|
13
|
+
<span class="proto-picker-highlight" aria-hidden="true"></span>
|
|
14
|
+
<button class="proto-picker-item" data-active aria-current="true">Quiet</button>
|
|
15
|
+
<button class="proto-picker-item">Editorial</button>
|
|
16
|
+
<button class="proto-picker-item">Playful</button>
|
|
17
|
+
<span class="proto-picker-divider" aria-hidden="true"></span>
|
|
18
|
+
<button class="proto-picker-item proto-picker-replay" aria-label="Replay animation (R)">↻</button>
|
|
19
|
+
</nav>
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
In a framework, keep the class names and structure; only the rendering syntax changes.
|
|
23
|
+
|
|
24
|
+
## Styles
|
|
25
|
+
|
|
26
|
+
```css
|
|
27
|
+
.proto-picker {
|
|
28
|
+
position: fixed;
|
|
29
|
+
bottom: 24px;
|
|
30
|
+
left: 50%;
|
|
31
|
+
transform: translateX(-50%);
|
|
32
|
+
z-index: 2147483647;
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 2px;
|
|
36
|
+
padding: 4px;
|
|
37
|
+
border-radius: 999px;
|
|
38
|
+
background: rgba(10, 10, 10, 0.82);
|
|
39
|
+
-webkit-backdrop-filter: blur(12px) saturate(1.4);
|
|
40
|
+
backdrop-filter: blur(12px) saturate(1.4);
|
|
41
|
+
box-shadow:
|
|
42
|
+
0 0 0 1px rgba(255, 255, 255, 0.08) inset,
|
|
43
|
+
0 8px 24px rgba(0, 0, 0, 0.24),
|
|
44
|
+
0 2px 6px rgba(0, 0, 0, 0.12);
|
|
45
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
46
|
+
font-size: 13px;
|
|
47
|
+
line-height: 1;
|
|
48
|
+
-webkit-font-smoothing: antialiased;
|
|
49
|
+
user-select: none;
|
|
50
|
+
-webkit-user-select: none;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.proto-picker-highlight {
|
|
54
|
+
position: absolute;
|
|
55
|
+
top: 4px;
|
|
56
|
+
left: 0;
|
|
57
|
+
height: 28px;
|
|
58
|
+
border-radius: 999px;
|
|
59
|
+
background: rgba(255, 255, 255, 0.12);
|
|
60
|
+
will-change: transform;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* The slide is enabled only after first paint (data-ready), so load doesn't animate. */
|
|
64
|
+
.proto-picker[data-ready] .proto-picker-highlight {
|
|
65
|
+
transition:
|
|
66
|
+
transform 250ms cubic-bezier(0.23, 1, 0.32, 1),
|
|
67
|
+
width 250ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@media (prefers-reduced-motion: reduce) {
|
|
71
|
+
.proto-picker[data-ready] .proto-picker-highlight { transition: none; }
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.proto-picker-item {
|
|
75
|
+
position: relative; /* sits above the highlight */
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
height: 28px;
|
|
79
|
+
padding: 0 12px;
|
|
80
|
+
border: 0;
|
|
81
|
+
border-radius: 999px;
|
|
82
|
+
background: transparent;
|
|
83
|
+
color: rgba(255, 255, 255, 0.55);
|
|
84
|
+
font: inherit;
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
transition: color 150ms ease-out;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.proto-picker-item:hover {
|
|
90
|
+
color: rgba(255, 255, 255, 0.85);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.proto-picker-item:active {
|
|
94
|
+
transform: scale(0.97);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.proto-picker-item:focus-visible {
|
|
98
|
+
outline: 2px solid rgba(255, 255, 255, 0.4);
|
|
99
|
+
outline-offset: 2px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.proto-picker-item[data-active] {
|
|
103
|
+
color: #fff;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.proto-picker-divider {
|
|
107
|
+
width: 1px;
|
|
108
|
+
height: 16px;
|
|
109
|
+
margin: 0 4px;
|
|
110
|
+
background: rgba(255, 255, 255, 0.12);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.proto-picker-replay {
|
|
114
|
+
padding: 0 10px;
|
|
115
|
+
font-size: 14px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.proto-picker[data-position="top"] {
|
|
119
|
+
bottom: auto;
|
|
120
|
+
top: 24px;
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Rules
|
|
125
|
+
|
|
126
|
+
- **Verbatim.** These values are the spec. No project fonts, no brand colors, no theme switching, no extra shadows or borders.
|
|
127
|
+
- **The highlight slides; the variant swap stays instant.** The active pill animates between buttons (250ms, strong ease-out) as spatial feedback on the picker itself , but the variant being previewed still switches with no transition. The `width` transition is a deliberate exception to the transform/opacity rule: the element is 28px tall, absolutely positioned, and has no layout dependents, so the paint cost is negligible.
|
|
128
|
+
- **One allowed modification:** if a variant occupies the bottom-center of the screen (a toast stack, a bottom sheet, a dock), set `data-position="top"` so the picker never covers the work. Nothing else about it may move or change.
|
|
129
|
+
- **Replay is conditional.** Render the replay button and its divider only when at least one variant has an entrance or state animation worth re-triggering; a static comparison gets a shorter pill.
|
|
130
|
+
|
|
131
|
+
## Behavior contract
|
|
132
|
+
|
|
133
|
+
The contract is fixed regardless of how the harness renders:
|
|
134
|
+
|
|
135
|
+
- Number keys `1-N` and `←`/`→` switch variants; `R` replays. Ignore key events when focus is in an input, textarea, select, or contenteditable, or when a modifier is held.
|
|
136
|
+
- Clicking an item switches to it; exactly one item carries `data-active` and `aria-current="true"` at all times, and the highlight slides to it.
|
|
137
|
+
- Selection persists across reload via a URL param (`?v=2`), falling back to variant 1. The highlight takes its initial position without animating (`data-ready` is added after first paint).
|
|
138
|
+
- Switching re-mounts the variant (so entrance animations re-run); the replay key re-mounts without switching.
|
|
139
|
+
|
|
140
|
+
## Reference wiring
|
|
141
|
+
|
|
142
|
+
Verbatim for the standalone-HTML branch; in a framework, keep the same behavior but express it idiomatically (state instead of `innerHTML`, a keyed re-mount instead of `requestAnimationFrame`, refs + a layout effect for the highlight measurement).
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
// `variants` is an array of render functions, one per variant, in picker order.
|
|
146
|
+
const stage = document.getElementById('stage');
|
|
147
|
+
const picker = document.querySelector('.proto-picker');
|
|
148
|
+
const highlight = picker.querySelector('.proto-picker-highlight');
|
|
149
|
+
const items = [...picker.querySelectorAll('.proto-picker-item:not(.proto-picker-replay)')];
|
|
150
|
+
const replay = picker.querySelector('.proto-picker-replay');
|
|
151
|
+
let current = 0;
|
|
152
|
+
|
|
153
|
+
function moveHighlight() {
|
|
154
|
+
const el = items[current];
|
|
155
|
+
highlight.style.width = el.offsetWidth + 'px';
|
|
156
|
+
highlight.style.transform = `translateX(${el.offsetLeft}px)`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function mount(i) {
|
|
160
|
+
stage.innerHTML = '';
|
|
161
|
+
// Clear first, render next frame, so entrance animations re-run.
|
|
162
|
+
requestAnimationFrame(() => { stage.innerHTML = variants[i](); });
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function setActive(i) {
|
|
166
|
+
if (i < 0 || i >= variants.length) return;
|
|
167
|
+
current = i;
|
|
168
|
+
items.forEach((el, j) => {
|
|
169
|
+
el.toggleAttribute('data-active', j === i);
|
|
170
|
+
if (j === i) el.setAttribute('aria-current', 'true');
|
|
171
|
+
else el.removeAttribute('aria-current');
|
|
172
|
+
});
|
|
173
|
+
moveHighlight();
|
|
174
|
+
const url = new URL(location);
|
|
175
|
+
url.searchParams.set('v', i + 1);
|
|
176
|
+
history.replaceState(null, '', url);
|
|
177
|
+
mount(i);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
items.forEach((el, i) => el.addEventListener('click', () => setActive(i)));
|
|
181
|
+
replay?.addEventListener('click', () => mount(current));
|
|
182
|
+
window.addEventListener('resize', moveHighlight);
|
|
183
|
+
|
|
184
|
+
document.addEventListener('keydown', (e) => {
|
|
185
|
+
if (/^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName) || e.target.isContentEditable) return;
|
|
186
|
+
if (e.metaKey || e.ctrlKey || e.altKey) return;
|
|
187
|
+
const num = parseInt(e.key, 10);
|
|
188
|
+
if (num >= 1 && num <= variants.length) setActive(num - 1);
|
|
189
|
+
else if (e.key === 'ArrowRight') setActive((current + 1) % variants.length);
|
|
190
|
+
else if (e.key === 'ArrowLeft') setActive((current - 1 + variants.length) % variants.length);
|
|
191
|
+
else if (e.key === 'r' || e.key === 'R') mount(current);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
setActive((parseInt(new URLSearchParams(location.search).get('v'), 10) || 1) - 1);
|
|
195
|
+
// Enable the slide only after first paint, so load doesn't animate.
|
|
196
|
+
requestAnimationFrame(() => requestAnimationFrame(() => picker.setAttribute('data-ready', '')));
|
|
197
|
+
```
|