<?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 Flow on Medium]]></title>
        <description><![CDATA[Stories by Flow on Medium]]></description>
        <link>https://medium.com/@createwithflow?source=rss-b8f907a7d5cb------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*9AnCBLztHxelIf-eLyhOSQ.png</url>
            <title>Stories by Flow on Medium</title>
            <link>https://medium.com/@createwithflow?source=rss-b8f907a7d5cb------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 12:42:24 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@createwithflow/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[Code We Trust]]></title>
            <link>https://medium.com/swlh/code-we-trust-5cae93e24215?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/5cae93e24215</guid>
            <category><![CDATA[ui-design]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[code-export]]></category>
            <category><![CDATA[flow]]></category>
            <category><![CDATA[swift]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Sat, 07 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-12T19:33:06.573Z</atom:updated>
            <content:encoded><![CDATA[<p><strong>Flow’s code export is excellent, and for good reason.</strong></p><p>First, we’ve been producing award-winning interactive media, installations, and cutting edge interfaces for more than a decade. Flow is the culmination of all of those years of practice and of immersing ourselves in art, tech, and design. We’ve used pretty much every piece of software you can think of, and draw on all our experience to produce Flow. If you want to dive into our background, please check out <a href="https://createwithflow.com/blog/the-roots-of-flow/">The Roots of Flow</a>.</p><p>Second, we’re experts at writing animation software. Our roots in this started way, way, waaaaay, back with Processing (Java), OpenFrameworks (C++), and transitioned to Objective-C and every version of Swift and Core Animation along the way. Then we jumped to the web where we’re confident in saying “we know our shit” when it comes to the most advanced, native approach for creating animations in the browser: the Web Animations API. Along the way we’ve learned a lot of tricks, and all of that experience is manifest in Flow’s code export. We’ve published a high-level article of our thoughts on <a href="https://createwithflow.com/blog/control-craftsmanship/">Control, Craftsmanship and Code Export</a> that is definitely worth a read.</p><p>If you’re reading this article because you’re looking for proof that Flow lives up to its claim, that it ships Production-Ready software, then you’re in for a treat.</p><h4>Preface: A Swift Context</h4><p>Flow can generate many different kinds of media files and software, which makes it difficult to show a complete and comprehensive account of every design and architectural decision we made in the production of its code export capability. <em>However, the decision-making and philosophy behind our approach to designing, architecting, and producing exported code is consistent across all formats.</em> So, while this article will heavily focus on Swift code, Core Animation, Xcode and iOS as the basis for exploring patterns… our approach applies to all other exports.</p><h3>Defining Animation</h3><p>An animation can be broken down into two main categories: style and timing. By style, I mean the layout, colors, and visual form of the elements that are a part of the animation. By timing, I mean the pacing of changes to the visual style over time.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*46kPWdgZz5W3lLhjnVFgkQ.gif" /><figcaption>Style and layout v. Changes Over Time</figcaption></figure><p>From a software point of view, these two elements can be understood as (visual) properties and timing functions.</p><h3>The Syntax of Motion</h3><p>In the world of iOS, the technology for rendering, composing and animating visual elements is called Core Animation — in the browser the Web Animations API is very similar. Core Animation is a powerful framework that allows a developer to configure parameters and trigger animations to occur. Two of its main strengths are that it basically hands off the compositing of animations to graphics hardware — you don’t have to worry about the in-between moments of your animations — and that it actually defines a nearly universal model for representing animation as software.</p><h4>Layers</h4><p>When you look at a mobile app you might see tweets, or music videos, or controls to play your favourite podcast. However, what you’re actually looking at are a complex set of layers that, when overlaid upon one another, make up the entirety of an apps interface. On iOS there are two types of layers: image layers and shape layers. These layers have properties you can set, many of which are visual — shadows, paths, images, borders, etc. — and are defined by values which are often numerical.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*R4dg5V3RUvWUpfUu.png" /><figcaption>Check out all the layers in this one view!</figcaption></figure><p>Here’s an example of setting a property on a layer.</p><pre>ourLayer<strong>.</strong>opacity <strong>=</strong> 0.5 <em>//set its value to 50% opacity</em></pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*PzpzXnGu89IEaDJAYvBDrA.gif" /></figure><p>Most, but not all, visual properties can be animated. Here a complete list of animatable properties for iOS.</p><h4>Animations</h4><p>The simplest form for iOS is called an implicit animation. The default behaviour on iOS is that if a value changes, it animates over a 0.25s period.</p><pre>ourLayer<strong>.</strong>position <strong>=</strong> newPosition <em>//move an object</em></pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*oCBmlCxsK9SBUpy4f2dAWg.gif" /></figure><p>For a bit more control than this, the technique is to create an animation object. The animation above, when created as an object, looks like this:</p><pre>let anim <strong>=</strong> CABasicAnimation(keyPath: &quot;position&quot;) <br>anim<strong>.</strong>fromValue <strong>=</strong> ourLayer<strong>.</strong>position <br>anim<strong>.</strong>toValue <strong>=</strong> newPosition <br>anim<strong>.</strong>duration <strong>=</strong> 1.0 ourLayer<strong>.</strong>add(anim, forKey: anim<strong>.</strong>keyPath)</pre><p>The key difference here, is that when you create an animation like this you can specify parameters for the animation itself. This animation now takes 1.0s to complete its transition to move from one position to another.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*xLkpPZDtYFOq0Z3QdP2huQ.gif" /></figure><h4>Chaining Animations</h4><p>Thinking about animations in this way becomes increasingly difficult when you want something more advanced to happen. Imagine you want an element to fade in and fade out. Seems simple, right? Well that animation effect actually needs to be broken down into two opacity animations.</p><pre>let animIn = CABasicAnimation(keyPath: &quot;strokeWidth&quot;)<br>animIn.fromValue = 0<br>animIn.toValue = 60<br>animIn.duration = 1.0<br>ourLayer.add(animIn, forKey: anim.keypath)<br>animIn.delegate = self</pre><pre>let animOut = CABasicAnimation(keyPath: &quot;strokeWidth&quot;)<br>animOut.fromValue = 60<br>animOut.toValue = 0<br>animOut.duration = 1.0<br>animOut.isRemovedOnCompletion = false<br>animOut.fillMode = .forwards<br>ourLayer.add(animOut, forKey: anim.keypath)</pre><p>This is actually two animations, the first from 0 ➔ 60 and the second from 60 ➔ 0.</p><p>Notice how things are getting complicated? You need to know to remove animations (or not), you need to know how to set the fillMode, and even set the delegate for the first animation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*NeuX0MHkE97nTgmfKjhS-g.gif" /><figcaption>Two animations for the stroke width: 0 ➔ 60 and 60 ➔ 0</figcaption></figure><p>The explicit animation approach (above) gets unruly very, very fast. The solution to this is to use keyframe animations, which let you set values and timing functions.</p><p>Here is the same animation as above, using keyframes:</p><pre>let anim = CAKeyframeAnimation(keyPath: &quot;opacity&quot;)<br>anim.values = [0, 60, 0]<br>anim.keyTimes = [0, 0.5, 1]<br>anim.duration = 2.0<br>anim.fillMode = .forwards<br>anim.isRemovedOnCompletion = false<br>ourLayer.add(anim, forKey: &quot;opacity&quot;)</pre><p>Easier. Cleaner. But, still with a level of complexity. You need to think of your animation timing in terms of values from 0…1 and how those translate to the overall duration of the animation.</p><h4>Easing</h4><p>Let’s have a look at easing. Here’s an animation that animates the movement of a layer from the bottom to the top of its frame and back. In iOS, the default easing curve is Ease In Out.</p><pre>let anim = CAKeyframeAnimation(keyPath: &quot;position.y&quot;)<br>anim.values = [100, 0, 100]<br>anim.keyTimes = [0, 0.5, 1]<br>anim.duration = 2.0<br>anim.fillMode = .forwards<br>anim.isRemovedOnCompletion = false<br>ourLayer.add(anim, forKey: &quot;position.y&quot;)</pre><p>Let’s say you want to use two different timing functions for each part of the animation. You would do something like this:</p><pre>anim.timingFunctions = [CAMediaTimingFunction(name: .easeIn), CAMediaTimingFunction(name: .easeOut)]</pre><p>Great, but the problem with this is that most animation engines have only a basic set of predefined easing curves. In iOS, these are easeIn, easeInOut, easeOut and linear. What if you wanted something custom, say from <a href="https://easings.net/">easings.net</a>. Well, you&#39;d have to roll your own timing function like so:</p><pre>let cubic = CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19)<br>let back = CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55)<br>let custom = CAMediaTimingFunction(controlPoints: 1, 0, 0.66, 1)</pre><p>Here is what these timing functions look like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*8WgP9MOJHRCqb2NgvyTl6Q.gif" /></figure><h4>Other Animation Things</h4><p>Other things to consider with animations are:</p><ul><li>paths</li><li>gradients</li><li>round corners</li><li>groups</li><li>snapping from one value to another</li><li>multiple animations for multiple properties on the same layer</li><li>reversing complex animations</li><li>reversing complex animations with custom easing curves</li><li>managing animation states</li><li>adding controls (e.g. ability for a user to pause an animation)</li><li>rotations and transforms</li></ul><p>This is just a small, small list of things to thing about when writing out animation code, and one of the main reasons why getting animation into your apps is difficult, time consuming and expensive.</p><h3>Flexible, Robust and Easy</h3><p>The best way to write animation code is to be clean clean, modern and consistent. But, that’s just one part of how we approach exporting production-ready animations. The other critical component is making it easy to interact with and control the software.</p><h4>A View &amp; A Timeline</h4><p>Every animation, no matter how complex, is broken down into two classes of files: a view and a timeline. This dichotomy makes it easy to identify and modify the layout of the animation, and separates the animation code into its own class that can be hot-swapped if needed.</p><h4>AnimationView</h4><p>An animation’s view is a subclass of UIView which means it works exactly like a native view on iOS. Each animation is given a unique name when it is exported, so you&#39;ll see things like this:</p><ul><li>DialedView</li><li>GradientRingView</li><li>GriddyView</li></ul><p>A view gets created just like a normal UIView:</p><pre>let view <strong>=</strong> DialedView(frame: frame)</pre><p>After initializing, the view runs its setup and creates each layer in your animation:</p><pre>private func createViews() {<br>  CATransaction.suppressAnimations {<br>    createDial()<br>    createMask()<br>    createBars()<br>    //etc...<br>  }<br>}</pre><p>See that suppressAnimations block? That&#39;s an incredibly handy trick we created after years of mastering Core Animation.</p><p>As you can see, there will be a unique method constructing each layer:</p><pre>private func createDial() {<br>  dial = ShapeView(frame: CGRect(x: 18.5, y: 18.5, width: 32, height: 32))<br>  dial.backgroundColor = UIColor.clear<br>  dial.layer.position = CGPoint(x: 18.5, y: 18.5)<br>  //etc...<br>}</pre><p>As an added touch, we have a great method for scaling your view:</p><pre>public func scale(to size: CGSize) {<br>  let x = size.width / Defaults.size.width<br>  let y = size.height / Defaults.size.height<br>  transform = CGAffineTransform(scaleX: x, y: y)<br>}</pre><p>This scale method makes it really easy for a developer to quickly resize the animation based on layout constraints.</p><h4>AnimationTimeline</h4><p>The timeline is a unique class that encapsulates pure Core Animation code. Each timeline is given a unique name when it is exported, so you’ll see things like this:</p><ul><li>DialedTimeline</li><li>GradientRingTimeline</li><li>GriddyTimeline</li></ul><p>The really cool thing is that you can pass a view into a timeline. This means that the timeline can be reused on multiple views — very handy for buttons that should all have the same animation.</p><pre>DialedTimeline(view: dialed, duration: 2)</pre><p>If you want your animation to repeat and/or reverse, there are options for that:</p><pre>DialedTimeline(view: dialed, duration: 2, repeatCount: 10, autoreverses: true)</pre><p>The timeline contains playback controls:</p><ul><li>timeline.play()</li><li>timeline.pause()</li><li>timeline.stop()</li><li>timeline.reset()</li><li>timeline.offset(to: time)</li></ul><p>There are some other fancy controls, but you get the idea… things are straightforward.</p><p>The timeline will have a unique method that generates a keyframe animation for any animated layers in your file:</p><pre>let transform_rotation_z_dial: CAKeyframeAnimation = {<br>  let anim = CAKeyframeAnimation()<br>  anim.keyPath = &quot;transform.rotation.z&quot;<br>  //etc...<br>  return anim<br>}()</pre><h3>Architected for Animation</h3><p>Every project exported from Flow has a carefully crafted structure that employs a forward-thinking approach to integrating animations into your products.</p><h4>Common Files — Not a Library</h4><p>As we’ve mentioned above, animation code can be very unruly. Over the years, as we’ve come to master Core Animation, we’ve created a few tricks along the way that help make making animations easier.</p><p>These “tricks” are encapsulated in a set of files we call <a href="https://createwithflow.com/api/flowcommon">FlowCommon</a>. There are two versions of this, one for <a href="https://createwithflow.com/api/flowcommon/ios">iOS</a> and the other for <a href="https://createwithflow.com/api/flowcommon/web">Web</a>, both of which have their own CocoaPods. Most of the files in this collection are very minimal, adding a convenience function or two.</p><p>For example, the CATransaction+Extension.swift file has only this method in it:</p><pre>extension CATransaction {<br>  static public func suppressAnimations(actions: () -&gt; Void) {<br> begin()<br> setAnimationDuration(0)<br> actions()<br> commit()<br>  }<br>}</pre><p>An incredibly handy method for turning off the default 0.25s animation during setup.</p><p><a href="https://createwithflow.com/api/flowcommon">FlowCommon</a> is not a library. The majority of files have less than 20 lines of actual code in them, so these are very easy for a developer to review and approve.</p><h4>Interface Files Made Easy</h4><p>Our Xcode projects have a Main.storyboard file that contains a view. For our basic iOS export, that view’s class is the unique AnimationView for your animation. The elegance of this approach means you can easily change the class of a view into an animation view via Interface Builder.</p><p>For more custom exports like our iOS Custom Activity Indicator, the animation view may be embedded dynamically into a native view.</p><pre>private func setup() {<br>  view = createView()<br>  addSubview(view)<br>}</pre><pre>override func createView() -&gt; UIView {<br>  return dialed<br>}</pre><pre>private lazy var dialed: DialedView = {<br>  let view = DialedView(frame: .zero)<br>  view.scale(to: frame.size)<br>  return startView<br>}()</pre><p>This approach is consistent with being able to add a native component to your Interface Builder file, then simply change it’s class to the custom one exported from Flow.</p><p>Everything exported from Flow is a native component for the platform. In the case of iOS, an animation view is a UIView and an animated spinner is actually a UIActivityIndicatorView. In each case, the animation is &quot;slipped&quot; in to the native element.</p><p><a href="https://createwithflow.com/assets/images/blog/code-we-trust/verynice.gif">Very Nice</a>.</p><blockquote>And if you look very closely, you’ll see that every project exported from Flow shows you how to add a loading animation to your app!</blockquote><h3>Trusting Generated Code</h3><p>Animations can be big or small. Launch and onboarding animations are great places to put in a lot of effort, nuance and beautiful added touches. In contrast, micro-animations can create real moments of delight when users interact with otherwise mundane elements of an interface, like buttons, sliders, and loading indicators.</p><p>From a software perspective, there very little difference between the simple and complex animations. In the end, they’re just a collection of keyframe animations being triggered at the right points in time.</p><h4>Animation Code is Boring</h4><p>Animation code is actually a very mundane thing to write. You create a layer, set up its initial properties, you create some animations and apply them to the layer when things are supposed to kick off. You do this over, and over, and over, and over again for every property and every layer. If you do things properly, then writing animation code really just a whole bucketful of lather, rinse, repeat.</p><ol><li>choose a property</li><li>set its value(s)</li><li>set its easing(s)</li><li>choose a duration</li><li>trigger it</li></ol><p>These 5 main steps are just repeated for every layer, and every animation throughout your apps.</p><p>It’s mundane.</p><p>It’s boring.</p><p>It’s trivial and…</p><p><strong>That’s a very good thing.</strong></p><h4>Generated Code is Trustworthy Code</h4><p>When there is little variability in the kind of code that you need to produce, then using generated code is by far the best way to get things done. If you know the patterns you need to produce, you can easily set up a generator to do the heavy lifting for you. That generator will follow the rules you define, systematically, accurately, every single time.</p><p>If you trust the rules that govern the generator, then it follows that the code being generated is trustworthy.</p><h3>50 Activity Indicators</h3><p>Until now we’ve mostly been looking at animations from a high-level perspective. So, I’d like to end this article by looking at real-world examples of code generated from Flow.</p><p>We recently published an open-source project with 50 custom iOS Spinners, that express a wide variety of animation techniques. Here’s a few examples with some code excerpts to show how things work.</p><h4>Dialed</h4><p>This animation is really interesting. The effect looks really complicated, but the technique is quite simple.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*gfWStGBeovUUa62NPXSISA.gif" /></figure><p>We call the whole element dial , which is essentially a layer with a doughnut as a mask.</p><pre>let dialMask = CAShapeLayer()<br>dialMask.path = CGPathCreateWithSVGString(&quot;M16,0c-8.837,0,-16,7.163,-16,16 0,8.837,7.163,16,16,16 8.837,0,16,-7.163,16,-16 0,-8.837,-7.163,-16,-16,-16zM16,8c4.418,0,8,3.582,8,8 0,4.418,-3.582,8,-8,8 -4.418,0,-8,-3.582,-8,-8 0,-4.418,3.582,-8,8,-8zM16,8&quot;)!<br>dial.layer.mask = dialMask</pre><p>Inside that layer is a group of 5 bars of color.</p><pre>dial<strong>.</strong>addSubview(bars)</pre><p>The bars group moves through the mask in a downward angle.</p><pre>anim<strong>.</strong>keyPath <strong>=</strong> &quot;position.x&quot; <br>anim<strong>.</strong>values <strong>=</strong> [<strong>-</strong>34, 67]  </pre><pre>anim<strong>.</strong>keyPath <strong>=</strong> &quot;position.y&quot; <br>anim<strong>.</strong>values <strong>=</strong> [<strong>-</strong>34, 67]</pre><p>The top layer rotates.</p><pre>anim<strong>.</strong>keyPath <strong>=</strong> &quot;transform.rotation.z&quot; <br>anim<strong>.</strong>values <strong>=</strong> [0, 6.28319] <em>//aka 2𝜋, aka 360°</em> <br>anim<strong>.</strong>keyTimes <strong>=</strong> [0, 1]</pre><h4>Griddy</h4><p>Here’s an interesting visual effect that you get by running the same animation 16 times, on 16 identical squares in a grid, with their start times offset by a little bit.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*IXt2hmtMRfALtz4VJTPpQw.gif" /></figure><p>The trick with this one isn’t to animate the size of the squares, rather the <strong>line widths of their edges</strong>!</p><pre>anim.keyPath = &quot;lineWidth&quot;<br>anim.values = [4, 4, 0, 0, 4, 4]<br>anim.keyTimes = [0, 0.205479, 0.547945, 0.719178, 0.993151, 1] <br>anim.timingFunctions = [.linear, CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19), .easeInEaseOut, CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1), CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19)]</pre><p>As you can also see, we’re using some custom easing curves as well — specifically cubic-in and cubic-out.</p><h4>Gradient Ring</h4><p>You can simulate a ring with gradient color by using masks in a sneaky way.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*GDGLLW24JbShvjYgFSoFHA.gif" /></figure><p>First, create a gradient.</p><pre>let startPoint = CGPoint(x: 0.5, y: -0.0450368)<br>let endPoint = CGPoint(x: 0.5, y: 1)<br>let colors = [UIColor(red: 0.463, green: 0.275, blue: 0.988, alpha: 1).cgColor, UIColor(red: 0.314, green: 0.888, blue: 0.76, alpha: 1).cgColor]</pre><p>Then apply a mask:</p><pre>gradient<strong>.</strong>layer<strong>.</strong>mask <strong>=</strong> foregroundCircle<strong>.</strong>layer</pre><p>To make the ring, the foreground circle has a clear color:</p><pre>foregroundCircle<strong>.</strong>shapeLayer<strong>.</strong>fillColor <strong>=</strong> nil</pre><p>Then, animate the path of the foreground circle:</p><pre>anim.keyPath = &quot;strokeStart&quot;<br>anim.values = [0.75, 0.7, 0, 0]<br>anim.keyTimes = [0, 0.17, 0.55, 1] <br>anim.timingFunctions = [.easeInEaseOut, .easeInEaseOut, .easeInEaseOut]</pre><pre>anim.keyPath = &quot;strokeEnd&quot;<br>anim.values = [1.001, 1.001, 0.25, 0.25]<br>anim.keyTimes = [0, 0.32, 0.55, 1] <br>anim.timingFunctions = [.linear, .easeInEaseOut, .easeInEaseOut]</pre><h3>Finesse == Flow</h3><p>The animations in this article were all made with Flow, and while it is very possible to make all of these by hand, the speed at which I was able to create these and level of detail in the software would be impossible to achieve without Flow.</p><p>Take the keyTimes from the Griddy example:</p><pre>anim<strong>.</strong>keyTimes <strong>=</strong> [0, 0.205479, 0.547945, 0.719178, 0.993151, 1]</pre><p>The smooth poppiness of the animation comes from my playing around with the distribution of keyvalues while watching the animation on loop. Only when I was happy with the outcome did I export the animation to code. If I coded this by hand there’s no way I’d ever be able to consider these values.</p><p>Instead, I might only be able to think through them in fairly “round” numbers, which would strip away the finesse that makes the animation really nice. On my own, I would come up with:</p><pre>anim<strong>.</strong>keyTimes <strong>=</strong> [0, 0.25, 0.5, 0.75, 1, 1]</pre><p>But here’s the thing…<em> </em><strong><em>I would never spend time hand-coding the Griddy animation. </em></strong>My experience tells me that it would to take way too long for something so small as a loader.</p><p>If someone brought me this animation, made with Flow, I’d drop it in my project in a heartbeat.</p><p><em>“Why?”</em></p><p><strong>Because I know that the code-generator behind Flow is reliable, and the code it exports is a reflection of decades of experience and a great deal of </strong><a href="https://createwithflow.com/blog/control-craftsmanship"><strong>craftsmanship</strong></a><strong>.</strong></p><p>If there’s anything you can take away from this article, I hope it’s this:</p><blockquote><em>I</em><strong><em> trust the code </em></strong><em>that Flow ships, and so can you.</em></blockquote><p><em>Originally published at </em><a href="https://createwithflow.com/blog/code-we-trust/"><em>https://createwithflow.com</em></a><em> on November 7, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5cae93e24215" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/code-we-trust-5cae93e24215">Code We Trust</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Roots of Flow]]></title>
            <link>https://createwithflow.medium.com/the-roots-of-flow-b4c548bdc4ca?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/b4c548bdc4ca</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[flow]]></category>
            <category><![CDATA[interaction-design]]></category>
            <category><![CDATA[roots]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Thu, 05 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-10T16:53:09.306Z</atom:updated>
            <content:encoded><![CDATA[<p><em>This article is a set piece of a series of writings which are an exposition of our thoughts, experience, and reflections from working in design and development wheelhouses, about the SDLC, and the current composition of that workflow, and how things can, could, or we think will evolve.</em></p><p>A year before the first iPhone blew people’s minds, I graduated with an Interactive Arts degree that I was a few years late on starting, and I was madly passionate to find a job as an Interaction Designer — a role that at that time was lipstick on a web-developer. I was interested in the bleeding-edge, the out there stuff, like camera vision, sensors, data-visualization and how all that mixed in with artistic expression. I wasn’t the only one, but the centres for that kind of work were really few and far between, and a lot of them were in Europe.</p><h3>Between Design and Development</h3><p>After scraping, digging, and clawing my way through learning how to program, learning how to build interactive devices, and program some basic hardware, I ended up getting an amazing position at the Ars Electronica. Throughout my time there I found myself always at the center between the design and engineering teams, often doing some early work to “translate” ideas into early forms of software that would then get handed off to engineers that, for the most part, worked in C++ and OpenGL. The biggest struggles in communicating a creative vision always stemmed from the following scenario.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/844/0*fwjzTxGQ5TmqK1bm.jpeg" /><figcaption>An experiment in motion typography, bridging the des + dev teams at the Futurelab.</figcaption></figure><p>A comp was made in illustrator that expressed an idea, one that made total sense to the creative person who envisioned it, but made far less sense to the engineer who had to realize it. While beautiful in sentiment, that idea clearly overlooked basic fundamental aesthetic principles. The problem was that the designer was trying to express a vision of dynamic motion, but was fundamentally constrained by the static medium (sic. Illustrator) that they were using to express themselves. I came to believe that all designers should know how to program so that they could design in the medium they were creating for.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1bf4WWgduyTMoP-i.png" /><figcaption>The final piece was a massive interactive installation at the Vienna airport.</figcaption></figure><p>Another thing I learned from that time was the enormous undertaking of building custom interfaces. At the time, JUCE had split out from Tracktion and was one of the newest industry tools for developing custom desktop and mobile applications, while Processing and OpenFrameworks were on the rise as alternatives for building expressive and dynamic experiences. I thought that it would be amazing to have a robust library of animated, customizable interface components that could be reused for any purpose (i.e. a code-based design system).</p><p>That was a nice idea. Then I quit the Lab, moved to the mountains, and shelved the design-system idea for a while.</p><h3>Discovering A New Paradigm</h3><p>While living and hiking in the Rockies, I became fixated with dynamic typography and wanted to be able to draw with letters, using gesture and a Wacom tablet to do typographic layout. Almost immediately, it became blatantly clear the programming languages and IDEs I had been working in up to that point were not going to cut it — memory, performance, and rendering techniques were huge factors. I started really digging into new software systems and architectures that would allow me to express my creative vision, and I decided that Objective-C and CoreText were the two technologies that I needed to use. I made a lot of applications, printed artworks, and interactive installations with the software I was creating.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/844/1*n63r_UdyzPvv4jMOUyHRvg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/844/1*_-i5OR16xnCS0xrN9eHz0Q.jpeg" /><figcaption>Drawing with type on a Cintiq (Left). Interactive installation at an event (Right).</figcaption></figure><p>After more than a year of experimental development with Objective-C, I understood that there was a fundamentally different paradigm for rendering software. This technique, which was at the core of Mac app development, didn’t require re-drawing an interface at 60 frames per second. This technique was also layer-based, rather than drawing-based, which meant that there was a massive opportunity for inventing new kinds of aesthetics. I remained driven by the idea that artists should learn to program. I was obsessed and insatiable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/844/0*KYBppX98lLiWRDqt.jpeg" /><figcaption>A print work I made with the software.</figcaption></figure><h3>A New Approach to Creative Coding</h3><p>So, I built the first version of C4, an open-source project for building beautiful interfaces. Through its development, I paid great homage to Processing and OpenFrameworks, building the programming language in a similar style to those projects but with this amazing layering capability built-in.</p><p>Eventually, on a cold snowy winter evening in a Canadian pub, someone walked in wearing a cowboy hat and shorts. A friend of mine caught this and said “See? Even that guy has an iPhone.” A longstanding discussion came to an end and initiated C4’s move to from Mac to iOS.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*6_l7AcEblr3Nn1wg.png" /></figure><p>Over the coming years, I would leverage C4 to teach programming for artists, to produce print and interactive data visualizations, and build cutting edge experimental apps for companies like SAP.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F134437502%3Fapp_id%3D122963&amp;dntp=1&amp;display_name=Vimeo&amp;url=https%3A%2F%2Fvimeo.com%2F134437502&amp;image=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F527956424_1280.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=vimeo" width="1280" height="720" frameborder="0" scrolling="no"><a href="https://medium.com/media/b31fc750baf325c0bf9f0f898d81a7fe/href">https://medium.com/media/b31fc750baf325c0bf9f0f898d81a7fe/href</a></iframe><p>The ability think through code to produce beautiful user experiences manifested the opportunity to open a <a href="http://logicandform.com/">design studio</a>. From there, I managed to win grants, build new cutting-edge interfaces, interactive installations and generally bring my practice into a blooming professional environment.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F366460834%3Fapp_id%3D122963&amp;dntp=1&amp;display_name=Vimeo&amp;url=https%3A%2F%2Fvimeo.com%2F366460834&amp;image=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F822508292_1280.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=vimeo" width="1920" height="1080" frameborder="0" scrolling="no"><a href="https://medium.com/media/1da5340ad98509cf37d21b1abd2c1eca/href">https://medium.com/media/1da5340ad98509cf37d21b1abd2c1eca/href</a></iframe><p>One evening, I gave a presentation about creative coding and first met a brilliant engineer who was interested in contributing to C4. We started working together and eventually he took the lead on the engineering development and direction of the project. I learned a lot along the way, and one day came the opportunity to take the project to the next level.</p><h3>Evolving Into a Product</h3><p>I still fundamentally believed that designers should learn how to program, but by this point I knew that there was limited shelf-life to the idea. It wasn’t that it was “wrong” so much as it was too specific. The opportunity that arose for us to wrap an interface around our creative-coding API. On a Saturday, we met up with another friend of mine — a brilliant Interaction Designer — and sketched out an early vision for an animation and interaction design tool that would also have code export.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1HRNoepqTNeVlq58.gif" /><figcaption>A slide from my presentation at Layers 2019.</figcaption></figure><p>The idea was simple: if people don’t want to learn programming, then give them something that programs for them. I would later come to realize that the idea was also consistent with my original thesis: designers should be able to design in the medium for which they were producing.</p><p>We got the funding we needed to kick things off, the first line of code was committed in August, 2015, and the product was called C4 Studio. About a month later, Principle was released and looked just about exactly what we had sketched out earlier that summer… But, it didn’t have anything to do with code export and, luckily, pretty much ever prototyping tool to come thereafter also had nothing to do with software.</p><h3>Shipping Creative Vision</h3><p>Over the years our vision has been proven, time and time again. Despite the space of prototyping, design and production getting messier, noisier, and bigger, there remains the unsolved problem of design-to-development hand-off. Tools in our space have come and gone, largely because they only offered a fraction of a solution for a difficult process.</p><p>Today, Flow has the most powerful and flexible approach on the market for bridging the gap between Design and Development. This can be seen in the variety of export options (buttons, launch screens, onboarding animations, spinners), the variety of languages (Swift, React, HTML, JS, CSS), the variety of platforms (Xcode, Web, Android) all of which are backed up by the media export options that include images, animated GIFs / PNGs / SVGs, movies, and Lottie files that it can produce.</p><p>We have built a system for converting creative expression into a variety of visual media, or to beautifully written, efficient, modern software. It is the software side that truly gets to the root of my earliest vision, by allowing people to test in the medium before shipping. Flow allows a designer to craft beautiful signature motion pieces and, ultimately, accurately ship their creative vision.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/the-roots-of-flow/"><em>https://createwithflow.com</em></a><em> on November 5, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b4c548bdc4ca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Animate and Ship 50 iOS Spinners in 48 hours]]></title>
            <link>https://createwithflow.medium.com/animate-and-ship-50-ios-spinners-in-48-hours-f6b58b55fec5?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/f6b58b55fec5</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[flow]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Thu, 05 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-12T18:26:58.855Z</atom:updated>
            <content:encoded><![CDATA[<h3>How I Animated and Shipped 50 iOS Spinners in 48 hours</h3><p>Late on a Wednesday a few weeks ago I thought to myself, <strong>“let’s see if I can make 50 custom iOS loading animations by the end of Sunday…”</strong> If I started the next day, that would give me 4 full days to get the job done so that I could start posting them to our <a href="https://dribbble.com/createwithflow">Dribbble portfolio</a>. I ended up starting in the afternoon on Thursday, and by lunch on Saturday I was done! It was a marathon of work, but made totally possible using the right tools. Here’s how I did that.</p><h3>Step 1: Find Inspiration</h3><p>This is my favourite part. Having a project for which I get to go and spend a lot of time digging through the inspiring work on Dribbble is most definitely a treat. I spent the first part of Thursday afternoon finding really cool spinner animations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*fAdBYZfyWKYZZaAa.png" /></figure><h4>Search &amp; Collect</h4><p>First, I create a <a href="https://dribbble.com/createwithflow/collections/2036345-Loading">new collection</a> where I will save the animations that are awesome/inspiring/cool. Then, I start searching for great shots by selecting the animations tab, then adding a filter to find relevant designs.</p><p>For this project, the filters I used were: <a href="https://dribbble.com/tags/uianimation">#uianimation</a>, <a href="https://dribbble.com/tags/loading">#loading</a>, <a href="https://dribbble.com/tags/loaders">#loaders</a>, <a href="https://dribbble.com/tags/spinners">#spinners</a>, <a href="https://dribbble.com/tags/loading_animation">#loadinganimation</a>.</p><p>At this point, my whole goal is to collect awesome stuff, not worrying about how hard or possible it might be to recreate an animation.</p><p>I quickly go through the various search results, and as I find shots I like I add them to a collection on my profile. This is a great part of the project, because I get to spend time looking at new trends, seeing new work and looking into people’s profiles, all of which really inspires me and pumps me up for the next phase.</p><p>Here are a few really nice ones from my Loading collection:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*IkBQ_HFLKjzNx2709iuTSQ.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*GIDcdeS0xQAJ7G44r1sW0g.gif" /><figcaption><a href="https://dribbble.com/shots/6875749-Loading-Animation-Practice">Summer Xu</a> (left). <a href="https://dribbble.com/shots/7330802-Loading-Spinner">Margarita Ivanchikova</a> (right).</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*E6soZIor19bPWiRCDV19cA.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*6KII9bNz-yCnLsO43SA3Mw.gif" /><figcaption><a href="https://dribbble.com/shots/4913675-Loading-Screen-for-Live-Wallpapers-App">Sergei Murashko</a> (Left). <a href="https://dribbble.com/shots/5254783-Loading-Animation-for-Acko">Ajith Chandran</a> (Right).</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*AOwPtP1YU4MYH0jtMVh-Uw.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*H4nFKsSiRhl7cHt7cktfPg.gif" /><figcaption><a href="https://dribbble.com/shots/5421606-Loader-XL">Oleg Frolov</a> (Left). <a href="https://dribbble.com/shots/5878367-Loaders">Aaron Iker</a> (Right).</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*ZNrTkxyVoj12VKr0knuQ_Q.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*s2X3XE3EQCwBeG-mV-mR_A.gif" /><figcaption><a href="https://dribbble.com/shots/2316301-Morphing-Loader">Valentin Solomon</a> (Left). <a href="https://dribbble.com/shots/3498589-Loader-of-things">UI8</a> (Right).</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*zBimiVTU1VyfdWcg.png" /></figure><h4>Queue Them Up</h4><p>After I have a significant amount of designs in my collection, I start moving them into a Monday board. I do this one at a time so that I can have a closer look at the animation and gauge how difficult it will be to recreate.</p><p>As each animation goes into the board, I copy its url and paste it into a linkable column, name it and mark it as Easy, Medium or Hard so that I have a decent idea of how much time it will take to reproduce.</p><p>After looking at an animation, if I an idea on how to produce it I will add a note to the entry so that when it comes time to make it I will have a starting point of reference.</p><p>If there are multiple animations in a shot I will duplicate the entry for each animation I want to create.</p><h3>Step 2: Animate</h3><p>This is the big step, because it’s a lot of editing, tweaking, designing, and repeating a solid process that happens over and over and over again. The goal for this project is to produce and ship 50 Custom iOS ActivityIndicators, and to do that I use Flow to accelerate my ability to get work exported to Swift / Core Animation / Xcode.</p><h3>Process</h3><p>Process helps here, and it looks like this:</p><ol><li>(Re)create the design and import into Flow.</li><li>Animate and Iterate.</li><li>Export, Test and Tweak.</li><li>Save the final animation file, move on. Don’t Stop</li></ol><p>There’s not much to explain about this step other than.</p><p>I animate.</p><p>And I don’t stop.</p><p>And I just keep going.</p><p>And I animate.</p><p>And I don’t stop.</p><p>And I just keep going.</p><p>And I animate.</p><p>And I don’t stop.</p><p>And I just keep going.</p><p>And I animate.</p><p>And I don’t stop.</p><p>And I keep on keep on keep on keep on going…</p><p>You get the point, right?</p><p><strong>Non-stop animation until all 50 animations are done.</strong></p><h3>Examples</h3><p>Here’s an example of designing, animating and testing animations.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F472796626%3Fapp_id%3D122963&amp;dntp=1&amp;display_name=Vimeo&amp;url=https%3A%2F%2Fvimeo.com%2F472796626&amp;image=https%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F983374534_1280.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=vimeo" width="1920" height="1200" frameborder="0" scrolling="no"><a href="https://medium.com/media/c7622dbd5acf7ff95569ce6a46b8dfed/href">https://medium.com/media/c7622dbd5acf7ff95569ce6a46b8dfed/href</a></iframe><p>Check out our other examples on the <a href="https://vimeo.com/showcase/7767707">5048 Showcase</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/0*2BXF17ADZ6fKzVKP.gif" /></figure><h3>Step 3: Github</h3><p>Now that all the fun work is done, I move on to producing the media so that I can upload everything nicely. The strategy here is that I want to produce a project that people can actually use. So putting the software up on Github is a critical first step, because we want to make our animations freely available and reference this project everywhere.</p><p>A <a href="https://github.com/createwithflow/ActivityIndicatorView">Github project</a> for my work is important because it makes available all the animations for anyone who wants to use them, and I use it as the centre point around which all my other media posts will be based.</p><p>Here’s how I go about publishing this project:</p><ol><li>Create a new Xcode project from one of the exported projects</li><li>Create a few classes to make it easy to switch between animations</li><li>Individually export each animation using Flow’s Custom iOS Activity Indicator option</li><li>Import all the animation files (3 per animation, 50 animations = 150 files)</li><li>Create a layout with all the spinners</li><li>Record all the spinners on my phone</li><li>Make an animated GIF in photoshop with a bezel around the animation</li><li>Upload the Xcode project to Github</li><li>Write the markdown page, including the GIF</li></ol><p>Here’s what the <a href="https://github.com/createwithflow/ActivityIndicatorView">final project</a> page looks like:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WBhA0wKyx1MeLieY.png" /></figure><h3>Step 4: Dribbble</h3><p>Almost there… The next step for me is to schedule all of my shots on Dribbble. First, I prepare 3 things for each project:</p><ol><li>A 1600x1200 mp4 with my animation centred</li><li>A zipped version of my animation file.</li><li>A description, using a template, of the shot being uploaded.</li></ol><p>When all of that is done for each of the 50 animations, I then go into upload mania.</p><ol><li>I create a new project called iOS Spinners</li><li>I upload/rebound each shot, using its prepared files and description.</li><li>I schedule each shot so that there are 2 posted each workday for the next 25 days.</li></ol><p>If you’re interested, check out my in-depth article on <a href="https://createwithflow.com/blog/publish-to-dribbble/">How We Publish to Dribbble</a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PRYMbebZkwLE5jW-.png" /></figure><h3>Reflection</h3><p>This was a fun and challenging project. At times, especially during the uploading sessions, it was incredibly mind-numbing. But, all in all it was pretty awesome to hammer all of this out in such a short amount of time. I discovered some lovely new aesthetics that people are working on, I learned some new animation techniques, and I pushed the limits of Flow. It was awesome.</p><p>I really like interacting on Dribbble, and have already seen a few comments and likes come through. I’m looking forward to seeing more, and have a few new projects up my sleeve that I will get to after we <a href="https://www.producthunt.com/my/upcoming/flow-figma">launch our upcoming official Figma integration (~ Nov. 24th)</a>.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/fifty-fortyeight/"><em>https://createwithflow.com</em></a><em> on November 5, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f6b58b55fec5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How We Publish to Dribbble]]></title>
            <link>https://createwithflow.medium.com/how-we-publish-to-dribbble-872062147c3a?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/872062147c3a</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[dribbble]]></category>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[flow]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Wed, 04 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-12T18:28:43.012Z</atom:updated>
            <content:encoded><![CDATA[<p>In our other article, <a href="https://createwithflow.com/blog/steal-to-learn">Learning to Animate by Stealing Other People’s Work</a> we cover all the reasons why we love Dribbble and how to use it to be inspired, learn, pay homage, and promote the work of other amazingly talented people.</p><h3>Our Process</h3><p>When we post shots to Dribbble, we often do so en masse. Typically, we do this because we’re diving in on a particular animation theme and we go all-out in generating a whole series of animations at the same time. The volume requires a process for making sure all our posts get tagged properly, have great descriptions and — most importantly — reference any original works that inspired our post.</p><p>After creating animations, the way we go about things basically boils down to the following steps:</p><ol><li>Make a set of description templates for the current project.</li><li>Export media for an animation</li><li>Upload to Dribbble</li><li>Pick and customize the appropriate template for the post</li><li>Add tags</li><li>Add a file attachment</li><li>Add the shot to a project</li><li>Schedule the post</li></ol><h3>Shot Description Overview</h3><p>There are 5 templates that we use for any given project:</p><ul><li>Original Shot</li><li>Rebound of one of our Original Shots</li><li>Rebound of Someone Else’s Original Shot</li><li>Rebound of a Team’s Shot</li><li>Rebound of a Rebound</li></ul><p>We prepare them as HTML code blocks so that the links show up nicely in the Dribbble post.</p><h3>Basic Format</h3><p>Each post should have the following basics:</p><ul><li>Customized reference to someone else’s portfolio and the original shot.</li><li>Custom description of the shot.</li><li>Link to the software it was made with.</li><li>Description and link to any relevant project pages outside of Dribbble (e.g. Github, etc.)</li></ul><p>A basic writeup template might look like this:</p><pre>Inspired by {NAME WITH LINK TO DRIBBBLE PROFILE}’s {DESCRIPTION WITH LINK TO INSPIRATION SHOT}, with some other detail if needed</pre><pre>Made with Flow.</pre><p>Here’s an example of a simple description:</p><pre>Inspired by Aaron Iker’s rebound of a cool shot by Gur Margalit.</pre><pre>Made with Flow.</pre><h3>Shot Description Templates</h3><p>When we’re about to launch a series on Dribbble we take just a little bit of time to customize 5 templates, making it smoother to post multiple shots. The templates below are modified versions for our latest project — <a href="https://dribbble.com/createwithflow/projects/3464494-iOS-Spinners">iOS Spinners</a>.</p><p>Each one of the code-blocks is copy-pastable into Dribbble, allowing you to tweak links.</p><h4>Original Shot</h4><p>We use something simple like this when we’re posting an original work.</p><pre>A piece of our own minds; simple originality.</pre><h4>Rebound</h4><p>We use this template when rebounding someone else’s original work.</p><pre>Inspired by {Designer&#39;s Name}’s {Title or Description or Original Shot}.</pre><p>Here’s the code…</p><pre>Inspired by &lt;a href=&quot;https://dribbble.com/{portfolio link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Designer&#39;s Name}&lt;/a&gt;’s &lt;a href=&quot;https://dribbble.com/shots/{shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Title or Description or Original Shot}&lt;/a&gt;.</pre><h4>Rebound of a Rebound</h4><p>We use this template when rebounding a rebound.</p><pre>Inspired by {Designer&#39;s Name}&#39;s rebound of {Title or Description or Original Shot} by {Original Designer&#39;s Name}.</pre><p>Here’s the code…</p><pre>Inspired by &lt;a href=&quot;https://dribbble.com/{portfolio link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Designer&#39;s Name}&lt;/a&gt;’s &lt;a href=&quot;https://dribbble.com/shots/{shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;rebound&lt;/a&gt; of &lt;a href=&quot;https://dribbble.com/shots/{original shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Title or Description or Original Shot}&lt;/a&gt; by &lt;a href=&quot;https://dribbble.com/{portfolio link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Original Designer&#39;s Name}&lt;/a&gt;.</pre><h4>Rebound of a Team’s Shot</h4><p>We use this template when rebounding a shot that was uploaded to a team’s portfolio.</p><pre>Inspired by {Designer&#39;s Name}&#39;s {Title or Description or Original Shot} for {Team name}.</pre><p>Here’s the code…</p><pre>Inspired by &lt;a href=&quot;https://dribbble.com/{portfolio link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Designer&#39;s Name}&lt;/a&gt;’s &lt;a href=&quot;https://dribbble.com/{shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Title or Description or Original Shot}&lt;/a&gt; for &lt;a href=&quot;https://dribbble.com/{team link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Team name}&lt;/a&gt;.</pre><h4>Rebound of a Self-Rebound</h4><p>We use this template when rebounding someone’s rebound of their own work.</p><pre>Inspired by {Designer&#39;s Name}’s rebound of the {Title or Description or Original Shot} by {his/her} own hand.</pre><p>Here’s the code…</p><pre>Inspired by &lt;a href=&quot;https://dribbble.com/{portfolio link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Designer&#39;s Name}&lt;/a&gt;’s &lt;a href=&quot;https://dribbble.com/shots/{shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;rebound&lt;/a&gt; of the &lt;a href=&quot;https://dribbble.com/shots/{original shot link}&quot; rel=&quot;nofollow noreferrer&quot;&gt;{Title or Description or Original Shot}&lt;/a&gt; by {his/her} own hand.</pre><h3>Boilerplate</h3><p>After the custom description for the current shot, we always like to add a bit of boilerplate that talks a bit about our current project.</p><p>Here is the boilerplate for our <a href="https://dribbble.com/createwithflow/projects/3464494-iOS-Spinners">iOS Spinners</a> Project.</p><pre>This is an actual Custom iOS ActivityIndicator.</pre><pre>Exported to super clean Swift code.</pre><pre>&lt;a href=&quot;https://createwithflow.com/&quot; rel=&quot;nofollow noreferrer&quot;&gt;Made with Flow&lt;/a&gt;.</pre><pre>Only #realsoftware generated here, everything from Flow is real.</pre><pre>Checkout our &lt;a href=&quot;https://github.com/createwithflow/ActivityIndicatorView&quot; rel=&quot;nofollow noreferrer&quot;&gt;Github project&lt;/a&gt; about this Flow feature.</pre><h3>Files, Tags, and Other Polish</h3><p>Here are the remaining things we do for a post.</p><h4>Upload an MP4 File</h4><p>We like uploading an MP4 file for our animations with a resolution of 1600x1200, using .H264 compression (other compression formats sometimes won’t work).</p><h4>Tags</h4><p>Prior to starting our upload process, we also create a set of custom tags to use. Here’s the set for our <a href="https://dribbble.com/createwithflow/projects/3464494-iOS-Spinners">iOS Spinners</a> Project.</p><ul><li>not fake</li><li>real</li><li>uikit</li><li>spinner</li><li>ios</li><li>microinteractions</li><li>ui animation</li><li>flow</li><li>createwithflow</li><li>animation</li><li>loader</li><li>loaders</li></ul><h4>Export Options Media</h4><p>When generating videos of our animations from Flow, we use the Dribbble export option with the following settings:</p><ul><li>4x scale (gens a 1600x1200 vid)</li><li>2x preview scale (scales up the original animation)</li><li>Shadow (adds a shadow to the animation layer</li><li>Round Corners (rounds the corners of the animation layer)</li><li>Custom background color if needed, otherwise default Flow light-grey.</li></ul><h3>Animation File</h3><p>We make sure to upload a zipped version of our animation file for people to download.</p><h3>Include the Shot in the Project</h3><p>Prior to scheduling the shot to go live, we add it to our latest project.</p><h3>Final Shot</h3><p>A final shot will look like the image below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*PxM4HSos2NQY3vYF.png" /><figcaption>We’ve highlighted the various important sections of the post.</figcaption></figure><h3>Why We Do Things This Way</h3><p>The main reason for this process is <strong>volume.</strong> For example, in our latest project we uploaded <a href="https://createwithflow.com/blog/fifty-fortyeight/">50 animations that we created in 48 hours</a>. With that number of uploads you definitely need to keep things organized.</p><p>More importantly, our approach is designed with recognizing an crediting the great work out there that gives us inspiration. We set things up early on so that when we’re in a frenzy of uploading, we help amplify other people’s profiles, animations, and originality... without missing a beat or a link.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/publish-to-dribbble/"><em>https://createwithflow.com</em></a><em> on November 4, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=872062147c3a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Learning to Animate By Stealing Other People’s Work]]></title>
            <link>https://createwithflow.medium.com/learning-to-animate-by-stealing-other-peoples-work-6152b5c3f96d?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/6152b5c3f96d</guid>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[dribbble]]></category>
            <category><![CDATA[design]]></category>
            <category><![CDATA[creative-process]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Tue, 03 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-12T17:54:13.179Z</atom:updated>
            <content:encoded><![CDATA[<p>I love being a part of the <a href="https://dribbble.com/">Dribbble</a> community. There are so many amazing designers creating new concepts, products and aesthetics. Every day I get to see something fresh, something new, something interesting, but what I really like is when designers rebound other people’s work. A rebound is <a href="https://dribbble.com/shots/3029-Introducing-Rebounds">“a shot in response to another shot”</a> they’re an awesome feature that have been around for about 10 years.</p><p>There are 3 main reasons I really like rebounds.</p><h3>Rebound to Learn</h3><p>The first, best reason to rebound is to learn. In this, I fully agree with <a href="https://dribbble.com/Michaelabehsera">Michael Abehsera</a>’s great article: <a href="https://uxplanet.org/the-art-of-stealing-how-to-become-a-master-designer-7c5c3753cdb9">The Art of Stealing: How to Become a Master Designer</a>. In it he breaks down how to think differently about being inspired by other people’s work:</p><blockquote><em>Instead of looking at other designers’ work with envy, think of it as the key to your success.</em></blockquote><p>He introduces a parallel between Github and Dribbble, and talks about how being inspired to recreate another designer’s work is like forking code.</p><blockquote><em>Dribbble’s rebound feature is the closest thing we have in the design industry to GitHub’s “forking,” or downloading any piece of open source software and making it your own.</em></blockquote><p>He takes a broad look at rebounds in the Dribbble community, and uses 10 really interesting shots to support his position. In the end, he concludes:</p><blockquote><em>When you copy someone else’s design work, you have to pick it apart in order to understand it and apply it… Copying effectively teaches you to do it the right way.</em></blockquote><p>Can you, as a designer, look at a static image and decompose it into the techniques, styles, and layers that you need to recreate it? For me, I really like to do this same practice but for animations.</p><h3>Rebound to Homage</h3><p>It often takes a lot to create a rebound because you’re analyzing a static image, looking at its various elements, picking apart the techniques and layering, then rebuilding it from your own perspective and experience. That’s a lot of dedication, so when you do this and repost your work, it’s like an homage to the original designer — a tip of the hat — a recognition of great originality — a desire to honour that creativity.</p><p>Here are few of my rebounds.</p><h4>Gridlock</h4><p>Here’s <a href="https://dribbble.com/shots/14442786-Gridlock">Gridlock</a>, an animation with a cool visual effect, it looks like each of the squares makes its way around the design by sliding — right, down, left, up. It was based on one of the animations in <a href="https://dribbble.com/shots/7112601-Unusual-animated-loaders">Unusual Animated Loaders</a> by <a href="https://dribbble.com/imargarita">Margarita Ivanchikova</a> — <a href="https://www.linkedin.com/in/margarita-ivanchikova-37136880">L</a>, <a href="https://www.facebook.com/profile.php?id=100006316745651">F</a>, <a href="https://society6.com/imargarita">S</a>. Her portfolio shows a really great breadth of style, and I really like a lot of her posts. So, I was compelled to recreate this piece. The neat thing about it is that there’s only 4 actual slides then everything repeats — so it’s a bit of a visual trick.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*aEaLeoHzDfntnDr8vN9u3Q.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*rRNEiY_gOw5yZWW2hlWNog.gif" /><figcaption>My rebound <a href="https://dribbble.com/shots/14442786-Gridlock">Gridlock</a> (left). <a href="https://dribbble.com/shots/7112601-Unusual-animated-loaders">Original by Margarita Ivanchikova</a> (right).</figcaption></figure><h4>Stretch Around</h4><p>Recreating <a href="https://dribbble.com/shots/14419134-Stretch-Around">Stretch Around</a> required figuring out how to create the looping effect, as well as deciphering the layering that gives the aesthetic of a line stretching with a thick border. It was inspired by <a href="https://dribbble.com/shots/5845853-Loader-XLVII">Loader XLVII</a>, a micro animation experiment by <a href="https://dribbble.com/Volorf">Oleg Frolov</a> — <a href="https://olegfrolov.design/">W</a>, <a href="https://twitter.com/Volorf">T</a>, <a href="https://www.instagram.com/olegdesignfrolov/">I</a>, <a href="https://github.com/Volorf">G</a>, <a href="https://www.behance.net/Volorf">B</a>, <a href="https://www.linkedin.com/in/olegdesignfrolov/">L</a>. Oleg’s work is a bastion of design ideas and creative experimentation, all grounded in cutting-edge aesthetics.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*fSTc0_0-gEM4daRQW0hAHw.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*I8SN6rQTvee6uZDGYSaIog.gif" /><figcaption>My rebound <a href="https://dribbble.com/shots/14419134-Stretch-Around">Stretch Around</a> (left). <a href="https://dribbble.com/shots/5845853-Loader-XLVII">Original by Oleg Frolov</a> (right).</figcaption></figure><p>Can you see that each of the dots is actually 2 lines, and that there are 8 total shapes animating?</p><h4>Reflect</h4><p>This one, which I call <a href="https://dribbble.com/shots/14442962-Reflect">Reflect</a>, was more of an inspired idea than a direct rebound. Inspired by on one of the animations in <a href="https://dribbble.com/shots/5568585-Daily-UI-76-Loading">Daily UI #76</a> by <a href="https://dribbble.com/haiji505">Namika Hamasaki</a> — <a href="https://namika.hmsk.co/">W</a>, <a href="https://twitter.com/haiji505">T</a>, <a href="https://github.com/haiji505">G</a>, <a href="https://medium.com/@haiji505">M</a>, <a href="https://www.linkedin.com/in/namika-hamasaki/">L</a>. Namika’s style is elegant, to say the least. In her original piece, I saw the two circles overlapping and realized I wanted to create a similar effect using a masked layer to reveal the green, and I also wanted to create a bit of a pop mid-way through the animation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*uTebGxlbe4JHaITbD7oXQA.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*rH5ALbhrJKxwe7xlXD6eBg.gif" /><figcaption>My rebound <a href="https://dribbble.com/shots/14442962-Reflect">Reflect</a> (left). <a href="https://dribbble.com/shots/5568585-Daily-UI-76-Loading">Original by Namika Hamasaki</a> (right).</figcaption></figure><p>From time to time I’ll dive into an new category of animations, round up some awesome inspirations and see if I can unpack, rebuild, and recreate them. I like this process a lot because I learn, and I get really inspired by the amazing work that’s out there.</p><h3>Rebound to Challenge</h3><p>Challenges are a awesome way to engage with the community. Back in May, <a href="https://dribbble.com/lorisalessandria/">Loris F. Alessandria</a> — <a href="https://www.lorisalessandria.com/">W</a>, <a href="https://www.instagram.com/loriseffe/">I</a>, <a href="https://www.behance.net/lorisalessandria">B</a>, <a href="https://vimeo.com/lorisalessandria">V</a> — shared an interesting design and threw down the <a href="https://dribbble.com/shots/11476458-Martini-Animation-challenge">Martini 🍸Animation Challenge!</a> for people to animate it. In doing so he gave away his design file, and in return there were a bunch of people from all over the world who brought it to life.</p><p>The original illustration looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*4MIhLPI0XA-A0biS.png" /><figcaption>Loris F. Alessandria’s <a href="https://dribbble.com/shots/11476458-Martini-Animation-challenge">Martini 🍸Animation Challenge!</a></figcaption></figure><p>In the next week and a half, <strong>5 designers</strong> from <strong>5 different</strong> countries around the world rebounded original animations using Loris’ illustration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vz2bak5lt3Mo4KaAyZBigw.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*chd7RBe6pLKR2nyLDMPf_w.gif" /><figcaption><a href="https://dribbble.com/JeremyCartwright">Jeremy Cartwright</a> (left). <a href="https://dribbble.com/shots/11604629-Martini-Animation-challenge-by-Loris-F-Alessandria">Niu</a> (right)</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*E1S05CzI5_P10Iu9_Ev0zg.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fa63SzbmsB9823UHLO8t9w.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*i2F3fAjxn-GbZZ1_09iLDA.gif" /><figcaption><a href="https://dribbble.com/Alex1903">Alex Thinotsov</a> (left). <a href="https://dribbble.com/dinosandteacups">Dinos &amp; Teacups</a> (Middle). <a href="https://dribbble.com/GiacomoRibaudo">Giacomo Ribaudo</a> (right)</figcaption></figure><p>This kind of thing is just awesome to see.</p><h3>Steal, Own, Credit, Give Back</h3><p>The rebound is probably one of Dribbble’s best features, and was really forward-thinking when it came out. I fully believe in using rebounds for learning, paying homage, and challenging other people to create beautiful work. I highly recommend you take up the practice, through which you will discover new aesthetics, learn new techniques, promote great work, and hopefully push others to do the same.</p><p>Own <strong><em>your</em></strong> creative expression, even if it’s riffing off of someone else’s original work.</p><p><strong>Remember though, it’s all about crediting people for their originality, creativity, process and talent.</strong></p><p>Don’t <em>just</em> steal. That’s a d*** move.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/steal-to-learn/"><em>https://createwithflow.com</em></a><em> on November 3, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6152b5c3f96d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Control, Craftsmanship and Code Export]]></title>
            <link>https://createwithflow.medium.com/control-craftsmanship-and-code-export-abf4ffdb8b32?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/abf4ffdb8b32</guid>
            <category><![CDATA[developer-tools]]></category>
            <category><![CDATA[animation-and-design]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[code-generation]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Mon, 02 Nov 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-11-03T00:05:43.558Z</atom:updated>
            <content:encoded><![CDATA[<p><em>This article is a set piece of a series of writings which are an exposition of our thoughts, experience, and reflections from working in design and development wheelhouses, about the SDLC, the current composition of that workflow, and how things can and will evolve.</em></p><p><em>This is article #1 of that series.</em></p><p>In many circles, over many pints, and in many threads, lives the often fiercely debated topic of 3rd party libraries. Should you use them or not? Is it good or bad practice? <a href="https://www.freecodecamp.org/news/code-dependencies-are-the-devil-35ed28b556d/">Are they the Devil</a>?</p><p>At Flow we’re constantly aware of and dwelling on this dialogue, because engineers are one of the primary users of our product. While the elusive unicorn may animate and program by themselves, the majority of teams working with Flow have engineers and designers working together, using the product. From the design side, our product needs to be a beautiful, easy and powerful animation tool. From the development side, it needs to produce modern, clean, flexible software.</p><p>But, therein lies a problem. <em>So let me explain</em>.</p><h3>A Gentle Bias</h3><p>Imagine a Designer picks up an animation tool and is amazed by its quality, ease of use, and ability to export media as well as great software for a variety of platforms. They animate their work and hand off a project to a Developer who then might say something like “We don’t use 3rd party code” without looking at it or “Generated code is never any good” or something else to that effect. There is a tendency — some might say a gentle bias — towards rejecting generated code out of hand.</p><p>Let’s have a look at two really important reasons for this sentiment.</p><h4>Control</h4><p>As a developer, a complete understanding of how your product works is fundamentally important and can also be a very difficult thing to manage. Having clear parameters around how to review code, how to style, and when to use someone else’s software is really important for maintaining control over your work. Ben Brooks has a salient take on how to determine <a href="http://martiancraft.com/blog/2017/04/analyzing-third-party-libraries">when to use 3rd-party libraries</a>. What it boils down to is that, sometimes it is important to understand every line of code in a project, and sometimes it isn’t such a big deal.</p><p>Building a design + animation tool is very complex and requires a significant amount of architectural software. In our journey, making certain that our software is stable requires a great deal of control, and is a primary reason that we write most software from scratch. On top of that, we often need to quickly work backwards from a bug to the exact source of an error — with a small team, knowing where a bug is coming from is critical. However, that level of control is far less important for UI elements, where we can easily justify the use of generated code.</p><h4>Craftsmanship</h4><p>As much as a Designer might pride themselves on the attention to detail in a design, a layout, or the timing of an animation, so too will a Developer take pride in the craftsmanship of the software they write. This is especially true for devs who see themselves on the <a href="https://css-tricks.com/the-widening-responsibility-for-front-end-developers/">“front lines”</a> between the product they’re building and their customers.</p><blockquote><em>“Clean code always looks like it was written by someone who cares.” – Robert C. Martin</em></blockquote><p><em>We totally get it.</em> Our team has had long discussions about the color, including questions like “what does a color mean?” to “what does the absence of color imply?” Every design element in our product exists because it represents a critical idea. From the engineering side, every line of code is written with the same attention to detail that we put into design.</p><h3>An Olive Branch</h3><p>The bias towards what we are doing — generating code for developers — may come from a variety of places, but control and craftsmanship are right at the top of the list. We totally understand this because these are two things that are incredibly important in every level of detail on both the engineering and design sides of our product.</p><blockquote><strong>If you’re on the fence, I’d love for you to suspend your disbelief for a moment and have a solid look at the quality of our code, and the structure of an exported project.</strong></blockquote><p>Our iOS export is a great example because you can integrate an animation into your project through Interface Builder. We use native UIKit classes, and everything is backed by Apple’s Core Animation. It’s not like we couldn’t figure out how to make animation work on iOS, and so created an animation engine for you… We didn’t do that. <em>There are no heavy-handed 3rd party libraries here.</em></p><p>For iOS, we make <a href="https://developer.apple.com/documentation/quartzcore"><strong>Core Animation</strong></a><strong> work for everyone.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_XPxiB3naIMDGA_q.png" /><figcaption>Dialed — One of our <a href="https://github.com/createwithflow/ActivityIndicatorView">50 free iOS Activity Indicators</a> — and its animation code.</figcaption></figure><p>For the Web, we make <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API"><strong>Web Animations</strong></a><strong> <em>work for everyone.</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cPoRSJawmG9wG39Yinbcww.png" /><figcaption>Dialed — Exported as Web Animation code, running in the browser.</figcaption></figure><h3>Code Export that Really Works</h3><p>Animations make up a critical component of a beautiful user experience. But, they can be very complex to code up by hand. The level of detail in the coordination of timing, motion and color can be very tricky for an animator to create, and more so for a developer to convert into software.</p><p>Flow is a simple-to-use animation tool that eliminates the need to manually convert things to code. It preserves a designer’s vision while saving your whole team time, money, and heartache.</p><p>We’re here to <strong><em>force multiply your team’s ability</em></strong> to implement animations and elevate the user experience of your product.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/control-craftsmanship/"><em>https://createwithflow.com</em></a><em> on November 2, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=abf4ffdb8b32" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Flow 1.7 – A Little Lottie]]></title>
            <link>https://createwithflow.medium.com/flow-1-7-a-little-lottie-5e1755f0dab0?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/5e1755f0dab0</guid>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[after-effects]]></category>
            <category><![CDATA[ui-design]]></category>
            <category><![CDATA[ui-animation]]></category>
            <category><![CDATA[flow]]></category>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Mon, 16 Mar 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-03-31T03:44:01.438Z</atom:updated>
            <content:encoded><![CDATA[<p>Heads down, commits up… We’ve been hammering away over the last month to release the latest version of Flow. The big ticket here, is a beta version of Lottie export.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jEmOuWvNLLFCMfZpO2TUpw.gif" /><figcaption>Sadly, we can’t add Lottie animations in Medium – but this is from <a href="https://createwithflow.com/blog/release170/">our blog</a>!</figcaption></figure><p>This release opens up our Lottie export. For now we handle <em>shapes</em>, <em>layers</em>, and <em>groups</em> which cover a vast majority of animatable properties necessary for making pretty things.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DRzHlMCrpHEDlHGmbGNf3Q.png" /><figcaption>Exporting Lottie animations from Flow, playing them on <a href="https://createwithflow.com/blog/release170/">our site</a>.</figcaption></figure><p>A few examples of visual experiments we <a href="https://createwithflow.com/blog/release170/">exported as Lottie animations</a>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*SHCbzP5H0IAAsJUxzMkC6g.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*wx1vqvjKoYNqaHNV6qz_WQ.gif" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*vKgkKdVwPteFBSSQv0S7HA.gif" /><figcaption>Rotations with groups and anchor points. Path animations, custom easing curves. Layer movement with bounce curves.</figcaption></figure><h4>Why A Lottie Beta?</h4><p>Flow is an incredibly powerful animation tool, but it’s infinitely easier to learn than After Effects. Until now, we had many, many people tell us they use AE+Lottie for their UI Animations. This means that that combination of tool and output file is part of their workflow – i.e. their production pipeline. It’s hard enough to compete directly with other animation tools, but competing against a team’s production process is very, very hard.</p><p>Now, <strong>we can offer Flow as a powerful, easy-to-learn substitute for AE</strong> when it comes to UI Animation – and people don’t have to change their pipelines to get Flow producing the kinds of files they need for production.</p><h4>What Beta Means</h4><p>As I mentioned, this is our <strong>beta</strong> release. Which means we cover a lot of things, but not everything. In short, we cover shapes, layers and groups (which is essentially the majority of things you need).</p><p>Specifically, you can find a list of things that we handle over at our <a href="https://createwithflow.com/docs/lottie-compatibility/">Lottie Compatibility</a> page, and to see what’s coming soon.</p><h4>I Bet You Can Break This!</h4><p>We’d love it if you made some animations, exported them to Lottie and tell us what works, what doesn’t, what needs improvement, etc. In this area, we’re the rookies here and could use your keen eye and experience.</p><p>Connect with us on our <a href="https://createwithflow.slack.com/join/shared_invite/enQtOTM5MTAzODAyNTE4LTQ4ZTVmY2Y5Y2VlNDFjMzQyZTM4NjE3MzQ5NjkyOGVmNzBiODIyYWM5ZTY5NGY2Njg5NzU4NTVmYmVmYzlhODU">Slack Group</a> to give us feedback.</p><p>Or, <a href="/service/mailto:info@createwithflow.com?subject=Your%20Lottie%20Needs%20Some%20Love!">email us</a> with your thoughts.</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/release170/"><em>https://createwithflow.com</em></a><em> on March 16, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5e1755f0dab0" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Power of Templates]]></title>
            <link>https://createwithflow.medium.com/the-power-of-templates-da2c6a5c8bc?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/da2c6a5c8bc</guid>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Fri, 03 Jan 2020 00:00:00 GMT</pubDate>
            <atom:updated>2020-02-20T22:49:54.366Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QMNo4ldZ6G6uNF7ESwAOxA.png" /></figure><p>One of the more subtle aspects of Flow is our code template engine. It allows us to very easily update and maintain or create new export formats.</p><p>When we released our React export in December, it had taken us <strong>less than a week to produce, test, and ship</strong> it… Which is nuts, because our team is small and adding code export to a tool <em>should be really really hard.</em> For us, it’s not… and this is because of Flow’s amazing <strong>code template engine</strong>.</p><p>A few key releases from last year show what I mean:</p><p>1.5.1 (Jun 27): 2 templates<br>1.5.6 (Jul 17): 5 template (added 3 in a single month)<br>1.6.7 (Nov 5): 6 templates<br>1.6.8 (Dec 10): 8 templates<br>1.6.9 (Dec 20): 9 templates</p><p>At the beginning of 2019, we had 2 export options:</p><ul><li>a solid iOS / Swift export, and</li><li>a terrible Web / CSS keyframes export.</li></ul><p>By the end of 2019, we had:</p><ul><li>iOS</li><li>iOS — Launch Animations</li><li>iOS — Onboarding Animation</li><li>iOS — Custom Button</li><li>HTML</li><li>HTML — Toggle Button</li><li>HTML — WebComponents</li><li>HTML — WebComponents Toggle Button</li><li>React — Toggle Button</li></ul><p>Our team is small, so to be able to achieve this kind of production timeline is a very real testament to the power of Flow’s code template engine.</p><blockquote><em>It’s easy for us to bring new export languages to Flow.</em></blockquote><h3>Flow Pro</h3><p>We are working on a Pro version that will allow <strong>YOU</strong> to do this kind of thing as well.</p><p>So, you don’t like our export / programming style? That’s fine, you can modify a template to generate software <strong>exactly how you would have written it</strong>.</p><p>Do you need a language we don’t support? That’s fine, you’ll be able to <strong>write one yourself</strong>.</p><p>This is going to be a killer feature that truly puts Flow in a class of its own, so stay tuned.</p><h3>Wait. What’s Flow?!?!</h3><p>Great question.</p><blockquote><em>Flow is a UI Animation and code export tool for animating Sketch files and eliminating the most painful parts of hand-off in app development. It bridges the gap between design and development by exporting production-ready native code for iOS and HTML.</em></blockquote><h3>Our Site</h3><p><a href="https://createwithflow.com/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com</a></p><h3>Get a Copy</h3><p><a href="https://createwithflow.com/download/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com/download</a></p><p>❤</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/power-of-templates/"><em>https://createwithflow.com</em></a><em> on January 3, 2020.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da2c6a5c8bc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React!]]></title>
            <link>https://createwithflow.medium.com/react-89eb7476f7af?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/89eb7476f7af</guid>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Fri, 20 Dec 2019 00:00:00 GMT</pubDate>
            <atom:updated>2020-02-20T22:49:26.506Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bjaHcHEhsPkJj4jfj0NJAg.gif" /></figure><p>Flow now exports React components! Adding a 3rd export platform is a major milestone for us because the true nature of Flow is starting to reveal itself — as a tool that can export to any language, platform and style.</p><h3>React Toggle Button</h3><p>The newest export option that Flow offers is a toggle button built in React. After creating your animation and export it, you can integrate it into your site with just two lines of code:</p><p>Import it like this:</p><pre>import ReactButton from &quot;./js/ReactButton&quot;;</pre><p>Use it like this:</p><pre>&lt;ReactButton elementID={&quot;ReactButton&quot;} callback={null} /&gt;</pre><p>❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎❤︎</p><h4>Backed by Web Components</h4><p>Backing this by HTML Web Components made it really easy for us to create this React export. Essentially, the component wraps this:</p><pre>&lt;timeline-button   <br>  id={this.props.elementID}   <br>  onClick={() =&gt; this.state.toggleButton.toggle(true)}<br>&gt;&lt;/timeline-button&gt;</pre><h3>I’m Amazed</h3><p>I had a hearty giggle when our dev team showed me this for the first time. It took less than a week and is a beautiful testament not only to their abilities but to how truly awesome Flow is becoming.</p><p>Our goal is this:</p><ol><li>Import your designs.</li><li>Animate them.</li><li>Export to ANY language.</li></ol><p>We’re definitely getting there.</p><p>❤︎</p><h3>Wait. What’s Flow?!?!</h3><p>Great question.</p><blockquote><em>Flow is a UI Animation and code export tool for animating Sketch files and eliminating the most painful parts of hand-off in app development. It bridges the gap between design and development by exporting production-ready native code for iOS and HTML.</em></blockquote><h3>Our Site</h3><p><a href="https://createwithflow.com/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com</a></p><h3>Get a Copy</h3><p><a href="https://createwithflow.com/download/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com/download</a></p><p>❤</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/release169/"><em>https://createwithflow.com</em></a><em> on December 20, 2019.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=89eb7476f7af" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Web Components]]></title>
            <link>https://createwithflow.medium.com/web-components-ca1312b5cefe?source=rss-b8f907a7d5cb------2</link>
            <guid isPermaLink="false">https://medium.com/p/ca1312b5cefe</guid>
            <dc:creator><![CDATA[Flow]]></dc:creator>
            <pubDate>Fri, 13 Dec 2019 00:00:00 GMT</pubDate>
            <atom:updated>2020-02-20T22:48:36.692Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JaBgy8cko-_aL60Q134iXQ.gif" /></figure><p>The latest release of Flow has an awesome new feature that lets you embed your animations in a website, using only a single line of code. It comes with some slick performance upgrades to boot.</p><h3>A Single Line of Code</h3><p>We’re overhauling our HTML export to offer the option of exporting using <a href="https://developer.mozilla.org/en-US/docs/Web/Web_Components">Web Components</a> which allows you to reuse custom elements, and embed them using (typically) a single line of code.</p><h4>How?</h4><p>Three main elements come together to make this happen.</p><ul><li>Javascript stuff — for defining the component’s behaviours.</li><li>Shadow DOM — for injecting the component into a page.</li><li>HTML Templates — reusable markup that defines the layout of the component.</li></ul><p>Our new <strong>HTML Button — WebComponent</strong> export option packs up your animation into these three things and gives you the option to then embed your button as a reusable component.</p><h4>Why?</h4><p>Aside from using only a <strong>single line of code</strong> instead of copying a DOM into your page? Great question.</p><p>Because it sets us up for exporting to React, and Angular.</p><p>So, in a nutshell:</p><ul><li>easier to integrate your stuff</li><li>reusable elements for you to use</li><li>gets us more export languages for Flow</li></ul><h3>An Example</h3><p>Here’s an example of an animation that we created to show you how this looks. The component uses the Flow logo and looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*Qyign5u2LyjQlvFe.gif" /></figure><h4>Full DOM</h4><p>Exporting with the HTML or HTML Button templates generates a full DOM that you can copy and paste into your pages. For the animation above, it looks like this:</p><pre>&lt;div onclick=&quot;buttonFlowButton.toggle(true)&quot; class=&quot;flow-artboard&quot; id=&quot;FlowButton-ButtonID&quot;&gt;<br>  &lt;div class=&quot;flow-artboard&quot; style=&quot;visibility: hidden;&quot;&gt;<br>    &lt;div class=&quot;flow-artboard&quot; id=&quot;FlowButton&quot;&gt;<br>      &lt;div class=&quot;flow-layer w_blue&quot;&gt;<br>        &lt;svg class=&quot;w_blue-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 28 28&quot;&gt;<br>          &lt;title&gt;W-Blue&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;w_blue-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;w_blue-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M0,26.451c0,0,0,-24.904,0,-24.904 0,-0.854,0.692,-1.547,1.547,-1.547 0,0,24.904,0,24.904,0 1.378,0,2.068,1.666,1.094,2.64 0,0,-24.904,24.905,-24.904,24.905 -0.975,0.974,-2.64,0.284,-2.64,-1.094&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border w_blue-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>      &lt;div class=&quot;flow-layer w_red&quot;&gt;<br>        &lt;svg class=&quot;w_red-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 28 28&quot;&gt;<br>          &lt;title&gt;W-Red&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;w_red-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;w_red-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M0,26.451c0,0,0,-24.904,0,-24.904 0,-0.854,0.692,-1.547,1.547,-1.547 0,0,24.904,0,24.904,0 1.378,0,2.068,1.666,1.094,2.64 0,0,-24.904,24.905,-24.904,24.905 -0.975,0.974,-2.64,0.284,-2.64,-1.094&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border w_red-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>      &lt;div class=&quot;flow-layer w_pink&quot;&gt;<br>        &lt;svg class=&quot;w_pink-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 12 14.18&quot;&gt;<br>          &lt;title&gt;W-Pink&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;w_pink-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;w_pink-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M0,14.18c0,0,0,-12.634,0,-12.634 0,-0.854,0.692,-1.546,1.547,-1.546 0,0,8.904,0,8.904,0 1.378,0,2.068,1.665,1.094,2.639 0,0,-11.544,11.541,-11.544,11.541zM0,14.18&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border w_pink-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>      &lt;div class=&quot;flow-layer o&quot;&gt;<br>        &lt;svg class=&quot;o-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 30 30&quot;&gt;<br>          &lt;title&gt;O&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;o-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;o-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M15,30c0,0,0,0,0,0 -8.284,0,-15,-6.716,-15,-15 0,0,0,0,0,0 0,-8.284,6.716,-15,15,-15 0,0,0,0,0,0 8.284,0,15,6.715,15,15 0,0,0,0,0,0 0,8.284,-6.716,15,-15,15&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border o-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>      &lt;div class=&quot;flow-layer l&quot;&gt;<br>        &lt;svg class=&quot;l-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 28 28&quot;&gt;<br>          &lt;title&gt;L&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;l-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;l-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M26.451,28c0,0,-24.904,0,-24.904,0 -0.854,0,-1.547,-0.692,-1.547,-1.547 0,0,0,-24.904,0,-24.904 0,-1.378,1.666,-2.068,2.64,-1.094 0,0,24.905,24.904,24.905,24.904 0.974,0.975,0.284,2.64,-1.094,2.64&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border l-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>      &lt;div class=&quot;flow-layer f&quot;&gt;<br>        &lt;svg class=&quot;f-svg&quot; preserveAspectRatio=&quot;none&quot; viewBox=&quot;0 0 28 28&quot;&gt;<br>          &lt;title&gt;F&lt;/title&gt;<br>          &lt;desc&gt;Made with Flow.&lt;/desc&gt;<br>          &lt;defs id=&quot;f-defs&quot;&gt;<br>          &lt;/defs&gt;<br>          &lt;path id=&quot;f-path&quot; vector-effect=&quot;non-scaling-stroke&quot; d=&quot;M0,26.451c0,0,0,-24.904,0,-24.904 0,-0.854,0.692,-1.547,1.547,-1.547 0,0,24.904,0,24.904,0 1.378,0,2.068,1.666,1.094,2.64 0,0,-24.904,24.905,-24.904,24.905 -0.975,0.974,-2.64,0.284,-2.64,-1.094&quot;&gt;<br>          &lt;/path&gt;<br>        &lt;/svg&gt;<br>        &lt;div class=&quot;flow-border f-border&quot;&gt;&lt;/div&gt;<br>      &lt;/div&gt;<br>    &lt;/div&gt;<br>  &lt;/div&gt;<br>&lt;/div&gt;</pre><h4>With Web Components</h4><p>Now.</p><p>Check this out:</p><pre><strong>&lt;</strong>flowbutton<strong>-</strong>button id<strong>=</strong>&quot;flowbuttonButton&quot; onclick<strong>=</strong>&quot;flowbuttonButton.toggle(true)&quot;<strong>&gt;&lt;/</strong>flowbutton<strong>-</strong>button<strong>&gt;</strong></pre><p>That’s what you have to drop into your page with our new approach.</p><p>Nice, right?</p><p>Right?</p><h4>But That DOM Still Exists Somewhere Right?</h4><p>Yes, it still exists, but it’s now encapsulated in a document that allows you to inject into any page, menu, etc. on your site or web app.</p><h3>A Hint at the Future</h3><p>We are moving towards having new export options, specifically <a href="https://reactjs.org/">React</a> and <a href="https://angular.io/">Angular</a> and we’re using this Web Components approach to leverage adding two new languages.</p><p>This news is actually centered around exposing an API for developing new templates with Flow. Soon, developers will be able to create their own export templates, either by modifying one of ours or creating an entirely new one from scratch.</p><p>Keep an eye out.</p><h3>Wait. What’s Flow?!?!</h3><p>Great question.</p><blockquote><em>Flow is a UI Animation and code export tool for animating Sketch files and eliminating the most painful parts of hand-off in app development. It bridges the gap between design and development by exporting production-ready native code for iOS and HTML.</em></blockquote><h3>Our Site</h3><p><a href="https://createwithflow.com/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com</a></p><h3>Get a Copy</h3><p><a href="https://createwithflow.com/download/?utm_source=medium&amp;utm_medium=release&amp;utm_campaign=1.6">createwithflow.com/download</a></p><p>❤</p><p><em>Originally published at </em><a href="https://createwithflow.com/blog/web-components/"><em>https://createwithflow.com</em></a><em> on December 13, 2019.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ca1312b5cefe" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>