{"collectionById":{"580d57c5-1334-4471-8a7e-05a742986cf8":{"id":"580d57c5-1334-4471-8a7e-05a742986cf8","name":"Posts","fieldSchemas":[{"id":"2d89b706-e90c-484b-b846-3e0079a2f366","name":"Title","type":"plain_text","role":"primary"},{"id":"0ab82420-0809-4c81-b555-bfe8e88a3e5c","name":"Slug","type":"slug","role":"slug"},{"id":"abdbe908-36b7-4722-b7d1-1f4fcfbe097f","name":"Date","type":"date"},{"id":"8b6b45b6-7d10-45a3-9208-86534fa9f3a8","name":"Cover image","type":"image"},{"id":"fb122276-3c35-4a4d-b703-e63e57e0c0db","name":"Body","type":"rich_text"}],"itemById":{"63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97":{"id":"63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97","index":"#","collectionId":"580d57c5-1334-4471-8a7e-05a742986cf8","fields":[{"id":"70688a43-8b5c-4156-abf7-659dc753e242","value":"Springs, not durations","itemId":"63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97","fieldSchemaId":"2d89b706-e90c-484b-b846-3e0079a2f366"},{"id":"33c4791f-a7a6-4b2a-8c4f-218ac8b9f6ba","value":"2026-01-18","itemId":"63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97","fieldSchemaId":"abdbe908-36b7-4722-b7d1-1f4fcfbe097f"},{"id":"546cdfb5-241f-48a7-b544-d24a9172289c","value":"{\"root\":{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Most interface animation is specified in milliseconds. A panel slides in over 300ms with an ease-out curve, a button scales for 150ms, and everyone moves on. It works, mostly. But the moment a user interrupts an animation halfway through, the illusion falls apart, which is why I have been rebuilding the motion in \",\"type\":\"text\",\"version\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Circular Motion Studio\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"link\",\"version\":1,\"rel\":null,\"target\":null,\"title\":null,\"url\":\"https://example.com/projects/circular-motion-studio\"},{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\" around springs instead.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A spring has no duration. It has stiffness, damping and mass, and it settles when it settles. That sounds less predictable, and it is, in exactly the way real objects are.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Why durations feel wrong\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h2\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"A fixed duration assumes the animation always starts from rest and always travels the same distance. Interfaces rarely cooperate.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Tuning stiffness and damping\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"heading\",\"version\":1,\"tag\":\"h3\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"After a lot of trial and error, I use three presets for almost everything:\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"},{\"children\":[{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Snappy, for small controls like toggles and checkboxes\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"listitem\",\"version\":1,\"value\":1},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Gentle, for panels, sheets and anything that covers content\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"listitem\",\"version\":1,\"value\":2},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"Loose, reserved for playful moments where a little overshoot reads as personality\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"listitem\",\"version\":1,\"value\":3}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"list\",\"version\":1,\"listType\":\"bullet\",\"start\":1,\"tag\":\"ul\"},{\"children\":[{\"detail\":0,\"format\":0,\"mode\":\"normal\",\"style\":\"\",\"text\":\"None of this requires a physics engine. The hard part is resisting the urge to specify how long something should take.\",\"type\":\"text\",\"version\":1}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"paragraph\",\"version\":1,\"textFormat\":0,\"textStyle\":\"\"}],\"direction\":null,\"format\":\"\",\"indent\":0,\"type\":\"root\",\"version\":1}}","itemId":"63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97","fieldSchemaId":"fb122276-3c35-4a4d-b703-e63e57e0c0db"}]}}}},"slugByItemId":{"4b3647d2-475d-4527-887e-146f75e5cc89":"notes-from-a-design-systems-migration","54428e8d-48c6-4570-8407-1293b74de7c2":"why-i-stopped-reaching-for-a-component-library-on-small-proj","5293fdff-2b04-4f4d-a839-99373f9c2d5e":"what-i-learned-rebuilding-the-same-app-three-times","63c6c2db-7e3d-4fb4-a767-38cb8c4e8d97":"springs-not-durations","8913ec81-6339-4266-8d8f-1d91044f425b":"designing-for-no-signal","73a8d0bb-0945-4b08-aff2-bf7518dad624":"the-case-for-boring-color-palettes","d483606c-39cc-4d5e-8818-a643c7bfcd24":"a-year-of-writing-every-week","ed6ab224-a60b-48b3-a662-cc61afbef4d1":"small-tools-made-carefully"}}