@rune-kit/rune 2.10.0 → 2.11.0

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 (205) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +8 -6
  3. package/commands/rune.md +168 -168
  4. package/contexts/dev.md +34 -34
  5. package/contexts/research.md +43 -43
  6. package/contexts/review.md +55 -55
  7. package/extensions/ai-ml/PACK.md +88 -88
  8. package/extensions/ai-ml/skills/ai-agents.md +172 -172
  9. package/extensions/ai-ml/skills/code-sandbox.md +187 -187
  10. package/extensions/ai-ml/skills/deep-research.md +146 -146
  11. package/extensions/ai-ml/skills/embedding-search.md +66 -66
  12. package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
  13. package/extensions/ai-ml/skills/llm-architect.md +125 -125
  14. package/extensions/ai-ml/skills/llm-integration.md +64 -64
  15. package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
  16. package/extensions/ai-ml/skills/rag-patterns.md +66 -66
  17. package/extensions/ai-ml/skills/web-extraction.md +114 -114
  18. package/extensions/analytics/PACK.md +92 -92
  19. package/extensions/analytics/skills/ab-testing.md +72 -72
  20. package/extensions/analytics/skills/dashboard-patterns.md +83 -83
  21. package/extensions/analytics/skills/data-validation.md +68 -68
  22. package/extensions/analytics/skills/funnel-analysis.md +81 -81
  23. package/extensions/analytics/skills/sql-patterns.md +57 -57
  24. package/extensions/analytics/skills/statistical-analysis.md +79 -79
  25. package/extensions/analytics/skills/tracking-setup.md +71 -71
  26. package/extensions/backend/PACK.md +104 -104
  27. package/extensions/backend/skills/api-patterns.md +84 -84
  28. package/extensions/backend/skills/async-pipeline.md +193 -193
  29. package/extensions/backend/skills/auth-patterns.md +97 -97
  30. package/extensions/backend/skills/background-jobs.md +133 -133
  31. package/extensions/backend/skills/caching-patterns.md +108 -108
  32. package/extensions/backend/skills/cli-generation.md +133 -133
  33. package/extensions/backend/skills/database-patterns.md +87 -87
  34. package/extensions/backend/skills/middleware-patterns.md +104 -104
  35. package/extensions/chrome-ext/PACK.md +93 -93
  36. package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
  37. package/extensions/chrome-ext/skills/cws-publish.md +104 -104
  38. package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
  39. package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
  40. package/extensions/chrome-ext/skills/ext-storage.md +133 -133
  41. package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
  42. package/extensions/content/PACK.md +96 -96
  43. package/extensions/content/skills/blog-patterns.md +88 -88
  44. package/extensions/content/skills/cms-integration.md +131 -131
  45. package/extensions/content/skills/content-scoring.md +107 -107
  46. package/extensions/content/skills/i18n.md +83 -83
  47. package/extensions/content/skills/mdx-authoring.md +137 -137
  48. package/extensions/content/skills/reference.md +1014 -1014
  49. package/extensions/content/skills/seo-patterns.md +67 -67
  50. package/extensions/content/skills/video-repurpose.md +153 -153
  51. package/extensions/devops/PACK.md +101 -101
  52. package/extensions/devops/skills/chaos-testing.md +67 -67
  53. package/extensions/devops/skills/ci-cd.md +75 -75
  54. package/extensions/devops/skills/docker.md +58 -58
  55. package/extensions/devops/skills/edge-serverless.md +163 -163
  56. package/extensions/devops/skills/infra-as-code.md +158 -158
  57. package/extensions/devops/skills/kubernetes.md +110 -110
  58. package/extensions/devops/skills/monitoring.md +57 -57
  59. package/extensions/devops/skills/server-setup.md +64 -64
  60. package/extensions/devops/skills/ssl-domain.md +42 -42
  61. package/extensions/ecommerce/PACK.md +116 -116
  62. package/extensions/ecommerce/skills/cart-system.md +79 -79
  63. package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
  64. package/extensions/ecommerce/skills/order-management.md +126 -126
  65. package/extensions/ecommerce/skills/payment-integration.md +472 -472
  66. package/extensions/ecommerce/skills/shopify-dev.md +69 -69
  67. package/extensions/ecommerce/skills/subscription-billing.md +93 -93
  68. package/extensions/ecommerce/skills/tax-compliance.md +117 -117
  69. package/extensions/gamedev/PACK.md +142 -142
  70. package/extensions/gamedev/skills/asset-pipeline.md +74 -74
  71. package/extensions/gamedev/skills/audio-system.md +129 -129
  72. package/extensions/gamedev/skills/camera-system.md +87 -87
  73. package/extensions/gamedev/skills/ecs.md +98 -98
  74. package/extensions/gamedev/skills/game-loops.md +72 -72
  75. package/extensions/gamedev/skills/input-system.md +199 -199
  76. package/extensions/gamedev/skills/multiplayer.md +180 -180
  77. package/extensions/gamedev/skills/particles.md +105 -105
  78. package/extensions/gamedev/skills/physics-engine.md +89 -89
  79. package/extensions/gamedev/skills/scene-management.md +146 -146
  80. package/extensions/gamedev/skills/threejs-patterns.md +90 -90
  81. package/extensions/gamedev/skills/webgl.md +71 -71
  82. package/extensions/mobile/PACK.md +106 -106
  83. package/extensions/mobile/skills/app-store-connect.md +152 -152
  84. package/extensions/mobile/skills/app-store-prep.md +66 -66
  85. package/extensions/mobile/skills/deep-linking.md +109 -109
  86. package/extensions/mobile/skills/flutter.md +60 -60
  87. package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
  88. package/extensions/mobile/skills/native-bridge.md +66 -66
  89. package/extensions/mobile/skills/ota-updates.md +97 -97
  90. package/extensions/mobile/skills/push-notifications.md +111 -111
  91. package/extensions/mobile/skills/react-native.md +82 -82
  92. package/extensions/saas/PACK.md +116 -116
  93. package/extensions/saas/skills/billing-integration.md +200 -200
  94. package/extensions/saas/skills/feature-flags.md +130 -130
  95. package/extensions/saas/skills/multi-tenant.md +103 -103
  96. package/extensions/saas/skills/onboarding-flow.md +139 -139
  97. package/extensions/saas/skills/subscription-flow.md +95 -95
  98. package/extensions/saas/skills/team-management.md +144 -144
  99. package/extensions/security/PACK.md +99 -99
  100. package/extensions/security/skills/api-security.md +140 -140
  101. package/extensions/security/skills/compliance.md +68 -68
  102. package/extensions/security/skills/owasp-audit.md +64 -64
  103. package/extensions/security/skills/pentest-patterns.md +77 -77
  104. package/extensions/security/skills/secret-mgmt.md +65 -65
  105. package/extensions/security/skills/supply-chain.md +65 -65
  106. package/extensions/trading/PACK.md +80 -80
  107. package/extensions/trading/skills/chart-components.md +55 -55
  108. package/extensions/trading/skills/experiment-loop.md +125 -125
  109. package/extensions/trading/skills/fintech-patterns.md +47 -47
  110. package/extensions/trading/skills/indicator-library.md +58 -58
  111. package/extensions/trading/skills/quant-analysis.md +111 -111
  112. package/extensions/trading/skills/realtime-data.md +58 -58
  113. package/extensions/trading/skills/trade-logic.md +104 -104
  114. package/extensions/ui/PACK.md +130 -130
  115. package/extensions/ui/skills/a11y-audit.md +91 -91
  116. package/extensions/ui/skills/animation-patterns.md +127 -127
  117. package/extensions/ui/skills/component-patterns.md +100 -100
  118. package/extensions/ui/skills/design-decision.md +108 -108
  119. package/extensions/ui/skills/design-system.md +68 -68
  120. package/extensions/ui/skills/landing-patterns.md +155 -155
  121. package/extensions/ui/skills/palette-picker.md +173 -173
  122. package/extensions/ui/skills/react-health.md +90 -90
  123. package/extensions/ui/skills/type-system.md +125 -125
  124. package/extensions/ui/skills/web-vitals.md +153 -153
  125. package/extensions/zalo/PACK.md +145 -145
  126. package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
  127. package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
  128. package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
  129. package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
  130. package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
  131. package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
  132. package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
  133. package/hooks/auto-format/index.cjs +48 -48
  134. package/hooks/hooks.json +111 -111
  135. package/hooks/post-session-reflect/index.cjs +189 -189
  136. package/hooks/pre-compact/index.cjs +95 -95
  137. package/hooks/run-hook.cmd +1 -1
  138. package/hooks/secrets-scan/index.cjs +100 -100
  139. package/hooks/session-start/index.cjs +71 -71
  140. package/hooks/typecheck/index.cjs +65 -65
  141. package/package.json +63 -63
  142. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
  143. package/references/ui-pro-max-data/charts.csv +26 -26
  144. package/references/ui-pro-max-data/colors.csv +161 -161
  145. package/references/ui-pro-max-data/styles.csv +68 -68
  146. package/references/ui-pro-max-data/typography.csv +74 -74
  147. package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
  148. package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
  149. package/skills/adversary/SKILL.md +283 -283
  150. package/skills/asset-creator/SKILL.md +157 -157
  151. package/skills/audit/SKILL.md +147 -2
  152. package/skills/autopsy/SKILL.md +335 -335
  153. package/skills/brainstorm/SKILL.md +342 -342
  154. package/skills/browser-pilot/SKILL.md +168 -168
  155. package/skills/constraint-check/SKILL.md +165 -165
  156. package/skills/context-engine/SKILL.md +404 -404
  157. package/skills/cook/SKILL.md +917 -863
  158. package/skills/db/SKILL.md +273 -273
  159. package/skills/debug/SKILL.md +465 -465
  160. package/skills/dependency-doctor/SKILL.md +265 -235
  161. package/skills/deploy/SKILL.md +274 -231
  162. package/skills/design/DESIGN-REFERENCE.md +365 -365
  163. package/skills/design/SKILL.md +589 -589
  164. package/skills/doc-processor/SKILL.md +254 -254
  165. package/skills/docs/SKILL.md +374 -374
  166. package/skills/docs-seeker/SKILL.md +177 -177
  167. package/skills/fix/SKILL.md +330 -330
  168. package/skills/git/SKILL.md +339 -339
  169. package/skills/hallucination-guard/SKILL.md +219 -219
  170. package/skills/incident/SKILL.md +254 -253
  171. package/skills/integrity-check/SKILL.md +169 -169
  172. package/skills/journal/SKILL.md +240 -240
  173. package/skills/launch/SKILL.md +344 -344
  174. package/skills/logic-guardian/SKILL.md +251 -251
  175. package/skills/marketing/SKILL.md +290 -289
  176. package/skills/mcp-builder/SKILL.md +425 -425
  177. package/skills/neural-memory/SKILL.md +362 -362
  178. package/skills/onboard/SKILL.md +404 -403
  179. package/skills/perf/SKILL.md +346 -346
  180. package/skills/plan/SKILL.md +433 -428
  181. package/skills/preflight/SKILL.md +415 -415
  182. package/skills/problem-solver/SKILL.md +380 -284
  183. package/skills/rescue/SKILL.md +474 -474
  184. package/skills/retro/SKILL.md +3 -1
  185. package/skills/review/SKILL.md +612 -588
  186. package/skills/review-intake/SKILL.md +249 -249
  187. package/skills/safeguard/SKILL.md +200 -200
  188. package/skills/sast/SKILL.md +190 -190
  189. package/skills/scaffold/SKILL.md +328 -287
  190. package/skills/scope-guard/SKILL.md +180 -180
  191. package/skills/scout/SKILL.md +263 -263
  192. package/skills/sentinel/SKILL.md +382 -381
  193. package/skills/sentinel-env/SKILL.md +254 -254
  194. package/skills/sequential-thinking/SKILL.md +234 -234
  195. package/skills/session-bridge/SKILL.md +543 -543
  196. package/skills/skill-forge/SKILL.md +581 -581
  197. package/skills/skill-router/SKILL.md +3 -0
  198. package/skills/surgeon/SKILL.md +215 -215
  199. package/skills/team/SKILL.md +556 -537
  200. package/skills/test/SKILL.md +614 -614
  201. package/skills/trend-scout/SKILL.md +145 -145
  202. package/skills/verification/SKILL.md +326 -326
  203. package/skills/video-creator/SKILL.md +201 -201
  204. package/skills/watchdog/SKILL.md +168 -168
  205. package/skills/worktree/SKILL.md +140 -140
@@ -1,127 +1,127 @@
1
- ---
2
- name: "animation-patterns"
3
- pack: "@rune/ui"
4
- description: "Motion design patterns — micro-interactions, page transitions, scroll animations, loading states. Applies CSS transitions, Framer Motion, or GSAP based on project stack. Always respects prefers-reduced-motion."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # animation-patterns
10
-
11
- Motion design patterns — micro-interactions, page transitions, scroll animations, loading states. Applies CSS transitions, Framer Motion, or GSAP based on project stack. Always respects `prefers-reduced-motion`.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect interaction points**
16
- Use Grep to find hover handlers (`onMouseEnter`, `:hover`), route changes (Next.js `useRouter`, SvelteKit `goto`), and loading states (`isLoading`, `isPending`). Read component files to understand where motion can add feedback or polish.
17
-
18
- **Step 2 — Apply micro-interactions**
19
- For each interaction point, select the appropriate pattern: hover → scale + shadow lift; button click → press-down (scale 0.97); data load → skeleton pulse then fade-in; route change → slide or fade transition. Emit the updated component with motion classes or Framer Motion variants.
20
-
21
- **Step 3 — Audit reduced-motion compliance**
22
- Use Grep to find every animation/transition declaration. Verify each is wrapped in a `prefers-reduced-motion: no-preference` media query or uses Framer Motion's `useReducedMotion()` hook. Flag any that are not.
23
-
24
- **Step 4 — Page transition patterns**
25
- Apply View Transitions API for same-document navigations (SvelteKit, Astro, vanilla JS). For React/Next.js, use Framer Motion `AnimatePresence` + `layoutId` for shared layout animations. Emit transition wrapper component with both strategies.
26
-
27
- **Step 5 — Mood-to-Animation Timing**
28
-
29
- If `.rune/design-system.md` contains a `## Mood` section, read the selected mood and apply the matching motion profile. This ensures animation feel aligns with the product's emotional intent — not just technical correctness.
30
-
31
- | Mood | Duration | Easing | Hover | Enter/Exit | Scroll | Signature |
32
- |------|----------|--------|-------|------------|--------|-----------|
33
- | **Impressed** | 0.8-1.2s | `ease-out` | Scale 1.03 + deep shadow | Fade-up 24px | Parallax layers | Staggered reveals with 100ms delay between items |
34
- | **Excited** | 0.4-0.6s | `spring(1, 80, 10)` | Scale 1.06 + color shift | Slide-in from edge | Snap scroll | Overshoot on entry (1.56 bounce), pulse on data change |
35
- | **Calm** | 0.6-0.8s | `ease-out-quad` | Subtle opacity 0.8→1 | Slow fade 300ms | Gentle float | Breathing rhythm on idle elements (opacity 0.7↔1, 4s loop) |
36
- | **Confident** | 0.3-0.5s | `ease` | Precise underline/border | Clean slide 16px | None or minimal | Sharp, decisive — no overshoot, no bounce |
37
- | **Playful** | 0.4-0.6s | `spring(1, 100, 12)` | Wobble or tilt (rotate ±2°) | Bounce-in from bottom | Elastic snap | Squish on click (scaleX 1.05, scaleY 0.95), emoji-like feedback |
38
- | **Techy** | 0.15-0.3s | `ease-out` | Glow border or underline | Instant or 100ms fade | Sticky headers | Typewriter text, cursor blink, terminal-feel transitions |
39
- | **Professional** | 0.2-0.3s | `ease` | Background tint only | Simple fade | Fixed header | Minimal — motion serves function, never decoration |
40
- | **Inspired** | 0.5-0.8s | `cubic-bezier(0.4, 0, 0.2, 1)` | Reveal hidden detail | Scroll-driven enter | Parallax + reveal | Cinematic — content appears as user discovers, like turning pages |
41
-
42
- **Usage rules:**
43
- 1. Read mood from `.rune/design-system.md` → select matching row → apply as default motion tokens
44
- 2. If no mood defined, fall back to **Professional** (safest, least opinionated)
45
- 3. ALL timing values must be wrapped in `prefers-reduced-motion` check — mood doesn't override accessibility
46
- 4. Mood overrides generic Step 2 micro-interactions where they conflict
47
-
48
- #### Example
49
-
50
- ```tsx
51
- // Tailwind micro-interaction with reduced-motion respect
52
- <button
53
- className="
54
- transform transition-all duration-200 ease-out
55
- hover:scale-105 hover:shadow-md
56
- active:scale-95
57
- motion-reduce:transform-none motion-reduce:transition-none
58
- "
59
- >
60
- Confirm
61
- </button>
62
-
63
- // Framer Motion with reduced-motion hook
64
- const prefersReduced = useReducedMotion()
65
-
66
- <motion.div
67
- initial={{ opacity: 0, y: prefersReduced ? 0 : 16 }}
68
- animate={{ opacity: 1, y: 0 }}
69
- transition={{ duration: prefersReduced ? 0 : 0.25 }}
70
- />
71
- ```
72
-
73
- ```tsx
74
- // Shared layout animation — card expands to modal (Framer Motion)
75
- // Works because both use the same layoutId="card-{id}"
76
- function CardGrid({ items }: { items: Item[] }) {
77
- const [selected, setSelected] = useState<string | null>(null)
78
- return (
79
- <>
80
- {items.map((item) => (
81
- <motion.div
82
- key={item.id}
83
- layoutId={`card-${item.id}`}
84
- onClick={() => setSelected(item.id)}
85
- className="rounded-xl bg-[var(--bg-card)] border border-[var(--border)] cursor-pointer"
86
- >
87
- <motion.h3 layoutId={`title-${item.id}`}>{item.title}</motion.h3>
88
- </motion.div>
89
- ))}
90
-
91
- <AnimatePresence>
92
- {selected && (
93
- <motion.div
94
- layoutId={`card-${selected}`}
95
- className="fixed inset-8 z-50 rounded-2xl bg-[var(--bg-card)] p-8"
96
- >
97
- <motion.h3 layoutId={`title-${selected}`} className="text-h2 font-bold">
98
- {items.find(i => i.id === selected)?.title}
99
- </motion.h3>
100
- <button onClick={() => setSelected(null)} aria-label="Close">
101
- <X aria-hidden="true" />
102
- </button>
103
- </motion.div>
104
- )}
105
- </AnimatePresence>
106
- </>
107
- )
108
- }
109
- ```
110
-
111
- ```css
112
- /* View Transitions API — SvelteKit / Astro page transitions */
113
- /* In app.css or global stylesheet */
114
- @media (prefers-reduced-motion: no-preference) {
115
- ::view-transition-old(root) {
116
- animation: 200ms ease-out both fade-out;
117
- }
118
- ::view-transition-new(root) {
119
- animation: 250ms ease-in both fade-in;
120
- }
121
- }
122
-
123
- @keyframes fade-out { from { opacity: 1; } to { opacity: 0; } }
124
- @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
125
-
126
- /* SvelteKit: enable in svelte.config.js → experimental: { viewTransitions: true } */
127
- ```
1
+ ---
2
+ name: "animation-patterns"
3
+ pack: "@rune/ui"
4
+ description: "Motion design patterns — micro-interactions, page transitions, scroll animations, loading states. Applies CSS transitions, Framer Motion, or GSAP based on project stack. Always respects prefers-reduced-motion."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # animation-patterns
10
+
11
+ Motion design patterns — micro-interactions, page transitions, scroll animations, loading states. Applies CSS transitions, Framer Motion, or GSAP based on project stack. Always respects `prefers-reduced-motion`.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect interaction points**
16
+ Use Grep to find hover handlers (`onMouseEnter`, `:hover`), route changes (Next.js `useRouter`, SvelteKit `goto`), and loading states (`isLoading`, `isPending`). Read component files to understand where motion can add feedback or polish.
17
+
18
+ **Step 2 — Apply micro-interactions**
19
+ For each interaction point, select the appropriate pattern: hover → scale + shadow lift; button click → press-down (scale 0.97); data load → skeleton pulse then fade-in; route change → slide or fade transition. Emit the updated component with motion classes or Framer Motion variants.
20
+
21
+ **Step 3 — Audit reduced-motion compliance**
22
+ Use Grep to find every animation/transition declaration. Verify each is wrapped in a `prefers-reduced-motion: no-preference` media query or uses Framer Motion's `useReducedMotion()` hook. Flag any that are not.
23
+
24
+ **Step 4 — Page transition patterns**
25
+ Apply View Transitions API for same-document navigations (SvelteKit, Astro, vanilla JS). For React/Next.js, use Framer Motion `AnimatePresence` + `layoutId` for shared layout animations. Emit transition wrapper component with both strategies.
26
+
27
+ **Step 5 — Mood-to-Animation Timing**
28
+
29
+ If `.rune/design-system.md` contains a `## Mood` section, read the selected mood and apply the matching motion profile. This ensures animation feel aligns with the product's emotional intent — not just technical correctness.
30
+
31
+ | Mood | Duration | Easing | Hover | Enter/Exit | Scroll | Signature |
32
+ |------|----------|--------|-------|------------|--------|-----------|
33
+ | **Impressed** | 0.8-1.2s | `ease-out` | Scale 1.03 + deep shadow | Fade-up 24px | Parallax layers | Staggered reveals with 100ms delay between items |
34
+ | **Excited** | 0.4-0.6s | `spring(1, 80, 10)` | Scale 1.06 + color shift | Slide-in from edge | Snap scroll | Overshoot on entry (1.56 bounce), pulse on data change |
35
+ | **Calm** | 0.6-0.8s | `ease-out-quad` | Subtle opacity 0.8→1 | Slow fade 300ms | Gentle float | Breathing rhythm on idle elements (opacity 0.7↔1, 4s loop) |
36
+ | **Confident** | 0.3-0.5s | `ease` | Precise underline/border | Clean slide 16px | None or minimal | Sharp, decisive — no overshoot, no bounce |
37
+ | **Playful** | 0.4-0.6s | `spring(1, 100, 12)` | Wobble or tilt (rotate ±2°) | Bounce-in from bottom | Elastic snap | Squish on click (scaleX 1.05, scaleY 0.95), emoji-like feedback |
38
+ | **Techy** | 0.15-0.3s | `ease-out` | Glow border or underline | Instant or 100ms fade | Sticky headers | Typewriter text, cursor blink, terminal-feel transitions |
39
+ | **Professional** | 0.2-0.3s | `ease` | Background tint only | Simple fade | Fixed header | Minimal — motion serves function, never decoration |
40
+ | **Inspired** | 0.5-0.8s | `cubic-bezier(0.4, 0, 0.2, 1)` | Reveal hidden detail | Scroll-driven enter | Parallax + reveal | Cinematic — content appears as user discovers, like turning pages |
41
+
42
+ **Usage rules:**
43
+ 1. Read mood from `.rune/design-system.md` → select matching row → apply as default motion tokens
44
+ 2. If no mood defined, fall back to **Professional** (safest, least opinionated)
45
+ 3. ALL timing values must be wrapped in `prefers-reduced-motion` check — mood doesn't override accessibility
46
+ 4. Mood overrides generic Step 2 micro-interactions where they conflict
47
+
48
+ #### Example
49
+
50
+ ```tsx
51
+ // Tailwind micro-interaction with reduced-motion respect
52
+ <button
53
+ className="
54
+ transform transition-all duration-200 ease-out
55
+ hover:scale-105 hover:shadow-md
56
+ active:scale-95
57
+ motion-reduce:transform-none motion-reduce:transition-none
58
+ "
59
+ >
60
+ Confirm
61
+ </button>
62
+
63
+ // Framer Motion with reduced-motion hook
64
+ const prefersReduced = useReducedMotion()
65
+
66
+ <motion.div
67
+ initial={{ opacity: 0, y: prefersReduced ? 0 : 16 }}
68
+ animate={{ opacity: 1, y: 0 }}
69
+ transition={{ duration: prefersReduced ? 0 : 0.25 }}
70
+ />
71
+ ```
72
+
73
+ ```tsx
74
+ // Shared layout animation — card expands to modal (Framer Motion)
75
+ // Works because both use the same layoutId="card-{id}"
76
+ function CardGrid({ items }: { items: Item[] }) {
77
+ const [selected, setSelected] = useState<string | null>(null)
78
+ return (
79
+ <>
80
+ {items.map((item) => (
81
+ <motion.div
82
+ key={item.id}
83
+ layoutId={`card-${item.id}`}
84
+ onClick={() => setSelected(item.id)}
85
+ className="rounded-xl bg-[var(--bg-card)] border border-[var(--border)] cursor-pointer"
86
+ >
87
+ <motion.h3 layoutId={`title-${item.id}`}>{item.title}</motion.h3>
88
+ </motion.div>
89
+ ))}
90
+
91
+ <AnimatePresence>
92
+ {selected && (
93
+ <motion.div
94
+ layoutId={`card-${selected}`}
95
+ className="fixed inset-8 z-50 rounded-2xl bg-[var(--bg-card)] p-8"
96
+ >
97
+ <motion.h3 layoutId={`title-${selected}`} className="text-h2 font-bold">
98
+ {items.find(i => i.id === selected)?.title}
99
+ </motion.h3>
100
+ <button onClick={() => setSelected(null)} aria-label="Close">
101
+ <X aria-hidden="true" />
102
+ </button>
103
+ </motion.div>
104
+ )}
105
+ </AnimatePresence>
106
+ </>
107
+ )
108
+ }
109
+ ```
110
+
111
+ ```css
112
+ /* View Transitions API — SvelteKit / Astro page transitions */
113
+ /* In app.css or global stylesheet */
114
+ @media (prefers-reduced-motion: no-preference) {
115
+ ::view-transition-old(root) {
116
+ animation: 200ms ease-out both fade-out;
117
+ }
118
+ ::view-transition-new(root) {
119
+ animation: 250ms ease-in both fade-in;
120
+ }
121
+ }
122
+
123
+ @keyframes fade-out { from { opacity: 1; } to { opacity: 0; } }
124
+ @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
125
+
126
+ /* SvelteKit: enable in svelte.config.js → experimental: { viewTransitions: true } */
127
+ ```
@@ -1,100 +1,100 @@
1
- ---
2
- name: "component-patterns"
3
- pack: "@rune/ui"
4
- description: "Component architecture patterns — compound components, render props, composition, slots. Detects prop-heavy components and guides refactoring toward composable, maintainable architectures."
5
- model: sonnet
6
- tools: [Read, Edit, Write, Grep, Glob, Bash]
7
- ---
8
-
9
- # component-patterns
10
-
11
- Component architecture patterns — compound components, render props, composition, slots. Detects prop-heavy components and guides refactoring toward composable, maintainable architectures.
12
-
13
- #### Workflow
14
-
15
- **Step 1 — Detect prop-heavy components**
16
- Use Grep to find component signatures with more than 8 props (`interface \w+Props \{` then count fields, or scan function parameter lists). Read each flagged file to understand the component's responsibilities.
17
-
18
- **Step 2 — Classify and suggest pattern**
19
- For each flagged component, classify by smell: boolean-flag hell → compound component; render logic branching → render props or slots; deeply nested data → context + provider. Output a refactor plan with the specific pattern to apply.
20
-
21
- **Step 3 — Emit refactored scaffold**
22
- Write the refactored component skeleton following the compound component pattern. Do not overwrite the original — emit to a `*.refactored.tsx` file for review.
23
-
24
- **Step 4 — Composition vs inheritance + slot patterns**
25
- After structural refactor, audit for slot opportunities (Svelte `<slot>`, Vue `v-slot`, React `children` with typed slots). Enforce: prefer composition (pass components as props) over inheritance (extend base class). Flag any `extends React.Component` or class-based patterns for migration.
26
-
27
- **Step 5 — Bento Card Archetypes**
28
-
29
- When designing card-based layouts, apply named archetypes instead of uniform grids. Each archetype has a specific interaction model and animation signature. Mix archetypes within a page to create visual hierarchy.
30
-
31
- | Archetype | Content Type | Layout | Interaction | Animation |
32
- |-----------|-------------|--------|-------------|-----------|
33
- | **Intelligent List** | Ranked/sortable items (leaderboard, top assets, recent activity) | Vertical stack, auto-reorders | Drag to reorder, click to expand | `layoutId` shared animation on reorder — items slide to new position (Framer Motion `layout` prop) |
34
- | **Command Input** | Search, AI prompt, quick actions | Single input + dropdown results | Type to filter, keyboard nav, Enter to execute | Typewriter placeholder text + shimmer gradient on focus + results fade-in with 50ms stagger |
35
- | **Live Status** | Real-time metrics (uptime, price, active users) | Compact card, number-dominant | Hover for sparkline/history | Breathing pulse on idle (opacity 0.85↔1, 3s), overshoot scale on value change (spring) |
36
- | **Wide Data Stream** | Horizontal feed (news, transactions, timeline) | Full-width horizontal scroll or infinite carousel | Swipe/drag, auto-advance optional | Infinite scroll with momentum, snap to item, fade edges to signal overflow |
37
- | **Contextual Panel** | Detail view, settings, metadata | Expandable from parent card or sidebar | Click parent → panel slides in | Stagger children (50ms each), float-in from right (translateX 24px → 0) |
38
-
39
- **Anti-patterns for card layouts:**
40
- - ❌ **Uniform grid** — all cards same size, same padding, same content structure = AI signature
41
- - ❌ **Card soup** — cards with no clear grouping or hierarchy
42
- - ❌ **Static bento** — bento layout without interaction model = decorative, not functional
43
-
44
- **Composition rules:**
45
- 1. A page should use 2-4 archetypes max — more = visual noise
46
- 2. **Live Status** cards cluster together (dashboard KPI row)
47
- 3. **Intelligent List** is the primary content area — usually takes 60%+ of viewport
48
- 4. **Command Input** is a singleton — ONE per page, always accessible (often pinned top or Cmd+K)
49
- 5. **Wide Data Stream** breaks vertical rhythm — use as section separator between dense blocks
50
- 6. **Contextual Panel** is secondary — triggered by interaction, never shown by default on load
51
-
52
- #### Example
53
-
54
- ```tsx
55
- // BEFORE: prop-heavy (9 props, hard to extend)
56
- <Modal title="..." open footer actions size variant onClose onConfirm loading />
57
-
58
- // AFTER: compound component pattern
59
- <Modal open onClose={handleClose}>
60
- <Modal.Header>Confirm Action</Modal.Header>
61
- <Modal.Body>Are you sure?</Modal.Body>
62
- <Modal.Footer>
63
- <Button variant="ghost" onClick={handleClose}>Cancel</Button>
64
- <Button variant="primary" loading={isLoading} onClick={handleConfirm}>
65
- Confirm
66
- </Button>
67
- </Modal.Footer>
68
- </Modal>
69
- ```
70
-
71
- ```tsx
72
- // Svelte slot pattern — composition over prop drilling
73
- // Caller decides what goes in header/footer, component owns layout
74
- <Card>
75
- <svelte:fragment slot="header">
76
- <h3 class="text-h3 font-semibold">Usage this month</h3>
77
- </svelte:fragment>
78
-
79
- <MetricChart data={usage} />
80
-
81
- <svelte:fragment slot="footer">
82
- <a href="/billing" class="text-sm text-[var(--primary)]">View invoice</a>
83
- </svelte:fragment>
84
- </Card>
85
- ```
86
-
87
- ```tsx
88
- // React typed children slots via discriminated union
89
- type ModalSlot = { as: 'header' | 'body' | 'footer'; children: React.ReactNode }
90
-
91
- function resolveSlots(children: React.ReactNode) {
92
- const slots: Record<string, React.ReactNode> = {}
93
- React.Children.forEach(children, (child) => {
94
- if (React.isValidElement<ModalSlot>(child) && child.props.as) {
95
- slots[child.props.as] = child.props.children
96
- }
97
- })
98
- return slots
99
- }
100
- ```
1
+ ---
2
+ name: "component-patterns"
3
+ pack: "@rune/ui"
4
+ description: "Component architecture patterns — compound components, render props, composition, slots. Detects prop-heavy components and guides refactoring toward composable, maintainable architectures."
5
+ model: sonnet
6
+ tools: [Read, Edit, Write, Grep, Glob, Bash]
7
+ ---
8
+
9
+ # component-patterns
10
+
11
+ Component architecture patterns — compound components, render props, composition, slots. Detects prop-heavy components and guides refactoring toward composable, maintainable architectures.
12
+
13
+ #### Workflow
14
+
15
+ **Step 1 — Detect prop-heavy components**
16
+ Use Grep to find component signatures with more than 8 props (`interface \w+Props \{` then count fields, or scan function parameter lists). Read each flagged file to understand the component's responsibilities.
17
+
18
+ **Step 2 — Classify and suggest pattern**
19
+ For each flagged component, classify by smell: boolean-flag hell → compound component; render logic branching → render props or slots; deeply nested data → context + provider. Output a refactor plan with the specific pattern to apply.
20
+
21
+ **Step 3 — Emit refactored scaffold**
22
+ Write the refactored component skeleton following the compound component pattern. Do not overwrite the original — emit to a `*.refactored.tsx` file for review.
23
+
24
+ **Step 4 — Composition vs inheritance + slot patterns**
25
+ After structural refactor, audit for slot opportunities (Svelte `<slot>`, Vue `v-slot`, React `children` with typed slots). Enforce: prefer composition (pass components as props) over inheritance (extend base class). Flag any `extends React.Component` or class-based patterns for migration.
26
+
27
+ **Step 5 — Bento Card Archetypes**
28
+
29
+ When designing card-based layouts, apply named archetypes instead of uniform grids. Each archetype has a specific interaction model and animation signature. Mix archetypes within a page to create visual hierarchy.
30
+
31
+ | Archetype | Content Type | Layout | Interaction | Animation |
32
+ |-----------|-------------|--------|-------------|-----------|
33
+ | **Intelligent List** | Ranked/sortable items (leaderboard, top assets, recent activity) | Vertical stack, auto-reorders | Drag to reorder, click to expand | `layoutId` shared animation on reorder — items slide to new position (Framer Motion `layout` prop) |
34
+ | **Command Input** | Search, AI prompt, quick actions | Single input + dropdown results | Type to filter, keyboard nav, Enter to execute | Typewriter placeholder text + shimmer gradient on focus + results fade-in with 50ms stagger |
35
+ | **Live Status** | Real-time metrics (uptime, price, active users) | Compact card, number-dominant | Hover for sparkline/history | Breathing pulse on idle (opacity 0.85↔1, 3s), overshoot scale on value change (spring) |
36
+ | **Wide Data Stream** | Horizontal feed (news, transactions, timeline) | Full-width horizontal scroll or infinite carousel | Swipe/drag, auto-advance optional | Infinite scroll with momentum, snap to item, fade edges to signal overflow |
37
+ | **Contextual Panel** | Detail view, settings, metadata | Expandable from parent card or sidebar | Click parent → panel slides in | Stagger children (50ms each), float-in from right (translateX 24px → 0) |
38
+
39
+ **Anti-patterns for card layouts:**
40
+ - ❌ **Uniform grid** — all cards same size, same padding, same content structure = AI signature
41
+ - ❌ **Card soup** — cards with no clear grouping or hierarchy
42
+ - ❌ **Static bento** — bento layout without interaction model = decorative, not functional
43
+
44
+ **Composition rules:**
45
+ 1. A page should use 2-4 archetypes max — more = visual noise
46
+ 2. **Live Status** cards cluster together (dashboard KPI row)
47
+ 3. **Intelligent List** is the primary content area — usually takes 60%+ of viewport
48
+ 4. **Command Input** is a singleton — ONE per page, always accessible (often pinned top or Cmd+K)
49
+ 5. **Wide Data Stream** breaks vertical rhythm — use as section separator between dense blocks
50
+ 6. **Contextual Panel** is secondary — triggered by interaction, never shown by default on load
51
+
52
+ #### Example
53
+
54
+ ```tsx
55
+ // BEFORE: prop-heavy (9 props, hard to extend)
56
+ <Modal title="..." open footer actions size variant onClose onConfirm loading />
57
+
58
+ // AFTER: compound component pattern
59
+ <Modal open onClose={handleClose}>
60
+ <Modal.Header>Confirm Action</Modal.Header>
61
+ <Modal.Body>Are you sure?</Modal.Body>
62
+ <Modal.Footer>
63
+ <Button variant="ghost" onClick={handleClose}>Cancel</Button>
64
+ <Button variant="primary" loading={isLoading} onClick={handleConfirm}>
65
+ Confirm
66
+ </Button>
67
+ </Modal.Footer>
68
+ </Modal>
69
+ ```
70
+
71
+ ```tsx
72
+ // Svelte slot pattern — composition over prop drilling
73
+ // Caller decides what goes in header/footer, component owns layout
74
+ <Card>
75
+ <svelte:fragment slot="header">
76
+ <h3 class="text-h3 font-semibold">Usage this month</h3>
77
+ </svelte:fragment>
78
+
79
+ <MetricChart data={usage} />
80
+
81
+ <svelte:fragment slot="footer">
82
+ <a href="/billing" class="text-sm text-[var(--primary)]">View invoice</a>
83
+ </svelte:fragment>
84
+ </Card>
85
+ ```
86
+
87
+ ```tsx
88
+ // React typed children slots via discriminated union
89
+ type ModalSlot = { as: 'header' | 'body' | 'footer'; children: React.ReactNode }
90
+
91
+ function resolveSlots(children: React.ReactNode) {
92
+ const slots: Record<string, React.ReactNode> = {}
93
+ React.Children.forEach(children, (child) => {
94
+ if (React.isValidElement<ModalSlot>(child) && child.props.as) {
95
+ slots[child.props.as] = child.props.children
96
+ }
97
+ })
98
+ return slots
99
+ }
100
+ ```