((val) => val != null && typeof val === "object"))
.min(1, {
message: "Please choose your preferred interview date.",
}),
});
const Example = () => {
const form = useForm({
defaultValues: {
interviewDate: [] as DateValue[],
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "interview-date-submitted",
title: "Interview preference saved",
description: (
{JSON.stringify(
{ interviewDate: value.interviewDate[0] },
null,
2
)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/demo
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardFooter,
CardHeader,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
InputGroup,
InputGroupAddon,
InputGroupText,
InputGroupTextarea,
} from "@/components/ui/input-group";
const formSchema = z.object({
title: z
.string()
.min(5, "Bug title must be at least 5 characters.")
.max(32, "Bug title must be at most 32 characters."),
description: z
.string()
.min(20, "Description must be at least 20 characters.")
.max(100, "Description must be at most 100 characters."),
});
export const BugReportForm = () => {
const form = useForm({
defaultValues: {
title: "",
description: "",
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "bug-report-submitted",
title: "Bug submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default BugReportForm;
```
## Example: tanstack/file-upload
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import {
FileUpload,
FileUploadDropzone,
FileUploadDropzoneIcon,
FileUploadList,
} from "@/components/ui/file-upload";
const formSchema = z.object({
resume: z
.array(z.instanceof(File))
.min(1, "Please upload at least one PDF or Word document."),
});
const Example = () => {
const form = useForm({
defaultValues: { resume: [] as File[] },
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "resume-submitted",
title: "Resume uploaded",
description: (
Files: {value.resume.map((f) => f.name).join(", ")}
{JSON.stringify(
{
resume: value.resume.map((f) => ({
name: f.name,
size: f.size,
})),
},
null,
2
)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/input
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const formSchema = z.object({
username: z
.string()
.min(3, "Username must be at least 3 characters.")
.max(10, "Username must be at most 10 characters.")
.regex(
/^[a-zA-Z0-9_]+$/,
"Username can only contain letters, numbers, and underscores."
),
});
const Example = () => {
const form = useForm({
defaultValues: {
username: "",
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "username-submitted",
title: "Username submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/input-otp
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const formSchema = z.object({
backupCode: z
.array(z.string())
.length(6)
.refine((digits) => digits.every((d) => d.length === 1), {
message: "Enter all 6 digits of your backup code.",
}),
});
const Example = () => {
const form = useForm({
defaultValues: { backupCode: ["", "", "", "", "", ""] },
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "backup-code-submitted",
title: "Backup code verified",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/native-select
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldContent,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const spokenLanguages = [
{ label: "English", value: "en" },
{ label: "Spanish", value: "es" },
{ label: "French", value: "fr" },
{ label: "German", value: "de" },
{ label: "Italian", value: "it" },
{ label: "Chinese", value: "zh" },
{ label: "Japanese", value: "ja" },
] as const;
const formSchema = z.object({
language: z
.string()
.min(1, "Please select your spoken language.")
.refine((val) => val !== "auto", {
message:
"Auto-detection is not allowed. Please select a specific language.",
}),
});
const Example = () => {
const form = useForm({
defaultValues: {
language: "",
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "about-submitted",
title: "About submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/number-input
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupText,
} from "@/components/ui/input-group";
import {
NumberInput,
NumberInputInput,
} from "@/components/ui/number-input";
const formSchema = z.object({
expectedSalary: z
.number("Please provide a salary amount.")
.min(1000, "Salary must be at least €1,000.")
.max(1_000_000, "Salary must be less than €1,000,000.00."),
});
export const Example = () => {
const form = useForm({
defaultValues: {
expectedSalary: undefined as number | undefined,
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "salary-expectation-submitted",
title: "Salary expectation saved",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/radio-group
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldContent,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
FieldLegend,
FieldSet,
} from "@/components/ui/field";
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const plans = [
{
id: "starter",
title: "Starter (100K tokens/month)",
description: "For everyday use with basic features.",
},
{
id: "pro",
title: "Pro (1M tokens/month)",
description: "For advanced AI usage with more features.",
},
{
id: "enterprise",
title: "Enterprise (Unlimited tokens)",
description: "For large teams and heavy usage.",
},
];
const formSchema = z.object({
plan: z.string().min(1, "You must select a subscription plan to continue."),
});
export function Example() {
const form = useForm({
defaultValues: {
plan: "",
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "plan-submitted",
title: "Plan submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
}
export default Example;
```
## Example: tanstack/rating
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Rating } from "@/components/ui/rating";
const formSchema = z.object({
recommendScore: z
.number()
.min(1, "Please rate how likely you are to recommend us.")
.max(5),
});
const Example = () => {
const form = useForm({
defaultValues: { recommendScore: 0 },
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "rating-submitted",
title: "Feedback saved",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/select
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldContent,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const formSchema = z.object({
language: z
.array(z.string())
.refine((val) => val[0] !== "", "Please select your spoken language.")
.refine((val) => !val.includes("auto"), {
message:
"Auto-detection is not allowed. Please select a specific language.",
}),
});
const Example = () => {
const form = useForm({
defaultValues: {
language: [""],
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "language-submitted",
title: "Language submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
const collection = createListCollection({
items: [
{ label: "Auto", value: "auto" },
{ label: "English", value: "en" },
{ label: "Spanish", value: "es" },
{ label: "French", value: "fr" },
{ label: "German", value: "de" },
{ label: "Italian", value: "it" },
{ label: "Chinese", value: "zh" },
{ label: "Japanese", value: "ja" },
],
});
export default Example;
```
## Example: tanstack/slider
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Slider, SliderLabel } from "@/components/ui/slider";
const PRICE_MIN = 200;
const PRICE_MAX = 10_000;
const formSchema = z.object({
priceRange: z
.array(z.number())
.length(2)
.refine(([low, high]) => low < high, {
message: "The minimum price must be less than the maximum.",
})
.refine(([low, high]) => low >= PRICE_MIN && high <= PRICE_MAX, {
message: `Keep both values between $${PRICE_MIN.toLocaleString()} and $${PRICE_MAX.toLocaleString()}.`,
}),
});
const defaultRange = [0, PRICE_MAX];
const Example = () => {
const form = useForm({
defaultValues: { priceRange: defaultRange },
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "price-range-submitted",
title: "Price filter saved",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/switch
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldContent,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const formSchema = z.object({
twoFactor: z.boolean().refine((val) => val === true, {
message: "It is highly recommended to enable two-factor authentication.",
}),
});
export const Example = () => {
const form = useForm({
defaultValues: {
twoFactor: false,
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "about-submitted",
title: "About submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
## Example: tanstack/textarea
```tsx
"use client";
import { toast } from "@registry/react/components/toast";
import { useForm } from "@tanstack/react-form";
import * as z from "zod";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import {
Field,
FieldDescription,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const formSchema = z.object({
about: z
.string()
.min(10, "Please provide at least 10 characters.")
.max(200, "Please keep it under 200 characters."),
});
const Example = () => {
const form = useForm({
defaultValues: {
about: "",
},
validators: {
onSubmit: formSchema,
},
onSubmit: ({ value }) => {
toast.info({
id: "about-submitted",
title: "About submitted",
description: (
{JSON.stringify(value, null, 2)}
),
});
},
});
return (
);
};
export default Example;
```
# Format - Examples and Patterns
Examples for Format component.
## Example: byte-unit-display
```tsx
import { FormatByte } from "@/components/ui/format";
const Example = () => (
);
export default Example;
```
## Example: byte-unit-system
```tsx
import { FormatByte } from "@/components/ui/format";
const Example = () => (
Decimal (1000):
Binary (1024):
);
export default Example;
```
## Example: byte
```tsx
import { FormatByte } from "@/components/ui/format";
const Example = () => (
File size
);
export default Example;
```
## Example: default
```tsx
import { FormatByte } from "@/components/ui/format";
const FormatDemo = () => (
File size
);
export default FormatDemo;
```
## Example: number-compact
```tsx
import { FormatNumber } from "@/components/ui/format";
const Example = () => (
1.2M:
120K:
Downloads:
per month
);
export default Example;
```
## Example: number-currency
```tsx
import { FormatNumber } from "@/components/ui/format";
const Example = () => (
);
export default Example;
```
## Example: number-percent
```tsx
import { FormatNumber } from "@/components/ui/format";
const Example = () => (
);
export default Example;
```
## Example: number
```tsx
import { FormatNumber } from "@/components/ui/format";
const Example = () => (
Downloads
per month
);
export default Example;
```
## Example: relative-time-short
```tsx
import { FormatRelativeTime } from "@/components/ui/format";
const Example = () => (
);
export default Example;
```
## Example: relative-time
```tsx
import { FormatRelativeTime } from "@/components/ui/format";
const Example = () => (
Last updated
);
export default Example;
```
# Frame - Examples and Patterns
Examples for Frame component.
## Example: default
```tsx
import {
Frame,
FrameDescription,
FrameFooter,
FrameHeader,
FramePanel,
FrameTitle,
} from "@/components/ui/frame";
const Example = () => (
Section header
Brief description about the section
Section title
Section description
Footer
);
export default Example;
```
## Example: separated-panels
```tsx
import {
Frame,
FrameDescription,
FrameHeader,
FramePanel,
FrameTitle,
} from "@/components/ui/frame";
const Example = () => (
Section header
Brief description about the section
Separated panel
Section description
Separated panel
Section description
);
export default Example;
```
# Highlight - Examples and Patterns
Examples for Highlight component.
## Example: custom-style
```tsx
import { Highlight } from "@/components/ui/highlight";
const Example = () => (
);
export default Example;
```
## Example: default
```tsx
import { Highlight } from "@/components/ui/highlight";
const HighlightDemo = () => (
);
export default HighlightDemo;
```
## Example: multiple
```tsx
import { Highlight } from "@/components/ui/highlight";
const Example = () => (
);
export default Example;
```
## Example: search-query
```tsx
"use client";
import React from "react";
import { Highlight } from "@/components/ui/highlight";
import { Input } from "@/components/ui/input";
const searchResults = ["Spotlight bulb", "Spot cleaner", "Spot ceiling"];
const Example = () => {
const [query, setQuery] = React.useState("spot");
return (
);
};
export default Example;
```
## Example: squiggle
```tsx
"use client";
import React from "react";
import { useHighlight } from "@/components/ui/highlight";
const Example = () => {
const chunks = useHighlight({
query: "real humans",
text: "Endless scale, powered by real humans.",
});
return (
{chunks.map((chunk, index) =>
chunk.match ? (
{chunk.text}
) : (
{chunk.text}
)
)}
);
};
export default Example;
```
# Hint - Examples and Patterns
Examples for Hint component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Hint,
HintContent,
HintTrigger,
} from "@/components/ui/hint";
const Example = () => {
const [open, setOpen] = React.useState(false);
return (
Hover/Click to show hint
Controlled by React state below.
setOpen((previous) => !previous)}
variant="outline"
>
{open ? "Hide hint" : "Show hint"}
);
};
export default Example;
```
## Example: default
```tsx
import { Button } from "@/components/ui/button";
import {
Hint,
HintContent,
HintTrigger,
} from "@/components/ui/hint";
const HintDemo = () => (
Hover
This is a hint
);
export default HintDemo;
```
## Example: positions
```tsx
import { Button } from "@/components/ui/button";
import {
Hint,
HintContent,
HintTrigger,
} from "@/components/ui/hint";
const Example = () => (
Left
Hint on the left
Top
Hint above
Bottom
Hint below
Right
Hint on the right
);
export default Example;
```
# Hitbox - Examples and Patterns
Examples for Hitbox component.
## Example: axes
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(false);
return (
setShow(checked)}
/>
Show hitbox
Left and right
Top and bottom
);
};
export default Example;
```
## Example: basic
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(false);
return (
setShow(checked)}
/>
Show hitbox
Small target
);
};
export default Example;
```
## Example: custom
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(false);
return (
setShow(checked)}
/>
Show hitbox
Custom
Left only, custom
);
};
export default Example;
```
## Example: debug
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(true);
return (
setShow(checked)}
/>
Show hitbox
Show hit area
);
};
export default Example;
```
## Example: default
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(true);
return (
setShow(checked)}
/>
Show hitbox
hit-area-6
Hovered
Pressed
);
};
export default Example;
```
## Example: sidebar
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(false);
return (
);
};
export default Example;
```
## Example: sides
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [show, setShow] = React.useState(false);
return (
setShow(checked)}
/>
Show hitbox
Left
Top
Bottom
Right
);
};
export default Example;
```
# Hover Card - Examples and Patterns
Examples for Hover Card component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card";
const Example = () => {
const [open, setOpen] = React.useState(false);
return (
setOpen(isOpen)}
open={open}
>
Hover here
Controlled
The open state is managed externally with open and{" "}
onOpenChange.
{open ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import { MapPinIcon } from "lucide-react";
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card";
const HoverCardDemo = () => (
Hover here
VV
@vinihvc
Frontend Developer
Joined in 2016
);
export default HoverCardDemo;
```
## Example: disabled
```tsx
import { Button } from "@/components/ui/button";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card";
const Example = () => (
Hover here
IT WILL NOT OPEN
);
export default Example;
```
## Example: positioning
```tsx
import { Button } from "@/components/ui/button";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card";
const placements = ["left", "top", "bottom", "right"] as const;
const Example = () => (
{placements.map((placement) => (
{placement}
Hover Card
This hover card appears on the {placement} placement of the trigger.
))}
);
export default Example;
```
## Example: triggers-delays
```tsx
import { MapPinIcon } from "lucide-react";
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@/components/ui/hover-card";
const Example = () => (
Hover here
VV
@vinihvc
Frontend Developer
Joined in 2016
);
export default Example;
```
# Image Cropper - Examples and Patterns
Examples for Image Cropper component.
## Example: aspect-ratio
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
## Example: circle-crop
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
## Example: controlled-zoom
```tsx
"use client";
import { ZoomInIcon, ZoomOutIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => {
const [zoom, setZoom] = React.useState(1);
return (
setZoom(e.zoom)} zoom={zoom}>
setZoom(Math.max(0, zoom - 0.25))}
size="icon-sm"
variant="outline"
>
setZoom(Math.min(3, zoom + 0.25))}
size="icon-sm"
variant="outline"
>
);
};
export default Example;
```
## Example: default
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const ImageCropperDemo = () => (
);
export default ImageCropperDemo;
```
## Example: fixed-crop-area
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
## Example: initial-crop
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
## Example: min-max-size
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
## Example: zoom-limits
```tsx
import {
ImageCropper,
ImageCropperImage,
ImageCropperSelection,
} from "@/components/ui/image-cropper";
const Example = () => (
);
export default Example;
```
# Input - Examples and Patterns
Examples for Input component.
## Example: badge
```tsx
import { Badge } from "@/components/ui/badge";
import { Field, FieldLabel } from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Webhook URL
Beta
);
export default Example;
```
## Example: button-group
```tsx
import { SearchIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { ButtonGroup } from "@/components/ui/button-group";
import { Input } from "@/components/ui/input";
const Example = () => (
);
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import { Field, FieldDescription } from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => {
const [value, setValue] = React.useState("");
return (
setValue(target.value)}
placeholder="Enter your message"
value={value}
/>
Character count: {value.length}
);
};
export default Example;
```
## Example: default
```tsx
import { Input } from "@/components/ui/input";
const InputDemo = () => (
);
export default InputDemo;
```
## Example: disabled
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Email
The field is currently disabled
);
export default Example;
```
## Example: field-group
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldDescription,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Name
Email
We'll use this email to contact you
Submit
Reset
);
export default Example;
```
## Example: field
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Username
Choose a unique username for your account
);
export default Example;
```
## Example: file
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Picture
Choose a picture for your profile
);
export default Example;
```
## Example: grid
```tsx
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
First name
Last name
Address
);
export default Example;
```
## Example: inline
```tsx
import { SearchIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Field } from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
);
export default Example;
```
## Example: input-group
```tsx
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
);
export default Example;
```
## Example: invalid
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
const Example = () => (
Email
Please enter a valid email address
);
export default Example;
```
## Example: size-lg
```tsx
import { Input } from "@/components/ui/input";
const Example = () => (
);
export default Example;
```
## Example: size-md
```tsx
import { Input } from "@/components/ui/input";
const Example = () => (
);
export default Example;
```
## Example: size-sm
```tsx
import { Input } from "@/components/ui/input";
const Example = () => (
);
export default Example;
```
# Input Group - Examples and Patterns
Examples for Input Group component.
## Example: align-block-end
```tsx
"use client";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupText,
InputGroupTextarea,
} from "@/components/ui/input-group";
const Example = () => (
Textarea
0/280
Post
Footer positioned below the textarea.
);
export default Example;
```
## Example: align-block-start
```tsx
"use client";
import { CopyIcon, FileCodeIcon } from "lucide-react";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupText,
InputGroupTextarea,
} from "@/components/ui/input-group";
const Example = () => (
Textarea
script.js
Copy
Header positioned above the textarea.
);
export default Example;
```
## Example: align-inline-end
```tsx
"use client";
import { EyeIcon } from "lucide-react";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
Password
Icon positioned at the end.
);
export default Example;
```
## Example: align-inline-start
```tsx
"use client";
import { FilterIcon } from "lucide-react";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
Filter
Icon positioned at the start.
);
export default Example;
```
## Example: default
```tsx
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const InputGroupDemo = () => (
);
export default InputGroupDemo;
```
## Example: disabled
```tsx
"use client";
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
);
export default Example;
```
## Example: input-group
```tsx
import { CopyIcon, FileCodeIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupText,
InputGroupTextarea,
} from "@/components/ui/input-group";
const Example = () => (
script.js
);
export default Example;
```
## Example: invalid
```tsx
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
InputGroupText,
} from "@/components/ui/input-group";
const Example = () => (
https://
);
export default Example;
```
## Example: password-strength-checker
```tsx
"use client";
import { EyeIcon, EyeOffIcon } from "lucide-react";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupInput,
} from "@/components/ui/input-group";
const UPPERCASE_REGEX = /[A-Z]/;
const LOWERCASE_REGEX = /[a-z]/;
const NUMBER_REGEX = /\d/;
const NON_ALPHANUMERIC_REGEX = /[^a-zA-Z0-9]/;
type PasswordStrengthLevel = "weak" | "moderate" | "strong";
function getPasswordStrength(password: string): PasswordStrengthLevel {
if (!password) {
return "weak";
}
const hasUppercase = UPPERCASE_REGEX.test(password);
const hasLowercase = LOWERCASE_REGEX.test(password);
const hasNumber = NUMBER_REGEX.test(password);
const hasSpecialChar = NON_ALPHANUMERIC_REGEX.test(password);
const hasMinLength = password.length >= 8;
const criteriaMet = [
hasUppercase,
hasLowercase,
hasNumber,
hasSpecialChar,
hasMinLength,
].filter(Boolean).length;
if (criteriaMet <= 2) {
return "weak";
}
if (criteriaMet <= 4) {
return "moderate";
}
return "strong";
}
interface PasswordStrengthProps {
password: string;
}
const STRENGTH_STYLES = {
weak: "bg-red-500 text-white dark:bg-red-600 dark:text-white",
moderate: "bg-orange-500 text-white dark:bg-orange-600 dark:text-white",
strong: "bg-green-500 text-white dark:bg-green-600 dark:text-white",
} as const;
const STRENGTH_LABELS = {
weak: "Weak Password",
moderate: "Moderate Password",
strong: "Strong Password",
} as const;
function PasswordStrength({ password }: PasswordStrengthProps) {
const strength = getPasswordStrength(password);
return (
{STRENGTH_LABELS[strength]}
);
}
interface PasswordCheckerProps {
onPasswordChange: (value: string) => void;
password: string;
}
function PasswordChecker({ password, onPasswordChange }: PasswordCheckerProps) {
const [showPassword, setShowPassword] = React.useState(false);
const handleClear = () => {
onPasswordChange("");
};
const handleToggleVisibility = () => {
setShowPassword((prev) => !prev);
};
return (
Enter Your Password
onPasswordChange(e.target.value)}
placeholder="•••"
type={showPassword ? "text" : "password"}
value={password}
/>
{showPassword ? (
) : (
)}
{showPassword ? "Hide Password" : "Show Password"}
Clear Password
);
}
const Example = () => {
const [password, setPassword] = React.useState("");
return (
);
};
export default Example;
```
## Example: size-lg
```tsx
"use client";
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
);
export default Example;
```
## Example: size-md
```tsx
"use client";
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
);
export default Example;
```
## Example: size-sm
```tsx
"use client";
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
);
export default Example;
```
## Example: with-badge
```tsx
"use client";
import { AtSignIcon } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
Available
);
export default Example;
```
## Example: with-button
```tsx
"use client";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupInput,
} from "@/components/ui/input-group";
const Example = () => (
Subscribe
);
export default Example;
```
## Example: with-inner-label
```tsx
"use client";
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { FieldLabel } from "@/components/ui/field";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const Example = () => (
Username
Enter a username for your account
);
export default Example;
```
## Example: with-keyboard-shortcut
```tsx
"use client";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import { Kbd } from "@/components/ui/kbd";
const Example = () => (
⌘K
);
export default Example;
```
## Example: with-menu
```tsx
"use client";
import { CopyIcon, EllipsisIcon, FileIcon, FolderIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupButton,
InputGroupInput,
} from "@/components/ui/input-group";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Select file
Select folder
Copy path
);
export default Example;
```
## Example: with-number-input
```tsx
"use client";
import {
InputGroup,
InputGroupAddon,
InputGroupText,
} from "@/components/ui/input-group";
import {
NumberInput,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
€
EUR
);
export default Example;
```
## Example: with-spinner
```tsx
"use client";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import { Spinner } from "@/components/ui/spinner";
const Example = () => (
);
export default Example;
```
## Example: with-textarea
```tsx
"use client";
import { ArrowUpIcon, PlusIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
InputGroup,
InputGroupAddon,
InputGroupText,
InputGroupTextarea,
} from "@/components/ui/input-group";
const Example = () => (
33% used
);
export default Example;
```
## Example: with-tooltip
```tsx
"use client";
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const Example = () => (
Additional information about this field
);
export default Example;
```
# Input Otp - Examples and Patterns
Examples for Input Otp component.
## Example: blur-on-complete
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => {
const [value, setValue] = React.useState([""]);
const isCorrect = value.join("") === "1234";
return (
Enter the code 1234
setValue(value)} value={value}>
{isCorrect ? "✅" : "❌"}
);
};
export default Example;
```
## Example: custom-size
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: default
```tsx
import {
InputOTP,
InputOTPSeparator,
InputOTPSlot,
} from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: disabled
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: four-digits
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: invalid
```tsx
"use client";
import React from "react";
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => {
const [value, setValue] = React.useState([""]);
const isCorrect = value.join("") === "1234";
return (
setValue(value)}
value={value}
>
);
};
export default Example;
```
## Example: mask
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: separator
```tsx
import {
InputOTP,
InputOTPSeparator,
InputOTPSlot,
} from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
## Example: with-placeholder
```tsx
import { InputOTP, InputOTPSlot } from "@/components/ui/input-otp";
const Example = () => (
);
export default Example;
```
# Item - Examples and Patterns
Examples for Item component.
## Example: avatar
```tsx
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
PV
Pasquale Vitiello
Last seen 5 months ago
View
);
export default Example;
```
## Example: basic
```tsx
import { Button } from "@/components/ui/button";
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Basic Item
A simple item with title and description.
Action
);
export default Example;
```
## Example: custom-spacing
```tsx
import { User } from "lucide-react";
import {
Item,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Compact spacing
Uses `[--space:--spacing(2)]` for tighter padding and gap.
-
Responsive spacing
Wider from `md` up with `md:[--space:--spacing(5)]`.
);
export default Example;
```
## Example: default
```tsx
import { BadgeCheck, ChevronRight, Ellipsis } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const ItemDemo = () => (
-
Basic Item
A simple item with title and description.
-
Your profile has been verified.
);
export default ItemDemo;
```
## Example: dropdown
```tsx
"use client";
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
Item,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const people = [
{
username: "vinihvc",
avatar: "https://github.com/vinihvc.png",
email: "vinihvc@example.com",
},
{
username: "segunadebayo",
avatar: "https://github.com/segunadebayo.png",
email: "segunadebayo@example.com",
},
{
username: "pasqualevitiello",
avatar: "https://github.com/pasqualevitiello.png",
email: "pasqualevitiello@example.com",
},
];
const Example = () => (
Open
{people.map((person) => (
-
{person.username.charAt(0)}
{person.username}
{person.email}
))}
);
export default Example;
```
## Example: group
```tsx
import { PlusIcon } from "lucide-react";
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemGroup,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const people = [
{
username: "vinihvc",
avatar: "https://github.com/vinihvc.png",
email: "vinihvc@example.com",
},
{
username: "segunadebayo",
avatar: "https://github.com/segunadebayo.png",
email: "segunadebayo@example.com",
},
{
username: "pasqualevitiello",
avatar: "https://github.com/pasqualevitiello.png",
email: "pasqualevitiello@example.com",
},
];
const Example = () => (
{people.map((person) => (
-
{person.username.charAt(0)}
{person.username}
{person.email}
))}
);
export default Example;
```
## Example: header
```tsx
import {
Item,
ItemContent,
ItemDescription,
ItemGroup,
ItemHeader,
ItemTitle,
} from "@/components/ui/item";
const models = [
{
name: "v0-1.5-sm",
description: "Everyday tasks and UI generation.",
image: "https://picsum.photos/seed/1/500/300",
credit: "Valeria Reverdo on Unsplash",
},
{
name: "v0-1.5-lg",
description: "Advanced thinking or reasoning.",
image: "https://picsum.photos/seed/2/500/300",
credit: "Michael Oeser on Unsplash",
},
{
name: "v0-2.0-mini",
description: "Open Source model for everyone.",
image: "https://picsum.photos/seed/3/500/300",
credit: "Cherry Laithang on Unsplash",
},
];
const Example = () => (
{models.map((model) => (
-
{model.name}
{model.description}
))}
);
export default Example;
```
## Example: icon
```tsx
import { ShieldAlert } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Item,
ItemActions,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Security Alert
New login detected from unknown device.
Review
);
export default Example;
```
## Example: image
```tsx
import {
Item,
ItemContent,
ItemDescription,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
const images = [
{
src: "https://picsum.photos/seed/1/500/300",
alt: "Midnight City Lights",
description: "Electric Nights · Neon Dreams · 3:45",
},
{
src: "https://picsum.photos/seed/2/500/300",
alt: "Coffee Shop Conversations",
description: "Urban Stories · The Morning Brew · 4:05",
},
{
src: "https://picsum.photos/seed/3/500/300",
alt: "Digital Rain",
description: "Binary Beats · Cyber Symphony · 3:30",
},
];
const Example = () => (
{images.map((image) => (
-
{image.alt}
{image.description}
))}
);
export default Example;
```
## Example: link
```tsx
import { ExternalLinkIcon } from "lucide-react";
import {
Item,
ItemContent,
ItemDescription,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
);
export default Example;
```
## Example: variant-default
```tsx
import {
Item,
ItemContent,
ItemDescription,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Default Variant
Transparent background with no border.
);
export default Example;
```
## Example: variant-muted
```tsx
import {
Item,
ItemContent,
ItemDescription,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Muted Variant
Muted background for secondary content.
);
export default Example;
```
## Example: variant-outline
```tsx
import {
Item,
ItemContent,
ItemDescription,
ItemTitle,
} from "@/components/ui/item";
const Example = () => (
-
Outline Variant
Outlined style with a visible border.
);
export default Example;
```
# Json Tree View - Examples and Patterns
Examples for Json Tree View component.
## Example: data-types
```tsx
import { JsonTreeView } from "@/components/ui/json-tree-view";
const data = {
name: "John Doe",
email: "john.doe@example.com",
age: 30,
balance: 1234.56,
score: -42,
isActive: true,
isVerified: false,
avatar: null,
description: undefined,
createdAt: new Date("2024-01-15T14:22:00.000Z"),
lastLogin: new Date("2024-01-12T00:00:00.000Z"),
tags: ["user", "premium", "verified"],
scores: [95, 87, 92, 78, 100],
address: {
street: "123 Main St",
city: "Anytown",
state: "CA",
zip: 12_345,
coordinates: { lat: 37.7749, lng: -122.4194 },
},
};
const Example = () => ;
export default Example;
```
## Example: default
```tsx
import { JsonTreeView } from "@/components/ui/json-tree-view";
const data = {
name: "John Doe",
age: 30,
email: "john.doe@example.com",
address: {
street: "123 Main St",
city: "Anytown",
state: "CA",
zip: "12345",
},
};
const Example = () => (
);
export default Example;
```
## Example: expand-depth
```tsx
import { JsonTreeView } from "@/components/ui/json-tree-view";
const data = {
user: {
profile: {
name: "Jane",
settings: {
theme: "dark",
notifications: true,
},
},
},
};
const Example = () => (
defaultExpandedDepth={0} (all collapsed)
);
export default Example;
```
## Example: map-set
```tsx
import { JsonTreeView } from "@/components/ui/json-tree-view";
const preferences = new Map([
["theme", "dark"],
["language", "en"],
["notifications", "enabled"],
]);
const visitedPages = new Set(["/home", "/profile", "/settings"]);
const data = {
preferences,
visitedPages,
};
const Example = () => ;
export default Example;
```
# Kbd - Examples and Patterns
Examples for Kbd component.
## Example: button
```tsx
import { SaveIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Kbd, KbdGroup } from "@/components/ui/kbd";
const Example = () => (
Save
Ctrl+S
);
export default Example;
```
## Example: default
```tsx
import { Kbd, KbdGroup } from "@/components/ui/kbd";
const Example = () => (
);
export default Example;
```
## Example: input-group
```tsx
import { SearchIcon } from "lucide-react";
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import { Kbd, KbdGroup } from "@/components/ui/kbd";
const Example = () => (
⌘
K
);
export default Example;
```
## Example: kbd-group
```tsx
import { Kbd, KbdGroup } from "@/components/ui/kbd";
const Example = () => (
Use{" "}
Ctrl
+
K
{" "}
to open the command palette
);
export default Example;
```
## Example: tooltip
```tsx
import { Button } from "@/components/ui/button";
import { Kbd, KbdGroup } from "@/components/ui/kbd";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const Example = () => (
Dark mode
Toggle mode
D
);
export default Example;
```
## Example: variant-outline
```tsx
import { Kbd, KbdGroup } from "@/components/ui/kbd";
const Example = () => (
K
⌘
⌃
);
export default Example;
```
# Link Overlay - Examples and Patterns
Examples for Link Overlay component.
## Example: article
```tsx
"use client";
import Link from "next/link";
import { LinkBox, LinkOverlay } from "@/components/ui/link-overlay";
const Example = () => (
3 days ago
A11y Link Overlay
Learn how to construct a screen reader friendly link overlay for
accessibility and usability.
Read more
);
export default Example;
```
## Example: default
```tsx
import { Button } from "@/components/ui/button";
import {
Card,
CardFooter,
CardHeader,
CardMedia,
CardTitle,
} from "@/components/ui/card";
import { LinkBox, LinkOverlay } from "@/components/ui/link-overlay";
const LinkOverlayDemo = () => (
Living room Sofa
Buy now
Add to cart
);
export default LinkOverlayDemo;
```
## Example: with-link
```tsx
"use client";
import Link from "next/link";
import { LinkBox, LinkOverlay } from "@/components/ui/link-overlay";
const Example = () => (
Simple blog post title
This is a awesome blog post!
Inner link
);
export default Example;
```
# Listbox - Examples and Patterns
Examples for Listbox component.
## Example: controlled
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import React from "react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => {
const [value, setValue] = React.useState(["md"]);
const isLarge = value.includes("lg");
return (
Selected the Large size
-
setValue(e.value)}
value={value}
>
{collection.items.map((item) => (
{item.label}
))}
{isLarge ? "✅" : "❌"}
);
};
const collection = createListCollection({
items: [
{ label: "Small", value: "sm" },
{ label: "Medium", value: "md" },
{ label: "Large", value: "lg" },
{ label: "Extra Large", value: "xl" },
],
});
export default Example;
```
## Example: default
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
],
});
export default Example;
```
## Example: disabled-item
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Free", value: "free" },
{ label: "Pro", value: "pro" },
{
label: "Enterprise",
value: "enterprise",
disabled: true,
},
{ label: "Custom", value: "custom" },
],
});
export default Example;
```
## Example: disabled
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
],
});
export default Example;
```
## Example: grid
```tsx
"use client";
import { createGridCollection } from "@ark-ui/react/collection";
import type React from "react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createGridCollection({
columnCount: 5,
items: [
{ label: "😀", value: "grinning" },
{ label: "😍", value: "heart-eyes" },
{ label: "🥳", value: "partying" },
{ label: "😎", value: "sunglasses" },
{ label: "🤩", value: "star-struck" },
{ label: "😂", value: "joy" },
{ label: "🥰", value: "smiling-hearts" },
{ label: "😊", value: "blush" },
{ label: "🤗", value: "hugging" },
{ label: "😇", value: "innocent" },
{ label: "🔥", value: "fire" },
{ label: "✨", value: "sparkles" },
{ label: "💯", value: "hundred" },
{ label: "🎉", value: "tada" },
{ label: "❤️", value: "heart" },
{ label: "👍", value: "thumbs-up" },
{ label: "👏", value: "clap" },
{ label: "🚀", value: "rocket" },
{ label: "⭐", value: "star" },
{ label: "🌈", value: "rainbow" },
],
});
export default Example;
```
## Example: grouping
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemGroup,
ListboxItemGroupLabel,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.group().map(([region, items]) => (
{region}
{items.map((item) => (
{item.label}
))}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "br", region: "South America" },
{ label: "Colombia", value: "co", region: "South America" },
{ label: "Mexico", value: "mx", region: "North America" },
{ label: "Canada", value: "ca", region: "North America" },
],
groupBy: (item) => (item as { region: string }).region,
});
export default Example;
```
## Example: horizontal
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Field, FieldLabel } from "@/components/ui/field";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
Favorite album
{collection.items.map((item) => (
{item.title}
{item.artist}
))}
);
const collection = createListCollection({
items: [
{ title: "Rappa Mundi", artist: "O Rappa" },
{ title: "Acústico MTV", artist: "Charlie Brown Jr." },
{ title: "Thriller", artist: "Michael Jackson" },
{ title: "The Eminem Show", artist: "Eminem" },
],
itemToValue: (item) => item.title,
itemToString: (item) => item.title,
});
export default Example;
```
## Example: image-explorer
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import React from "react";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => {
const [value, setValue] = React.useState(["mountain"]);
const selectedImage = collection.items.find(
(item) => item.value === value.at(0)
);
return (
setValue(e.value)}
value={value}
>
{collection.items.map((item) => (
{item.label}
))}
{selectedImage?.label}
{selectedImage?.alt}
);
};
const collection = createListCollection({
items: [
{
label: "Mountain Landscape",
value: "mountain",
alt: "Scenic mountain view",
},
{
label: "Ocean Waves",
value: "ocean",
alt: "Ocean waves",
},
{
label: "Forest Path",
value: "forest",
alt: "Forest path",
},
{
label: "City Skyline",
value: "city",
alt: "City skyline",
},
{
label: "Desert Dunes",
value: "desert",
alt: "Desert dunes",
},
],
});
export default Example;
```
## Example: selection-extended
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import { Kbd } from "@/components/ui/kbd";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
Hold ⌘ or Ctrl to select multiple
-
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
],
});
export default Example;
```
## Example: selection-multiple
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
],
});
export default Example;
```
## Example: selection-none
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { PencilIcon, SquarePlusIcon, Trash2Icon } from "lucide-react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemGroup,
ListboxItemText,
ListboxShortcut,
} from "@/components/ui/listbox";
import { Separator } from "@/components/ui/separator";
const Example = () => (
-
New file
Create a new file
⌘N
Edit file
Make changes
⌘E
Delete file
Move to trash
⌘D
);
const collection = createListCollection({
items: [
{ label: "New file", value: "new-file", section: "actions" },
{ label: "Edit file", value: "edit-file", section: "actions" },
{
label: "Delete file",
value: "delete-file",
section: "danger",
},
],
});
export default Example;
```
## Example: transfer-list
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemGroup,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => {
const [available, setAvailable] = React.useState(["Brazil", "Ireland"]);
const [selected, setSelected] = React.useState(["Mexico"]);
const [availableValue, setAvailableValue] = React.useState([]);
const [selectedValue, setSelectedValue] = React.useState([]);
const availableCollection = createListCollection({
items: available.map((label) => ({ label, value: label })),
});
const selectedCollection = createListCollection({
items: selected.map((label) => ({ label, value: label })),
});
const moveToSelected = React.useCallback(() => {
setAvailable((prev) =>
prev.filter((item) => !availableValue.includes(item))
);
setSelected((prev) => [...prev, ...availableValue]);
setAvailableValue([]);
}, [availableValue]);
const moveToAvailable = React.useCallback(() => {
setSelected((prev) => prev.filter((item) => !selectedValue.includes(item)));
setAvailable((prev) => [...prev, ...selectedValue]);
setSelectedValue([]);
}, [selectedValue]);
return (
-
setAvailableValue(e.value)}
selectionMode="multiple"
value={availableValue}
>
{availableCollection.items.map((item) => (
{item.label}
))}
-
setSelectedValue(e.value)}
selectionMode="multiple"
value={selectedValue}
>
{selectedCollection.items.map((item) => (
{item.label}
))}
);
};
export default Example;
```
## Example: with-description
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.label}
{item.description}
))}
);
const collection = createListCollection({
items: [
{
label: "Brazil",
value: "br",
description: "South America's country, Portuguese speaking.",
},
{
label: "Mexico",
value: "mx",
description: "North America's country, Spanish speaking.",
},
{
label: "Ireland",
value: "ie",
description: "Europe's country, Irish/English speaking.",
},
],
});
export default Example;
```
## Example: with-filter
```tsx
"use client";
import { useListCollection } from "@ark-ui/react/collection";
import { useFilter } from "@ark-ui/react/locale";
import React from "react";
import { Input } from "@/components/ui/input";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxEmpty,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => {
const [search, setSearch] = React.useState("");
const { contains } = useFilter({ sensitivity: "base" });
const { collection, filter } = useListCollection({
initialItems: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
],
filter: contains,
});
const isEmpty = collection.items.length === 0 && search;
return (
-
{
const value = e.target.value;
setSearch(value);
filter(value);
}}
placeholder="Search..."
value={search}
/>
{collection.items.map((item) => (
{item.label}
))}
{isEmpty && No results found. }
);
};
export default Example;
```
## Example: with-icon
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import { Item } from "@/components/ui/item";
import {
Listbox,
ListboxContent,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
} from "@/components/ui/listbox";
const Example = () => (
-
{collection.items.map((item) => (
{item.icon}
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Brazil", value: "brazil", icon: "🇧🇷" },
{ label: "Mexico", value: "mexico", icon: "🇲🇽" },
{ label: "Ireland", value: "ireland", icon: "🇮🇪" },
],
});
export default Example;
```
## Example: with-popover
```tsx
"use client";
import { useListCollection } from "@ark-ui/react/collection";
import { useFilter } from "@ark-ui/react/locale";
import { ChevronsUpDown } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
Listbox,
ListboxContent,
ListboxEmpty,
ListboxItem,
ListboxItemIndicator,
ListboxItemText,
ListboxValueText,
} from "@/components/ui/listbox";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => {
const [search, setSearch] = React.useState("");
const [isOpen, setIsOpen] = React.useState(false);
const { contains } = useFilter({ sensitivity: "base" });
const { collection, filter } = useListCollection({
initialItems: [
{ label: "Brazil", value: "br" },
{ label: "Mexico", value: "mx" },
{ label: "Ireland", value: "ie" },
{ label: "Canada", value: "ca" },
],
filter: contains,
});
const isEmpty = collection.items.length === 0 && search;
return (
{
setIsOpen(false);
}}
>
setIsOpen(open)} open={isOpen}>
{
const value = e.target.value;
setSearch(value);
filter(value);
}}
placeholder="Search..."
value={search}
/>
{collection.items.map((item) => (
{item.label}
))}
{isEmpty && No results found. }
);
};
export default Example;
```
# Marquee - Examples and Patterns
Examples for Marquee component.
## Example: autofill
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: custom-speed
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: default
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const MarqueeDemo = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default MarqueeDemo;
```
## Example: fade
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: orientation-horizontal
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: orientation-vertical
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: pause-on-hover
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: reverse
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
## Example: spacing
```tsx
import { AppleIcon } from "@/components/icons/apple";
import { ChatGptIcon } from "@/components/icons/chat-gpt";
import { ClaudeIcon } from "@/components/icons/claude";
import { GoogleIcon } from "@/components/icons/google";
import { NextIcon } from "@/components/icons/next";
import { ReactIcon } from "@/components/icons/react";
import { ViteIcon } from "@/components/icons/vite";
import { VueIcon } from "@/components/icons/vue";
import { Card, CardContent } from "@/components/ui/card";
import {
Marquee,
MarqueeContent,
MarqueeItem,
} from "@/components/ui/marquee";
const Example = () => (
{items.map((Icon, index) => (
))}
);
const items = [
GoogleIcon,
AppleIcon,
NextIcon,
ChatGptIcon,
ClaudeIcon,
ViteIcon,
VueIcon,
ReactIcon,
];
export default Example;
```
# Menu - Examples and Patterns
Examples for Menu component.
## Example: checkboxes
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuCheckboxItem,
MenuContent,
MenuGroup,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Status bar
Activity bar
Panel
);
export default Example;
```
## Example: default
```tsx
import {
Archive,
ArchiveX,
Bell,
CirclePlus,
FolderInput,
MailX,
Reply,
Send,
SquarePen,
Trash,
Trash2,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuCheckboxItem,
MenuContent,
MenuGroup,
MenuItem,
MenuRadioGroup,
MenuRadioItem,
MenuSeparator,
MenuShortcut,
MenuSub,
MenuSubContent,
MenuSubTrigger,
MenuTrigger,
} from "@/components/ui/menu";
const MenuDemo = () => (
Open
Forward
⌘F
Reply
⌘R
Archive
⌘Z
Move to
Junk
Trash
Reminders
More
Drafts
Spam
Low
Medium
High
Block sender
Delete
⌘ ⌫
);
export default MenuDemo;
```
## Example: destructive
```tsx
import { CopyIcon, PencilIcon, Trash2Icon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuSeparator,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Edit
Duplicate
Delete
);
export default Example;
```
## Example: dialog
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogClose,
DialogContent,
DialogFooter,
DialogHeader,
} from "@/components/ui/dialog";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => {
const [dialogOpen, setDialogOpen] = React.useState(false);
return (
<>
Open
setDialogOpen(true)} value="dialog">
Open dialog
setDialogOpen(e.open)} open={dialogOpen}>
Close
>
);
};
export default Example;
```
## Example: group-label
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuGroup,
MenuGroupLabel,
MenuItem,
MenuSeparator,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Profile
Billing
Support
Docs
Contact
);
export default Example;
```
## Example: icons
```tsx
import { CopyIcon, PencilIcon, ShareIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Edit
Copy
Share
);
export default Example;
```
## Example: link
```tsx
import { ExternalLink } from "lucide-react";
import Link from "next/link";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuShortcut,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
External link
View docs
);
export default Example;
```
## Example: nested
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuSub,
MenuSubContent,
MenuSubTrigger,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Item one
More
Sub item A
Sub item B
Item two
);
export default Example;
```
## Example: positioning
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const placements = ["left", "top", "bottom", "right"] as const;
const Example = () => (
{placements.map((placement) => (
{placement}
Edit
Copy
Share
))}
);
export default Example;
```
## Example: quick-item
```tsx
import {
CopyIcon,
HandIcon,
MessageCircle,
PencilIcon,
RotateCwIcon,
ShareIcon,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuGroup,
MenuItem,
MenuQuickItem,
MenuSeparator,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Edit
Add Action
Key Point
Comment
Copy
Share
);
export default Example;
```
## Example: radio-group
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuRadioGroup,
MenuRadioItem,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Light
Dark
System
);
export default Example;
```
## Example: shortcuts
```tsx
import { CopyIcon, LogOutIcon, SettingsIcon, UserIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuSeparator,
MenuShortcut,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
Profile
⌘P
Settings
⌘S
Copy
⌘C
Log out
⌘Q
);
export default Example;
```
## Example: with-scroll
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
{items.map((label, index) => (
{label}
))}
);
const items = Array.from({ length: 15 }, (_, i) => `Item ${i + 1}`);
export default Example;
```
## Example: with-separator
```tsx
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuSeparator,
MenuTrigger,
} from "@/components/ui/menu";
const Example = () => (
Open
New file
Open file
Save
Copy
Paste
Preferences
);
export default Example;
```
# Native Select - Examples and Patterns
Examples for Native Select component.
## Example: controlled
```tsx
"use client";
import React from "react";
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => {
const [value, setValue] = React.useState("");
return (
setValue(e.target.value)}
value={value}
>
Select an option
Banana
Apple
Orange
Selected: {value || "—"}
);
};
export default Example;
```
## Example: default
```tsx
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const NativeSelectDemo = () => (
Select an option
Banana
Apple
Orange
Pineapple
);
export default NativeSelectDemo;
```
## Example: disabled
```tsx
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select an option
Banana
Apple
Orange
);
export default Example;
```
## Example: groups
```tsx
import {
NativeSelect,
NativeSelectOptGroup,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select an option
Banana
Mango
Pineapple
Carrot
Potato
Tomato
);
export default Example;
```
## Example: invalid
```tsx
import { Field, FieldLabel } from "@/components/ui/field";
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select a fruit
Banana
Apple
Orange
);
export default Example;
```
## Example: size-lg
```tsx
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select an option
Banana
Apple
Orange
);
export default Example;
```
## Example: size-md
```tsx
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select an option
Banana
Apple
Orange
);
export default Example;
```
## Example: size-sm
```tsx
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Select an option
Banana
Apple
Orange
);
export default Example;
```
## Example: with-field
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
const Example = () => (
Country
Select a country
Brazil
Mexico
Ireland
Used for shipping estimates
);
export default Example;
```
# Number Input - Examples and Patterns
Examples for Number Input component.
## Example: controlled
```tsx
"use client";
import React from "react";
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => {
const [value, setValue] = React.useState("1");
const isNumberFive = value === "3";
return (
Select the number 3
setValue(value)} value={value}>
{isNumberFive ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const NumberInputDemo = () => (
);
export default NumberInputDemo;
```
## Example: disabled
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: field-only
```tsx
import {
NumberInput,
NumberInputGroup,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: formatted
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: invalid
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: mouse-wheel
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: range
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: scrub
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
NumberInputScrubber,
} from "@/components/ui/number-input";
const Example = () => (
Quantity
);
export default Example;
```
## Example: size-lg
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: size-md
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: size-sm
```tsx
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
);
export default Example;
```
## Example: step
```tsx
import { FieldLabel } from "@/components/ui/field";
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
Step 5
Step 0.1
);
export default Example;
```
## Example: with-field
```tsx
"use client";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
Quantity
0 - 100 only
);
export default Example;
```
## Example: with-input-group
```tsx
"use client";
import {
InputGroup,
InputGroupAddon,
InputGroupText,
} from "@/components/ui/input-group";
import {
NumberInput,
NumberInputInput,
} from "@/components/ui/number-input";
const Example = () => (
€
EUR
);
export default Example;
```
# Pagination - Examples and Patterns
Examples for Pagination component.
## Example: controlled
```tsx
"use client";
import React from "react";
import {
Pagination,
PaginationItems,
PaginationNext,
PaginationPrevious,
} from "@/components/ui/pagination";
const Example = () => {
const [page, setPage] = React.useState(1);
return (
setPage(details.page)}
page={page}
pageSize={10}
>
Page {page} of 5
);
};
export default Example;
```
## Example: default
```tsx
"use client";
import {
Pagination,
PaginationItems,
PaginationNext,
PaginationPrevious,
} from "@/components/ui/pagination";
const PaginationDemo = () => (
);
export default PaginationDemo;
```
## Example: links
```tsx
"use client";
import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
import {
Pagination,
PaginationItemLink,
PaginationItems,
} from "@/components/ui/pagination";
const Example = () => (
Previous
Next
);
export default Example;
```
## Example: page-range
```tsx
"use client";
import {
Pagination,
PaginationItems,
PaginationNext,
PaginationPrevious,
} from "@/components/ui/pagination";
const Example = () => (
);
export default Example;
```
## Example: table
```tsx
"use client";
import React from "react";
import {
NativeSelect,
NativeSelectOption,
} from "@/components/ui/native-select";
import {
Pagination,
PaginationNext,
PaginationPrevious,
} from "@/components/ui/pagination";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const users = Array.from({ length: 48 }, (_, i) => ({
id: `user-${i + 1}`,
name: `User ${i + 1}`,
email: `user${i + 1}@example.com`,
}));
const Example = () => {
const [page, setPage] = React.useState(1);
const [pageSize, setPageSize] = React.useState(2);
const paginatedUsers = users.slice((page - 1) * pageSize, page * pageSize);
return (
Name
Email
{paginatedUsers.map((user) => (
{user.name}
{user.email}
))}
Items per page:
setPageSize(Number(e.target.value))}
value={pageSize}
>
2
3
4
setPage(page)}
onPageSizeChange={({ pageSize }) => setPageSize(pageSize)}
page={page}
pageSize={pageSize}
>
);
};
export default Example;
```
# Password Input - Examples and Patterns
Examples for Password Input component.
## Example: auto-hide
```tsx
"use client";
import React from "react";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const HIDE_DELAY_MS = 3000;
const Example = () => {
const [visible, setVisible] = React.useState(false);
const handleVisibilityChange = (visible: boolean) => {
setVisible(visible);
if (visible) {
setTimeout(() => {
setVisible(false);
}, HIDE_DELAY_MS);
}
};
return (
handleVisibilityChange(visible)}
visible={visible}
>
);
};
export default Example;
```
## Example: autocomplete
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
Current password
For signing in to an existing account.
New password
For creating or resetting a password.
);
export default Example;
```
## Example: controlled-visibility
```tsx
"use client";
import React from "react";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => {
const [visible, setVisible] = React.useState(false);
return (
setVisible(details.visible)}
visible={visible}
>
);
};
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import { Field, FieldDescription } from "@/components/ui/field";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => {
const [password, setPassword] = React.useState("");
return (
setPassword(event.target.value)}
placeholder="Enter password"
value={password}
/>
Character count: {password.length}
);
};
export default Example;
```
## Example: custom-indicator
```tsx
import { LockIcon, UnlockIcon } from "lucide-react";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputIndicator,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const PasswordInputDemo = () => (
}>
);
export default PasswordInputDemo;
```
## Example: default
```tsx
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const PasswordInputDemo = () => (
);
export default PasswordInputDemo;
```
## Example: disabled
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
Password
The field is currently disabled.
);
export default Example;
```
## Example: field
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
Password
Must be at least 8 characters.
);
export default Example;
```
## Example: invalid
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
Password
Please enter a valid password.
);
export default Example;
```
## Example: size-lg
```tsx
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
);
export default Example;
```
## Example: size-md
```tsx
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
);
export default Example;
```
## Example: size-sm
```tsx
import {
PasswordInput,
PasswordInputGroup,
PasswordInputInput,
PasswordInputTrigger,
} from "@/components/ui/password-input";
const Example = () => (
);
export default Example;
```
# Popover - Examples and Patterns
Examples for Popover component.
## Example: anchor
```tsx
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
Popover,
PopoverAnchor,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
);
export default Example;
```
## Example: close-behavior
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open outside click
Open escape
);
export default Example;
```
## Example: close-button
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open
);
export default Example;
```
## Example: custom-spacing
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Popover,
PopoverBody,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open
Width
Max. width
);
export default Example;
```
## Example: default
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Popover,
PopoverBody,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const PopoverDemo = () => (
Open
Width
Max. width
Height
Max. height
);
export default PopoverDemo;
```
## Example: nested
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverBody,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open
Open nested
);
export default Example;
```
## Example: non-modal
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open
);
export default Example;
```
## Example: positioning
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const placements = ["left", "top", "bottom", "right"] as const;
const Example = () => (
{placements.map((placement) => (
{placement}
))}
);
export default Example;
```
## Example: scroll-area
```tsx
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverBody,
PopoverClose,
PopoverContent,
PopoverFooter,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const items = Array.from({ length: 12 }, (_, i) => ({
id: i + 1,
label: `Item ${i + 1}`,
}));
const Example = () => (
Open
{items.map((item) => (
{item.label}
))}
Close
);
export default Example;
```
## Example: with-dialog
```tsx
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogBody,
DialogClose,
DialogContent,
DialogFooter,
DialogHeader,
DialogTrigger,
} from "@/components/ui/dialog";
import {
Popover,
PopoverContent,
PopoverHeader,
PopoverTrigger,
} from "@/components/ui/popover";
const Example = () => (
Open
Open
Close
);
export default Example;
```
# Presence - Examples and Patterns
Examples for Presence component.
## Example: default
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Presence } from "@/components/ui/presence";
const PresenceDemo = () => {
const [present, setPresent] = React.useState(false);
return (
setPresent(!present)}
variant="outline"
>
Toggle
Content
);
};
export default PresenceDemo;
```
# Progress - Examples and Patterns
Examples for Progress component.
## Example: controlled
```tsx
"use client";
import { MinusIcon, PlusIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { ButtonGroup } from "@/components/ui/button-group";
import { Field, FieldLabel } from "@/components/ui/field";
import { Progress } from "@/components/ui/progress";
const Example = () => {
const [value, setValue] = React.useState(50);
return (
Controlled progress
setValue(Math.max(0, value - 10))}
size="icon-sm"
variant="outline"
>
setValue(Math.min(100, value + 10))}
size="icon-sm"
variant="outline"
>
);
};
export default Example;
```
## Example: default
```tsx
"use client";
import React from "react";
import { Progress } from "@/components/ui/progress";
const ProgressDemo = () => {
const [progress, setProgress] = React.useState(13);
React.useEffect(() => {
const timer = setTimeout(() => setProgress(66), 500);
return () => clearTimeout(timer);
}, []);
return ;
};
export default ProgressDemo;
```
## Example: indeterminate
```tsx
import { Field, FieldLabel } from "@/components/ui/field";
import { Progress } from "@/components/ui/progress";
const Example = () => (
Establishing connection...
);
export default Example;
```
## Example: orientation-horizontal
```tsx
import { Progress } from "@/components/ui/progress";
const Example = () => (
);
export default Example;
```
## Example: orientation-vertical
```tsx
import { Progress } from "@/components/ui/progress";
const Example = () => (
);
export default Example;
```
## Example: with-label
```tsx
import { Field, FieldLabel } from "@/components/ui/field";
import { Progress, ProgressValue } from "@/components/ui/progress";
const Example = () => (
Upload progress
);
export default Example;
```
# Prose - Examples and Patterns
Examples for Prose component.
## Example: a
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Read more about the joke tax in the
kingdom archives.
);
export default Example;
```
## Example: blockquote
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
"After all," he said, "everyone enjoys a good joke, so it's only fair that
they should pay for the privilege."
);
export default Example;
```
## Example: default
```tsx
import { Prose } from "@/components/ui/prose";
import { ScrollArea } from "@/components/ui/scroll-area";
const TypographyDemo = () => (
Taxing Laughter: The Joke Tax Chronicles
Once upon a time, in a far-off land, there was a very lazy king who
spent all day lounging on his throne. One day, his advisors came to
him with a problem: the kingdom was running out of money.
The King's Plan
The king thought long and hard, and finally came up with{" "}
a brilliant plan : he would tax the jokes in the
kingdom.
"After all," he said, "everyone enjoys a good joke, so
it's only fair that they should pay for the privilege."
The Joke Tax
The king's subjects were not amused. They grumbled and
complained, but the king was firm:
1st level of puns: 5 gold coins
2nd level of jokes: 10 gold coins
3rd level of one-liners : 20 gold coins
As a result, people stopped telling jokes, and the kingdom fell into a
gloom. But there was one person who refused to let the king's
foolishness get him down: a court jester named Jokester.
Jokester's Revolt
Jokester began sneaking into the castle in the middle of the night and
leaving jokes all over the place: under the king's pillow, in his
soup, even in the royal toilet. The king was furious, but he
couldn't seem to stop Jokester.
And then, one day, the people of the kingdom discovered that the jokes
left by Jokester were so funny that they couldn't help but laugh.
And once they started laughing, they couldn't stop.
The People's Rebellion
The people of the kingdom, feeling uplifted by the laughter, started
to tell jokes and puns again, and soon the entire kingdom was in on
the joke.
King's Treasury
People's happiness
Empty
Overflowing
Modest
Satisfied
Full
Ecstatic
The king, seeing how much happier his subjects were, realized the
error of his ways and repealed the joke tax. Jokester was declared a
hero, and the kingdom lived happily ever after.
The moral of the story is: never underestimate the power of a good
laugh and always be careful of bad ideas.
);
export default TypographyDemo;
```
## Example: details
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
How did the joke tax end?
The king repealed the tax after seeing how much happier his subjects
were. Jokester was declared a hero.
);
export default Example;
```
## Example: dl
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Joke Tax
A levy on humor imposed by the king.
Jokester
The court jester who led the revolt.
);
export default Example;
```
## Example: h1
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Taxing Laughter: The Joke Tax Chronicles
);
export default Example;
```
## Example: h2
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
The People of the Kingdom
);
export default Example;
```
## Example: h3
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
The Joke Tax
);
export default Example;
```
## Example: h4
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
People stopped telling jokes
);
export default Example;
```
## Example: h5
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
People stopped telling jokes
);
export default Example;
```
## Example: h6
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
People stopped telling jokes
);
export default Example;
```
## Example: inline-code
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
@ark-ui/react
);
export default Example;
```
## Example: kbd
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Press Ctrl + S to save your work.
);
export default Example;
```
## Example: list
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
1st level of puns: 5 gold coins
2nd level of jokes: 10 gold coins
3rd level of one-liners : 20 gold coins
);
export default Example;
```
## Example: mark
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
The king's brilliant plan was to tax jokes in the
kingdom.
);
export default Example;
```
## Example: media
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
A description of the image.
);
export default Example;
```
## Example: not-prose
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Davy Jones' locker
Davy Jones' locker is a metaphor for the oceanic abyss, the final
resting place of drowned sailors and travellers
Davy Jones' locker
Davy Jones' locker is a metaphor for the oceanic abyss, the final
resting place of drowned sailors and travellers
);
export default Example;
```
## Example: ol
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
First, gather the ingredients.
Then, mix them together.
Finally, bake for 30 minutes.
);
export default Example;
```
## Example: p
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
The king, seeing how much happier his subjects were, realized the error of
his ways and repealed the joke tax.
);
export default Example;
```
## Example: separator
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
First section of content.
Second section after the divider.
);
export default Example;
```
## Example: small
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
Never underestimate the power of a good laugh and always be careful of bad
ideas.
);
export default Example;
```
## Example: table
```tsx
import { Prose } from "@/components/ui/prose";
const Example = () => (
King's Treasury
People's happiness
Empty
Overflowing
Modest
Satisfied
Full
Ecstatic
);
export default Example;
```
# Qr Code - Examples and Patterns
Examples for Qr Code component.
## Example: default
```tsx
import { QrCode, QrCodeFrame } from "@/components/ui/qr-code";
const QrCodeDemo = () => (
);
export default QrCodeDemo;
```
## Example: download
```tsx
"use client";
import { DownloadIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import {
QrCode,
QrCodeDownload,
QrCodeFrame,
} from "@/components/ui/qr-code";
const QUALITY_BY_LEVEL = {
0: "L",
20: "M",
40: "Q",
60: "H",
} as const;
const Example = () => {
const [value, setValue] = React.useState("");
const qualityLabel = QUALITY_BY_LEVEL[getQualityLevel(value.length)];
return (
setValue(e.target.value)}
placeholder="Generate a QR code"
value={value}
/>
PNG
SVG
);
};
const getQualityLevel = (length: number) => {
if (length < 20) {
return 0;
}
if (length < 40) {
return 20;
}
if (length < 60) {
return 40;
}
return 60;
};
export default Example;
```
## Example: error-correction
```tsx
import { QrCode, QrCodeFrame } from "@/components/ui/qr-code";
const eccLevels = ["L", "M", "Q", "H"] as const;
const Example = () => (
{eccLevels.map((ecc) => (
))}
);
export default Example;
```
## Example: overlay
```tsx
import { SharkIcon } from "@/components/icons/shark";
import {
QrCode,
QrCodeFrame,
QrCodeOverlay,
} from "@/components/ui/qr-code";
const Example = () => (
);
export default Example;
```
## Example: size
```tsx
import { QrCode, QrCodeFrame } from "@/components/ui/qr-code";
const Example = () => (
);
export default Example;
```
# Radio Group - Examples and Patterns
Allows single selection from multiple options.
## Example: card
```tsx
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const Example = () => (
Plus
For individuals and small teams.
Pro
For growing businesses.
Enterprise
For large teams and enterprises.
);
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const Example = () => {
const [value, setValue] = React.useState(null);
const isCorrectOption = value === "comfortable";
return (
Select the option comfortable
setValue(value)} value={value}>
Default
Comfortable
Compact
{isCorrectOption ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const RadioGroupDemo = () => (
Default
Confortable
Compact
);
export default RadioGroupDemo;
```
## Example: disabled
```tsx
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const Example = () => (
Default
Comfortable
Compact
Default
Comfortable
Compact
);
export default Example;
```
## Example: invalid
```tsx
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const Example = () => (
Default
Comfortable
Compact
);
export default Example;
```
## Example: with-description
```tsx
import { Field, FieldDescription } from "@/components/ui/field";
import {
RadioGroup,
RadioGroupItem,
} from "@/components/ui/radio-group";
const Example = () => (
Default
Standard spacing for most use cases.
Comfortable
More space between elements.
Compact
Minimal spacing for dense layouts.
);
export default Example;
```
# Rating - Examples and Patterns
Examples for Rating component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Rating } from "@/components/ui/rating";
const Example = () => {
const [value, setValue] = React.useState(0);
const isCorrectRating = value === 5;
return (
Select the rating 5
setValue(details.value ?? 0)}
value={value}
/>
{isCorrectRating ? "✅" : "❌"}
);
};
export default Example;
```
## Example: count
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => ;
export default Example;
```
## Example: custom-color
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => (
);
export default Example;
```
## Example: custom-icon
```tsx
import { HeartIcon } from "lucide-react";
import { Rating } from "@/components/ui/rating";
const Example = () => (
} />
);
export default Example;
```
## Example: custom-size
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => (
);
export default Example;
```
## Example: default
```tsx
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Rating } from "@/components/ui/rating";
const RatingDemo = () => (
VV
Vinicius Vicentini
Tuestday morning at Mercado N.89
Rate your driver
Submit
);
export default RatingDemo;
```
## Example: disabled
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => ;
export default Example;
```
## Example: half-star
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => ;
export default Example;
```
## Example: readonly
```tsx
import { Rating } from "@/components/ui/rating";
const Example = () => ;
export default Example;
```
## Example: testimonial
```tsx
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar";
import {
Card,
CardContent,
CardDescription,
CardTitle,
} from "@/components/ui/card";
import { Rating } from "@/components/ui/rating";
const Example = () => (
“This completely changed our workflow. Fast, reliable, and the
team loves it. Would recommend to anyone.”
VV
Vinicius Vicentini
Frontend Developer
);
export default Example;
```
# Resizable - Examples and Patterns
Examples for Resizable component.
## Example: default
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const ResizableDemo = () => (
One
Two
Three
);
export default ResizableDemo;
```
## Example: handle
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const Example = () => (
Panel 1
Panel 2
);
export default Example;
```
## Example: min-max
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const Example = () => (
Sidebar
Content
);
export default Example;
```
## Example: multiple-panels
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const Example = () => (
Left
Center
Right
);
export default Example;
```
## Example: orientation-horizontal
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const Example = () => (
Left
Right
);
export default Example;
```
## Example: orientation-vertical
```tsx
import {
Resizable,
ResizablePanel,
ResizableResizeTrigger,
} from "@/components/ui/resizable";
const Example = () => (
Top
Bottom
);
export default Example;
```
# Scroll Area - Examples and Patterns
Examples for Scroll Area component.
## Example: both-directions
```tsx
import { ScrollArea } from "@/components/ui/scroll-area";
const Example = () => (
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut nulla
metus. Ut consequat augue et semper porttitor. Integer vel ante arcu.
Nullam tincidunt dolor odio, ac tincidunt leo dictum eu. Proin auctor,
nulla vel tincidunt lacinia, leo erat sagittis erat, quis porta orci sem
id purus. Nam fermentum turpis vitae pretium facilisis. Mauris id
iaculis augue, ut tristique purus. Pellentesque sed diam semper, porta
nibh ut, sodales nunc. Aliquam accumsan a mi eget fringilla. Vestibulum
varius mi vitae sem placerat, et imperdiet lorem fringilla. Curabitur
sed congue mi, quis tincidunt tortor. Suspendisse pharetra sem vel risus
volutpat, a auctor massa faucibus.
Etiam posuere felis et consectetur molestie. Cras sed rhoncus nisl.
Aenean quis est sit amet quam facilisis lacinia at non magna. In eu orci
accumsan, ultrices justo vitae, sodales nibh. Curabitur in sagittis dui.
Maecenas commodo cursus magna, non fringilla nisl commodo in. Vestibulum
nec fermentum dolor. Etiam euismod nisl non scelerisque faucibus.
Aliquam erat volutpat. Donec quis nunc ultrices, viverra quam ut,
sagittis tortor. Nullam nulla tortor, convallis nec magna ut, lacinia
interdum est. Proin lobortis diam sollicitudin venenatis dictum.
Mauris a dui a nibh ullamcorper tempus. Maecenas laoreet magna venenatis
leo mattis sagittis. Donec in convallis leo, quis suscipit leo. Sed a
augue purus. Integer id vulputate erat. Quisque a arcu purus. Nulla
feugiat ex tellus, ac elementum magna porttitor a. Sed convallis rhoncus
aliquam. Praesent euismod metus a fermentum faucibus.
);
export default Example;
```
## Example: default
```tsx
import React from "react";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Separator } from "@/components/ui/separator";
const tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-beta.${i}`);
const ScrollAreaDemo = () => (
Tags
{tags.map((tag) => (
{tag}
))}
);
export default ScrollAreaDemo;
```
## Example: horizontal
```tsx
import { ScrollArea } from "@/components/ui/scroll-area";
const Example = () => (
{Array.from({ length: 20 }).map((_, i) => (
Item {i + 1}
))}
);
export default Example;
```
## Example: nested
```tsx
import { ScrollArea } from "@/components/ui/scroll-area";
const Example = () => (
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat.
This is a nested scroll area. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum. Sed ut perspiciatis unde
omnis iste natus error sit voluptatem accusantium doloremque
laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore
veritatis et quasi architecto beatae vitae dicta sunt explicabo.
);
export default Example;
```
## Example: scroll-fade
```tsx
import React from "react";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Separator } from "@/components/ui/separator";
const tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-beta.${i}`);
const Example = () => (
Tags
{tags.map((tag) => (
{tag}
))}
);
export default Example;
```
# Segment Group - Examples and Patterns
Examples for Segment Group component.
## Example: controlled
```tsx
"use client";
import React from "react";
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => {
const [value, setValue] = React.useState("Profile");
return (
setValue(e.value)}
value={value}
>
{items.map((item) => (
{item}
))}
);
};
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: custom-indicator
```tsx
"use client";
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: default
```tsx
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const SegmentGroupDemo = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default SegmentGroupDemo;
```
## Example: disabled-item
```tsx
"use client";
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: disabled
```tsx
"use client";
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: indicator-on-hover
```tsx
"use client";
import React from "react";
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const pages = ["Profile", "Account", "Security", "Notifications"];
const Example = () => {
const [value, setValue] = React.useState("Profile");
const [hoverValue, setHoverValue] = React.useState(null);
return (
setValue(e.value ?? "Profile")}
value={hoverValue ?? value}
>
{pages.map((page) => (
setValue(page)}
onMouseEnter={() => setHoverValue(page)}
onMouseLeave={() => setHoverValue(null)}
value={page}
>
{page}
))}
);
};
export default Example;
```
## Example: orientation-horizontal
```tsx
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: orientation-vertical
```tsx
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: variant-underline-orientation-vertical
```tsx
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
## Example: variant-underline
```tsx
import {
SegmentGroup,
SegmentGroupItem,
SegmentGroupItemText,
} from "@/components/ui/segment-group";
const Example = () => (
{items.map((item) => (
{item}
))}
);
const items = ["Profile", "Account", "Security", "Notifications"];
export default Example;
```
# Select - Examples and Patterns
Examples for Select component.
## Example: controlled
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import React from "react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => {
const [value, setValue] = React.useState(["react"]);
return (
setValue(e.value)}
value={value}
>
{collection.items.map((item) => (
{item.label}
))}
);
};
const collection = createListCollection({
items: [
{ label: "React", value: "react" },
{ label: "Vue", value: "vue" },
{ label: "Svelte", value: "svelte" },
],
});
export default Example;
```
## Example: default
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const SelectDemo = () => (
{collection.items.map((item) => (
{item}
))}
);
const collection = createListCollection({
items: ["Banana", "Apple", "Orange", "Pineapple"],
});
export default SelectDemo;
```
## Example: disabled
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next" },
{ label: "Vite", value: "vite" },
{ label: "Astro", value: "astro" },
],
});
export default Example;
```
## Example: empty
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectEmpty,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
No items to display
);
const collection = createListCollection({
items: [],
});
export default Example;
```
## Example: grouping
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.group().map(([category, items]) => (
{items.map((item) => (
{item.label}
))}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next", category: "Frontend" },
{ label: "Vite", value: "vite", category: "Frontend" },
{ label: "Astro", value: "astro", category: "Frontend" },
{ label: "Express", value: "express", category: "Backend" },
{ label: "Fastify", value: "fastify", category: "Backend" },
{ label: "NestJS", value: "nestjs", category: "Backend" },
],
groupBy: (item) => (item as { category: string }).category,
});
export default Example;
```
## Example: invalid
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next" },
{ label: "Vite", value: "vite" },
{ label: "Astro", value: "astro" },
],
});
export default Example;
```
## Example: max-selection
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import React from "react";
import {
Select,
SelectContent,
SelectContext,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const MAX_SELECTION = 3;
const Example = () => {
const [value, setValue] = React.useState([]);
const handleValueChange = (details: { value: string[] }) => {
const newValue = details.value.slice(0, MAX_SELECTION);
setValue(newValue);
};
return (
{({ value }) => renderValue(value)}
{collection.items.map((item) => (
{item.label}
))}
);
};
const renderValue = (value: string[]) => {
if (value.length === 0) {
return "Select 3 frameworks";
}
const firstValue = value?.at(0) ?? "";
const additionalValues =
value.length > 1 ? ` (+${value.length - 1} more)` : "";
return firstValue + additionalValues;
};
const collection = createListCollection({
items: [
{ label: "JavaScript", value: "javascript" },
{ label: "TypeScript", value: "typescript" },
{ label: "Python", value: "python" },
{ label: "Rust", value: "rust" },
],
});
export default Example;
```
## Example: multiple
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectContext,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{({ value }) => renderValue(value)}
{collection.items.map((item) => (
{item.label}
))}
);
const renderValue = (value: string[]) => {
if (value.length === 0) {
return "Select languages…";
}
const firstValue = value?.at(0) ?? "";
const additionalValues =
value.length > 1 ? ` (+${value.length - 1} more)` : "";
return firstValue + additionalValues;
};
const collection = createListCollection({
items: [
{ label: "JavaScript", value: "javascript" },
{ label: "TypeScript", value: "typescript" },
{ label: "Python", value: "python" },
{ label: "Rust", value: "rust" },
],
});
export default Example;
```
## Example: size-lg
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next" },
{ label: "Vite", value: "vite" },
{ label: "ESBuild", value: "esbuild" },
],
});
export default Example;
```
## Example: size-md
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next" },
{ label: "Vite", value: "vite" },
{ label: "ESBuild", value: "esbuild" },
],
});
export default Example;
```
## Example: size-sm
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: [
{ label: "Next.js", value: "next" },
{ label: "Vite", value: "vite" },
{ label: "ESBuild", value: "esbuild" },
],
});
export default Example;
```
## Example: with-field
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
Country
{collection.items.map((item) => (
{item}
))}
Used for shipping estimates
);
const collection = createListCollection({
items: ["Brazil", "Mexico", "Ireland"],
});
export default Example;
```
## Example: with-scroll
```tsx
"use client";
import { createListCollection } from "@ark-ui/react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
const Example = () => (
{collection.items.map((item) => (
{item.label}
))}
);
const collection = createListCollection({
items: Array.from({ length: 20 }, (_, i) => ({
label: `Framework ${i + 1}`,
value: `framework-${i + 1}`,
})),
});
export default Example;
```
# Separator - Examples and Patterns
Examples for Separator component.
## Example: default
```tsx
import { Separator } from "@/components/ui/separator";
const SeparatorDemo = () => (
Shark UI
A set of primitive components for building UI.
A collection of accessible, beautiful, and customizable components.
);
export default SeparatorDemo;
```
## Example: list
```tsx
import { Separator } from "@/components/ui/separator";
const Example = () => (
Item 1
Value 1
Item 2
Value 2
Item 3
Value 3
);
export default Example;
```
## Example: menu
```tsx
import { Separator } from "@/components/ui/separator";
const Example = () => (
);
export default Example;
```
## Example: vertical
```tsx
import { Separator } from "@/components/ui/separator";
const Example = () => (
Blog
Docs
Source
);
export default Example;
```
# Sheet - Examples and Patterns
Examples for Sheet component.
## Example: close-behavior
```tsx
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetContent,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
No close on outside click
No close on Escape
);
export default Example;
```
## Example: custom-spacing
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
Name
Username
Cancel
Save changes
);
export default Example;
```
## Example: default
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
Name
Username
Cancel
Save changes
);
export default Example;
```
## Example: inset
```tsx
import { Button } from "@/components/ui/button";
import {
Field,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Input } from "@/components/ui/input";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
Name
Email
Cancel
Save changes
);
export default Example;
```
## Example: no-close-button
```tsx
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
The close button in the top right corner is hidden. Use the footer
buttons or press Escape to close.
Cancel
Confirm
);
export default Example;
```
## Example: non-modal
```tsx
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
Non-modal sheets allow interaction with elements outside. Focus
trapping and scroll prevention are disabled.
Close
);
export default Example;
```
## Example: scroll-area
```tsx
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetBody,
SheetClose,
SheetContent,
SheetFooter,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Open
What is Lorem Ipsum?
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
imperdiet placerat nisl, ac consequat sem hendrerit in.
Why do we use it?
Pellentesque quis sapien tortor. Nulla egestas tristique justo, in
commodo quam posuere id. Cras varius, nunc non placerat vulputate,
dolor turpis elementum elit, non lobortis lacus nunc nec nisl.
Where does it come from?
Pellentesque turpis est, mollis eu arcu eu, tempor tincidunt urna.
Pellentesque pellentesque est euismod accumsan ullamcorper. Quisque
urna lorem, porttitor ac malesuada at, vehicula eget nulla. Donec
eget consequat erat, quis pharetra ex.
Where can I get some?
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
egestas semper eros a maximus. Sed consequat tempus lobortis.
Phasellus sed vulputate turpis. Nulla facilisi. Curabitur consequat
dui tellus.
Who can I contact if I have questions?
Donec tortor lorem, finibus vel suscipit vehicula, sagittis
efficitur erat. Proin sagittis aliquam sagittis. Nullam sed porta
leo. Nunc sed velit felis.
What happens if I don't agree to these terms?
Aenean maximus, libero vel laoreet congue, purus leo iaculis libero,
egestas egestas quam mi at quam. Curabitur eu tempus mauris.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices
posuere cubilia curae;
Where can I get some?
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
egestas semper eros a maximus. Sed consequat tempus lobortis.
Phasellus sed vulputate turpis. Nulla facilisi. Curabitur consequat
dui tellus.
Cancel
I Agree
);
export default Example;
```
## Example: sides
```tsx
import { Button } from "@/components/ui/button";
import {
Sheet,
SheetBody,
SheetContent,
SheetHeader,
SheetTrigger,
} from "@/components/ui/sheet";
const Example = () => (
Right
This sheet slides in from the right placement.
Left
This sheet slides in from the left placement.
Top
This sheet slides in from the top placement.
Bottom
This sheet slides in from the bottom.
);
export default Example;
```
# Show - Examples and Patterns
Examples for Show component.
## Example: default
```tsx
"use client";
import React from "react";
import {
NumberInput,
NumberInputDecrement,
NumberInputGroup,
NumberInputIncrement,
NumberInputInput,
} from "@/components/ui/number-input";
import { Show } from "@/components/ui/show";
const ShowDemo = () => {
const [value, setValue] = React.useState(0);
const isGreaterThan2 = value > 2;
return (
setValue(Number(value))}
>
} when={isGreaterThan2}>
);
};
const Fallback = () => (
Not there yet. Keep clicking...
);
const Content = () => Your got it!
;
export default ShowDemo;
```
# Signature Pad - Examples and Patterns
Examples for Signature Pad component.
## Example: default
```tsx
import { SignaturePad } from "@/components/ui/signature-pad";
const SignaturePadDemo = () => ;
export default SignaturePadDemo;
```
## Example: field
```tsx
import {
Field,
FieldHelper,
FieldLabel,
} from "@/components/ui/field";
import { SignaturePad } from "@/components/ui/signature-pad";
const Example = () => (
Signature
Draw your signature in the box above
);
export default Example;
```
## Example: image-preview
```tsx
"use client";
import Image from "next/image";
import React from "react";
import { Field, FieldDescription } from "@/components/ui/field";
import { SignaturePad } from "@/components/ui/signature-pad";
const Example = () => {
const [imageUrl, setImageUrl] = React.useState(null);
return (
details.getDataUrl("image/png").then((url) => setImageUrl(url))
}
/>
Image preview
{imageUrl && (
)}
);
};
export default Example;
```
# Skeleton - Examples and Patterns
Examples for Skeleton component.
## Example: default
```tsx
import {
SkeletonCircle,
SkeletonText,
} from "@/components/ui/skeleton";
const SkeletonDemo = () => (
);
export default SkeletonDemo;
```
## Example: loading-card
```tsx
import {
Card,
CardContent,
CardFooter,
CardHeader,
} from "@/components/ui/card";
import {
Skeleton,
SkeletonCircle,
SkeletonText,
} from "@/components/ui/skeleton";
const Example = () => (
);
export default Example;
```
## Example: skeleton-circle
```tsx
import {
Card,
CardContent,
CardFooter,
} from "@/components/ui/card";
import {
SkeletonCircle,
SkeletonText,
} from "@/components/ui/skeleton";
const Example = () => (
);
export default Example;
```
## Example: skeleton-text
```tsx
import { Skeleton, SkeletonText } from "@/components/ui/skeleton";
const Example = () => (
);
export default Example;
```
## Example: skeleton
```tsx
import {
Card,
CardContent,
CardFooter,
CardHeader,
CardMedia,
} from "@/components/ui/card";
import { Skeleton, SkeletonText } from "@/components/ui/skeleton";
const Example = () => (
);
export default Example;
```
# Skip Nav - Examples and Patterns
Examples for Skip Nav component.
## Example: default
```tsx
import {
SkipNavContent,
SkipNavLink,
} from "@/components/ui/skip-nav";
const SkipNavDemo = () => (
<>
Main Content
This is the main content area. When users press Tab and then Enter on
the skip link, focus jumps here.
>
);
export default SkipNavDemo;
```
# Slider - Examples and Patterns
Examples for Slider component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Field } from "@/components/ui/field";
import {
Slider,
SliderLabel,
SliderValue,
} from "@/components/ui/slider";
const Example = () => {
const [value, setValue] = React.useState([40]);
const isGreaterThan80 = value[0] > 80;
return (
Greater than 80
setValue(value)} value={value}>
Temperature
{isGreaterThan80 ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import { Slider } from "@/components/ui/slider";
export const SliderDemo = () => (
);
export default SliderDemo;
```
## Example: disabled
```tsx
import { Slider } from "@/components/ui/slider";
const Example = () => (
);
export default Example;
```
## Example: marks
```tsx
import { Slider } from "@/components/ui/slider";
const Example = () => (
);
export default Example;
```
## Example: min-max
```tsx
import {
Slider,
SliderLabel,
SliderValue,
} from "@/components/ui/slider";
const Example = () => (
Volume
);
export default Example;
```
## Example: range
```tsx
import { Slider } from "@/components/ui/slider";
const Example = () => (
);
export default Example;
```
## Example: step
```tsx
import { Slider, SliderLabel } from "@/components/ui/slider";
const Example = () => (
Storage size
);
export default Example;
```
## Example: vertical
```tsx
import { Slider } from "@/components/ui/slider";
const Example = () => (
);
export default Example;
```
## Example: with-label
```tsx
import { Field } from "@/components/ui/field";
import {
Slider,
SliderLabel,
SliderValue,
} from "@/components/ui/slider";
const Example = () => (
Opacity
);
export default Example;
```
# Spinner - Examples and Patterns
Examples for Spinner component.
## Example: badge
```tsx
import { Badge } from "@/components/ui/badge";
import { Spinner } from "@/components/ui/spinner";
const Example = () => (
Deleting
Generating
);
export default Example;
```
## Example: default
```tsx
import {
Item,
ItemContent,
ItemMedia,
ItemTitle,
} from "@/components/ui/item";
import { Spinner } from "@/components/ui/spinner";
const SpinnerDemo = () => (
-
Generating image...
78%
);
export default SpinnerDemo;
```
## Example: input-group
```tsx
import {
InputGroup,
InputGroupAddon,
InputGroupInput,
} from "@/components/ui/input-group";
import { Spinner } from "@/components/ui/spinner";
const Example = () => (
);
export default Example;
```
## Example: size
```tsx
import { Spinner } from "@/components/ui/spinner";
const Example = () => (
);
export default Example;
```
# Status - Examples and Patterns
Examples for Status component.
## Example: custom-color
```tsx
import { Status } from "@/components/ui/status";
const Example = () => (
);
export default Example;
```
## Example: custom-size
```tsx
import { Status } from "@/components/ui/status";
const Example = () => (
);
export default Example;
```
## Example: default
```tsx
import { Status } from "@/components/ui/status";
const StatusDemo = () => (
);
export default StatusDemo;
```
## Example: size-lg
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: size-md
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: size-sm
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: variant-default
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: variant-destructive
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: variant-info
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: variant-success
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: variant-warning
```tsx
import { Status } from "@/components/ui/status";
const Example = () => ;
export default Example;
```
## Example: with-badge
```tsx
import { Badge } from "@/components/ui/badge";
import { Status } from "@/components/ui/status";
const Example = () => (
Online
In progress
Pending
Offline
);
export default Example;
```
## Example: with-icon
```tsx
import { PlusIcon } from "lucide-react";
import { Status } from "@/components/ui/status";
const Example = () => (
);
export default Example;
```
# Steps - Examples and Patterns
Examples for Steps component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Steps,
StepsCompletedContent,
StepsContent,
StepsIndicator,
StepsItem,
StepsList,
StepsSeparator,
StepsTitle,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => {
const [step, setStep] = React.useState(0);
return (
setStep(details.step)}
step={step}
>
{items.map((item, index) => (
{index + 1}
{item.title}
))}
{items.map((item, index) => (
{item.content}
))}
All steps completed. You're all set!
setStep((s) => Math.max(0, s - 1))}
variant="outline"
>
Back
setStep((s) => Math.min(items.length, s + 1))}>
Next
setStep(0)} variant="ghost">
Reset
);
};
const items = [
{
title: "Your details",
content: "Please provide your name and email address.",
},
{ title: "Company details", content: "A few details about your company." },
{ title: "Invite your team", content: "Start collaborating with your team." },
];
export default Example;
```
## Example: default
```tsx
import { ChevronLeftIcon, ChevronRight } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Steps,
StepsCompletedContent,
StepsContent,
StepsIndicator,
StepsItem,
StepsList,
StepsNext,
StepsPrevious,
StepsSeparator,
StepsTrigger,
} from "@/components/ui/steps";
const steps = Array.from({ length: 3 }, (_, index) => index + 1);
const StepsDemo = () => (
{steps.map((step) => (
{step}
))}
{steps.map((step) => (
Step {step}
))}
All steps completed. You're all set!
Next
Back
);
export default StepsDemo;
```
## Example: description
```tsx
import {
Steps,
StepsDescription,
StepsIndicator,
StepsItem,
StepsList,
StepsSeparator,
StepsTitle,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => (
{items.map((item, index) => (
{index + 1}
{item.title}
{item.description}
))}
);
const items = [
{ title: "Info", description: "Personal" },
{ title: "Docs", description: "Company" },
{ title: "Team", description: "Create" },
];
export default Example;
```
## Example: icon
```tsx
import { CreditCardIcon, HardDriveIcon, UserIcon } from "lucide-react";
import {
Steps,
StepsIndicator,
StepsItem,
StepsList,
StepsSeparator,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => (
{items.map((item, index) => (
))}
);
const items = [
{ icon: UserIcon },
{ icon: HardDriveIcon },
{ icon: CreditCardIcon },
];
export default Example;
```
## Example: loading
```tsx
import { Loader2Icon } from "lucide-react";
import {
Steps,
StepsIndicator,
StepsItem,
StepsList,
StepsSeparator,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => (
{items.map((item, index) => (
{item ? : index + 1}
))}
);
const items = [true, false, false];
export default Example;
```
## Example: title
```tsx
import {
Steps,
StepsIndicator,
StepsItem,
StepsList,
StepsSeparator,
StepsTitle,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => (
{items.map((item, index) => (
{index + 1}
{item}
))}
);
const items = ["Info", "Docs", "Team"];
export default Example;
```
## Example: vertical
```tsx
import { ChevronLeftIcon, ChevronRightIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Steps,
StepsCompletedContent,
StepsContent,
StepsDescription,
StepsIndicator,
StepsItem,
StepsList,
StepsNext,
StepsPrevious,
StepsSeparator,
StepsTitle,
StepsTrigger,
} from "@/components/ui/steps";
const Example = () => (
{items.map((item, index) => (
{index + 1}
{item.title}
{item.description}
))}
{items.map((item, index) => (
{item.description}
))}
Completed
Next
Back
);
const items = [
{ title: "Info", description: "Personal" },
{ title: "Docs", description: "Company" },
{ title: "Team", description: "Create" },
];
export default Example;
```
# Swap - Examples and Patterns
Examples for Swap component.
## Example: blur
```tsx
"use client";
import { MoonIcon, SunIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Swap, SwapIndicator } from "@/components/ui/swap";
const Example = () => {
const [swap, setSwap] = React.useState(false);
return (
setSwap(!swap)} size="icon-lg" variant="outline">
);
};
export default Example;
```
## Example: default
```tsx
"use client";
import { MoonIcon, SunIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Swap, SwapIndicator } from "@/components/ui/swap";
const SwapDemo = () => {
const [swap, setSwap] = React.useState(false);
return (
setSwap(!swap)} size="icon-lg" variant="outline">
);
};
export default SwapDemo;
```
## Example: flip
```tsx
"use client";
import { MoonIcon, SunIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Swap, SwapIndicator } from "@/components/ui/swap";
const Example = () => {
const [swap, setSwap] = React.useState(false);
return (
setSwap(!swap)} size="icon-lg" variant="outline">
);
};
export default Example;
```
## Example: rotate
```tsx
"use client";
import { MoonIcon, SunIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Swap, SwapIndicator } from "@/components/ui/swap";
const Example = () => {
const [swap, setSwap] = React.useState(false);
return (
setSwap(!swap)} size="icon-lg" variant="outline">
);
};
export default Example;
```
## Example: scale
```tsx
"use client";
import { MoonIcon, SunIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Swap, SwapIndicator } from "@/components/ui/swap";
const Example = () => {
const [swap, setSwap] = React.useState(false);
return (
setSwap(!swap)} size="icon-lg" variant="outline">
);
};
export default Example;
```
# Switch - Examples and Patterns
A control element that allows for a binary selection.
## Example: card
```tsx
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
FieldTitle,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => (
Enable notifications
You can enable or disable notifications at any time.
);
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import {
Field,
FieldContent,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [checked, setChecked] = React.useState(false);
return (
setChecked(checked ?? false)}
/>
Enable notifications
{checked ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import { Field, FieldLabel } from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const SwitchDemo = () => (
Airplane mode
);
export default SwitchDemo;
```
## Example: description
```tsx
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => (
Share across devices
Focus is shared across devices, and turns off when you leave the app.
);
export default Example;
```
## Example: disabled
```tsx
import {
Field,
FieldContent,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => (
Marketing emails
);
export default Example;
```
## Example: form
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
} from "@/components/ui/card";
import {
Field,
FieldContent,
FieldError,
FieldGroup,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => {
const [terms, setTerms] = React.useState(false);
const [errors, setErrors] = React.useState<{ terms?: string }>({});
const onSubmit = (e: React.SubmitEvent) => {
e.preventDefault();
if (!terms) {
setErrors({ terms: "You must accept the terms" });
}
};
return (
Please read the terms and conditions carefully.
setTerms(checked)}
/>
I agree to the terms
{errors.terms && {errors.terms} }
Submit
{
setTerms(false);
setErrors({});
}}
type="reset"
variant="outline"
>
Reset
);
};
export default Example;
```
## Example: invalid
```tsx
import {
Field,
FieldContent,
FieldLabel,
} from "@/components/ui/field";
import { Switch } from "@/components/ui/switch";
const Example = () => (
Accept terms and conditions
);
export default Example;
```
## Example: size
```tsx
import { Switch } from "@/components/ui/switch";
const Example = () => (
);
export default Example;
```
# Table - Examples and Patterns
Examples for Table component.
## Example: action-bar
```tsx
"use client";
import {
ArchiveIcon,
CopyIcon,
EllipsisIcon,
PencilIcon,
SendIcon,
Trash2Icon,
} from "lucide-react";
import React from "react";
import {
ActionBar,
ActionBarContent,
ActionBarValue,
} from "@/components/ui/action-bar";
import {
AlertDialog,
AlertDialogAction,
AlertDialogBody,
AlertDialogCancel,
AlertDialogClose,
AlertDialogContent,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog";
import { Badge, type BadgeVariant } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import {
Menu,
MenuContent,
MenuItem,
MenuTrigger,
} from "@/components/ui/menu";
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => {
const [selectedIds, setSelectedIds] = React.useState([]);
const isOpen = selectedIds.length > 0;
const allSelected =
selectedIds.length > 0 && selectedIds.length === orders.length;
const handleSelectAll = (checked: boolean | "indeterminate") => {
if (checked) {
setSelectedIds(orders.map((order) => order.id));
} else {
setSelectedIds([]);
}
};
const handleSelectRow = (id: string, checked: boolean | "indeterminate") => {
if (checked) {
setSelectedIds((prev) => [...prev, id]);
} else {
setSelectedIds((prev) => prev.filter((item) => item !== id));
}
};
const handleClose = () => {
setSelectedIds([]);
};
return (
!open && handleClose()} open={isOpen}>
Orders with checkbox selection and action bar.
handleSelectAll(checked)}
/>
ID
Name
Status
Amount
{orders.map((order) => {
const isSelected = selectedIds.includes(order.id);
return (
handleSelectRow(order.id, checked)
}
/>
{order.id}
{order.name}
{order.status}
{order.amount}
);
})}
Send
Edit
Archive
Duplicate
Delete
{selectedIds.map((id) => {
const order = orders.find((o) => o.id === id);
if (!order) {
return null;
}
return (
{order.id} - {order.name}
);
})}
Cancel
Delete
);
};
export default Example;
const orders = [
{
id: "SO-01",
name: "Macbook Pro 16",
status: "progress",
amount: "245,12 $",
},
{
id: "SO-02",
name: "Apple Watch Series 9",
status: "transit",
amount: "122,18 $",
},
{
id: "SO-03",
name: "AirPods Max",
status: "pending",
amount: "89,50 $",
},
{
id: "SO-04",
name: "iPad Pro 13",
status: "pending",
amount: "310,00 $",
},
{
id: "SO-05",
name: "iPhone 15 Pro Max",
status: "transit",
amount: "156,75 $",
},
];
const statusVariants: Record = {
transit: "success",
pending: "warning",
progress: "info",
};
```
## Example: actions
```tsx
import {
EllipsisVerticalIcon,
EyeIcon,
PencilIcon,
Trash2Icon,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Menu,
MenuContent,
MenuItem,
MenuShortcut,
MenuTrigger,
} from "@/components/ui/menu";
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => (
Users with row actions (edit, delete).
Name
Email
Actions
{users.map((user) => (
{user.name}
{user.email}
View
⌘ V
Edit
⌘ E
Delete
⌘ ⌫
))}
);
const users = [
{ id: "1", name: "Alice Johnson", email: "alice@example.com" },
{ id: "2", name: "Bruno Silva", email: "bruno@example.com" },
{ id: "3", name: "Clara Mendes", email: "clara@example.com" },
];
export default Example;
```
## Example: context-menu
```tsx
"use client";
import { EyeIcon, PencilIcon, Trash2Icon } from "lucide-react";
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuShortcut,
ContextMenuTrigger,
} from "@/components/ui/context-menu";
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => (
Users with row context menu. Right-click a row to open the menu.
Name
Email
{users.map((user) => (
{user.name}
{user.email}
View
⌘ V
Edit
⌘ E
Delete
⌘ ⌫
))}
);
const users = [
{ id: "1", name: "Alice Johnson", email: "alice@example.com" },
{ id: "2", name: "Bruno Silva", email: "bruno@example.com" },
{ id: "3", name: "Clara Mendes", email: "clara@example.com" },
];
export default Example;
```
## Example: default
```tsx
import { Badge, type BadgeVariant } from "@/components/ui/badge";
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const TableDemo = () => (
A list of users in your workspace.
Name
Email
Role
Status
{users.map((user) => (
{user.name}
{user.email}
{user.role}
{user.status}
))}
);
const statusVariants: Record = {
active: "success",
invited: "info",
inactive: "destructive",
};
const users = [
{
id: "1",
name: "Alice Johnson",
email: "alice.johnson@example.com",
role: "Admin",
status: "active",
},
{
id: "2",
name: "Bruno Silva",
email: "bruno.silva@example.com",
role: "Editor",
status: "invited",
},
{
id: "3",
name: "Clara Mendes",
email: "clara.mendes@example.com",
role: "Viewer",
status: "inactive",
},
{
id: "4",
name: "David Park",
email: "david.park@example.com",
role: "Editor",
status: "active",
},
];
export default TableDemo;
```
## Example: footer
```tsx
import {
Table,
TableBody,
TableCaption,
TableCell,
TableFooter,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => (
Order summary with footer totals.
Item
Qty
Unit price
Amount
{items.map((row) => (
{row.item}
{row.qty}
${row.unitPrice.toFixed(2)}
${(row.qty * row.unitPrice).toFixed(2)}
))}
Total
$379.47
);
const items = [
{ id: "1", item: "Wireless mouse", qty: 2, unitPrice: 29.99 },
{ id: "2", item: "Mechanical keyboard", qty: 1, unitPrice: 149.99 },
{ id: "3", item: "USB-C hub", qty: 3, unitPrice: 45.0 },
];
export default Example;
```
## Example: not-hoverable
```tsx
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => (
Table with row hover disabled (isHoverable=false).
Name
Email
{users.map((user) => (
{user.name}
{user.email}
))}
);
const users = [
{
id: "1",
name: "Alice Johnson",
email: "alice@example.com",
},
{
id: "2",
name: "Bruno Silva",
email: "bruno@example.com",
},
{
id: "3",
name: "Clara Mendes",
email: "clara@example.com",
},
];
export default Example;
```
## Example: striped
```tsx
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table";
const Example = () => (
Users with alternating row backgrounds.
Name
Email
Role
Status
{users.map((user) => (
{user.name}
{user.email}
{user.role}
{user.status}
))}
);
const users = [
{
id: "1",
name: "Alice Johnson",
email: "alice.johnson@example.com",
role: "Admin",
status: "Active",
},
{
id: "2",
name: "Bruno Silva",
email: "bruno.silva@example.com",
role: "Editor",
status: "Invited",
},
{
id: "3",
name: "Clara Mendes",
email: "clara.mendes@example.com",
role: "Viewer",
status: "Inactive",
},
{
id: "4",
name: "David Park",
email: "david.park@example.com",
role: "Editor",
status: "Active",
},
];
export default Example;
```
# Tabs - Examples and Patterns
Examples for Tabs component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => {
const [value, setValue] = React.useState("profile");
return (
setValue(e.value)} value={value}>
Profile
Settings
Security
Manage your profile information and preferences.
Customize notifications, theme, and text density.
Update your password and security settings.
setValue("profile")} size="sm" variant="outline">
Go to Profile
setValue("settings")}
size="sm"
variant="outline"
>
Go to Settings
setValue("security")}
size="sm"
variant="outline"
>
Go to Security
);
};
export default Example;
```
## Example: default
```tsx
import {
Card,
CardContent,
CardHeader,
} from "@/components/ui/card";
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const TabsDemo = () => (
Profile
Settings
Security
View you shared information here, update you profile name, picture and
email.
Customize how to handle notifications, update the theme and text
density.
Update your security settings here, change your password and more.
);
export default TabsDemo;
```
## Example: disabled
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Profile
Settings
Profile content
Settings content
);
export default Example;
```
## Example: orientation-horizontal
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Tab 1
Tab 2
Tab 3
Content 1
Content 2
Content 3
);
export default Example;
```
## Example: orientation-vertical
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Tab 1
Tab 2
Tab 3
Content 1
Content 2
Content 3
);
export default Example;
```
## Example: variant-default
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Profile
Settings
Security
Content 1
Content 2
Content 3
);
export default Example;
```
## Example: variant-underline-orientation-vertical
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Tab 1
Tab 2
Tab 3
Content 1
Content 2
Content 3
);
export default Example;
```
## Example: variant-underline
```tsx
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Profile
Settings
Security
Content 1
Content 2
Content 3
);
export default Example;
```
## Example: with-icons
```tsx
import { SettingsIcon, ShieldIcon, UserIcon } from "lucide-react";
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
const Example = () => (
Profile
Settings
Security
Profile content
Settings content
Security content
);
export default Example;
```
# Tags Input - Examples and Patterns
Multi-value tag entry with keyboard navigation and optional combobox autocomplete.
## Example: blur-behavior
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: combobox
```tsx
"use client";
import { useFilter, useListCollection } from "@ark-ui/react";
import React from "react";
import {
Combobox,
ComboboxContent,
ComboboxEmpty,
ComboboxFieldInput,
ComboboxItem,
ComboboxList,
} from "@/components/ui/combobox";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInputContext,
TagsInputInput,
TagsInputItem,
TagsInputRootProvider,
useTagsInput,
} from "@/components/ui/tags-input";
const frameworkItems = [
"React",
"Solid",
"Vue",
"Svelte",
"Angular",
"Preact",
"Next.js",
"Astro",
];
const Example = () => {
const uid = React.useId();
const { contains } = useFilter({ sensitivity: "base" });
const { collection, filter } = useListCollection({
initialItems: frameworkItems,
filter: contains,
});
const tagsInput = useTagsInput({
ids: { input: `tags-input-${uid}`, control: `tags-control-${uid}` },
});
const availableItems = collection.items.filter(
(item) => !tagsInput.value.includes(item)
);
return (
Frameworks
filter(inputValue)}
onValueChange={({ value }) => {
const next = value[0];
if (next && !tagsInput.value.includes(next)) {
tagsInput.addValue(next);
}
}}
selectionBehavior="clear"
value={[]}
>
{({ value }) => (
<>
{value.map((tag, index) => (
{tag}
))}
>
)}
No frameworks found
{availableItems.map((item) => (
{item}
))}
);
};
export default Example;
```
## Example: controlled-input-value
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => {
const [inputValue, setInputValue] = React.useState("");
return (
setInputValue("React")}
size="sm"
variant="outline"
>
Set "React"
setInputValue("")} size="sm" variant="outline">
Clear
Frameworks
setInputValue(details.inputValue)}
>
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
};
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const initialValue = ["React", "Solid"];
const Example = () => {
const [value, setValue] = React.useState(initialValue);
return (
Frameworks
setValue(details.value)}
value={value}
>
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
};
export default Example;
```
## Example: custom-delimiter
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const tagDelimiter = /[,\s]+/;
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: default
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const defaultValue = ["React", "Solid", "Vue", "Svelte"];
const TagsInputDemo = () => (
Frameworks
{({ value }) =>
value.map((value, index) => (
{value}
))
}
);
export default TagsInputDemo;
```
## Example: disable-editing
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: disabled
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: field
```tsx
"use client";
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
Press Enter to add a tag.
);
export default Example;
```
## Example: invalid
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: max-length
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks (max 10 chars)
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: max-tags
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks (max 3)
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: max-with-overflow
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: paste-behavior
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: sanitize-value
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const Example = () => (
Frameworks
value.trim().toLowerCase()}
>
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
## Example: size-lg
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const defaultValue = ["React", "Solid"];
const Example = () => (
Frameworks
{({ value }) =>
value.map((value, index) => (
{value}
))
}
);
export default Example;
```
## Example: size-md
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const defaultValue = ["React", "Solid"];
const Example = () => (
Frameworks
{({ value }) =>
value.map((value, index) => (
{value}
))
}
);
export default Example;
```
## Example: size-sm
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const defaultValue = ["React", "Solid"];
const Example = () => (
Frameworks
{({ value }) =>
value.map((value, index) => (
{value}
))
}
);
export default Example;
```
## Example: validation
```tsx
"use client";
import { Field, FieldLabel } from "@/components/ui/field";
import {
TagsInput,
TagsInputContext,
TagsInputItem,
} from "@/components/ui/tags-input";
const validTagPattern = /^[a-zA-Z0-9-]+$/;
const Example = () => (
Min 3 chars, alphanumeric + hyphen
{
const next = inputValue.trim();
return (
Boolean(next) &&
!value.includes(next) &&
next.length >= 3 &&
validTagPattern.test(next)
);
}}
>
{({ value }) =>
value.map((tag, index) => (
{tag}
))
}
);
export default Example;
```
# Textarea - Examples and Patterns
Examples for Textarea component.
## Example: autoresize
```tsx
import { Textarea } from "@/components/ui/textarea";
const Example = () => (
);
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import { Field, FieldDescription } from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const Example = () => {
const [message, setMessage] = React.useState("");
return (
setMessage(target.value)}
placeholder="Type your message here"
value={message}
/>
Character count: {message.length}
);
};
export default Example;
```
## Example: default
```tsx
import { Textarea } from "@/components/ui/textarea";
const TextareaDemo = () => (
);
export default TextareaDemo;
```
## Example: disabled
```tsx
import { Field, FieldLabel } from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const Example = () => (
Feedback
);
export default Example;
```
## Example: form
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardFooter,
} from "@/components/ui/card";
import {
Field,
FieldError,
FieldLabel,
} from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const Example = () => {
const [message, setMessage] = React.useState("");
const [error, setError] = React.useState(null);
const onSubmit = (e: React.SubmitEvent) => {
e.preventDefault();
if (message.trim().length < 10) {
setError("Message must be at least 10 characters.");
return;
}
setError(null);
};
return (
Message
{
setMessage(e.target.value);
setError(null);
}}
placeholder="Type your message here"
value={message}
/>
{error && {error} }
Submit
{
setMessage("");
setError(null);
}}
variant="outline"
>
Clear
);
};
export default Example;
```
## Example: invalid
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const Example = () => (
Feedback
Please provide at least 20 characters.
);
export default Example;
```
## Example: with-field
```tsx
import {
Field,
FieldDescription,
FieldLabel,
} from "@/components/ui/field";
import { Textarea } from "@/components/ui/textarea";
const Example = () => (
Message
Add a short message to include with your submission.
);
export default Example;
```
# Timer - Examples and Patterns
Examples for Timer component.
## Example: controlled
```tsx
"use client";
import { PlayIcon, RotateCcwIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerControl,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerReset,
TimerSeparator,
TimerStart,
} from "@/components/ui/timer";
const Example = () => {
const [ticks, setTicks] = React.useState(0);
const [completed, setCompleted] = React.useState(false);
return (
Ticks: {ticks} {completed ? " — Completed!" : ""}
setCompleted(true)}
onTick={() => setTicks((t) => t + 1)}
targetMs={5 * 1000}
>
Minutes
Seconds
);
};
export default Example;
```
## Example: countdown-date
```tsx
"use client";
import { Card, CardContent } from "@/components/ui/card";
import {
remainingMsUntilDate,
Timer,
TimerArea,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
Until {formatDate(targetDate)}
days
hours
minutes
seconds
);
const formatDate = (date: Date) =>
date.toLocaleDateString(undefined, { dateStyle: "medium" });
const targetDate = new Date();
targetDate.setDate(targetDate.getDate() + 7);
export default Example;
```
## Example: countdown
```tsx
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
minutes
seconds
);
export default Example;
```
## Example: custom-separator
```tsx
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerItem,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
{"//"}
);
export default Example;
```
## Example: default
```tsx
"use client";
import {
Timer,
TimerArea,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
Days
Hours
Minutes
Seconds
);
export default Example;
```
## Example: interval
```tsx
import { Button } from "@registry/react/components/button";
import { PauseIcon, PlayIcon } from "lucide-react";
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerControl,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerPause,
TimerPlay,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
seconds
ms
);
export default Example;
```
## Example: orientation-horizontal
```tsx
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
minutes
seconds
);
export default Example;
```
## Example: orientation-vertical
```tsx
import { Card, CardContent } from "@/components/ui/card";
import {
Timer,
TimerArea,
TimerItem,
TimerItemGroup,
TimerItemLabel,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
minutes
seconds
);
export default Example;
```
## Example: pomodoro
```tsx
"use client";
import { Card, CardContent } from "@registry/react/components/card";
import { PauseIcon, PlayIcon, RotateCcwIcon, SettingsIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Timer,
TimerArea,
TimerControl,
TimerItem,
TimerPause,
TimerPlay,
TimerReset,
TimerSeparator,
} from "@/components/ui/timer";
const Example = () => (
🍅
Focus
);
export default Example;
```
# Toast - Examples and Patterns
Examples for Toast component.
## Example: action
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => {
const handleAction = () => {
const id = toast.create({
id: "action-performed",
title: "User has been deleted.",
description: "You can restore the user.",
type: "error",
action: {
label: "Undo",
onClick() {
toast.dismiss(id);
toast.success({
id: "action-undone",
title: "User has been restored.",
type: "success",
});
},
},
});
};
return (
Toast
);
};
export default Example;
```
## Example: closable
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => (
toast.create({
title: "Event has been created.",
description: "Tuesday, February 10, 2026 at 10:00 AM.",
closable: false,
})
}
variant="outline"
>
Toast
);
export default Example;
```
## Example: dedupe
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => (
toast.create({
id: "dedupe-on",
title: "Heads up!",
description: "This is a toast with id.",
})
}
variant="outline"
>
Toast with id
toast.create({
title: "Heads up!",
description: "This is a toast without id.",
})
}
variant="outline"
>
Toast without id
);
export default Example;
```
## Example: default
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const ToastDemo = () => (
{
toast.create({
title: "Event has been created.",
description: "Tuesday, February 10, 2026 at 10:00 AM.",
});
}}
variant="outline"
>
Toast
);
export default ToastDemo;
```
## Example: duration
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => (
toast.create({
title: "Short duration.",
description: "This toast disappears after 2 seconds.",
duration: 2000,
})
}
variant="outline"
>
2 seconds
toast.create({
title: "Long duration.",
description: "This toast stays for 10 seconds.",
duration: 10_000,
})
}
variant="outline"
>
10 seconds
toast.create({
title: "Persistent.",
description: "This toast stays until you close it.",
duration: Number.POSITIVE_INFINITY,
closable: true,
})
}
variant="outline"
>
Until dismissed
);
export default Example;
```
## Example: placement
```tsx
"use client";
import { createToaster } from "@ark-ui/react/toast";
import { Button } from "@/components/ui/button";
import { Toaster } from "@/components/ui/toast";
const topStartToaster = createToaster({
placement: "top-start",
overlap: true,
});
const topToaster = createToaster({
placement: "top",
overlap: true,
});
const topEndToaster = createToaster({
placement: "top-end",
overlap: true,
});
const bottomStartToaster = createToaster({
placement: "bottom-start",
overlap: true,
});
const bottomToaster = createToaster({
placement: "bottom",
overlap: true,
});
const bottomEndToaster = createToaster({
placement: "bottom-end",
overlap: true,
});
const Example = () => (
<>
topStartToaster.create({
title: "Top start",
description: "placement: top-start",
})
}
variant="outline"
>
Top start
topToaster.create({
title: "Top end",
description: "placement: top-end",
})
}
variant="outline"
>
Top center
topEndToaster.create({
title: "Top end",
description: "placement: top-end",
})
}
variant="outline"
>
Top end
bottomStartToaster.create({
title: "Bottom start",
description: "placement: bottom-start",
})
}
variant="outline"
>
Bottom start
bottomToaster.create({
title: "Bottom center",
description: "placement: bottom-center",
})
}
variant="outline"
>
Bottom center
bottomEndToaster.create({
title: "Bottom end",
description: "placement: bottom-end",
})
}
variant="outline"
>
Bottom end
>
);
export default Example;
```
## Example: promise
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => (
{
toast.promise<{ name: string }>(
() =>
new Promise((resolve) =>
setTimeout(() => resolve({ name: "Event" }), 2000)
),
{
loading: {
title: "Generating event...",
description: "Please wait while we generate the event.",
},
success: (data) => ({
title: "Event generated!",
description: `${data.name} has been created`,
}),
error: {
title: "Error generating event",
description: "Something went wrong.",
},
}
);
}}
variant="outline"
>
Run Promise
);
export default Example;
```
## Example: variants
```tsx
"use client";
import { Button } from "@/components/ui/button";
import { toast } from "@/components/ui/toast";
const Example = () => (
toast.success({
title: "Success!",
description: "Event has been created.",
})
}
variant="outline"
>
Success
toast.error({
title: "Something went wrong.",
description: "Event has not been created.",
})
}
variant="outline"
>
Error
toast.warning({
title: "Warning!",
description: "Your session will expire soon.",
})
}
variant="outline"
>
Warning
toast.info({
title: "Heads up!",
description: "You have a new event.",
})
}
variant="outline"
>
Info
);
export default Example;
```
# Toggle - Examples and Patterns
Examples for Toggle component.
## Example: controlled
```tsx
"use client";
import React from "react";
import { Toggle } from "@/components/ui/toggle";
const Example = () => {
const [pressed, setPressed] = React.useState(false);
return (
Toggle
{pressed ? "✅" : "❌"}
);
};
export default Example;
```
## Example: default
```tsx
import { Toggle } from "@/components/ui/toggle";
const ToggleDemo = () => Toggle ;
export default ToggleDemo;
```
## Example: disabled
```tsx
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
Disabled
);
export default Example;
```
## Example: icon-group
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
);
export default Example;
```
## Example: outline
```tsx
import { Toggle } from "@/components/ui/toggle";
const Example = () => Toggle ;
export default Example;
```
## Example: size-lg
```tsx
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
Large
);
export default Example;
```
## Example: size-md
```tsx
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
Medium
);
export default Example;
```
## Example: size-sm
```tsx
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
Small
);
export default Example;
```
## Example: with-icon
```tsx
import { BoldIcon } from "lucide-react";
import { Toggle } from "@/components/ui/toggle";
const Example = () => (
);
export default Example;
```
# Toggle Group - Examples and Patterns
Examples for Toggle Group component.
## Example: controlled
```tsx
"use client";
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import React from "react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => {
const [value, setValue] = React.useState(["bold"]);
return (
setValue(value)} value={value}>
{value.length > 0 ? value.join(", ") : "None"}
);
};
export default Example;
```
## Example: custom
```tsx
"use client";
import React from "react";
import { cn } from "@/lib/utils";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const FONT_WEIGHTS = [
{ value: "light", label: "Light", className: "font-light" },
{ value: "normal", label: "Normal", className: "font-normal" },
{ value: "medium", label: "Medium", className: "font-medium" },
{ value: "bold", label: "Bold", className: "font-bold" },
] as const;
const Example = () => {
const [value, setValue] = React.useState(["normal"]);
return (
Font Weight
setValue(e.value)}
size="lg"
spacing={2}
value={value}
variant="outline"
>
{FONT_WEIGHTS.map((weight) => (
Aa
{weight.label}
))}
);
};
export default Example;
```
## Example: default
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const ToggleGroupDemo = () => (
);
export default ToggleGroupDemo;
```
## Example: disabled-item
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: disabled
```tsx
import { Bold, Italic, Underline } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: ghost
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: horizontal
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: outline
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: single
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: size-lg
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: size-sm
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: spacing
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
## Example: vertical
```tsx
import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react";
import {
ToggleGroup,
ToggleGroupItem,
} from "@/components/ui/toggle-group";
const Example = () => (
);
export default Example;
```
# Toggle Tooltip - Examples and Patterns
Examples for Toggle Tooltip component.
## Example: default
```tsx
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
ToggleTooltip,
ToggleTooltipContent,
ToggleTooltipTrigger,
} from "@/components/ui/toggle-tooltip";
const Example = () => (
Hover or click to see this content. Works on touch devices too.
);
export default Example;
```
## Example: info-icon
```tsx
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
DataList,
DataListItem,
DataListItemLabel,
DataListItemValue,
} from "@/components/ui/data-list";
import {
ToggleTooltip,
ToggleTooltipContent,
ToggleTooltipTrigger,
} from "@/components/ui/toggle-tooltip";
const Example = () => (
{data.map((item) => (
{item.label}
{item.info}
{item.value}
))}
);
const data = [
{
label: "New Users",
value: "234",
info: "Total new user signups this month",
},
{ label: "Sales", value: "£12,340", info: "Revenue from product sales" },
{
label: "Revenue",
value: "3,450",
info: "Total revenue in the last quarter",
},
];
export default Example;
```
## Example: side
```tsx
import { Button } from "@/components/ui/button";
import {
ToggleTooltip,
ToggleTooltipContent,
ToggleTooltipTrigger,
} from "@/components/ui/toggle-tooltip";
const placements = ["left", "top", "bottom", "right"] as const;
const Example = () => (
{placements.map((placement) => (
{placement}
Info on {placement}
))}
);
export default Example;
```
## Example: with-link
```tsx
import { InfoIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
ToggleTooltip,
ToggleTooltipContent,
ToggleTooltipTrigger,
} from "@/components/ui/toggle-tooltip";
const Example = () => (
This is a popover, so it can contain interactive content like{" "}
this link
.
);
export default Example;
```
# Tooltip - Examples and Patterns
Examples for Tooltip component.
## Example: default
```tsx
import {
BoldIcon,
ItalicIcon,
StrikethroughIcon,
UnderlineIcon,
} from "lucide-react";
import { Button } from "@/components/ui/button";
import { ButtonGroup } from "@/components/ui/button-group";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const TooltipDemo = () => (
Bold
Italic
Underline
Strikethrough
);
export default TooltipDemo;
```
## Example: disabled-button
```tsx
import { Button } from "@/components/ui/button";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const Example = () => (
Disabled
You can still show a tooltip on a disabled element
);
export default Example;
```
## Example: side
```tsx
import { Button } from "@/components/ui/button";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const placements = ["left", "top", "bottom", "right"] as const;
const Example = () => (
{placements.map((placement) => (
{placement}
Add to library
))}
);
export default Example;
```
## Example: with-keyboard-shortcut
```tsx
import { Button } from "@/components/ui/button";
import { Kbd, KbdGroup } from "@/components/ui/kbd";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
const Example = () => (
Add to library
Add to library
⌘
K
);
export default Example;
```
# Tour - Examples and Patterns
Examples for Tour component.
## Example: async
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "intro",
type: "dialog",
title: "Async Data Loading",
description: "This tour demonstrates loading data before showing a step.",
actions: [{ label: "Next", action: "next" }],
},
{
id: "user-info",
type: "tooltip",
title: "Loading...",
description: "Fetching user data...",
target: () => document.querySelector("#user-card"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
effect({ show, update }) {
const controller = new AbortController();
fetch("https://api.github.com/users/segunadebayo", {
signal: controller.signal,
})
.then((res) => res.json())
.then((data) => {
update({
title: `Welcome, ${data.name ?? data.login}!`,
description: `You have ${data.public_repos} public repositories and ${data.followers} followers.`,
});
show();
})
.catch(() => {
update({
title: "User Profile",
description: "Could not load user data. Please try again.",
});
show();
});
return () => controller.abort();
},
},
{
id: "complete",
type: "dialog",
title: "Tour Complete",
description:
"The async step loaded data from the GitHub API before displaying.",
actions: [{ label: "Done", action: "dismiss" }],
},
];
const Example = () => (
Start Tour
User Profile Card
);
export default Example;
```
## Example: custom-spacing
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourContent,
TourDescription,
TourFooter,
TourHeader,
TourNextStep,
TourPreviousStep,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "step-1",
type: "dialog",
title: "Custom spacing",
description:
"`TourContent` uses `[--space:--spacing(2)]` here for tighter padding than the default.",
actions: [{ label: "Next", action: "next" as const }],
},
{
id: "step-2",
type: "dialog",
title: "Breakpoint utilities",
description:
"You can pair `[--space]` with responsive variants, e.g. `md:[--space:--spacing(6)]`.",
actions: [{ label: "Done", action: "dismiss" as const }],
},
];
const Example = () => (
Open
);
export default Example;
```
## Example: default
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourContent,
TourDescription,
TourFooter,
TourHeader,
TourNextStep,
TourPreviousStep,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const TourDemo = () => (
Open
);
const steps: TourStepType[] = [
{
id: "step-1",
type: "dialog",
title: "Welcome to the tour",
description: "You gonna learn how to use to install and use the component.",
actions: [{ label: "Start Tour", action: "next" as const }],
},
{
id: "step-2",
type: "tooltip",
target: () => document.querySelector("#installation"),
title: "Installation Step",
description:
"Let's take a quick tour of the documentation site to help you get started。",
actions: [
{ label: "Previous", action: "prev" as const },
{ label: "Next", action: "next" as const },
],
},
{
id: "step-3",
type: "tooltip",
target: () => document.querySelector("#usage"),
title: "Usage Step",
description: "This is how to use the component.",
actions: [
{ label: "Previous", action: "prev" as const },
{ label: "Next", action: "next" as const },
],
},
{
id: "step-4",
type: "dialog",
title: "That's all folks!",
description: "You've completed the tour. Thank you for your time!",
actions: [{ label: "Finish Tour", action: "dismiss" as const }],
},
];
export default TourDemo;
```
## Example: events
```tsx
"use client";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourFooter,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "step-1",
type: "tooltip",
title: "First Step",
description: "Watch the event log below as you navigate.",
target: () => document.querySelector("#event-1"),
actions: [{ label: "Next", action: "next" }],
},
{
id: "step-2",
type: "tooltip",
title: "Second Step",
description: "Each step change triggers an event.",
target: () => document.querySelector("#event-2"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "step-3",
type: "tooltip",
title: "Final Step",
description: "Complete the tour to see the status change.",
target: () => document.querySelector("#event-3"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Finish", action: "dismiss" },
],
},
];
const Example = () => {
const [logs, setLogs] = React.useState([]);
const addLog = (message: string) => {
setLogs((prev) => [...prev, message]);
};
return (
addLog(`Status: ${details.status}`)}
onStepChange={(details) =>
addLog(`Step changed: ${details.stepId ?? "unknown"}`)
}
steps={steps}
>
Start Tour
Event Log:
{logs.length === 0 ? (
Start the tour to see events
) : (
logs.map((log, i) => {log} )
)}
);
};
export default Example;
```
## Example: keyboard-navigation
```tsx
"use client";
import { KeyboardIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "step-1",
type: "tooltip",
title: "Keyboard Navigation",
description: "Press the right arrow key (→) to go to the next step.",
target: () => document.querySelector("#tour-key-1"),
actions: [{ label: "Next", action: "next" }],
},
{
id: "step-2",
type: "tooltip",
title: "Go Back",
description: "Press the left arrow key (←) to go back.",
target: () => document.querySelector("#tour-key-2"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "step-3",
type: "tooltip",
title: "Close Tour",
description: "Press Escape to close the tour at any time.",
target: () => document.querySelector("#tour-key-3"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Finish", action: "dismiss" },
],
},
];
const Example = () => (
Start Tour
Use arrow keys to navigate, Escape to close
);
export default Example;
```
## Example: progress
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
useTourContext,
} from "@/components/ui/tour";
const TourProgressBar = () => {
const { tour } = useTourContext();
return (
);
};
const steps: TourStepType[] = [
{
id: "step-1",
type: "tooltip",
title: "Progress Tracking",
description: "Watch the progress bar at the bottom as you navigate.",
target: () => document.querySelector("#progress-1"),
actions: [{ label: "Next", action: "next" }],
},
{
id: "step-2",
type: "tooltip",
title: "Halfway There",
description: "The progress bar shows how far along you are.",
target: () => document.querySelector("#progress-2"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "step-3",
type: "tooltip",
title: "Almost Done",
description: "One more step to complete the tour.",
target: () => document.querySelector("#progress-3"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "step-4",
type: "tooltip",
title: "Complete!",
description: "You have completed all the steps.",
target: () => document.querySelector("#progress-4"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Finish", action: "dismiss" },
],
},
];
const Example = () => (
Start Tour
Step 1
Step 2
Step 3
Step 4
);
export default Example;
```
## Example: skip
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "step-1",
type: "tooltip",
title: "First Feature",
description: "You can skip this tour at any time using the Skip button.",
target: () => document.querySelector("#tour-item-1"),
actions: [
{ label: "Skip", action: "dismiss" },
{ label: "Next", action: "next" },
],
},
{
id: "step-2",
type: "tooltip",
title: "Second Feature",
description: "Continue or skip to end the tour early.",
target: () => document.querySelector("#tour-item-2"),
actions: [
{ label: "Skip", action: "dismiss" },
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "step-3",
type: "tooltip",
title: "Final Feature",
description: "This is the last step of the tour.",
target: () => document.querySelector("#tour-item-3"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Finish", action: "dismiss" },
],
},
];
const Example = () => (
);
export default Example;
```
## Example: step-types
```tsx
"use client";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "welcome",
type: "dialog",
title: "Welcome!",
description:
"This tour demonstrates different step types: dialog, tooltip, and floating.",
actions: [{ label: "Start Tour", action: "next" }],
},
{
id: "tooltip-step",
type: "tooltip",
title: "Tooltip Step",
description:
"This step appears as a tooltip anchored to a specific element.",
target: () => document.querySelector("#tour-target-element"),
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "floating-step",
type: "floating",
placement: "bottom-end",
title: "Floating Step",
description:
"This step floats at a fixed position on the screen, independent of any target.",
actions: [
{ label: "Back", action: "prev" },
{ label: "Next", action: "next" },
],
},
{
id: "complete",
type: "dialog",
title: "Tour Complete!",
description: "You have seen all the different step types available.",
actions: [{ label: "Done", action: "dismiss" }],
},
];
const Example = () => (
Start Tour
Target Element
);
export default Example;
```
## Example: wait-for-click
```tsx
"use client";
import { waitForEvent } from "@ark-ui/react/tour";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "intro",
type: "dialog",
title: "Interactive Tutorial",
description:
"This tour will guide you through actions. You must complete each step to proceed.",
actions: [{ label: "Begin", action: "next" }],
},
{
id: "click-add",
type: "tooltip",
title: "Click the Add Button",
description: 'Click the "Add Item" button to continue.',
target: () => document.querySelector("#btn-add"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(target, "click");
promise.then(() => next());
return cancel;
},
},
{
id: "click-edit",
type: "tooltip",
title: "Click the Edit Button",
description: 'Now click the "Edit" button.',
target: () => document.querySelector("#btn-edit"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(target, "click");
promise.then(() => next());
return cancel;
},
},
{
id: "click-delete",
type: "tooltip",
title: "Click the Delete Button",
description: 'Finally, click the "Delete" button.',
target: () => document.querySelector("#btn-delete"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(target, "click");
promise.then(() => next());
return cancel;
},
},
{
id: "complete",
type: "dialog",
title: "Well Done!",
description: "You completed all the interactive steps.",
actions: [{ label: "Finish", action: "dismiss" }],
},
];
const Example = () => (
Start Interactive Tour
Add Item
Edit
Delete
);
export default Example;
```
## Example: wait-for-element
```tsx
"use client";
import { waitForElement, waitForEvent } from "@ark-ui/react/tour";
import { PlusIcon } from "lucide-react";
import React from "react";
import { Button } from "@/components/ui/button";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const steps: TourStepType[] = [
{
id: "intro",
type: "dialog",
title: "Dynamic Elements",
description:
"This tour demonstrates waiting for elements that appear dynamically.",
actions: [{ label: "Start", action: "next" }],
},
{
id: "add-item",
type: "tooltip",
title: "Add an Item",
description: "Click the button to add a new item to the list.",
target: () => document.querySelector("#btn-add-item"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(target, "click");
promise.then(() => next());
return cancel;
},
},
{
id: "new-item",
type: "tooltip",
title: "New Item Added!",
description:
"The tour waited for this element to appear before showing this step.",
target: () => document.querySelector('[data-item="new"]'),
effect({ show }) {
const [promise, cancel] = waitForElement(
() => document.querySelector('[data-item="new"]'),
{ timeout: 5000 }
);
promise.then(() => show());
return () => cancel();
},
actions: [{ label: "Next", action: "next" }],
},
{
id: "complete",
type: "dialog",
title: "Tour Complete",
description: "You learned how to use waitForElement for dynamic content.",
actions: [{ label: "Done", action: "dismiss" }],
},
];
const Example = () => {
const [items, setItems] = React.useState(["Item 1", "Item 2"]);
const addItem = () => {
setItems((prev) => [...prev, `Item ${prev.length + 1}`]);
};
return (
Start Tour
Add Item
{items.map((item, index) => (
2
? "new"
: undefined
}
key={item}
>
{item}
))}
);
};
export default Example;
```
## Example: wait-for-input
```tsx
"use client";
import { waitForEvent } from "@ark-ui/react/tour";
import { Checkbox } from "@registry/react/components/checkbox";
import { Field, FieldLabel } from "@registry/react/components/field";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
Tour,
TourActions,
TourContent,
TourDescription,
TourHeader,
TourProgressText,
type TourStepType,
TourTitle,
TourTrigger,
} from "@/components/ui/tour";
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const steps: TourStepType[] = [
{
id: "intro",
type: "dialog",
title: "Form Tutorial",
description:
"Learn how to fill out the form by following the guided steps.",
actions: [{ label: "Start", action: "next" }],
},
{
id: "enter-name",
type: "tooltip",
title: "Enter Your Name",
description: "Type your name in the input field to continue.",
target: () => document.querySelector("#input-name"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(
target,
"input",
{
predicate: (el) => el.value.trim().length >= 2,
}
);
promise.then(() => next());
return cancel;
},
},
{
id: "enter-email",
type: "tooltip",
title: "Enter Your Email",
description: "Now enter a valid email address.",
target: () => document.querySelector("#input-email"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(
target,
"input",
{
predicate: (el) => emailRegex.test(el.value),
}
);
promise.then(() => next());
return cancel;
},
},
{
id: "check-terms",
type: "tooltip",
title: "Accept Terms",
description: "Check the checkbox to accept the terms.",
target: () => document.querySelector("#checkbox-terms"),
effect({ next, target, show }) {
show();
const [promise, cancel] = waitForEvent(
target,
"change",
{
predicate: (el) => el.checked,
}
);
promise.then(() => next());
return cancel;
},
},
{
id: "complete",
type: "dialog",
title: "Form Complete!",
description: "You have successfully filled out the form.",
actions: [{ label: "Done", action: "dismiss" }],
},
];
const Example = () => (
);
export default Example;
```
# Tree View - Examples and Patterns
Examples for Tree View component.
## Example: checkbox-tree
```tsx
"use client";
import React from "react";
import {
createTreeCollection,
type TreeNodeType,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewCheckbox,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => {
const [checkedNodes, setCheckedNodes] = React.useState([
"readme.md",
]);
return (
setCheckedNodes(checkedValue)}
>
{collection.rootNode.children?.map((node, index) => (
))}
{JSON.stringify(checkedNodes, null, 2)}
);
};
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: { node: TreeNodeType; indexPath: number[] }) => {
const { node, indexPath } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: context-menu
```tsx
"use client";
import {
FilePlusIcon,
FolderPlusIcon,
PencilIcon,
Trash2Icon,
} from "lucide-react";
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuTrigger,
} from "@/components/ui/context-menu";
import {
createTreeCollection,
type NodeProviderProps,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: NodeProviderProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
Add folder
Add file
Rename
Delete
{node.children.map((child, index) => (
))}
) : (
{node.name}
Rename
Delete
)}
);
};
export default Example;
```
## Example: controlled
```tsx
"use client";
import React from "react";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => {
const [selected, setSelected] = React.useState([]);
const isCorrectSelection = selected[0] === "components/input.tsx";
return (
Select input.tsx
setSelected(selectedValue)}
selectedValue={selected}
>
{collection.rootNode.children?.map((node, index) => (
))}
{isCorrectSelection ? "✅" : "❌"}
);
};
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: custom-icons-folder
```tsx
"use client";
import { PackageIcon, PackageOpenIcon } from "lucide-react";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
icon: PackageIcon,
expandedIcon: PackageOpenIcon,
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
icon: null,
expandedIcon: null,
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: custom-icons-item
```tsx
"use client";
import { StarIcon } from "lucide-react";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: custom-icons
```tsx
"use client";
import { FileCodeIcon, FileJsonIcon, FileTextIcon } from "lucide-react";
import {
createFileIcons,
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const fileIcons = createFileIcons({
".tsx": FileCodeIcon,
".json": FileJsonIcon,
".md": FileTextIcon,
});
const Example = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: default
```tsx
"use client";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const TreeViewDemo = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default TreeViewDemo;
```
## Example: editor
```tsx
"use client";
import { XIcon } from "lucide-react";
import React from "react";
import { buttonVariants } from "@/components/ui/button";
import {
Tabs,
TabsContent,
TabsList,
TabsTrigger,
} from "@/components/ui/tabs";
import {
createTreeCollection,
type TreeNodeType,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => {
const [activeItem, setActiveItem] = React.useState("");
const handleSelectNode = (selectedNodes: TreeNodeType[]) => {
const selectedItem = selectedNodes.map((node) => node.name)[0];
const isFolder = selectedNodes.every((node) => node.children?.length ?? 0);
if (isFolder) {
return;
}
const formattedName = selectedItem?.split("/").at(-1);
setActiveItem(formattedName ?? "");
};
return (
handleSelectNode(selectedNodes)
}
>
{collection.rootNode.children?.map((node, index) => (
))}
{activeItem && (
{activeItem}
setActiveItem("")}
role="button"
tabIndex={0}
>
{"// File content"}
)}
);
};
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: links
```tsx
"use client";
import { ExternalLinkIcon, Link } from "lucide-react";
import {
createTreeCollection,
type NodeProviderProps,
type TreeNodeType,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewLabel,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
interface TreeNodeWithLinks extends TreeNodeType {
href?: string;
}
const Example = () => (
Docs
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "docs",
name: "Documentation",
children: [
{
id: "docs/introduction",
name: "Introduction",
href: "/docs",
},
{
id: "docs/components",
name: "Components",
href: "/docs/components",
},
],
},
{
id: "external",
name: "External Links",
children: [
{
id: "external/github",
name: "GitHub Repository",
href: "https://github.com/sharkui-inc/shark-ui",
},
],
},
{ id: "llms.txt", name: "llms.txt", href: "/llms.txt" },
],
},
});
const TreeNode = (props: NodeProviderProps) => {
const { node, indexPath } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
{node.href?.startsWith("http") && }
)}
);
};
export default Example;
```
## Example: multiple-selection
```tsx
"use client";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => (
{collection.rootNode.children?.map((node, index) => (
))}
);
const collection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```
## Example: rename
```tsx
"use client";
import React from "react";
import {
createTreeCollection,
TreeView,
TreeViewBranch,
TreeViewBranchContent,
TreeViewBranchItem,
TreeViewContent,
TreeViewItem,
TreeViewNode,
TreeViewTree,
} from "@/components/ui/tree-view";
const Example = () => {
const [collection, setCollection] = React.useState(initialCollection);
return (
true}
collection={collection}
onRenameComplete={(details) => {
setCollection((prev) => {
const node = prev.at(details.indexPath);
if (!node) {
return prev;
}
return prev.replace(details.indexPath, {
...node,
name: details.label,
});
});
}}
>
{collection.rootNode.children?.map((node, index) => (
))}
);
};
const initialCollection = createTreeCollection({
rootNode: {
id: "ROOT",
name: "",
children: [
{
id: "app",
name: "app",
children: [
{ id: "app/page.tsx", name: "page.tsx" },
{ id: "app/layout.tsx", name: "layout.tsx" },
],
},
{
id: "components",
name: "components",
children: [
{ id: "components/button.tsx", name: "button.tsx" },
{ id: "components/input.tsx", name: "input.tsx" },
],
},
{ id: "package.json", name: "package.json" },
{ id: "readme.md", name: "README.md" },
],
},
});
const TreeNode = (props: React.ComponentProps) => {
const { node, indexPath, ...rest } = props;
return (
{node.children ? (
{node.name}
{node.children.map((child, index) => (
))}
) : (
{node.name}
)}
);
};
export default Example;
```