{"id":794,"date":"2024-02-12T18:19:10","date_gmt":"2024-02-13T00:19:10","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=794"},"modified":"2024-02-18T11:17:36","modified_gmt":"2024-02-18T17:17:36","slug":"building-a-todo-app-from-scratch-step-1-planning-design","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-1-planning-design\/","title":{"rendered":"Building a TODO App from Scratch \u2014 Step 1 \u2014 Planning &#038; Design"},"content":{"rendered":"\n<p>I find it fascinating how websites come to be. Especially websites with user interactivity and functionality, there are so many things to plan, build, and maintain, that it&#8217;s no wonder it easily makes for a whole career.<\/p>\n\n\n\n<p>Perhaps one of the most clich\u00e9 introductory things to build on the web (or otherwise), is a <strong>to-do app<\/strong>. But we&#8217;re going to do it again, as a website, and for good reason: it&#8217;s the perfect scope. A to-do app is fairly simple, adding and removing short bits of text forming a list. But it&#8217;s not <em>too<\/em> simple. It requires us to think about all sorts of things. While we&#8217;re ultimately going to care about coxre web development technologies like HTML &amp; CSS, we&#8217;re going to choose to layer in JavaScript to help with user experience and data handling, and then see what other technology we might find helpful along the way, if any. <\/p>\n\n\n\n<p>We&#8217;ll call our project TODO. Don&#8217;t sue me. It&#8217;s just for learning.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"592\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/TODO.png?resize=810%2C592&#038;ssl=1\" alt=\"\" class=\"wp-image-810\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/TODO.png?w=810&amp;ssl=1 810w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/TODO.png?resize=300%2C219&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/TODO.png?resize=768%2C561&amp;ssl=1 768w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><figcaption class=\"wp-element-caption\">We&#8217;re not going to get fancy right off the bat. <\/figcaption><\/figure>\n\n\n\n<p>And we&#8217;re going to do this thing as a series, so this list of posts will be updated as they are completed.<\/p>\n\n\n<div class=\"box article-series\">\n  <header>\n    <h3 class=\"article-series-header\">Article Series<\/h3>\n  <\/header>\n  <div class=\"box-content\">\n            <ol>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-1-planning-design\/\">Building a TODO App from Scratch \u2014 Step 1 \u2014 Planning &#038; Design<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-2-html\/\">Building a TODO App from Scratch \u2014 Step 2 \u2014 HTML<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-3-basic-javascript-functionality\/\">Building a TODO App from Scratch \u2014 Step 3 \u2014 Basic JavaScript Functionality<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-4-styling-interactive-choices\/\">Building a TODO App from Scratch \u2014 Step 4 \u2014 Styling &#038; Interactive Choices<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-5-extra-functionality\/\">Building a TODO App from Scratch \u2014 Step 5 \u2014 Extra Functionality<\/a>\n            <\/li>\n                  <\/ol>\n        <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Prior Art<\/h2>\n\n\n\n<p><a href=\"https:\/\/frontendmasters.com\/blog\/vanilla-javascript-todomvc\/\">Marc has already broached this subject on this very blog.<\/a> Go <a href=\"https:\/\/github.com\/1Marc\/modern-todomvc-vanillajs\">check out the GitHub repo<\/a>, where there is a lot of code to explore. Marc went deeper on the JavaScript aspect than we likely will. He tells me:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>I added branches for TypeScript support, used <a href=\"https:\/\/lit.dev\/docs\/v1\/lit-html\/introduction\/\">lit-html<\/a> for performant rendering, and an app-architecture branch for how to architect larger apps<\/p>\n<\/blockquote>\n\n\n\n<p>There is also an extremely cool project called <a href=\"https:\/\/todomvc.com\/\">TodoMVC<\/a> that was hot&#8217;n&#8217;heavy around 2012-2016. The purpose of it was <em>comparing<\/em> different approaches of a to-do app created using different JavaScript frameworks and vanilla approaches. <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>TodoMVC is useful for comparing syntax and solutions, is officially used in cross-browser benchmarks.<\/p>\n<\/blockquote>\n\n\n\n<p>It was\/is useful in helping people decide things like &#8220;Do I like the Angular approach or the React approach?&#8221;, for example. People could decide by looking at the actual code as well as seeing\/feeling the output. We might fiddle with those ideas a little, but we&#8217;ll be focusing more on the thinking and experience of building and leaning toward vanilla code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">There are no wrong answers<\/h2>\n\n\n\n<p>We&#8217;re going to take an intentionally wordy trip through this project. We&#8217;re going to think about lots of different aspects of product development and web design and development. We&#8217;re going to do it in a certain order and land on certain choices. <\/p>\n\n\n\n<p>If you were going to build a to-do app of your own, you might think about things differently. You might make different choices. You might do these things in a different order than I&#8217;m doing them. I think there is a rhyme and reason to the path I&#8217;ll write about, but that doesn&#8217;t make yours wrong. In fact, I think finding your own way is a great way to learn, and probably what you&#8217;d do anyway regardless of anything you read.<\/p>\n\n\n\n<p>So unless what you build is broken or inaccessible, there is no wrong way.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Design: Thinking First<\/h2>\n\n\n\n<p>I like putting design first, <em>design-driven development<\/em> as it were, and here&#8217;s why. Design forces you to think about your app more holistically than you might otherwise. <\/p>\n\n\n\n<p>When I started thinking about this idea, admittedly, I started poking around at JavaScript right away, putting some basic HTML together the JavaScript could work with. I was having fun reminding myself how powerful native web tech has become and how much we can do without reaching for anything else at all. But then things started to feel sloppy as I realized I was just randomly poking at things rather than have any actual plan. Sure, I could add new to-do items to a list, then remove them. But oh yeah I need to display the list from saved data. And then what else? Can you re-order them? Can you edit them? Can you delete multiple at once? That&#8217;s just scratching the surface. Design allows you to take a beat, stop thinking about implementations, and think of a plan first.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Look Around<\/h2>\n\n\n\n<p>There is no shortage of to-do apps. It&#8217;s not like we wouldn&#8217;t be able to piece it together with our own thoughts of what should be in an app like this, but don&#8217;t let that confidence fool you! It&#8217;s always worth a look around to see how other apps are doing things, particularly successful ones because those in particular help establish the genre and set user expectations. <\/p>\n\n\n\n<p>Here&#8217;s a quick walk through some to-do apps I happen to know about. Seriously, quick. These are very surface-level observations, nothing deep. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Things<\/h3>\n\n\n\n<p><a href=\"https:\/\/culturedcode.com\/things\/\">Things<\/a> is the to-do app that I&#8217;m most familiar with. It&#8217;s a native app, as opposed to the web like we&#8217;re doing, but that doesn&#8217;t stop us from looking at the UI and UX. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=1024%2C1024&#038;ssl=1\" alt=\"\" class=\"wp-image-803\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=1024%2C1024&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=300%2C300&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=150%2C150&amp;ssl=1 150w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=768%2C768&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?resize=1536%2C1536&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/whatsnew-collage-io60.png?w=2000&amp;ssl=1 2000w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Notice they don&#8217;t go very heavy at all on UI for adding new items. A tiny + on the desktop app and a blue (+) on the mobile apps. The emphasis is more on knowing that Command-N will do the trick. I do enjoy the little feature that you can <em>drag<\/em> the mobile (+) where you want it before adding a new item. Notably, you add a new item <em>before<\/em> you add any text or information to the item. Metadata is pretty limited, preferring that you <em>group<\/em> things in various ways (areas, projects, headings), although there is things like <em>tags<\/em> if you want them. If any metadata is emphasized, it is due dates. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Todoist<\/h3>\n\n\n\n<p><a href=\"https:\/\/todoist.com\/\">Todoist<\/a> actually is web-based, so that&#8217;s nice to see (hey, you get multi-platform for free!). <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"788\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?resize=1024%2C788&#038;ssl=1\" alt=\"\" class=\"wp-image-798\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?resize=1024%2C788&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?resize=300%2C231&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?resize=768%2C591&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?resize=1536%2C1182&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.23%E2%80%AFPM.png?w=1572&amp;ssl=1 1572w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>More metadata is exposed here. Tasks have a description which you automatically some of is interesting. <em>Plus <\/em>tags, <em>plus<\/em> due dates, <em>plus<\/em> collapsible groups. <\/p>\n\n\n\n<p>Notice that adding a new task is also relatively chill. Unlike Things, pressing the <strong>+ Add task <\/strong>button doesn&#8217;t automatically create a new task, but instead expands into a fleshed out task adder:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"250\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.34%E2%80%AFPM.png?resize=1024%2C250&#038;ssl=1\" alt=\"\" class=\"wp-image-799\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.34%E2%80%AFPM.png?resize=1024%2C250&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.34%E2%80%AFPM.png?resize=300%2C73&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.34%E2%80%AFPM.png?resize=768%2C188&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-12.46.34%E2%80%AFPM.png?w=1488&amp;ssl=1 1488w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>The task name is the only required thing, which makes sense. It would be obnoxious if anything else was. It feels like a reasonable choice to allow you to add all this metadata immediately, but certainly not the only path. They <em>could<\/em> do it such that you add the task first, then optionally add more to it if desired as an optional next step if you wanted.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TeuxDeux<\/h3>\n\n\n\n<p><a href=\"https:\/\/teuxdeux.com\/home?signup=web\">TeuxDeux<\/a> is big on having you put to-do items on individual days, although you can customize it if you want to. Having this kind of initially opinionated structure will have a huge influence on how people think about your app. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"610\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=1024%2C610&#038;ssl=1\" alt=\"\" class=\"wp-image-804\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=1024%2C610&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=300%2C179&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=768%2C458&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=1536%2C916&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.30.44%E2%80%AFPM.png?resize=2048%2C1221&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Notice there is almost <em>no <\/em>UI for adding new items. The way it works is that the next item in each column is automatically a live input, waiting for you get into it and add text. The extremely narrow item widths will also encourage you to get to the point darn quickly. You can see the markdown come through with the editing toolbar (Things also does Markdown, but only in the body of the description, which is hidden until opening an individual item.)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TodoMVC<\/h3>\n\n\n\n<p>This is the standard design as part of that TodoMVC project I mentioned (<a href=\"https:\/\/todomvc.com\/examples\/vue\/dist\/#\/\">example<\/a>). This is fun, as it&#8217;s quite intentionally minimal. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"706\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.35.38%E2%80%AFPM.png?resize=1024%2C706&#038;ssl=1\" alt=\"\" class=\"wp-image-805\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.35.38%E2%80%AFPM.png?resize=1024%2C706&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.35.38%E2%80%AFPM.png?resize=300%2C207&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.35.38%E2%80%AFPM.png?resize=768%2C529&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-3.35.38%E2%80%AFPM.png?w=1236&amp;ssl=1 1236w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Note there is no submit\/add button for new items, which weirds me out a little bit on the web. I&#8217;d say this then entirely relies on the submit even from the <code>&lt;form&gt;<\/code>, but in this case there is no <code>&lt;form&gt;<\/code> (?!), which then not only requires JavaScript but <em>more<\/em> JavaScript as they can&#8217;t just use that native event. It&#8217;s likely our app will require JavaScript as well, at least at first, as adding a backend language might be a trip too far for this series (but we&#8217;ll see, if y&#8217;all love it, lemme know). <\/p>\n\n\n\n<p>Here we&#8217;re seeing implied categories based on completion (and a way to delete the cleared items as well). Plus a count. Plus the ability to double-click to edit. That editablity feels like a significant thing to think about. Does that double-click feel right or should you just be able to click in there? Native operating systems have a click-and-linger approach to name editing sometimes. You could certainly offer an &#8220;Edit&#8221; button (Pencil icon?) as well, but anything you add to <em>every<\/em> item is going is a risk of visual clutter. Reveal it on focus? Maybe there will be enough items to warrant a sub-menu? We&#8217;ll have to see.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Initial Features<\/h2>\n\n\n\n<p>There is no way we&#8217;re going to be as robust as some of these apps who have been working on their feature set for years and years. Let&#8217;s call it like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Let&#8217;s emphasize the simple text input. Let&#8217;s see how easy we can make it to add a new item to one big single list. <\/li>\n\n\n\n<li>Let&#8217;s also emphasize the Add\/+ button. Not only does it lean into HTML and accessibility correctness, but we can also make it part of our branding. Maybe we can borrow the Things approach of draggability someday. <\/li>\n\n\n\n<li>Just one big list for now, but let&#8217;s think extensibility when we store our data. It shouldn&#8217;t be a stretch to add multiple lists, tags, descriptions, or anything else.<\/li>\n\n\n\n<li>Add and Complete are the primary actions. For now, let&#8217;s borrow TodoMVC&#8217;s approach of double-click to edit unless we find something we like better while building.<\/li>\n\n\n\n<li>Let&#8217;s try and make drag-to-reorder happen.<\/li>\n<\/ol>\n\n\n\n<p>Very basic. <\/p>\n\n\n\n<p>Of course, we&#8217;d love to add user accounts, Markdown support, due dates, tagging, an API, bulk actions, recurring items, and who knows?? AI helpers? Integrations? If you <em>absolutely knew<\/em> that these features needed to be there for day one, then they should be part of the design process from day one. For us, not so much, so we&#8217;ll keep things simple and trim and build that first. <\/p>\n\n\n\n<p>It&#8217;s fun to think about though! Heck, a to-do app, as simple as it seems at first, might be just as complicated or more than an app in just about any other genre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Design<\/h2>\n\n\n\n<p>Knowing what a trim feature set we have, I&#8217;ll Figma something up real quick. Half an hour later, here we are.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"627\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?resize=1024%2C627&#038;ssl=1\" alt=\"\" class=\"wp-image-806\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?resize=1024%2C627&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?resize=300%2C184&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?resize=768%2C470&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?resize=1536%2C941&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-12-at-4.04.37%E2%80%AFPM.png?w=1718&amp;ssl=1 1718w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><figcaption class=\"wp-element-caption\">I&#8217;d say we should also build a small screen version at this point, but I think it&#8217;s fairly obvious this simple design will shrink horizontally just fine. <\/figcaption><\/figure>\n\n\n\n<p>This artifact is <em>a little<\/em> useful. We can reference colors. We can be relatively sure we&#8217;ve represented what we wanted there for day one. But mostly, this forced us to actually think about all that before our greedy little fingers started coding. <\/p>\n\n\n\n<p>We&#8217;ll code better if we more clearly know where we&#8217;re going.<\/p>\n\n\n\n<p>Working design-first also frees up your mind, I find, to think more creatively. Personally, I&#8217;m happy to drag things around weird places. Pick weird colors. Make things humungous or tiny. Explore totally different icons. All sorts of stuff like that that I just know I&#8217;m much less apt to do once I&#8217;m actually coding. For lack of a better metaphore, a left brain \/ right brain thing. As you get to know how you work best and most creatively, you&#8217;ll have your own tricks. <\/p>\n\n\n\n<p>See ya next time! <\/p>\n\n\n<div class=\"box article-series\">\n  <header>\n    <h3 class=\"article-series-header\">Article Series<\/h3>\n  <\/header>\n  <div class=\"box-content\">\n            <ol>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-1-planning-design\/\">Building a TODO App from Scratch \u2014 Step 1 \u2014 Planning &#038; Design<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-2-html\/\">Building a TODO App from Scratch \u2014 Step 2 \u2014 HTML<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-3-basic-javascript-functionality\/\">Building a TODO App from Scratch \u2014 Step 3 \u2014 Basic JavaScript Functionality<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-4-styling-interactive-choices\/\">Building a TODO App from Scratch \u2014 Step 4 \u2014 Styling &#038; Interactive Choices<\/a>\n            <\/li>\n                      <li>\n              <a href=\"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-5-extra-functionality\/\">Building a TODO App from Scratch \u2014 Step 5 \u2014 Extra Functionality<\/a>\n            <\/li>\n                  <\/ol>\n        <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>I find it fascinating how websites come to be. Especially websites with user interactivity and functionality, there are so many things to plan, build, and maintain, that it&#8217;s no wonder it easily makes for a whole career. Perhaps one of the most clich\u00e9 introductory things to build on the web (or otherwise), is a to-do [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":808,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"sig_custom_text":"","sig_image_type":"featured-image","sig_custom_image":0,"sig_is_disabled":false,"inline_featured_image":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[24,6],"class_list":["post-794","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-design","tag-todo"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/TODO-thumb.jpg?fit=1000%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/comments?post=794"}],"version-history":[{"count":16,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/794\/revisions"}],"predecessor-version":[{"id":913,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/794\/revisions\/913"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/808"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}