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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@styled-cva/solid

v0.5.2

Published

A typesafe, class-variance-authority-based, styled-components-like library for authoring SolidJS components

Readme

Why styled-cva?

styled-cva offers the best of both worlds: the expressiveness of styled-components and the power of class-variance-authority, all while being fully typesafe and optimized for Tailwind CSS.

  • Familiar styled-components API: If you love the tw.button...` syntax, you'll feel right at home.
  • Powered by CVA: Easily create components with complex variants.
  • Fully Typesafe: Enjoy autocompletion and type-checking for all your component's variants.
  • Seamless Tailwind CSS Integration: styled-cva is designed to work perfectly with Tailwind CSS and the official Tailwind CSS VSCode extension.
  • Lightweight and Performant: No unnecessary abstractions, just the essentials to build beautiful and consistent UIs.

Features

  • ✅ Supports all HTML elements.
  • ✅ Full TypeScript support, including prop and variant inference.
  • cva and withProps for powerful component customization.
  • ✅ Polymorphic $as prop to change the rendered element.
  • ✅ Smart prop filtering to avoid extraneous props on the DOM.
  • ✅ Works with custom Solid components.
  • ✅ Extend CVA components with tw(Button)\extra-classes` — variant props ($variant, $size`) are preserved.

Installation

npm

npm i --save @styled-cva/solid

pnpm

pnpm add @styled-cva/solid

bun

bun add @styled-cva/solid

Usage

Basic Example

Create a simple, styled button.

import tw from "@styled-cva/solid";

const Button = tw.button`
  bg-blue-500 text-white font-bold py-2 px-4 rounded
`;

// ...
<Button>Click Me</Button>;

Variants with cva

Create a button with different variants.

import tw from "@styled-cva/solid";

const Button = tw.button.cva(
  "font-bold py-2 px-4 rounded", // base class
  {
    variants: {
      // Use '$' to prevent the prop from being passed to the DOM
      $variant: {
        primary: "bg-blue-500 text-white",
        secondary: "bg-gray-500 text-white",
      },
      $size: {
        small: "text-sm",
        large: "text-lg",
      },
    },
    defaultVariants: {
      $variant: "primary",
    },
  },
);

// ...

<Button $variant="secondary" $size="large">
  Click Me
</Button>;

withProps for Default Props

Apply default props to your component.

const PrimaryButton = tw.button
  .cva("font-bold py-2 px-4 rounded", {
    variants: {
      $variant: {
        primary: "bg-blue-500 text-white",
        secondary: "bg-gray-500 text-white",
      },
    },
  })
  .withProps({
    "data-testid": "my-button",
    type: "button",
    $variant: "primary", // Default variant
  });

// ...

<PrimaryButton>Click Me</PrimaryButton>;

Polymorphic $as Prop

Render a different element or component.

import tw from "@styled-cva/solid";

const Button = tw.button.cva("font-bold py-2 px-4 rounded", {
  variants: {
    $variant: {
      primary: "bg-blue-500 text-white",
      secondary: "bg-gray-500 text-white",
    },
  },
});

// ...

// Renders as an anchor tag
<Button $as="a" href="/some/url" $variant="primary">
  I'm a link!
</Button>;

Styling Custom Components

Create a styled component from a custom component that accepts a class prop.

import tw from "@styled-cva/solid";

const MyButton = (props: { class?: string }) => {
  return <button class={props.class}>Hello</button>;
};

const StyledButton = tw(MyButton)`text-red-500`;

// ...

<StyledButton />;

Extending CVA Components

Add extra classes to a CVA component; variant props stay typed and available.

const Button = tw.button.cva("font-bold py-2 px-4 rounded", {
  variants: {
    $variant: { primary: "bg-blue-500", secondary: "bg-gray-500" },
    $size: { small: "text-sm", large: "text-lg" },
  },
});

const StyledButton = tw(Button)`text-red-500`;

// $size and $variant are still available
<StyledButton $size="large" $variant="primary">
  foo
</StyledButton>;

VSCode intellisense

For tailwindcss extension support, add this to your vscode settings.json

  // tailwindcss intelisense settings
  "tailwindCSS.emmetCompletions": true,
  "tailwindCSS.includeLanguages": {
    "typescript": "javascript",
    "typescriptreact": "javascript"
  },
   "tailwindCSS.experimental.classRegex": [
    "tw`([^`]*)",
    "tw\\.[^`]+`([^`]*)`",
    "tw\\(.*?\\).*?`([^`]*)",
    ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
    ["cn\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
  ],
  "editor.quickSuggestions": {
    "strings": true
  },

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

License

This project is licensed under the Apache-2.0 License.

Acknowledgements

License - Apache-2.0