<?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: d4g0</title>
    <description>The latest articles on DEV Community by d4g0 (@d4g0).</description>
    <link>https://dev.to/d4g0</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%2F165249%2Fba70c481-e1b9-4d24-88e3-53eaf3979b97.jpg</url>
      <title>DEV Community: d4g0</title>
      <link>https://dev.to/d4g0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/d4g0"/>
    <language>en</language>
    <item>
      <title>How to react to @nuxt-i18n locale changes inside the setup function</title>
      <dc:creator>d4g0</dc:creator>
      <pubDate>Mon, 23 May 2022 03:45:27 +0000</pubDate>
      <link>https://dev.to/d4g0/how-to-react-to-nuxt-i18n-locale-changes-inside-the-setup-function-1n21</link>
      <guid>https://dev.to/d4g0/how-to-react-to-nuxt-i18n-locale-changes-inside-the-setup-function-1n21</guid>
      <description>&lt;p&gt;If you are using Nuxt v2, nuxt-i18n and you want to react to i18n object changes inside the &lt;code&gt;setup&lt;/code&gt; function, let's say, a language change, this blog will teach you how. &lt;/p&gt;

&lt;p&gt;I also cover how to use localized messages inside the setup function in this other &lt;a href="https://dev.to/d4g0/how-to-access-localized-messages-of-nuxt-i18n-inside-the-setup-function-53o1"&gt;article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's say for instance, you want to craft a special url to point to other site, but you want to keep the current language of your user in the link:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;setup&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;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="c1"&gt;// all the stuff is in the root&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&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;mapedURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&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;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://my.other-site.com&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="nx"&gt;setUrl&lt;/span&gt;&lt;span class="p"&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;isInSpanish&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localeProperties&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;es&lt;/span&gt;&lt;span class="dl"&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;isInSpanish&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;mapedURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&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="nx"&gt;mapedURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/en/&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="p"&gt;}&lt;/span&gt;



&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;triggerWatch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// keep traking on language changes when page loads&lt;/span&gt;
    &lt;span class="c1"&gt;// hint: this dosen't work in edge properties like *.localeProperties.code&lt;/span&gt;
    &lt;span class="nx"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;localeProperties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldV&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="nx"&gt;setUrl&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="c1"&gt;// init when page loads&lt;/span&gt;
&lt;span class="nx"&gt;onMounted&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="c1"&gt;// this watch will brake in the server so ignore there&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;)&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;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;setUrl&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;triggerWatch&lt;/span&gt;&lt;span class="p"&gt;();&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;{&lt;/span&gt;
    &lt;span class="nx"&gt;mapedURL&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;Tested in Nuxt v2 and nuxt-i18n v7. That's it folks.&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>nuxti18n</category>
      <category>compositionapi</category>
      <category>hacks</category>
    </item>
    <item>
      <title>How to access localized messages of nuxt-i18n inside the setup function</title>
      <dc:creator>d4g0</dc:creator>
      <pubDate>Thu, 19 May 2022 02:16:37 +0000</pubDate>
      <link>https://dev.to/d4g0/how-to-access-localized-messages-of-nuxt-i18n-inside-the-setup-function-53o1</link>
      <guid>https://dev.to/d4g0/how-to-access-localized-messages-of-nuxt-i18n-inside-the-setup-function-53o1</guid>
      <description>&lt;p&gt;Quick snippet, log inside a client check if to avoid server logs get forwarded to browser console, it works server side too.&lt;br&gt;
Im mostly writing this to rember it, i allways forget how to doit 😅️.&lt;/p&gt;

&lt;p&gt;Tested in &lt;code&gt;@nuxt-i18n&lt;/code&gt; 7.X on a nuxt 2 project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;setup&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;ctx&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

   &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="c1"&gt;// all the stuff is in the root, who would imagine that ha&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// ctx.root.$i18n.t&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$i18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my.message.path&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's how to use &lt;code&gt;$t&lt;/code&gt; is &lt;code&gt;nuxt-i18n&lt;/code&gt; inside &lt;code&gt;setup&lt;/code&gt; function folks.&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>i18n</category>
      <category>hacks</category>
      <category>compositionapi</category>
    </item>
    <item>
      <title>Making focus-visible happen where do you live</title>
      <dc:creator>d4g0</dc:creator>
      <pubDate>Sat, 06 Feb 2021 17:48:27 +0000</pubDate>
      <link>https://dev.to/d4g0/making-focus-visible-happen-where-do-you-live-pho</link>
      <guid>https://dev.to/d4g0/making-focus-visible-happen-where-do-you-live-pho</guid>
      <description>&lt;p&gt;In case you don't know  the &lt;code&gt;focus-visible&lt;/code&gt; css selector allows us to target DOM elements that have been focused by a keyboard interaction, instead the traditional &lt;code&gt;focus&lt;/code&gt; that targets every focused element.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do we  need that distinction in the first place ?
&lt;/h2&gt;

&lt;p&gt;It all starts with  accessibility (a11y) in  mind. If a user is browsing with a mouse or a phone, they know exactly what they are clicking. They don't need any clue about it, it might even become a distraction.&lt;/p&gt;

&lt;p&gt;But it is a very different story for the keyboard user. Think for a moment, a father carrying their baby, people with injuries in a hand, people with a temporary or chronic health illness that disable them to use a mouse... there are a lot of &lt;a href="https://www.interactiveaccessibility.com/accessibility-statistics" rel="noopener noreferrer"&gt;them&lt;/a&gt; out there  and you should be including them in your target audience. As Steve Krug says, it's the very right thing to do! &lt;strong&gt;no excuses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you haven't tried, go out there with your TAB key and browse around. You will need a visual feedback that shows you where you are, step by step. Some folks are very good at this, like twitter, but reality is that sometimes we don't even plan a keyboard only navigation in the first place.&lt;/p&gt;

&lt;p&gt;So quick recap: we need a way to tell our keyboard people what elements they have focused in our app. Here is where our best buddy &lt;code&gt;focus-visible&lt;/code&gt; selector came to play. Even well supported in modern browsers it's kinda new in the CSS playground. So we are going to set things up in the more compatible way.&lt;/p&gt;

&lt;h2&gt;
  
  
  OK  let's make this happen !
&lt;/h2&gt;

&lt;p&gt;You can find this &lt;a href="https://github.com/d4g0/focus-visible-sample" rel="noopener noreferrer"&gt;repo&lt;/a&gt; at GitHub, feel free to clone it.&lt;br&gt;
Also you can check the live version &lt;a href="https://ecstatic-euler-92587b.netlify.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;I'm going to use &lt;a href="https://nuxtjs.org/" rel="noopener noreferrer"&gt;Nuxt.js&lt;/a&gt; and &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind&lt;/a&gt; because those are my favorite tools, but you can apply what you will learn here to every project. The real hero behind the scenes here is the &lt;code&gt;focus-visible&lt;/code&gt; &lt;a href="https://github.com/WICG/focus-visible" rel="noopener noreferrer"&gt;Polyfill&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So create a new &lt;code&gt;nuxt-app&lt;/code&gt; ( do not select tailwind yet):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-nuxt-app focus-visible-sample
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Tailwind  on your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;focus-visible-sample
yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; @nuxtjs/tailwindcss tailwindcss@npm:@tailwindcss/postcss7-compat @tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And install the polyfill and a postcss plugin to make it even easier to work with it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add focus-visible postcss-focus-visible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to bundle the actual polyfill in your page.&lt;br&gt;
Nuxt  serves the static assets from the &lt;code&gt;static&lt;/code&gt; folder off your project, so i will clone the polyfill file there in a &lt;code&gt;scripts&lt;/code&gt; folder. You can find him at &lt;code&gt;node_modules/focus-visible/dist/focus-visible.min.js&lt;/code&gt;. I also clone the &lt;code&gt;.map&lt;/code&gt; version to avoid unuseful warnings in the browser developer console.&lt;br&gt;
Do what you have to,  i will use nuxt config file since he allows you declare metadata there super easy ( i 💚️ that framework) .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* nuxt.config.js */&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;head&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;script&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="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/scripts/focus-visible.min.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I will add the postcss plugin because I want to use it in conjunction with my tailwind utilities, but you will be just fine using the advice in the polyfill &lt;a href="https://github.com/WICG/focus-visible" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I will add that plugin to my &lt;a href="https://nuxtjs.org/docs/2.x/features/configuration#postcss-plugins" rel="noopener noreferrer"&gt;nuxt postcss config&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*  nuxt.config.js  */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// ...&lt;/span&gt;
   &lt;span class="na"&gt;postcss&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
       &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;
           &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postcss-focus-visible&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="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 need to set up Tailwind too of course:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/*  nuxt.config.js  */&lt;/span&gt;
&lt;span class="nx"&gt;buildModules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// https://go.nuxtjs.dev/tailwindcss&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nuxtjs/tailwindcss&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Time to set up our Tailwind config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx tailwind init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since the 'focus-visible' variant is by default &lt;a href="https://tailwindcss.com/docs/hover-focus-and-other-states" rel="noopener noreferrer"&gt;off&lt;/a&gt; we should manually get it on:&lt;br&gt;
( I will be targeting the &lt;code&gt;ring&lt;/code&gt; utility since that's the exact effect we want in our Ui)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* tailwind.config.js  v2.x */&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;//...&lt;/span&gt;
   &lt;span class="na"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="na"&gt;ringColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;focus-visible&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="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  All setted up, let's do some pair programming !
&lt;/h2&gt;

&lt;p&gt;In my home page &lt;code&gt;(pages/index.vue)&lt;/code&gt; i have craft this form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-10 w-full max-w-sm"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;submit.prevent=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;fieldset&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"petName"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block ml-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Pet Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
           &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"petName"&lt;/span&gt;
           &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
           &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"type your pet name here"&lt;/span&gt;
           &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"block mt-2 px-4 py-2 w-full rounded-lg bg-gray-700 shadow-md focus:outline-none  focus:ring-2 focus:ring-indigo-600"&lt;/span&gt;
         &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/fieldset&amp;gt;&lt;/span&gt;

       &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 w-full "&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt;
           &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;
           &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"py-2 w-full px-4 rounded-lg bg-indigo-700 hover:bg-indigo-800 shadow-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400"&lt;/span&gt;
         &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
           Get your Free Food
         &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
       &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
   &lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq4mmh167jkot2ztcw86v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fq4mmh167jkot2ztcw86v.png" alt="The App Screen Shot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look closely.&lt;br&gt;
In the input i have used the &lt;code&gt;focus:outline-none&lt;/code&gt; utility to remove the default outline of the browser, if you aren't going to replace it, leave it there, it is better than nothing. Then I have used the &lt;code&gt;focus:ring&lt;/code&gt; utility to show an enfasis for everyone, since it's a text input can be useful to show where we are going to write.&lt;br&gt;
But for the submit button i have used the &lt;code&gt;focus-visible&lt;/code&gt; utility instead, allowing us to render the rings only four our keyboard users, the ones that actually needed in this case. Check for yourself. There is no ring for the mouse submission. But if you hit the TAB you will see it. It's matching the default selector string that our &lt;code&gt;focus-visible&lt;/code&gt; polyfill is expecting.&lt;/p&gt;

&lt;p&gt;If you want to take a deep dive on accessibility i recommend chek this &lt;a href="https://webaim.org/" rel="noopener noreferrer"&gt;awesome&lt;/a&gt; resource. It’s a little extra work i will not lie to you. But I will make a tremendous impact on those users that need it; and often will improve the experience for everyone. Like those caption ready videos deliver the media for people can’t hear, but also for those that can’t understand that language. And if you want to go for a quality workshop about it, check &lt;a href="https://frontendmasters.com/courses/javascript-accessibility/" rel="noopener noreferrer"&gt;“Accessibility in JavaScript Applications”&lt;/a&gt; by Marcy Sutton. That was the place where I started to learn this stuff in the first place. Thanks Marcy for introducing me to the a11y world. &lt;/p&gt;

&lt;p&gt;That’s it my friend, go out there and craft good stuff. Your users will thank  your hard work (even if they never sayit). If you have any doubts or want to say something, send me a tweet at &lt;a href="https://twitter.com/dagocarralero" rel="noopener noreferrer"&gt;@dagocarralero&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful links
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nuxtjs.org/" rel="noopener noreferrer"&gt;Nuxt docs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind docs&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/csstools/postcss-focus-visible" rel="noopener noreferrer"&gt;Focus Visible Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://webaim.org/" rel="noopener noreferrer"&gt;WebAim&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>tailwindcss</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
