npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@auroratide/tab-list

v0.2.6

Published

Web component for tabs and tab panels

Downloads

1,312

Readme

The tab-list Elements

The tab-list, tab-item, and tab-panel elements together represent content that is presented one panel at a time. They are built with accessibility in mind and implement the WAI-ARIA guidelines for tabs.

  • A tab-list represents a set of tabs, where only one tab's contents may be presented at a time.
  • A tab-item represents a reference of a single panel of information in a tab list.
  • A tab-panel represents a panel of information.
<tab-list aria-label="Learn about fruits">
    <tab-item for="example-1-tab-1" selected>Apples</tab-item>
    <tab-item for="example-1-tab-2">Oranges</tab-item>
    <tab-item for="example-1-tab-3">Bananas</tab-item>
</tab-list>
<tab-panel id="example-1-tab-1">
    <p>Apples are usually red, but sometimes they can be green.</p>
</tab-panel>
<tab-panel id="example-1-tab-2">
    <p>Oranges are, well, orange!</p>
</tab-panel>
<tab-panel id="example-1-tab-3">
    <p>Bananas are yellow and usually curved.</p>
</tab-panel>

Installation

You can import through CDN:

<script type="module" src="https://unpkg.com/@auroratide/tab-list/lib/define.js"></script>

Or, you may install through NPM and include it as part of your build process:

$ npm i @auroratide/tab-list
import '@auroratide/tab-list/lib/define.js'

Usage

tab-list, tab-item, and tab-panel are markup elements that you can use in your HTML document. To use them together, it is best to follow these guidelines:

  • tab-item elements must be contained within a tab-list. They need not be direct descendents.
  • tab-panel must define a unique id.
  • tab-item must define the for attribute, whose value is the id of its corresponding tab-panel.
<tab-list>
    <!-- tab-item must be in a tab-list, and defines `for` to be
         the corresponding tab-panel id -->
    <tab-item for="tab-panel-id">
</tab-list>
<!-- tab-panel defines an id -->
<tab-panel id="tab-panel-id">
    <p>Any content you want</p>
</tab-panel>

The following are good accessibility practices:

  • tab-list should be labelled with a name representing the collection of tabs, either with aria-label or aria-labelledby.
  • tab-panel elements can theoretically be anywhere on the page, though it's best if they are the next focusable item after the tab-list.

Automatic Activation

By default, a tab must be clicked in order for its panel to be revealed. With automatic activation, a tab only needs to acquire focus to show its tab. In general, WAI-ARIA recommends automatic activation for the best accessibility, unless animations induce lag.

You can enable automatic activation by setting the activation attribute to "automatic" on the tab list element.

<tab-list activation="automatic" aria-label="Learn about vegetables">
    <tab-item for="example-5-tab-1" selected>Tomatoes</tab-item>
    <tab-item for="example-5-tab-2">Carrots</tab-item>
    <tab-item for="example-5-tab-3">Squashes</tab-item>
</tab-list>

Vertical Tab List

By default, tabs are listed horizontally, and they can be navigated with the left and right arrow keys.

By setting the orientation attribute to "vertical", you can make a vertical tab list. This makes it navigable with the up and down arrow keys instead.

<tab-list orientation="vertical" aria-label="Learn about vegetables">
    <tab-item for="example-2-tab-1" selected>Tomatoes</tab-item>
    <tab-item for="example-2-tab-2">Carrots</tab-item>
    <tab-item for="example-2-tab-3">Squashes</tab-item>
</tab-list>

Setting a selected tab

You can set the selected attribute on one tab-item in a tab-list. This will mark that item as selected and show its panel.

<tab-item selected for="example-3-tab-3">Bananas</tab-item>

Note: Only one tab-item can be selected at a time! If you attempt to set multiple as selected, only the first selected tabl's panel will be shown.

All Attributes

For tab-list:

| Attribute | Description | | ------------- | ------------- | | orientation | Either "horizontal" or "vertical". Represents whether the tab list should be presented horizontally or vertically, and affects whether they are navigated with the left/right or up/down keys respectively. "horizontal" by default. | | activation | Either "manual" or "automatic". Represents whether a click (manual) or focus (automatic) is required to show a tab's panel. "manual" by default. |

For tab-item:

| Attribute | Description | | ------------- | ------------- | | for | Required. Should be the same as the id of the tab's respective panel. | selected | Either present or not. Represents whether this tab's panel should be shown. |

CSS Customization

Since these are native custom elements, they can be styled the same way as regular HTML elements.

Of note:

  • tab-item[selected] will style the currently selected tab.
  • tab-list[orientation="vertical"] can style vertical tab lists.
  • tab-panel[hidden] styles hidden tabs, in case you want transitions.

Here's an example of a fully customized tab list:

div.tab-container {
    box-shadow: 0 2px 4px hsla(0, 0%, 0%, 0.25);
}

tab-list {
    background: hsl(210, 68%, 45%);
    gap: 0;
}

tab-item {
    border: none;
    border-radius: 0;
    background: hsl(210, 68%, 45%);
    color: hsl(0, 0%, 100%);
    padding: 12px 24px;
    border-right: 2px solid hsl(210, 82%, 25%);
}

tab-item:hover:not([selected]),
tab-item:focus:not([selected]) {
    background: hsl(210, 82%, 25%);
}

tab-item[selected] {
    background: hsl(0, 0%, 100%);
    border-color: transparent;
    color: hsl(0, 0%, 0%);
}

div.tab-panels-container { display: grid; }
tab-panel {
    grid-area: 1 / 1;
    border: none;
    padding: 12px 24px 24px;
    opacity: 1;
    transition: opacity 0.2s ease-in-out;
}

tab-panel[hidden] {
    display: block;
    opacity: 0;
}

Events

The tab-list element dispatches the following events:

| Name | When Triggered | | ------------- | ------------- | | tab-list:change | Whenever the currently selected tab changes |

The tab-list:change event contains references to the previously selected tab and the newly selected tab:

tabList.addEventListener('tab-list:change', e => {
    console.log(e.detail.from)
    console.log(e.detail.to)
})

Accessibility

This custom element is built with accessibility in mind! It follows the WAI-ARIA guidelines for tabs (the tablist, tab, and tabpanel roles).

  • When focus enters the tab list, the currently active tab item is focused.
  • Left and Right can be used to navigate the tabs.
  • Enter or Space select the currently focused tab.
  • Home goes to the first tab, and End goes to the last tab.

Not (yet) Implemented

The following features are desired of tab lists, but are not yet implemented:

  • Auto-opening a panel when its corresponding tab receives focus.
  • Native support for removable tabs.
  • Tabs that open popup menus.