Loading...
Loading...
Create UI components using tailwind-variants for type-safe styling. Use when creating or editing components in src/lib/ui/.
npx skill4agent add svelte-society/sveltesociety.dev component-buildersrc/lib/ui/componentName.variants.tsComponentName.sveltesrc/lib/ui/Button.sveltesrc/lib/ui/button.variants.tssrc/lib/ui/Tag.sveltesrc/lib/ui/tag.variants.tssrc/lib/ui/ContentCard.sveltesrc/lib/ui/contentCard.variants.ts// componentName.variants.ts
import { tv, type VariantProps } from 'tailwind-variants'
export const componentVariants = tv({
base: 'common-classes-for-all-variants',
variants: {
variant: {
primary: 'classes-for-primary',
secondary: 'classes-for-secondary'
},
size: {
sm: 'text-sm px-2',
md: 'text-base px-4',
lg: 'text-lg px-6'
}
},
defaultVariants: {
variant: 'primary',
size: 'md'
}
})
// Export types for each variant dimension
export type ComponentVariant = VariantProps<typeof componentVariants>['variant']
export type ComponentSize = VariantProps<typeof componentVariants>['size']<script lang="ts">
import type { ClassValue } from 'svelte/elements'
import { componentVariants, type ComponentVariant, type ComponentSize } from './componentName.variants'
type Props = {
variant?: ComponentVariant
size?: ComponentSize
class?: ClassValue
}
let { variant, size, class: className, ...rest }: Props = $props()
</script>
<div class={[componentVariants({ variant, size }), className]} {...rest}>
<!-- content -->
</div>activedisablederrorvariants: {
active: {
true: 'bg-svelte-100 border-svelte-300',
false: ''
},
error: {
true: 'border-red-300 bg-red-50',
false: 'border-transparent'
}
}compoundVariants: [
{
active: true,
removable: false,
class: 'hover:bg-svelte-200'
}
]<div class={[componentVariants({ variant, size }), className]}>