Developer Integration & Patterns

Component Usage & Consumption

1. Single Import Surface

All components are exported directly from the top-level package. Never use deep subpath imports:

// ✅ Correct: single top-level import
import { Button, Dialog, Select, Card, Text } from "@shavin/ui";

// ❌ Incorrect: deep imports are forbidden
import { Button } from "@shavin/ui/primitives/Button";

2. Component Variants with CVA

Components accept strongly typed variant props backed by class-variance-authority:

import { Button } from "@shavin/ui";

export function Example() {
  return (
    <div className="flex gap-2">
      <Button variant="solid" size="md">Solid Accent</Button>
      <Button variant="outline" size="md">Outline</Button>
      <Button variant="ghost" size="sm">Ghost Link</Button>
    </div>
  );
}

3. Safe Style Merging with cn()

Every component accepts a className prop that merges with internal styles using clsx and tailwind-merge. Your passed classes cleanly override defaults without specificity issues:

import { Card, Text } from "@shavin/ui";

export function CustomCard() {
  return (
    // p-8 cleanly overrides internal default padding
    <Card className="p-8 border-accent/40 bg-surface-hover">
      <Text weight="semibold">Custom Padded Card</Text>
    </Card>
  );
}

4. Compound Component Patterns

Complex interactive primitives (Dialog, Select, Tabs, Accordion, SegmentedControl) expose compound sub-components:

import { Dialog, DialogTrigger, DialogContent, Button } from "@shavin/ui";

export function ModalDemo() {
  return (
    <Dialog>
      <DialogTrigger asChild>
        <Button variant="solid">Open Dialog</Button>
      </DialogTrigger>
      <DialogContent title="Account Settings">
        <p className="text-sm text-fg-muted">Modal body content goes here.</p>
      </DialogContent>
    </Dialog>
  );
}
Want to see all 56 primitives in action? Explore the complete Component Gallery.
Configure Theme
Theme
Accent Color
Custom
Gray Family
Appearance
Radius
Scaling
Panel Style
Heading Font
Body Font