StyleLab Component Gallery

Browse every component by category below, or drill into a focused stage via the left navigation.

Button · Input · Card · Tabs · Alert · Grid Playground

1. Foundation

Button

import { Button } from "@raxrai/stylelab-ui";

<S.Button variant="primary">Primary</S.Button>
<S.Button variant="secondary">Secondary</S.Button>
<S.Button variant="ghost">Ghost</S.Button>
<S.Button loading>Loading</S.Button>

Input

import { Input } from "@raxrai/stylelab-ui";

<S.Input placeholder="Text input" />
<S.Input type="password" placeholder="Password" />

Toggle

import { Toggle } from "@raxrai/stylelab-ui";

<Toggle defaultChecked={false} aria-label="Toggle" />
<Toggle defaultChecked onCheckedChange={(checked) => console.log(checked)} />

Badge

DefaultNewBeta
import { Badge } from "@raxrai/stylelab-ui";

<S.Badge>Default</Badge>
<S.Badge>New</Badge>

Slider

import { Slider } from "@raxrai/stylelab-ui";

<Slider defaultValue={60} onValueChange={(v) => setValue(v)} />
<Slider min={0} max={100} step={10} value={value} />

Skeleton

import { Skeleton } from "@raxrai/stylelab-ui";

<Skeleton variant="rectangle" className="h-12 w-32" />
<Skeleton variant="circle" className="size-12" />
<Skeleton variant="text" />

Avatar & Group

+1
import { Avatar, AvatarGroup } from "@raxrai/stylelab-ui";

<S.Avatar fallback="JD" />
<S.AvatarGroup max={4}>
  <S.Avatar fallback="A" />
  <S.Avatar fallback="B" />
</AvatarGroup>

Tabs

Content for tab one.

import { Tabs } from "@raxrai/stylelab-ui";

<Tabs items={[{ label: "Tab 1", value: "1", content: <p>Content</p> }, ...]} />

Card

Card

Primary vessel for theme aesthetics.

import { Card } from "@raxrai/stylelab-ui";

<S.Card>
  <p className="font-medium">Title</p>
  <p className="mt-2 text-sm opacity-80">Card content here.</p>
</Card>

Accordion

Content for the first section.
Content for the second section.
import { Accordion } from "@raxrai/stylelab-ui";

<S.Accordion
  items={[
    { id: "1", title: "Section one", content: <p>Content here.</p> },
    { id: "2", title: "Section two", content: <p>More content.</p> },
  ]}
  allowMultiple={false}
/>

Alert

import { Alert } from "@raxrai/stylelab-ui";

<S.Alert intent="info" title="Info">Message.</Alert>
<S.Alert intent="danger">Error text.</Alert>

Breadcrumbs

import { Breadcrumbs } from "@raxrai/stylelab-ui";

<Breadcrumbs items={[
  { label: "Home", href: "/" },
  { label: "Current" },
]} />

Tooltip

Hover me
import { Tooltip } from "@raxrai/stylelab-ui";

<Tooltip content="Help text">
  <button>Hover me</button>
</Tooltip>

Dropdown

import { Dropdown, Button } from "@raxrai/stylelab-ui";

<S.Dropdown
  trigger={<S.Button>Open</S.Button>}
  items={[{ value: "1", label: "One" }, ...]}
  onValueChange={setValue}
/>

ProgressBar

import { ProgressBar } from "@raxrai/stylelab-ui";

<ProgressBar value={70} max={100} />
<ProgressBar value={40} segmented />

2. Layout

BentoGrid

Bento 1
Bento 2
Bento 3
import { BentoGrid, Card } from "@raxrai/stylelab-ui";

<S.BentoGrid>
  <S.Card>Bento 1</S.Card>
  <S.Card>Bento 2</S.Card>
  <S.Card>Bento 3</S.Card>
</BentoGrid>

Navbar

import { Navbar } from "@raxrai/stylelab-ui";

<S.Navbar>
  <span className="font-semibold">App name</span>
  <nav className="flex gap-4">...</nav>
</Navbar>

Sidebar

Main content area
import { Sidebar } from "@raxrai/stylelab-ui";

<S.Sidebar>
  <a href="/">Nav item</a>
  <a href="/settings">Settings</a>
</Sidebar>

SectionHeader

Section title

Optional subtitle text.

import { SectionHeader } from "@raxrai/stylelab-ui";

<SectionHeader title="Section title" subtitle="Optional subtitle." />

3. Study & Content Blocks

GraphicCard

Spaced repetition, made visual

Use this card for dashboards, hero callouts, or featured content.

import { GraphicCard } from "@raxrai/stylelab-ui";

<GraphicCard>
  <p className="text-sm font-semibold">Title</p>
  <p className="mt-1 text-xs text-zinc-600">
    Supporting copy here.
  </p>
</GraphicCard>

Flashcard

Question

What is the time complexity of binary search?

Tap to reveal answer
AnswerTap to flip back
O(log n), because the search space is halved on each step.
import { Flashcard } from "@raxrai/stylelab-ui";

<Flashcard
  question="What is the capital of France?"
  answer="Paris"
/>

DocumentAccordion

Place long-form text, markdown, or rich content here. When a pdfUrl is provided, the accordion renders an inline PDF viewer instead.
import { DocumentAccordion } from "@raxrai/stylelab-ui";

<DocumentAccordion
  title="Syllabus"
  content="Paste long-form text here."
/>

<DocumentAccordion
  title="Syllabus (PDF)"
  pdfUrl="https://example.com/syllabus.pdf"
/>

3. Feedback & Overlay

Modal

import { Modal, Button } from "@raxrai/stylelab-ui";

const [open, setOpen] = useState(false);
<S.Button onClick={() => setOpen(true)}>Open</S.Button>
<S.Modal open={open} onClose={() => setOpen(false)} title="Title">
  <p>Modal content.</p>
</Modal>

Toast

import { Toast } from "@raxrai/stylelab-ui";

<S.Toast message="Saved!" onDismiss={() => setVisible(false)} />

Command Palette

import { CommandPalette } from "@raxrai/stylelab-ui";

const [open, setOpen] = useState(false);
<S.CommandPalette
  open={open}
  onClose={() => setOpen(false)}
  commands={[
    { id: "1", label: "Go to Home", onSelect: () => {} },
    { id: "2", label: "Search", shortcut: "/", onSelect: () => {} },
  ]}
/>

4. Data & Blocks

DataTable

NameRoleStatus
AliceEngineerActive
BobDesignerAway
import { DataTable } from "@raxrai/stylelab-ui";

<S.DataTable
  columns={[
    { key: "name", header: "Name" },
    { key: "role", header: "Role", render: (row) => row.role },
  ]}
  data={[{ name: "Alice", role: "Engineer" }]}
/>

PricingCard

Starter

$9/mo

  • Feature A
  • Feature B
  • Feature C

Pro

$29/mo

Most popular

  • Everything in Starter
  • Feature D
  • Feature E

Enterprise

Custom

  • Everything
  • Support
  • SLA
import { PricingCard } from "@raxrai/stylelab-ui";

<PricingCard
  tier={{
    name: "Pro",
    price: "$29/mo",
    features: ["Feature A", "Feature B"],
    cta: "Get started",
    highlighted: true,
  }}
  onSelect={() => {}}
/>

Terminal

stylelab@dev

$ npm run dev

Ready on http://localhost:3000

import { Terminal } from "@raxrai/stylelab-ui";

<Terminal title="terminal">
  <p>$ npm run dev</p>
  <p>Ready on http://localhost:3000</p>
</Terminal>

StatsCard

Revenue

$12,345

+12%

Users

2,431

-3%

Active

98%

import { StatsCard } from "@raxrai/stylelab-ui";

<StatsCard label="Revenue" value="$12,345" trend={{ direction: "up", value: "+12%" }} />
<StatsCard label="Users" value="2,431" />

Calendar

March 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
import { Calendar } from "@raxrai/stylelab-ui";

<Calendar value={date} onSelect={setDate} />
<Calendar min={new Date()} max={...} />

Timeline

Started
10:00
Project kickoff
In progress
11:30
Done
Deployed to production
import { Timeline } from "@raxrai/stylelab-ui";

<Timeline items={[
  { title: "Event", time: "Now", description: "Details" },
]} />