Speed1×
Slow motion multiplier
Reduced motion
Show
Live previews
Sliding indicators
ADDToday — per-item cross-fade
Each tab owns its own bar and cross-fades. Nothing travels, so the eye has to re-find the selection after every change.
Proposed — one indicator travels
One indicator travels on --ease-move. The eye follows it, so the selection is never lost.
travel
--ease-move rather than the entry curve, because the indicator is already on screen: it needs a legible path, not an arrival accent. This is also the strongest candidate for the layout spring, since a travelling indicator is exactly the interruptible case.Disclosure bake-off
PARTIAL — three techniquesGrid tracks — CodeBlock, ChatNo measurement needed, and it survives content changing mid-transition. Cannot be used on a table row, which is why this may not be the single winner.
Astryx ships nine duration tokens and one easing token.Nine surfaces disclose content, using three different techniques.
Height interpolationNeeds a scrollHeight measurement on every open, so streaming content fights it. Works anywhere, including a table row.
Astryx ships nine duration tokens and one easing token.Nine surfaces disclose content, using three different techniques.
Height + offset fade — CollapsibleHeight plus a delayed content fade. The newest component uses this, and it is the only one that does.
Astryx ships nine duration tokens and one easing token.Nine surfaces disclose content, using three different techniques.
reveal
SideNav rail collapse
ADDToday — only the chevron rotatesOnly the chevron rotates. The rail snaps between widths, so the content beside it jumps.
HomeProjectsComponentsTokensSettings
Content
Proposed — the rail animatesThe rail’s own width animates on --ease-move and the labels fade slightly ahead of it. width is a layout property, so this is a deliberate criterion-6 exception that needs a written reason.
HomeProjectsComponentsTokensSettings
Content
The transform alternative — translate the rail and clip it — keeps the animation on the compositor but leaves the content beside it un-reflowed until the end, which reads worse than the layout cost. Worth prototyping both before granting the exception.
Skeleton → content
ADDToday — content hard-swapsContent hard-swaps the instant it arrives, at a moment the user cannot predict.
Astryx Motion48 of 104 core components animate something.Audited against core@0.5.0.
Proposed — crossfade with overlapSkeleton fades out while content fades in, overlapping just enough that the box is never empty.
Astryx Motion48 of 104 core components animate something.Audited against core@0.5.0.
crossfade
Chip add and remove
ADDToday — instant
designmotiontokens
Chips appear and disappear on a frame. The canonical scale-in case, unanimated.Proposed — scale in, accelerate away
designmotiontokens
Scale-in with opacity; removal accelerates away and the neighbours close the gap.add
remove
List add, remove and reorder
ADDToday — instant
Item 1Item 2Item 3Item 4
Reorder is instant, so the user has to re-read the list to find out what changed.Proposed — FLIP on --ease-move
Item 1Item 2Item 3Item 4
FLIP: measure, move, invert, play. Rows travel on --ease-move, so a change the user did not initiate stays followable.FLIP — measure, move, invert, play — is the technique here because the rows are genuinely re-laid-out and only the visual correction is animated. Try it at 4×: a shuffle that is legible at 4× and illegible at 1× means the duration is too short, not that the technique is wrong.
Checkbox tick
ADDToday
Appears instantly
Draw
Draws along its path
Scale
Scales in
Stat value change
ADDToday — replaces itself
1,247The number replaces itself, so a change of 4 and a change of 4,000 look identical.
Proposed — counts
1,247Counts to the new value. Needs a delta threshold so a jump from 12 to 1,300,000 does not spin for a second.