Supported
The prebuilt stylesheet needs no build step, no plugin and no configuration.
React Native
Not supported. TailMotion is CSS and DOM selectors: it needs a real stylesheet,data-* attribute selectors, @supports, cascade layers,
pseudo-elements and @keyframes, none of which exist in React Native’s style
system.
React Native Web can use TailMotion for its browser target only, where
the output is real DOM and real CSS. Nothing in this package will run on the iOS
or Android native renderer.
Non-goals
These are permanent. They were decided before the first user arrived, because saying no in advance is cheaper than saying no later.- No JavaScript animation runtime. No spring solver, no timeline, no
element.animate(). If a behaviour needs one, it belongs in your application. - No styled React, Vue or Svelte components. One CSS API, four identical integrations. A component library is a different product with a different maintenance cost.
- No colors, sizes, spacing or radius in a motion class. That is Tailwind’s
job. The two classes that break this rule —
tm-hold-delete,tm-liquid-btn— pre-date it, are kept for compatibility, and have motion-only successors. - No animations added to raise the class count. Every class has to answer a question the existing vocabulary cannot.
- No copying
tailwindcss-animateortw-animate-css. Those solve a different problem well; duplicating their API would leave TailMotion with no reason to exist. - No
useMotion()hook. If the answer is a hook, the answer is not this package.
Compatibility promise
- Existing public classes keep working. Nothing is removed without an alias and a documented migration path.
- New modern CSS is always a progressive enhancement. Unsupported browsers
keep visible, usable content — checked, not promised, by
npm run check. - Reduced motion preserves the communicated state. Animations collapse to 1ms rather than being removed.
- The full bundle is not described as tree-shaken, because it is not. See Imports and bundle size.
- The optional plugin is never required for the prebuilt classes.
Verifying a build
- Every
animation-nameresolves to a real@keyframesblock. - No rule hides content outside an
@supportsguard or a closed-state selector. :rootcarries no timing token that would shadow per-class defaults.--tm-exit-distanceis not declared on:root, wherecalc()would freeze.- Every module ships a reduced-motion reset.
Reporting a problem
Issues
Bugs, missing fallbacks, incorrect documentation.
Contributing
Adding a class, a recipe, or a browser fallback.