Card component 2 (solution 5)

Recipe 3.8 Add links to groups of elements

Sample:

When Isn’t Enough: JavaScript Requirements For Accessible Components

by Stephanie Eckles

Example dropdown menus from Dribbble, Google search, and GitHub

Spoiler alert: tooltips, modals, tabs, carousels, and dropdown menus are some of the user interface components that require more than CSS. To ensure accessibility of your interface, JavaScript is a necessary addition to accomplish focus management, respond to keyboard events, and toggle ARIA attributes.

Read “When CSS Isn’t Enough” .

Code:

<div class="card">
  <h3>
    When Isn’t Enough: JavaScript Requirements For Accessible Components
  </h3>
  
  <p class="author">by <a href="https://thinkdobecreate.com/">Stephanie Eckles</a></p>
  
  <img src="/images/demos/card_image.avif" alt="Example dropdown menus from Dribbble, Google search, and GitHub">

  <div>
    <p>
      Spoiler alert: tooltips, modals, tabs, carousels, and dropdown
      menus are some of the user interface components that require more
      than CSS. To ensure accessibility of your interface, JavaScript
      is a necessary addition to accomplish focus management, respond
      to keyboard events, and toggle ARIA attributes.
    </p>
  </div>

  <p>
    Read
    <a class="readmore" href="https://www.smashingmagazine.com/2021/06/css-javascript-requirements-accessible-components/">
      “When CSS Isn’t Enough”
    </a>.
  </p>
</div>

<style>
  .card {
    --padding: 1rem;

    background-color: hsl(222deg 100% 98%);
    box-shadow: 0 0 7px 3px hsl(0deg 0% 0% / 10%);
    display: grid;
    font-family: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, sans-serif;
    grid-template-columns: var(--padding) 1fr var(--padding);
    line-height: 1.5;
    max-width: 23rem;
    padding-block-end: var(--padding);
  }

  .card > * {
    grid-column: 2 / -2;
    margin: 0 0 0.6em;
  }

  .card h3 {
    line-height: 1.3;
    margin-block-end: 0;
  }
  .card h3 a {
    color: initial;
    text-decoration: initial;
  }
  .card :is(img, .img) {
    grid-column: 1 / -1;
    margin-block-end: var(--padding);
    max-width: 100%;
    order: -1;
  }
  .card :last-child {
    margin-block-end: 0;
  }
</style>

<script>
  const card = document.querySelector(".card");
  const link = card.querySelector(".readmore");
  
  card.addEventListener("click", (e) => {
    const noTextSelected = !window.getSelection().toString();
    
    if (noTextSelected) {
      link.click();
    }
  });
</script>