§ Corrective
/pace
Motion discipline — timing, easing, reduced-motion handling.
What it does
Linear easing on every transition. 300ms applied to small state changes that should feel instant. Bounce easing read as playful five years ago and dated now. Scroll-triggered fades on every section, producing a slideshow rather than a page. Motion is the most easily misused domain in interface design, and AI defaults stack the misuses. /pace replaces them with timing calibrated to the moment, easing curves matched to the motion type, and discipline across the project.
Like the other correctives, /pace uses a smart-default autonomy model. Easing corrections, duration adjustments, token consolidation, and removal of motion that doesn’t serve a specific purpose get applied directly. Reduced-motion support is added when missing — autonomous but called out for awareness, since it affects every animation in the codebase.
Interactive
Before /pace
200ms · linear
Tonight
Evening Wind-down
Let the day settle. Seven minutes of body scan.
After /pace
320ms · ease-out
Tonight
Evening Wind-down
Let the day settle. Seven minutes of body scan.
- Easing changed from linear to Stillpoint’s --stp-ease-out (cubic-bezier(0.16, 1, 0.3, 1)) — strong deceleration matching the calm, settled product. Linear reads as mechanical; ease-out decelerates into rest, which reads as calm.
- Duration shifted from 200ms to Stillpoint’s --stp-duration-base (320ms). The faster AI default is snappy and reactive; the calibrated 320ms gives the motion time to feel deliberate rather than dismissive.
- Both motions respect
prefers-reduced-motion. When set, the drawer appears in place without travel (.stillpoint primitives honor the system pref via tokens/stillpoint.css).
On Stillpoint
Stillpoint’s home doesn’t include a drawer pattern — this demo illustrates /pace’s principle on a related abstraction. The motion tokens in the after column (320ms · ease-out) are the actual values wired into .stp-card--interactive on the practices grid that ships at /case-study; /pace’s work on Stillpoint is verification, not incremental change.
When to use it
- Motion feels sluggish — 300ms+ on small state changes that should feel instant.
- Animations use linear easing, producing mechanical motion.
- Bounce or elastic easing applied to standard transitions, reading as dated.
- Each component animates with different timing — motion feels uncoordinated.
- Scroll-triggered animations fire on every section of the page, producing a slideshow.
- Hover states have multi-property animations beyond the 100ms perception window.
- Missing reduced-motion support needs to be added for accessibility.
How to use it
By default /pace runs a full pass — timing corrections, easing replacements, motion-token consolidation, and reduced-motion support. Pass a scope to focus on one area: 'timing’ for durations, 'easing’ for curves, 'scroll’ for scroll-triggered motion, 'accessibility’ for reduced-motion handling.
- /pace timing
- /pace easing
Anti-patterns it addresses
- Linear easing on standard interface motion. Linear belongs on spinners and progress bars, not on elements arriving or leaving. Curves communicate motion character; linear strips it.
- 300ms default applied to button hovers and small state changes. Small interactions belong in the 100-150ms range; 300ms reads as sluggish.
- Bounce or elastic easing on routine transitions. Bounce serves specific moments (an error shake, a deliberately playful element); applied broadly, it adds perceived duration and undermines restraint.
- Scroll-triggered fade-up animations on every section of a marketing page, producing a slideshow rather than a content surface.
- Imperceptible 50-80ms modal entries that read as jump cuts because the motion didn’t have time to register.
- Motion tokens absent — durations and easing scattered as magic numbers throughout the codebase. Without tokens, motion drifts component by component until each animates with its own timing.
- Reduced-motion preference ignored. Users with vestibular sensitivity, motion-related migraines, or who simply prefer less motion are forced through every animation regardless.