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

kevlar-tabs

v1.5.2

Published

Yet another better tabs library for React

Downloads

94

Readme

Kevlar Tabs

Inspired by react-tabs

Install

npm install kevlar-tabs

Usage

** This package is only built as a module. **

import Tabs from 'kevlar-tabs';

export const MyTabs = () => {
  const [activeTab, setActiveTab] = useState(0);

  return (
    <Tabs selected={activeTab} onSelect={setActiveTab}>
      <TabList>
        <Tab>Tab 1</Tab>
        <Tab>Tab 2</Tab>
        <Tab>Tab 3</Tab>
      </TabList>
      <TabPanel>Tab 1 content</TabPanel>
      <TabPanel>Tab 2 content</TabPanel>
      <TabPanel>Tab 3 content</TabPanel>
    </Tabs>
  )
}

You can also use named tabs and use the onNameSelected callback.

<Tab name="tab1">Tab 1</Tab>

Some panels could not be defined for some reason. You can manually specify the index of the panel:

<TabPanel>Tab 1 content</TabPanel>
<TabPanel index={2}>Tab 3 content</TabPanel>

Tabs properties

| Property | Type | Description | | --- | --- | --- | | autoActivate | boolean | (default: true) If true, it prevents auto activation of tabs on focus. | | focusOnInit | boolean | (default: false) If true, the default selection tab takes the focus on init. | | selected | number | string | The index or the name of the selected tab. | | onSelect | function | Callback function that is called when a tab is selected. Gives the index as a parameter. | | onNameSelect | function | Callback function that is called when a tab is selected. Gives the name as a parameter. | | children | ReactNode | TabList and TabPanel components. |

Styling

You can use CSS classes that are set on the components:

  • Tabs have no class (but you can create your own container).
  • TabList has the class tablist.
  • Tab has the class tab in addition to tab--active when selected and tab--disabled when disabled.
  • TabPanel has the class tabpanel in addition to tabpanel--active when selected.

Custom classes

You use custom classes for the different states of the elements.

To do it, use the classNames property of Tabs and pass an object of this shape:

export type TabsClassNames = Partial<{
  tabList: string
  tab: string
  tabActive: string
  tabDisabled: string
  tabPanel: string
  tabPanelActive: string
  tabPanelDisabled: string
}>

You can also pass this configuration to sub-elements: className, classNameActive and classNameDisabled so that different tabs can have different styling since specific configuration takes precedence over the global one.

With styled-components

Using styled-components, one important thing to know is that you have defined the displayName of the component you want to wrap.

For instance:

import { Tab } from 'kevlar-tabs'
import styled from 'styled-components'

const CustomTab = styled(Tab)`
  color: white;
  background-color: purple;

  &[aria-active='true'] {
    font-weight: bold;
  }

  &[aria-disabled='true'] {
    color: #ccc;
    background-color: #544454;
  }
`

// THIS IS IMPORTANT
CustomTab.displayName = 'Tab'

displayName has to be set for Tab, TabList and TabPanel, and it takes the name of the component itself.

Features

  • Disabled tabs
  • Customizable classes
  • Styled-Components compliance
  • Lazy loading
  • Keyboard navigation
  • Auto activation

Roadmap

  • [ ] Documentation site
  • [ ] Contribution guide