| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-08-06 | 7.5 kB | |
| v1.4.2 source code.tar.gz | 2026-08-06 | 369.1 kB | |
| v1.4.2 source code.zip | 2026-08-06 | 433.3 kB | |
| Totals: 3 Items | 809.9 kB | 0 | |
Added
reducedMotionpolicy:"never" | "user" | "always". A prop onMorphIconin the four bindings (React, Vue, Svelte, React Native) and an option on the vanilla driver,createMorph(el, icon, { reducedMotion }), plus a livemorph.reducedMotionproperty."user"honors the OS reduce-motion setting (prefers-reduced-motionon the web,AccessibilityInfoon React Native, whose accessibility bridge is now only touched when some instance opts in),"always"makes everymorphToan instant swap (tests, screenshots),"never"always animates. The policy is live: changing the prop governs the next morph, even when it changes in the same update as the icon.
Changed
- Morphs now play by default even when the OS reduce-motion setting is on (
reducedMotiondefaults to"never", the same default Motion, formerly Framer Motion, ships). Up to 1.4.1 everymorphTosilently degraded to an instant swap under reduce motion, which read as "the animation is broken" for users who have the setting on for battery or focus reasons: icon morphs are small, short, communicative micro-transitions, not the large movement the setting targets. To restore the previous behavior, passreducedMotion="user"; apps that must strictly follow the user's system preference should do exactly that.
Fixed
- SSR hydration mismatch on icons with non-cardinal arcs (e.g. lucide's
eye). The canonicaldwas emitted at full float precision, and arc→cubic conversion goes through trig whose last ulp differs across JS engines: the server's markup and the browser's recomputation could disagree in the final digit, which hydration flags as a mismatch (observed in Next with the React binding; the same bytes reach Vue and Svelte SSR). Canonical emission is now quantized to 4 decimals, invisible on the 24px grid (max deviation 5e-5), making the bytes engine-independent. Applies everywhere the canonicaldis produced: the bindings' SSR/at-rest markup, the driver's settle snap andfitIconoutput. Pinned by a 1-ulp perturbation test in core plus mirrored SSR stability tests in the four binding suites.
1.4.0 - 2026-08-04
Added
morphicons/react-native— React Native binding. The sameMorphIconas the web bindings — uncontrolled (iconprop), controlled (from/to/progress) and imperative (ref →morphTo/set) modes, the shared lifecycle contract, lucide-style presentation props and accessibility defaults (label→role="img"+aria-label, hidden otherwise) — rendered through react-native-svg. The dom driver is reused verbatim as the engine: per-framedwrites go throughPath.setNativeProps, outside the React render, exactly like the web mutation. Reduced motion honors the OS setting viaAccessibilityInfo(best-effort initial query +reduceMotionChangedsubscription). Optional peersreact-native >= 0.71andreact-native-svg >= 14; needs Metro with packageexportsresolution (default since React Native 0.79).
[1.3.0] - 2026-08-04
Never published to npm on its own — it shipped as part of 1.4.0.
Added
morphicons/svelte— Svelte 5 binding. The sameMorphIconas React and Vue: uncontrolled (iconprop), controlled (from/to/progress) and imperative (bind:this→morphTo/set) modes, exact SSR first paint, accessibility defaults and lucide-svelte drop-in props. Ships as.sveltesource compiled by the consumer's bundler via thesvelteexport condition;svelte >= 5joinsreactandvueas an optional peer.- A documented lifecycle contract, shared by the three bindings (README → "Lifecycle contract"): lazy driver on iconless mounts (an icon that arrives late — async data, pure imperative use — births the driver on the spot, painting without animating;
morphTobefore the driver exists behaves asset), explicit mode precedence (controlled wins whilefrom/toare both present; dropping the pair hands the path back toicon), and clean re-entry (leaving controlled mode invalidates the frozen pair, so returning to it renders exactly like a clean mount). Pinned by mirrored client-mount test suites in the three frameworks.
Fixed
- Mounting any binding without an icon left the component dead forever — the imperative handle silently no-oped and late props were ignored. Covered by the lazy-driver contract above; affected React, Vue and Svelte alike.
- Stale controlled state when switching modes: after an imperative
set/morphTo(or an icon takeover), returning to the samefrom/topair reused the previous plan without re-basing, producing geometry that differed from a clean mount at the sameprogress. iconandfrom/tono longer compete when combined: aniconchange used to fire a spring animation that overwrote the declaredprogress. In React, dropping the controlled pair also failed to apply the currenticon.
Changed
- Svelte's
MorphIconPropsnow derives fromsvelte/elements'SVGAttributesinstead of accepting any key: SVG attributes, events and ARIA are fully typed — typos likestrokWidthfail the build, matching lucide-svelte and the React binding'sSVGPropssurface. (from/toshadow the SMIL attributes of the same name, as in React.)
1.2.0 - 2026-08-03
Added
morphicons/vue— Vue 3 binding. Same three modes as React (uncontrolled, controlled, imperative via template ref), exact SSR, accessibility defaults, lucide-vue-next drop-in props. Plain render function — no SFC compiler or JSX involved. Optional peervue >= 3.3.
1.1.1 - 2026-08-01
Fixed
- Block transport: icons that are congruent as a whole now stay rigid mid-flight — subpath centroids ride the shared similarity around the global centroid instead of lerping, so cross-subpath distances hold at every t, not only at the endpoints.
1.1.0 - 2026-08-01
Added
fitIcon— re-grid icon packs drawn off the 24×24 canvas (Carbon on 32, Teenyicons on 15, Heroicons solid on 20…) so they morph in the same coordinate space as Lucide/Tabler/Heroicons/Iconoir.
1.0.0 - 2026-08-01
First stable release.
Added
- Universal morphing core (
morphicons): parse → normalize → arc-length resampling with anchored corners → surjective subpath matching → closed-form Procrustes with minimal-rotation tie-break, circular correspondence for closed paths and global-hybrid block coherence → polar interpolation → serialization. Rotations emerge from the math — no hand-declared groups. Zero runtime dependencies, DOM-free. - DOM driver (
morphicons/dom):createMorphwithmorphTo/set/seek/progress/destroy, spring physics with true interruptibility, a singleton rAF scheduler, canonical snap at rest andprefers-reduced-motionsupport. - React binding (
morphicons/react):MorphIconwith uncontrolled/controlled/imperative modes, exact SSR first paint, accessibility defaults and lucide-react drop-in props.
Versions 0.1.0–0.1.1 were publishing-pipeline shakedowns, superseded by 1.0.0 the same day.