Spring
canonDamped-oscillator physics (stiffness 190, damping 17, ~750ms, ~6% overshoot) sampled into WAAPI keyframes — the one physical motion for every reshape between states (dialog window, button/text width, list cursor). Replaces the earlier 0.29s cubic-bezier(0.32, 0.72, 0, 1) curve as canon (RULES.md §11).
27 September 2026: merged on main as !3957 (feat/acrm-322: pružina — přetvarování dialogu a MorphText). Drives <Dialog morphKey>'s window resize and MorphText's width. Small-element morphs written before this module (ChipMorph, NoteRecChip) still run the old 0.29s cubic-bezier curve pending their own migration — see ChipMorph.tsx's own comment ("do doby, než ho nahradí pružina").
Used in 5 files · 4 areas · 8× — components/ItemList, components/company, components/meetings, components/notes
@acrm/ui <springAnimate> <springValues> <prefersReducedMotion> <SPRING_MS> <SPRING_ARRIVE_MS>SourceStoryspring.ts is a motion primitive, not a control — it has no DOM node, no role and nothing to focus. This page covers the one accessibility surface it does have: motion itself.
Keyboard
- Not applicable — the module renders nothing and owns no keyboard behaviour. Whatever element a consumer animates (a dialog panel, a button) keeps its own keyboard handling untouched; the spring only ever changes a numeric CSS property on it.
ARIA
- Not applicable — no element, no role, no announcement. Any ARIA implication of a state change belongs to the consumer (see
multi-step-dialog.a11y.md,morph-text.a11y.md).
Focus
- The spring never moves focus and never traps it; it runs alongside whatever focus management the consumer already does (
Dialog's focus trap keeps working unchanged while its panel resizes).
Contrast
- Not applicable — the module has no visual rendering of its own.
Known limits
prefers-reduced-motion: reduceis the only accessibility control:springAnimatereturnsnulland the consumer must apply the end state immediately with no animation. Every current caller (Dialog,MorphText) does this; a new caller that forgets to handle thenullreturn will silently keep the old, un-morphed layout for reduced-motion users, which is the safe failure mode but should still be tested.- Content that is meant to appear only once a motion has essentially finished should key off
SPRING_ARRIVE_MS, notSPRING_MS— using the full duration means the final ~170 ms of overshoot/settle delays that content for no reason a screen-reader or keyboard user would perceive as a wait. - The motion carries no information on its own — nothing is communicated by the spring that isn't also present in the before/after state of the element itself.
Source: docs/dialog/spring.a11y.md · GitLab