panda-plugin-crv
v0.3.1
Published
A Panda CSS plugin for responsive variants
Downloads
2,345
Maintainers
Readme
panda-plugin-crv
A Panda CSS plugin for responsive cva
variants. This plugin allows you to to use Panda's responsive syntax, without config recipes, such as:
<Component variant={{ base: 'secondary', lg: 'primary' }} />
Installation
npm i panda-plugin-crv
// panda.config.ts
import { defineConfig } from '@pandacss/dev';
import { pluginResponsiveVariants } from 'panda-plugin-crv';
export default defineConfig({
plugins: [pluginResponsiveVariants()],
});
Usage
This plugin removes the boilerplate required to build responsive variants within cva
. This allows you to (1) co-locate variants near your components instead of in Panda's config, and (2) generate atomic class names.
Example component styles:
import { crv, cva } from '@/styled-system/css';
const styles = cva({
variants: {
// Create responsive variants
...crv('variant', {
primary: { bg: 'blue.500' },
secondary: { bg: 'gray.500' },
destructive: { bg: 'red.500' },
}),
},
});
This plugins ships two helpers to parse responsive variants in your components.
ResponsiveVariant
– creates appropriate types, with your theme's breakpointssplitResponsiveVariant
– translates the incoming responsive object into variants generated bycrv
import {
splitResponsiveVariant,
type ResponsiveVariant,
} from '@/styled-system/css';
type ComponentProps = PropsWithChildren<{
variant?: ResponsiveVariant<'primary' | 'secondary' | 'destructive'>;
}>;
const Component: FC<ComponentProps> = (props) => {
const { children, variant = 'secondary' } = props;
const variants = splitResponsiveVariant('variant', variant);
return <div className={styles({ ...variants })}>{children}</div>;
};
Using your component will look like this:
<Component variant="primary" />
<Component variant={{ base: 'secondary', lg: 'primary' }} />
Compound Variants
This plugin supports responsive compound variants, through the ccv
function. Note: this can produce a large amount of compound variants. Make sure your unused CSS is purged properly.
import { ccv, crv, cva } from '@/styled-system/css';
const styles = cva({
variants: {
...crv('variant1', {
primary: { bg: 'blue.500' },
secondary: { bg: 'gray.500' },
destructive: { bg: 'red.500' },
}),
...crv('variant2', {
true: { opacity: 1 },
false: { opacity: 0 },
}),
},
compoundVariants: [
// Create compound variants
...ccv({
variant1: 'primary',
variant2: true,
css: {
color: 'green.500',
},
}),
],
});
The above code will render "green.500"
if variant1
is "primary"
and if variant2
is true
<Component variant1="primary" variant2>
// -> opacity_1 bg_blue.500 text_green.500
<Component
variant1={{ base: 'secondary', lg: 'primary' }}
variant2={{ base: false, lg: true }}
/>
// -> opacity_0 lg:opacity_1 lg:bg_blue.500 bg_gray.500 lg:text_green.500
Current Limitations
- The plugin generates variants for all breakpoints defined in your theme, and does not include Panda's generated breakpoints, such as
mdDown
,mdOnly
,mdToLg
. - There is currently no way to limit or pick which breakpoints you wish to generate.