Create UI components using tailwind-variants for type-safe styling. Use when creating or editing components in src/lib/ui/.
This skill documents the tailwind-variants pattern used for UI components in this project. All UI components should follow this pattern for consistency and type safety.
Use this skill when:
src/lib/ui/Every component needs two files:
componentName.variants.ts - Variant definitionsComponentName.svelte - The componentsrc/lib/ui/Button.svelte and src/lib/ui/button.variants.tssrc/lib/ui/Tag.svelte and src/lib/ui/tag.variants.tssrc/lib/ui/ContentCard.svelte and src/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>
For on/off states like active, disabled, error:
variants: {
active: {
true: 'bg-svelte-100 border-svelte-300',
false: ''
},
error: {
true: 'border-red-300 bg-red-50',
false: 'border-transparent'
}
}
Apply styles only when specific combinations match:
compoundVariants: [
{
active: true,
removable: false,
class: 'hover:bg-svelte-200'
}
]
Always use array syntax to allow consumer overrides:
<div class={[componentVariants({ variant, size }), className]}>
For copy-paste templates, see TEMPLATES.md.
npx skills add svelte-society/component-builder下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer