<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kat Tow</title>
    <description>The latest articles on DEV Community by Kat Tow (@akattow).</description>
    <link>https://dev.to/akattow</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F244539%2Fb279b0e4-4041-4146-a8b4-b4fdf8d8c773.jpg</url>
      <title>DEV Community: Kat Tow</title>
      <link>https://dev.to/akattow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akattow"/>
    <language>en</language>
    <item>
      <title>Intro to A11y: Where and How</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Fri, 17 Apr 2020 00:07:57 +0000</pubDate>
      <link>https://dev.to/akattow/intro-to-a11y-where-and-how-38a</link>
      <guid>https://dev.to/akattow/intro-to-a11y-where-and-how-38a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the second article in a 2-part series. Read the first half: &lt;a href="https://dev.to/akattow/intro-to-a11y-what-who-and-why-1eoa"&gt;A11y 101: What, Who, and Why&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And a few notes before we get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a11y is a &lt;a href="https://en.wikipedia.org/wiki/Numeronym"&gt;&lt;em&gt;numeronym&lt;/em&gt;&lt;/a&gt; for accessibility. These two words will be used interchangeably throughout.&lt;/li&gt;
&lt;li&gt;the correct linguistic choice between person-first and identity-first language (e.g., a person with a disability vs. a disabled person) is &lt;strong&gt;the choice an individual or community prefers&lt;/strong&gt;. Since this article covers disability very broadly, it will use both person-first and identity-first language.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://dev.to/akattow/intro-to-a11y-what-who-and-why-1eoa"&gt;first article&lt;/a&gt; covered the what, who, and why of web accessibility. Let's dive into how you can get started, and where to learn more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do to get started
&lt;/h2&gt;

&lt;p&gt;Web accessibility is not new. The &lt;a href="https://www.w3.org/WAI/standards-guidelines/"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt; were first established in 1999, over 20 years ago. Despite this, accessibility has a reputation for being extraordinarily difficult to implement. It doesn't have to be.&lt;/p&gt;

&lt;p&gt;The most important thing to understand when getting started is that you won't go from zero to hero. Websites take time and expertise to design and develop, and the same is true when updating them.&lt;/p&gt;

&lt;p&gt;The first step is to identify your website's most critical paths. What do users absolutely need to be able to accomplish on your site? In &lt;a href="https://www.cnbc.com/2019/10/07/dominos-supreme-court.html"&gt;Domino's case&lt;/a&gt;, their most critical path was for users to order a pizza through their website, but their site disabled some users from doing so. Ensuring these critical paths are accessible will reduce your liability. The next step is to continue identifying and improving issues incrementally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common problems
&lt;/h3&gt;

&lt;p&gt;For developers and designers new to accessibility, it can be hard to even know what a11y issues to look for. Here are a few of the most common problems:&lt;/p&gt;

&lt;h4&gt;
  
  
  Readable text
&lt;/h4&gt;

&lt;p&gt;Make sure all your website's text &lt;a href="https://webaim.org/resources/contrastchecker/"&gt;meets minimum contrast thresholds&lt;/a&gt;. Additionally, &lt;a href="https://www.w3.org/WAI/WCAG21/quickref/?versions=2.0#qr-visual-audio-contrast-without-color"&gt;avoid using only color&lt;/a&gt; to identify information or tools (e.g., links), and be sure &lt;a href="https://lifehacker.com/how-to-zoom-in-and-out-on-a-web-page-5815125"&gt;text is resizable&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Text alternatives
&lt;/h4&gt;

&lt;p&gt;Anything essential that isn't text needs a text alternative. Every image that conveys important meaning to the user needs alt text. For example, images of products for sale should have descriptive alt text. Images that don't convey meaning should have &lt;em&gt;empty alt tags&lt;/em&gt;. Why? Because without an empty alt tag (&lt;code&gt;alt=""&lt;/code&gt;) screen readers will announce the entire filename (&lt;code&gt;cute_dogs_102919_prod_final2.jpg&lt;/code&gt;). Video and audio need text alternatives as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Descriptive and accessible links and buttons
&lt;/h4&gt;

&lt;p&gt;Make sure that all interactive elements contain text or alt text that informs users what that link or button will do. Additionally, all links, buttons, and other interactive elements must be reachable using a keyboard (more on this below).&lt;/p&gt;

&lt;h4&gt;
  
  
  Label your forms
&lt;/h4&gt;

&lt;p&gt;Forms are typically part of a critical user path. Whether it's a form to sign up or order pizza, forms are critical to most sites. Recent design trends have put some forms in hot water by removing &lt;code&gt;label&lt;/code&gt; elements in favor of things like &lt;code&gt;placeholder&lt;/code&gt; attributes. Screen readers won't announce &lt;code&gt;placeholder&lt;/code&gt;s, so be sure every form element has a corresponding &lt;code&gt;label&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Be chill
&lt;/h4&gt;

&lt;p&gt;Check your website for flashing or fast animations and movement (I'm looking at you, auto-playing video banners). This kind of content can cause reactions as severe as seizures, and as common as motion sickness. If the content must stay, be sure you warn users and make it easy to stop playing, and take advantage of the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion"&gt;&lt;code&gt;prefers-reduced-motion&lt;/code&gt; CSS media query&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Detecting issues
&lt;/h3&gt;

&lt;p&gt;Now you know what to look for, but... do you have to manually audit every single page for all of those issues? Thankfully, you do not; there are several tools to help you streamline and even automate parts of accessibility auditing.&lt;/p&gt;

&lt;p&gt;Note: &lt;strong&gt;none of these tools are sufficient on their own or together.&lt;/strong&gt; They will make your audits easier, but some manual testing will always be necessary to ensure your site is accessible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Linting
&lt;/h4&gt;

&lt;p&gt;Linting is a great way to prevent a11y bugs before they hit production. If you're writing React, you should check out &lt;a href="https://www.npmjs.com/package/eslint-plugin-jsx-a11y"&gt;&lt;code&gt;eslint-plugin-jsx-a11y&lt;/code&gt;&lt;/a&gt; to statically check your JSX elements. Regardless of your stack, you can also use &lt;a href="https://github.com/pa11y/pa11y"&gt;&lt;code&gt;pa11y&lt;/code&gt;&lt;/a&gt; in the command line to audit an entire site.&lt;/p&gt;

&lt;h4&gt;
  
  
  Automated tests
&lt;/h4&gt;

&lt;p&gt;In-browser testing automates a lot of checks for you - these tools will find common errors like insufficient color contrast, missing alt text, duplicate landmarks, and more. Two of my favorites are &lt;a href="https://www.deque.com/axe/"&gt;axe&lt;/a&gt;, which is available as a Chrome extension and for Android testing, and &lt;a href="https://wave.webaim.org"&gt;WAVE&lt;/a&gt;, which has a web app, Chrome and Firefox extensions, and API services.&lt;/p&gt;

&lt;p&gt;If you're looking to level up, you can also look into adding accessibility checks into your unit, integration, and end-to-end tests. Most popular test runners have accessibility packages or tools you can use to incorporate some automated checks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tab testing
&lt;/h4&gt;

&lt;p&gt;Tab testing is manual but fairly low-effort. Open up your site in a browser and start hitting the tab key! (To go backward, hit shift+tab.) You should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be able to reach every interactive element on the page (links, buttons, form elements, etc.)&lt;/li&gt;
&lt;li&gt;Be able to visually see which element is in focus&lt;/li&gt;
&lt;li&gt;The order in which you reach elements should make sense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take note of any difficulties you experience (missing focus styles are the most common) so that you can investigate and remediate those problems later.&lt;/p&gt;

&lt;h4&gt;
  
  
  Content analysis
&lt;/h4&gt;

&lt;p&gt;Content analysis is often overlooked in accessibility recommendations. Especially for developers, it can be all too easy to focus on testing and remediating a11y issues that we can fix in code. For cognitive and neurally disabled users, ensuring content accessibility makes a big difference. Most of this process must be manual, like ensuring that link text is descriptive (no more 'Click here' links). Some of it can be assisted - writing editors like &lt;a href="http://www.hemingwayapp.com"&gt;Hemmingway&lt;/a&gt; (free!) and &lt;a href="https://www.grammarly.com"&gt;Grammarly&lt;/a&gt; (freemium) can help your team ensure your content itself is more accessible.&lt;/p&gt;

&lt;h4&gt;
  
  
  Screen reader testing
&lt;/h4&gt;

&lt;p&gt;Screen reader testing can be very intimidating, especially for those just getting started. For anyone new to accessibility, I recommend just choosing one screen reader (SR) software that works on your existing OS. Get comfortable with one tool and with the process of using a screen reader before you go for 'full coverage' SR testing.&lt;/p&gt;

&lt;p&gt;The most popular screen reader combinations are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.nvaccess.org"&gt;NVDA&lt;/a&gt; + Firefox or Chrome (Windows)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.freedomscientific.com/Products/software/JAWS/"&gt;JAWS&lt;/a&gt; + Chrome (Windows)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.apple.com/accessibility/mac/vision/"&gt;VoiceOver&lt;/a&gt; + Safari&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are testing mobile, you'll use want to use &lt;a href="https://help.apple.com/iphone/11/#/iph3e2e415f"&gt;Voiceover&lt;/a&gt; on iOS with mobile Safari, or &lt;a href="https://support.google.com/accessibility/android/answer/6283677?hl=en&amp;amp;ref_topic=3529932"&gt;Talkback&lt;/a&gt; on Android with mobile Chrome.&lt;/p&gt;

&lt;p&gt;All of these screen readers are free &lt;strong&gt;except JAWS&lt;/strong&gt;, which does require an annual license.&lt;/p&gt;

&lt;p&gt;As you prepare to start testing, the &lt;a href="https://webaim.org/projects/screenreadersurvey8/"&gt;WebAIM Screen Reader Survey #8 (2019)&lt;/a&gt; can help you understand how people use screen readers. And when you do get started, you can &lt;a href="https://dequeuniversity.com/screenreaders/"&gt;use these keyboard shortcut cheatsheets&lt;/a&gt; to navigate using your keyboard.&lt;/p&gt;

&lt;p&gt;This process may uncover behaviors that confuse you. Some behavior may not be what you were expecting, but is it what disabled users are expecting? The best way to find out is by conducting user testing.&lt;/p&gt;

&lt;h4&gt;
  
  
  User testing
&lt;/h4&gt;

&lt;p&gt;User testing helps you ensure your project actually works. It's more reliable than any manual or automated tests you can perform. (Note: don't waste your testers time - test and remediate smaller issues first!)&lt;/p&gt;

&lt;p&gt;Whether you aren't doing any user testing yet at all or have a robust user research practice, it's important to include users with disabilities. If you need help recruiting disabled users, there are a few companies that can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.makeitfable.com"&gt;Fable Tech Labs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://accessible360.com"&gt;Accessible 360&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://access-works.com"&gt;AccessWorks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to learn more
&lt;/h2&gt;

&lt;p&gt;Like any subject in web design and development, there's a lot of deep learning and expertise you can pursue in web accessibility. You may be looking to broaden your understanding (e.g., with Inclusive Design) or deepen your knowledge (e.g., &lt;em&gt;really&lt;/em&gt; understanding ARIA).&lt;/p&gt;

&lt;p&gt;Personally, I am still learning a ton about accessibility. There's plenty I still don't understand, and a lot I could do to improve my testing practice. Right now, I've integrated linting, in-browser audits, and two screen readers into my regular toolkit. At my job, I'm currently working on adding more a11y to our unit and end-to-end tests.&lt;/p&gt;

&lt;p&gt;As you continue to learn about web accessibility, it's important to remember that this isn't the wild west. The Web Content Accessibility Guidelines (WCAG) were established over 20 years ago and was updated as recently as 2018. The documentation can be intimidating to read, but it's important to remember that there are guidelines, expected behavior, and testable practices.&lt;/p&gt;

&lt;p&gt;As for resources: the following list is &lt;strong&gt;far from complete&lt;/strong&gt;, but it includes some of my favorite resources that are great for getting started. These have been tremendously helpful in my journey to learn about a11y - I hope they help you too!&lt;/p&gt;

&lt;p&gt;If you have any favorite resources I should add, &lt;a href="https://twitter.com/akattow"&gt;let me know on Twitter&lt;/a&gt;!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/"&gt;Web Accessibility Initiative at the W3C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/people-use-web/tools-techniques/"&gt;Tools and Techniques&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/"&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://a11yproject.com/"&gt;The A11y Project&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://a11yproject.com/checklist/"&gt;The A11y Project's Web Accessibility Checklist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;a href="https://accessibility.digital.gov"&gt;Accessibility for Teams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/design/inclusive/"&gt;Microsoft Inclusive Design Toolkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://inclusivedesignprinciples.org"&gt;Inclusive Design Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.smashingmagazine.com/2018/04/designing-accessibility-inclusion/"&gt;Designing For Accessibility And Inclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Free course: &lt;a href="https://www.udacity.com/course/web-accessibility--ud891"&gt;Google's Web Accessibility on Udacity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;International a11y standards: &lt;a href="https://www.levelaccess.com/current-state-of-international-accessibility-standards/"&gt;Current State of International Accessibility Standards&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>ux</category>
    </item>
    <item>
      <title>Intro to A11y: What, Who, and Why</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Mon, 13 Apr 2020 14:06:37 +0000</pubDate>
      <link>https://dev.to/akattow/intro-to-a11y-what-who-and-why-1eoa</link>
      <guid>https://dev.to/akattow/intro-to-a11y-what-who-and-why-1eoa</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the first article in a 2-part series. The second half will be published next week!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're reading this article, you're already passed the first hurdle to web accessibility: recognizing the need for a more accessible web. But no matter if you're a code newbie or a professional developer, just knowing accessibility is important is just the tip of the iceberg. Whether you're a seasoned pro or new to web development, it's important to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is 'disability' and 'accessibility'?&lt;/li&gt;
&lt;li&gt;Who might be affected?&lt;/li&gt;
&lt;li&gt;Why does this matter?&lt;/li&gt;
&lt;li&gt;How to get started&lt;/li&gt;
&lt;li&gt;Where to learn more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article will cover the what, who, and why of web accessibility.&lt;/p&gt;

&lt;p&gt;Plus a few notes before we get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a11y is a &lt;a href="https://en.wikipedia.org/wiki/Numeronym"&gt;&lt;em&gt;numeronym&lt;/em&gt;&lt;/a&gt; for accessibility. These two words will be used interchangeably throughout.&lt;/li&gt;
&lt;li&gt;the correct linguistic choice between person-first and identity-first language (e.g., a person with a disability vs. a disabled person) is &lt;strong&gt;the choice an individual or community prefers&lt;/strong&gt;. Since this article covers disability very broadly, it will use both person-first and identity-first language.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is disability?
&lt;/h2&gt;

&lt;p&gt;What comes to your mind when you think of disability? Most people would think of another person with some kind of physical impairment, such as a wheelchair user. You might even think about disabilities that aren't immediately obvious to outside observers, like deafness or learning disabilities.&lt;/p&gt;

&lt;p&gt;Whatever you can think of... you're thinking of attributes or characteristics that people have. In this mental model, needing a wheelchair is a &lt;em&gt;feature&lt;/em&gt; of a &lt;em&gt;person&lt;/em&gt;. This is known as the "medical model" of disability. This model certainly has valid uses (for instance, in medicine!) but it isn't particularly helpful for designing and developing digital products. In fact, this model can contribute to an attitude that accessibility is an "edge case" that isn't a priority for the development team.&lt;/p&gt;

&lt;p&gt;Now, instead of picturing something for the word 'disability', try something different. Imagine a world in which almost everyone you know is blind. Your coworkers are blind, the food service workers are blind, most people are blind. In this world, since most people are blind, almost all written word is in braille! Library books are in braille. Restaurant menus are in braille. Government pamphlets about essential services are in braille. And you don't read braille.&lt;/p&gt;

&lt;p&gt;In this world, being blind is not a disadvantage, it's the status quo. And the world around us has been designed &lt;em&gt;by and for&lt;/em&gt; people who live in this status quo. You, as a non-braille reader, are at a huge disadvantage. Your impairment is not due to a medical condition but is a &lt;strong&gt;symptom of design&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is known as the "social model" of disability; poor design &lt;em&gt;disables&lt;/em&gt; users, and good design &lt;em&gt;enables all&lt;/em&gt; users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;Now that we have a better model of disability, we still need to understand who is disabled by poor web design. Some users rely on assistive technology, while others may use adaptive strategies. Those users rely on different and multiple devices, screen sizes, and methods of input.&lt;/p&gt;

&lt;p&gt;It's also important to understand that disability is not always permanent. The social model of disability reminds us that anyone can be disabled by the world and the situation around them. Check the list below - even if you don't consider yourself disabled, how many of the examples below could happen to you?&lt;/p&gt;

&lt;h3&gt;
  
  
  Examples of disabled users
&lt;/h3&gt;

&lt;p&gt;Your users may be disabled by...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vision:&lt;/strong&gt; Cataracts, color blindness, full or partial blindness&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobility:&lt;/strong&gt; Broken wrist, repetitive stress injury, spinal cord injury&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speech:&lt;/strong&gt; Sore throat, noisy location, unable to speak&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hearing:&lt;/strong&gt; Ear infection, noisy location, deaf or hard of hearing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cognition:&lt;/strong&gt; Sleep-deprived, learning disabilities, autism&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neural:&lt;/strong&gt; Anxiety, depression, PTSD&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this matter?
&lt;/h2&gt;

&lt;p&gt;Chances are you've dealt with at least one of those issues before, and you probably will again. Imagine breaking both wrists or arms in a traffic accident - how would you continue to use your computer or mobile phone while in casts?&lt;/p&gt;

&lt;p&gt;Anyone can become disabled, even temporarily. And many disabilities are not visible. Whether or not you realize it, you certainly know people who deal with disabilities every day.&lt;/p&gt;

&lt;p&gt;According to a &lt;a href="https://www.census.gov/content/dam/Census/library/publications/2018/demo/p70-152.pdf"&gt;2014 survey from the Social Security Administration (SSA)&lt;/a&gt;, 85.3 million Americans are living with disabilities. That is over 1 in 4 Americans. This includes people with impairments and restrictions that are not classified as 'severe'. About 55.2 million Americans, or 17.6% of the population, had a severe disability.&lt;/p&gt;

&lt;p&gt;Does your development team support IE, with only 2% global usage? Why prioritize those 2% of users over the 17.6% of Americans with severe disabilities?&lt;/p&gt;

&lt;p&gt;While not every impairment will impact web and technology use, there is inarguably a significant portion of potential and current users that may be disabled by our choices as web designers and developers.&lt;/p&gt;

&lt;p&gt;Finally, if product reach isn't enough of a motivator, consider this: &lt;a href="https://www.natlawreview.com/article/when-good-sites-go-bad-growing-risk-website-accessibility-litigation"&gt;the United States is currently seeing a massive uptick in web accessibility lawsuits&lt;/a&gt;. Since initial rulings in 2017, and spurred by the Domino's ruling in 2019, a growing number of companies are facing lawsuits and liability risks from inaccessible websites. Is a lawsuit something your company can afford?&lt;/p&gt;

&lt;p&gt;Making the web accessible reduces liability, increases your market, and most importantly, is the &lt;em&gt;right thing to do&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;If you're ready to start improving your website's accessibility, stay tuned for the second article in this series - A11y 102: Where and How. The second part will cover how to identify and remediate the most common accessibility issues, and where to continue your learning.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>ux</category>
    </item>
    <item>
      <title>Reusable, accessible headings in React with TypeScript</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Wed, 19 Feb 2020 19:23:40 +0000</pubDate>
      <link>https://dev.to/akattow/reusable-accessible-headings-in-react-with-typescript-3h4o</link>
      <guid>https://dev.to/akattow/reusable-accessible-headings-in-react-with-typescript-3h4o</guid>
      <description>&lt;p&gt;Making reusable components is one of the best things about React. Developers write less duplicate code, and our sites and apps can have a more consistent UI. This is good!&lt;/p&gt;

&lt;p&gt;Making content clear and logical to both screen readers and web parsers is also a good thing. Among other things, that means that heading elements (&lt;code&gt;h1&lt;/code&gt; - &lt;code&gt;h6&lt;/code&gt;) need to appear in order. To learn more about why this matters, &lt;a href="https://dev.to/sublimemarch/html-headings-not-just-big-bigger-biggest-1km"&gt;read Fen Slattery's excellent article on HTML headings&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Both of those things are important, but they don't always work together well. Working with components introduces the risk of disorganized headings. A component may be used in two places, with each page hierarcy demanding different heading levels. And as a project grows in size, a change to a component in one place may have unintended consequences in others.&lt;/p&gt;

&lt;p&gt;What might that look like? Something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Banner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That component could be a problem if you ever want to use it elsewhere in your app. Let's say you use the &lt;code&gt;Banner&lt;/code&gt; on one page, and it has your &lt;code&gt;h1&lt;/code&gt;. But what about later, when you want to use it halfway down a different page? One where the &lt;code&gt;h1&lt;/code&gt; element already exists? An &lt;code&gt;h2&lt;/code&gt; or &lt;code&gt;h3&lt;/code&gt; might be the right choice in that case. Whether you've got a banner, a card, or any other piece of UI that might need a heading, &lt;strong&gt;you should make it flexible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How do we do that? React magic! Let's make a reusable heading component that can accept props for the heading level it should render. Then we can use our flexible heading component in our &lt;code&gt;Banner&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reusable JavaScript header
&lt;/h2&gt;

&lt;p&gt;If you search the web for flexible react heading components, you might find something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// a JavaScript flexible heading element&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;JsHeading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;headingLevel&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headingLevel&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// our reusable banner&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Banner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JsHeading&lt;/span&gt; &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;JsHeading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That's great... for regular JavaScript. In fact, &lt;a href="https://dev.to/s_aitchison/psa-stop-hard-coding-heading-levels-in-your-react-components-2ekp"&gt;Suzanne Aitchison has a great post on this as well&lt;/a&gt;. If you're &lt;strong&gt;not&lt;/strong&gt; using TypeScript, I'd recommend reading her article. She ends with some valuable ideas on how to prevent unwanted behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  But what about TypeScript?
&lt;/h2&gt;

&lt;p&gt;The title of this article is 'Reusable, accessible headings in React with TypeScript' - and the code above won't work in TypeScript. Even if you try adding explicit types, you won't get too far.&lt;/p&gt;

&lt;p&gt;You might try casting your input, but I wouldn't recommend it. You'll end up casting to &lt;code&gt;unknown&lt;/code&gt; in between and it's just gross. Besides, why cast when you can properly type everything to begin with? But, what types do we need?&lt;/p&gt;

&lt;p&gt;You might think we should pass an heading element directly as a prop. I'm afraid we can't do that, Dave. You'll get an error if you try to directly pass an &lt;code&gt;HTMLHeadingElement&lt;/code&gt; as a prop. The most flexible type you can pass in is &lt;code&gt;React.ElementType&lt;/code&gt;. Let's take a look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// extend your interface to be sure your heading element can have stuff like a className and children&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HeadingProps&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTMLAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLHeadingElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ElementType&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TsHeading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HeadingProps&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;headingLevel&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// our reusable banner&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt; &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cool! Great! This works, and it renders just fine. Except... you can now pass in any element to your &lt;code&gt;&amp;lt;Heading /&amp;gt;&lt;/code&gt; element.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt; &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"table"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We can pass in a &lt;code&gt;table&lt;/code&gt; and it won't give us an error - in fact, it will render to the page as &lt;code&gt;&amp;lt;table&amp;gt;Whatever text you passed&amp;lt;/table&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Just the headings, please
&lt;/h2&gt;

&lt;p&gt;So what's a safe way to ensure you only pass heading elements to your reusable &lt;code&gt;&amp;lt;Heading /&amp;gt;&lt;/code&gt;? This one took me a while to get right. I won't bore you with all my trials, tribulations, and failures - here's what I found that works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// the interface needs to explicitly declare which strings are safe to pass&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;HeadingProps&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTMLAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLHeadingElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h5&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TsHeading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;headingLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;HeadingProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTMLAttributes&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLHeadingElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Heading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt; &lt;span class="na"&gt;headingLevel&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;headingText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;TsHeading&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So what's going on here? Two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;we need to explicitly tell the interface which strings (representing html elements) we want to accept. You might notice I've included "p" - this is a fallback, in case you want to use this element without a heading. You can adapt this to match your needs!&lt;/li&gt;
&lt;li&gt;Our &lt;code&gt;Heading&lt;/code&gt; just got more complex. Because we can't directly pass an HTML heading element to a React component as a prop, we instead need to pass a (valid) string, and use that in React's &lt;code&gt;createElement&lt;/code&gt; method. &lt;code&gt;React.createElement&lt;/code&gt; is actually how JSX works under the hood, but that's a totally different topic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that's it! Now you can use your heading component in any other reusable, composable component. Go forth and create accessible websites!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>react</category>
      <category>typescript</category>
      <category>refactorit</category>
    </item>
    <item>
      <title>How often do you test with screen readers?</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Fri, 31 Jan 2020 16:41:00 +0000</pubDate>
      <link>https://dev.to/akattow/how-often-do-you-test-with-screen-readers-282</link>
      <guid>https://dev.to/akattow/how-often-do-you-test-with-screen-readers-282</guid>
      <description>&lt;p&gt;Is it part of your deploy checklist? Semi-regular? What's your strategy?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>a11y</category>
      <category>testing</category>
    </item>
    <item>
      <title>How to navigate learning to code online</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Mon, 20 Jan 2020 21:06:19 +0000</pubDate>
      <link>https://dev.to/akattow/how-to-navigate-learning-to-code-online-2bok</link>
      <guid>https://dev.to/akattow/how-to-navigate-learning-to-code-online-2bok</guid>
      <description>&lt;p&gt;Learning to code is hard. Like, really hard, especially for folks without strong math backgrounds, resources to modern computers, or internet access at home.&lt;/p&gt;

&lt;p&gt;So where do you get started? And how do you sort through hundreds of tutorials, posts, and jargon? And why should you listen to me?&lt;/p&gt;

&lt;p&gt;I'm a self-taught developer, but not one of those 6-month wunderkind. It took me a couple years to learn what I needed to get my first development job, but I managed to do it. I found time in my 60-hour workweeks, battled mental health issues, and maintained my social life and sanity. And you can too.&lt;/p&gt;

&lt;p&gt;Don't be discouraged by those wunderkind. Most of us can't cut back on sleep, family time, or even quit our jobs to learn to code. Be patient, practice solid learning habits, and try to have fun.&lt;/p&gt;

&lt;p&gt;This article will list my tips for anyone trying to learn to code online. Let's get started with a few key terms:&lt;/p&gt;

&lt;h2&gt;
  
  
  Glossary of terms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Also referred to as 'client side'. This is the part of a website that users interact with. A frontend developer codes (and sometimes designs) web pages. They typically use languages like HTML, CSS, and JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; This is the part of a website that you can't see. The backend stores and manages data. It also provides the 'frontend' logic to access and manipulate that data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full stack:&lt;/strong&gt; The 'full stack' is the combination of front- and backend. Many job postings may refer to this. As web development grows more complicated, it is more difficult to master every part of the 'development stack'.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pseudocode:&lt;/strong&gt; It's 'fake code'! Writing pseudocode means writing out what your code should do in regular language. Typically you will turn each line of plain language into actual code. This helps you work through a problem in manageable chunks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; This is code that can be run by a computer. Different languages are work in different environments (e.g., websites, iOS, smart refrigerators). Examples include JavaScript, Ruby, and Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; A framework is built on top of a programming language to make certain aspects of it easier. It's always a good idea to learn the programming language a framework is built on before learning the framework. Examples include React and Angular for JavaScript, Ruby on Rails, and Django for Python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, on to the hot takes... 🔥&lt;/p&gt;

&lt;h2&gt;
  
  
  Define your goal
&lt;/h2&gt;

&lt;p&gt;This is probably the single most important piece of advice I can give. Does it sound like some self-help guru's instagram post? Yes it does. Does it work? Also yes.&lt;/p&gt;

&lt;p&gt;There is a reason you want to learn to code. Maybe you want to make more money, or just get a job that doesn't require working on holidays and offers healthcare (if you're in the U.S.). Whatever your reason, ask yourself, "How will that make me feel? How will it make my life better?" That's your real reason. It might be freedom from debt, more time to spend with family, or the knowledge that you've created a tool that will help people.&lt;/p&gt;

&lt;p&gt;Ask yourself those questions, and write down your answer. Put it on a sticky note on your desk, set a daily reminder in your calendar, or even write it on your mirror (I actually did this!)&lt;/p&gt;

&lt;p&gt;Life is hard, and distractions and obstacles will come up while you're learning to code. And coding is &lt;em&gt;hard;&lt;/em&gt; you will get stuck and frustrated. But if you are having a bad day and you see the words you wrote, they will remind you of &lt;em&gt;why&lt;/em&gt; you are working so hard. That makes it a lot easier to keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify your priorities
&lt;/h2&gt;

&lt;p&gt;There are a ton of resources online to teach code. It can be hard to know which ones are trustworthy, up-to-date, and most of all which ones you will enjoy.&lt;/p&gt;

&lt;p&gt;Take some time to figure out what it is you are looking for in a learning resource. Here are some ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it need to be free? Or do you have a budget you're willing to spend?&lt;/li&gt;
&lt;li&gt;Is accountability important to you? Do you feel comfortable learning on your own, or do you want a community of learners to support you? Or would you benefit from an experienced mentor?&lt;/li&gt;
&lt;li&gt;What delivery method do you prefer? Some folks love video walkthroughs and code-alongs, while others prefer just reading. Likewise, do you prefer tutorials or reading through documentation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing I would recommend is to always start with free resources! Make sure you enjoy coding, enjoy the new language or framework you're learning, and enjoy the teacher. Don't over-commit any of your hard-earned cash.&lt;/p&gt;

&lt;p&gt;I have &lt;a href="https://dev.to/akattow/my-top-free-resources-for-new-and-forgetful-devs-254o"&gt;another post&lt;/a&gt; with some great, free resources!&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn what to learn
&lt;/h2&gt;

&lt;p&gt;Look back at your goal - chances are, programming is a means to that end. You don't have to become any specific type of developer to make your goal a reality. That's freeing, empowering, and scary - how do you know what you should be studying?&lt;/p&gt;

&lt;p&gt;Sometimes people complain about classes they had to take in college that didn't have any impact on their careers. You don't want to waste your time like this when you're learning to code! There are &lt;strong&gt;tons&lt;/strong&gt; of programming languages you could learn, but guessing at which one is best could end up a frustrating waste of time.&lt;/p&gt;

&lt;p&gt;Only you can figure out what type of work you will like the best. But once you have figured it out, you'll know which programming languages actually matter to you. If you want to be a data scientist, you'll learn Python or R. If you want to build websites, start with HTML and CSS, then learn JavaScript, and figure out if you like the frontend or backend better.&lt;/p&gt;

&lt;p&gt;No matter what you want to do, figure out what your next job should be. Then learn the programming languages it requires. &lt;/p&gt;

&lt;h2&gt;
  
  
  Find the fundamentals
&lt;/h2&gt;

&lt;p&gt;That last piece of advice I gave you? About finding the language you need and getting started? There is one caveat...&lt;/p&gt;

&lt;p&gt;Learn the fundamentals first. Loops, conditionals, variables, data types, and objects - these are an essential part of &lt;em&gt;every&lt;/em&gt; programming language. It's important to understand these before you dive in to a framework.&lt;/p&gt;

&lt;p&gt;You'll probably learn those fundamentals while you learn your first programming language. But be sure you learn a language first and master the fundamentals, especially before picking up a framework. You'll save yourself a lot of headaches, and be more likely to ace those interview code challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cut the chatter
&lt;/h2&gt;

&lt;p&gt;There are tons of programming languages and frameworks, dozens of specialties and niches, and a lot to learn even to publish a website. This ties in to the last piece of advice: figure out what you need to learn, and zero in on it. Take it in pieces. Don't try to learn everything all at once. The siren call of becoming a 'full-stack' developer may be appealing, but trying to learn too many disparate things can lead to burnout.&lt;/p&gt;

&lt;p&gt;But past making sure you don't get distracted by the latest and greatest framework, remember that it's OK to admit you don't know something! Whether that's how to write an API, how to use CSS Grid, or what the heck a deployment pipeline looks like, remember that nobody knows everything, and everyone was a beginner once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it fun
&lt;/h2&gt;

&lt;p&gt;No matter what you're learning and how you're learning it, make sure you're having fun. This is the best way to ensure you stick with it, and to help you deal with the inevitable setbacks.&lt;/p&gt;

&lt;p&gt;The easiest way to keep your learning fun is to center each learning project on something you love! For instance, if I were working through a tutorial that walked through creating a movie search tool, I might want to create a Pokémon search tool. I would write my code with the same structure as the tutorial, but use a different data source and change the variable names.&lt;/p&gt;

&lt;p&gt;Taking this approach will help you have fun while you're coding. Plus, your portfolio will end up having a lot more personality!&lt;/p&gt;

&lt;h2&gt;
  
  
  Use scratch paper
&lt;/h2&gt;

&lt;p&gt;Remember that tests in math class were always easier when you were allowed scratch paper? The same is true when you're coding. &lt;/p&gt;

&lt;p&gt;That might mean drawing some boxes for your layout before you start writing CSS. Or it could mean listing out each problem you need to solve (and breaking it down into manageable pieces). For most developers, it also means writing pseudocode. Whether you prefer actual paper, an app, or just your code editor, be sure to map your route before you get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Messing up is fine
&lt;/h2&gt;

&lt;p&gt;Let's face it: everyone makes mistakes. Ask any experienced dev you admire (if they deny it, they're probably not someone you should admire). But failure can be demoralizing, especially when you're just getting started. &lt;/p&gt;

&lt;p&gt;Especially if you're a career changer, it can be hard to get back in a beginner mindset and let go of the feeling of mastery you had over your old career field.&lt;/p&gt;

&lt;p&gt;There isn't any great advice or secret wisdom I can offer to help you get past your frustrations and struggles. Just remember that every failure is an opportunity to learn. Also, read the error messages, they can be helpful! (Seriously, I didn't do that at first because I was too frustrated!) &lt;/p&gt;

&lt;h2&gt;
  
  
  Know when to take a break
&lt;/h2&gt;

&lt;p&gt;So, you ran into a problem. You're getting an error and you don't know what's wrong! That's OK.&lt;/p&gt;

&lt;p&gt;Give yourself time to struggle and try to work through the problem on your own - try stepping away and doing something to relax. It's amazing how much this can help. Take a bath and get those #showerthoughts, cook yourself a nice meal, or exercise. Chances are you'll come back to your computer, sit down, and find a solution much faster.&lt;/p&gt;

&lt;p&gt;Remember that a well-rested brain is a smarter brain. Food is fuel, and eating well can help you code well. Coding take a lot of mental energy, but physical aches and pains can create creaky code - get up and move around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know when to ask for help
&lt;/h2&gt;

&lt;p&gt;It can be rewarding to figure out a problem on your own, and it can be beneficial to your learning. But sometimes you don't have the context you need, or a problem isn't worth spending a whole day on! If you're really stuck, admit it, and get some help.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might be able to Google a solution! But if you try a few things that only seem to create &lt;em&gt;more&lt;/em&gt; problems, you may need to find a different helpline.&lt;/li&gt;
&lt;li&gt;Hit the forums! The right forum depends on what you're learning, but some favorites include Dev.to (try using the #help or #explainlikeimfive tags), &lt;a href="https://www.codenewbie.org/"&gt;CodeNewbie&lt;/a&gt;, and &lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If you're lucky enough to have real-life friends in your hometown that know code, don't hesitate to ask them! It can be easy to think you'd be a burden or be embarrassed, but they'll just be glad to help! Plus, you'll probably make them feel super smart - always a good friendship move!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remember that your story is not someone else's story
&lt;/h2&gt;

&lt;p&gt;It's easy to get discouraged when you see blog posts titled, "How I became a full-stack developer and started making 6 figures in only 3 months!!!!!" But it is usually pretty clear that those people had a lot of additional background, resources, and support to make those incredible things happen.&lt;/p&gt;

&lt;p&gt;Your story is not like anyone else's. You have unique challenges, constraints, and opportunities. Don't hold yourself to someone else's standards: make your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share your success
&lt;/h2&gt;

&lt;p&gt;Learning to code is hard, and teaching yourself online is even harder. You should be proud of your dedication and hard work! Even 'small' wins are &lt;strong&gt;wins&lt;/strong&gt;, and deserve to be celebrated.&lt;/p&gt;

&lt;p&gt;Tweet, post on your Instagram story, or whatever you like best! Let people will celebrate with you. If you get any hate, don't hesitate: smash that block button and keep coding.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Thanks so much for reading this far! No matter where you are on your coding journey, I salute you - keep up the awesome work!&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>womenintech</category>
    </item>
    <item>
      <title>Top free resources for new (and forgetful) devs</title>
      <dc:creator>Kat Tow</dc:creator>
      <pubDate>Mon, 20 Jan 2020 19:37:35 +0000</pubDate>
      <link>https://dev.to/akattow/my-top-free-resources-for-new-and-forgetful-devs-254o</link>
      <guid>https://dev.to/akattow/my-top-free-resources-for-new-and-forgetful-devs-254o</guid>
      <description>&lt;p&gt;If you're learning to code, this list is for you! If your brain is full of other important things, this list is also for you!&lt;/p&gt;

&lt;p&gt;These are some resources that I used in my journey as a self-taught dev, and many of them are tools I still go back and refer to. &lt;strong&gt;Every&lt;/strong&gt; resource on this list is free - none of these require you to spend a penny to get quality content, and none of them are affiliate links.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;There are tons of 'learn to code' sites - and most of them will give you the bare bones before asking you to 'upgrade' and for a pretty penny. You don't need to spend a dime.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp.org&lt;/a&gt; is a nonprofit that will teach you everything from HTML and CSS to Node.js, testing, and data science. Yes, seriously, a nonprofit. This was the number one resource I used when I first started. Their web app has interactive coding lessons, where you learn and practice on the same screen. The curriculum includes 'final projects' for each section that will build your portfolio automatically. If you're a new developer, or if you are a back-/front-end dev learning the other side, this is a great resource. &lt;em&gt;Email or integration sign-up required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.codenewbie.org/podcast"&gt;CodeNewbie Podcast&lt;/a&gt; and &lt;a href="https://syntax.fm/"&gt;Syntax&lt;/a&gt; are podcasts. Why podcasts? They're a great way to keep learning while you're commuting or doing laundry, letting you fit more development knowledge into your day. Podcasts can be much more subject to personal taste (Do you like the hosts? Do you prefer interview formats or group chats?) but these are a couple of my favorites. &lt;em&gt;No signup required, unless it is for a podcatching app.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://lab.github.com/githubtraining/introduction-to-github"&gt;Intro to GitHub&lt;/a&gt; is an interactive walkthrough for those new to Git. Or if you've got the basics but forget the details (it me) you can &lt;a href="http://try.github.io/"&gt;Try Git&lt;/a&gt; and find handbooks and cheat sheets. &lt;em&gt;A GitHub account is required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  CSS
&lt;/h2&gt;

&lt;p&gt;CSS... even once you've grasped the basics, CSS can leave some devs scratching their heads. That's OK - these fun tools are here for you.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flexboxfroggy.com/"&gt;Flexbox Froggy&lt;/a&gt; teaches you flexbox with this precious hoppy friend. &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cssgridgarden.com/"&gt;Grid Garden&lt;/a&gt; is deeply satisfying if you love grids and/or gardens. Even if you don't, you'll learn a ton about the CSS Grid spec. &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Make it pretty
&lt;/h2&gt;

&lt;p&gt;You've got a website or app, and maybe some good responsive layouts... but it's missing that &lt;em&gt;pizazz&lt;/em&gt; and you can't spend hundreds of dollars on professional photography and graphic design.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt; has a huge database of totally free professional photography - just credit the creator! &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://fontawesome.com/"&gt;FontAwesome&lt;/a&gt; is not just a font anymore. Icon fonts are not a great choice, but you can still access hundreds of free icons as downloadable SVGs. In a digital ocean swimming with paid icon sets that don't have everything you need, this is a valid choice - for prototyping or production. &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;

&lt;p&gt;Before you learn a framework, it's a good idea to get the basics down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.freecodecamp.org/"&gt;freecodecamp.org&lt;/a&gt; is once again a great tool - whether you want to jump to the JavaScript section of the tutorials or practice coding exercises. &lt;em&gt;Email or integration sign-up required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://javascript30.com/"&gt;JavaScript30&lt;/a&gt; is an awesome, totally free 30-day JavaScript course - but of course you can take it at your own pace, or just do the exercises where you want extra practice. Plus, most exercises end up with a small project you can add to your portfolio. &lt;em&gt;Email sign-up required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=et8xNAc2ic8"&gt;Brian Leroux's WTFJS video&lt;/a&gt; is not a top-tier learning resource, but it is a lot of fun. &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;This is probably my favorite thing to talk about, especially if you catch me IRL. I could write a post just full of accessibility (or a11y) resources (hmm... maybe I should! Let me know in the comments!) but here's just a few favorites.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://inclusivedesignprinciples.org/"&gt;Inclusive Design Principles&lt;/a&gt; is a collection of high-level principles for creating broadly inclusive designs. Read this before you even start coding that new project! &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://accessibility.deque.com/accessibility-heuristics/"&gt;Deque's Accessibility Heuristics&lt;/a&gt; offers a clear framework for evaluating your designs for accessibility. &lt;em&gt;Email signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://a11yproject.com/"&gt;The A11y Project&lt;/a&gt; is a community-driven resource to help make web accessibility more understandable. &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Computer Science
&lt;/h2&gt;

&lt;p&gt;If you've started writing some code, you've probably realized just how little you actually understand. This is an essential part of every dev journey. If you want to learn the basics of computer science without having to spend a ton of cash on a college course, you're in luck.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.edx.org/course/cs50s-introduction-to-computer-science"&gt;CS50&lt;/a&gt; is Harvard University's &lt;strong&gt;free&lt;/strong&gt;, totally online course on edX. You can enroll for free (you'll be asked if you want to pay for a certificate, but you can skip it and just take the course!) The course is made up of recorded lectures (they're really good ones) plus smaller, more focused videos on each topic covered. Plus, the course includes optional homework/projects that you can submit and have tested. &lt;em&gt;Email signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/basecs"&gt;BaseCS&lt;/a&gt; is an adorable, illustrated collection of articles on comp sci essentials. If you prefer, you can also watch &lt;a href="https://dev.to/vaidehijoshi"&gt;videos&lt;/a&gt; or listen to the &lt;a href="https://www.codenewbie.org/basecs"&gt;podcast&lt;/a&gt;! &lt;em&gt;No signup required.&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are just a few of my favorite tools for new developers and forgetful ones (like me!). If you have any FREE favorites, please share them in the comments!&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
