# Compose spring() default: stiffness 1500, damping 77.46 spring

> Compose spring() default as a CSS linear() spring: stiffness 1500, damping 77.46, settles in 0.24 s, no overshoot. Copy the CSS and the Web Animations line.

Canonical: https://vawe.dev/springs/compose-no-bouncy-medium
Last updated: 2026-11-04

Stiffness 1500, damping 77.46 and mass 1 give a damping ratio of 1, so the spring is about critically damped. It settles to within 0.1% in 0.24 s. It never passes the end value.

Stiffness 1500 with critical damping gives the shortest settle in this set, 0.24 s.

| Measure | Value |
| --- | --- |
| Stiffness | 1500 |
| Damping | 77.46 |
| Mass | 1 |
| Damping ratio | 1 (about critically damped) |
| Settle time | 0.24 s |
| Overshoot | 0% |
| Crosses the end value | 0 |
| 50% of travel at | 0.044 s |
| 90% of travel at | 0.101 s |

## CSS linear()

```css
transition: translate 240ms linear(0, 0.0062, 0.0232, 0.0483, 0.0797, 0.1157, 0.1548, 0.196, 0.2383, 0.281, 0.3236, 0.3654, 0.4062, 0.4457, 0.4836, 0.5199, 0.5545, 0.5872, 0.6182, 0.6473, 0.6746, 0.7002, 0.724, 0.7463, 0.767, 0.7862, 0.804, 0.8204, 0.8356, 0.8497, 0.8626, 0.8745, 0.8854, 0.8955, 0.9047, 0.9132, 0.9209, 0.928, 0.9345, 0.9404, 0.9459, 0.9508, 0.9553, 0.9594, 0.9632, 0.9666, 0.9697, 0.9725, 0.9751, 0.9775, 0.9796, 0.9815, 0.9833, 0.9849, 0.9863, 0.9876, 0.9888, 0.9899, 0.9908, 0.9917, 0.9925, 0.9932, 0.9939, 0.9945, 0.995, 0.9955, 0.9959, 0.9963, 0.9967, 0.997, 0.9973, 0.9976, 0.9978, 0.998, 0.9982, 0.9984, 0.9986, 0.9987, 0.9988, 0.9989, 1);
```

## Web Animations

```js
el.animate({ translate: ['0 0', '240px 0'] }, { duration: 240, easing: 'linear(0, 0.0062, 0.0232, 0.0483, 0.0797, 0.1157, 0.1548, 0.196, 0.2383, 0.281, 0.3236, 0.3654, 0.4062, 0.4457, 0.4836, 0.5199, 0.5545, 0.5872, 0.6182, 0.6473, 0.6746, 0.7002, 0.724, 0.7463, 0.767, 0.7862, 0.804, 0.8204, 0.8356, 0.8497, 0.8626, 0.8745, 0.8854, 0.8955, 0.9047, 0.9132, 0.9209, 0.928, 0.9345, 0.9404, 0.9459, 0.9508, 0.9553, 0.9594, 0.9632, 0.9666, 0.9697, 0.9725, 0.9751, 0.9775, 0.9796, 0.9815, 0.9833, 0.9849, 0.9863, 0.9876, 0.9888, 0.9899, 0.9908, 0.9917, 0.9925, 0.9932, 0.9939, 0.9945, 0.995, 0.9955, 0.9959, 0.9963, 0.9967, 0.997, 0.9973, 0.9976, 0.9978, 0.998, 0.9982, 0.9984, 0.9986, 0.9987, 0.9988, 0.9989, 1)', fill: 'both' });
```

## In a vawe page

```js
import { spring, springDuration, springLinear } from '../../core/motion/springs.js';

const k = 1500, d = 77.46;

// per-frame code (window.seek, vawe.onFrame): t is seconds since the move starts
const x = 240 * spring(t, k, d);

// CSS and Web Animations: 240 ms, the linear() string above
el.animate(
  { translate: ['0 0', '240px 0'] },
  { duration: springDuration(k, d) * 1000, easing: springLinear(k, d), fill: 'both' },
);
```

## Source of the numbers

spring(): dampingRatio 1f, stiffness 1500f. androidx main at 9adbcd8 (compose animation-core 1.14.0-alpha01), spring() in AnimationSpec.kt: dampingRatio = DampingRatioNoBouncy (1), stiffness = StiffnessMedium (1500) (https://github.com/androidx/androidx/blob/androidx-main/compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/AnimationSpec.kt). Conversion: Stiffness is used as it is with mass 1 (SpringSimulation takes the natural frequency as sqrt(stiffness)). damping = 2 x dampingRatio x sqrt(stiffness), the same c = 2 x naturalFreq x dampingRatio that SpringSimulation.getAcceleration uses.

## Related

- [Material 3 Expressive fast spatial](https://vawe.dev/springs/material-expressive-fast-spatial)
- [Motion scale default](https://vawe.dev/springs/motion-scale)
- [Motion x, y and rotate default](https://vawe.dev/springs/motion-transform)
- [Material 3 Standard default spatial](https://vawe.dev/springs/material-standard-default-spatial)
- [All spring presets](https://vawe.dev/springs)
