<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ prototyping - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ prototyping - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 10 Jun 2026 16:20:58 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/prototyping/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Design a Website Prototype from a Wireframe ]]>
                </title>
                <description>
                    <![CDATA[ You may have heard the old saying: "Measure twice, cut once." Well that is exactly why you should plan out a website before you build it. And that's where prototyping comes in. When we design our websites, we progress from wireframing to prototyping ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/designing-a-website-ui-with-prototyping/</link>
                <guid isPermaLink="false">66be0167e517c1bd493f0d9f</guid>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Website design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ #wireframe ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Adrian Twarog ]]>
                </dc:creator>
                <pubDate>Mon, 21 Sep 2020 17:19:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/09/ui-design-from-wireframe.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>You may have heard the old saying: "Measure twice, cut once." Well that is exactly why you should plan out a website before you build it. And that's where prototyping comes in.</p>
<p>When we design our websites, we progress from <a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-wireframe-ux-design-tutorial-website/">wireframing</a> to prototyping to – finally – a full design.</p>
<p>I wanted to explore and expand on what Prototyping actually means by taking you through the full process.</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/_P3CrgFlXhg" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p>Note that I created another course that covers the first step of designing a website: building a wireframe. You can <a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-wireframe-ux-design-tutorial-website/">read about wireframing and watch my 30 minute video course here</a>.</p>
<p>In this tutorial, we'll cover:</p>
<ol>
<li>What an Early Prototype is</li>
<li>Creating a Structure: Frame, Rows, Columns</li>
<li>Adding Content: Header, Slider, About</li>
<li>Designing Sections</li>
<li>Conclusion: What we've learned from the prototyping process</li>
</ol>
<h2 id="heading-what-is-an-early-prototype">What is an Early Prototype?</h2>
<p>A prototype is normally the secondary iteration of a design, as it is built on top of a wireframe. </p>
<p>A wireframe usually involves a simple drawn sketch via paper, pen, or online tool. Next we build the prototype, which is our more refined mockup for the website or app.</p>
<p>Let's take a look at the early wireframe we built <a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-wireframe-ux-design-tutorial-website/">in the previous article</a>: </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/Wireframe.svg" alt="Image" width="600" height="400" loading="lazy">
<em>The wireframe we created in <a target="_blank" href="https://www.freecodecamp.org/news/what-is-a-wireframe-ux-design-tutorial-website/">my previous wireframing course</a>.</em></p>
<p>It has a number of pages, sections, and areas where text and images will be added later.</p>
<p>The goal, then, in the Prototype is to build this visually, but without adding color or images.</p>
<p>In this example, I will be using <a target="_blank" href="https://www.figma.com/">Figma</a> to do the Prototype. You can <a target="_blank" href="https://www.figma.com/file/mh52sQHBF8Bq2pIZhLKVuh/freeCodeCamp-Website-Ui?node-id=0%3A1">view the whole Figma protype here</a>.</p>
<h2 id="heading-how-to-create-a-website-prototype-structure-frame-rows-columns">How to Create a Website Prototype Structure: Frame, Rows, Columns</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/columns-3.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<p>When we created the wireframe, we considered the grids – but they were hand drawn. </p>
<p>When doing an early prototype, we have to define them properly so that the whole design follows the grid structure.</p>
<p>In this example, I will be using a 12-column design with a regular width of 1140px, which is traditionally used and seen in Bootstrap designs. This gives us a 15-30px margin between grid units. </p>
<p>This will be useful later when we collapse the columns to rows for mobile responsiveness.</p>
<p>You can create your own grid structure in Figma. But be aware that you (or someone else) will later need to actually code these designs.</p>
<p>Whenever you're designing something, be sure to take the developer into consideration.</p>
<h2 id="heading-how-to-add-content-to-a-website-prototype-header-slider-sections">How to Add Content to a Website Prototype: Header, Slider, Sections</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/slider.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Unlike the Wireframe, we are no longer representing text with lines, and headers with blocks. Instead we need to fill out content for a mockup. </p>
<p>This doesn't mean adding colors or images. But it does mean we have to show real text.</p>
<p>At this stage, it's a great idea to make sure that the header and sections are shown with the actual content they will be intended to hold. This will allow better selection for colors and images in later stages of the design.</p>
<p>In this part of the example, I built out the slider with hero text, and a description underneath. There are a few things to look out for at this phase of the prototype process:</p>
<ul>
<li>Font sizing and positioning</li>
<li>Content location and spacing</li>
<li>Margins and padding between sections and content</li>
</ul>
<h2 id="heading-how-to-design-sections-of-the-website-prototype">How to Design Sections of the Website Prototype</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/about.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<p>For prototyping and the final mockup, it's important to start layering your groups and sections. Sections can include things like the header, the "about us" section, and the sponsors section.</p>
<p>You can create groups in your UI tool (Figma does this with Ctrl+G). Label your sections and set them with different background colors. This will make it easy to identify them, and will allow you to easily move them about.</p>
<p>Too many times I've been asked to move certain parts of a website up and down the grouping. By grouping all your components into sections, you will make it much easier on yourself  during the prototype phase of the design work.</p>
<h2 id="heading-conclusion-what-we-have-learned-from-the-prototyping-process">Conclusion: What We Have Learned from the Prototyping Process</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/conclusion.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As we build out the rest of the design, it's important to ensure that this early prototype does not become a full mockup for a website design.</p>
<p>It's easy to get carried away. But the goal of doing a prototype after a wireframe is to ensure that we can continue to plan the website's development. </p>
<p>It's much easier to identify problems and issues in the early planning stages and update them before diving into creating the full design. Such prototyping may only take you a few hours, but it can save days worth of effort later in the process.</p>
<p>Once you've prototyped multiple pages, you can move on to the full mockup design phase. This will involve figuring out color theory, typography, and images that work accordingly. We will take a look at this in the next article in this series next month.</p>
<h2 id="heading-bonus-adding-an-interactive-prototype-run">Bonus: Adding an Interactive Prototype Run</h2>
<p>We only created a single page for this example. This said, prototyping also allows you to create an emulated example of the site operating.</p>
<p>This emulation is very useful for conducting demos, testing how clients respond to seeing a real world example of an early mock-up, and revising how all of your links flow.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/08/freeCodeCamp.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>I hope you enjoyed this article. If you don't know who I am, I'm Adrian from Australia. ? I have a tiny channel on Twitter &amp; YouTube, so if you want to know more about me or enjoy my content, check me out sometime ?</p>
<ul>
<li><strong>Youtube:</strong> <a target="_blank" href="https://youtube.com/adriantwarog">https://youtube.com/adriantwarog</a></li>
<li><strong>Twitter:</strong> <a target="_blank" href="https://twitter.com/adrian_twarog">https://twitter.com/adrian_twarog</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to create a prototype in record time with the Material Theme Plugin for Sketch and Vuetify.js ]]>
                </title>
                <description>
                    <![CDATA[ By Adam Wattis When developing an MVP (Minimum Viable Product), you intend to go from idea to prototype as fast as possible. The faster you can prototype your idea, the faster you are able to iterate upon it. As you’re moving from abstract idea to wo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/incredibly-fast-prototyping-with-material-theme-plugin-for-sketch-and-vuetify-js-366ef25ce9b3/</link>
                <guid isPermaLink="false">66c357fa71e87702d4e5b6d8</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Material Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Vue.js ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 10 Jun 2018 23:58:55 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*-QMWv7Bv0N6QOcSUCeBu-Q.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Adam Wattis</p>
<p>When developing an MVP (Minimum Viable Product), you intend to go from idea to prototype as fast as possible. The faster you can prototype your idea, the faster you are able to iterate upon it.</p>
<p>As you’re moving from abstract idea to working prototype, you usually don’t want to spend a lot of time creating a custom design when you should be focusing on the functionality of the application. To solve this issue, we use frameworks like Bootstrap to quickly achieve a structured layout with a UI that looks “pretty good” without too much effort.</p>
<p>What we really want to achieve, in terms of design, is to <strong>rapidly</strong> create a UI that is <strong>recognizable</strong> and <strong>coherent.</strong></p>
<p>I’m about to show you a super fast way of going from abstract idea, to design, to working prototype with Material Design. Material Design is Google’s open source design system that they use for all their applications. This makes it recognizable because it is intuitive and easy to navigate, and most people are familiar with it already. If you haven’t already, you should definitely check out what <a target="_blank" href="https://material.io/">Material design</a> is all about.</p>
<p>By using the Material Design Plugin for Sketch, we’ll create our own customizable Material Design system. This will include a great set of components that will allow us to quickly create coherent designs for our prototype app. The app we’ll make is a simple reminders app.</p>
<p>We will use front-end framework Vue.js together with the Material Design component library Vuetify.js to realize our app designs. Lets get to it!</p>
<h3 id="heading-creating-the-design-system">Creating the design system</h3>
<p><a target="_blank" href="https://material.io/tools/theme-editor/">Download</a> this plugin for Sketch. Once installed, simply go to Plugins &gt; Material &gt; Open Theme Editor to see the Material Design Theme Editor. Click “Create New Theme”, and we choose to begin with the Baseline theme.</p>
<p>We are now presented with our Material Design system of Sketch components.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/LuaHmcKZg8RwSJmcVazNctiDo75Sdf0KqHwP" alt="Image" width="800" height="452" loading="lazy">
<em>Your component library.</em></p>
<p>In the Theme Editor, you may change the primary and secondary color, change the font, change the shape of elements’ corners, and include custom icons. For this example, we will change none of these and just stick with the defaults.</p>
<p>We have now created our design system. As you can see, it says that the document is a <strong>library</strong>. This means that any changes you make to this Sketch file will affect your mock-ups and update all your designs with those changes. How great is that?</p>
<p>Before we continue, we will also install the Sketch Material plugin, which will add some modules that we’ll soon use.</p>
<h3 id="heading-mock-ups"><strong>Mock-ups</strong></h3>
<p>Let’s start by opening a new Sketch document then creating a new iPhone artboard and saving it as <strong>MaterialReminders.sketch</strong>. This is where we’ll create our designs for our application. But first, lets explore the rich component library that is at our disposal.</p>
<p>Under <strong>Insert &gt; Symb</strong>ols you should see the component library we just created.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/vxaJm-KKTX25ZzXOZV1KeHcchXY63uvpyN12" alt="Image" width="800" height="596" loading="lazy">
<em>Explore all the components in our library and imagine the possibilities!</em></p>
<p>Just so many components! We can now begin to create our designs. But first we must break down what functionality we want this reminders app to have. We’re keeping it simple and only adding the ability to:</p>
<ul>
<li>Add a new reminder</li>
<li>Delete a reminder</li>
<li>Check off a reminder from your todo list</li>
<li>Uncheck a reminder from your completed list</li>
</ul>
<p>Fantastic, let’s speed things up and begin dropping some components into our first iPhone artboard.</p>
<p>We start with a top navbar. Drop it in and place it then size it to fit the screen. We’ll have to change the first icon to an “Icon / Add / Filled” for the Menu Icon and change icon color to white. Then change all the other icons to none, since we wont be needing them. We also change the headline to Reminders.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ZCb-U7Is9ahlpicmLCUmc93MeN4CpWUj-FhF" alt="Image" width="640" height="359" loading="lazy">
<em>Customizing for your needs becomes super easy with symbol overrides.</em></p>
<p>We’ll now start dropping in some dummy reminders. We’ll create our reminders like a list, so let’s find a suitable component. We’ll use “List / Single Line / Indent / Body 2”.</p>
<p>Now we will center the list object, take away the bottom divider, set the text to “Chores”, and lastly change the icon to “Icon / Checked Circle / Outlined”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/9Prfl9hSretZJqgP0l-AhgJ0ey7uVXKSZVmR" alt="Image" width="640" height="350" loading="lazy"></p>
<p>Add a title by inserting a text field, then using the Plugins &gt; Sketch Material &gt; Typography module to change the style to Subhead.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/tINK-Ts33QE0vIUe4orSqhCF8oNVsP4t3-p2" alt="Image" width="800" height="344" loading="lazy">
<em>When selecting a text field and going to the Typography module you can click on a style to apply it.</em></p>
<p>It’s beginning to look pretty good so far! But we are now faced with a problem. We want to also include list controls to the <em>right</em> in each list object, because we want to add a delete button there. But the devs over at Google did not include any override for that in the Sketch component. No worries though, we’ll fix this by going into our library file and adding our icon to the symbol, thus updating it throughout our project.</p>
<p>Go to the library and find the list component we used in the Material Components page. Then, double click it to go to its symbol. Click the icon to the left so that it is in focus, then copy paste and move it over to the right. Done deal.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/S8X8VqUhxaBO0GjO92TkQz0-sxDn3UjSCKh1" alt="Image" width="640" height="614" loading="lazy"></p>
<p>When we switch back over to our project, we can now see that in the the top right corner it says “Library Updates Available”.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/0FUd44ijqurPseWYOj3eSPZiHhjhDgO1ckiU" alt="Image" width="518" height="238" loading="lazy">
<em>Changes have been detected in the library. You may choose to update your designs with these new changes.</em></p>
<p>Now we should be able to change the right hand icon to “Icon / Close / Filled” which will be the button to remove a reminder completely from the list.</p>
<p>To create a list of reminders, we simply copy paste a bunch more list objects, change their text, then change the title that we added to Todo.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-TrerR8NqmxuW9wOCg9wz2aDGTyPiUzzzdOA" alt="Image" width="800" height="530" loading="lazy">
<em>Todo list is complete.</em></p>
<p>Then we copy paste that entire list to create the Completed list. On this new list, you must change the title to “Completed”, then change all the icons to the left to be filled instead of outlined.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/AcZpO-zEL-N5FIEcPk5yDThcsL83K50ozWQt" alt="Image" width="640" height="388" loading="lazy">
<em>Select all the list items to change the icons to them all at the same time.</em></p>
<p>Were almost done with our mock-ups. To speed things along, I just changed our artboard color to #FAFAFA and added a “Shadow / 00dp” behind each of my lists.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JoFxDKR5zSuNcGsBZgh9em9RRu15tH2hkYoQ" alt="Image" width="766" height="1132" loading="lazy">
<em>Completed mock-up.</em></p>
<p>This mock-up view is now complete. The next one we need to create is the dialogue that appears when you press the add button.</p>
<p>We begin by copy pasting the artboard we’ve been working on to create an exact copy. Then, we use the Dialogue and Form modules under “Plugins / Sketch Material” to create a dialogue and a form separately. These are then combined and a opaque box is placed behind. I switched out the transparent action button in the dialogue to a primary colored button.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/aelleiqG6FnghDdfwGT9YtRF7jnYn8OfMvrp" alt="Image" width="786" height="1112" loading="lazy"></p>
<p>We are now done with Sketch. Of course, we could add more features and expand our mock-ups even more, but we will keep it simple for now. The next step is to write the code that will become our app!</p>
<h3 id="heading-vue-with-vuetify">Vue with Vuetify</h3>
<p>Now to the fun part — coding. We will be using Vue.js which is a front-end UI library written in JavaScript. It’s really easy to learn, and checking out their <a target="_blank" href="https://vuejs.org/v2/guide/">website</a> would be a first step. To implement Material Design, we’ll use the <a target="_blank" href="https://vuetifyjs.com/en/getting-started/quick-start">Vuetify.js</a> component library which includes a bunch of Vue components along with a grid system to easily organize your layout.</p>
<p>We start by simply copy pasting the example markup that’s on the Vuetify starter page. Let’s look at what this does for us.</p>
<p>When looking at HTML, start from the outside and work you way inwards.</p>
<p>We have our <code>&lt;head&gt;</code> and &amp;<code>lt;body&gt;&lt;/bo</code>dy&gt; tags.<code>Inside the &amp;l</code>t;head<code>&gt;&lt;/head&gt; tag we have &lt;lin</code>k&gt; tags that` will pull in the required vuetify.min.css file and Google Fonts.</p>
<p>In the <code>&lt;body&gt;&amp;</code>lt;/body&gt;<code>; we have a</code> </p><div></div> and within that we have some Vuetify <code>components, for</code> exam<code>ple &lt;v-app&gt;&lt;/v</code>-app&gt; and , which are signified by the “v-” in their names.<p></p>
<p>Further down you have two <code>&lt;script&gt;&lt;</code>;/script&gt; tags that import the Vue.js and Vuetify.js modules into our page.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/q0VKlrkzc1mWE6qa2hyVy2sBYK0gLKlTtDin" alt="Image" width="800" height="327" loading="lazy"></p>
<p>Lastly, after the import statements, there is a third <code>&lt;script&gt;&lt;</code>;/script&gt; tag which cr<code>eates</code> a new Vue() instance. This is where we will write all our JavaScript code.</p>
<p>We can see that the instance is hooking into <code>‘#app’</code> which is the ID of the <code>&lt;div&gt;</code> tag in our HTML. This lets our Vue instance know where to inject our UI.</p>
<p>Inside of the <code>&lt;v-content&gt;&lt;/v</code>-content&gt; tag we will soon place all our Vuetify components. But first we will save what we have for now as index.html, and then open the file in our browser, where we should be presented with “Hello world”.</p>
<p>We continue by looking up what HTML we need for the top navbar component in the Vuetify documentation. The tag we’re looking for is <code>&lt;v-toolbar app&gt;&lt;/v</code>-toolbar&gt; . We’ll also ha<code>ve to add a &lt;</code>;v-btn&gt; inside this navbar so that we can press it to display the dialogue to add new reminders.</p>
<p>In this button we’ll also add a <code>@click=</code> event which will set <code>addModal</code> to <code>true</code> which will bring up the dialogue modal. We add this in between the <code>&lt;v-content&gt;&lt;/v</code>-content&gt; tags:</p>
<pre><code>&lt;v-toolbar app color=<span class="hljs-string">"primary"</span>&gt;  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">color</span>=<span class="hljs-string">"primary darken-1"</span> <span class="hljs-attr">icon</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"addModal = true"</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span>&gt;</span>add<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>  <span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span></span>  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">v-toolbar-title</span>&gt;</span>    Reminders  <span class="hljs-tag">&lt;/<span class="hljs-name">v-toolbar-title</span>&gt;</span></span>&lt;/v-toolbar&gt;
</code></pre><p>Next, we must add the HTML for the dialogue. This will live right after the <code>&lt;v-toolbar-title&gt;&lt;/v-toolb</code>ar-title&gt; tag, but still <code>inside the &lt;v-toolb</code>ar&gt; tag. Here is the dialogue:</p>
<pre><code>&lt;v-dialog v-model=<span class="hljs-string">'addModal'</span>&gt;  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">v-card</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">v-card-title</span>&gt;</span>Add a reminder<span class="hljs-tag">&lt;/<span class="hljs-name">v-card-title</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">v-card-text</span>&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">v-container</span> <span class="hljs-attr">grid-list-md</span>&gt;</span>        <span class="hljs-tag">&lt;<span class="hljs-name">v-layout</span> <span class="hljs-attr">wrap</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-flex</span> <span class="hljs-attr">md12</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-text-field</span> <span class="hljs-attr">v-model</span>=<span class="hljs-string">"newTask"</span> <span class="hljs-attr">label</span>=<span class="hljs-string">"New task"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">v-text-field</span>&gt;</span>          <span class="hljs-tag">&lt;/<span class="hljs-name">v-flex</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-flex</span> <span class="hljs-attr">md12</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">color</span>=<span class="hljs-string">"primary"</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"add"</span>&gt;</span>Add<span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span>          <span class="hljs-tag">&lt;/<span class="hljs-name">v-flex</span>&gt;</span>        <span class="hljs-tag">&lt;/<span class="hljs-name">v-layout</span>&gt;</span>      <span class="hljs-tag">&lt;/<span class="hljs-name">v-container</span>&gt;</span>    <span class="hljs-tag">&lt;/<span class="hljs-name">v-card-text</span>&gt;</span>  <span class="hljs-tag">&lt;/<span class="hljs-name">v-card</span>&gt;</span></span>&lt;/v-dialog&gt;
</code></pre><p>Here we add a <code>&lt;v-card-tit</code>le&gt; with “Add a reminder” as a title. Then we use the Vuetify grid system to create a list that spans all 12 columns. We <code>add a &lt;v-te</code>xt-field&gt; th<code>at binds</code> to 'newTask' and has a lable that says “New task”. There will also be a button that, <code>through</code> the @click= event, t<code>rigge</code>rs the 'add' function that we’ll write in just a second.</p>
<p>After saving the changes to your document, you should end up with something like this when you refresh your index.html page in your browser:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Sehm8NfdIO65eutcubldfukWd9A1kYIaAhob" alt="Image" width="674" height="480" loading="lazy"></p>
<p>Don’t worry that the dialogue does not yet work — we must first add the functionality for it inside our <code>Vue()</code> instance. We do this by adding the following to our instance right after the <code>el: '#app'</code> but separated by a comma:</p>
<pre><code>el: <span class="hljs-string">'#app'</span>,<span class="hljs-attr">data</span>: {  <span class="hljs-attr">addModal</span>: <span class="hljs-literal">false</span>,  <span class="hljs-attr">newTask</span>: <span class="hljs-string">''</span>}
</code></pre><p>The <strong>data</strong> object is where we will store our application state. With this tweak, our dialogue should now work. Save and refresh the page.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/2fjdoJY-cmsKeXhu4y4-lEpYUzbocHiWwDYB" alt="Image" width="670" height="1020" loading="lazy"></p>
<p>Now whenever you click to open your dialogue modal, the internal state in <code>data: {}</code> is set to <code>addModal: true</code>, which then displays the modal. Similarly, whenever you write a message in the dialogue’s text input, it will be saved in <code>newTask</code> since the <code>&lt;v-text-field&gt;&lt;/v-te</code>xt-field&gt; is bound to <code>it thro</code>ugh v-model=.</p>
<p>We’ll now add the code for the <code>add</code> function that will save whatever is inside <code>newTask</code> to our soon-to-be list of reminders. This function must be located inside the <strong>methods</strong> object, which we’ll add after our <code>data: {},</code> object in the Vue instance.</p>
<p>The function will look like this:</p>
<pre><code>add() {  <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.newTask !== <span class="hljs-string">''</span>) {    <span class="hljs-built_in">this</span>.tasks.unshift({<span class="hljs-attr">text</span>: <span class="hljs-built_in">this</span>.newTask, <span class="hljs-attr">completed</span>: <span class="hljs-literal">false</span>})    <span class="hljs-built_in">this</span>.addModal = <span class="hljs-literal">false</span>    <span class="hljs-built_in">this</span>.newTask = <span class="hljs-string">''</span>  }}
</code></pre><p>After enclosing the function inside the <code>method: {}</code> object, the code should now look like this:</p>
<pre><code><span class="hljs-keyword">new</span> Vue({  <span class="hljs-attr">el</span>: <span class="hljs-string">'#app'</span>,  <span class="hljs-attr">data</span>: {    <span class="hljs-attr">addModal</span>: <span class="hljs-literal">false</span>,    <span class="hljs-attr">newTask</span>: <span class="hljs-string">''</span>,    },  <span class="hljs-attr">methods</span>: {    add() {      <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.newTask !== <span class="hljs-string">''</span>) {        <span class="hljs-built_in">this</span>.tasks.unshift({<span class="hljs-attr">text</span>: <span class="hljs-built_in">this</span>.newTask, <span class="hljs-attr">completed</span>: <span class="hljs-literal">false</span>})        <span class="hljs-built_in">this</span>.addModal = <span class="hljs-literal">false</span>        <span class="hljs-built_in">this</span>.newTask = <span class="hljs-string">''</span>      }    }  }});
</code></pre><p>When the <code>add()</code> function fires, it will add our task from <code>newTask</code> to our not-yet created tasks list unless it’s empty. It will then close the dialogue by setting <code>this.addModal = false</code> and set the <code>newTask</code> to empty again.</p>
<p>Let’s create our task list so that we can begin entering some reminders. Inside the <code>data</code> object, place this code:</p>
<pre><code>tasks: [   <span class="hljs-comment">// Some dummy data   {    text: 'Chores',    completed: false   },   {    text: 'More chores',    completed: false   }]</span>
</code></pre><p>These will be our dummy reminders. As you can see, we have a <code>completed</code> key that is set to either <code>true</code> or <code>false</code> so that we can differentiate between the tasks that are completed and those which are not. This also means that we can’t simply display our <code>tasks</code> list as it is in our UI, because then we would be displaying completed and non-completed tasks together.</p>
<p>The way we’ll solve this is with <strong>computed properties.</strong> They work by constantly watching for changes in your application and returning a computed value based on the changes.</p>
<p>We need two computed properties: one for the <code>todo</code> list and one for the <code>done</code> list that will each separate incomplete and completed tasks. We add <code>computed: {}</code> after our <code>methods: {},</code> and drop in <code>todo: function() {}</code> and <code>done: function() {}</code> computed properties. The <code>todo</code> function will <code>return this.tasks.filter(function(task) {return !task.completed})</code> and the <code>done</code> function will return the opposite by removing the <code>!</code> (which means “not”) in front of <code>task.completed</code> . The code should look like this:</p>
<pre><code>computed: {  <span class="hljs-attr">done</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{   <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.tasks.filter(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">task</span>) </span>{<span class="hljs-keyword">return</span> task.completed})  },  <span class="hljs-attr">todo</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{   <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>.tasks.filter(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">task</span>) </span>{<span class="hljs-keyword">return</span> !task.completed})  }}
</code></pre><p>We’re now ready to render our two lists in our UI. This is going to be quite a bit of markup, but don’t worry, we’ll walk through it together. We’re going to replace <code>&lt;v-container&gt;Hello world&lt;/v-c</code>ontainer&gt; by selecting it and then pasting in the following in its place:</p>
<pre><code>&lt;v-container grid-list-md&gt;  <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">v-layout</span> <span class="hljs-attr">row</span> <span class="hljs-attr">wrap</span>&gt;</span>    <span class="hljs-tag">&lt;<span class="hljs-name">v-flex</span> <span class="hljs-attr">xs12</span>&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">v-list</span>&gt;</span>        <span class="hljs-tag">&lt;<span class="hljs-name">v-subheader</span>&gt;</span>Tasks to do<span class="hljs-tag">&lt;/<span class="hljs-name">v-subheader</span>&gt;</span>        <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile</span> <span class="hljs-attr">v-for</span>=<span class="hljs-string">"task in todo"</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-action</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">icon</span> <span class="hljs-attr">ripple</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"complete(task)"</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">v-if</span>=<span class="hljs-string">"task.completed"</span>&gt;</span>check_circle<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">v-else</span>&gt;</span>check_circle_outline<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-action</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-title</span>&gt;</span>            {{task.text}}          <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-title</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-action</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">icon</span> <span class="hljs-attr">ripple</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"remove(task)"</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">color</span>=<span class="hljs-string">"grey lighten-1"</span>&gt;</span>cancel<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span>          <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-action</span>&gt;</span>        <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile</span>&gt;</span>      <span class="hljs-tag">&lt;/<span class="hljs-name">v-list</span>&gt;</span>    <span class="hljs-tag">&lt;/<span class="hljs-name">v-flex</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-flex</span> <span class="hljs-attr">xs12</span>&gt;</span>      <span class="hljs-tag">&lt;<span class="hljs-name">;v-list</span>&gt;</span>        <span class="hljs-tag">&lt;<span class="hljs-name">v-subheader</span>&gt;</span>Completed tasks<span class="hljs-tag">&lt;/<span class="hljs-name">v-subheader</span>&gt;</span>        <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile</span> <span class="hljs-attr">v-for</span>=<span class="hljs-string">"task in done"</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-action</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">icon</span> <span class="hljs-attr">ripple</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"complete(task)"</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">v-if</span>=<span class="hljs-string">"task.completed"</span>&gt;</span>check_circle<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">v-else</span>&gt;</span>check_circle_outline<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-action</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-title</span>&gt;</span>            {{task.text}}          <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-title</span>&gt;</span>          <span class="hljs-tag">&lt;<span class="hljs-name">v-list-tile-action</span>&gt;</span>            <span class="hljs-tag">&lt;<span class="hljs-name">v-btn</span> <span class="hljs-attr">icon</span> <span class="hljs-attr">ripple</span> @<span class="hljs-attr">click</span>=<span class="hljs-string">"remove(task)"</span>&gt;</span>              <span class="hljs-tag">&lt;<span class="hljs-name">v-icon</span> <span class="hljs-attr">color</span>=<span class="hljs-string">"grey lighten-1"</span>&gt;</span>cancel<span class="hljs-tag">&lt;/<span class="hljs-name">v-icon</span>&gt;</span>            <span class="hljs-tag">&lt;/<span class="hljs-name">v-btn</span>&gt;</span>          <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile-action</span>&gt;</span>        <span class="hljs-tag">&lt;/<span class="hljs-name">v-list-tile</span>&gt;</span>      <span class="hljs-tag">&lt;/<span class="hljs-name">v-list</span>&gt;</span>    <span class="hljs-tag">&lt;/<span class="hljs-name">v-flex</span>&gt;</span></span>  &lt;<span class="hljs-regexp">/v-layout&gt;&lt;/</span>v-container&gt;
</code></pre><p>To begin with, we add <code>grid-list-md</code> to our container. Then we add <code>&lt;v-layout row wrap&gt;&lt;/</code>v-lay<code>out&gt; and &lt;v-fl</code>ex xs12&gt; and add o<code>ur two &lt;v-</code>list&gt; tag`s with a  in each. This creates our basic layout in form of two lists.</p>
<p>Then, we will add <code>&lt;v-list-tile v-for="task in todo"&gt;&lt;/v-l</code>ist-tile&gt;<code>; wher</code>e the v-for= statement iterates t<code>hrou</code>gh each task in o<code>ur c</code>omputed todo property. Same thing g<code>oes</code> for the done property. As we iterate through each list we will render each list item. Each item will <code>display t</code>he task.text and will have two buttons: one for tri<code>ggering th</code>e complete() function and one to <code>trigger</code> the remove() function.</p>
<p>Let’s continue by writing these inside of our <code>method</code> object.</p>
<pre><code>complete(task) {  task.completed ? task.completed = <span class="hljs-literal">false</span> : task.completed = <span class="hljs-literal">true</span>},remove(task) {  <span class="hljs-built_in">this</span>.tasks = <span class="hljs-built_in">this</span>.tasks.filter(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>)</span>{<span class="hljs-keyword">return</span> x !== task})},
</code></pre><p>The <code>complete</code> function body contains a ternary operator which will toggle the complete button on each reminder. Whenever <code>task.completed</code> is set to <code>true</code> on a reminder, the entire UI will update and move this reminder to the “Completed” list.</p>
<p>You should now have a real working prototype of our reminder application!</p>
<h3 id="heading-final-thoughts">Final thoughts</h3>
<p>In this article, I was not trying to show how to specifically build a useless reminders app with limited functionality (although that is exactly what I did). Rather, that you can use these tools that I have presented to you to very rapidly build a collection of mock-ups and then, with minimal setup, create a real, working prototype from these designs.</p>
<p>With this in place you can now tweak your component library, build out your designs, and then quickly implement them in code as you go along.</p>
<p>You can find the finished Sketch file and code <a target="_blank" href="https://github.com/adamwattis/MaterialReminders">here</a>. I also strongly recommend diving deeper into the tools I’ve talked about to fully realize their potential.</p>
<p>Hope you enjoyed this article and that you find it useful. Comment if you have any questions or let me know what you thought of it.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A Beginner’s Guide to Rapid Prototyping ]]>
                </title>
                <description>
                    <![CDATA[ By Anant Jain Everything you need to know about rapid prototyping in 7 minutes (or less) _Photo by [Unsplash](https://unsplash.com/photos/ZEtE38ybfao?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText" rel="noopener" target="_blank" ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-beginners-guide-to-rapid-prototyping-71e8722c17df/</link>
                <guid isPermaLink="false">66c341d24f1fc448a3678f68</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ UX ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 04 Jun 2018 17:41:03 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*HX9NJx68T86OwbXaqVkvFQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Anant Jain</p>
<h4 id="heading-everything-you-need-to-know-about-rapid-prototyping-in-7-minutes-or-less">Everything you need to know about rapid prototyping in 7 minutes (or less)</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/5qzGNw8C9xwwmdJldM37fw6w75ORpHLoKfNO" alt="Image" width="800" height="533" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/photos/ZEtE38ybfao?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener" target="_blank" title=""&gt;Denise Jans on &lt;a href="https://unsplash.com/search/photos/sketch?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText" rel="noopener" target="<em>blank" title=")</em></p>
<p>The process of going from an idea to a product is a messy one. Learning how to <strong>prototype</strong> your idea, getting <strong>feedback,</strong> and <strong>iterating</strong> on it is the most critical skill anyone aspiring to build their own products should have. This is also one of the most significant parts of a UX Designer’s job.</p>
<p>Prototypes come in many forms, from a rough sketch on paper to an interactive simulation that looks like the final product. This guide is for complete beginners who want to understand what Prototyping is all about.</p>
<p>We’ll cover the meaning of a few terms related to rapid prototyping as well as the following:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/b6UKvthzAF9CuxMEvKyCWbFrz-1Y4ebUTD9W" alt="Image" width="800" height="544" loading="lazy"></p>
<h3 id="heading-what-is-rapid-prototyping">What is Rapid Prototyping?</h3>
<p><strong>Rapid Prototyping</strong> is an iterative process used to visualize what a website or an application will look like in order to get feedback and validation from users, stakeholders, developers, and designers.</p>
<p>When used well, rapid prototyping will improve the quality of your designs by enhancing communication between the various parties and reducing the risk of building something that no one wants.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/A5VjPPtQAwHuorrrfsNyrUKkIZwGQe5VIvWG" alt="Image" width="394" height="105" loading="lazy"></p>
<h3 id="heading-what-do-you-need-to-prototype">What do you need to prototype?</h3>
<p>A prototype is not designed to be a fully functional version of a system, but is only meant to help visualize the user experience of the final product. As Google Ventures design partner Daniel Burka says:</p>
<blockquote>
<p>The ideal prototype should be “Goldilocks quality.” If the quality is too low, people won’t believe the prototype is a real product. If the quality is too high, you’ll be working all night, and you won’t finish. You need Goldilocks quality. Not too high, not too low, but just right.</p>
</blockquote>
<p>You can prototype not just screens, apps, or websites, but almost anything. Prototyping is an excellent method to test the following (examples provided):</p>
<ul>
<li><strong>New functionalities:</strong> Prototype Instagram Stories in the Instagram app (before they were launched)</li>
<li><strong>Changes in a workflow:</strong> Prototype Medium’s new publishing flow after the introduction of paid memberships</li>
<li><strong>New technology:</strong> Prototype a self-driving car journey!</li>
<li><strong>New interface:</strong> Prototype Apple Watch interface (when it first launched)</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NurFywb8TPPnJmC4RGVvQvAaDnXgySVEinbY" alt="Image" width="339" height="105" loading="lazy"></p>
<p>So, now you understand what rapid prototyping is for. But how do you do it? We’ll cover that next.</p>
<h3 id="heading-the-rapid-prototyping-process">The Rapid Prototyping Process</h3>
<p>Rapid Prototyping involves a three-step process, repeated as many times as needed:</p>
<ol>
<li><strong>Prototype:</strong> Create a visual mock-up of your solution or interface.</li>
<li><strong>Review:</strong> Share the prototype with users and evaluate if it meets their needs and expectations.</li>
<li><strong>Refine:</strong> Based on this feedback, identify areas that need to be improved or clarified.</li>
</ol>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ffihuZ-4Elgt58YaSRiAUnSscAya9MRQU8rP" alt="Image" width="192" height="204" loading="lazy">
<em>Prototype, Review, Refine, Repeat.</em></p>
<p>A prototype will usually start with a very simple mock-up of key areas and become more complex with each iteration as you gather more data from user feedback.</p>
<h3 id="heading-how-much-should-you-include-in-your-prototype">How much should you include in your prototype?</h3>
<p>Focus on the critical functions that will be used most often. The point of rapid prototyping is to show how a feature will work or what the design will look like without prototyping the entire product in detail. Remember, we’re aiming for the <em>Goldilocks quality</em>!</p>
<p><strong>Prototype one <a target="_blank" href="https://www.commonlounge.com/discussion/a916ed5af1354c8eb26ce23b3fcc9076">User Flow</a> at a time.</strong> Instead of going screen by screen, base your prototype on a story that will take the user through the areas that you want to prototype. This way, you will get more accurate feedback because your prototype will reflect real life scenarios. For instance, prototype the “sign-up/sign-in/reset password” flow together.</p>
<p>Also, remember to have an <strong>iteration plan</strong> in mind. A good rule of thumb when planning iterations is to start broad and then work your way towards a more detailed version of the solution. As you iterate, the <strong>fidelity</strong> of your prototypes, as well as how much you include in them, will increase.</p>
<p>But wait, what is this fidelity?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/fCfU17dw1FhQ-o7HRasPE8n4WInDm8uIpGWX" alt="Image" width="421" height="137" loading="lazy"></p>
<h3 id="heading-what-is-meant-by-the-fidelity-of-a-prototype">What is meant by the fidelity of a prototype?</h3>
<p>Fidelity refers to how closely a prototype matches the final product or solution. You can choose from a lot of different options and levels of accuracy, depending on the stage of the process and the goal of the prototype.</p>
<h4 id="heading-visual-sketched-vs-styled">Visual (Sketched vs. Styled)</h4>
<p>Layout and design are the most noticeable aspects of a prototype’s fidelity. If a prototype is produced with a high level of visual fidelity from the beginning, users will tend to focus on visual rather than functional details, which would distract from the primary goal of the early stages of prototyping.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/VKHMotJwxYRMeoPLi8MyeRsNYLgAGh1gPNyV" alt="Image" width="400" height="354" loading="lazy">
<em>Static prototypes with two different fidelity levels - sketched (low-fidelity) and styled (high-fidelity)</em></p>
<h4 id="heading-functional-static-vs-interactive">Functional (Static vs. Interactive)</h4>
<p>Should the prototype be static, or does it have to look fully functional (interactive)? Both versions have pros and cons: static prototypes are simpler and quicker to implement, while interactive ones can be used later for usability testing and user training.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ac1jEB5Ae93MeTGmH0dLxcbDJ3BCf-2xS3wi" alt="Image" width="270" height="480" loading="lazy">
_A high-fidelity Interactive Prototype. ([Source](https://framer.com/getstarted/examples/" rel="noopener" target="<em>blank" title="))</em></p>
<h4 id="heading-content-lorem-ipsum-vs-real-content">Content (Lorem ipsum vs. real content)</h4>
<p>In the early stages of prototyping, standard “lorem ipsum” content can be useful to avoid distracting the user so they can focus on providing functional feedback instead of commenting on changes in the text.</p>
<p>However, as the prototyping process continues, evaluate the need to replace dummy text with real content so users can get a feel for how it affects the overall design.</p>
<p>Using real labels is also an excellent opportunity to test whether your “copy” is working well or not. <em>“Copy”</em> is just a fancy term for text labels and information you see on the screen, like calling the “Publish” button “Publish,” “Post,” “Send,” “Done” or something else.</p>
<h4 id="heading-what-fidelity-levels-exist">What fidelity levels exist?</h4>
<ul>
<li><strong>Low-Fidelity:</strong> Low-Fi methods like <strong>pencil-and-paper</strong> sketches produce static prototypes with low visual and content fidelity that allow for quick and easy changes. This forces the user to <strong>focus on functionality</strong> and on how they will use the system instead of what it looks like.</li>
<li><strong>Medium-Fidelity:</strong> Computer-based tools like Visio produce what we can call medium-fidelity prototypes in the form of <strong>wireframes and workflows</strong>. This level of fidelity is used to demonstrate a system’s behavior, to determine if user needs are being met, and to evaluate the user experience.</li>
<li><strong>High-Fidelity:</strong> High-fidelity prototypes can sometimes be so <strong>realistic</strong> that they are often mistaken for the real product. They are also much more <strong>time-consuming</strong> to produce. Tools like InVision, Sketch, Figma, Adobe XD, Framer, and so on allow non-technical users to create high-fidelity prototypes. Although these cannot be converted into usable code, they can be very handy later for usability testing or user training purposes.</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/ACvrWDgzvqdG6BjR3VGbWGMNNFbfiJNhl9EJ" alt="Image" width="800" height="350" loading="lazy">
_From Low-Fi, to Med-Fi, to Hi-Fi. ([Source](http://murdochcarpenter.com/portfolio/wireframes/" rel="noopener" target="<em>blank" title="))</em></p>
<h3 id="heading-how-do-you-select-which-fidelity-level-to-prototype-on">How do you select which fidelity level to prototype on?</h3>
<p>Most of the time, designs are best evaluated by starting with a rough sketch, then moving on to higher fidelity levels depending on the system’s complexity and requirements.</p>
<p>Sometimes, your choice might be guided by client requirements or areas of focus. For example, if you want to evaluate the visual impact of an interface change, you might want to go with a styled design instead of a rough sketch. Or if your solution is message focused, you may decide to use real content instead of standard “lorem ipsum” placeholder text.</p>
<h3 id="heading-how-do-you-choose-a-prototyping-tool">How do you choose a prototyping tool?</h3>
<p>There is a wide variety of tools available for prototyping depending on your needs and approach. Before choosing a tool, here are a few questions to ask:</p>
<ul>
<li>How much <strong>time</strong> would it take to learn how to use the tool?</li>
<li>Does it <strong>support</strong> prototypes for the needs of my product (web, software applications, mobile apps, some new technology, and so on)?</li>
<li>Does the tool allow me to <strong>share</strong> my prototypes with others and gather their feedback?</li>
<li>How <strong>easy</strong> is it to make changes to the prototype?</li>
<li>Can I use pre-defined <strong>templates</strong> and stencils with this tool?</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/K3erYAGxrQQ1NwGrxKlfxhImXszFR0cL1sQf" alt="Image" width="395" height="100" loading="lazy">
<em>Paper and pencil, Sketch, Figma, Framer, Photoshop, Illustrator, XD, Origami…</em></p>
<h3 id="heading-prototyping-best-practices-dos-and-donts">Prototyping best practices: do’s and don’ts</h3>
<h4 id="heading-dos">Do’s:</h4>
<ul>
<li>Work with users and stakeholders to get the most <strong>feedback</strong> and engage them in the ownership of the final product</li>
<li><strong>Set expectations</strong> early by making sure the users and stakeholders know that prototyping is a way to get answers to specific questions, and does not represent the finished product.</li>
<li>Make your high-fidelity <strong>realistic</strong> (including response delays) so that users and stakeholders are not disappointed when they compare it with the final product.</li>
<li><strong>Save templates</strong> and <strong>stencils</strong> to reuse on future projects.</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FNeeP1IvLcp4wFsSifUhsqInn9WpvIvbhDdd" alt="Image" width="359" height="90" loading="lazy"></p>
<h4 id="heading-donts">Don’ts:</h4>
<ul>
<li>Don’t prototype features that won’t be in the final product</li>
<li>Don’t be a perfectionist. Good enough is your friend. The goal of rapid prototyping is to give everyone a common ground.</li>
<li>Don’t prototype everything!</li>
</ul>
<p>If your’re wondering how you should go about testing out your prototypes, read my post on <strong>Usability Testing</strong> here:</p>
<p><a target="_blank" href="https://medium.freecodecamp.org/the-well-kept-secret-behind-great-ux-usability-testing-b788178a64c3"><strong>The well-kept secret behind great UX: Usability Testing</strong></a><br><a target="_blank" href="https://medium.freecodecamp.org/the-well-kept-secret-behind-great-ux-usability-testing-b788178a64c3">_Whether you only have a prototype or a full-fledged product, it’s a really good idea to run monthly usability tests…_medium.freecodecamp.org</a></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wxhnCzxZeil1xl9xbecfmyRG1Haq-vJm4FMG" alt="Image" width="408" height="38" loading="lazy"></p>
<p>Thanks for reading this quick guide. This was originally published as part of the <a target="_blank" href="https://www.commonlounge.com/discussion/d8c1c96e92024adf9f496fe41dcaad1a">UX Design course</a> on <a target="_blank" href="https://www.commonlounge.com/">Commonlounge</a>, a platform that has courses with small bite-sized lessons like these on topics ranging from <a target="_blank" href="https://www.commonlounge.com/discussion/8053bde657804a6b9135c0d781c9d2c7">Django</a> to <a target="_blank" href="https://www.commonlounge.com/discussion/35ccdb70826e434a876d612504297232">Machine Learning</a> that deliver the most value for the time you put in.</p>
<p>You learn by working on real-world projects and getting feedback from industry mentors. You should check it out <a target="_blank" href="https://www.commonlounge.com/">here</a>!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/O-5tUrbEFpQIl99ba4-aoq6F3IoYvpHNRhbz" alt="Image" width="55" height="60" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ To prototype or not to prototype: that is the question. ]]>
                </title>
                <description>
                    <![CDATA[ By Rishal Hurbans I’ve been involved in a number of projects that required the development of prototypes in a short period of time. These prototypes helped evaluate the viability of ideas and the user experience of a specific solution. Sometimes they... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/to-prototype-or-not-to-prototype-that-is-the-question-2f85c8cde2b/</link>
                <guid isPermaLink="false">66c36369c6c49ae59cf21b18</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ UX ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 02 Oct 2017 15:45:22 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*0oSxm4hhXCeNXKKBiMqd8w.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Rishal Hurbans</p>
<p>I’ve been involved in a number of projects that required the development of prototypes in a short period of time. These prototypes helped evaluate the viability of ideas and the user experience of a specific solution. Sometimes they served as proof that the concept could be developed given the constraints.</p>
<h3 id="heading-what-is-software-prototyping">What is Software Prototyping?</h3>
<p>Prototyping is the process of creating incomplete versions of a proposed solution. That sounds bad — it’s incomplete! But the aim of prototyping is to simulate only a few key aspects of the solution. This helps us evaluate the viability of potential solutions in terms of cost, complexity, usability, and value.</p>
<p>Projects are often taken on before team members fully understand the effort required to achieve their goals. Sometimes they don’t understand if the solution is what’s required. Prototyping can assist in the analysis of these requirements, and can help the team learn more about the solution domain or problem domain, depending on the approach.</p>
<h3 id="heading-prototyping-and-design-thinking">Prototyping and Design Thinking</h3>
<p>Design thinking, as a mindset, is the methodology for crafting solutions to complex problems using creative techniques. You have to account for both the known landscape, and the potential possibilities within that landscape.</p>
<p>Prototyping is a big part of design thinking. Visually representing, understanding, evaluating, and learning from ideas is at the core of design thinking. Design thinkers concern themselves with the solution space, not just the problem space. In design thinking, it is common to uncover or create new problems to solve when evaluating prototypes — and this is a good thing.</p>
<h3 id="heading-why-prototype">Why Prototype?</h3>
<h4 id="heading-early-user-acceptance-testing"><strong>Early user acceptance testing</strong></h4>
<p>People get a chance to use and experience the solution early in development. This will result in early feedback from the user base, and allows you to implement changes earlier rather than later. The cost of a change in a project increases significantly in later phases of development.</p>
<h4 id="heading-realize-requirements-and-constraints-that-were-not-previously-considered"><strong>Realize requirements and constraints that were not previously considered</strong></h4>
<p>By simulating some of the functionality of a product, the team may discover side effects, constraints, or additional requirements that were not considered before. This assists in achieving a more complete and robust solution.</p>
<h4 id="heading-better-cost-time-and-complexity-estimates"><strong>Better cost, time, and complexity estimates</strong></h4>
<p>By realizing additional requirements and constraints early, as well as receiving user feedback early, you can make better complexity and time estimates. This results in better cost and time estimates. These estimates impact a range of activities when rolling out a solution to production.</p>
<h4 id="heading-slaying-the-dragon"><strong>Slaying the dragon</strong></h4>
<p>In software development, we speak about slaying the dragon: A single team of heroes attempts to slay a large project (or “dragon”). With software prototyping, we try to make slaying the dragon more like shooting fish in a barrel — we tackle smaller or more complex features first.</p>
<h3 id="heading-a-process-for-prototyping">A Process for Prototyping</h3>
<h4 id="heading-step-1-understand-the-landscape"><strong>Step 1: Understand the landscape</strong></h4>
<p>You must understand the existing technology and business landscape, as well as the future vision and strategy. This is a crucial foundation for developing any solution.</p>
<h4 id="heading-step-2-identify-the-core-requirements"><strong>Step 2: Identify the core requirements</strong></h4>
<p>These are the requirements for the solution. These are usually derived from the ideas at hand, or from the problems you’re attempting to solve. Requirements usually evolve as you learn more.</p>
<h4 id="heading-step-3-research"><strong>Step 3: Research</strong></h4>
<p>Determine if something already exists that fits the requirements. Look at competitors or similar solutions. Uncover the details not mentioned in the core requirements. These uncovered details could be a blocker for the solution, or could potentially open the door for better, more valuable features.</p>
<h4 id="heading-step-4-develop-an-initial-prototype"><strong>Step 4: Develop an initial prototype</strong></h4>
<p>Prototype the features that are important and have high impact. This depends on the goal of the prototype. If complicated features with unknown possibilities exist, then tackle these first. If there are many simple features, try to simulate an experience across all these features without delving into the complexity in each.</p>
<h4 id="heading-step-5-evaluate-and-review-the-prototype"><strong>Step 5: Evaluate and review the prototype</strong></h4>
<p>You should review the developed prototype with the target user group and relevant stakeholders. Some prototypes could even be released to production for evaluation.</p>
<p>The performance of the features and usability should be evaluated and measured both quantitatively and qualitatively. This means that you gain some knowledge from measurable numbers, and other info from human intuition and observation.</p>
<h4 id="heading-step-6-revise-and-enhance-the-prototype"><strong>Step 6: Revise and Enhance the Prototype</strong></h4>
<p>After reviewing the feedback from the prototype, you gather information. Then you can make enhancements and changes.</p>
<h4 id="heading-step-7-repeat"><strong>Step 7: Repeat</strong></h4>
<p>If unknowns still exist, repeat the above process. In fact, even with solutions in production, this process can be harnessed to test new ideas for the solution.</p>
<h3 id="heading-dimensions-of-prototyping">Dimensions of Prototyping</h3>
<h4 id="heading-horizontal-prototyping">Horizontal Prototyping</h4>
<p>The aim is to provide a broad view of the entire solution. There will be little complexity in individual features. This approach is good for websites and instances where you need to achieve a general feel for the product.</p>
<p>Typically, these are solutions that are targeted to the public, or solutions that require intensive usability testing.</p>
<h4 id="heading-vertical-prototyping">Vertical Prototyping</h4>
<p>The prototype will focus on a small set of features, sometimes even just one or two. The chosen features are explored and researched completely. This approach is good for solutions where you use obscure or complex algorithms, or when you attempt something unusual or unorthodox.</p>
<p>This is useful for experimenting with new tech, new approaches, and typically when you desire “disruption.”</p>
<h3 id="heading-types-of-prototyping">Types of Prototyping</h3>
<h4 id="heading-throwaway-prototyping"><strong>Throwaway Prototyping</strong></h4>
<p>This is also known as close-ended prototyping. Rapid Prototyping involves creating a working model of parts of the system, at an early stage of development, after a relatively short investigation.</p>
<p>This kind of prototyping shows people what the feature will look like. But the code base or project is not necessarily used for the production version of the application.</p>
<h4 id="heading-evolutionary-prototyping"><strong>Evolutionary Prototyping</strong></h4>
<p>The main goal here is to build a very robust prototype in a structured manner and constantly refine it. The prototype forms the heart of the production application, and additional features are added to it.</p>
<h4 id="heading-incremental-prototyping"><strong>Incremental Prototyping</strong></h4>
<p>In incremental prototyping, parts of the system are developed as separate prototypes and plugged together to form a complete application. It is important to develop the interfaces for the separate components early, as integration may turn out to be a nightmare.</p>
<h4 id="heading-extreme-prototyping"><strong>Extreme Prototyping</strong></h4>
<p>Extreme Prototyping is employed mainly for web applications and usually in three phases:</p>
<ol>
<li>Static HTML/CSS/JS is created — this gives users an instant tangible feel for the product.</li>
<li>Thereafter, the service layer is simulated — this includes business rules and logic.</li>
<li>Lastly, the actual service layer is developed — this involves integrating with real-world systems and plugging that into the front end HTML/CSS/JS views.</li>
</ol>
<p>This gives users an early view of the application without having actual functionality behind it. The backend will gradually come together as the process moves along.</p>
<h3 id="heading-disadvantages-of-prototyping">Disadvantages of Prototyping</h3>
<h4 id="heading-insufficient-analysis">Insufficient analysis</h4>
<p>The confidence in a prototype could cause the team to abandon further analysis of features. This could result in part of the system being well-defined, while the remaining parts are vague and incomplete. This can be controlled through correct processes in requirements analysis.</p>
<h4 id="heading-user-confusion-between-the-prototype-and-the-finished-system">User confusion between the prototype and the finished system</h4>
<p>If the final system is completely different than the prototype, users may be confused about how it operates.</p>
<h4 id="heading-expenses-of-prototyping">Expenses of prototyping</h4>
<p>Although prototyping saves cost in the actual development phase for a solution, there will be costs involved in implementing a prototyping phase.</p>
<p>The risk of spending money on a prototype that could potentially be thrown away must be understood. What you learn from developing that prototype is still valuable!</p>
<h3 id="heading-advantages-of-prototyping">Advantages of Prototyping</h3>
<h4 id="heading-reduced-time-and-costs">Reduced time and costs</h4>
<p>By exploring the requirements and constraints, you can better estimate the upcoming effort.</p>
<h4 id="heading-improved-and-increased-user-involvement">Improved and increased user involvement</h4>
<p>User involvement is important. Prototypes clear up misconceptions and expectations, and they assist in gathering user feedback from early stages of development.</p>
<h4 id="heading-quality-assurance">Quality assurance</h4>
<p>Realize oversights, additional requirements, and constraints.</p>
<h4 id="heading-innovation">Innovation</h4>
<p>Without being brave enough to explore the crazy ideas, an organization can easily stagnate.</p>
<p>There’s a range of topics related to prototyping. To learn more, researching these terms will help: <strong>design thinking, user experience design, agile</strong><em>.</em></p>
<p>Thanks for reading! If you enjoyed this post, please give me some claps so more people see it.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Homeless iPhone (Part 2) ]]>
                </title>
                <description>
                    <![CDATA[ By Fabrice Dubois Pause. Rewind. Deep dive in the design process. Two weeks ago I posted about the possibility of an iPhone that has no Home button at all. With iOS 11 on an iPad you enjoy a whole new app switcher. As a little design challenge, I stu... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/homeless-iphone-part-2-1f7b3acc8a6c/</link>
                <guid isPermaLink="false">66c34c894f7405e6476b01cf</guid>
                
                    <category>
                        <![CDATA[ Apple ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ iphone ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ user experience ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 24 Aug 2017 12:30:13 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*4Mvw-7X4soi0LMJnQyPbtg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Fabrice Dubois</p>
<p><em>Pause. Rewind. Deep dive in the design process.</em></p>
<p>Two weeks ago I <a target="_blank" href="https://medium.freecodecamp.org/homeless-iphone-20c154fabbf7">posted about the possibility of an iPhone that has no Home button at all</a>.</p>
<p>With iOS 11 on an iPad you enjoy a whole new app switcher. As a little design challenge, I study how this UI could work on the imminent ‘iPhone 8’, and whether it could cater for the absence of Home button.</p>
<p>Today I’ve paused the exploration, and I’m walking you through the design process. We’ll review my sketches in detail, see what they reveal about the train of thought (<em>ouch!</em>), and look at a couple of prototype variants that you’ll be able to download and try.</p>
<blockquote>
<p>Being process-oriented, not product-driven, is the most important and difficult skill for a designer to develop.</p>
<p>Matthew Frederick</p>
</blockquote>
<p>Sketches and prototypes below are provided <em>as is</em>, they haven’t been modified at all for the sake of this article. I include raw scans of my large sketch boards, so the post is probably best viewed on desktop or tablet.</p>
<h3 id="heading-sketching">Sketching</h3>
<p>I always keep my sketches and notes. They’re useful to review in slow motion what has happened in the mind, assess the reasoning, and have a fresh look at germinating ideas that were forgotten on the road side.</p>
<p>For this project I used two A3 sheets. Let’s comment the key screens:</p>
<blockquote>
<p><strong><em>1.</em></strong> <strong><em>Trying to force-fit the iPad design.</em></strong> <em>In that first attempt, everything is on a single horizontal scroll view. And there’s a Home button! False start.</em></p>
<p><strong><em>2.</em></strong> <strong><em>Trying again.</em></strong> <em>But stopping fast since clearly, it’s not going to work. My proportions are completely unrealistic. Lack of discipline.</em></p>
<p><strong><em>3. A more realistic ratio</em></strong><em>. I finally acknowledge it’s a very long phone I’m dealing with (6/13 ratio). I’m going to need my imagination. The whole view now scrolls vertically, with apps on 2 columns. An accident happens here: my focus has now shifted to the iPhone’s Control Centre (that I’m probably examining on my iOS 11 phone, as a model for the sketch). I’m misled and add the little chevron at the top, meaning “swipe down to close”.</em></p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/KFPEoJsGeyiPVN4Dyv4UAYIV8mMH5Cxz4hp5" alt="Image" width="800" height="542" loading="lazy">
<em>Sheet 1 of 2</em></p>
<blockquote>
<p><strong><em>4.</em> <em>A potential conflict.</em></strong> <em>Because I now wrongly assume the UI can be swiped down, I worry this is going to interfere with my vertical scroll. I capture this in a side note: “KO since swipe needed to close overlay”. I swap things, move apps to the top, as if it could help, but finally plant the seed of an alternative idea: “Recent apps @ top but as horiz. carousel”.</em></p>
<p><strong><em>5.</em> <em>One last shot at the vertical scroll.</em></strong> <em>Here, I guess I’m seeking confirmation that the vertical approach is flawed... But my mind forks again as I notice a new issue! Controls and recent apps compete for visibility: Scroll to view one and the other is pushed out of bounds. They’re part of the same strap. At that point I decide to try decoupling them.</em></p>
</blockquote>
<p><img src="https://cdn-media-1.freecodecamp.org/images/bEdIEtTi3RKTZgHoeJwAVRerrDO18vy1pGKE" alt="Image" width="800" height="542" loading="lazy">
<em>Sheet 2 of 2</em></p>
<blockquote>
<p><strong><em>6. Recent apps as horizontal carousel.</em></strong> <em>That looks more familiar for an app switcher. Controls still scroll vertically, though — so how does that work as a whole? Doesn’t feel right. I appear distracted again between 6 and 7 but let’s skip that.</em></p>
<p><strong><em>7. Two parallel scroll views.</em></strong> <em>The control group and the app carousel are now free to move without running into each other. Space is shared equally. I annotate some elements with “Size?”: Can I afford that layout on the real device? Only one way to know: Increase fidelity. But overall I sense I’ve got a candidate solution I can work with.</em></p>
</blockquote>
<h3 id="heading-observations">Observations</h3>
<p><strong>I don’t state my goal</strong>. That’s a pity because something as simple as “Adapt the new iPad switcher to the iPhone 8” (even if obvious) would have focused me sooner on the actual issues.</p>
<p><strong>I don’t have a very clear logic in mind.</strong> Evidence of confusion: The fallacy that the UI is an overlay that can be swiped down, and the Home button that I remove then for some reason bring back (don’t ask!).</p>
<p><strong>I seem mainly concerned by a layout problem.</strong> Apparently I don’t worry much about how to access the home screen. Yet that’s very key in my experiment! I do leave a shy trace at step 3: “Lacks obvious way to go to HS”, and then stick a Home button everywhere. This is embarrassing (given the experiment is all about button-less!) — I’m probably aware that at some point I need to find empty space so the background can be tapped, like on the iPad switcher, but I wouldn’t swear. The Home button looks more like a mechanically applied FIX-ME label, something I don’t want to deal with yet.</p>
<blockquote>
<p>Being process-oriented means: [Long list that includes:] Working fluidly between concept-scale and detail-scale to see how each informs the other.</p>
<p>Matthew Frederick</p>
</blockquote>
<p><strong>My drawing and handwriting look awful.</strong> But somehow that’s positive. In the process of doing these sketches it never occurred to me that I would share them later; in the moment, the absence of aesthetic requirements actually <em>did</em> reinforce focus.</p>
<p><strong>Side notes help inform my next steps</strong>. Sketch, evaluate, note issues, and try addressing them in a future iteration. Any change can bring new problems, and the sooner I capture them, the better. It’s just so easy to spot and forget. I’ll take side notes more systematically in the future.</p>
<h3 id="heading-prototyping">Prototyping</h3>
<p>You can try the prototypes below if you use <a target="_blank" href="http://principleformac.com/index.html">Principle</a>, on a Mac or an iPhone directly. Click the movie captions to download the Principle .prd files. To learn more check <a target="_blank" href="http://principleformac.com/docs.html#running-on-device">Principle’s docs</a>, and my tips at the end of the post.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Iw0SnOEAmZH3CKrbMefFowTxKp9bYkcgUi8q" alt="Image" width="800" height="600" loading="lazy">
_[Download v8](https://www.dropbox.com/s/i8lsat5mq5w9x8i/homeless%20v8.prd?dl=1" rel="noopener" target="<em>blank" title=")</em></p>
<p>An early version (v8 above) features the chevron at the top and a discreet Home button at the bottom. Tapping the chevron re-opens the current app (what else could it do?) but so does a tap on the app miniature already.</p>
<p>So this chevron based interaction looks silly, in hindsight. Pay attention to the animation it triggers: While it does the right thing (zooming in the app correctly represents the action of bringing it to the foreground), it is disconnected from the chevron object itself. The chevron, on one hand, is doing what you want (dismiss switcher and return to app) but on the other hand it does <em>not</em> behave as you’d expect (slide down). Prototyping instantly trapped the contradiction here. I should have caught the flaw much earlier, but that’s ok — there are many things in my life that I should’ve done earlier.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/LH5LZRNSFe0foAcKRCUVBBjXcRzwIg8yo-r4" alt="Image" width="800" height="600" loading="lazy">
_[Download v11](https://www.dropbox.com/s/6dsveqoqusqam8g/homeless%20v11.prd?dl=1" rel="noopener" target="<em>blank" title=")</em></p>
<p>The chevron is gone (v11 above) but I now experiment with a home screen miniature (like in iOS 10's switcher). This is efficient for the home screen use case, but it pushes the previous app (green) too far left for a right-hander. And there’s duplication again: the Home button becomes redundant, but if I remove it then the user can only rely on the miniature to go to home screen, which is too far right for <em>left-handers</em>! They could scroll but in this particular case I certainly don’t want them to have to.</p>
<p>There’s another aspect: this model is inconsistent with my target one, whereby only a tap on the background should take you home. This is key for the coherence of the whole, and central to the beauty of the new iOS 11 switcher. Why? Because <strong>the blurred background behind the switcher <em>is</em> the home screen.</strong> Any specific affordance to access the home screen (such as a Home button or my miniature) is superfluous (not to say incoherent) when you can interact with the home screen <em>directly</em>. Depth is one of the core design principles in iOS — with Clarity and Deference — and Apple beautifully builds on it here.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/fKt156S1jrG3GdSdduTaIh-g9ECryaj-W0zy" alt="Image" width="288" height="456" loading="lazy">
<em>Main mental model layers in iOS 11</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/XGPDJ5m0tQYmMDZS9qFFbE9GP3h3q-j1pcJE" alt="Image" width="800" height="600" loading="lazy">
_[Download v14](https://www.dropbox.com/s/9p5zon3u8kfkjru/homeless%20v14.prd?dl=1" rel="noopener" target="<em>blank" title=")</em></p>
<p>In the final v14 iteration above I clean up and more strictly align with the iPad switcher. That’s the version I present in <a target="_blank" href="https://medium.freecodecamp.org/homeless-iphone-20c154fabbf7">part 1</a>. A further improvement could be to enlarge the empty area at the bottom, for instance by limiting the Control Centre grid to 3 rows.</p>
<p>One last quote from Matthew Frederick’s excellent <a target="_blank" href="https://mitpress.mit.edu/books/101-things-i-learned-architecture-school">101 Things I Learned in Architecture School</a>:</p>
<blockquote>
<p>Properly gaining control of the design process tends to feel like one is <em>losing</em> control of the design process […] Accept uncertainty. Recognize as normal the feeling of lostness that attends to much of the process.</p>
</blockquote>
<p>On my journey I drifted away from my initial goal several times and accidentally glimpsed at different possibilities. Some may be worth revisiting later, some opened my eyes to new pitfalls. The wandering isn’t waste, it is the essence of exploration. At the same time one can’t keep opening boxes and adding todos forever; it’s also important to deliver reasonably stable and presentable solutions as you go along. The challenge is to strike a balance between breadth and depth.</p>
<h4 id="heading-tips-if-you-try-the-prototypes"><strong>Tips – if you try the prototypes</strong></h4>
<ul>
<li>Interactions are limited to: swipe up, scroll horizontally, tap the blue app miniature, tap the switcher’s background. In the home screen, tap the blue icon only.</li>
<li>The intermediate Dock state that I describe in the previous post is not supported by the prototypes I share here. In order to create the Dock state movie I made a temporary modification.</li>
<li>The prototypes are designed for the ‘iPhone 8’ itself, at 375 * 812 points (145 pt taller than an iPhone 6/7). So if your test device, like mine, is a 6/7 series, Principle scales down the UI a bit so that it fits your display: Everything looks a bit smaller than it should be. And positioned a bit higher too, due to the bottom area on the 6/7 (no such chin on the future edge to edge display).</li>
<li>However, if you <a target="_blank" href="https://www.dropbox.com/s/2cykf04u1vzpzc3/Simulated%20iPhone%208%20rendering%20%28view%20on%20a%204.7%20inch%29.png?dl=1">open this image on a 6/</a>7 you get a much better idea of the expected ‘iPhone 8’ feel. Just imagine the phone is taller and that you can tap the bottom area anywhere. You may need to first save the image to your photo library. It’s supposed to fill the entire screen and look like this:</li>
</ul>
<p><img src="https://cdn-media-1.freecodecamp.org/images/iCC1SBV7SoerqKjrzZ7IF1BhaewkpYhW2636" alt="Image" width="395" height="335" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A multi-input field messaging app concept ]]>
                </title>
                <description>
                    <![CDATA[ By Dawid Woldu Some time ago I shared in a Medium article the idea for context aware messenger app. The idea challenged the design limitation behind all messenger apps allowing you to write only one message at a time. What I always missed in these ap... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/multi-input-field-messaging-app-concept-911096778de3/</link>
                <guid isPermaLink="false">66c35b94c7095d76345eafed</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ mobile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ UX ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 19 Jun 2017 15:44:42 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*V1FjQERZI5qae8EgEpdjjg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Dawid Woldu</p>
<p>Some time ago <a target="_blank" href="https://medium.com/@dawdus/freeing-the-bubbles-context-aware-messaging-app-8466abdcda27">I shared in a Medium article</a> the idea for context aware messenger app. The idea challenged the design limitation behind all messenger apps allowing you to write only one message at a time.</p>
<p>What I always missed in these apps was a way to save the message I’m currently typing and type and send something else instead. Then a way to get back to previously composed message and continue. Just to stay on topic and keep some order in my conversations.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*V1FjQERZI5qae8EgEpdjjg.png" alt="Image" width="800" height="290" loading="lazy">
<em>Left to right: Messages, Slack, Hangouts, Messenger, Whatsapp.</em></p>
<p>The way I do it today involves the sequence of text field related gestures: <strong>Long press, Select All, Cut, Type in, Send, Long press, Paste, continue.</strong></p>
<p>My concept allowed to replace that sequence with a single tap, but it was up to the app to recognise the need for saving a message based on the context of the conversation. I built a Quartz Composer prototype to show the feature in action:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*Lsq9c3raoWv6ApwNXw8KjQ.gif" alt="Image" width="800" height="500" loading="lazy"></p>
<p><strong>But I never shared the prototype</strong>, as it wasn’t functional, allowed for only one extra input field and was done solely for the purpose of recording that video. Also Origami prototypes for Quartz Composer didn’t work very well on the device (not mentioning the absence of native keyboard).</p>
<p><strong>Release of <a target="_blank" href="http://origami.design">Origami Studio</a> allowed me to revisit the concept and build fully functional (sort of) prototype to share.</strong></p>
<p>I ditched the context aware part and allowed for saving as many drafts as you need, whenever you feel like it.</p>
<h3 id="heading-heres-a-demo-video-of-the-new-prototype"><strong>Here’s a demo video of the new prototype.</strong></h3>
<h3 id="heading-building-in-origami-studio">Building in Origami Studio.</h3>
<p>I could write a separate article/tutorial for each of the technical challenges I encountered while building the proto, but I’ll limit myself to just briefly list some of them here. Hopefully these short descriptions will be enough to spark some ideas whenever you encounter similar blocks. If not don’t hesitate to <a target="_blank" href="https://twitter.com/dawidwoldu">ping me directly</a>.</p>
<h3 id="heading-multi-line-input-field"><strong>Multi line input field.</strong></h3>
<p>Text Field component in Origami Studio doesn’t allow for multi line inputs. When you double tap on it to reveal it’s content’s you’ll find the actual Text Input component that does. The problem is it doesn’t have a cursor/caret. So hacked in a cursor by measuring the position of the last letter in the text field.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*uLDTzgWOHzIkLT8OsL7Q3Q.gif" alt="Image" width="800" height="271" loading="lazy"></p>
<p>Each time you type a letter I check if it’s a ‘space’ and if it is I append it’s index to an Array of spaces. Then I assume that whenever height of the input increases the text will break at the last recorded space. Then I measure the rest of the text to place a cursor in a correct position of the new line. When you don’t tap the space I just measure the size of the text that fit the line.</p>
<h3 id="heading-building-a-conversation-feed"><strong>Building a conversation feed.</strong></h3>
<p>The challenge here was dynamically creating chat bubbles while keeping the correct order in the feed. When bot starts typing you can see the last bubble on the feed with 3 jumping dots. But if you send the message before it finishes typing your bubble should land on the feed before the bot’s bubble. I managed to make it work by keeping two arrays of messages. Temporary one (bot typing) and final and switching between them whenever bot starts typing or sends the message.</p>
<p>I created a JSON config file with the bot messages that allow you to configure what and when the bot is sending and if it should wait for your message(s) to start typing.</p>
<pre><code>{<span class="hljs-string">"message"</span>:<span class="hljs-string">"Ok, I'm dumb. What do you want from me?!"</span>, <span class="hljs-string">"waitforuser"</span>:<span class="hljs-number">2</span>,<span class="hljs-string">"delay"</span>:<span class="hljs-number">1</span>}
</code></pre><p><strong>waitforuser</strong> — describes how many user messages should the bot wait for before it starts typing. Zero means it won’t wait for user at all.<br><strong>delay</strong> — time in seconds before bot starts typing.</p>
<h3 id="heading-creatingremoving-input-fields-and-managing-their-order"><strong>Creating/removing input fields and managing their order.</strong></h3>
<p>Whenever you create input field I’m increasing the count on the Loop patch, but as soon as you don’t need the field anymore I tried to remove the field from the loop and keep the other input fields keep their order and content. It was impossible for me to figure out as <strong>loop patches don’t keep the reference to the actual instance of the element they’re replicating</strong>. I worked around by hiding and reusing unused fields instead of removing them from the loop.</p>
<h3 id="heading-downloads">Downloads!</h3>
<p>You can download Origami prototype, JSON file as well as multiline text field component from my <a target="_blank" href="https://drive.google.com/drive/folders/0B9oWvt9KHdw0T2hOcUdlUFMtMVk?usp=sharing">Google Drive</a>.</p>
<h4 id="heading-users-manual"><strong>User’s Manual:</strong></h4>
<p><strong>Long press on Send button</strong> to save the current text and create new input field. (Yes! It’s undiscoverable. I know.)<br>Prototype is optimised for use on the device. (You can’t hide the keyboard)</p>
<h3 id="heading-last-minute-discovered-fun-facts"><strong>Last minute discovered fun facts:</strong></h3>
<ul>
<li>The prototype crashes when using emojis. ?  </li>
<li>Multi line input field cursor can behave erratically when typing super fast (I’m sharing anyway).  </li>
<li>When you send a message in the exact time that bot starts typing, the empty bot message can appear on the feed.  </li>
<li>Other bug fixes and performance improvements. (What?!)</li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ There weren’t any design events in my city, so I organized one myself. ]]>
                </title>
                <description>
                    <![CDATA[ By Marty Laurita “The meeting of two personalities is like the contact of two chemical substances: if there is any reaction, both are transformed.” — Carl Jung Doing something you’ve never done before is inherently exciting. When I wrote to Framer ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/anatomy-of-an-interaction-design-meetup-656e61295775/</link>
                <guid isPermaLink="false">66c3448fccd54aa295e92ca6</guid>
                
                    <category>
                        <![CDATA[ Framerjs ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 21 Oct 2016 04:18:29 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*bpOJLyijhikcDVfibgokhA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Marty Laurita</p>
<blockquote>
<p>“The meeting of two personalities is like the contact of two chemical substances: if there is any reaction, both are transformed.” — Carl Jung</p>
</blockquote>
<p>Doing something you’ve never done before is inherently exciting.</p>
<p>When I wrote to <a target="_blank" href="https://framerjs.com/">Framer</a> a couple of months ago asking why there weren’t any Framer events scheduled in Boston, they responded with, “Well, why don’t you host one?”</p>
<p>Truth be told, I’m generally not one to organize events. I think I’m a little too micro-manage-y of a person to both enjoy it and keep it running smoothly. It’s like asking Woody Allen to host a comedy show while catering it at the same time. But this time, for some reason, I said yes.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/u9DrIkRiGQ5ZZmuVzX1nEVXn0I35MOBFi2KB" alt="Image" width="800" height="450" loading="lazy">
<em>When someone asks you to host a meetup, jump in!</em></p>
<p>And if Framer hadn’t connected me with two extremely outgoing, organized, and awesome partners-in-crime, <a target="_blank" href="https://www.linkedin.com/in/emilychristinecarlin">Emily Carlin</a> and <a target="_blank" href="https://www.linkedin.com/in/gideon-goldin-2308b521">Gideon Goldin</a>, it would not have gone nearly as smoothly.</p>
<p>So, as Nacho Libre says, “Let’s get down to the neety-greety.”</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/GOmddz7yWLYC3vFx0582k4-kHKXn4RB8JfIM" alt="Image" width="500" height="255" loading="lazy"></p>
<p>As I quickly learned, there are the five ingredients to a successful meetup:</p>
<ul>
<li>Location</li>
<li>Food</li>
<li>Booze</li>
<li>Guest speakers</li>
<li>Some semblance of an agenda</li>
</ul>
<p>We locked down the location, food, and booze relatively quickly. Finding a great speaker was much more of a challenge.</p>
<p>After some time, we connected with <a target="_blank" href="http://www.cutandfold.co/">Andrew Nalband of Cut and Fold</a>, a veteran designer and avid Framer user. He used Framer to develop killer interactions like this:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/lvwbfXyXc4Y1tWBcOmHWnJQwpeQm5xwgfm0U" alt="Image" width="480" height="248" loading="lazy">
_You can try the interactive version here: [http://share.framerjs.com/zydimzquxu7b/](http://share.framerjs.com/zydimzquxu7b/" rel="noopener" target="<em>blank" title=")</em></p>
<p>And after a quick survey of other events, we had an agenda, which I promptly inserted into a flashy little <a target="_blank" href="https://nvite.com/BostonFramer/ac44">invite</a>.</p>
<p>So, our with our ingredients prepped and ready, it was time for liftoff!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/o3IuMStwBfnnE3vvBsL79ikgtmym3USP2mhW" alt="Image" width="400" height="300" loading="lazy"></p>
<h3 id="heading-the-event">The Event</h3>
<p>People began filing in around 6:30, and with our abundance of food and drink, there was a comfortable atmosphere in which to socialize.</p>
<p>We had pre-surveyed participants, so we had some idea of everyone’s skill level going in. Most people had never used a code-based interaction tool like Framer, so we decided to start from ground-level.</p>
<p>The presentation consisted mostly of an introduction and a show-and-tell from Andrew. He went through the basics of the tool, as well as some inspiring examples of it in practice.</p>
<p>What I loved about Andrew’s talk was how comfortably he switched into “educator” mode. He went right down to basics and walked everyone through the interface, what a layer is, and how animation works. We had no idea about what he was going to talk about beforehand, but he totally crushed it!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/C3jGLMxy7J79M1R4gDbNgQxubOpYFySCvo99" alt="Image" width="800" height="531" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-NeJL6nPvZJzWpAsaSxJzDJj5aqQUVEuWNI3" alt="Image" width="800" height="531" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/spsrBtYNNjwwhk-GbmsVAcAUmlPujrCWbWq3" alt="Image" width="800" height="531" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xq0NkOkaD6cM1LUBHteGYP6EcvjRy-baYc38" alt="Image" width="800" height="531" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Q3RiLTDL2VNmjQaiTUfvBTptLjNZYxiOxF8B" alt="Image" width="800" height="531" loading="lazy"></p>
<p>People were so engrossed that Andrew was able to speak for a full hour.</p>
<p>I also went up to share some prototypes, but there are no photos of that since I was charged with the photography ?</p>
<p>We live-streamed the event in its entirety on Facebook. You can watch it <a target="_blank" href="https://www.facebook.com/groups/framerjs/search/?query=marty%20laurita">here</a>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/3i9-OsskrFLIY40v469ThE9khFe4QwSQ6jrT" alt="Image" width="400" height="266" loading="lazy"></p>
<h3 id="heading-reflection-time">Reflection Time</h3>
<p>The biggest lesson learned was that, as others have found, it might be good to split people up at the beginning to maximize the effectiveness of the event.</p>
<p>While the event was a big success, I did get some feedback that some people came expecting more of a walkthrough, while others were there to better understand how framer fits into the design workflow.</p>
<p>For the next event, we will definitely strive to meet these needs, and to be even more awesomer!</p>
<p>I’d like to thank our amazing sponsors of this event: <a target="_blank" href="http://framerjs.com">Framer</a>, <a target="_blank" href="http://www.tamr.com/">Tamr</a>, and <a target="_blank" href="https://www.societyofgrownups.com/">Society of Grown-ups</a>. It wouldn’t have been nearly as great without your support!</p>
<p>Also, thank you for reading! If you have any thoughts, I would love your feedback in the comments.</p>
<p>Also, be sure to check out <a target="_blank" href="https://medium.freecodecamp.com/i-tried-framer-and-i-loved-it-part-2-31fdef35a1e2#.m0nm5t2j7">my last article</a> about prototyping with FramerJS.</p>
<p><em>If you liked this, click the? below so other people will see this here on Medium.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ For more realistic FramerJS prototypes, just add data ]]>
                </title>
                <description>
                    <![CDATA[ By Marty Laurita “Data! Data! Data! I can’t make bricks without clay!” — Sir Arthur Conan Doyle Most interaction prototypes today serve one purpose: to convince your user that this prototype is what the “real thing” will look like and feel like. In... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/i-tried-framer-and-i-loved-it-part-2-31fdef35a1e2/</link>
                <guid isPermaLink="false">66c35773d372f14b49bdcb9b</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ prototyping ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ UX ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 17 Aug 2016 02:01:09 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*uTJpHuWyI1Ly0QxpN31zng.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Marty Laurita</p>
<blockquote>
<p><em>“Data! Data! Data! I can’t make bricks without clay!”</em><br> <em>—</em> Sir Arthur Conan Doyle</p>
</blockquote>
<p>Most interaction prototypes today serve one purpose: to convince your user that this prototype is what the “real thing” will look like and feel like.</p>
<p>In the past, designers have achieved this with fancy user interfaces, animations, and fluid transitions.</p>
<p>But those don’t quite cut it anymore. Users have become jaded to these tricks. They lived through the iPhone era, and now expect a fluid UI to come standard.</p>
<p>So what’s the next frontier then? How can we convince people that a prototype is “real”?</p>
<p>By using real data.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/RBuldGdjUUlgWe4ddyHiOf7CDgkUOkiSfJYx" alt="Image" width="800" height="417" loading="lazy">
<em>Time to go down the rabbit-hole…</em></p>
<p><a target="_blank" href="http://framerjs.com/">FramerJS</a> is a powerful code-based framework for building prototypes for your web apps and mobile apps. In this article, I’ll show you how you can use it to build a realistic prototype that features real data.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/LhK7VTU-bltvg4IbuXyskjszjf0G360oaaaL" alt="Image" width="800" height="457" loading="lazy">
<em>Framer’s Interface, Framerjs.com</em></p>
<p>As a rider of the Massachusetts Bay Transportation Authority (MBTA), I have the distinct pleasure of riding a transit system that is over 100 years old.</p>
<p>As you can imagine, the trains aren’t always on time.</p>
<p>I’ve become relatively familiar with Framer, and as such, I decided to try and design an app to solve this problem.</p>
<p>As a designer who has only a whisper of an understanding of code, this was daunting to say the least.</p>
<p>I called up my brother, a talented computer science major at Tufts, and we got down to business.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YSIqERsQ25SECvWvmzrsCTzSPrJG3pVQOtEB" alt="Image" width="800" height="450" loading="lazy">
<em>[come hither]</em></p>
<h3 id="heading-locating-our-users">Locating our users</h3>
<p>The first thing to do was find the user’s location in realtime.</p>
<p>Today’s mobile browsers have this feature built-in.</p>
<p>With two functions, you can get the latitude and longitude of your user.</p>
<p>Then, you can just stick those coordinates into what’s called a <a target="_blank" href="https://www.google.com/search?q=define+hash+table&amp;oq=define+hash+table&amp;aqs=chrome..69i57j69i60j69i65j69i61j69i60j69i61.2328j0j1&amp;sourceid=chrome&amp;ie=UTF-8">hash table of key value pairs</a>. In this table of data, the key might be “dog_breed” and the value might be “Pomeranian.” So now, you can call on that key whenever you need it, and it will return its corresponding value.</p>
<p>Here’s what we ended up with:</p>
<pre><code>#get locationgetLocation = () -&gt; print “INSIDE GET LOC” navigator.geolocation.getCurrentPosition(showPosition);
</code></pre><pre><code>showPosition = (position) -&gt; print “INSIDE SHOW POS” gpsCoords = { “client_lat”: “#{position.coords.latitude}”, “client_lon”: “#{position.coords.longitude}” }
</code></pre><p>Now that we have the user’s exact location, it’s time for phase II.</p>
<h3 id="heading-locating-our-trains">Locating our trains</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YAH7ojN31RC47pIjYoBTrsv3p--ghcZ6a8Ss" alt="Image" width="800" height="450" loading="lazy">
<em>Where’s that train….Mr. Andersonnnnn?</em></p>
<p>Getting the user’s location was the easy part. Now, we need to find and parse the API data from the MBTA.</p>
<p>Unfortunately, this organization is about as organized as any other under-funded government operation.</p>
<p>So, their code was — how should I put this — a little janky. Here’s what it looks like:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/p8p21fIHRxZoFPNjyjz27AQKjy-HYdS0NJPH" alt="Image" width="632" height="646" loading="lazy">
<em>Kiiind of a jumbled mess.</em></p>
<p>The data was nested in a combination of arrays and key value pairs. Some of them were data tables with just one entry. It took some time to understand how to pull out the data we needed.</p>
<p>Regardless, once we understood the structure, the idea was to grab the location data from the user’s browser and insert that into the API call to the MBTA. Then the MBTA API would return all data closest to that location.</p>
<p>The first piece of data we wanted was the closest station to the current location:</p>
<pre><code>#grab MBTA station datadata = <span class="hljs-built_in">JSON</span>.parse Utils.domLoadDataSync “http:<span class="hljs-comment">//realtime.mbta.com/developer/api/v2/stopsbylocation?api_key=De_WCTE-gkyYSitBw82YSw&amp;lat=#{gpsCoords["client_lat"]}&amp;lon=#{gpsCoords["client_lon"]}&amp;format=json"  stops = data[“stop”]  stationText.html = null  for i in stops  if i[“parent_station_name”] != “” stationText.html = “The closest station to you is “ + i[“parent_station_name”] + “.”</span>
</code></pre><p>Once we had the data, we then parsed it into something humans can read. We created a string (an English sentence) that said “The closest station to you is” and then tacked the station name on at the end. And Voila! The first step!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/axJpiQsITNU8n7HhoNeGQB4y9jWeoomCU6WI" alt="Image" width="800" height="541" loading="lazy"></p>
<p>It worked like a charm!</p>
<p>Except not in Google Chrome.</p>
<p>We quickly learned that for some strange reason, Google had decided to disable location APIs. Really Google? You don’t have enough billions to give some location data to the little guy?</p>
<p>But anyway, the prototype works great in Safari.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UZ7MSBeDGnIISe9-xbd0Zennr9YhHEKRicvU" alt="Image" width="800" height="541" loading="lazy"></p>
<p>After celebrating our initial success, we decided to make our lives hard again.</p>
<p>What if we wanted to know not only the nearest station, but also how far the closest train was, where it was coming from, and how many minutes away it was?</p>
<p>Oh boy.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YEKj7SSCJTSMpITWBp12yrv1zLTc79pHXFuW" alt="Image" width="800" height="450" loading="lazy">
<em>That “uh-oh” moment.</em></p>
<h3 id="heading-more-crazy-data">More Crazy Data</h3>
<p>Now that we had a handle on how the MBTA data jives, we dove into a second API that provides (mostly) accurate train data.</p>
<p>After some finagling, we had something like this:</p>
<pre><code>#grab nearest train data data2 = <span class="hljs-built_in">JSON</span>.parse Utils.domLoadDataSync “http:<span class="hljs-comment">//realtime.mbta.com/developer/api/v2/predictionsbystop?api_key=De_WCTE-gkyYSitBw82YSw&amp;stop=#{i["stop_id"]}&amp;format=json" routes = data2[“”] timeAway = data2[“mode”][0][“route”][0][“direction”][0][“trip”][0][“pre_away”] trainDir = data2[“mode”][0][“route”][0][“direction”][0][“direction_name”] trainLine = data2[“mode”][0][“route”][0][“route_name”] timeAwayRound = Utils.round timeAway/60, 0 stationText2.html = “The next “ + trainDir + “ “ + trainLine + “ train is “ + timeAwayRound + “ mins away.”</span>
</code></pre><p>This grabs the “stop_id” (the nearest subway stop) from the first API, and plugs it into the request for the second API.</p>
<p>Then, we just have to wade through the data to extract what we need.</p>
<p>“timeAway” gives us how far the nearest train is away, in seconds.</p>
<p>“trainDir” gives us the direction the train is headed.</p>
<p>And “trainLine” tells us which service line the train is on.</p>
<p>Then we created a quick formula to turn seconds into minutes, and dumped all of that data into a string that made sense.</p>
<p>And voila! A little bit of quick UI, some fancy animation, and we had it!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/aJoSvFXbdykSsyTK8UKL88MuzJ42ros0MVhg" alt="Image" width="800" height="600" loading="lazy">
_You can try out the prototype for yourself here: [http://share.framerjs.com/7ygqcpa64f67/](http://share.framerjs.com/7ygqcpa64f67/" rel="noopener" target="<em>blank" title=")</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/36y4vd20skFFxWO1tomXfMF50MS3pwNpffCv" alt="Image" width="800" height="330" loading="lazy">
<em>“Like…Whoa…”</em></p>
<h3 id="heading-takeaways">Takeaways</h3>
<p>I learned so much in building this. Working with real data is so liberating once you figure it out.</p>
<p>I cannot over-emphasize: if you haven’t gotten practice with reading API documentation yet, it can be quite frustrating. Be patient. It may take several hours to figure these out and get them working.</p>
<p>The syntax has to be perfect. And I mean <em>perfect</em>.</p>
<p>But if you do get it, you’ll be standing there, playing with it and watching the numbers change with a smile on your face.</p>
<p>And you’ll feel like, all of a sudden…you know kung fu.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/J6Ptdawe8FTEBoH0nsRDtuKfyhjudqYWUyfY" alt="Image" width="500" height="216" loading="lazy"></p>
<p>Thanks for reading. <a target="_blank" href="http://share.framerjs.com/7ygqcpa64f67/">Give the prototype a try</a>. I would love your feedback!</p>
<p>Also, be sure to check out <a target="_blank" href="https://blog.prototypr.io/designing-with-framer-part-1-faking-it-vs-making-it-ce74e1ca980">my first article</a> about prototyping with FramerJS.</p>
<p><em>If you liked this, click the? below so other people will see this here on Medium.</em></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
