-
-
-
+ }>Done
diff --git a/apps/v4/content/docs/components/base/drawer.mdx b/apps/v4/content/docs/components/base/drawer.mdx
index 0b46bcbb00..7ffe85e812 100644
--- a/apps/v4/content/docs/components/base/drawer.mdx
+++ b/apps/v4/content/docs/components/base/drawer.mdx
@@ -4,14 +4,11 @@ description: A drawer component for React.
base: base
component: true
links:
- doc: https://vaul.emilkowal.ski/getting-started
+ doc: https://base-ui.com/react/components/drawer
+ api: https://base-ui.com/react/components/drawer#api-reference
---
-
-
-## About
-
-Drawer is built on top of [Vaul](https://github.com/emilkowalski/vaul) by [emilkowalski](https://twitter.com/emilkowalski).
+
## Installation
@@ -36,7 +33,7 @@ npx shadcn@latest add drawer
Install the following dependencies:
```bash
-npm install vaul
+npm install @base-ui/react
```
Copy and paste the following code into your project.
@@ -44,7 +41,7 @@ npm install vaul
Update the import paths to match your project setup.
@@ -55,6 +52,14 @@ npm install vaul
+Add the following to your global styles. On iOS Safari, the drawer overlay is absolutely positioned and requires a positioned `body` to cover the viewport after the page is scrolled. See the [Base UI docs](https://base-ui.com/react/overview/quick-start#ios-26-safari) for details.
+
+```css
+body {
+ position: relative;
+}
+```
+
## Usage
```tsx showLineNumbers
@@ -72,17 +77,16 @@ import {
```tsx showLineNumbers
- Open
+ }>Open
Are you absolutely sure?This action cannot be undone.
+
{/* Content here */}
-
-
-
+ }>Cancel
@@ -102,32 +106,215 @@ Drawer
└── DrawerFooter
```
+`DrawerContent` composes the portal, overlay, viewport, and popup from Base UI. For lower-level control, `DrawerPortal`, `DrawerOverlay`, and `DrawerSwipeHandle` are also exported.
+
+## Custom Sizes
+
+A vertical drawer sizes itself to its content and is capped at `calc(100dvh - 6rem)` by default. A side drawer spans `75%` of the viewport width, or `24rem` on larger screens.
+
+To customize the height of a vertical drawer, use the `h-*` and `max-h-*` utilities on `DrawerContent`.
+
+```tsx
+
+```
+
+To customize the width of a side drawer, use the `w-*` and `max-w-*` utilities on `DrawerContent`.
+
+```tsx
+
+```
+
+When the same component renders in multiple directions, scope an override to one axis using the `data-[swipe-axis=*]` variants.
+
+```tsx
+
+```
+
+To make a region of the drawer scrollable, make the scroll container a flex item. Avoid `h-full`, which does not resolve inside a content-sized drawer.
+
+```tsx
+
+ ...
+
{/* Scrollable content */}
+ ...
+
+```
+
+## Styling
+
+The drawer exposes CSS variables for style-level customization. Set the sizing variables on `DrawerContent`. Set the overlay variable on `[data-slot=drawer-overlay]` in your CSS.
+
+| Variable | Default | Description |
+| ------------------------------ | ---------------------- | ----------------------------------------------------------------------- |
+| `--drawer-inset` | `0px` | Floats the drawer from the viewport edges. |
+| `--drawer-bleed-background` | `var(--color-popover)` | Fills the gap behind the drawer on swipe overshoot. |
+| `--drawer-overlay-min-opacity` | `0` | Minimum overlay opacity. Defaults to `0.5` when snap points are active. |
+
+The drawer also sets data attributes you can target with variants such as `data-[swipe-direction=down]:` on `DrawerContent`, or `group-data-[swipe-axis=y]/drawer-popup:` on its descendants.
+
+| Attribute | Values | Set when |
+| ------------------------- | ----------------------------- | ------------------------------------- |
+| `data-swipe-direction` | `up`, `right`, `down`, `left` | Always. |
+| `data-swipe-axis` | `x`, `y` | Always. |
+| `data-snap-points` | Present | The drawer has snap points. |
+| `data-expanded` | Present | The drawer is at the full snap point. |
+| `data-swiping` | Present | A swipe is in progress. |
+| `data-nested-drawer-open` | Present | A nested drawer is open on top. |
+
## Examples
-### Scrollable Content
+### Position
-Keep actions visible while the content scrolls.
+Use the `swipeDirection` prop to set the side of the drawer.
-
+Available options are `up`, `right`, `down`, and `left`.
-### Sides
+
-Use the `direction` prop to set the side of the drawer. Available options are `top`, `right`, `bottom`, and `left`.
+### Swipe Handle
-
+Use `showSwipeHandle` on `Drawer` to render a swipe handle.
-### Responsive Dialog
+
+
+### Nested
+
+Open drawers from inside another drawer. Parent drawers stay mounted and stack behind the frontmost drawer.
+
+
+
+### Non Modal
+
+Set `modal={false}` to allow interaction with the rest of the page while the drawer is open. Combine with `disablePointerDismissal` to prevent the drawer from closing on outside presses. Use `modal="trap-focus"` to keep focus inside the drawer while leaving scroll and pointer interaction unrestricted.
+
+
+
+### Snap Points
+
+Use `snapPoints` to snap a drawer to preset heights. Numbers between `0` and `1` represent fractions of the viewport. Numbers greater than `1` are treated as pixel values. String values support `px` and `rem` units. Snap points apply to vertical drawers.
+
+Track the active snap point with the controlled `snapPoint` and `onSnapPointChange` props. At the full snap point, the drawer gets a `data-expanded` attribute you can style with the `data-expanded:` variant.
+
+
+
+### Responsive
You can combine the `Dialog` and `Drawer` components to create a responsive dialog. This renders a `Dialog` component on desktop and a `Drawer` on mobile.
-
+
-## RTL
+## Migrating from Vaul
-To enable RTL support in shadcn/ui, see the [RTL configuration guide](/docs/rtl).
+The base drawer now uses [Base UI](https://base-ui.com/react/components/drawer)
+instead of Vaul. If you installed the previous base drawer, update your usage
+to the Base UI API.
-
+
+
+Update the dependency.
+
+```diff
+- npm install vaul
++ npm install @base-ui/react
+```
+
+Replace `direction` with `swipeDirection`.
+
+Use `down` instead of `bottom`, and `up` instead of `top`. `left` and `right`
+stay the same.
+
+```diff
+-
++
+```
+
+Replace `asChild` with `render`.
+
+For `DrawerTrigger`, pass the trigger element to the `render` prop.
+
+```diff
+-
+-
+-
++ }>
++ Open
++
+```
+
+For `DrawerClose`, pass the close element to the `render` prop.
+
+```diff
+-
+-
+-
++ }>
++ Cancel
++
+```
+
+Update snap point props.
+
+If you use snap points, rename the controlled snap point props and the sequential
+snap point prop.
+
+```diff
+
+```
+
+Update animation and focus props.
+
+```diff
+- setDone(open)}>
++ setDone(open)}>
+```
+
+```diff
+- event.preventDefault()}>
++
+```
+
+Review Vaul-only props.
+
+Vaul props like `handleOnly`, `repositionInputs`, and
+`shouldScaleBackground` do not have one-to-one replacements in the base drawer
+API. Use Base UI props such as `disablePointerDismissal`, `modal`, `snapPoints`,
+or controlled `open` state for the behavior you need.
+
+```diff
+-
++
+```
+
+```diff
+-
++
+```
+
+Update custom data attribute selectors.
+
+Replace Vaul's `data-vaul-drawer-direction` selectors with Base UI's
+`data-swipe-direction` selectors.
+
+```diff
+-
++
+```
+
+Base UI also exposes attributes like `data-swiping`, `data-starting-style`, and
+`data-ending-style` for swipe and transition states. Descendants inside
+`DrawerContent` can use `group-data-[swipe-axis=x]/drawer-popup` and
+`group-data-[swipe-axis=y]/drawer-popup` for axis-specific styling.
+
+
## API Reference
-See the [Vaul documentation](https://vaul.emilkowal.ski/getting-started) for the full API reference.
+See the [Base UI documentation](https://base-ui.com/react/components/drawer) for the full API reference.
diff --git a/apps/v4/examples/__components__.tsx b/apps/v4/examples/__components__.tsx
index 6724ed46a7..5e1b28c430 100644
--- a/apps/v4/examples/__components__.tsx
+++ b/apps/v4/examples/__components__.tsx
@@ -6129,6 +6129,24 @@ export const ExamplesComponents: Record> = {
) || "drawer-dialog"
return { default: mod.default || mod[exportName] }
}),
+ "drawer-nested": React.lazy(async () => {
+ const mod = await import("./base/drawer-nested")
+ const exportName =
+ Object.keys(mod).find(
+ (key) =>
+ typeof mod[key] === "function" || typeof mod[key] === "object"
+ ) || "drawer-nested"
+ return { default: mod.default || mod[exportName] }
+ }),
+ "drawer-non-modal": React.lazy(async () => {
+ const mod = await import("./base/drawer-non-modal")
+ const exportName =
+ Object.keys(mod).find(
+ (key) =>
+ typeof mod[key] === "function" || typeof mod[key] === "object"
+ ) || "drawer-non-modal"
+ return { default: mod.default || mod[exportName] }
+ }),
"drawer-rtl": React.lazy(async () => {
const mod = await import("./base/drawer-rtl")
const exportName =
@@ -6138,15 +6156,6 @@ export const ExamplesComponents: Record> = {
) || "drawer-rtl"
return { default: mod.default || mod[exportName] }
}),
- "drawer-scrollable-content": React.lazy(async () => {
- const mod = await import("./base/drawer-scrollable-content")
- const exportName =
- Object.keys(mod).find(
- (key) =>
- typeof mod[key] === "function" || typeof mod[key] === "object"
- ) || "drawer-scrollable-content"
- return { default: mod.default || mod[exportName] }
- }),
"drawer-sides": React.lazy(async () => {
const mod = await import("./base/drawer-sides")
const exportName =
@@ -6156,6 +6165,24 @@ export const ExamplesComponents: Record> = {
) || "drawer-sides"
return { default: mod.default || mod[exportName] }
}),
+ "drawer-snap-points": React.lazy(async () => {
+ const mod = await import("./base/drawer-snap-points")
+ const exportName =
+ Object.keys(mod).find(
+ (key) =>
+ typeof mod[key] === "function" || typeof mod[key] === "object"
+ ) || "drawer-snap-points"
+ return { default: mod.default || mod[exportName] }
+ }),
+ "drawer-swipe-handle": React.lazy(async () => {
+ const mod = await import("./base/drawer-swipe-handle")
+ const exportName =
+ Object.keys(mod).find(
+ (key) =>
+ typeof mod[key] === "function" || typeof mod[key] === "object"
+ ) || "drawer-swipe-handle"
+ return { default: mod.default || mod[exportName] }
+ }),
"dropdown-menu-avatar": React.lazy(async () => {
const mod = await import("./base/dropdown-menu-avatar")
const exportName =
diff --git a/apps/v4/examples/__index__.tsx b/apps/v4/examples/__index__.tsx
index 5b27127735..338196b2c6 100644
--- a/apps/v4/examples/__index__.tsx
+++ b/apps/v4/examples/__index__.tsx
@@ -2727,18 +2727,30 @@ export const ExamplesIndex: Record> = {
name: "drawer-dialog",
filePath: "examples/base/drawer-dialog.tsx",
},
+ "drawer-nested": {
+ name: "drawer-nested",
+ filePath: "examples/base/drawer-nested.tsx",
+ },
+ "drawer-non-modal": {
+ name: "drawer-non-modal",
+ filePath: "examples/base/drawer-non-modal.tsx",
+ },
"drawer-rtl": {
name: "drawer-rtl",
filePath: "examples/base/drawer-rtl.tsx",
},
- "drawer-scrollable-content": {
- name: "drawer-scrollable-content",
- filePath: "examples/base/drawer-scrollable-content.tsx",
- },
"drawer-sides": {
name: "drawer-sides",
filePath: "examples/base/drawer-sides.tsx",
},
+ "drawer-snap-points": {
+ name: "drawer-snap-points",
+ filePath: "examples/base/drawer-snap-points.tsx",
+ },
+ "drawer-swipe-handle": {
+ name: "drawer-swipe-handle",
+ filePath: "examples/base/drawer-swipe-handle.tsx",
+ },
"dropdown-menu-avatar": {
name: "dropdown-menu-avatar",
filePath: "examples/base/dropdown-menu-avatar.tsx",
diff --git a/apps/v4/examples/base/drawer-demo.tsx b/apps/v4/examples/base/drawer-demo.tsx
index ab8c129adc..14502278ac 100644
--- a/apps/v4/examples/base/drawer-demo.tsx
+++ b/apps/v4/examples/base/drawer-demo.tsx
@@ -1,10 +1,11 @@
"use client"
import * as React from "react"
-import { Minus, Plus } from "lucide-react"
-import { Bar, BarChart, ResponsiveContainer } from "recharts"
+import { toast } from "sonner"
-import { Button } from "@/styles/base-nova/ui/button"
+import { useIsMobile } from "@/hooks/use-mobile"
+import { Badge } from "@/styles/base-rhea/ui/badge"
+import { Button } from "@/styles/base-rhea/ui/button"
import {
Drawer,
DrawerClose,
@@ -14,121 +15,117 @@ import {
DrawerHeader,
DrawerTitle,
DrawerTrigger,
-} from "@/styles/base-nova/ui/drawer"
+} from "@/styles/base-rhea/ui/drawer"
+import {
+ Field,
+ FieldContent,
+ FieldDescription,
+ FieldLabel,
+ FieldTitle,
+} from "@/styles/base-rhea/ui/field"
+import { RadioGroup, RadioGroupItem } from "@/styles/base-rhea/ui/radio-group"
-const data = [
+const deliveryTimes = [
{
- goal: 400,
+ value: "asap",
+ id: "delivery-asap",
+ label: "Standard delivery",
+ description: "25–35 min · Driver assigned now",
+ badge: "Fastest",
},
{
- goal: 300,
+ value: "5-00",
+ id: "delivery-5-00",
+ label: "5:00 PM – 5:15 PM",
+ description: "Prep starts at 4:45 PM",
},
{
- goal: 200,
+ value: "5-30",
+ id: "delivery-5-30",
+ label: "5:30 PM – 5:45 PM",
+ description: "Good if you're heading home",
},
{
- goal: 300,
+ value: "6-00",
+ id: "delivery-6-00",
+ label: "6:00 PM – 6:15 PM",
+ description: "Most popular · High demand",
},
{
- goal: 200,
- },
- {
- goal: 278,
- },
- {
- goal: 189,
- },
- {
- goal: 239,
- },
- {
- goal: 300,
- },
- {
- goal: 200,
- },
- {
- goal: 278,
- },
- {
- goal: 189,
- },
- {
- goal: 349,
+ value: "6-30",
+ id: "delivery-6-30",
+ label: "6:30 PM – 6:45 PM",
+ description: "Last slot before kitchen closes",
},
]
export function DrawerDemo() {
- const [goal, setGoal] = React.useState(350)
+ const [open, setOpen] = React.useState(false)
+ const [deliveryTime, setDeliveryTime] = React.useState("asap")
+ const isMobile = useIsMobile()
- function onClick(adjustment: number) {
- setGoal(Math.max(200, Math.min(400, goal + adjustment)))
+ function handleConfirm() {
+ const selected = deliveryTimes.find((time) => time.value === deliveryTime)
+
+ if (!selected) {
+ return
+ }
+
+ setOpen(false)
+ toast("Delivery time confirmed", {
+ description: selected.label,
+ })
}
return (
-
-
-
+
+ }>
+ Open Drawer
-
-
- Move Goal
- Set your daily activity goal.
-
-
-
-
-
-
- {goal}
-
-
- Calories/day
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Pick a delivery time
+
+ We'll prepare your order as soon as possible.
+
+
+
- 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. 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.
-
- 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. 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.
-
- ))}
-
-
-
-
-
-
-
-
-
- ))}
-
+
+ }>
+ Open Left Drawer
+
+
+
+ Move Goal
+ Set your daily activity goal.
+
+
+
+
+
+ }>Close
+
+
+
)
}
diff --git a/apps/v4/examples/base/drawer-snap-points.tsx b/apps/v4/examples/base/drawer-snap-points.tsx
new file mode 100644
index 0000000000..7e2ce41d9d
--- /dev/null
+++ b/apps/v4/examples/base/drawer-snap-points.tsx
@@ -0,0 +1,40 @@
+"use client"
+
+import { Button } from "@/styles/base-rhea/ui/button"
+import {
+ Drawer,
+ DrawerClose,
+ DrawerContent,
+ DrawerDescription,
+ DrawerFooter,
+ DrawerHeader,
+ DrawerTitle,
+ DrawerTrigger,
+} from "@/styles/base-rhea/ui/drawer"
+
+const SNAP_POINTS = ["31rem", 1]
+
+export function DrawerSnapPoints() {
+ return (
+
+ }>
+ Open Snap Drawer
+
+
+
+ Snap points
+
+ Drag the drawer to snap between a compact peek and a near
+ full-height view.
+
+
+
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-luma/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-luma/ui/badge\"\nimport { Button } from \"@/registry/base-luma/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-luma/ui/chart\"\nimport { Checkbox } from \"@/registry/base-luma/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-luma/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-luma/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-luma/ui/input\"\nimport { Label } from \"@/registry/base-luma/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-luma/ui/select\"\nimport { Separator } from \"@/registry/base-luma/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-luma/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-luma/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-luma/components/example\"\nimport { Button } from \"@/registry/base-luma/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-luma/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-luma/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-luma/ui/accordion\"\nimport { Button } from \"@/registry/base-luma/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-luma/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-luma/ui/marker\"\nimport { Spinner } from \"@/registry/base-luma/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-lyra/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-lyra/ui/badge\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-lyra/ui/chart\"\nimport { Checkbox } from \"@/registry/base-lyra/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-lyra/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-lyra/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-lyra/ui/input\"\nimport { Label } from \"@/registry/base-lyra/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-lyra/ui/select\"\nimport { Separator } from \"@/registry/base-lyra/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-lyra/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-lyra/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-lyra/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-lyra/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-lyra/ui/accordion\"\nimport { Button } from \"@/registry/base-lyra/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-lyra/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-lyra/ui/marker\"\nimport { Spinner } from \"@/registry/base-lyra/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-maia/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-maia/ui/badge\"\nimport { Button } from \"@/registry/base-maia/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-maia/ui/chart\"\nimport { Checkbox } from \"@/registry/base-maia/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-maia/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-maia/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-maia/ui/input\"\nimport { Label } from \"@/registry/base-maia/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-maia/ui/select\"\nimport { Separator } from \"@/registry/base-maia/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-maia/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-maia/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-maia/components/example\"\nimport { Button } from \"@/registry/base-maia/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-maia/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-maia/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-maia/ui/accordion\"\nimport { Button } from \"@/registry/base-maia/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-maia/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-maia/ui/marker\"\nimport { Spinner } from \"@/registry/base-maia/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-mira/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-mira/ui/badge\"\nimport { Button } from \"@/registry/base-mira/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-mira/ui/chart\"\nimport { Checkbox } from \"@/registry/base-mira/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-mira/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-mira/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-mira/ui/input\"\nimport { Label } from \"@/registry/base-mira/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-mira/ui/select\"\nimport { Separator } from \"@/registry/base-mira/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-mira/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-mira/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-mira/components/example\"\nimport { Button } from \"@/registry/base-mira/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-mira/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-mira/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-mira/ui/accordion\"\nimport { Button } from \"@/registry/base-mira/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-mira/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-mira/ui/marker\"\nimport { Spinner } from \"@/registry/base-mira/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-nova/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-nova/ui/badge\"\nimport { Button } from \"@/registry/base-nova/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-nova/ui/chart\"\nimport { Checkbox } from \"@/registry/base-nova/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-nova/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-nova/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-nova/ui/input\"\nimport { Label } from \"@/registry/base-nova/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-nova/ui/select\"\nimport { Separator } from \"@/registry/base-nova/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-nova/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-nova/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-nova/components/example\"\nimport { Button } from \"@/registry/base-nova/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-nova/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-nova/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-nova/ui/accordion\"\nimport { Button } from \"@/registry/base-nova/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-nova/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-nova/ui/marker\"\nimport { Spinner } from \"@/registry/base-nova/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-rhea/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-rhea/ui/badge\"\nimport { Button } from \"@/registry/base-rhea/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-rhea/ui/chart\"\nimport { Checkbox } from \"@/registry/base-rhea/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-rhea/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-rhea/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-rhea/ui/input\"\nimport { Label } from \"@/registry/base-rhea/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-rhea/ui/select\"\nimport { Separator } from \"@/registry/base-rhea/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-rhea/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-rhea/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-rhea/components/example\"\nimport { Button } from \"@/registry/base-rhea/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-rhea/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-rhea/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-rhea/ui/accordion\"\nimport { Button } from \"@/registry/base-rhea/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-rhea/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-rhea/ui/marker\"\nimport { Spinner } from \"@/registry/base-rhea/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-sera/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-sera/ui/badge\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-sera/ui/chart\"\nimport { Checkbox } from \"@/registry/base-sera/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-sera/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-sera/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-sera/ui/input\"\nimport { Label } from \"@/registry/base-sera/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-sera/ui/select\"\nimport { Separator } from \"@/registry/base-sera/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-sera/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-sera/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-sera/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-sera/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-sera/ui/accordion\"\nimport { Button } from \"@/registry/base-sera/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-sera/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-sera/ui/marker\"\nimport { Spinner } from \"@/registry/base-sera/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n
\n \n >\n )}\n \n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport * as React from \"react\"\nimport {\n closestCenter,\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n type UniqueIdentifier,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n flexRender,\n getCoreRowModel,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type Row,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport { Area, AreaChart, CartesianGrid, XAxis } from \"recharts\"\nimport { toast } from \"sonner\"\nimport { z } from \"zod\"\n\nimport { useIsMobile } from \"@/registry/base-vega/hooks/use-mobile\"\nimport { Badge } from \"@/registry/base-vega/ui/badge\"\nimport { Button } from \"@/registry/base-vega/ui/button\"\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n type ChartConfig,\n} from \"@/registry/base-vega/ui/chart\"\nimport { Checkbox } from \"@/registry/base-vega/ui/checkbox\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-vega/ui/drawer\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@/registry/base-vega/ui/dropdown-menu\"\nimport { Input } from \"@/registry/base-vega/ui/input\"\nimport { Label } from \"@/registry/base-vega/ui/label\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/registry/base-vega/ui/select\"\nimport { Separator } from \"@/registry/base-vega/ui/separator\"\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/registry/base-vega/ui/table\"\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"@/registry/base-vega/ui/tabs\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport const schema = z.object({\n id: z.number(),\n header: z.string(),\n type: z.string(),\n status: z.string(),\n target: z.string(),\n limit: z.string(),\n reviewer: z.string(),\n})\n\n// Create a separate component for the drag handle\nfunction DragHandle({ id }: { id: number }) {\n const { attributes, listeners } = useSortable({\n id,\n })\n return (\n \n )\n}\nconst columns: ColumnDef>[] = [\n {\n id: \"drag\",\n header: () => null,\n cell: ({ row }) => ,\n },\n {\n id: \"select\",\n header: ({ table }) => (\n
\n Showing total visitors for the last 6 months. This is just\n some random text to test the layout. It spans multiple lines\n and should wrap around.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed\n do eiusmod tempor incididunt ut labore et dolore magna\n aliqua. Ut enim ad minim veniam, quis nostrud exercitation\n ullamco laboris nisi ut aliquip ex ea commodo consequat.\n Duis aute irure dolor in reprehenderit in voluptate velit\n esse cillum dolore eu fugiat nulla pariatur. Excepteur sint\n occaecat cupidatat non proident, sunt in culpa qui officia\n deserunt mollit anim id est laborum.\n
\n Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do\n eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut\n enim ad minim veniam, quis nostrud exercitation ullamco laboris\n nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor\n in reprehenderit in voluptate velit esse cillum dolore eu fugiat\n nulla pariatur. Excepteur sint occaecat cupidatat non proident,\n sunt in culpa qui officia deserunt mollit anim id est laborum.\n
\n ))}\n
\n \n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-vega/components/example\"\nimport { Button } from \"@/registry/base-vega/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-vega/ui/drawer\"\n\nconst PARAGRAPHS = [\n \"Your changes are saved automatically as you type.\",\n \"Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.\",\n \"We use your email address for account notifications and order updates. You can change this anytime from your profile settings.\",\n \"Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.\",\n \"By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.\",\n \"Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.\",\n \"Last updated March 12, 2026.\",\n \"Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.\",\n \"You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.\",\n \"API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.\",\n \"No payment method on file.\",\n \"Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.\",\n]\n\nexport default function DrawerExample() {\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nfunction DrawerDemo() {\n return (\n \n
\n \n }>\n Open Drawer\n \n \n
\n \n
\n \n \n \n }>\n Header\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n
\n \n \n \n }>\n Footer\n \n \n
\n \n
\n \n \n }>\n Cancel\n \n \n \n \n \n }>\n Header and Footer\n \n \n \n Edit profile\n \n Make changes to your profile here. Click save when you're\n done.\n \n \n
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
\n \n \n \n \n \n \n \n \n )\n}\n",
+ "content": "\"use client\"\n\nimport { toast } from \"sonner\"\n\nimport {\n Example,\n ExampleWrapper,\n} from \"@/registry/base-vega/components/example\"\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"@/registry/base-vega/ui/accordion\"\nimport { Button } from \"@/registry/base-vega/ui/button\"\nimport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@/registry/base-vega/ui/drawer\"\nimport {\n Marker,\n MarkerContent,\n MarkerIcon,\n} from \"@/registry/base-vega/ui/marker\"\nimport { Spinner } from \"@/registry/base-vega/ui/spinner\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nexport default function MarkerExamples() {\n return (\n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerExample() {\n return (\n \n \n A default marker\n \n \n \n \n \n Marker with icon\n \n \n \n \n \n Marker with a spinner\n \n \n \n \n \n \n Marker with shimmer effect\n \n \n \n Thinking...\n \n }>\n \n \n \n Marker as a link\n \n toast(\"You clicked the button\")}\n className=\"transition-colors hover:text-foreground\"\n />\n }\n >\n \n \n \n \n
Marker as a button
\n \n \n \n \n \n \n \n \n \n Rhea joined the chat\n \n \n \n Olivia Rose left the chat\n \n \n \n \n \n \n Marker with icon at the top\n \n \n )\n}\n\nfunction MarkerBorder() {\n return (\n \n \n \n \n \n Switched to release-candidate\n \n \n \n \n \n Reviewed 8 related files\n \n \n \n \n \n Opened implementation notes\n \n \n )\n}\n\nfunction MarkerSeparator() {\n return (\n \n \n Worked for 42s\n \n \n \n \n \n Compacting conversation\n \n \n Reading 4 files\n \n \n \n \n \n Conversation compacted\n \n \n \n With a link to learn more\n \n \n \n \n \n \n \n \n )\n}\n\nfunction MarkerAccordion() {\n return (\n \n \n \n \n \n \n \n \n Worked for 42s\n \n \n \n
\n The user asked for a list of all the files in the current\n directory. The assistant responded with a list of all the files in\n the current directory.\n
-
-
-
+ }>Done
diff --git a/apps/v4/registry/bases/base/examples/drawer-example.tsx b/apps/v4/registry/bases/base/examples/drawer-example.tsx
index f6bd63ee7c..1312d87d80 100644
--- a/apps/v4/registry/bases/base/examples/drawer-example.tsx
+++ b/apps/v4/registry/bases/base/examples/drawer-example.tsx
@@ -16,61 +16,292 @@ import {
DrawerTrigger,
} from "@/registry/bases/base/ui/drawer"
+const PARAGRAPHS = [
+ "Your changes are saved automatically as you type.",
+ "Delivery usually takes three to five business days, depending on your location and the shipping method you selected at checkout.",
+ "We use your email address for account notifications and order updates. You can change this anytime from your profile settings.",
+ "Two-factor authentication adds an extra layer of security to your account. When enabled, you'll need to enter a code from your authenticator app in addition to your password. We recommend enabling it if you store payment methods or sensitive information.",
+ "By continuing, you agree to our Terms of Service and Privacy Policy. We collect usage data to improve the product, personalize your experience, and troubleshoot issues. You can export or delete your data at any time from the account settings page. Third-party integrations may have their own policies, and you should review them before connecting external services.",
+ "Refunds are processed within five to ten business days after we receive your return. Items must be unused and in their original packaging to qualify. Shipping costs are non-refundable unless the return is due to our error or a defective product. Once approved, the refund is issued to your original payment method; credit card refunds may take an additional billing cycle to appear on your statement. If you paid with store credit, the balance is restored to your account immediately. Contact support if you haven't received your refund after two weeks.",
+ "Last updated March 12, 2026.",
+ "Upgrade to Pro for unlimited projects, priority support, and advanced analytics. Cancel anytime from billing settings.",
+ "You haven't verified your email yet. Check your inbox for a confirmation link—we sent it when you signed up. The link expires after 24 hours, but you can request a new one below.",
+ "API requests are rate-limited to 1,000 calls per hour on the free plan. Exceeding the limit returns a 429 response with a Retry-After header. Upgrade to a paid plan for higher limits and dedicated support. Webhook deliveries are retried up to three times with exponential backoff if your endpoint returns a non-2xx status.",
+ "No payment method on file.",
+ "Our design team rebuilt the checkout flow last quarter after interviews with forty-two customers. The biggest friction point was surprise fees at the final step, so we moved shipping and tax estimates earlier in the process. Early tests show a twelve percent drop in cart abandonment. We're still rolling out the update region by region, and you may see the old flow until your account is migrated.",
+]
+
export default function DrawerExample() {
return (
-
-
+
+
+
+
+
+
+
+
)
}
-const DRAWER_SIDES = ["top", "right", "bottom", "left"] as const
-
-function DrawerWithSides() {
+function DrawerDemo() {
return (
-
+
+
+
+ }>
+ Open Drawer
+
+
+
+
+
+
+
+
+ }>
+ Header
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're
+ done.
+
+
+
+
+
+
+
+
+ }>
+ Footer
+
+
+
+
+
+
+
+ }>
+ Cancel
+
+
+
+
+
+ }>
+ Header and Footer
+
+
+
+ Edit profile
+
+ Make changes to your profile here. Click save when you're
+ done.
+
+
+
- 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.
- 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.
-
- 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. 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.
-
- ))}
+
+
-
-
-
+ }>
+ Close
diff --git a/apps/v4/registry/bases/base/examples/marker-example.tsx b/apps/v4/registry/bases/base/examples/marker-example.tsx
index cc83fa3e61..d9eb82ae1e 100644
--- a/apps/v4/registry/bases/base/examples/marker-example.tsx
+++ b/apps/v4/registry/bases/base/examples/marker-example.tsx
@@ -281,20 +281,18 @@ function MarkerAccordion() {
function MarkerDrawer() {
return (
-
+
-
-
+ }>
+
+ Explored 4 files
@@ -319,8 +317,8 @@ function MarkerDrawer() {