{"id":823,"date":"2024-02-15T16:28:39","date_gmt":"2024-02-15T22:28:39","guid":{"rendered":"https:\/\/frontendmasters.com\/blog\/?p=823"},"modified":"2024-02-22T15:45:47","modified_gmt":"2024-02-22T21:45:47","slug":"building-a-todo-app-from-scratch-step-2-html","status":"publish","type":"post","link":"https:\/\/frontendmasters.com\/blog\/building-a-todo-app-from-scratch-step-2-html\/","title":{"rendered":"Building a TODO App from Scratch \u2014 Step 2 \u2014 HTML"},"content":{"rendered":"\n<p>OK it&#8217;s HTML time! I love HTML time. We&#8217;re laying down a foundation that makes everything feel very real. <\/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\">Is HTML jumping the gun?<\/h2>\n\n\n\n<p>Nah.<\/p>\n\n\n\n<p>The reason that we can jump to HTML right away is that it is <em>common<\/em> to any other future choice we make. As I mentioned, we might just stay in entirely vanilla land, but let&#8217;s say we chose a JavaScript framework instead. Those frameworks will likely all have their own slightly special takes on HTML.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If we pick Vue it might have funny attributes like <code>@input<\/code>, <code>:value<\/code>, or <code>v-for<\/code><\/li>\n\n\n\n<li>If we pick React we might be using JSX and have funny attributes like <code>className<\/code> or <code>onClick<\/code> and we might see <code>.map()<\/code> a lot.<\/li>\n\n\n\n<li>If we pick Svelte we might see stuff like <code>on:click<\/code> and <code>{#if}<\/code> blocks. <\/li>\n<\/ul>\n\n\n\n<p>Even if we go with native Web Components, we&#8217;ll see attributes you might not see every day like <code>part<\/code> and elements like <code>&lt;slot \/&gt;<\/code>.<\/p>\n\n\n\n<p>But&#8230; it doesn&#8217;t really matter. All of them really need to start with <strong>solid semantic and accessible HTML<\/strong>, and no matter what other choices we make, we can acquiesce to their specific syntax. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Parts<\/h2>\n\n\n\n<p>We can look at our very simple design and get a sense for the main parts of the HTML:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=1024%2C682&#038;ssl=1\" alt=\"\" class=\"wp-image-850\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=1024%2C682&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=300%2C200&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=768%2C511&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=1536%2C1022&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-14-at-4.49.28%E2%80%AFPM.png?resize=2048%2C1363&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">The Header<\/h3>\n\n\n\n<p>The header is just a decorative thing. Maybe something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">header<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span> <span class=\"hljs-attr\">...<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span>&gt;<\/span>TODO<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">header<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>&lt;h1&gt;<\/code> is perhaps a little controversial. I often prefer &#8220;saving&#8221; that for whatever the main focus of the page is. But in this case since the name of the app is doing that for us, it kinda works. Otherwise a <code>&lt;div&gt;<\/code> or whatever is fine here.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Form<\/h3>\n\n\n\n<p>The <code>&lt;form&gt;<\/code> feels vitally important to me. Already in poking around at other web-based to-do apps I&#8217;ve seen some inaccessible forms which feels sad to me for something so simple. <\/p>\n\n\n\n<p>The trick is:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Actually using a <code>&lt;form&gt;<\/code>.<\/li>\n\n\n\n<li>Making sure the <code>&lt;input&gt;<\/code> is properly <code>&lt;label&gt;<\/code>ed. <\/li>\n\n\n\n<li>Offering a submit <code>&lt;button&gt;<\/code>.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"437\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=1024%2C437&#038;ssl=1\" alt=\"\" class=\"wp-image-854\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=1024%2C437&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=300%2C128&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=768%2C328&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=1536%2C656&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.11.03%E2%80%AFPM.png?resize=2048%2C875&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">&lt;form id=<span class=\"hljs-string\">\"todo-form\"<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span>=<span class=\"hljs-string\">\"todo-form\"<\/span>&gt;\n  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">span<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"screen-reader-text\"<\/span>&gt;<\/span>New TODO<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">span<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">name<\/span>=<span class=\"hljs-string\">\"todo\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">label<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span>&gt;<\/span>Add<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span>&gt;<\/span><\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>I like having the <code>id<\/code> on the form for getting our hands on it in JavaScript like we&#8217;re likely going to want to. We can make the interactive event of adding a new to-do happen on the <code>submit<\/code> event. Plus that makes us ready for potentially adding more information into the form later if we wanted, like, say, a date picker for a deadline. The <code>submit<\/code> event will still work great for us, instead of something more specific like watching for the enter key being pressed while any specific input is focused.<\/p>\n\n\n\n<p>I added the <code>class<\/code> for styling. That&#8217;s just a habit of mine, preferring to style with mostly classes for fairly flat specificity. If you have your own methods or use Tailwind or whatever, you likely already know what you&#8217;re doing and godspeed.<\/p>\n\n\n\n<p>Notice my <code>&lt;label&gt;<\/code> doesn&#8217;t have a <code>for<\/code> attribute like you normally see, and that&#8217;s because the <code>&lt;input&gt;<\/code> is <em>nested<\/em> within it, which is a valid pattern. I like the pattern as it&#8217;s one less thing to screw up. <\/p>\n\n\n\n<p>The actual text of the label we&#8217;re hiding, as-per the design. That&#8217;s also a little controversial, but I think is generally fine. It&#8217;s fairly clear what this form does, and if you were using a screen reader, the actual label text is still there even if we do hide it visually with CSS.<\/p>\n\n\n\n<p>Last, the <code>&lt;button&gt;<\/code> is a lone wolf within the form, and that&#8217;ll make it be a submit button automatically. We could use an <code>&lt;input type=\"submit\" \/&gt;<\/code> as well, which is fine, but I like buttons. You can put more stuff in them and their type is implied in simple situations like this.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The List<\/h3>\n\n\n\n<p>The interesting thing about the list is that it&#8217;s going to be dynamically generated. We&#8217;ll have as many to-do list items as our data tells us. We can start with just the wrapper:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ol<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"todo-list\"<\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"todo-list\"<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ol<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Again using the ol&#8217; <code>id<\/code>\/<code>class<\/code> one two punch there. I feel like an <em>ordered<\/em> list is appropriate somehow. Especially if we eventually add sorting of the list, then the order is very intentional and deserves that treatment. And the fact that we&#8217;re using a list at all feels right. Lists announce themselves as such in screen readers, including how many items are in the list, which may be a useful bit of information. That&#8217;s more than a bunch of <code>&lt;div&gt;<\/code>s would do!<\/p>\n\n\n\n<p>The each list item becomes a <code>&lt;li&gt;<\/code>, but the extra stuff in there is going to beef it up. Let&#8217;s pause on the re-ordering and edit-ability for now and just focus on the item and the ability to complete it. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"441\" src=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=1024%2C441&#038;ssl=1\" alt=\"\" class=\"wp-image-855\" srcset=\"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=1024%2C441&amp;ssl=1 1024w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=300%2C129&amp;ssl=1 300w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=768%2C331&amp;ssl=1 768w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=1536%2C662&amp;ssl=1 1536w, https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/Screenshot-2024-02-15-at-2.13.59%E2%80%AFPM.png?resize=2048%2C882&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span> <span class=\"hljs-attr\">id<\/span>=<span class=\"hljs-string\">\"something-unique\"<\/span>&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span> <span class=\"hljs-attr\">aria-label<\/span>=<span class=\"hljs-string\">\"Complete\"<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">svg<\/span> <span class=\"hljs-attr\">...<\/span> \/&gt;<\/span>\n  <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span>&gt;<\/span>\n  To-do text\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>I figure each list item will have a unique ID on it. Actions taken on it will need to be unique to that item so that&#8217;ll be the main identifier. Maybe we don&#8217;t need it yet but we probably will. No class name here as I feel like selecting <code>.todo-list &gt; li<\/code> is probably fine. We could always add it. <\/p>\n\n\n\n<p>Our design makes the interactive element to complete a to-do look like a checkbox, and we could use an <code>&lt;input type=\"checkbox\" \/&gt;<\/code>, but I&#8217;m kinda torn. <strong>This is where visual design and interactive design collide. <\/strong>We didn&#8217;t think out the interaction of completing a to-do all the way. What happens when you click that thing? Does it <em>instantly<\/em> get marked as done? Then disappear? Maybe it instantly gets marked as done but doesn&#8217;t disappear from the list. Or maybe there is like a 5-second countdown before it gets removed, so you have a chance to undo it in case it was a mistake. <\/p>\n\n\n\n<p>I kinda like the delay idea, which to me leads me more toward the path of using an <code>&lt;input type=\"checkbox\"&gt;<\/code> for that with the very obvious two states. We could really do it either way. If we keep the <code>&lt;button&gt;<\/code>, we&#8217;d just need to make sure to use an <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-pressed\"><code>aria-pressed<\/code> role<\/a> for the two states accordingly.<\/p>\n\n\n\n<p>Lastly, the position of that interactive element I have listed <em>first<\/em> here, before the text of the to-do, because that&#8217;s how it looks in the design. I could see the case being made though that in the HTML it should come after, just so that it reads nicer. Like as you tab through the list, you&#8217;d potentially hear the list item <em>and then<\/em> the button text offering to complete it. I&#8217;m not 100% sure what the right answer is there, so I think we&#8217;ll leave it first, because that&#8217;s the <em>visual<\/em> order, and I&#8217;ve heard it&#8217;s often best to match the source order and visual order.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Let&#8217;s stop there<\/h2>\n\n\n\n<p>With some very light wireframe-y CSS applied to those classes, we get this:<\/p>\n\n\n\n<div class=\"wp-block-cp-codepen-gutenberg-embed-block cp_embed_wrapper\"><iframe id=\"cp_embed_VwRgjbM\" src=\"\/\/codepen.io\/anon\/embed\/VwRgjbM?height=450&amp;theme-id=47434&amp;slug-hash=VwRgjbM&amp;default-tab=result\" height=\"450\" scrolling=\"no\" frameborder=\"0\" allowfullscreen allowpaymentrequest name=\"CodePen Embed VwRgjbM\" title=\"CodePen Embed VwRgjbM\" class=\"cp_embed_iframe\" style=\"width:100%;overflow:hidden\">CodePen Embed Fallback<\/iframe><\/div>\n\n\n\n<p>That&#8217;s a nice little foundation to layer on some styles and then get into the actual functionality. But aren&#8217;t you glad we have this strong foundation first? We could go anywhere from here.<\/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>OK it&#8217;s HTML time! I love HTML time. We&#8217;re laying down a foundation that makes everything feel very real. Is HTML jumping the gun? Nah. The reason that we can jump to HTML right away is that it is common to any other future choice we make. As I mentioned, we might just stay in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":857,"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":[31,6],"class_list":["post-823","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog-post","tag-html","tag-todo"],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/frontendmasters.com\/blog\/wp-content\/uploads\/2024\/02\/todo-html-thumb.jpg?fit=1000%2C500&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/823","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=823"}],"version-history":[{"count":10,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/823\/revisions"}],"predecessor-version":[{"id":1009,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/posts\/823\/revisions\/1009"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media\/857"}],"wp:attachment":[{"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/media?parent=823"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/categories?post=823"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/frontendmasters.com\/blog\/wp-json\/wp\/v2\/tags?post=823"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}