Back to list
raphaelsalaja

to-spring-or-not-to-spring

by raphaelsalaja

A Living Manual for Better Interfaces

77🍴 3📅 Jan 24, 2026

SKILL.md


name: to-spring-or-not-to-spring description: Decision framework for choosing between easing curves and springs in interface motion. Use when implementing animations, reviewing motion feel, or debugging why an animation feels wrong. Triggers on tasks involving CSS transitions, animation libraries, or motion design decisions. license: MIT metadata: author: raphael-salaja version: "1.0.0" source: /content/to-spring-or-not-to-spring/index.mdx

To Spring or Not To Spring

A decision framework for choosing between easing curves and springs. They are not interchangeable tools—they come from different ways of thinking about motion and play different roles in an interface.

When to Apply

Reference these guidelines when:

  • Choosing animation timing functions
  • Debugging motion that feels "off"
  • Implementing gesture-driven interactions
  • Reviewing animation implementations
  • Deciding if motion is needed at all

Decision Framework

Ask: Is this motion reacting to the user, or is the system speaking?

Motion TypeBest ChoiceWhy
User-driven (drag, flick, gesture)SpringSurvives interruption, preserves velocity
System-driven (state change, feedback)EasingClear start/end, predictable timing
Time representation (progress, loading)Linear1:1 relationship between time and progress
High-frequency (typing, fast toggles)NoneAnimation adds noise, feels slower

Springs

Best for motion directly tied to user input. They remain responsive when interrupted and reflect input energy.

transition={{
  type: "spring",
  stiffness: 900,
  damping: 80,
  mass: 10,
}}

Parameters

ParameterControlsEffect
StiffnessPull toward targetHow quickly motion begins
DampingEnergy removalWhether motion settles or oscillates
MassWeightHow stiffness and damping are perceived

When to Use

  • Dragging and releasing
  • Gesture-driven interactions
  • Anything that can be interrupted
  • When velocity matters

Watch Out

Springs can feel restless when the system is simply announcing a state change.

Easing Curves

Describe how motion progresses over a fixed duration.

transition-timing-function: cubic-bezier(x1, y1, x2, y2);

Control Points

PointsControlsTuning
x1, y1How motion beginsLower = gradual start, Higher = immediate
x2, y2How motion endsHigher = calm landing, Lower = sharp/tense

Curve Types

CurveBest ForFeel
ease-outEntrances, feedbackResponsive start, soft landing
ease-inExitsAcknowledges action, gets out of the way
ease-in-outView/mode transitionsNeutral, even attention
linearProgress bars, loadersHonest time representation

Duration Guidelines

InteractionDuration
Presses, hovers120–180ms
Small state changes180–260ms
Larger transitionsup to 300ms

If animation feels slow, shorten duration before adjusting the curve.

The Key Difference

Easing curves have a predefined start and end in time. Springs do not.

This explains why springs survive interruption while easing curves fall apart when the user changes their mind.

When to Use No Animation

Not everything needs motion. High-frequency interactions often feel slower and noisier with animation:

  • Typing
  • Keyboard navigation
  • Fast toggles
  • Context menu entrances (Apple animates exit only)

Choosing no motion is still a design decision—prioritizing immediacy over expressiveness.

Key Guidelines

  • Start with the interaction, not the animation technique
  • Match the role: User-reactive vs system-announcement
  • Test interruption: Does it hold up when the user changes their mind?
  • Default to less: Animate with intent, not by default

References

Score

Total Score

60/100

Based on repository quality metrics

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

0/10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

Reviews

💬

Reviews coming soon