luckiest-co 1.0.19 → 1.0.21
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/commands/status.md +10 -0
- package/hooks/hooks.json +11 -1
- package/hooks/update-notice.mjs +56 -0
- package/package.json +1 -1
- package/skills/luckiest-status/SKILL.md +10 -0
- package/skills/luckiest-video-studio/ATTRIBUTION.md +47 -0
- package/skills/luckiest-video-studio/CHANGELOG.md +64 -0
- package/skills/luckiest-video-studio/LICENSE-brag +21 -0
- package/skills/luckiest-video-studio/LICENSE-diagram-design +21 -0
- package/skills/luckiest-video-studio/LICENSE-motion-graphics +25 -0
- package/skills/luckiest-video-studio/LICENSE-student-kit +32 -0
- package/skills/luckiest-video-studio/LICENSE-student-kit-pipeline +15 -0
- package/skills/luckiest-video-studio/SECURITY.md +74 -0
- package/skills/luckiest-video-studio/SKILL.md +257 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/luckiest-video-studio/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/luckiest-video-studio/assets/sfx/sfx-analysis.md +75 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/click5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/luckiest-video-studio/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/luckiest-video-studio/references/audio.md +285 -0
- package/skills/luckiest-video-studio/references/brand.md +55 -0
- package/skills/luckiest-video-studio/references/diffusion.md +75 -0
- package/skills/luckiest-video-studio/references/logo-recipes.md +77 -0
- package/skills/luckiest-video-studio/references/openscreen.md +60 -0
- package/skills/luckiest-video-studio/references/step-1-inspect.md +133 -0
- package/skills/luckiest-video-studio/references/step-2-plan.md +234 -0
- package/skills/luckiest-video-studio/references/step-3-compose.md +210 -0
- package/skills/luckiest-video-studio/references/step-4-deliver.md +168 -0
- package/skills/luckiest-video-studio/references/storyboard.md +78 -0
- package/skills/luckiest-video-studio/references/tones.md +231 -0
- package/skills/luckiest-video-studio/scripts/analyze_music_cues.py +309 -0
- package/skills/luckiest-video-studio/scripts/assemble-diffusion.mjs +161 -0
- package/skills/luckiest-video-studio/scripts/assemble-openscreen.mjs +74 -0
- package/skills/luckiest-video-studio/scripts/pyproject.toml +14 -0
- package/skills/luckiest-video-studio/scripts/qa.mjs +313 -0
- package/skills/luckiest-video-studio/scripts/qa.test.mjs +135 -0
- package/skills/luckiest-video-studio/scripts/render-scenes.mjs +125 -0
- package/skills/luckiest-video-studio/scripts/storyboard.schema.json +52 -0
- package/skills/luckiest-video-studio/scripts/uv.lock +819 -0
- package/skills/luckiest-video-studio/templates/diffusion/line-draw.tsx +132 -0
- package/skills/luckiest-video-studio/templates/logo-line-draw.html +38 -0
- package/skills/luckiest-video-studio-ae/ATTRIBUTION.md +9 -0
- package/skills/luckiest-video-studio-ae/CHANGELOG.md +7 -0
- package/skills/luckiest-video-studio-ae/SKILL.md +133 -0
- package/skills/luckiest-video-studio-cards/ATTRIBUTION.md +22 -0
- package/skills/luckiest-video-studio-cards/CHANGELOG.md +8 -0
- package/skills/luckiest-video-studio-cards/SKILL.md +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/DESIGN.md +50 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-agenda.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-bigtype.html +156 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-board.html +238 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-checklist.html +158 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-compare.html +205 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-deck.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-dossier.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-filmstrip.html +211 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-grid6.html +157 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-indexset.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-maplegend.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-matrix.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-numlist.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-outline.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-phases.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-quad.html +163 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-roadmap.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-stepper.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-toc.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-overview-vtimeline.html +166 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-bracket.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-circle.html +103 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-classified.html +112 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-collage.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-correction.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-crt.html +111 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-cutout.html +87 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-fullbleed.html +78 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-highlight.html +80 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-indexcard.html +85 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-map.html +96 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-markerbox.html +84 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-numeral.html +74 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-split.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-stacked.html +94 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-stamp.html +83 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-ticker.html +88 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-section-tornstrip.html +92 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-annotated.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-arc.html +105 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-axis.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-bar.html +111 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-bracket.html +124 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-calendar.html +219 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-callout.html +100 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-columns.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-corner.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-dots.html +102 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-engraving.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-footnote.html +125 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-frac.html +101 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-heat.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-isotype.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ledger.html +106 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-left.html +109 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-magnifier.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-map.html +326 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-meter.html +153 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-multiplier.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-odo.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pack.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-photo.html +93 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pie.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-postage.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-pricetag.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-quote.html +113 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ranking.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-receipt.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-ribbon.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-semi.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-spotlight.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-stamp.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-steps.html +123 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-tape.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-torn.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-trend.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-vs.html +101 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat-window.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-stat.html +97 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier1/t1-timeline.html +131 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-label.html +51 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-bracket.html +104 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-caption.html +129 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-circle.html +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-definition.html +152 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-footnote.html +113 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-magnify.html +157 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-pin.html +95 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-pullquote.html +135 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-spotlight.html +114 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-sticky.html +95 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-tag.html +129 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lb-underline.html +94 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lower-third.html +66 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-badge.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-barslab.html +126 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-bracket.html +146 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-clapper.html +144 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-highlight.html +128 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-indextab.html +134 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-rail.html +116 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-ribbon.html +140 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-stacked.html +143 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-stamp.html +133 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-sticky.html +154 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/cards/tier2/t2-lt-typecard.html +137 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/style.json +4463 -0
- package/skills/luckiest-video-studio-cards/packs/01-paper-collage/tokens.css +81 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/DESIGN.md +51 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-agenda.html +277 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-beforeafter.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-bento.html +269 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-bigleft.html +221 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-callouts.html +350 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-cardrow5.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-checklist.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-cycle.html +312 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-dashboard.html +414 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-deck2.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-deck3.html +200 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-duallist.html +323 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-featurecompare.html +244 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-featuregrid.html +235 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-flashcards.html +215 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-flow.html +287 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-funnel.html +246 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-gantt.html +290 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-grid6.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-grid9.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-iconlist.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-journey.html +305 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-kpirow.html +275 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-layers.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-legend.html +258 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-levels.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-logowall.html +278 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-mappoints.html +303 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-matrix.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-milestones.html +275 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-mindmap.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-nested.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-network.html +353 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-notifs.html +224 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-numlist.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-orgchart.html +240 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-outline.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-phases.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pipeline.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pricing.html +277 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-profiles.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-proscons.html +283 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-pyramid.html +181 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-quad.html +226 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-quotegrid.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-ranked.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-roadmap.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-spectrum.html +289 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-split3.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-spotlightcard.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-statgrid.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-steps.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-summary.html +231 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tiercompare.html +295 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-timeline.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-toc.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tree.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-tricards.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-venn.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-overview-vstable.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ascend.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-aurora-bars.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-beam.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-boxed.html +172 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-breath.html +151 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-chaptercard.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-column-light.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-constellation.html +220 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-countdown.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-curtain.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-dawn.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-depth.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-divider.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-drift-grid.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-duotone.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-eclipse.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-emblem.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-flare-sweep.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-glow-rule.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-gradient-word.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-gridfloor.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-halo.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-horizon.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-index.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-kinetic.html +159 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-lensflare.html +231 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-liquid.html +181 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-marquee.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-mesh.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-monolith.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-node-title.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-numeral.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-orb.html +146 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-orbit.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-particles.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-pill.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-portal.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-prism.html +265 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-question.html +169 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-quoteopen.html +171 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-reveal-mask.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ribbon.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-ripple.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-searchbar.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-slab.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-sphere-top.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-split-reveal.html +218 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-splitpanel.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-spotlight-cone.html +245 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-spotlight.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-stack.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-stacked-words.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-starfield.html +213 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-sweep.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-tunnel.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-type-scale.html +170 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-typed.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-underline-grow.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-waveform.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-section-wordmark.html +172 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-annot.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-beforeafter.html +293 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bigpercent.html +228 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bracketstat.html +210 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-bubble.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-cbars.html +313 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-clockface.html +296 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-column.html +382 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-compass.html +305 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-counterpill.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-curve.html +318 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-delta.html +300 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-dial.html +288 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-donut.html +307 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-dotgrid.html +241 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-figure.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-fillshape.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-fraction.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-funnel.html +285 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-growtharrow.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-heatcell.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-isotype.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-layered.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-mega.html +217 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-meter.html +263 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-milestone.html +260 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-money.html +253 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-multiplier.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-multiring.html +336 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-needle.html +253 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-nodes.html +259 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-odometer.html +301 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-orbitmoons.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-orbitstat.html +319 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-pair.html +244 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-percentile.html +287 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-pictobar.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-polar.html +256 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-quotestat.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-radialbars.html +387 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-range.html +300 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-rank.html +264 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-ratio.html +264 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-ring.html +274 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-risewall.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-score.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-segbar.html +262 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-semigauge.html +327 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-sparkline.html +291 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-spectrum.html +245 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-split.html +242 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-stackedbars.html +304 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-tickerstat.html +310 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-tiles.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-timer.html +248 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-trendline.html +343 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-underscore.html +236 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-versus.html +315 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-waffle.html +250 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier1/t1-stat-waterfall.html +273 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-badge.html +170 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-brace.html +239 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-bracket.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-bubble.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-byline.html +204 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-callout.html +137 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-category.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-checkmark.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-chipstat.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-comparemini.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-coord.html +271 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-counter.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-crosshair.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-dashed.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-definition.html +165 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-deltachip.html +184 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-eyebrow.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-fact.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-flag.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-formula.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-hash.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-highlightbox.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-iconchip.html +199 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-info.html +186 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-infocard.html +239 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-keycap.html +194 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-keyword.html +140 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-leader.html +201 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-legend.html +212 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-measure.html +201 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-meterchip.html +238 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-metric.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-micropie.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-minibar.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-node.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-note.html +183 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-numbercallout.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-percent.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-pointer.html +173 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-price.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-progress.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-pulse.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-qmark.html +164 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-quote.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-rating.html +252 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-ribbon.html +178 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-ringmark.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-search.html +174 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-sparkchip.html +243 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-spec.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-status.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-step.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tag.html +134 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-takeaway.html +154 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tcode.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-timestamp.html +185 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-toast.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-tooltip.html +175 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-underline.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lb-warning.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-avatar.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-badgecard.html +219 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-barslide.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-bracket.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-brandbar.html +229 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-bug.html +177 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-capsule.html +193 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-chapterbar.html +196 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-chip.html +162 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cinemastrip.html +190 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cite.html +179 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-clockname.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-coordbar.html +262 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-corner.html +206 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-cornerframe.html +251 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-countbar.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dividername.html +211 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dotline.html +209 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-doublecard.html +225 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-dual.html +233 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-edgebar.html +160 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-flipcard.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-geopin.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-glasscard.html +152 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-gradient.html +151 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-gradientbar.html +197 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-handlebar.html +192 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-infochips.html +182 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-lensbar.html +213 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-live.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-location.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-logolock.html +214 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-micname.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-minicard.html +176 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-minimal.html +149 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-nameplate3d.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-neonframe.html +208 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-neonpill.html +222 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-nowplaying.html +257 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-orbitbadge.html +232 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-pill.html +168 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-portraitframe.html +220 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-progressname.html +234 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-quote.html +202 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ratingname.html +226 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ribbon.html +198 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-sidebracket.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-slidetab.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-social.html +180 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-spotlightname.html +150 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-stacked.html +158 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-statline.html +223 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-tagrow.html +191 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-thinstrip.html +185 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-ticker.html +216 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-titlebar.html +188 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-trust.html +247 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-typedname.html +195 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-underbar.html +189 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/cards/tier2/t2-lt-waveband.html +235 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/style.json +8608 -0
- package/skills/luckiest-video-studio-cards/packs/02-aurora-glass/tokens.css +134 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/DESIGN.md +41 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/cards/tier1/t1-stat.html +57 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/cards/tier2/t2-list.html +58 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/style.json +88 -0
- package/skills/luckiest-video-studio-cards/packs/_blueprint/tokens.css +32 -0
- package/skills/luckiest-video-studio-cards/packs/registry.json +7789 -0
- package/skills/luckiest-video-studio-cards/references/card-contract.md +77 -0
- package/skills/luckiest-video-studio-cards/references/palette-leftovers.md +28 -0
- package/skills/luckiest-video-studio-cards/scripts/apply-brand.mjs +90 -0
- package/skills/luckiest-video-studio-cards/scripts/apply-brand.test.mjs +62 -0
- package/skills/luckiest-video-studio-cards/scripts/build-registry.mjs +54 -0
- package/skills/luckiest-video-studio-cards/scripts/new-pack.mjs +42 -0
- package/skills/luckiest-video-studio-cards/scripts/qa-cards.mjs +126 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/DESIGN.md +24 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/hyperframes.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/index.html +349 -0
- package/skills/luckiest-video-studio-cards/templates/glass-popout/meta.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/DESIGN.md +25 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/hyperframes.json +8 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/index.html +207 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/meta.json +5 -0
- package/skills/luckiest-video-studio-cards/templates/graph-paper/package.json +10 -0
- package/skills/luckiest-video-studio-cuts/ATTRIBUTION.md +19 -0
- package/skills/luckiest-video-studio-cuts/CHANGELOG.md +6 -0
- package/skills/luckiest-video-studio-cuts/SKILL.md +129 -0
- package/skills/luckiest-video-studio-cuts/scripts/apply-cuts.mjs +174 -0
- package/skills/luckiest-video-studio-cuts/scripts/build-edl-review.mjs +114 -0
- package/skills/luckiest-video-studio-cuts/scripts/cut-silences.mjs +300 -0
- package/skills/luckiest-video-studio-cuts/scripts/find-cut-candidates.mjs +182 -0
- package/skills/luckiest-video-studio-reel/ATTRIBUTION.md +21 -0
- package/skills/luckiest-video-studio-reel/CHANGELOG.md +10 -0
- package/skills/luckiest-video-studio-reel/SKILL.md +177 -0
- package/skills/luckiest-video-studio-reel/references/chapters.md +64 -0
- package/skills/luckiest-video-studio-reel/scripts/beatgrid.mjs +39 -0
- package/skills/luckiest-video-studio-reel/scripts/mix.mjs +42 -0
- package/skills/luckiest-video-studio-reel/scripts/splice-music.mjs +38 -0
- package/skills/luckiest-video-studio-reel/templates/reel.html +116 -0
- package/skills/luckiest-video-studio-reference/ATTRIBUTION.md +7 -0
- package/skills/luckiest-video-studio-reference/CHANGELOG.md +8 -0
- package/skills/luckiest-video-studio-reference/SKILL.md +108 -0
- package/skills/luckiest-video-studio-reference/scripts/shots.mjs +58 -0
- package/skills/luckiest-video-studio-talk/ATTRIBUTION.md +19 -0
- package/skills/luckiest-video-studio-talk/CHANGELOG.md +18 -0
- package/skills/luckiest-video-studio-talk/SKILL.md +161 -0
- package/skills/luckiest-video-studio-talk/references/long-form.md +91 -0
- package/skills/luckiest-video-studio-talk/references/plan-schema.md +54 -0
- package/skills/luckiest-video-studio-talk/references/short-form.md +76 -0
- package/skills/luckiest-video-studio-talk/scripts/grab-evidence.mjs +38 -0
- package/skills/luckiest-video-studio-talk/scripts/validate-footage.mjs +25 -0
- package/skills/luckiest-video-studio-talk/scripts/validate-plan.mjs +49 -0
- package/skills/luckiest-video-studio-talk/templates/talk-overlay.html +40 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Card contract
|
|
2
|
+
|
|
3
|
+
Every card in `packs/` follows these rules. A new card that breaks one is not
|
|
4
|
+
added to a pack.
|
|
5
|
+
|
|
6
|
+
## Layout of a pack
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
packs/NN-slug/
|
|
10
|
+
style.json manifest: id, name, palette, fonts, motion, and every card with its slots
|
|
11
|
+
DESIGN.md the look: palette meanings, type voices, motion rules, what not to do
|
|
12
|
+
tokens.css CSS variables for colors, fonts, easings; cards read only these
|
|
13
|
+
cards/tier1/ full-frame takeovers
|
|
14
|
+
cards/tier2/ overlays that keep the speaker visible
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`packs/registry.json` is generated from every `style.json` by
|
|
18
|
+
`scripts/build-registry.mjs`. Never edit it by hand.
|
|
19
|
+
|
|
20
|
+
## Ids
|
|
21
|
+
|
|
22
|
+
- Pack folder `NN-slug` (for example `02-aurora-glass`), pack id `slug`.
|
|
23
|
+
- Card id `<pack>.<tier>.<purpose>[.<treatment>]`, for example
|
|
24
|
+
`aurora-glass.t1.stat.dotgrid`. Stable and unique.
|
|
25
|
+
|
|
26
|
+
## Each card
|
|
27
|
+
|
|
28
|
+
1. A standalone HyperFrames composition: a root `<div>` with `id`,
|
|
29
|
+
`data-composition-id`, `data-start="0"`, `data-width="1920"`,
|
|
30
|
+
`data-height="1080"`, directly in `<body>`, with its own pinned GSAP script tag.
|
|
31
|
+
2. Exactly one paused GSAP timeline, registered on
|
|
32
|
+
`window.__timelines["<data-composition-id>"]`.
|
|
33
|
+
3. Colors, fonts, and easings come from `tokens.css` variables, linked as
|
|
34
|
+
`<link rel="stylesheet" href="cards/<pack-id>/tokens.css" />`. Paths are
|
|
35
|
+
relative to the run's `composition/` folder; HyperFrames lint rejects `../`
|
|
36
|
+
paths because Studio preview resolves them against the project root. A card that still
|
|
37
|
+
holds a literal color is listed in `references/palette-leftovers.md`.
|
|
38
|
+
4. Background by tier: `tier1` is opaque edge to edge; `tier2` is transparent
|
|
39
|
+
everywhere except the card itself and never covers the speaker's face.
|
|
40
|
+
5. All text sits in elements with `data-slot="<name>"`, and every slot is declared
|
|
41
|
+
in `style.json` with its name and type.
|
|
42
|
+
6. Deterministic: no `Math.random()`, no `Date.now()`, no network calls.
|
|
43
|
+
|
|
44
|
+
## Mounting a card inside another scene
|
|
45
|
+
|
|
46
|
+
Cards are written standalone so they preview and render alone. To place a tier2
|
|
47
|
+
card over a talk scene, wrap the card's root `<div>` in
|
|
48
|
+
`<template id="<id>-template">`, drop its GSAP tag (the parent loads GSAP), and
|
|
49
|
+
mount it from the scene:
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<div id="lt-1" data-composition-id="<card-composition-id>"
|
|
53
|
+
data-composition-src="compositions/cards/<card>.html"
|
|
54
|
+
data-start="3.2" data-duration="12" data-track-index="3"></div>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## QA status
|
|
58
|
+
|
|
59
|
+
`style.json` cards carry a `qa` field that `scripts/qa-cards.mjs` sets:
|
|
60
|
+
`lint-ok` (HyperFrames lint clean), `render-ok` (also rendered and inspected), or
|
|
61
|
+
`broken` (lint errors; do not use until fixed). New cards start `unchecked`.
|
|
62
|
+
|
|
63
|
+
At 1.0.0: 396 `lint-ok` and 10 `render-ok`, none `broken`. The 57 cards the kit
|
|
64
|
+
shipped with lint errors were fixed:
|
|
65
|
+
|
|
66
|
+
- Starting transforms moved from CSS into a `gsap.set` right after the timeline is
|
|
67
|
+
created, so GSAP owns the whole transform (`gsap_css_transform_conflict`).
|
|
68
|
+
- Template-literal selectors became plain strings (`template_literal_selector`).
|
|
69
|
+
- Tweens on `left` and `top` became `x` or percent centering, and one
|
|
70
|
+
`letterSpacing` tween was dropped (`gsap_non_transform_motion`).
|
|
71
|
+
|
|
72
|
+
Rendered before and after, 14 of 15 sampled fixes match within encoding noise.
|
|
73
|
+
The kinetic section card changed on purpose: its entrance no longer reflows onto
|
|
74
|
+
two lines and jumps back.
|
|
75
|
+
|
|
76
|
+
Keep new cards to the same rules: no CSS `transform` on anything GSAP tweens,
|
|
77
|
+
plain-string selectors, and motion through transforms only.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Palette leftovers
|
|
2
|
+
|
|
3
|
+
Cards that still hold literal colors after the palette colors were moved to
|
|
4
|
+
`tokens.css` variables. These colors do not follow `brand.json`. Most are shades
|
|
5
|
+
of the pack palette inside scripts or gradients. Check them on a branded render,
|
|
6
|
+
and move a color to a variable when it clashes with the brand.
|
|
7
|
+
|
|
8
|
+
White (`#ffffff`) is left as a neutral highlight in every pack and is not listed.
|
|
9
|
+
|
|
10
|
+
| Card | Colors |
|
|
11
|
+
|---|---|
|
|
12
|
+
| `01-paper-collage/cards/tier1/t1-overview-board.html` | `#1f1a12` |
|
|
13
|
+
| `01-paper-collage/cards/tier1/t1-section-crt.html` | `#120f0a` x3, `#efe7d4`, `#2a2317`, `#3a3120`, `#1c1810`, `#1b2620`, `#0c1310`, `#060a08`, `#f3ecda` |
|
|
14
|
+
| `01-paper-collage/cards/tier1/t1-section-fullbleed.html` | `#1a160f`, `#2a241a` |
|
|
15
|
+
| `01-paper-collage/cards/tier1/t1-stat-heat.html` | `#e6dcc4`, `#4f8cff`, `#f26a1b`, `#e23b2e` |
|
|
16
|
+
| `01-paper-collage/cards/tier1/t1-stat-isotype.html` | `#4f8cff`, `#17130e` |
|
|
17
|
+
| `01-paper-collage/cards/tier1/t1-stat-photo.html` | `#7d756a` |
|
|
18
|
+
| `01-paper-collage/cards/tier1/t1-stat-spotlight.html` | `#2a231a`, `#0d0b08` |
|
|
19
|
+
| `02-aurora-glass/cards/tier1/t1-overview-dashboard.html` | `#4f8cff` |
|
|
20
|
+
| `02-aurora-glass/cards/tier1/t1-overview-kpirow.html` | `#4ade80` |
|
|
21
|
+
| `02-aurora-glass/cards/tier1/t1-overview-legend.html` | `#4f8cff`, `#ff8a5c`, `#f5d82a`, `#ff3b30` |
|
|
22
|
+
| `02-aurora-glass/cards/tier1/t1-section-eclipse.html` | `#0e1620`, `#050c14` |
|
|
23
|
+
| `02-aurora-glass/cards/tier1/t1-section-kinetic.html` | `#a8e6ff` |
|
|
24
|
+
| `02-aurora-glass/cards/tier1/t1-stat-beforeafter.html` | `#37e68c` |
|
|
25
|
+
| `02-aurora-glass/cards/tier1/t1-stat-pictobar.html` | `#4f8cff` |
|
|
26
|
+
| `02-aurora-glass/cards/tier1/t1-stat-tickerstat.html` | `#37e68c` x2 |
|
|
27
|
+
| `02-aurora-glass/cards/tier2/t2-lt-gradient.html` | `#d0effe` |
|
|
28
|
+
| `02-aurora-glass/cards/tier2/t2-lt-micname.html` | `#ff5f58` |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Copy a card pack into a run and rewrite its tokens.css from the run's brand.json.
|
|
3
|
+
//
|
|
4
|
+
// Usage: node apply-brand.mjs <run-dir> <pack-id> [--accent-only]
|
|
5
|
+
// Writes <run-dir>/composition/cards/<pack-id>/ (tokens.css, style.json, DESIGN.md, cards/).
|
|
6
|
+
// --accent-only keeps the pack's own surfaces and text colors and takes only the
|
|
7
|
+
// accent and fonts from brand.json (use it when the brand's paper is light and the
|
|
8
|
+
// pack is dark, or the other way round).
|
|
9
|
+
//
|
|
10
|
+
// Which brand role feeds which variable lives in the pack's style.json "brandMap":
|
|
11
|
+
// "paper" | "paper2" | "ink" | "muted" | "accent" | "rule" -> the color
|
|
12
|
+
// "rgb:<role>" -> "r, g, b" of that color
|
|
13
|
+
// "font:display" | "font:text" | "font:mono" -> a font-family stack
|
|
14
|
+
// Fonts found in <run-dir>/composition/assets/fonts/ get @font-face rules; nothing loads remotely.
|
|
15
|
+
|
|
16
|
+
import { cpSync, existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from "node:fs";
|
|
17
|
+
import { join, resolve, dirname, extname, basename } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
|
|
20
|
+
const PACKS = resolve(dirname(fileURLToPath(import.meta.url)), "../packs");
|
|
21
|
+
const ACCENT_ONLY = new Set(["accent", "rgb:accent", "font:display", "font:text", "font:mono"]);
|
|
22
|
+
const FALLBACK = { display: "system-ui, sans-serif", text: "system-ui, sans-serif", mono: "ui-monospace, monospace" };
|
|
23
|
+
const FONT_EXT = new Set([".woff2", ".woff", ".ttf", ".otf"]);
|
|
24
|
+
|
|
25
|
+
export function hexToRgb(color) {
|
|
26
|
+
const m = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(String(color).trim());
|
|
27
|
+
if (!m) return null;
|
|
28
|
+
const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join("") : m[1];
|
|
29
|
+
return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)).join(", ");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Pure: returns the new tokens.css text and what changed.
|
|
33
|
+
export function brandTokens(css, brandMap, brand, { accentOnly = false, fonts = [] } = {}) {
|
|
34
|
+
const changed = [], skipped = [];
|
|
35
|
+
for (const [varName, role] of Object.entries(brandMap)) {
|
|
36
|
+
if (accentOnly && !ACCENT_ONLY.has(role)) continue;
|
|
37
|
+
let value;
|
|
38
|
+
if (role.startsWith("rgb:")) value = hexToRgb(brand[role.slice(4)] ?? "");
|
|
39
|
+
else if (role.startsWith("font:")) {
|
|
40
|
+
const key = role.slice(5), fam = brand[key];
|
|
41
|
+
value = fam ? `"${fam}", ${FALLBACK[key]}` : null;
|
|
42
|
+
} else value = brand[role] ?? null;
|
|
43
|
+
if (!value) { skipped.push(varName); continue; }
|
|
44
|
+
const re = new RegExp(`(^\\s*${varName.replace(/-/g, "\\-")}\\s*:)[^;]*;`, "m");
|
|
45
|
+
if (!re.test(css)) { skipped.push(varName); continue; }
|
|
46
|
+
css = css.replace(re, `$1 ${value};`);
|
|
47
|
+
changed.push(varName);
|
|
48
|
+
}
|
|
49
|
+
const faces = fonts.map(({ family, file }) =>
|
|
50
|
+
`@font-face { font-family: "${family}"; src: url("../../assets/fonts/${file}"); font-display: block; }`);
|
|
51
|
+
if (faces.length) css = `/* Brand fonts, local files only. */\n${faces.join("\n")}\n\n${css}`;
|
|
52
|
+
return { css, changed, skipped };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Match font files to brand families by name: "Instrument Serif" -> InstrumentSerif-Regular.woff2.
|
|
56
|
+
export function matchFonts(files, brand) {
|
|
57
|
+
const norm = (s) => s.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const key of ["display", "text", "mono"]) {
|
|
60
|
+
const fam = brand[key];
|
|
61
|
+
if (!fam) continue;
|
|
62
|
+
for (const f of files) if (FONT_EXT.has(extname(f).toLowerCase()) && norm(basename(f)).startsWith(norm(fam))) out.push({ family: fam, file: f });
|
|
63
|
+
}
|
|
64
|
+
return out.filter((x, i) => out.findIndex((y) => y.file === x.file) === i);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
68
|
+
const [runArg, packId, ...flags] = process.argv.slice(2);
|
|
69
|
+
if (!runArg || !packId) { console.error("Usage: apply-brand.mjs <run-dir> <pack-id> [--accent-only]"); process.exit(1); }
|
|
70
|
+
const run = resolve(runArg);
|
|
71
|
+
const folder = readdirSync(PACKS).find((d) => d === packId || d.replace(/^\d\d-/, "") === packId);
|
|
72
|
+
if (!folder) { console.error(`no pack ${packId} in ${PACKS}`); process.exit(1); }
|
|
73
|
+
const brandPath = join(run, "brand.json");
|
|
74
|
+
if (!existsSync(brandPath)) { console.error(`missing ${brandPath}; write it first (references/brand.md)`); process.exit(1); }
|
|
75
|
+
const brand = JSON.parse(readFileSync(brandPath, "utf8"));
|
|
76
|
+
const manifest = JSON.parse(readFileSync(join(PACKS, folder, "style.json"), "utf8"));
|
|
77
|
+
if (!manifest.brandMap) { console.error(`${folder}/style.json has no brandMap`); process.exit(1); }
|
|
78
|
+
|
|
79
|
+
const id = folder.replace(/^\d\d-/, "");
|
|
80
|
+
const dest = join(run, "composition", "cards", id);
|
|
81
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
82
|
+
cpSync(join(PACKS, folder), dest, { recursive: true });
|
|
83
|
+
|
|
84
|
+
const fontDir = join(run, "composition", "assets", "fonts");
|
|
85
|
+
const fonts = existsSync(fontDir) ? matchFonts(readdirSync(fontDir), brand) : [];
|
|
86
|
+
const tokensPath = join(dest, "tokens.css");
|
|
87
|
+
const result = brandTokens(readFileSync(tokensPath, "utf8"), manifest.brandMap, brand, { accentOnly: flags.includes("--accent-only"), fonts });
|
|
88
|
+
writeFileSync(tokensPath, result.css);
|
|
89
|
+
console.log(JSON.stringify({ pack: id, dest, changed: result.changed, skipped: result.skipped, fonts: fonts.map((f) => f.file) }, null, 2));
|
|
90
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, mkdirSync, writeFileSync, readFileSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
import { brandTokens, hexToRgb, matchFonts } from "./apply-brand.mjs";
|
|
8
|
+
|
|
9
|
+
const brand = { paper: "#101010", paper2: "#181818", ink: "#F7F4EE", muted: "#9A9A9A",
|
|
10
|
+
accent: "#FF4D00", display: "Instrument Serif", text: "Geist", mono: "Geist Mono" };
|
|
11
|
+
|
|
12
|
+
test("hexToRgb handles long, short, and bad input", () => {
|
|
13
|
+
assert.equal(hexToRgb("#FF4D00"), "255, 77, 0");
|
|
14
|
+
assert.equal(hexToRgb("#fff"), "255, 255, 255");
|
|
15
|
+
assert.equal(hexToRgb("rgba(1,2,3,1)"), null);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("brandTokens rewrites mapped variables and leaves the rest", () => {
|
|
19
|
+
const css = ":root {\n --accent: #4F8CFF;\n --accent-rgb: 79, 140, 255;\n --canvas: #0A0E14;\n --radius: 28px;\n}\n";
|
|
20
|
+
const map = { "--accent": "accent", "--accent-rgb": "rgb:accent", "--canvas": "paper", "--missing": "ink" };
|
|
21
|
+
const out = brandTokens(css, map, brand);
|
|
22
|
+
assert.match(out.css, /--accent: #FF4D00;/);
|
|
23
|
+
assert.match(out.css, /--accent-rgb: 255, 77, 0;/);
|
|
24
|
+
assert.match(out.css, /--canvas: #101010;/);
|
|
25
|
+
assert.match(out.css, /--radius: 28px;/);
|
|
26
|
+
assert.deepEqual(out.skipped, ["--missing"]);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("accent-only keeps the pack surfaces", () => {
|
|
30
|
+
const css = ":root {\n --accent: #4F8CFF;\n --canvas: #0A0E14;\n}\n";
|
|
31
|
+
const out = brandTokens(css, { "--accent": "accent", "--canvas": "paper" }, brand, { accentOnly: true });
|
|
32
|
+
assert.match(out.css, /--accent: #FF4D00;/);
|
|
33
|
+
assert.match(out.css, /--canvas: #0A0E14;/);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("fonts become a family stack and local @font-face rules", () => {
|
|
37
|
+
const fonts = matchFonts(["InstrumentSerif-Regular.woff2", "Geist-Variable.ttf", "notes.txt"], brand);
|
|
38
|
+
assert.deepEqual(fonts.map((f) => f.file), ["InstrumentSerif-Regular.woff2", "Geist-Variable.ttf"]);
|
|
39
|
+
const out = brandTokens(":root {\n --font-display: \"Fraunces\", serif;\n}\n", { "--font-display": "font:display" }, brand, { fonts });
|
|
40
|
+
assert.match(out.css, /--font-display: "Instrument Serif", system-ui, sans-serif;/);
|
|
41
|
+
assert.match(out.css, /@font-face \{ font-family: "Instrument Serif"; src: url\("\.\.\/\.\.\/assets\/fonts\/InstrumentSerif-Regular\.woff2"\)/);
|
|
42
|
+
assert.doesNotMatch(out.css, /https?:\/\//);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("CLI brands every shipped pack from a run's brand.json", () => {
|
|
46
|
+
const run = mkdtempSync(join(tmpdir(), "cards-brand-"));
|
|
47
|
+
writeFileSync(join(run, "brand.json"), JSON.stringify(brand));
|
|
48
|
+
for (const pack of ["paper-collage", "aurora-glass"]) {
|
|
49
|
+
const r = spawnSync(process.execPath, [join(import.meta.dirname, "apply-brand.mjs"), run, pack], { encoding: "utf8" });
|
|
50
|
+
assert.equal(r.status, 0, r.stderr);
|
|
51
|
+
const tokens = readFileSync(join(run, "composition/cards", pack, "tokens.css"), "utf8");
|
|
52
|
+
assert.match(tokens, /#FF4D00/, `${pack} did not take the brand accent`);
|
|
53
|
+
assert.doesNotMatch(tokens, /#4F8CFF/i, `${pack} still holds the default accent`);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("CLI fails without brand.json", () => {
|
|
58
|
+
const run = mkdtempSync(join(tmpdir(), "cards-brand-"));
|
|
59
|
+
mkdirSync(join(run, "composition"));
|
|
60
|
+
const r = spawnSync(process.execPath, [join(import.meta.dirname, "apply-brand.mjs"), run, "aurora-glass"], { encoding: "utf8" });
|
|
61
|
+
assert.equal(r.status, 1);
|
|
62
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Scan packs/ for NN-slug pack folders, read each style.json, and write
|
|
3
|
+
// packs/registry.json: the index luckiest-video-studio reads to pick cards.
|
|
4
|
+
// Usage: node scripts/build-registry.mjs
|
|
5
|
+
|
|
6
|
+
import { readdirSync, statSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
7
|
+
import { join, resolve, dirname } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
|
|
10
|
+
const LIB = resolve(dirname(fileURLToPath(import.meta.url)), "../packs");
|
|
11
|
+
|
|
12
|
+
const packDirs = readdirSync(LIB)
|
|
13
|
+
.filter((d) => /^\d\d-/.test(d) && statSync(join(LIB, d)).isDirectory())
|
|
14
|
+
.sort();
|
|
15
|
+
|
|
16
|
+
const packs = [];
|
|
17
|
+
const warnings = [];
|
|
18
|
+
for (const dir of packDirs) {
|
|
19
|
+
const manifestPath = join(LIB, dir, "style.json");
|
|
20
|
+
if (!existsSync(manifestPath)) { warnings.push(`${dir}: no style.json`); continue; }
|
|
21
|
+
let m;
|
|
22
|
+
try { m = JSON.parse(readFileSync(manifestPath, "utf8")); }
|
|
23
|
+
catch (e) { warnings.push(`${dir}: invalid style.json (${e.message})`); continue; }
|
|
24
|
+
|
|
25
|
+
const cards = (m.cards ?? []).map((c) => {
|
|
26
|
+
if (c.file && !existsSync(join(LIB, dir, c.file))) warnings.push(`${dir}: card file missing: ${c.file}`);
|
|
27
|
+
return {
|
|
28
|
+
id: c.id, pack: m.id, tier: c.tier, purpose: c.purpose, treatment: c.treatment ?? null,
|
|
29
|
+
file: `${dir}/${c.file}`,
|
|
30
|
+
slots: (c.slots ?? []).map((s) => s.name),
|
|
31
|
+
duration: c.duration ?? null,
|
|
32
|
+
qa: c.qa ?? "unchecked",
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
packs.push({
|
|
37
|
+
id: m.id, number: m.number, name: m.name, status: m.status ?? "draft",
|
|
38
|
+
folder: dir, summary: m.inspiration ?? null,
|
|
39
|
+
palette: m.palette ?? null, fonts: m.fonts ?? null,
|
|
40
|
+
cardCount: cards.length,
|
|
41
|
+
cards,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const registry = {
|
|
46
|
+
generated_by: "scripts/build-registry.mjs",
|
|
47
|
+
packCount: packs.length,
|
|
48
|
+
cardCount: packs.reduce((n, p) => n + p.cardCount, 0),
|
|
49
|
+
tiers: ["tier1", "tier2", "custom"],
|
|
50
|
+
packs,
|
|
51
|
+
warnings,
|
|
52
|
+
};
|
|
53
|
+
writeFileSync(join(LIB, "registry.json"), JSON.stringify(registry, null, 2) + "\n");
|
|
54
|
+
console.log(JSON.stringify({ packs: packs.length, cards: registry.cardCount, warnings }, null, 2));
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Scaffold a new card pack by cloning packs/_blueprint/ and substituting the id.
|
|
3
|
+
// Usage: node scripts/new-pack.mjs <NN> <slug> ["Human Name"]
|
|
4
|
+
// e.g. node scripts/new-pack.mjs 03 ink-grid "Ink Grid"
|
|
5
|
+
|
|
6
|
+
import { cpSync, existsSync, readFileSync, writeFileSync, renameSync, readdirSync, statSync } from "node:fs";
|
|
7
|
+
import { join, resolve, dirname } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { argv, exit } from "node:process";
|
|
10
|
+
|
|
11
|
+
const LIB = resolve(dirname(fileURLToPath(import.meta.url)), "../packs");
|
|
12
|
+
const [, , numRaw, slug, ...nameParts] = argv;
|
|
13
|
+
if (!numRaw || !slug) { console.error('Usage: new-pack.mjs <NN> <slug> ["Human Name"]'); exit(1); }
|
|
14
|
+
if (!/^[a-z0-9][a-z0-9-]*$/.test(slug)) { console.error("slug must be kebab-case"); exit(1); }
|
|
15
|
+
|
|
16
|
+
const num = String(numRaw).padStart(2, "0");
|
|
17
|
+
const id = slug;
|
|
18
|
+
const name = nameParts.join(" ") || slug.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
19
|
+
const dest = join(LIB, `${num}-${slug}`);
|
|
20
|
+
if (existsSync(dest)) { console.error(`already exists: ${dest}`); exit(1); }
|
|
21
|
+
|
|
22
|
+
cpSync(join(LIB, "_blueprint"), dest, { recursive: true });
|
|
23
|
+
|
|
24
|
+
// substitute STYLE_ID / NN / name placeholders in text files
|
|
25
|
+
function walk(dir) {
|
|
26
|
+
for (const entry of readdirSync(dir)) {
|
|
27
|
+
const p = join(dir, entry);
|
|
28
|
+
if (statSync(p).isDirectory()) { walk(p); continue; }
|
|
29
|
+
if (!/\.(json|css|md|html)$/.test(entry)) continue;
|
|
30
|
+
let txt = readFileSync(p, "utf8");
|
|
31
|
+
const next = txt.replaceAll("STYLE_ID", id).replaceAll('"number": "NN"', `"number": "${num}"`).replaceAll("Human Readable Style Name", name);
|
|
32
|
+
if (next !== txt) writeFileSync(p, next);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
walk(dest);
|
|
36
|
+
|
|
37
|
+
// rename the example card files to be style-scoped (optional convenience)
|
|
38
|
+
console.log(JSON.stringify({ created: dest, id, number: num, name, next: [
|
|
39
|
+
`1. fill DESIGN.md, tokens.css, and style.json identity fields`,
|
|
40
|
+
`2. build cards under packs/${num}-${slug}/cards/`,
|
|
41
|
+
`3. node scripts/build-registry.mjs`,
|
|
42
|
+
] }, null, 2));
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Record a QA status on every card in packs/*/style.json, then rebuild the registry.
|
|
3
|
+
//
|
|
4
|
+
// node qa-cards.mjs lint [--pack <id>] [--jobs 6] [--bin <hyperframes>]
|
|
5
|
+
// Lints each card on its own with `hyperframes lint --json`. Sets qa to "lint-ok",
|
|
6
|
+
// or "broken" when lint reports errors. Never downgrades a "render-ok" card that
|
|
7
|
+
// still lints clean. Uses `hyperframes` on PATH, else the cached
|
|
8
|
+
// `npx --no-install hyperframes@0.8.84` (it never downloads).
|
|
9
|
+
// node qa-cards.mjs mark <status> <card-id>...
|
|
10
|
+
// Sets qa by hand, for example "render-ok" after a rendered card was inspected.
|
|
11
|
+
// node qa-cards.mjs sample <run-dir> [--pack <id>]
|
|
12
|
+
// Writes a run folder with one tier1 and one tier2 card per purpose per pack as
|
|
13
|
+
// motion scenes, ready for render-scenes.mjs.
|
|
14
|
+
|
|
15
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { join, resolve, dirname } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
20
|
+
|
|
21
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
22
|
+
const PACKS = resolve(HERE, "../packs");
|
|
23
|
+
const HF_VERSION = "0.8.84";
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const flag = (n, d) => { const i = args.indexOf(n); return i >= 0 ? args[i + 1] : d; };
|
|
26
|
+
const packDirs = () => readdirSync(PACKS).filter((d) => /^\d\d-/.test(d)).filter((d) => !flag("--pack") || d.endsWith(flag("--pack")));
|
|
27
|
+
const readManifest = (d) => JSON.parse(readFileSync(join(PACKS, d, "style.json"), "utf8"));
|
|
28
|
+
const writeManifest = (d, m) => writeFileSync(join(PACKS, d, "style.json"), JSON.stringify(m, null, 2) + "\n");
|
|
29
|
+
const rebuild = () => spawnSync(process.execPath, [join(HERE, "build-registry.mjs")], { stdio: "inherit" });
|
|
30
|
+
|
|
31
|
+
function hfCommand() {
|
|
32
|
+
const bin = flag("--bin");
|
|
33
|
+
if (bin) return [bin];
|
|
34
|
+
return spawnSync("hyperframes", ["--version"], { encoding: "utf8" }).status === 0
|
|
35
|
+
? ["hyperframes"] : ["npx", "--no-install", `hyperframes@${HF_VERSION}`];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Lint one card as the root index.html of a scratch project, with the pack's tokens at
|
|
39
|
+
// cards/<pack-id>/tokens.css, the same root-relative path a run uses.
|
|
40
|
+
function lintCard(hf, packDir, file) {
|
|
41
|
+
return new Promise((done) => {
|
|
42
|
+
const proj = mkdtempSync(join(tmpdir(), "card-lint-"));
|
|
43
|
+
mkdirSync(join(proj, "cards", packDir.replace(/^\d\d-/, "")), { recursive: true });
|
|
44
|
+
cpSync(join(PACKS, packDir, "tokens.css"), join(proj, "cards", packDir.replace(/^\d\d-/, ""), "tokens.css"));
|
|
45
|
+
writeFileSync(join(proj, "index.html"), readFileSync(join(PACKS, packDir, file), "utf8"));
|
|
46
|
+
const p = spawn(hf[0], [...hf.slice(1), "lint", "--json", proj], { stdio: ["ignore", "pipe", "pipe"] });
|
|
47
|
+
let out = "", err = "";
|
|
48
|
+
p.stdout.on("data", (b) => (out += b));
|
|
49
|
+
p.stderr.on("data", (b) => (err += b));
|
|
50
|
+
p.on("close", (code) => {
|
|
51
|
+
rmSync(proj, { recursive: true, force: true });
|
|
52
|
+
let errors = null;
|
|
53
|
+
try {
|
|
54
|
+
const j = JSON.parse(out.slice(out.indexOf("{")));
|
|
55
|
+
const findings = j.findings ?? j.results ?? j.issues ?? [];
|
|
56
|
+
errors = typeof j.errorCount === "number" ? j.errorCount : findings.filter((f) => (f.severity ?? f.level) === "error").length;
|
|
57
|
+
} catch { errors = code === 0 ? 0 : null; }
|
|
58
|
+
done({ errors, code, detail: errors ? out.slice(0, 400) : err.slice(0, 200) });
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function lintAll() {
|
|
64
|
+
const hf = hfCommand(), jobs = Number(flag("--jobs", 6));
|
|
65
|
+
const summary = { "lint-ok": 0, broken: 0, "render-ok": 0, unknown: 0 };
|
|
66
|
+
const broken = [];
|
|
67
|
+
for (const d of packDirs()) {
|
|
68
|
+
const m = readManifest(d);
|
|
69
|
+
const queue = [...m.cards];
|
|
70
|
+
const worker = async () => {
|
|
71
|
+
for (let c = queue.shift(); c; c = queue.shift()) {
|
|
72
|
+
const r = await lintCard(hf, d, c.file);
|
|
73
|
+
if (r.errors === null) { summary.unknown++; continue; }
|
|
74
|
+
if (r.errors > 0) { c.qa = "broken"; broken.push({ id: c.id, errors: r.errors }); }
|
|
75
|
+
else if (c.qa !== "render-ok") c.qa = "lint-ok";
|
|
76
|
+
summary[c.qa]++;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
await Promise.all(Array.from({ length: jobs }, worker));
|
|
80
|
+
writeManifest(d, m);
|
|
81
|
+
}
|
|
82
|
+
rebuild();
|
|
83
|
+
console.log(JSON.stringify({ summary, broken }, null, 2));
|
|
84
|
+
process.exitCode = summary.unknown ? 2 : 0;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function mark(status, ids) {
|
|
88
|
+
let n = 0;
|
|
89
|
+
for (const d of packDirs()) {
|
|
90
|
+
const m = readManifest(d);
|
|
91
|
+
for (const c of m.cards) if (ids.includes(c.id)) { c.qa = status; n++; }
|
|
92
|
+
writeManifest(d, m);
|
|
93
|
+
}
|
|
94
|
+
rebuild();
|
|
95
|
+
console.log(`marked ${n} card(s) ${status}`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function sample(runDir) {
|
|
99
|
+
const run = resolve(runDir), comp = join(run, "composition");
|
|
100
|
+
mkdirSync(join(comp, "compositions"), { recursive: true });
|
|
101
|
+
const scenes = [];
|
|
102
|
+
for (const d of packDirs()) {
|
|
103
|
+
const m = readManifest(d), id = m.id;
|
|
104
|
+
cpSync(join(PACKS, d), join(comp, "cards", id), { recursive: true });
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
for (const c of m.cards) {
|
|
107
|
+
const key = `${c.tier}.${c.purpose}`;
|
|
108
|
+
if (seen.has(key) || c.qa === "broken") continue;
|
|
109
|
+
seen.add(key);
|
|
110
|
+
const sceneId = c.id.replace(/\./g, "-");
|
|
111
|
+
const dur = c.duration?.min ?? 5;
|
|
112
|
+
const html = readFileSync(join(PACKS, d, c.file), "utf8");
|
|
113
|
+
writeFileSync(join(comp, "compositions", `${sceneId}.html`), html);
|
|
114
|
+
scenes.push({ id: sceneId, kind: "motion", duration: dur, composition: `compositions/${sceneId}.html`, line: c.id });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
writeFileSync(join(run, "storyboard.json"), JSON.stringify({ version: 1, title: "Card QA sample", mode: "launch",
|
|
118
|
+
hyperframes: HF_VERSION, format: { width: 1920, height: 1080, fps: 30 }, scenes }, null, 2) + "\n");
|
|
119
|
+
console.log(JSON.stringify({ run, scenes: scenes.map((s) => s.line) }, null, 2));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const [cmd, ...rest] = args;
|
|
123
|
+
if (cmd === "lint") await lintAll();
|
|
124
|
+
else if (cmd === "mark" && rest.length > 1) mark(rest[0], rest.slice(1));
|
|
125
|
+
else if (cmd === "sample" && rest[0]) sample(rest[0]);
|
|
126
|
+
else { console.error("Usage: qa-cards.mjs lint [--pack id] [--jobs n] [--bin path] | mark <status> <id>... | sample <run-dir>"); process.exit(1); }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## Style Prompt
|
|
2
|
+
|
|
3
|
+
Use The original edited-video glassmorphism look: crisp face-cam video, restrained dark frosted panels, white editorial text, rounded card edges, visible border highlights, and a heavy soft shadow. The motion should feel like a left-side information panel entering over a camera reframe, not like a full-screen takeover.
|
|
4
|
+
|
|
5
|
+
## Colors
|
|
6
|
+
|
|
7
|
+
- Canvas black: `#000000`
|
|
8
|
+
- Glass base: `rgba(8, 14, 26, 0.62)`
|
|
9
|
+
- Glass dim: `rgba(10, 18, 32, 0.58)`
|
|
10
|
+
- Border highlight: `rgba(125, 211, 252, 0.18)`
|
|
11
|
+
- Text: `#ffffff`
|
|
12
|
+
- Accent: `#7dd3fc`
|
|
13
|
+
|
|
14
|
+
## Typography
|
|
15
|
+
|
|
16
|
+
- Primary: `sans-serif`
|
|
17
|
+
- Label: `monospace`
|
|
18
|
+
|
|
19
|
+
## What Not To Do
|
|
20
|
+
|
|
21
|
+
- Do not cover the face in the center of the source frame.
|
|
22
|
+
- Do not use a full-screen dark overlay.
|
|
23
|
+
- Do not use decorative gradients behind the video.
|
|
24
|
+
- Do not truncate the source video for this prototype.
|