@rune-kit/rune 2.10.0 → 2.12.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 (240) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +65 -6
  3. package/commands/rune.md +168 -168
  4. package/compiler/__tests__/detect-invariants.test.js +136 -0
  5. package/compiler/__tests__/doctor-mesh.test.js +229 -0
  6. package/compiler/__tests__/hook-dispatch.test.js +91 -0
  7. package/compiler/__tests__/hooks-antigravity.test.js +118 -0
  8. package/compiler/__tests__/hooks-cursor.test.js +139 -0
  9. package/compiler/__tests__/hooks-install.test.js +305 -0
  10. package/compiler/__tests__/hooks-merge.test.js +204 -0
  11. package/compiler/__tests__/hooks-tiers.test.js +519 -0
  12. package/compiler/__tests__/hooks-windsurf.test.js +115 -0
  13. package/compiler/__tests__/inject-claude-md.test.js +152 -0
  14. package/compiler/__tests__/load-invariants.test.js +408 -0
  15. package/compiler/__tests__/onboard-invariants.test.js +240 -0
  16. package/compiler/adapters/hooks/antigravity.js +140 -0
  17. package/compiler/adapters/hooks/claude.js +166 -0
  18. package/compiler/adapters/hooks/cursor.js +191 -0
  19. package/compiler/adapters/hooks/index.js +82 -0
  20. package/compiler/adapters/hooks/tier-emitter.js +182 -0
  21. package/compiler/adapters/hooks/windsurf.js +202 -0
  22. package/compiler/bin/rune.js +196 -6
  23. package/compiler/commands/hook-dispatch.js +87 -0
  24. package/compiler/commands/hooks/install.js +120 -0
  25. package/compiler/commands/hooks/merge.js +211 -0
  26. package/compiler/commands/hooks/presets.js +116 -0
  27. package/compiler/commands/hooks/status.js +112 -0
  28. package/compiler/commands/hooks/tiers.js +221 -0
  29. package/compiler/commands/hooks/uninstall.js +94 -0
  30. package/compiler/doctor.js +236 -0
  31. package/contexts/dev.md +34 -34
  32. package/contexts/research.md +43 -43
  33. package/contexts/review.md +55 -55
  34. package/extensions/ai-ml/PACK.md +88 -88
  35. package/extensions/ai-ml/skills/ai-agents.md +172 -172
  36. package/extensions/ai-ml/skills/code-sandbox.md +187 -187
  37. package/extensions/ai-ml/skills/deep-research.md +146 -146
  38. package/extensions/ai-ml/skills/embedding-search.md +66 -66
  39. package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
  40. package/extensions/ai-ml/skills/llm-architect.md +125 -125
  41. package/extensions/ai-ml/skills/llm-integration.md +64 -64
  42. package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
  43. package/extensions/ai-ml/skills/rag-patterns.md +66 -66
  44. package/extensions/ai-ml/skills/web-extraction.md +114 -114
  45. package/extensions/analytics/PACK.md +92 -92
  46. package/extensions/analytics/skills/ab-testing.md +72 -72
  47. package/extensions/analytics/skills/dashboard-patterns.md +83 -83
  48. package/extensions/analytics/skills/data-validation.md +68 -68
  49. package/extensions/analytics/skills/funnel-analysis.md +81 -81
  50. package/extensions/analytics/skills/sql-patterns.md +57 -57
  51. package/extensions/analytics/skills/statistical-analysis.md +79 -79
  52. package/extensions/analytics/skills/tracking-setup.md +71 -71
  53. package/extensions/backend/PACK.md +104 -104
  54. package/extensions/backend/skills/api-patterns.md +84 -84
  55. package/extensions/backend/skills/async-pipeline.md +193 -193
  56. package/extensions/backend/skills/auth-patterns.md +97 -97
  57. package/extensions/backend/skills/background-jobs.md +133 -133
  58. package/extensions/backend/skills/caching-patterns.md +108 -108
  59. package/extensions/backend/skills/cli-generation.md +133 -133
  60. package/extensions/backend/skills/database-patterns.md +87 -87
  61. package/extensions/backend/skills/middleware-patterns.md +104 -104
  62. package/extensions/chrome-ext/PACK.md +93 -93
  63. package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
  64. package/extensions/chrome-ext/skills/cws-publish.md +104 -104
  65. package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
  66. package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
  67. package/extensions/chrome-ext/skills/ext-storage.md +133 -133
  68. package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
  69. package/extensions/content/PACK.md +96 -96
  70. package/extensions/content/skills/blog-patterns.md +88 -88
  71. package/extensions/content/skills/cms-integration.md +131 -131
  72. package/extensions/content/skills/content-scoring.md +107 -107
  73. package/extensions/content/skills/i18n.md +83 -83
  74. package/extensions/content/skills/mdx-authoring.md +137 -137
  75. package/extensions/content/skills/reference.md +1014 -1014
  76. package/extensions/content/skills/seo-patterns.md +67 -67
  77. package/extensions/content/skills/video-repurpose.md +153 -153
  78. package/extensions/devops/PACK.md +101 -101
  79. package/extensions/devops/skills/chaos-testing.md +67 -67
  80. package/extensions/devops/skills/ci-cd.md +75 -75
  81. package/extensions/devops/skills/docker.md +58 -58
  82. package/extensions/devops/skills/edge-serverless.md +163 -163
  83. package/extensions/devops/skills/infra-as-code.md +158 -158
  84. package/extensions/devops/skills/kubernetes.md +110 -110
  85. package/extensions/devops/skills/monitoring.md +57 -57
  86. package/extensions/devops/skills/server-setup.md +64 -64
  87. package/extensions/devops/skills/ssl-domain.md +42 -42
  88. package/extensions/ecommerce/PACK.md +116 -116
  89. package/extensions/ecommerce/skills/cart-system.md +79 -79
  90. package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
  91. package/extensions/ecommerce/skills/order-management.md +126 -126
  92. package/extensions/ecommerce/skills/payment-integration.md +472 -472
  93. package/extensions/ecommerce/skills/shopify-dev.md +69 -69
  94. package/extensions/ecommerce/skills/subscription-billing.md +93 -93
  95. package/extensions/ecommerce/skills/tax-compliance.md +117 -117
  96. package/extensions/gamedev/PACK.md +142 -142
  97. package/extensions/gamedev/skills/asset-pipeline.md +74 -74
  98. package/extensions/gamedev/skills/audio-system.md +129 -129
  99. package/extensions/gamedev/skills/camera-system.md +87 -87
  100. package/extensions/gamedev/skills/ecs.md +98 -98
  101. package/extensions/gamedev/skills/game-loops.md +72 -72
  102. package/extensions/gamedev/skills/input-system.md +199 -199
  103. package/extensions/gamedev/skills/multiplayer.md +180 -180
  104. package/extensions/gamedev/skills/particles.md +105 -105
  105. package/extensions/gamedev/skills/physics-engine.md +89 -89
  106. package/extensions/gamedev/skills/scene-management.md +146 -146
  107. package/extensions/gamedev/skills/threejs-patterns.md +90 -90
  108. package/extensions/gamedev/skills/webgl.md +71 -71
  109. package/extensions/mobile/PACK.md +106 -106
  110. package/extensions/mobile/skills/app-store-connect.md +152 -152
  111. package/extensions/mobile/skills/app-store-prep.md +66 -66
  112. package/extensions/mobile/skills/deep-linking.md +109 -109
  113. package/extensions/mobile/skills/flutter.md +60 -60
  114. package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
  115. package/extensions/mobile/skills/native-bridge.md +66 -66
  116. package/extensions/mobile/skills/ota-updates.md +97 -97
  117. package/extensions/mobile/skills/push-notifications.md +111 -111
  118. package/extensions/mobile/skills/react-native.md +82 -82
  119. package/extensions/saas/PACK.md +116 -116
  120. package/extensions/saas/skills/billing-integration.md +200 -200
  121. package/extensions/saas/skills/feature-flags.md +130 -130
  122. package/extensions/saas/skills/multi-tenant.md +103 -103
  123. package/extensions/saas/skills/onboarding-flow.md +139 -139
  124. package/extensions/saas/skills/subscription-flow.md +95 -95
  125. package/extensions/saas/skills/team-management.md +144 -144
  126. package/extensions/security/PACK.md +99 -99
  127. package/extensions/security/skills/api-security.md +140 -140
  128. package/extensions/security/skills/compliance.md +68 -68
  129. package/extensions/security/skills/owasp-audit.md +64 -64
  130. package/extensions/security/skills/pentest-patterns.md +77 -77
  131. package/extensions/security/skills/secret-mgmt.md +65 -65
  132. package/extensions/security/skills/supply-chain.md +65 -65
  133. package/extensions/trading/PACK.md +80 -80
  134. package/extensions/trading/skills/chart-components.md +55 -55
  135. package/extensions/trading/skills/experiment-loop.md +125 -125
  136. package/extensions/trading/skills/fintech-patterns.md +47 -47
  137. package/extensions/trading/skills/indicator-library.md +58 -58
  138. package/extensions/trading/skills/quant-analysis.md +111 -111
  139. package/extensions/trading/skills/realtime-data.md +58 -58
  140. package/extensions/trading/skills/trade-logic.md +104 -104
  141. package/extensions/ui/PACK.md +130 -130
  142. package/extensions/ui/skills/a11y-audit.md +91 -91
  143. package/extensions/ui/skills/animation-patterns.md +127 -127
  144. package/extensions/ui/skills/component-patterns.md +100 -100
  145. package/extensions/ui/skills/design-decision.md +108 -108
  146. package/extensions/ui/skills/design-system.md +68 -68
  147. package/extensions/ui/skills/landing-patterns.md +155 -155
  148. package/extensions/ui/skills/palette-picker.md +173 -173
  149. package/extensions/ui/skills/react-health.md +90 -90
  150. package/extensions/ui/skills/type-system.md +125 -125
  151. package/extensions/ui/skills/web-vitals.md +153 -153
  152. package/extensions/zalo/PACK.md +145 -145
  153. package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
  154. package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
  155. package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
  156. package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
  157. package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
  158. package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
  159. package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
  160. package/hooks/auto-format/index.cjs +48 -48
  161. package/hooks/hooks.json +111 -111
  162. package/hooks/post-session-reflect/index.cjs +189 -189
  163. package/hooks/pre-compact/index.cjs +95 -95
  164. package/hooks/run-hook.cmd +1 -1
  165. package/hooks/secrets-scan/index.cjs +100 -100
  166. package/hooks/session-start/index.cjs +71 -71
  167. package/hooks/typecheck/index.cjs +65 -65
  168. package/package.json +63 -63
  169. package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
  170. package/references/ui-pro-max-data/charts.csv +26 -26
  171. package/references/ui-pro-max-data/colors.csv +161 -161
  172. package/references/ui-pro-max-data/styles.csv +68 -68
  173. package/references/ui-pro-max-data/typography.csv +74 -74
  174. package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
  175. package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
  176. package/skills/adversary/SKILL.md +283 -283
  177. package/skills/asset-creator/SKILL.md +157 -157
  178. package/skills/audit/SKILL.md +147 -2
  179. package/skills/autopsy/SKILL.md +335 -335
  180. package/skills/ba/SKILL.md +85 -1
  181. package/skills/brainstorm/SKILL.md +380 -342
  182. package/skills/browser-pilot/SKILL.md +169 -168
  183. package/skills/constraint-check/SKILL.md +165 -165
  184. package/skills/context-engine/SKILL.md +408 -404
  185. package/skills/cook/SKILL.md +917 -863
  186. package/skills/db/SKILL.md +273 -273
  187. package/skills/debug/SKILL.md +465 -465
  188. package/skills/dependency-doctor/SKILL.md +265 -235
  189. package/skills/deploy/SKILL.md +274 -231
  190. package/skills/design/DESIGN-REFERENCE.md +365 -365
  191. package/skills/design/SKILL.md +590 -589
  192. package/skills/doc-processor/SKILL.md +254 -254
  193. package/skills/docs/SKILL.md +374 -374
  194. package/skills/docs-seeker/SKILL.md +178 -177
  195. package/skills/fix/SKILL.md +332 -330
  196. package/skills/git/SKILL.md +339 -339
  197. package/skills/hallucination-guard/SKILL.md +220 -219
  198. package/skills/incident/SKILL.md +254 -253
  199. package/skills/integrity-check/SKILL.md +169 -169
  200. package/skills/journal/SKILL.md +241 -240
  201. package/skills/launch/SKILL.md +344 -344
  202. package/skills/logic-guardian/SKILL.md +269 -251
  203. package/skills/marketing/SKILL.md +351 -289
  204. package/skills/mcp-builder/SKILL.md +425 -425
  205. package/skills/neural-memory/SKILL.md +359 -362
  206. package/skills/onboard/SKILL.md +432 -403
  207. package/skills/onboard/references/invariants-template.md +76 -0
  208. package/skills/onboard/scripts/detect-invariants.js +439 -0
  209. package/skills/onboard/scripts/inject-claude-md.js +150 -0
  210. package/skills/onboard/scripts/onboard-invariants.js +194 -0
  211. package/skills/perf/SKILL.md +347 -346
  212. package/skills/plan/SKILL.md +435 -428
  213. package/skills/preflight/SKILL.md +415 -415
  214. package/skills/problem-solver/SKILL.md +380 -284
  215. package/skills/rescue/SKILL.md +474 -474
  216. package/skills/research/SKILL.md +4 -0
  217. package/skills/retro/SKILL.md +3 -1
  218. package/skills/review/SKILL.md +614 -588
  219. package/skills/review-intake/SKILL.md +249 -249
  220. package/skills/safeguard/SKILL.md +200 -200
  221. package/skills/sast/SKILL.md +190 -190
  222. package/skills/scaffold/SKILL.md +328 -287
  223. package/skills/scope-guard/SKILL.md +183 -180
  224. package/skills/scout/SKILL.md +269 -263
  225. package/skills/sentinel/SKILL.md +384 -381
  226. package/skills/sentinel-env/SKILL.md +254 -254
  227. package/skills/sequential-thinking/SKILL.md +234 -234
  228. package/skills/session-bridge/SKILL.md +595 -543
  229. package/skills/session-bridge/scripts/load-invariants.js +397 -0
  230. package/skills/skill-forge/SKILL.md +581 -581
  231. package/skills/skill-router/SKILL.md +3 -0
  232. package/skills/slides/SKILL.md +19 -0
  233. package/skills/surgeon/SKILL.md +215 -215
  234. package/skills/team/SKILL.md +557 -537
  235. package/skills/test/SKILL.md +620 -614
  236. package/skills/trend-scout/SKILL.md +145 -145
  237. package/skills/verification/SKILL.md +334 -326
  238. package/skills/video-creator/SKILL.md +201 -201
  239. package/skills/watchdog/SKILL.md +168 -168
  240. 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
+ ```