Claude-skill-registry component-variants
Component variant system with Glass, Outline, and Flat styles. Use when creating multi-style components, variant props, or style switching.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/component-variants" ~/.claude/skills/majiayu000-claude-skill-registry-component-variants && rm -rf "$T"
manifest:
skills/data/component-variants/SKILL.mdsource content
Component Variants
Three-style system inspired by DesignCode UI: Glass, Outline, Flat.
Agent Workflow (MANDATORY)
Before implementation:
- fuse-ai-pilot:explore-codebase - Check existing variant patterns
- fuse-ai-pilot:research-expert - cva/class-variance-authority docs
After: Run fuse-ai-pilot:sniper for validation.
The Three Styles
| Style | Characteristics | Use Case |
|---|---|---|
| Glass | Blur + transparency + glow | Premium, modern, hero |
| Outline | Border only, no fill | Secondary actions |
| Flat | Solid color, no effects | Dense UI, fallback |
Implementation with CVA
import { cva, type VariantProps } from "class-variance-authority"; const cardVariants = cva( "rounded-2xl p-6 transition-all duration-200", // base { variants: { variant: { glass: [ "bg-white/80 backdrop-blur-xl", "border border-white/20", "shadow-xl shadow-black/5", ], outline: [ "bg-transparent", "border-2 border-primary/30", "hover:border-primary/50", ], flat: [ "bg-surface", "border border-border", ], }, size: { sm: "p-4 rounded-xl", default: "p-6 rounded-2xl", lg: "p-8 rounded-3xl", }, }, defaultVariants: { variant: "glass", size: "default", }, } ); interface CardProps extends VariantProps<typeof cardVariants> { children: React.ReactNode; } export function Card({ variant, size, children }: CardProps) { return ( <motion.div className={cardVariants({ variant, size })} whileHover={{ y: -4 }} > {children} </motion.div> ); }
Button Variants
const buttonVariants = cva( "inline-flex items-center justify-center font-medium transition-all", { variants: { variant: { glass: [ "bg-white/20 backdrop-blur-md", "border border-white/30", "text-foreground", "hover:bg-white/30", ], outline: [ "bg-transparent", "border-2 border-primary", "text-primary", "hover:bg-primary/10", ], flat: [ "bg-primary", "text-primary-foreground", "hover:bg-primary/90", ], }, }, } );
Automatic Style Detection
function usePreferredVariant() { // Detect background type for auto-variant const [variant, setVariant] = useState<"glass" | "outline" | "flat">("glass"); useEffect(() => { // Glass works best on gradient/image backgrounds // Flat works best on solid backgrounds const bgType = detectBackgroundType(); setVariant(bgType === "gradient" ? "glass" : "flat"); }, []); return variant; }
Dark Mode Variants
const glassVariant = { light: "bg-white/80 backdrop-blur-xl border-white/20", dark: "bg-black/40 backdrop-blur-xl border-white/10", }; // Usage with Tailwind className="bg-white/80 dark:bg-black/40 backdrop-blur-xl border-white/20 dark:border-white/10"
Style Switching UI
function StyleSwitcher({ value, onChange }) { return ( <div className="flex gap-1 p-1 bg-muted rounded-lg"> {["glass", "outline", "flat"].map((style) => ( <button key={style} onClick={() => onChange(style)} className={cn( "px-3 py-1 rounded-md text-sm capitalize", value === style && "bg-background shadow-sm" )} > {style} </button> ))} </div> ); }
Validation
[ ] All 3 variants defined (glass, outline, flat) [ ] CVA or similar variant system used [ ] Dark mode handled per variant [ ] Default variant specified [ ] Hover states per variant
References
- Component patterns../../references/design-patterns.md
- Glass details../../skills/glassmorphism-advanced/SKILL.md