transitions-dev
Production-ready CSS transitions for web apps. Use when implementing notification badges, dropdowns, modals, panel reveals, page transitions, card resizes, number pop-ins, text swaps, icon swaps, success checks, avatar group hovers, error state shakes, search/input clear, skeleton loaders, shimmer text, sliding tabs, tooltips, staggered text reveals, card hover tilt, plus-to-menu morph, accordions, toasts, like buttons, learn-more hovers, checkbox checks, spinning counters, toggles, AI thinking states, reasoning streams, streaming text, matrix dot loaders, or banner stacking. Triggers on "add a transition", "animate the dropdown", "make the modal open smoothly", "swap icon", "page slide", "stagger animation", "open / close transition", "make it animate", "fade between", "success animation", "form error", "shake on invalid", "hover lift", "avatar stack hover", "clear the search", "skeleton loader", "loading shimmer", "shimmer text", "sliding tabs", "segmented control", "tooltip", "reveal text", "tilt card", "3D hover tilt", "cursor glare", "plus to menu", "FAB morph", "accordion", "collapsible", "expand / collapse", "disclosure", "toast", "snackbar", "like button", "heart animation", "learn more arrow", "checkbox", "check animation", "spinning counter", "odometer", "slot machine digits", "toggle", "switch", "thinking states", "AI status line", "agent reasoning", "reasoning stream", "streaming text", "stream words in", "matrix loader", "dot loader", "banner stack", "stacked toasts". Also "motion tokens", "scan for ad-hoc transitions", "replace hardcoded durations with motion tokens", "tokenize my animations", and the commands transitions reveal, transitions review, transitions apply, transitions refine.
Install
npx skills add https://github.com/Jakubantalik/transitions.dev --skill transitions-devText morph
When to use
Changing a short label in place when the old and new text share letters at the start or the end: "Copy code" to "Copied", "Follow" to "Following", "Check in" to "Checked in", "Save" to "Saved". The shared letters stay where they are; only the part that differs cross-blurs, while its width eases to the new text, so the label (and the button or tooltip around it) grows or shrinks smoothly. When the two texts share nothing ("Processing" to "Done"), use Text states swap instead.
HTML usage
Driven by JS (morphText(el, next)):
- Find the letters both texts share at the start and at the end.
- Rebuild the label as: shared start, a
.t-morph-swapholding the old middle (.t-morph-old) and the new middle (.t-morph-new) in one grid cell, shared end. - Pin the swap to the old middle's width, force a reflow, then add
.is-morphingand set the new middle's width: the old part blurs out, the new part blurs in, the width eases. - When it settles, put the plain text back.
Tunable variables
The :root defaults below match the copy tooltip on transitions.dev. Drop them into your global stylesheet once; every transition in this skill reads from semantic names like these, so multiple transitions can share a single :root block.
CSS
The @media (prefers-reduced-motion: reduce) guard at the bottom of the snippet is required; keep it. It zeroes the transition for users who have asked for less motion at the OS level.
JavaScript orchestration
Call it with the element and the new text: morphText(label, copied ? "Copied" : "Copy code"). Keep el.dataset.text as the source of truth while a morph runs, so a quick second click starts from the right text.