@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.
- package/LICENSE +21 -21
- package/README.md +8 -6
- package/commands/rune.md +168 -168
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/brainstorm/SKILL.md +342 -342
- package/skills/browser-pilot/SKILL.md +168 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +404 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +589 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +177 -177
- package/skills/fix/SKILL.md +330 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +219 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +240 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +251 -251
- package/skills/marketing/SKILL.md +290 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +362 -362
- package/skills/onboard/SKILL.md +404 -403
- package/skills/perf/SKILL.md +346 -346
- package/skills/plan/SKILL.md +433 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +612 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +180 -180
- package/skills/scout/SKILL.md +263 -263
- package/skills/sentinel/SKILL.md +382 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +543 -543
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +556 -537
- package/skills/test/SKILL.md +614 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +326 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- 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
|
+
```
|