<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Paul Henschel on Medium]]></title>
        <description><![CDATA[Stories by Paul Henschel on Medium]]></description>
        <link>https://medium.com/@drcmda?source=rss-ace940cf89ce------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*xWKyzRm1D8moroHq.jpg</url>
            <title>Stories by Paul Henschel on Medium</title>
            <link>https://medium.com/@drcmda?source=rss-ace940cf89ce------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 21:29:40 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@drcmda/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Hooks in react-spring, a tutorial]]></title>
            <link>https://medium.com/@drcmda/hooks-in-react-spring-a-tutorial-c6c436ad7ee4?source=rss-ace940cf89ce------2</link>
            <guid isPermaLink="false">https://medium.com/p/c6c436ad7ee4</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[hooks]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Paul Henschel]]></dc:creator>
            <pubDate>Fri, 26 Oct 2018 07:00:56 GMT</pubDate>
            <atom:updated>2018-10-26T12:18:51.888Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*7af_1QdcwQYpSxLh4rVo6w.gif" /><figcaption>Goo in 20 lines or less, using React-futures hooks feature</figcaption></figure><p><a href="https://reactjs.org/docs/hooks-intro.html">Yesterday</a> the React-team finally unveiled their vision of a class-less future in React. Today we’re going to take a look at how to use this for animations, using <a href="https://medium.com/@drcmda/react-spring-6-0-is-out-of-beta-533ad6c8b4a">react-spring 6.0</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VbANbaQK5_jc7Bz2wFy7EA.png" /><figcaption>The full implementation of useSpring</figcaption></figure><p>First of all, you would think of react-spring as being render-props driven. Render props are expressive, explicit, and usually very easy to use. But since it is internally steered imperatively, supporting hooks was just a matter of a couple of lines added to its core. The export is now live under react-spring@6.1.0. If you want to use hooks, you will need react and react-dom alpha, otherwise it won’t run. Both apis, the imperative one and hooks, are explained in full detail <a href="http://react-spring.surge.sh/manual">here</a>.</p><p>Basically useSpring turns any data into animated data, with a single line. Throw in whatever you want, <a href="http://react-spring.surge.sh/spring#interpolation">numbers, colors, percentages, anything really</a>, just drop it in and place the output into your view. Like so:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodesandbox.io%2Fembed%2F426pvonqj0&amp;url=https%3A%2F%2Fcodesandbox.io%2Fs%2F426pvonqj0&amp;image=https%3A%2F%2Fcodesandbox.io%2Fapi%2Fv1%2Fsandboxes%2F426pvonqj0%2Fscreenshot.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codesandbox" width="1000" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/58f4177cc47a57502d26a0aeef93976e/href">https://medium.com/media/58f4177cc47a57502d26a0aeef93976e/href</a></iframe><p>So let’s make some cool looking goo with this, whatever the purpose …</p><h4>Fetching hooks</h4><p>Let’s start by importing a few essentials. We’re going to use React of course, and since we plan using side-effects (mouse-events) we fetch useEffect while we’re at it. useSpring is the hook we’re going to animate with.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UENHCFgPVL45HaklS4-W4Q.jpeg" /></figure><h4>Forming a trail</h4><p>Next we’re going to create a pure function, this is critical, <em>you can only use hooks in functions</em>, and they need to be declared in top-function scope.</p><p>useSpring creates a persistent hook that takes raw values and returns animated values, which are later bound to a view. You can update your spring by overwriting the hook, it will remember previous values and animate adaptively. Additionally useSpring returns an updater, similar to useState, with the distinction that the set function will not cause the component to render, which is useful in situations where you are dealing with event input. We want the spring to update, and the view to animate, without refreshing the component on every mouse-move.</p><p>One goo-drop follows the mouse, while the others should trail, we do this by referencing the animated values so that one spring naturally follows the output of another.</p><p>Finally we define a basic function that takes [x, y] and forms a css-transform-statement, we need this for interpolation later on. A little trick that i learned once, you can stack transforms, so we shift blobs to mouse-coordinates first, then shift them half their size back so that they are cursor-centric.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f5aZVH10tDQ7qGe6bB3w6A.jpeg" /></figure><h4>Handling the mouse</h4><p>useEffect is Reacts way of creating a side-effect. We would like to register an event-handler on mount and unregister it on unmount, additionally we need to listen for mouse-movements in order to update our spring, this is where the set function mentioned above comes into play. Notice how we only need to update the first spring, since the others will follow naturally (with slightly slower spring configs).</p><p>The [] in the end of useEffect prevents React from running it every update, think of it ascomponentDidMount and componentWillUnmount combined into one effect.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VAw02SA14_vh79E5mFko7A.jpeg" /></figure><h4>Creating an SVG filter</h4><p>This step is straight forward, we drop an SVG with a gaussian blur and a color matrix into the scene. Everything is explained <a href="https://css-tricks.com/gooey-effect/">here</a> in detail. In synthesis, all we do is animate a couple of shapes while the SVG filter will later do its thing and make it appear as if they would merge together.</p><p>A small warning while we’re at it, sadly some browsers still struggle with filters or can’t process them on the GPU (which can make it <em>very</em> slow). I wouldn’t exactly recommend putting this on your website.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FnmP1rNUwCxIG-HJa5IWGw.jpeg" /></figure><h4>Rendering out the animated blobs</h4><p>This is the last step and we’re already done. Here we simply define a couple of divs and animate their transforms. We are extending the divs fromanimated which allows react-springs to <a href="http://react-spring.surge.sh/perf">animate outside of react</a>. We take the transform that we defined earlier, apply it, and this is it. Wasn’t so hard, was it?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*45PPsfW3icTnYfBNHfjBCQ.jpeg" /></figure><p>Et voilà, and this is how it looks …</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodesandbox.io%2Fembed%2Fppxnl191zx&amp;url=https%3A%2F%2Fcodesandbox.io%2Fs%2Fppxnl191zx&amp;image=https%3A%2F%2Fcodesandbox.io%2Fapi%2Fv1%2Fsandboxes%2Fppxnl191zx%2Fscreenshot.png&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codesandbox" width="1000" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/82460efcd0258268194cfb8bda917708/href">https://medium.com/media/82460efcd0258268194cfb8bda917708/href</a></iframe><p>Hope it was fun!</p><p>My name is Paul Henschel, i am based in St. Gallen, Switzerland. I am the founder of <a href="http://v2.luxundlaune.com/">Luxundlaune</a>, a photography platform in Germany, <a href="http://paranoidandroid.co/">Paranoidandroid</a>, a custom rom for Android and several minor open source projects.</p><p>You can reach me on <a href="https://twitter.com/0xca0a">Twitter</a> and on <a href="http://github.com/drcmda">Github</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c6c436ad7ee4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React-spring 6.0 is out of beta ]]></title>
            <link>https://medium.com/@drcmda/react-spring-6-0-is-out-of-beta-533ad6c8b4a?source=rss-ace940cf89ce------2</link>
            <guid isPermaLink="false">https://medium.com/p/533ad6c8b4a</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Paul Henschel]]></dc:creator>
            <pubDate>Wed, 24 Oct 2018 17:16:03 GMT</pubDate>
            <atom:updated>2018-10-25T10:27:54.499Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*9sY2FahBWoKJkhesHeNuNg.gif" /><figcaption>react-spring remains as versatile as ever</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*kC04IczcRw6LNDhbtnuIyg.gif" /><figcaption>Springs being as versatile as ever</figcaption></figure><p>When i published <a href="https://blog.usejournal.com/why-react-needed-yet-another-animation-library-introducing-react-spring-8212e424c5ce">Why React needed yet another animation library. Introducing: react-spring</a> what feels like an eternity ago, i had no idea the library would grow into what it is today. It is reaching 8.000 stars on Github, powers 1.300 projects and over 60 dependencies. It reached 26.000 downloads per week on npm. Considering that i made it initially for myself i didn’t expect much when sharing it, but i am more than happy to see that it enables others as well to cast ideas into motion.</p><p>People have been very kind, helping out, funding a little, suggesting things or adding issues — and so far it’s been quite nice for open source, which, as you know, can also take graver turns.</p><p>So it’s that time again, i’ve been testing limits, took polls, collected all sorts of suggestions and ideas. And a while ago i started preparing a major. Of course i had no idea that i would end up writing the thing from scratch. The changes this time around are <strong>massive</strong>, though i kept api changes to a minimum in order to not create a situation that would cause painful upgrades.</p><h4><em>The focus of react-spring remains untouched: no magic, simplicity and declarative expression.</em></h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*P3CvrmLmq3_lKi-SUdk6IQ.gif" /><figcaption>Transitions have a more straight forward api</figcaption></figure><p>I am still certain that this is the best way to animate. I loved the way <strong>react-motion</strong> used render-props, handing out interpolated values instead of masking animations with wrapper-components doing magic things in the background. And of course how the <strong>animated</strong> library could bypass React when animating and interpolate complex data was also a big influence. Both are still the main inspiration.</p><p>The main focus of the release were features and suggestions that came up over time. A full overview can be found here: <a href="https://github.com/drcmda/react-spring/releases/tag/v6.0.0">https://github.com/drcmda/react-spring/releases/tag/v6.0.0</a></p><p>In essence, react-spring 6.0 has further reduced the underlying <strong>animated</strong> underpinnings, making it faster (by sharing one combined requestAnimationFrame-loop per spring), more flexible and a little bit leaner, too. It runs on a different spring mechanism as well (<a href="https://gafferongames.com/post/integration_basics/">from RK4 to SEE</a>).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*S9e-c1BXb4QoZX5tpGVDeQ.gif" /><figcaption>As well as Trails</figcaption></figure><p>Further additions were slight api changes in order to make it less confusing in some edge cases, lots and lots of new features and capabilities that are too many to list here, inbuilt durations, multistage and trailing transitions, being able to reverse animation, end-state props that are applied after animations conclude (good for settings <em>display: ‘hidden’</em> and things like that), and so on.</p><p>Last but not least i’ve used <a href="https://docz.site/">docz</a> to document the api. There are lots of small examples and playgrounds to toy with now: <a href="http://react-spring.surge.sh/6x">http://react-spring.surge.sh</a> and i hope this makes it easier for beginners to start.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pxh2sOrk86fpmwceyt6aKw.gif" /><figcaption>A ~40 line notification hub using multi-stage transition. An extreme case, but it demonstrates how deep the new api can go.</figcaption></figure><p>TLDR, If you haven’t tried react-spring before, now’s the perfect time. 😉</p><p>My name is Paul Henschel, i am based in St. Gallen, Switzerland. I am the founder of <a href="http://v2.luxundlaune.com/">Luxundlaune</a>, a photography platform in Germany, <a href="http://paranoidandroid.co/">Paranoidandroid</a>, a custom rom for Android and several minor open source projects.</p><p>You can reach me on <a href="https://twitter.com/0xca0a">Twitter</a> and on <a href="http://github.com/drcmda">Github</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=533ad6c8b4a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Why React needed yet another animation library. Introducing: react-spring]]></title>
            <link>https://medium.com/@drcmda/why-react-needed-yet-another-animation-library-introducing-react-spring-8212e424c5ce?source=rss-ace940cf89ce------2</link>
            <guid isPermaLink="false">https://medium.com/p/8212e424c5ce</guid>
            <category><![CDATA[design]]></category>
            <category><![CDATA[web-design]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[animation]]></category>
            <dc:creator><![CDATA[Paul Henschel]]></dc:creator>
            <pubDate>Tue, 10 Apr 2018 00:41:07 GMT</pubDate>
            <atom:updated>2019-01-28T19:51:04.318Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BBDQQbu_osRzV0fLHme3IA.gif" /><figcaption>Some of the available building blocks</figcaption></figure><p>Ever since i started developing i was fascinated by the vividness of animated applications, they felt alive. And we sure have come a long way, too. There are dozens of tools to choose from today. From tweening libraries to full fledged declarative options, especially in the React world.</p><p>The prevalent options today are <a href="https://github.com/chenglou/react-motion">react-motion</a>, <a href="https://github.com/animatedjs/animated">animated</a>, <a href="https://github.com/react-tools/react-move">react-move</a>, <a href="https://github.com/Popmotion/popmotion">popmotion</a> and a couple of others. All of them have incorporated incredible ideas over time, some have changed the way we think of implementing movement. I would primarily like to credit react-motion for that in particular.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F1tavDv5hXpo%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D1tavDv5hXpo&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F1tavDv5hXpo%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ac6f39e4d622f43c8d3a5f1a0fd95975/href">https://medium.com/media/ac6f39e4d622f43c8d3a5f1a0fd95975/href</a></iframe><h3>Polar opposites</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PPm2vtzIFXT94FTKnZH_bg.png" /></figure><p>In practice however things were not always so bright as the freedom of dom-oriented tweening tools has often been lost in translation. Despite the many merits, some of these libraries had shortcomings that were hard to overlook, some could not interpolate data for instance, were complex and unwieldy, a bit slow as they would let React render each frame of the animation, or lacked declarative components, which meant managing loose-end animation handles.</p><p>One day it struck me that the time i have been putting into working around animation related troubles could perhaps be spent bringing them together, befriending them so to say. That day <a href="https://github.com/drcmda/react-spring">react-spring</a> was born.</p><figure><a href="https://blog.usejournal.com/meet-journal-d222fce8db1d"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PMBwoU5bWkso8M2A1ocS9Q.png" /></a></figure><h3>What makes it so different then?</h3><p>React-spring is based on a cooked down, simplified animated fork. You may know animated from react-native already, and if not check out the following slides in which Christopher Chedeau explains how it works.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fspeakerdeck.com%2Fplayer%2F14431c5ed144416f8c81bc751335d55d&amp;url=https%3A%2F%2Fspeakerdeck.com%2Fvjeux%2Freact-rally-animated-react-performance-toolbox&amp;image=https%3A%2F%2Fspeakerd.s3.amazonaws.com%2Fpresentations%2F14431c5ed144416f8c81bc751335d55d%2Fslide_0.jpg&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=speakerdeck" width="710" height="507" frameborder="0" scrolling="no"><a href="https://medium.com/media/797b2eedf433cd9b43586158f4a67122/href">https://medium.com/media/797b2eedf433cd9b43586158f4a67122/href</a></iframe><p>It was turned into a barebones foundation that now drives lean and inexpensive building blocks or primitives. This combination of a rock solid low-level foundation with all its benefits and declarative abstractions becomes extremely valuable as it lends to an eco system of modular building blocks.</p><p>Such primitives could do just about anything. One shifts data from here to there, one trails, one transitions between lifecycle changes, one parallaxes pages, one orchestrates, and so on.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2mAeKnsYfBNWSoAr2mVBSg.png" /><figcaption>Transitions as we would normally think of them</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YNiMDFdl_SvjmEx0qtvBcQ.png" /><figcaption>This stuff is not so hard in react-spring at all</figcaption></figure><p>At the same time the focus is on absolute simplicity. Things that would usually get hairy as you are shaping your code around a library’s specific demands can be done in a couple of lines now without warping the data at all.</p><p>The most trivial implementation however can only go so far and complex use-cases demand fine control. React-spring’s premise is: simplicity first, but its properties are flexible enough to support both simple and complex use-cases.</p><h3>Can it interpolate?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*34Z1IrhubYFOodBXECBovg.png" /></figure><p>Oh yes it can. It will move effortlessly between most of the webs units, from colors, percentages, arrays, vectors, lenghts, SVG paths, and so on. This means you can animate actual, non-numeric data. There are also means for ranges, clamping, and custom interpolators.</p><h3>What about performance?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KPegy6qqg9xw5hvTRUYppg.jpeg" /><figcaption>Letting React render frames chokes the CPU (react-motion/move, etc.)</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sY6SK3IIc5yZLKsw42LYkQ.jpeg" /><figcaption>Animating outside of React via requestAnimationFrame (animated, react-spring)</figcaption></figure><p>One of the strengths of animated is that it can apply animations <em>natively</em> without relying on React to render updates frame by frame like virtually all other React animation libraries do. React-spring thereby benefits from animated’s clever rendering model.</p><p>The difference may not be apparent in simple situations, but try a nested chart and React will plow through the CPU, choking the browsers frame budget.</p><p>Applying updates outside of React has strict limits as you can only animate dom-native styles and attributes since generic React components do not have a representation in the dom, but here you can choose between both models by supplying the <em>native</em> flag.</p><p>Animated is equipped to handle full-native drivers as well, so in the future, should web animations gain more support, it would even be possible to do all the animation in the compositor thread. But for now react-spring can be compared to gsap or d3, which animate in a requestAnimationFrame loop as well.</p><h3>Are declarative primitives really enough?</h3><p>For most UI related tasks, maybe, but for anything that involves staging and orchestration — it probably isn’t enough.</p><p>The lack of imperative animation can sometimes hurt, and one of the hardest bits in most of the libraries today is switching between primitives, for instance moving something with a spring first, trailing its elements into place, then transition additions and removals. As you can imagine, doing this declaratively is almost futile as it would mean slicing and dicing the heck out of your code. This is where traditional tweening libraries shine.</p><p>While it is still highly experimental at the moment, react-spring already seeks ways to blend scripting and composition, which might offer more freedom when it comes to chaining and orchestration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TvN0nBQ70MganNgZzR2-QA.gif" /><figcaption>Scripting two individual elements, a sidebar and its options that trail in and out</figcaption></figure><h3>Conclusion</h3><p>If you haven’t, <a href="https://github.com/drcmda/react-spring">give it a shot</a>. You can run most of the flashy examples above here: <a href="https://github.com/drcmda/react-spring/tree/master/examples">https://github.com/drcmda/react-spring/tree/master/examples</a> and many of them have code-sandboxes for toying around on the Github page.</p><p>I promise you will rub your eyes in disbelief when seemingly complex things are worth just a couple of lines of code. And perhaps, and that is my dearest wish, it will make your work easier and inspire you to confidently cast ideas into moving interfaces.</p><p>If you have any troubles or specific wishes and use-cases, be sure to open up an issue and i am happy to engage. I am also looking for contributors and would love to explore the possibilities together.</p><p>My name is Paul Henschel, i am based in St. Gallen, Switzerland. I am the founder of <a href="http://v2.luxundlaune.com/">Luxundlaune</a>, a photography platform in Germany, <a href="http://paranoidandroid.co/">Paranoidandroid</a>, a custom rom for Android and several minor open source projects.</p><p>You can reach me on <a href="https://twitter.com/0xca0a">Twitter</a> and on <a href="http://github.com/drcmda">Github</a>.</p><figure><a href="https://usejournal.com/?utm_source=medium.com&amp;utm_medium=noteworthy_blog&amp;utm_campaign=guest_post_image"><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*f2IVAl0TbsfES9cFGYr40g.png" /></a></figure><p>📝 Read this story later in <a href="https://usejournal.com/?utm_source=medium.com&amp;utm_medium=noteworthy_blog&amp;utm_campaign=guest_post_read_later_text">Journal</a>.</p><p>🗞 Wake up every Sunday morning to the week’s most noteworthy Tech stories, opinions, and news waiting in your inbox: <a href="https://usejournal.com/newsletter/?utm_source=medium.com&amp;utm_medium=noteworthy_blog&amp;utm_campaign=guest_post_text">Get the noteworthy newsletter &gt;</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8212e424c5ce" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>