This document provides usage examples for the components in the @workspace/ui package.
Basic button component with variants and sizes.
import { Button } from "@workspace/ui/components/button"
<Button>Default</Button>
<Button variant="destructive">Destructive</Button>
<Button variant="outline">Outline</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
<Button size="sm">Small</Button>
<Button size="lg">Large</Button>Organize content into tabbed panels.
import {
Tabs,
TabsList,
TabsTrigger,
TabsContent,
} from "@workspace/ui/components/tabs";
<Tabs defaultValue="account">
<TabsList>
<TabsTrigger value="account">Account</TabsTrigger>
<TabsTrigger value="password">Password</TabsTrigger>
</TabsList>
<TabsContent value="account">Account settings content</TabsContent>
<TabsContent value="password">Password settings content</TabsContent>
</Tabs>;Display data in a structured table format.
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@workspace/ui/components/table";
<Table>
<TableCaption>A list of your recent invoices.</TableCaption>
<TableHeader>
<TableRow>
<TableHead>Invoice</TableHead>
<TableHead>Status</TableHead>
<TableHead>Amount</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>INV001</TableCell>
<TableCell>Paid</TableCell>
<TableCell>$250.00</TableCell>
</TableRow>
</TableBody>
</Table>;Modal dialog component.
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@workspace/ui/components/dialog";
import { Button } from "@workspace/ui/components/button";
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Are you sure?</DialogTitle>
<DialogDescription>This action cannot be undone.</DialogDescription>
</DialogHeader>
</DialogContent>
</Dialog>;Slide-over panel component (drawer).
import {
Sheet,
SheetContent,
SheetDescription,
SheetHeader,
SheetTitle,
SheetTrigger,
} from "@workspace/ui/components/sheet";
import { Button } from "@workspace/ui/components/button";
<Sheet>
<SheetTrigger asChild>
<Button variant="outline">Open Sheet</Button>
</SheetTrigger>
<SheetContent>
<SheetHeader>
<SheetTitle>Sheet Title</SheetTitle>
<SheetDescription>Sheet description goes here.</SheetDescription>
</SheetHeader>
</SheetContent>
</Sheet>;Sheets can slide from different sides:
<SheetContent side="left">Left</SheetContent>
<SheetContent side="right">Right</SheetContent>
<SheetContent side="top">Top</SheetContent>
<SheetContent side="bottom">Bottom</SheetContent>Display content in a popover.
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@workspace/ui/components/popover";
import { Button } from "@workspace/ui/components/button";
<Popover>
<PopoverTrigger asChild>
<Button variant="outline">Open Popover</Button>
</PopoverTrigger>
<PopoverContent>
<p>Popover content goes here.</p>
</PopoverContent>
</Popover>;Form components with react-hook-form integration.
"use client";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import * as z from "zod";
import {
Form,
FormControl,
FormDescription,
FormField,
FormItem,
FormLabel,
FormMessage,
} from "@workspace/ui/components/form";
import { Input } from "@workspace/ui/components/input";
import { Button } from "@workspace/ui/components/button";
const formSchema = z.object({
username: z.string().min(2, {
message: "Username must be at least 2 characters.",
}),
});
function MyForm() {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: {
username: "",
},
});
function onSubmit(values: z.infer<typeof formSchema>) {
console.log(values);
}
return (
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<FormField
control={form.control}
name="username"
render={({ field }) => (
<FormItem>
<FormLabel>Username</FormLabel>
<FormControl>
<Input placeholder="Enter username" {...field} />
</FormControl>
<FormDescription>
This is your public display name.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<Button type="submit">Submit</Button>
</form>
</Form>
);
}Basic text input component.
import { Input } from "@workspace/ui/components/input"
<Input type="text" placeholder="Enter text" />
<Input type="email" placeholder="Email" />
<Input type="password" placeholder="Password" />Label component for form fields.
import { Label } from "@workspace/ui/components/label";
import { Input } from "@workspace/ui/components/input";
<div>
<Label htmlFor="email">Email</Label>
<Input id="email" type="email" placeholder="Email" />
</div>;Loading spinner component.
import { Spinner } from "@workspace/ui/components/spinner"
<Spinner />
<Spinner size="sm" />
<Spinner size="lg" />
<Spinner size="xl" />All components can be imported from the @workspace/ui package:
import { Button } from "@workspace/ui/components/button";
import {
Tabs,
TabsList,
TabsTrigger,
TabsContent,
} from "@workspace/ui/components/tabs";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@workspace/ui/components/table";
import { DataTable } from "@workspace/ui/components/data-table";
import { DatePicker } from "@workspace/ui/components/date-picker";
import { Calendar } from "@workspace/ui/components/calendar";
// ... and so onAll components are fully typed with TypeScript for better developer experience and type safety. Import types as needed:
import type { ColumnDef } from "@tanstack/react-table";
import type { DateRange } from "react-day-picker";
import type { DataTableProps } from "@workspace/ui/components/data-table";