wizz-method 1.3.2 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/README.md +1 -1
  3. package/evals/routing/dataset.json +290 -0
  4. package/evals/routing/run-routing-eval.mjs +89 -0
  5. package/package.json +11 -3
  6. package/skills-registry.yaml +72 -25
  7. package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
  8. package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
  9. package/src/modules/wizz/agents/wizz-designer/SKILL.md +6 -8
  10. package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
  11. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +6 -5
  12. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
  13. package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
  14. package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
  15. package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -1
  16. package/src/skills-lib/ai-product-design/SKILL.md +85 -0
  17. package/src/skills-lib/ai-product-design/references/LICENSE +21 -0
  18. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/bias-detection-design/SKILL.md +37 -0
  19. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/consent-and-agency/SKILL.md +37 -0
  20. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/escalation-design/SKILL.md +40 -0
  21. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/guardrail-design/SKILL.md +36 -0
  22. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/harm-anticipation/SKILL.md +108 -0
  23. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/transparency-patterns/SKILL.md +36 -0
  24. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/trust-calibration/SKILL.md +102 -0
  25. package/src/skills-lib/ai-product-design/references/ai-alignment-reasoning/value-specification/SKILL.md +39 -0
  26. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/agent-role-design/SKILL.md +37 -0
  27. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/failure-recovery/SKILL.md +37 -0
  28. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/handoff-protocols/SKILL.md +45 -0
  29. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/human-in-the-loop/SKILL.md +39 -0
  30. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/observability-design/SKILL.md +48 -0
  31. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/state-management/SKILL.md +95 -0
  32. package/src/skills-lib/ai-product-design/references/design-agent-orchestration/task-decomposition/SKILL.md +36 -0
  33. package/src/skills-lib/ai-product-design/references/evaluation/comparative-evaluation/SKILL.md +39 -0
  34. package/src/skills-lib/ai-product-design/references/evaluation/failure-taxonomy/SKILL.md +47 -0
  35. package/src/skills-lib/ai-product-design/references/evaluation/heuristic-evaluation-ai/SKILL.md +46 -0
  36. package/src/skills-lib/ai-product-design/references/evaluation/longitudinal-measurement/SKILL.md +38 -0
  37. package/src/skills-lib/ai-product-design/references/evaluation/output-quality-rubrics/SKILL.md +41 -0
  38. package/src/skills-lib/ai-product-design/references/evaluation/task-success-metrics/SKILL.md +35 -0
  39. package/src/skills-lib/ai-product-design/references/evaluation/user-satisfaction-signals/SKILL.md +50 -0
  40. package/src/skills-lib/ai-product-design/references/model-interaction-design/context-window-design/SKILL.md +28 -0
  41. package/src/skills-lib/ai-product-design/references/model-interaction-design/conversation-patterns/SKILL.md +37 -0
  42. package/src/skills-lib/ai-product-design/references/model-interaction-design/feedback-loops/SKILL.md +35 -0
  43. package/src/skills-lib/ai-product-design/references/model-interaction-design/frustration-detection/SKILL.md +91 -0
  44. package/src/skills-lib/ai-product-design/references/model-interaction-design/generative-ui/SKILL.md +34 -0
  45. package/src/skills-lib/ai-product-design/references/model-interaction-design/mixed-initiative-flow/SKILL.md +39 -0
  46. package/src/skills-lib/ai-product-design/references/model-interaction-design/multimodal-orchestration/SKILL.md +94 -0
  47. package/src/skills-lib/ai-product-design/references/model-interaction-design/progressive-disclosure/SKILL.md +33 -0
  48. package/src/skills-lib/ai-product-design/references/prompt-architecture/chain-of-thought-design/SKILL.md +45 -0
  49. package/src/skills-lib/ai-product-design/references/prompt-architecture/constraint-specification/SKILL.md +50 -0
  50. package/src/skills-lib/ai-product-design/references/prompt-architecture/context-engineering/SKILL.md +45 -0
  51. package/src/skills-lib/ai-product-design/references/prompt-architecture/few-shot-patterns/SKILL.md +47 -0
  52. package/src/skills-lib/ai-product-design/references/prompt-architecture/prompt-versioning/SKILL.md +42 -0
  53. package/src/skills-lib/ai-product-design/references/prompt-architecture/system-prompt-structure/SKILL.md +50 -0
  54. package/src/skills-lib/ai-product-design/references/prompt-architecture/template-design/SKILL.md +42 -0
  55. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/behavioral-consistency/SKILL.md +36 -0
  56. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/cultural-adaptation/SKILL.md +38 -0
  57. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/domain-voice/SKILL.md +51 -0
  58. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/emotional-design/SKILL.md +51 -0
  59. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/error-personality/SKILL.md +45 -0
  60. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/persona-architecture/SKILL.md +38 -0
  61. package/src/skills-lib/ai-product-design/references/system-behavior-shaping/tone-calibration/SKILL.md +39 -0
  62. package/src/skills-lib/algorithmic-art/LICENSE.txt +202 -0
  63. package/src/skills-lib/algorithmic-art/SKILL.md +405 -0
  64. package/src/skills-lib/algorithmic-art/templates/generator_template.js +223 -0
  65. package/src/skills-lib/algorithmic-art/templates/viewer.html +599 -0
  66. package/src/skills-lib/animate/README.md +41 -0
  67. package/src/skills-lib/animate/SKILL.md +179 -0
  68. package/src/skills-lib/animate/examples/animate-height.tsx +75 -0
  69. package/src/skills-lib/animate/examples/app-store-card.tsx +164 -0
  70. package/src/skills-lib/animate/examples/card-hover.tsx +79 -0
  71. package/src/skills-lib/animate/examples/feedback-popover.tsx +119 -0
  72. package/src/skills-lib/animate/examples/multi-step-flow.tsx +128 -0
  73. package/src/skills-lib/animate/examples/shared-layout.tsx +64 -0
  74. package/src/skills-lib/animate/examples/text-reveal.tsx +70 -0
  75. package/src/skills-lib/animate/examples/toast-stacking.tsx +95 -0
  76. package/src/skills-lib/animate/references/css-animations.md +232 -0
  77. package/src/skills-lib/animate/references/easing-and-timing.md +105 -0
  78. package/src/skills-lib/animate/references/framer-motion.md +356 -0
  79. package/src/skills-lib/animate/references/performance-accessibility.md +185 -0
  80. package/src/skills-lib/auth-and-secrets/SKILL.md +38 -10
  81. package/src/skills-lib/canvas-design/LICENSE.txt +202 -0
  82. package/src/skills-lib/canvas-design/SKILL.md +130 -0
  83. package/src/skills-lib/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  84. package/src/skills-lib/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  85. package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  86. package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  87. package/src/skills-lib/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  88. package/src/skills-lib/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  89. package/src/skills-lib/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  90. package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  91. package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  92. package/src/skills-lib/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  93. package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  94. package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  95. package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  96. package/src/skills-lib/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  97. package/src/skills-lib/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  98. package/src/skills-lib/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  99. package/src/skills-lib/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  100. package/src/skills-lib/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  101. package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  102. package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  103. package/src/skills-lib/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  104. package/src/skills-lib/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  105. package/src/skills-lib/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  106. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  107. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  108. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  109. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  110. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  111. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  112. package/src/skills-lib/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  113. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  114. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  115. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  116. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  117. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  118. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  119. package/src/skills-lib/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  120. package/src/skills-lib/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  121. package/src/skills-lib/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  122. package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  123. package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  124. package/src/skills-lib/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  125. package/src/skills-lib/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  126. package/src/skills-lib/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  127. package/src/skills-lib/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  128. package/src/skills-lib/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  129. package/src/skills-lib/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  130. package/src/skills-lib/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  131. package/src/skills-lib/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  132. package/src/skills-lib/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  133. package/src/skills-lib/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  134. package/src/skills-lib/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  135. package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  136. package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  137. package/src/skills-lib/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  138. package/src/skills-lib/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  139. package/src/skills-lib/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  140. package/src/skills-lib/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  141. package/src/skills-lib/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  142. package/src/skills-lib/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  143. package/src/skills-lib/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  144. package/src/skills-lib/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  145. package/src/skills-lib/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  146. package/src/skills-lib/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  147. package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  148. package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  149. package/src/skills-lib/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  150. package/src/skills-lib/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  151. package/src/skills-lib/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  152. package/src/skills-lib/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  153. package/src/skills-lib/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  154. package/src/skills-lib/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  155. package/src/skills-lib/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  156. package/src/skills-lib/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  157. package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  158. package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  159. package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  160. package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  161. package/src/skills-lib/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  162. package/src/skills-lib/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  163. package/src/skills-lib/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  164. package/src/skills-lib/design-motion-principles/SKILL.md +122 -0
  165. package/src/skills-lib/design-motion-principles/references/accessibility.md +52 -0
  166. package/src/skills-lib/design-motion-principles/references/anti-checklist.md +274 -0
  167. package/src/skills-lib/design-motion-principles/references/audit-checklist.md +137 -0
  168. package/src/skills-lib/design-motion-principles/references/creation-gotchas.md +36 -0
  169. package/src/skills-lib/design-motion-principles/references/demo-shell.html +275 -0
  170. package/src/skills-lib/design-motion-principles/references/emil-kowalski.md +121 -0
  171. package/src/skills-lib/design-motion-principles/references/jakub-krehel.md +80 -0
  172. package/src/skills-lib/design-motion-principles/references/jhey-tompkins.md +122 -0
  173. package/src/skills-lib/design-motion-principles/references/motion-cookbook.md +529 -0
  174. package/src/skills-lib/design-motion-principles/references/output-format.md +346 -0
  175. package/src/skills-lib/design-motion-principles/references/performance.md +82 -0
  176. package/src/skills-lib/design-motion-principles/references/report-template.html +1006 -0
  177. package/src/skills-lib/design-motion-principles/workflows/audit.md +203 -0
  178. package/src/skills-lib/design-motion-principles/workflows/create.md +87 -0
  179. package/src/skills-lib/desktop-security/SKILL.md +35 -4
  180. package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +52 -2083
  181. package/src/skills-lib/premium-landing-ui-researcher/references/audit-protocol.md +124 -0
  182. package/src/skills-lib/premium-landing-ui-researcher/references/component-sources.md +336 -0
  183. package/src/skills-lib/premium-landing-ui-researcher/references/core-goal.md +62 -0
  184. package/src/skills-lib/premium-landing-ui-researcher/references/dashboard-and-portfolio-modes.md +92 -0
  185. package/src/skills-lib/premium-landing-ui-researcher/references/handoffs.md +55 -0
  186. package/src/skills-lib/premium-landing-ui-researcher/references/landing-page-strategy.md +227 -0
  187. package/src/skills-lib/premium-landing-ui-researcher/references/mandatory-process.md +36 -0
  188. package/src/skills-lib/premium-landing-ui-researcher/references/output-format-and-quality.md +129 -0
  189. package/src/skills-lib/premium-landing-ui-researcher/references/prompt-templates.md +206 -0
  190. package/src/skills-lib/premium-landing-ui-researcher/references/site-levels.md +515 -0
  191. package/src/skills-lib/premium-landing-ui-researcher/references/source-first-protocol.md +144 -0
  192. package/src/skills-lib/premium-landing-ui-researcher/references/source-links.md +39 -0
  193. package/src/skills-lib/premium-landing-ui-researcher/references/stack-and-visual-direction.md +118 -0
  194. package/src/skills-lib/taste-skill/SKILL.md +33 -1177
  195. package/src/skills-lib/taste-skill/references/anti-slop-tells.md +110 -0
  196. package/src/skills-lib/taste-skill/references/architecture-conventions.md +39 -0
  197. package/src/skills-lib/taste-skill/references/block-library.md +61 -0
  198. package/src/skills-lib/taste-skill/references/brief-and-dials.md +89 -0
  199. package/src/skills-lib/taste-skill/references/dark-mode.md +23 -0
  200. package/src/skills-lib/taste-skill/references/design-directives.md +191 -0
  201. package/src/skills-lib/taste-skill/references/design-systems.md +267 -0
  202. package/src/skills-lib/taste-skill/references/motion-patterns.md +167 -0
  203. package/src/skills-lib/taste-skill/references/pattern-vocabulary.md +78 -0
  204. package/src/skills-lib/taste-skill/references/performance-a11y.md +33 -0
  205. package/src/skills-lib/taste-skill/references/preflight-checklist.md +73 -0
  206. package/src/skills-lib/taste-skill/references/redesign-protocol.md +52 -0
  207. package/src/skills-lib/web-security/SKILL.md +74 -6
  208. package/src/skills-lib/wizz-router/SKILL.md +21 -243
  209. package/src/skills-lib/wizz-router/references/auditoria-360.md +21 -0
  210. package/src/skills-lib/wizz-router/references/routing-table-flat.md +95 -0
  211. package/src/squads/advisory-board/agents/ray-dalio.md +0 -20
  212. package/tools/hooks/README.md +17 -0
  213. package/tools/hooks/security-defensive-context.js +70 -0
  214. package/tools/hooks/session-rules.js +38 -0
  215. package/tools/hooks/wizz-router-enforce.js +188 -0
  216. package/tools/installer/modules/skills-lib.js +70 -1
  217. package/tools/sync-global.mjs +84 -0
  218. package/.claude/settings.local.json +0 -8
  219. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  220. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  221. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  222. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
  223. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +0 -1
  224. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +0 -1
  225. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +0 -1
@@ -0,0 +1,179 @@
1
+ ---
2
+ name: animate
3
+ description: Animation patterns and best practices for Next.js/React applications. Use this skill when implementing animations, transitions, hover effects, page transitions, modals, or any motion in React components. Based on Emil Kowalski's "Animations on the Web" course.
4
+ ---
5
+
6
+ # Next.js Animations
7
+
8
+ ## Overview
9
+
10
+ This skill provides comprehensive guidance for implementing smooth, performant, and accessible animations in Next.js and React applications. It covers CSS animations, Framer Motion, easing principles, and accessibility considerations.
11
+
12
+ ## Quick Reference
13
+
14
+ ### Easing Cheat Sheet
15
+
16
+ | Animation Type | Easing | Duration |
17
+ |----------------|--------|----------|
18
+ | Element entering | `ease-out` | 200-300ms |
19
+ | Element moving on screen | `ease-in-out` | 200-300ms |
20
+ | Element exiting | `ease-in` | 150-200ms |
21
+ | Hover effects | `ease` | 150ms |
22
+ | Opacity only | `linear` | varies |
23
+
24
+ ### CSS Custom Properties (Recommended)
25
+
26
+ ```css
27
+ :root {
28
+ --ease-out-quint: cubic-bezier(.23, 1, .32, 1);
29
+ --ease-in-out-cubic: cubic-bezier(.645, .045, .355, 1);
30
+ --ease-out-cubic: cubic-bezier(.33, 1, .68, 1);
31
+ }
32
+ ```
33
+
34
+ ## Common Animation Patterns
35
+
36
+ ### 1. Hover Lift Effect
37
+
38
+ ```css
39
+ .card {
40
+ transition: transform 200ms var(--ease-out-quint),
41
+ box-shadow 200ms var(--ease-out-quint);
42
+ }
43
+ .card:hover {
44
+ transform: translateY(-4px);
45
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15);
46
+ }
47
+ ```
48
+
49
+ ### 2. Button Press
50
+
51
+ ```css
52
+ .button {
53
+ transition: transform 100ms ease-out;
54
+ }
55
+ .button:active {
56
+ transform: scale(0.97);
57
+ }
58
+ ```
59
+
60
+ ### 3. Fade In on Mount (Framer Motion)
61
+
62
+ ```tsx
63
+ <motion.div
64
+ initial={{ opacity: 0, y: 20 }}
65
+ animate={{ opacity: 1, y: 0 }}
66
+ transition={{ duration: 0.3, ease: [.23, 1, .32, 1] }}
67
+ >
68
+ Content
69
+ </motion.div>
70
+ ```
71
+
72
+ ### 4. Modal with Exit Animation
73
+
74
+ ```tsx
75
+ <AnimatePresence>
76
+ {isOpen && (
77
+ <motion.div
78
+ initial={{ opacity: 0, scale: 0.95 }}
79
+ animate={{ opacity: 1, scale: 1 }}
80
+ exit={{ opacity: 0, scale: 0.95 }}
81
+ transition={{ duration: 0.2, ease: "easeOut" }}
82
+ >
83
+ {children}
84
+ </motion.div>
85
+ )}
86
+ </AnimatePresence>
87
+ ```
88
+
89
+ ### 5. Tab Indicator (Shared Layout)
90
+
91
+ ```tsx
92
+ {tabs.map(tab => (
93
+ <button key={tab} onClick={() => setActive(tab)} className="relative px-4 py-2">
94
+ {tab}
95
+ {active === tab && (
96
+ <motion.div
97
+ layoutId="tab-indicator"
98
+ className="absolute inset-0 bg-blue-500 rounded -z-10"
99
+ transition={{ type: "spring", stiffness: 400, damping: 30 }}
100
+ />
101
+ )}
102
+ </button>
103
+ ))}
104
+ ```
105
+
106
+ ### 6. Staggered List Animation
107
+
108
+ ```tsx
109
+ const container = {
110
+ hidden: { opacity: 0 },
111
+ visible: {
112
+ opacity: 1,
113
+ transition: { staggerChildren: 0.1 }
114
+ }
115
+ }
116
+
117
+ const item = {
118
+ hidden: { opacity: 0, y: 20 },
119
+ visible: { opacity: 1, y: 0 }
120
+ }
121
+
122
+ <motion.ul variants={container} initial="hidden" animate="visible">
123
+ {items.map(i => <motion.li key={i} variants={item}>{i}</motion.li>)}
124
+ </motion.ul>
125
+ ```
126
+
127
+ ## Golden Rules
128
+
129
+ 1. **Exits faster than enters**: Exit animations should be ~75% of enter duration
130
+ 2. **Only animate transform and opacity**: These are GPU-accelerated
131
+ 3. **200-300ms is the sweet spot**: Most animations should be in this range
132
+ 4. **Always respect prefers-reduced-motion**: See accessibility section in references
133
+ 5. **Use springs for interruptible animations**: Better UX when users interrupt
134
+
135
+ ## Examples
136
+
137
+ Complete working examples from the course are in the `examples/` directory:
138
+
139
+ | Example | Description | Key Techniques |
140
+ |---------|-------------|----------------|
141
+ | `card-hover.tsx` | Slide-up description on hover | CSS transitions, transform, opacity |
142
+ | `toast-stacking.tsx` | Animated toast notifications | CSS custom properties, data-* triggers |
143
+ | `text-reveal.tsx` | Staggered letter animation | @keyframes, animation-delay, calc() |
144
+ | `shared-layout.tsx` | Element position/size morph | Framer Motion layoutId |
145
+ | `animate-height.tsx` | Smooth height changes | useMeasure, animate height |
146
+ | `multi-step-flow.tsx` | Directional step wizard | AnimatePresence, custom variants |
147
+ | `feedback-popover.tsx` | Button-to-popover expansion | Nested layoutId, form states |
148
+ | `app-store-card.tsx` | iOS-style card expansion | Multiple layoutId elements |
149
+
150
+ To use an example, read it with: `Read examples/<name>.tsx`
151
+
152
+ ## References
153
+
154
+ For detailed documentation, read the reference files:
155
+
156
+ - `references/easing-and-timing.md` - Easing functions, timing guidelines, spring configuration
157
+ - `references/css-animations.md` - Transforms, transitions, keyframes, clip-path
158
+ - `references/framer-motion.md` - Motion components, AnimatePresence, variants, layout animations, hooks
159
+ - `references/performance-accessibility.md` - 60fps optimization, prefers-reduced-motion, accessibility
160
+
161
+ ## When to Use What
162
+
163
+ | Scenario | Recommended Approach |
164
+ |----------|---------------------|
165
+ | Simple hover effects | CSS transitions |
166
+ | Enter/exit animations | Framer Motion + AnimatePresence |
167
+ | Layout changes | Framer Motion `layout` prop |
168
+ | Shared element transitions | Framer Motion `layoutId` |
169
+ | Scroll-linked animations | Framer Motion `useScroll` |
170
+ | Complex orchestrated animations | Framer Motion variants |
171
+ | Drag interactions | Framer Motion drag gestures |
172
+ | Performance-critical | CSS-only with transforms |
173
+
174
+ ## Dependencies
175
+
176
+ For Framer Motion examples, install:
177
+ ```bash
178
+ pnpm add framer-motion react-use-measure usehooks-ts
179
+ ```
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Animate Height
3
+ *
4
+ * Smoothly animate height changes when content expands/collapses.
5
+ * Uses react-use-measure to get the actual content height.
6
+ *
7
+ * Key techniques:
8
+ * - useMeasure hook to get dynamic content dimensions
9
+ * - Animate height property (normally discouraged, but acceptable here)
10
+ * - Inner wrapper ref for measuring, outer wrapper for animating
11
+ * - Works for any dynamic content changes
12
+ *
13
+ * Note: Install react-use-measure: pnpm add react-use-measure
14
+ */
15
+ "use client";
16
+
17
+ import { motion } from "framer-motion";
18
+ import { useState } from "react";
19
+ import useMeasure from "react-use-measure";
20
+
21
+ // styles.css
22
+ const styles = `
23
+ .wrapper {
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 24px;
27
+ align-items: center;
28
+ }
29
+
30
+ .element {
31
+ background: #f5f5f5;
32
+ border-radius: 12px;
33
+ overflow: hidden;
34
+ width: 300px;
35
+ }
36
+
37
+ .inner {
38
+ padding: 16px;
39
+ }
40
+ `;
41
+
42
+ export default function AnimateHeight() {
43
+ const [showExtraContent, setShowExtraContent] = useState(false);
44
+ const [ref, bounds] = useMeasure();
45
+
46
+ return (
47
+ <div className="wrapper">
48
+ <button onClick={() => setShowExtraContent((b) => !b)}>
49
+ Toggle height
50
+ </button>
51
+
52
+ {/* Outer div animates to measured height */}
53
+ <motion.div
54
+ className="element"
55
+ animate={{ height: bounds.height }}
56
+ transition={{ duration: 0.3 }}
57
+ >
58
+ {/* Inner div is measured */}
59
+ <div className="inner" ref={ref}>
60
+ <h1>Expandable Drawer</h1>
61
+ <p>
62
+ This content can grow and shrink. The animation smoothly
63
+ transitions between heights.
64
+ </p>
65
+ {showExtraContent && (
66
+ <p>
67
+ This extra content will change the height of the drawer.
68
+ The animation handles any content changes automatically.
69
+ </p>
70
+ )}
71
+ </div>
72
+ </motion.div>
73
+ </div>
74
+ );
75
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * App Store Card Expansion
3
+ *
4
+ * iOS App Store-style card that expands to full screen with shared
5
+ * layout animation. Multiple elements animate together.
6
+ *
7
+ * Key techniques:
8
+ * - Multiple layoutId elements that animate together
9
+ * - whileTap for press feedback
10
+ * - Overlay with separate AnimatePresence
11
+ * - useOnClickOutside and Escape key for dismiss
12
+ * - borderRadius in style prop to prevent distortion
13
+ */
14
+ "use client";
15
+
16
+ import { useState, useEffect, useRef } from "react";
17
+ import { AnimatePresence, motion } from "framer-motion";
18
+ import { useOnClickOutside } from "usehooks-ts";
19
+
20
+ type Card = {
21
+ title: string;
22
+ description: string;
23
+ longDescription: string;
24
+ image: string;
25
+ };
26
+
27
+ // Card in grid view
28
+ function Card({
29
+ card,
30
+ setActiveCard,
31
+ }: {
32
+ card: Card;
33
+ setActiveCard: (card: Card | null) => void;
34
+ }) {
35
+ return (
36
+ <motion.div
37
+ layoutId={`card-${card.title}`}
38
+ className="card"
39
+ whileTap={{ scale: 0.98 }}
40
+ onClick={() => setActiveCard(card)}
41
+ style={{ borderRadius: 20 }}
42
+ >
43
+ <motion.img
44
+ layoutId={`image-${card.title}`}
45
+ src={card.image}
46
+ alt=""
47
+ style={{ borderRadius: 20 }}
48
+ draggable={false}
49
+ />
50
+ <motion.div layoutId={`card-content-${card.title}`} className="card-content">
51
+ <motion.h2 layoutId={`card-heading-${card.title}`}>
52
+ {card.title}
53
+ </motion.h2>
54
+ <motion.p layoutId={`card-description-${card.title}`}>
55
+ {card.description}
56
+ </motion.p>
57
+ </motion.div>
58
+
59
+ {/* Hidden long description - will animate in when expanded */}
60
+ <motion.div
61
+ layoutId={`card-long-description-${card.title}`}
62
+ style={{ position: "absolute", top: "100%", opacity: 0 }}
63
+ >
64
+ {card.longDescription}
65
+ </motion.div>
66
+ </motion.div>
67
+ );
68
+ }
69
+
70
+ // Expanded card view
71
+ function ActiveCard({
72
+ activeCard,
73
+ setActiveCard,
74
+ }: {
75
+ activeCard: Card;
76
+ setActiveCard: (card: Card | null) => void;
77
+ }) {
78
+ const ref = useRef<HTMLDivElement>(null);
79
+ useOnClickOutside(ref, () => setActiveCard(null));
80
+
81
+ return (
82
+ <motion.div
83
+ ref={ref}
84
+ layoutId={`card-${activeCard.title}`}
85
+ className="card card-active"
86
+ style={{ borderRadius: 0 }}
87
+ >
88
+ <motion.img
89
+ layoutId={`image-${activeCard.title}`}
90
+ src={activeCard.image}
91
+ alt=""
92
+ style={{ borderRadius: 0 }}
93
+ />
94
+ <motion.button
95
+ className="close-button"
96
+ onClick={() => setActiveCard(null)}
97
+ >
98
+
99
+ </motion.button>
100
+ <motion.div layoutId={`card-content-${activeCard.title}`} className="card-content">
101
+ <motion.h2 layoutId={`card-heading-${activeCard.title}`}>
102
+ {activeCard.title}
103
+ </motion.h2>
104
+ <motion.p layoutId={`card-description-${activeCard.title}`}>
105
+ {activeCard.description}
106
+ </motion.p>
107
+ </motion.div>
108
+
109
+ {/* Long description now visible */}
110
+ <motion.div layoutId={`card-long-description-${activeCard.title}`}>
111
+ {activeCard.longDescription}
112
+ </motion.div>
113
+ </motion.div>
114
+ );
115
+ }
116
+
117
+ export default function AppStoreCards() {
118
+ const [activeCard, setActiveCard] = useState<Card | null>(null);
119
+
120
+ // Dismiss on Escape
121
+ useEffect(() => {
122
+ function onKeyDown(event: KeyboardEvent) {
123
+ if (event.key === "Escape") setActiveCard(null);
124
+ }
125
+ window.addEventListener("keydown", onKeyDown);
126
+ return () => window.removeEventListener("keydown", onKeyDown);
127
+ }, []);
128
+
129
+ return (
130
+ <div className="cards-wrapper">
131
+ {CARDS.map((card) => (
132
+ <Card key={card.title} card={card} setActiveCard={setActiveCard} />
133
+ ))}
134
+
135
+ {/* Overlay */}
136
+ <AnimatePresence>
137
+ {activeCard && (
138
+ <motion.div
139
+ initial={{ opacity: 0 }}
140
+ animate={{ opacity: 1 }}
141
+ exit={{ opacity: 0 }}
142
+ className="overlay"
143
+ />
144
+ )}
145
+ </AnimatePresence>
146
+
147
+ {/* Expanded card */}
148
+ <AnimatePresence>
149
+ {activeCard && (
150
+ <ActiveCard activeCard={activeCard} setActiveCard={setActiveCard} />
151
+ )}
152
+ </AnimatePresence>
153
+ </div>
154
+ );
155
+ }
156
+
157
+ const CARDS: Card[] = [
158
+ {
159
+ title: "Game Title",
160
+ description: "A brief description",
161
+ longDescription: "Full description with more details about the game...",
162
+ image: "/game-image.webp",
163
+ },
164
+ ];
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Card Hover Animation
3
+ *
4
+ * A card component where the description slides up from the bottom on hover.
5
+ * Uses CSS transitions with transform and opacity for smooth animation.
6
+ *
7
+ * Key techniques:
8
+ * - Transform translateY to slide content in/out
9
+ * - Combined transition on transform and opacity
10
+ * - :hover and :focus-visible for accessibility
11
+ * - overflow: hidden on parent to clip content
12
+ */
13
+
14
+ // card-hover.css
15
+ const styles = `
16
+ .card-hover {
17
+ width: 340px;
18
+ height: 340px;
19
+ border-radius: 16px;
20
+ background: #fff;
21
+ display: flex;
22
+ align-items: flex-end;
23
+ text-decoration: none;
24
+ box-shadow: 0px 0px 0px 1px rgba(9, 9, 11, 0.08),
25
+ 0px 1px 2px -1px rgba(9, 9, 11, 0.08),
26
+ 0px 2px 4px 0px rgba(9, 9, 11, 0.04);
27
+ overflow: hidden;
28
+ }
29
+
30
+ .card-hover-description {
31
+ border-radius: 12px;
32
+ border: 1px solid #fff;
33
+ position: relative;
34
+ background: #fafafa;
35
+ margin: 6px;
36
+ width: 100%;
37
+ padding: 10px 14px 13px;
38
+ font-size: 13px;
39
+ box-shadow: 0px 0px 0px 1px rgba(0, 0, 0, 0.08),
40
+ 0px 1px 2px -1px rgba(0, 0, 0, 0.08),
41
+ 0px 2px 4px 0px rgba(0, 0, 0, 0.04);
42
+
43
+ /* Animation - hidden by default */
44
+ transform: translateY(calc(100% + 8px));
45
+ transition-duration: 350ms;
46
+ transition-timing-function: ease;
47
+ transition-property: transform, opacity;
48
+ opacity: 0;
49
+ }
50
+
51
+ /* Show on hover or keyboard focus */
52
+ .card-hover:hover .card-hover-description,
53
+ .card-hover:focus-visible .card-hover-description {
54
+ transform: translateY(0%);
55
+ opacity: 1;
56
+ }
57
+
58
+ .card-hover-title {
59
+ color: #1b1b1d;
60
+ font-weight: 500;
61
+ }
62
+
63
+ .card-hover-subtitle {
64
+ color: #717175;
65
+ line-height: 1;
66
+ margin-top: 4px;
67
+ }
68
+ `;
69
+
70
+ export default function CardHover() {
71
+ return (
72
+ <a href="#" className="card-hover">
73
+ <div className="card-hover-description">
74
+ <h3 className="card-hover-title">Project name</h3>
75
+ <p className="card-hover-subtitle">Project description</p>
76
+ </div>
77
+ </a>
78
+ );
79
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Feedback Popover Animation
3
+ *
4
+ * A button that expands into a feedback form using shared layout animation.
5
+ * Shows loading and success states with animated transitions.
6
+ *
7
+ * Key techniques:
8
+ * - layoutId on button and popover for seamless expansion
9
+ * - Nested layoutId elements (text placeholder)
10
+ * - AnimatePresence for popover enter/exit
11
+ * - Form state transitions (idle -> loading -> success)
12
+ * - useOnClickOutside for dismiss behavior
13
+ *
14
+ * Note: Install usehooks-ts: pnpm add usehooks-ts
15
+ */
16
+ "use client";
17
+
18
+ import { AnimatePresence, motion } from "framer-motion";
19
+ import { useEffect, useState, useRef } from "react";
20
+ import { useOnClickOutside } from "usehooks-ts";
21
+
22
+ export default function FeedbackPopover() {
23
+ const [open, setOpen] = useState(false);
24
+ const [formState, setFormState] = useState<"idle" | "loading" | "success">("idle");
25
+ const [feedback, setFeedback] = useState("");
26
+ const ref = useRef<HTMLDivElement>(null);
27
+
28
+ // Close on click outside
29
+ useOnClickOutside(ref, () => setOpen(false));
30
+
31
+ function submit() {
32
+ setFormState("loading");
33
+ setTimeout(() => setFormState("success"), 1500);
34
+ setTimeout(() => setOpen(false), 3300);
35
+ }
36
+
37
+ // Keyboard shortcuts
38
+ useEffect(() => {
39
+ const handleKeyDown = (event: KeyboardEvent) => {
40
+ if (event.key === "Escape") setOpen(false);
41
+ if ((event.ctrlKey || event.metaKey) && event.key === "Enter" && open && formState === "idle") {
42
+ submit();
43
+ }
44
+ };
45
+ window.addEventListener("keydown", handleKeyDown);
46
+ return () => window.removeEventListener("keydown", handleKeyDown);
47
+ }, [open, formState]);
48
+
49
+ return (
50
+ <div className="feedback-wrapper">
51
+ {/* Button with layoutId - will animate into popover */}
52
+ <motion.button
53
+ onClick={() => {
54
+ setOpen(true);
55
+ setFormState("idle");
56
+ setFeedback("");
57
+ }}
58
+ className="feedback-button"
59
+ style={{ borderRadius: 8 }}
60
+ layoutId="background"
61
+ >
62
+ <motion.span layoutId="placeholder">
63
+ Feedback
64
+ </motion.span>
65
+ </motion.button>
66
+
67
+ <AnimatePresence>
68
+ {open && (
69
+ <motion.div
70
+ ref={ref}
71
+ className="feedback-popover"
72
+ style={{ borderRadius: 12 }}
73
+ layoutId="background"
74
+ >
75
+ {/* Placeholder text animates with the layout */}
76
+ <motion.span
77
+ aria-hidden
78
+ className="placeholder"
79
+ layoutId="placeholder"
80
+ style={{ opacity: feedback ? 0 : 0.5 }}
81
+ >
82
+ Feedback
83
+ </motion.span>
84
+
85
+ {formState === "success" ? (
86
+ <div className="success-wrapper">
87
+ <h3>Feedback received!</h3>
88
+ <p>Thanks for your feedback.</p>
89
+ </div>
90
+ ) : (
91
+ <form onSubmit={(e) => { e.preventDefault(); submit(); }}>
92
+ <textarea
93
+ autoFocus
94
+ placeholder="Feedback"
95
+ onChange={(e) => setFeedback(e.target.value)}
96
+ value={feedback}
97
+ required
98
+ />
99
+ <button type="submit">
100
+ <AnimatePresence mode="popLayout" initial={false}>
101
+ <motion.span
102
+ key={formState}
103
+ initial={{ opacity: 0, y: -25 }}
104
+ animate={{ opacity: 1, y: 0 }}
105
+ exit={{ opacity: 0, y: 25 }}
106
+ transition={{ type: "spring", duration: 0.3, bounce: 0 }}
107
+ >
108
+ {formState === "loading" ? "Sending..." : "Send feedback"}
109
+ </motion.span>
110
+ </AnimatePresence>
111
+ </button>
112
+ </form>
113
+ )}
114
+ </motion.div>
115
+ )}
116
+ </AnimatePresence>
117
+ </div>
118
+ );
119
+ }