dsh-ecc-skills 0.4.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 (278) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +99 -0
  3. package/cordis.patch.yml +5 -0
  4. package/lib/index.js +195 -0
  5. package/package.json +46 -0
  6. package/skills/accessibility/SKILL.md +147 -0
  7. package/skills/agent-architecture-audit/SKILL.md +257 -0
  8. package/skills/agent-eval/SKILL.md +147 -0
  9. package/skills/agent-harness-construction/SKILL.md +74 -0
  10. package/skills/agent-introspection-debugging/SKILL.md +154 -0
  11. package/skills/agent-payment-x402/SKILL.md +225 -0
  12. package/skills/agent-self-evaluation/SKILL.md +182 -0
  13. package/skills/agent-sort/SKILL.md +216 -0
  14. package/skills/agentic-engineering/SKILL.md +64 -0
  15. package/skills/agentic-os/SKILL.md +388 -0
  16. package/skills/ai-first-engineering/SKILL.md +52 -0
  17. package/skills/ai-regression-testing/SKILL.md +386 -0
  18. package/skills/android-clean-architecture/SKILL.md +340 -0
  19. package/skills/angular-developer/SKILL.md +155 -0
  20. package/skills/api-connector-builder/SKILL.md +121 -0
  21. package/skills/api-design/SKILL.md +524 -0
  22. package/skills/architecture-decision-records/SKILL.md +180 -0
  23. package/skills/article-writing/SKILL.md +80 -0
  24. package/skills/automation-audit-ops/SKILL.md +143 -0
  25. package/skills/autonomous-agent-harness/SKILL.md +274 -0
  26. package/skills/autonomous-loops/SKILL.md +611 -0
  27. package/skills/backend-patterns/SKILL.md +562 -0
  28. package/skills/benchmark/SKILL.md +95 -0
  29. package/skills/benchmark-methodology/SKILL.md +191 -0
  30. package/skills/benchmark-optimization-loop/SKILL.md +71 -0
  31. package/skills/blender-motion-state-inspection/SKILL.md +165 -0
  32. package/skills/blueprint/SKILL.md +106 -0
  33. package/skills/brand-discovery/SKILL.md +145 -0
  34. package/skills/brand-voice/SKILL.md +98 -0
  35. package/skills/browser-qa/SKILL.md +105 -0
  36. package/skills/bun-runtime/SKILL.md +85 -0
  37. package/skills/canary-watch/SKILL.md +108 -0
  38. package/skills/carrier-relationship-management/SKILL.md +212 -0
  39. package/skills/cisco-ios-patterns/SKILL.md +164 -0
  40. package/skills/ck/SKILL.md +148 -0
  41. package/skills/claude-devfleet/SKILL.md +112 -0
  42. package/skills/click-path-audit/SKILL.md +245 -0
  43. package/skills/clickhouse-io/SKILL.md +445 -0
  44. package/skills/code-tour/SKILL.md +254 -0
  45. package/skills/codebase-onboarding/SKILL.md +234 -0
  46. package/skills/codehealth-mcp/SKILL.md +167 -0
  47. package/skills/coding-standards/SKILL.md +551 -0
  48. package/skills/competitive-platform-analysis/SKILL.md +214 -0
  49. package/skills/competitive-report-structure/SKILL.md +162 -0
  50. package/skills/compose-multiplatform-patterns/SKILL.md +300 -0
  51. package/skills/config-gc/SKILL.md +120 -0
  52. package/skills/configure-ecc/SKILL.md +206 -0
  53. package/skills/connections-optimizer/SKILL.md +190 -0
  54. package/skills/content-engine/SKILL.md +132 -0
  55. package/skills/content-hash-cache-pattern/SKILL.md +162 -0
  56. package/skills/context-budget/SKILL.md +136 -0
  57. package/skills/continuous-agent-loop/SKILL.md +46 -0
  58. package/skills/contract-first/SKILL.md +287 -0
  59. package/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
  60. package/skills/cost-tracking/SKILL.md +97 -0
  61. package/skills/council/SKILL.md +204 -0
  62. package/skills/council-multi-model/SKILL.md +167 -0
  63. package/skills/cpp-coding-standards/SKILL.md +724 -0
  64. package/skills/cpp-testing/SKILL.md +325 -0
  65. package/skills/crosspost/SKILL.md +112 -0
  66. package/skills/csharp-testing/SKILL.md +322 -0
  67. package/skills/customer-billing-ops/SKILL.md +141 -0
  68. package/skills/customs-trade-compliance/SKILL.md +263 -0
  69. package/skills/dart-flutter-patterns/SKILL.md +564 -0
  70. package/skills/dashboard-builder/SKILL.md +109 -0
  71. package/skills/data-scraper-agent/SKILL.md +765 -0
  72. package/skills/data-throughput-accelerator/SKILL.md +74 -0
  73. package/skills/database-migrations/SKILL.md +430 -0
  74. package/skills/deep-research/SKILL.md +160 -0
  75. package/skills/defi-amm-security/SKILL.md +167 -0
  76. package/skills/delivery-gate/SKILL.md +126 -0
  77. package/skills/deployment-patterns/SKILL.md +428 -0
  78. package/skills/design-system/SKILL.md +83 -0
  79. package/skills/dev-team/SKILL.md +203 -0
  80. package/skills/django-celery/SKILL.md +458 -0
  81. package/skills/django-patterns/SKILL.md +735 -0
  82. package/skills/django-security/SKILL.md +644 -0
  83. package/skills/django-tdd/SKILL.md +730 -0
  84. package/skills/django-verification/SKILL.md +470 -0
  85. package/skills/dmux-workflows/SKILL.md +192 -0
  86. package/skills/docker-patterns/SKILL.md +520 -0
  87. package/skills/documentation-lookup/SKILL.md +91 -0
  88. package/skills/dotnet-patterns/SKILL.md +322 -0
  89. package/skills/dynamic-workflow-mode/SKILL.md +124 -0
  90. package/skills/e2e-testing/SKILL.md +327 -0
  91. package/skills/ecc-tools-cost-audit/SKILL.md +161 -0
  92. package/skills/email-ops/SKILL.md +122 -0
  93. package/skills/energy-procurement/SKILL.md +228 -0
  94. package/skills/enterprise-agent-ops/SKILL.md +51 -0
  95. package/skills/error-handling/SKILL.md +377 -0
  96. package/skills/eval-harness/SKILL.md +271 -0
  97. package/skills/evm-token-decimals/SKILL.md +131 -0
  98. package/skills/exa-search/SKILL.md +108 -0
  99. package/skills/fal-ai-media/SKILL.md +289 -0
  100. package/skills/fastapi-patterns/SKILL.md +514 -0
  101. package/skills/finance-billing-ops/SKILL.md +128 -0
  102. package/skills/flox-environments/SKILL.md +497 -0
  103. package/skills/flutter-dart-code-review/SKILL.md +436 -0
  104. package/skills/foundation-models-on-device/SKILL.md +243 -0
  105. package/skills/frontend-a11y/SKILL.md +446 -0
  106. package/skills/frontend-design-direction/SKILL.md +93 -0
  107. package/skills/frontend-patterns/SKILL.md +657 -0
  108. package/skills/fsharp-testing/SKILL.md +281 -0
  109. package/skills/gan-style-harness/SKILL.md +279 -0
  110. package/skills/generating-python-installer/SKILL.md +820 -0
  111. package/skills/git-workflow/SKILL.md +716 -0
  112. package/skills/github-ops/SKILL.md +145 -0
  113. package/skills/golang-patterns/SKILL.md +676 -0
  114. package/skills/golang-testing/SKILL.md +721 -0
  115. package/skills/google-workspace-ops/SKILL.md +96 -0
  116. package/skills/growth-log/SKILL.md +128 -0
  117. package/skills/healthcare-cdss-patterns/SKILL.md +246 -0
  118. package/skills/healthcare-emr-patterns/SKILL.md +160 -0
  119. package/skills/healthcare-eval-harness/SKILL.md +208 -0
  120. package/skills/healthcare-phi-compliance/SKILL.md +146 -0
  121. package/skills/hermes-imports/SKILL.md +89 -0
  122. package/skills/hexagonal-architecture/SKILL.md +277 -0
  123. package/skills/hipaa-compliance/SKILL.md +79 -0
  124. package/skills/homelab-network-readiness/SKILL.md +170 -0
  125. package/skills/homelab-network-setup/SKILL.md +130 -0
  126. package/skills/homelab-pihole-dns/SKILL.md +275 -0
  127. package/skills/homelab-vlan-segmentation/SKILL.md +312 -0
  128. package/skills/homelab-wireguard-vpn/SKILL.md +306 -0
  129. package/skills/hookify-rules/SKILL.md +128 -0
  130. package/skills/inherit-legacy-style/SKILL.md +157 -0
  131. package/skills/intent-driven-development/SKILL.md +360 -0
  132. package/skills/inventory-demand-planning/SKILL.md +247 -0
  133. package/skills/investor-materials/SKILL.md +97 -0
  134. package/skills/investor-outreach/SKILL.md +92 -0
  135. package/skills/ios-icon-gen/SKILL.md +158 -0
  136. package/skills/iterative-retrieval/SKILL.md +212 -0
  137. package/skills/ito-baskets/SKILL.md +263 -0
  138. package/skills/ito-compute/SKILL.md +151 -0
  139. package/skills/ito-inference/SKILL.md +119 -0
  140. package/skills/ito-training/SKILL.md +123 -0
  141. package/skills/java-coding-standards/SKILL.md +384 -0
  142. package/skills/jira-integration/SKILL.md +303 -0
  143. package/skills/jpa-patterns/SKILL.md +152 -0
  144. package/skills/knowledge-ops/SKILL.md +155 -0
  145. package/skills/kotlin-coroutines-flows/SKILL.md +285 -0
  146. package/skills/kotlin-exposed-patterns/SKILL.md +720 -0
  147. package/skills/kotlin-ktor-patterns/SKILL.md +690 -0
  148. package/skills/kotlin-patterns/SKILL.md +712 -0
  149. package/skills/kotlin-testing/SKILL.md +825 -0
  150. package/skills/kubernetes-patterns/SKILL.md +756 -0
  151. package/skills/laravel-patterns/SKILL.md +416 -0
  152. package/skills/laravel-plugin-discovery/SKILL.md +230 -0
  153. package/skills/laravel-security/SKILL.md +948 -0
  154. package/skills/laravel-tdd/SKILL.md +675 -0
  155. package/skills/laravel-verification/SKILL.md +180 -0
  156. package/skills/latency-critical-systems/SKILL.md +75 -0
  157. package/skills/lead-intelligence/SKILL.md +322 -0
  158. package/skills/liquid-glass-design/SKILL.md +279 -0
  159. package/skills/living-docs-governance/SKILL.md +137 -0
  160. package/skills/llm-trading-agent-security/SKILL.md +147 -0
  161. package/skills/logistics-exception-management/SKILL.md +222 -0
  162. package/skills/loop-design-check/SKILL.md +143 -0
  163. package/skills/mailtrap-email-integration/SKILL.md +77 -0
  164. package/skills/make-interfaces-feel-better/SKILL.md +152 -0
  165. package/skills/manim-video/SKILL.md +90 -0
  166. package/skills/market-research/SKILL.md +76 -0
  167. package/skills/marketing-campaign/SKILL.md +114 -0
  168. package/skills/mcp-server-patterns/SKILL.md +70 -0
  169. package/skills/messages-ops/SKILL.md +105 -0
  170. package/skills/ml-adoption-playbook/SKILL.md +57 -0
  171. package/skills/mle-workflow/SKILL.md +348 -0
  172. package/skills/motion-advanced/SKILL.md +597 -0
  173. package/skills/motion-foundations/SKILL.md +300 -0
  174. package/skills/motion-patterns/SKILL.md +435 -0
  175. package/skills/motion-ui/SKILL.md +576 -0
  176. package/skills/mysql-patterns/SKILL.md +413 -0
  177. package/skills/nanoclaw-repl/SKILL.md +34 -0
  178. package/skills/nasiko-control-plane/SKILL.md +49 -0
  179. package/skills/nestjs-patterns/SKILL.md +231 -0
  180. package/skills/netmiko-ssh-automation/SKILL.md +174 -0
  181. package/skills/network-bgp-diagnostics/SKILL.md +168 -0
  182. package/skills/network-config-validation/SKILL.md +211 -0
  183. package/skills/network-interface-health/SKILL.md +153 -0
  184. package/skills/nextjs-turbopack/SKILL.md +58 -0
  185. package/skills/nodejs-keccak256/SKILL.md +103 -0
  186. package/skills/nutrient-document-processing/SKILL.md +168 -0
  187. package/skills/nuxt4-patterns/SKILL.md +101 -0
  188. package/skills/opensource-pipeline/SKILL.md +256 -0
  189. package/skills/orch-add-feature/SKILL.md +45 -0
  190. package/skills/orch-build-mvp/SKILL.md +49 -0
  191. package/skills/orch-change-feature/SKILL.md +43 -0
  192. package/skills/orch-fix-defect/SKILL.md +43 -0
  193. package/skills/orch-pipeline/SKILL.md +121 -0
  194. package/skills/orch-refine-code/SKILL.md +44 -0
  195. package/skills/parallel-execution-optimizer/SKILL.md +74 -0
  196. package/skills/perl-patterns/SKILL.md +505 -0
  197. package/skills/perl-security/SKILL.md +504 -0
  198. package/skills/perl-testing/SKILL.md +476 -0
  199. package/skills/plan-canvas/SKILL.md +196 -0
  200. package/skills/plankton-code-quality/SKILL.md +237 -0
  201. package/skills/postgres-patterns/SKILL.md +148 -0
  202. package/skills/prediction-market-oracle-research/SKILL.md +64 -0
  203. package/skills/prediction-market-risk-review/SKILL.md +61 -0
  204. package/skills/prisma-patterns/SKILL.md +401 -0
  205. package/skills/product-capability/SKILL.md +142 -0
  206. package/skills/product-lens/SKILL.md +93 -0
  207. package/skills/production-audit/SKILL.md +207 -0
  208. package/skills/production-scheduling/SKILL.md +238 -0
  209. package/skills/project-flow-ops/SKILL.md +112 -0
  210. package/skills/prompt-optimizer/SKILL.md +398 -0
  211. package/skills/python-patterns/SKILL.md +751 -0
  212. package/skills/python-testing/SKILL.md +817 -0
  213. package/skills/pytorch-patterns/SKILL.md +397 -0
  214. package/skills/quality-nonconformance/SKILL.md +260 -0
  215. package/skills/quarkus-patterns/SKILL.md +723 -0
  216. package/skills/quarkus-security/SKILL.md +468 -0
  217. package/skills/quarkus-tdd/SKILL.md +812 -0
  218. package/skills/quarkus-verification/SKILL.md +481 -0
  219. package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
  220. package/skills/react-native-patterns/SKILL.md +326 -0
  221. package/skills/react-patterns/SKILL.md +342 -0
  222. package/skills/react-performance/SKILL.md +575 -0
  223. package/skills/react-testing/SKILL.md +424 -0
  224. package/skills/recsys-pipeline-architect/SKILL.md +115 -0
  225. package/skills/recursive-decision-ledger/SKILL.md +81 -0
  226. package/skills/redis-patterns/SKILL.md +404 -0
  227. package/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
  228. package/skills/remotion-video-creation/SKILL.md +43 -0
  229. package/skills/repo-scan/SKILL.md +170 -0
  230. package/skills/research-ops/SKILL.md +113 -0
  231. package/skills/returns-reverse-logistics/SKILL.md +240 -0
  232. package/skills/rules-distill/SKILL.md +265 -0
  233. package/skills/rust-patterns/SKILL.md +500 -0
  234. package/skills/rust-testing/SKILL.md +501 -0
  235. package/skills/safety-guard/SKILL.md +76 -0
  236. package/skills/santa-method/SKILL.md +307 -0
  237. package/skills/scientific-db-pubmed-database/SKILL.md +176 -0
  238. package/skills/scientific-db-uspto-database/SKILL.md +178 -0
  239. package/skills/scientific-pkg-gget/SKILL.md +167 -0
  240. package/skills/scientific-thinking-literature-review/SKILL.md +193 -0
  241. package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
  242. package/skills/search-first/SKILL.md +183 -0
  243. package/skills/security-bounty-hunter/SKILL.md +100 -0
  244. package/skills/security-scan/SKILL.md +166 -0
  245. package/skills/seo/SKILL.md +155 -0
  246. package/skills/skill-scout/SKILL.md +141 -0
  247. package/skills/skill-stocktake/SKILL.md +195 -0
  248. package/skills/social-graph-ranker/SKILL.md +155 -0
  249. package/skills/social-publisher/SKILL.md +130 -0
  250. package/skills/springboot-patterns/SKILL.md +315 -0
  251. package/skills/springboot-security/SKILL.md +273 -0
  252. package/skills/springboot-tdd/SKILL.md +159 -0
  253. package/skills/springboot-verification/SKILL.md +232 -0
  254. package/skills/swift-actor-persistence/SKILL.md +144 -0
  255. package/skills/swift-concurrency-6-2/SKILL.md +216 -0
  256. package/skills/swift-protocol-di-testing/SKILL.md +191 -0
  257. package/skills/swiftui-patterns/SKILL.md +259 -0
  258. package/skills/taste/SKILL.md +264 -0
  259. package/skills/tdd-workflow/SKILL.md +583 -0
  260. package/skills/team-agent-orchestration/SKILL.md +111 -0
  261. package/skills/team-builder/SKILL.md +169 -0
  262. package/skills/terminal-opener/SKILL.md +55 -0
  263. package/skills/terminal-ops/SKILL.md +110 -0
  264. package/skills/tinystruct-patterns/SKILL.md +279 -0
  265. package/skills/token-budget-advisor/SKILL.md +134 -0
  266. package/skills/ui-demo/SKILL.md +466 -0
  267. package/skills/ui-to-vue/SKILL.md +135 -0
  268. package/skills/uncloud/SKILL.md +344 -0
  269. package/skills/unified-memory/SKILL.md +170 -0
  270. package/skills/unified-notifications-ops/SKILL.md +188 -0
  271. package/skills/verification-loop/SKILL.md +129 -0
  272. package/skills/video-editing/SKILL.md +311 -0
  273. package/skills/videodb/SKILL.md +375 -0
  274. package/skills/vite-patterns/SKILL.md +450 -0
  275. package/skills/vue-patterns/SKILL.md +471 -0
  276. package/skills/windows-desktop-e2e/SKILL.md +888 -0
  277. package/skills/workspace-surface-audit/SKILL.md +126 -0
  278. package/skills/x-api/SKILL.md +235 -0
@@ -0,0 +1,300 @@
1
+ ---
2
+ name: motion-foundations
3
+ description: Motion tokens, spring presets, performance rules, device adaptation, accessibility enforcement, and SSR safety for React / Next.js using motion/react. Foundation layer — all other motion skills depend on this. Use when setting up motion tokens, spring presets, reduced-motion handling, or SSR-safe animation in React or Next.js.
4
+ tags: [motion, animation, performance, accessibility]
5
+ category: frontend
6
+ author: jeff
7
+ metadata:
8
+ version: 1.0.0
9
+ ---
10
+
11
+ # Motion Foundations
12
+
13
+ The base layer of the motion system. Defines every value, constraint, and
14
+ rule that downstream skills (`motion-patterns`, `motion-advanced`) inherit.
15
+ Load this skill before any animation work begins.
16
+
17
+ ## When to Activate
18
+
19
+ - Starting any animated component from scratch
20
+ - Setting up tokens, spring presets, or easing values
21
+ - Implementing `prefers-reduced-motion` support
22
+ - Debugging hydration mismatches from animation initial states
23
+ - Evaluating whether an animation should exist at all
24
+
25
+ ## Outputs
26
+
27
+ This skill produces:
28
+
29
+ - A shared `motionTokens` object (duration, easing, distance, scale)
30
+ - A shared `springs` preset map (5 named configs)
31
+ - A `shouldAnimate()` gate used by all components
32
+ - Accessibility-compliant animation defaults via `useReducedMotion`
33
+ - SSR-safe initial states with zero hydration warnings
34
+
35
+ ## Principles
36
+
37
+ Motion must do at least one of the following or it must be removed:
38
+
39
+ - Guide attention
40
+ - Communicate state
41
+ - Preserve spatial continuity
42
+
43
+ Responsiveness always outranks smoothness. A 60 fps animation that causes
44
+ input delay is worse than no animation.
45
+
46
+ ## Rules
47
+
48
+ These are non-negotiable. They apply to every component in the system.
49
+
50
+ 1. **Use `motion/react` only.** Never import from `framer-motion`. Never mix the two in the same tree.
51
+ 2. **`initial` must match server output.** If the server renders `opacity: 1`, the `initial` prop must also be `opacity: 1`. No exceptions.
52
+ 3. **Reduced motion overrides everything.** When `useReducedMotion()` returns `true` or `prefersReduced` is `true`, all transforms are disabled. Opacity-only fades at ≤ 0.2s are the only permitted fallback.
53
+ 4. **Never animate layout properties.** `width`, `height`, `top`, `left`, `margin`, `padding` are banned from `animate`. Use `transform` and `opacity` only.
54
+ 5. **All token values come from `motionTokens`.** Hardcoded durations and easings in component files are forbidden.
55
+ 6. **All spring configs come from the `springs` map.** Inline `stiffness`/`damping` values are forbidden.
56
+ 7. **`"use client"` is required** on every file that imports from `motion/react`.
57
+ 8. **Never read `window` or `navigator` at module level.** Always guard with `typeof window !== "undefined"`.
58
+
59
+ ## Decision Guidance
60
+
61
+ ### Choosing a duration
62
+
63
+ | Token | Use when |
64
+ | --------- | -------------------------------------------- |
65
+ | `instant` | Tooltip show/hide, focus ring, badge update |
66
+ | `fast` | Button feedback, icon swap, chip toggle |
67
+ | `normal` | Modal open, card expand, page element enter |
68
+ | `slow` | Hero entrance, full-page transition |
69
+ | `crawl` | Deliberate storytelling; use sparingly |
70
+
71
+ ### Choosing a spring
72
+
73
+ | Preset | Use when |
74
+ | --------- | ------------------------------------------ |
75
+ | `snappy` | Default UI — buttons, chips, nav items |
76
+ | `gentle` | Cards, modals, panels landing softly |
77
+ | `bouncy` | Playful moments — empty states, onboarding |
78
+ | `instant` | Tooltips, popovers, dropdowns |
79
+ | `release` | Drag release — natural physics feel |
80
+
81
+ ### When to disable animation entirely
82
+
83
+ Disable (make `shouldAnimate()` return `false`) when:
84
+
85
+ - `prefersReduced` is `true`
86
+ - `isLowEnd` is `true` and the animation is non-essential
87
+ - The element is off-screen and will never enter the viewport
88
+ - The animation is purely decorative with no UX purpose
89
+
90
+ ## Core Concepts
91
+
92
+ ### Token system
93
+
94
+ ```ts
95
+ // lib/motion-tokens.ts
96
+ export const motionTokens = {
97
+ duration: {
98
+ instant: 0.08,
99
+ fast: 0.18,
100
+ normal: 0.35,
101
+ slow: 0.6,
102
+ crawl: 1.0,
103
+ },
104
+ easing: {
105
+ smooth: [0.22, 1, 0.36, 1],
106
+ sharp: [0.4, 0, 0.2, 1],
107
+ bounce: [0.34, 1.56, 0.64, 1],
108
+ linear: [0, 0, 1, 1],
109
+ },
110
+ distance: {
111
+ xs: 4,
112
+ sm: 8,
113
+ md: 16,
114
+ lg: 24,
115
+ xl: 48,
116
+ },
117
+ scale: {
118
+ subtle: 0.98,
119
+ press: 0.95,
120
+ pop: 1.04,
121
+ },
122
+ }
123
+
124
+ export const springs = {
125
+ snappy: { type: "spring", stiffness: 300, damping: 30 },
126
+ gentle: { type: "spring", stiffness: 120, damping: 14 },
127
+ bouncy: { type: "spring", stiffness: 400, damping: 10 },
128
+ instant: { type: "spring", stiffness: 600, damping: 35 },
129
+ release: { type: "spring", stiffness: 200, damping: 20, restDelta: 0.001 },
130
+ }
131
+ ```
132
+
133
+ ### Runtime flags
134
+
135
+ ```ts
136
+ // lib/motion-config.ts
137
+ export const motionConfig = {
138
+ isLowEnd() {
139
+ return (
140
+ typeof navigator !== "undefined" &&
141
+ navigator.hardwareConcurrency <= 4
142
+ )
143
+ },
144
+
145
+ prefersReduced() {
146
+ return (
147
+ typeof window !== "undefined" &&
148
+ window.matchMedia("(prefers-reduced-motion: reduce)").matches
149
+ )
150
+ },
151
+
152
+ shouldAnimate({ essential = false } = {}) {
153
+ if (this.prefersReduced()) return false
154
+ if (!essential && this.isLowEnd()) return false
155
+ return true
156
+ },
157
+
158
+ duration() {
159
+ return this.isLowEnd() || this.prefersReduced()
160
+ ? motionTokens.duration.instant
161
+ : motionTokens.duration.normal
162
+ },
163
+ }
164
+ ```
165
+
166
+ ### Accessibility
167
+
168
+ **Priority order (highest to lowest):**
169
+
170
+ 1. `prefers-reduced-motion: reduce` — disables all transforms, limits opacity transitions to ≤ 0.2s
171
+ 2. Low-end device detection — reduces duration, removes non-essential animations
172
+ 3. Design preference — everything else
173
+
174
+ Motion must degrade gracefully. It must never disappear abruptly in a way
175
+ that causes layout shift or confuses orientation.
176
+
177
+ ```tsx
178
+ // hooks/use-reduced-motion.tsx
179
+ "use client"
180
+ import { useReducedMotion } from "motion/react"
181
+
182
+ export function useSafeMotion(fullY: number = 16) {
183
+ const reduce = useReducedMotion()
184
+ return {
185
+ initial: { opacity: 0, y: reduce ? 0 : fullY },
186
+ animate: { opacity: 1, y: 0 },
187
+ exit: { opacity: 0, y: reduce ? 0 : -fullY },
188
+ }
189
+ }
190
+ ```
191
+
192
+ ```css
193
+ /* globals.css */
194
+ @media (prefers-reduced-motion: reduce) {
195
+ .motion-safe-transition { transition: opacity 0.15s; }
196
+ .motion-reduce-transform { transform: none !important; }
197
+ }
198
+ ```
199
+
200
+ ```html
201
+ <!-- Tailwind -->
202
+ <div class="motion-safe:animate-fade motion-reduce:opacity-100"></div>
203
+ ```
204
+
205
+ ### SSR / hydration safety
206
+
207
+ **Rule: `initial` must always match what the server renders.**
208
+
209
+ ```tsx
210
+ // WRONG — server renders opacity:1 but initial says 0 → hydration mismatch
211
+ <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} />
212
+
213
+ // CORRECT — use AnimatePresence or defer to client mount
214
+ "use client"
215
+ const [mounted, setMounted] = useState(false)
216
+ useEffect(() => setMounted(true), [])
217
+
218
+ <motion.div
219
+ initial={{ opacity: mounted ? 0 : 1 }}
220
+ animate={{ opacity: 1 }}
221
+ />
222
+ ```
223
+
224
+ ## Code Examples
225
+
226
+ ### End-to-end: tokens + springs + accessibility + SSR guard
227
+
228
+ ```tsx
229
+ // components/fade-in-card.tsx
230
+ "use client"
231
+
232
+ import { useState, useEffect } from "react"
233
+ import { motion } from "motion/react"
234
+ import { motionTokens, springs } from "@/lib/motion-tokens"
235
+ import { useSafeMotion } from "@/hooks/use-reduced-motion"
236
+ import { motionConfig } from "@/lib/motion-config"
237
+
238
+ interface FadeInCardProps {
239
+ children: React.ReactNode
240
+ delay?: number
241
+ }
242
+
243
+ export function FadeInCard({ children, delay = 0 }: FadeInCardProps) {
244
+ // SSR guard — initial must match server output (opacity: 1)
245
+ const [mounted, setMounted] = useState(false)
246
+ useEffect(() => setMounted(true), [])
247
+
248
+ // Accessibility — disables transform when reduced motion is preferred
249
+ const safeMotion = useSafeMotion(motionTokens.distance.md)
250
+
251
+ // Device gate — skip animation on low-end hardware
252
+ if (!motionConfig.shouldAnimate() || !mounted) {
253
+ return <div>{children}</div>
254
+ }
255
+
256
+ return (
257
+ <motion.div
258
+ initial={safeMotion.initial}
259
+ animate={safeMotion.animate}
260
+ exit={safeMotion.exit}
261
+ transition={{
262
+ ...springs.gentle,
263
+ delay,
264
+ }}
265
+ whileHover={{ scale: motionTokens.scale.pop }}
266
+ whileTap={{ scale: motionTokens.scale.press }}
267
+ >
268
+ {children}
269
+ </motion.div>
270
+ )
271
+ }
272
+ ```
273
+
274
+ ## Constraints / Non-Goals
275
+
276
+ This skill does **not** cover:
277
+
278
+ - UI component patterns (button, modal, stagger) → see `motion-patterns`
279
+ - Drag, gestures, SVG, text animations, custom hooks → see `motion-advanced`
280
+ - CSS-only animations or Tailwind `animate-*` classes without `motion/react`
281
+ - Third-party animation libraries (GSAP, anime.js, etc.)
282
+ - Motion design decisions (when to animate, what to emphasize) — that is a design concern, not a code constraint
283
+
284
+ ## Anti-Patterns
285
+
286
+ | Anti-pattern | Rule violated | Fix |
287
+ | --------------------------------------- | ------- | ------------------------------- |
288
+ | `import { motion } from "framer-motion"` | Rule 1 | Use `motion/react` |
289
+ | `initial={{ opacity: 0 }}` on SSR component | Rule 2 | Add mount guard |
290
+ | Skipping `useReducedMotion` check | Rule 3 | Use `useSafeMotion` hook |
291
+ | `animate={{ width: "100%" }}` | Rule 4 | Use `scaleX` transform instead |
292
+ | `transition={{ duration: 0.4 }}` inline | Rule 5 | Use `motionTokens.duration.normal` |
293
+ | `{ stiffness: 300, damping: 30 }` inline | Rule 6 | Use `springs.snappy` |
294
+ | Missing `"use client"` directive | Rule 7 | Add to top of file |
295
+ | `navigator.hardwareConcurrency` at module level | Rule 8 | Wrap in `typeof navigator !== "undefined"` |
296
+
297
+ ## Related Skills
298
+
299
+ - **`motion-patterns`** — consumes tokens and springs defined here to build button, modal, stagger, page transition, and scroll patterns. Does not redefine any values.
300
+ - **`motion-advanced`** — consumes tokens and springs defined here for drag, SVG, text, and gesture patterns. Adds `useAnimate` sequences and custom hooks on top of this foundation.