<?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: Tammy Shipps</title>
    <description>The latest articles on DEV Community by Tammy Shipps (@mizziness).</description>
    <link>https://dev.to/mizziness</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%2F143102%2F0fe20367-26ed-4947-98e1-970e6100ef96.jpeg</url>
      <title>DEV Community: Tammy Shipps</title>
      <link>https://dev.to/mizziness</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mizziness"/>
    <language>en</language>
    <item>
      <title>Webpack 5 in Craft CMS 3? Coming right up!</title>
      <dc:creator>Tammy Shipps</dc:creator>
      <pubDate>Sun, 06 Dec 2020 20:17:57 +0000</pubDate>
      <link>https://dev.to/mizziness/webpack-5-in-craft-cms-3-coming-right-up-2l0h</link>
      <guid>https://dev.to/mizziness/webpack-5-in-craft-cms-3-coming-right-up-2l0h</guid>
      <description>&lt;p&gt;Webpack 5 has been out for several weeks now and has several &lt;a href="https://webpack.js.org/blog/2020-10-10-webpack-5-release/"&gt;new features&lt;/a&gt; and changes that I very much wanted to work with and make use of in a Craft CMS 3 project I maintain.&lt;/p&gt;

&lt;p&gt;However, when an update with breaking changes comes out, it can be an absolute &lt;em&gt;bear&lt;/em&gt; getting all of your dependencies to play together nicely. &lt;/p&gt;

&lt;p&gt;(Sometimes it can even be impossible until other dependency package maintainers can get to updating their own code.) &lt;/p&gt;

&lt;p&gt;Generally, I like to use boilerplates to kickstart my projects, but some of these updates are &lt;em&gt;so new&lt;/em&gt; that I wasn't able to find one that both worked correctly and suited my needs.&lt;/p&gt;

&lt;p&gt;Since I couldn't find one, I created a new boilerplate with Webpack 5, PostCSS 8, Tailwind 2, and HMR for your development environment. (It also contains goodies like Sass and Babel, of course.)&lt;/p&gt;

&lt;p&gt;It tries to make little-to-no assumptions about your project; only what it needs to in order to function. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mizziness/craft3-webpack5-tailwind2-boilerplate"&gt;https://github.com/mizziness/craft3-webpack5-tailwind2-boilerplate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRs and constructive feedback are always welcome!&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>programming</category>
    </item>
    <item>
      <title>Returning to the office after Covid19 ... Should we?</title>
      <dc:creator>Tammy Shipps</dc:creator>
      <pubDate>Thu, 02 Jul 2020 16:49:13 +0000</pubDate>
      <link>https://dev.to/mizziness/returning-to-the-office-after-covid19-should-we-f60</link>
      <guid>https://dev.to/mizziness/returning-to-the-office-after-covid19-should-we-f60</guid>
      <description>&lt;p&gt;The magical phrase &lt;em&gt;work/life balance&lt;/em&gt;.  It seems so easy to achieve when you only think about it, but in practice, it's pretty difficult to nail down, and it's often a moving target.&lt;/p&gt;

&lt;p&gt;Working for a company in corporate America has its ups and downs. One down that I have particular experience with is that work/life balance can feel out of reach, even in the best of times.&lt;/p&gt;

&lt;p&gt;Let's be honest: capitalism and empathy don't really mesh well. And empathy is needed to truly understand how important it is to have a healthy balance between professional and personal life.&lt;/p&gt;

&lt;p&gt;Covid19 may just have a silver lining in that it has forced companies to put their employees - &lt;em&gt;all&lt;/em&gt; of their employees - ahead of the company by allowing those who can to work from home. (Granted, not all companies have responded in what I would personally consider "the right way", but a great many have allowed remote work for the foreseeable future, including &lt;a href="https://www.applause.com/"&gt;the company I work for&lt;/a&gt; now.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j0jhnCuV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8u0zfbx65kpotgeen4z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j0jhnCuV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8u0zfbx65kpotgeen4z.jpg" alt="Stay safe from Covid-19, work at home"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why is that important? Remote work...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.inc.com/business-insider/study-reveals-commute-time-impacts-job-satisfaction.html"&gt;Eliminates commuting time and distance&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My commute time went from 45 minutes one-way to 10 seconds. That's a significant drop!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Increases the time employees have with their families&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I get to see more of my kids, which is a huge bonus for me, personally.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reduces office politics and stress&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have found there to be less gossip, fewer disagreements, and better communication between coworkers with the use of asynchronous tools like Slack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Allows employees to control their own working environment&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I can set up my laptop wherever I want - even outside on nice days. I can't tell you how refreshing it is to sit on the patio on a sunny day while coding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vbt0yVAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/myn4d4vbji3fzxaymv5e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vbt0yVAV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/myn4d4vbji3fzxaymv5e.jpg" alt="Working from home means you can work outside, too!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, until it became necessary, most companies didn't allow employees to work from home. There were concerns ranging from "But will they &lt;em&gt;actually&lt;/em&gt; work, or will they slack off?" to "We don't have the resources to support it."&lt;/p&gt;

&lt;p&gt;Then came Covid19.&lt;/p&gt;

&lt;p&gt;Companies and stubborn managers are now getting to see and experience first-hand how much better &lt;em&gt;work/life balance&lt;/em&gt; can be when working from home...and how it benefits the bottom line, too!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low overhead costs&lt;/strong&gt; - not as much office space is needed, and bills such as electricity will be much lower due to reduced usage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better security&lt;/strong&gt; - with fewer people moving in and about the office, it's easier to make sure they're all supposed to be there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hiring becomes easier&lt;/strong&gt; - Location is no longer an obstacle so you can hire who fits the requirement best, not just who is available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Increased productivity&lt;/strong&gt; - Less distractions, fewer useless meetings, communication improves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.forbes.com/sites/rachelmontanez/2020/02/10/this-work-life-balance-study-reveals-3-major-problems-heres-what-we-need-to-ask/#571c5ddf7277"&gt;Increased loyalty, lower turnover&lt;/a&gt;&lt;/strong&gt; - Employees will be much less likely to seek work elsewhere.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Skp7rRSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zepp0rtkgk0e9i5dzits.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Skp7rRSd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zepp0rtkgk0e9i5dzits.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, not every person is suited for remote work - there are people who will, indeed, slack off.  However, those folks are the exception to the rule. &lt;/p&gt;

&lt;p&gt;The vast majority of employees, especially in software engineering, will enjoy working more from home, and so will likely work more, not less. And that work will be much less stressful and may take less time and resources, overall.&lt;/p&gt;

&lt;p&gt;So, when Covid19 finally gives it a rest and the world becomes safe once again...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Should we go back to the office?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While every situation is different, I feel that we should consider how much better our lives are when we work from home, and stay that way. Personally, I plan to request that I be allowed to stay remote instead of going back.&lt;/p&gt;

&lt;h4&gt;
  
  
  What do you think?
&lt;/h4&gt;

&lt;p&gt;Is remote work better for your life, or worse?&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>pandemic</category>
      <category>covid19</category>
    </item>
    <item>
      <title>Snippet: Making your buttons fully accessible</title>
      <dc:creator>Tammy Shipps</dc:creator>
      <pubDate>Tue, 30 Jun 2020 01:41:13 +0000</pubDate>
      <link>https://dev.to/mizziness/drying-up-your-accessible-buttons-8n7</link>
      <guid>https://dev.to/mizziness/drying-up-your-accessible-buttons-8n7</guid>
      <description>&lt;p&gt;I'd always been under the (mistaken) impression that buttons, in order to be accessible, needed to listen to click events and the enter key - but my bubble was unexpectedly burst by reading &lt;a href="https://webaim.org/techniques/keyboard/"&gt;the specs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In order to be truly accessible, buttons should activate on both the &lt;code&gt;enter&lt;/code&gt; key, &lt;em&gt;and&lt;/em&gt; the &lt;code&gt;space bar&lt;/code&gt;. So, if you're like me and you're a) lazy and b) lazy, you can accomplish this pretty easily with a snippet like this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Enable space and enter activation on buttons&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button, a.button, a.btn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click tap keydown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&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;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
      &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let's break down what this does.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button, a.button, a.btn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Select elements that are buttons, or that act like buttons:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click tap keydown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Here we put the events we wish to capture, and then grab the event object. It's important to include 'click' here, even though we really want key presses, because:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&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 want to allow interaction events to work as normal if they are clicks, so let's catch them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charCode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&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;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Okay, now we get to the key presses, and the magic! First, let's make sure we're dealing with a keypress. If we are, then we need to see &lt;em&gt;which&lt;/em&gt; key was pressed, since we only care about 2 keys. Depending on the event, we might get a code different ways, so we'll check &lt;code&gt;event.charCode&lt;/code&gt; and &lt;code&gt;event.keyCode&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;If the code returned is &lt;code&gt;32&lt;/code&gt; then the user pressed the space bar, and code &lt;code&gt;13&lt;/code&gt; corresponds to the enter key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is the magic right here - this will find exact the button that was interacted with and fire off a good old-fashioned &lt;code&gt;click&lt;/code&gt; event, making the button activate.&lt;/p&gt;

&lt;p&gt;Remember when I said that we need to include &lt;code&gt;click&lt;/code&gt; as a captured event? That's because we might be dealing with a fake button (such as an anchor tag with &lt;code&gt;role="button"&lt;/code&gt;), and by being explicit, we're making sure not to introduce bugs unintentionally, and clicks remain working as normal.&lt;/p&gt;

&lt;p&gt;That's my method!  Do you have your own?  Let me know!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;:  Thanks to &lt;a href="https://dev.to/anevins12"&gt;Andrew Nevins&lt;/a&gt; for reminding me that &lt;code&gt;keypress&lt;/code&gt; is depreciated!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>html</category>
      <category>jquery</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A Handy Snippet for Accessible Images in Craft CMS</title>
      <dc:creator>Tammy Shipps</dc:creator>
      <pubDate>Mon, 04 May 2020 22:27:53 +0000</pubDate>
      <link>https://dev.to/mizziness/a-handy-snippet-for-accessible-images-in-craft-cms-2p67</link>
      <guid>https://dev.to/mizziness/a-handy-snippet-for-accessible-images-in-craft-cms-2p67</guid>
      <description>&lt;h5&gt;
  
  
  Friends don't let friends code unaccessible images.
&lt;/h5&gt;

&lt;h1&gt;
  
  
  The backstory
&lt;/h1&gt;

&lt;p&gt;We have a fairly sizable marketing website where I work, and recently we've been pushing toward making it &lt;a href="https://www.w3.org/WAI/standards-guidelines/wcag/"&gt;accessibility-compliant&lt;/a&gt; (yay!) While cleaning up some of the older template structure of our &lt;a href="https://docs.craftcms.com/v3/dev/"&gt;Craft CMS&lt;/a&gt;-run website, I quickly realized I had a scaling problem (boo!)&lt;/p&gt;

&lt;p&gt;There were tons of &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; in the templates, possibly hundreds, and only a few prominent image placements included things like an &lt;code&gt;alt&lt;/code&gt; tag or &lt;code&gt;aria&lt;/code&gt; label on the element - things that should be &lt;em&gt;on every image on the site&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  The trap: "It looks right so it must be right"
&lt;/h1&gt;

&lt;p&gt;For a lot of developers who work on the front-end, a large portion of our job is "making it look right." That sounds easy, but in practice, it's anything but - especially with deadlines, last-minute design tweaks, copy changes, and global pandemics getting in the way. &lt;/p&gt;

&lt;p&gt;Some developers (myself included) can get so bogged down with making it look pixel-perfect that they forget to make sure it works properly for &lt;em&gt;edge and special cases&lt;/em&gt;, too.&lt;/p&gt;

&lt;p&gt;I've been guilty of this plenty of times... Honestly, it's pretty easy to forget about the mess under the hood if the paint job looks perfect. But the &lt;a href="https://www.forbes.com/sites/ryanrobinson/2019/09/25/website-accessibility-online-business/#23892b079c19"&gt;writing is on the wall&lt;/a&gt;: Accessibility is important and can't be overlooked any longer. So how do we get better at these small tasks that have such a huge impact?&lt;/p&gt;

&lt;h1&gt;
  
  
  The solution
&lt;/h1&gt;

&lt;p&gt;That's where &lt;a href="https://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; comes in! Yes, even for things like &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags. &lt;/p&gt;

&lt;p&gt;In this case, since have a lot of images, and we want to make sure that &lt;em&gt;every single one has the required element properties&lt;/em&gt;, it makes sense to use a template partial or &lt;a href="https://symfony.com/blog/simpler-macros-in-twig-templates"&gt;macro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, I made a new file under &lt;code&gt;templates&lt;/code&gt; named &lt;code&gt;templates/_includes/utilities/image.twig&lt;/code&gt; to hold the new code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="c"&gt;{#
  Displays an image from a Craft image object in an accessible fashion.

  @param {object} image - the image data object
  @param {string} transformation - image transformation or transformation handle
  @param {string} classes - additional css classes to add
#}&lt;/span&gt;

&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;transform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;transformation&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;image.getUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;alt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;image.altText&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;image.title&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;classes&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;image.getHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;image.getWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;alt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;classes&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt; transformed-image &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;transform&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;image.id&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note that we are using the Typed Link Field plugin for Craft CMS, so our link data object structure might look different than yours, but the concept is the same!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And then, to use the above to embed an image, I used the following within the templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;featuredImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;entry.featuredImage.one&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;

&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;featuredImage&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
  &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="s1"&gt;'_includes/utilities/image'&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;image&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;featuredImage&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And that will spit out a nicely formed &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag with all of the properties required, every time. Whew!&lt;/p&gt;

&lt;p&gt;It's very versatile due to being able to optionally pass in one-off customizations like CSS classes and &lt;a href="https://docs.craftcms.com/v3/image-transforms.html"&gt;named transforms&lt;/a&gt; and the code will generate the correct end result for you.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;And the next time I need to fix an image tag on the site, I can do it in one place and not have to hunt and peck through who-knows-how-many templates.&lt;/p&gt;




&lt;p&gt;Edit: June 29, 2020&lt;/p&gt;

&lt;p&gt;If you want to automate other a11y traits, such as &lt;code&gt;aria-hidden&lt;/code&gt; on your images, you can extend the snippet slightly, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight twig"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;src&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;alt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;classes&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt; transformed-image &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;transform&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;image.id&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;height&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;width&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
  &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;0&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'false'&lt;/span&gt; &lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'true'&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This way, your image will automatically include `aria-hidden="true" when there is no alt text - essentially making it a display-only image.  And of course, once you add the alt to the back-end in the Craft admin, it will change itself accordingly.&lt;/p&gt;

&lt;p&gt;\o/&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>twig</category>
      <category>craft</category>
    </item>
  </channel>
</rss>
