New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

react-cva-tools

Package Overview
Dependencies
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

react-cva-tools

Add cva's `VariantProps` to existing react components

latest
Source
npmnpm
Version
0.4.0
Version published
Maintainers
1
Created
Source

React cva tools

Add cva's VariantProps to existing react components

Acknowledgements

joe-bell/cva

Thank you for making cva (Class Variance Authority).

Installation

Using npm

npm i class-variance-authority react-cva-tools

Using yarn

yarn add class-variance-authority react-cva-tools

Tailwind CSS IntelliSense (ref: joe-bell/cva)

For Tailwind CSS IntelliSense Vscode extension, you can add the following to you setting.json

  "tailwindCSS.experimental.classRegex": [
    ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
    ["withCva\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"],
    ["withVariants\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"],
  ]

Examples

withVariants

withVariants(component: React.ElementType, ...cvaArgs: Parameters<typeof cva>)

create a Button component with 'button'

// components/Button.tsx
export const Button = withVariants('button', ['btn', 'font-bold'], {
  variants: {
    intent: {
      primary: 'bg-blue-700 hover:bg-blue-800 text-gray-100',
    },
    padding: {
      small: '',
      medium: 'py-1 px-2',
    },
    round: {
      small: 'rounded-sm',
      medium: 'rounded',
      full: 'rounded-full',
    },
    shadow: {
      medium: 'shadow',
    },
  },
  defaultVariants: {
    padding: 'medium',
    round: 'medium',
    shadow: 'medium',
  },
});

Usage:

<Button
  id="a-btn"
  className="test-btn"
  variants={{
    intent: 'primary',
  }}
  onClick={(e) => {
    alert('Click!!');
  }}
>
  click
</Button>
<button
  id="a-btn"
  class="btn font-bold bg-blue-700 hover:bg-blue-800 text-gray-100 py-1 px-2 rounded shadow test-btn"
>
  click
</button>

We can add variants to custom components too

export const Box: FC<ComponentPropsWithoutRef<'div'>> = ({ ...props }) => (
  <div {...props} />
);

export const FlexBox = withVariants(Box, null, {
  variants: {
    flex: {
      row: 'flex flex-row',
    },
  },
});

withDefaultVariants

create a CircleButton by passing default variants parameters to Button

import { Button } from '@components/Button';

export const CircleButton = withDefaultVariants(Button, {
  round: 'full',
  className: 'w-12 h-12',
});

Usage

<CircleButton className="test" />
<button
  class="btn font-bold py-1 px-2 rounded-full shadow test w-12 h-12"
></button>

withCva

create a Button component with cva. The result is the same as using withVariants

const buttonCva = cva(['btn', 'font-bold'], {
  variants: {
    intent: {
      primary: 'bg-blue-700 hover:bg-blue-800 text-gray-100',
    },
    padding: {
      small: '',
      medium: 'py-1 px-2',
    },
    round: {
      small: 'rounded-sm',
      medium: 'rounded',
      full: 'rounded-full',
    },
    shadow: {
      medium: 'shadow',
    },
  },
  defaultVariants: {
    padding: 'medium',
    round: 'medium',
    shadow: 'medium',
  },
});

export const Button = withCva('button', buttonCva);

Usage:

<Button
  id="a-btn"
  className="test-btn"
  variants={{
    intent: 'primary',
  }}
  onClick={(e) => {
    alert('Click!!');
  }}
>
  click
</Button>
<button
  id="a-btn"
  class="btn font-bold bg-blue-700 hover:bg-blue-800 text-gray-100 py-1 px-2 rounded shadow test-btn"
>
  click
</button>

FAQs

Package last updated on 16 Jan 2023

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts