)
}
```
### Both Scrollbars
```tsx
import {
ScrollAreaContent,
ScrollAreaCorner,
ScrollAreaRoot,
ScrollAreaScrollbar,
ScrollAreaThumb,
ScrollAreaViewport,
} from '@lglab/compose-ui'
export default function BothScrollbarsExample() {
return (
{Array.from({ length: 20 }).map((_, i) => (
{i + 1}. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam
euismod, nisi vel consectetur interdum, nisl nunc egestas nunc, vel
consectetur nisl nunc egestas nunc.
))}
)
}
```
## Resources
- [Base UI Scroll Area Documentation](https://base-ui.com/react/components/scroll-area)
- [API Reference](https://base-ui.com/react/components/scroll-area#api-reference)
---
# Progress
The progressbar range widget indicates that a request has been received and the application is making progress toward completing the requested action.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { ProgressRoot, ProgressTrack, ProgressIndicator, ProgressValue, ProgressLabel } from '@lglab/compose-ui'
```
## Examples
### Basic
```tsx
import {
ProgressIndicator,
ProgressLabel,
ProgressRoot,
ProgressTrack,
ProgressValue,
} from '@lglab/compose-ui'
import * as React from 'react'
export default function BasicExample() {
const [value, setValue] = React.useState(20)
React.useEffect(() => {
const interval = setInterval(() => {
setValue((current) => Math.min(100, Math.round(current + Math.random() * 25)))
}, 1000)
return () => clearInterval(interval)
}, [])
return (
)
}
```
### Custom Format
```tsx
import {
MeterIndicator,
MeterLabel,
MeterRoot,
MeterTrack,
MeterValue,
} from '@lglab/compose-ui'
export default function CustomFormatExample() {
return (
Budget Used
Rating
`${value}% complete`}
>
Progress
)
}
```
## Resources
- [Base UI Meter Documentation](https://base-ui.com/react/components/meter)
- [API Reference](https://base-ui.com/react/components/meter#api-reference)
---
# Drawer
A panel that slides in from the edge of the screen, commonly used for navigation, filters, or supplementary content.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { DrawerRoot, DrawerTrigger, DrawerPortal, DrawerBackdrop, DrawerPopup, DrawerTitle, DrawerDescription, DrawerClose, DrawerHeader, DrawerContent, DrawerFooter } from '@lglab/compose-ui'
```
## Examples
### Basic
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
export default function BasicExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
Close
)
}
```
### Sides
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
const sides = ['top', 'right', 'bottom', 'left'] as const
export default function SidesExample() {
return (
{sides.map((side) => (
{side}{side} Drawer
This drawer slides in from the {side}.
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
Close
))}
)
}
```
### Custom size
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
export default function SizeExample() {
return (
Open DrawerCustom SizeLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
Close
)
}
```
### Close button
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
import { X } from 'lucide-react'
export default function CloseButtonExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
)
}
```
### Scrollable
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
import {
ScrollAreaContent,
ScrollAreaRoot,
ScrollAreaScrollbar,
ScrollAreaThumb,
ScrollAreaViewport,
} from '@lglab/compose-ui'
export default function ScrollableExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
{Array.from({ length: 20 }).map((_, i) => (
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit.
Nulla bibendum est aliquam mauris laoreet interdum.
))}
Close
)
}
```
### Controlled
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
} from '@lglab/compose-ui'
import { Button } from '@lglab/compose-ui'
import { SlidersHorizontal } from 'lucide-react'
import { useState } from 'react'
export default function ControlledExample() {
const [open, setOpen] = useState(false)
return (
<>
DrawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
Close
>
)
}
```
### Nested
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
export default function NestedExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
CloseNested drawerNested drawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit.
Nulla bibendum est aliquam mauris laoreet interdum.
Close
)
}
```
### Footer
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
import { Button } from '@lglab/compose-ui'
export default function FooterExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit. Nulla
bibendum est aliquam mauris laoreet interdum.
Cancel
)
}
```
## Resources
- [Base UI Drawer Documentation](https://base-ui.com/react/components/drawer)
- [API Reference](https://base-ui.com/react/components/drawer#api-reference)
---
# Dialog
A popup that opens on top of the entire page with a backdrop, commonly used for confirmations, forms, and important messages.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { DialogRoot, DialogTrigger, DialogPortal, DialogBackdrop, DialogPopup, DialogTitle, DialogDescription, DialogClose, DialogHeader, DialogFooter } from '@lglab/compose-ui'
```
## Examples
### Basic
```tsx
import {
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger,
} from '@lglab/compose-ui'
export default function BasicExample() {
return (
Open DialogNotificationsYou are all caught up. Good job!Close
)
}
```
### Trigger Variants
```tsx
import {
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger,
} from '@lglab/compose-ui'
export default function VariantsExample() {
return (
DefaultDefault VariantTriggered with default button style.CloseSecondarySecondary Variant
Triggered with secondary button style.
CloseOutlineOutline VariantTriggered with outline button style.CloseGhostGhost VariantTriggered with ghost button style.Close
SmallSmall Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
CloseDefaultDefault Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
CloseLargeLarge Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
CloseExtra LargeExtra Large Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
CloseFull ScreenFull Screen Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
Nam sed enim a eros eleifend accumsan. Morbi ac risus enim. Praesent in ante
euismod, laoreet nisl quis, maximus nisl. Maecenas congue placerat aliquet.
Praesent sit amet orci sed purus volutpat viverra vel vitae quam. Nulla a
varius lectus. Aenean in facilisis justo.
CloseCustomCustom Size
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
Close
)
}
```
### With Form
```tsx
import {
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger,
} from '@lglab/compose-ui'
import { MailIcon } from 'lucide-react'
import * as React from 'react'
export default function FormDialogExample() {
const [open, setOpen] = React.useState(false)
return (
Contact Us
Send a Message
Fill out the form below and we'll get back to you as soon as possible.
)
}
```
### Destructive Action
```tsx
import {
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger,
} from '@lglab/compose-ui'
import { Trash2Icon } from 'lucide-react'
export default function DestructiveExample() {
return (
Delete Account
Delete Account
Are you sure you want to delete your account? This action cannot be undone
and all your data will be permanently removed.
Cancel
Delete
)
}
```
### Scrollable
```tsx
import {
DrawerBackdrop,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerPopup,
DrawerPortal,
DrawerRoot,
DrawerTitle,
DrawerTrigger,
} from '@lglab/compose-ui'
import {
ScrollAreaContent,
ScrollAreaRoot,
ScrollAreaScrollbar,
ScrollAreaThumb,
ScrollAreaViewport,
} from '@lglab/compose-ui'
export default function ScrollableExample() {
return (
Open DrawerDrawerLorem ipsum dolor sit amet
{Array.from({ length: 20 }).map((_, i) => (
Curabitur non dui rhoncus, cursus turpis fermentum, cursus elit.
Nulla bibendum est aliquam mauris laoreet interdum.
))}
Close
)
}
```
### Controlled
```tsx
import {
Button,
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogHeader,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
} from '@lglab/compose-ui'
import { SettingsIcon } from 'lucide-react'
import * as React from 'react'
export default function ControlledDialogExample() {
const [open, setOpen] = React.useState(false)
return (
<>
Settings
Manage your account settings and preferences.
Email Notifications
Receive email updates about your account
Marketing Emails
Receive emails about new features and offers
CancelSave Changes
>
)
}
```
### Nested
```tsx
import {
DialogBackdrop,
DialogClose,
DialogDescription,
DialogFooter,
DialogPopup,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger,
} from '@lglab/compose-ui'
export default function NestedExample() {
return (
Open DialogNotifications
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam, quos.
Nested DialogNested Dialog
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam,
quos.
CloseClose
)
}
```
## Resources
- [Base UI Dialog Documentation](https://base-ui.com/react/components/dialog)
- [API Reference](https://base-ui.com/react/components/dialog#api-reference)
---
# Button
A versatile button component with multiple variants, sizes, and states including loading indicators.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { Button } from '@lglab/compose-ui'
```
## Examples
### Default
```tsx
import { Button } from '@lglab/compose-ui'
import { TrashIcon } from 'lucide-react'
export default function DefaultExample() {
return (
)
}
```
### Secondary
```tsx
import { Button } from '@lglab/compose-ui'
import { TrashIcon } from 'lucide-react'
export default function SecondaryExample() {
return (
)
}
```
### Outline
```tsx
import { Button } from '@lglab/compose-ui'
import { TrashIcon } from 'lucide-react'
export default function OutlineExample() {
return (
)
}
```
### Destructive
```tsx
import { Button } from '@lglab/compose-ui'
import { TrashIcon } from 'lucide-react'
export default function DestructiveExample() {
return (
)
}
```
### Ghost
```tsx
import { Button } from '@lglab/compose-ui'
import { TrashIcon } from 'lucide-react'
export default function GhostExample() {
return (
)
}
```
### As Link
```tsx
import { Button } from '@lglab/compose-ui'
import { Github } from 'lucide-react'
import Link from 'next/link'
export default function AsLinkExample() {
return (
)
}
```
## Resources
- [Base UI Button Documentation](https://base-ui.com/react/components/button)
- [API Reference](https://base-ui.com/react/components/button#api-reference)
---
# Avatar
An easily stylable avatar component for displaying user profile pictures, initials, or fallback content.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { AvatarRoot, AvatarImage, AvatarFallback, AvatarStack } from '@lglab/compose-ui'
```
## Examples
### Basic
```tsx
import { AvatarFallback, AvatarImage, AvatarRoot } from '@lglab/compose-ui'
export default function BasicExample() {
return (
Delete item?
This action cannot be undone. This will permanently delete the item.
CancelDelete
)
}
```
### Controlled mode with multiple triggers
```tsx
import {
AlertDialog,
AlertDialogBackdrop,
AlertDialogClose,
AlertDialogDescription,
AlertDialogPopup,
AlertDialogPortal,
AlertDialogRoot,
AlertDialogTitle,
AlertDialogTrigger,
} from '@lglab/compose-ui'
import * as React from 'react'
const demoAlertDialog = AlertDialog.createHandle<{ itemName: string }>()
export default function ControlledMultipleExample() {
const [open, setOpen] = React.useState(false)
return (
<>
Delete Item 1
Delete Item 2
Delete Item 3
{({ payload: currentPayload }) => {
const payload = currentPayload as { itemName: string } | undefined
return (
Delete item?
{payload && 'itemName' in payload
? `Are you sure you want to delete ${payload.itemName}? This action cannot be undone.`
: 'This action cannot be undone. This will permanently delete the item.'}
CancelDelete
)
}}
>
)
}
```
## Resources
- [Base UI Alert Dialog Documentation](https://base-ui.com/react/components/alert-dialog)
- [API Reference](https://base-ui.com/react/components/alert-dialog#api-reference)
---
# Accordion
A set of collapsible panels with headings.
## Installation
```bash
npm install @lglab/compose-ui
```
## Import
```tsx
import { AccordionRoot, AccordionItem, AccordionHeader, AccordionTrigger, AccordionPanel } from '@lglab/compose-ui'
```
## Examples
### Basic
```tsx
import {
AccordionHeader,
AccordionItem,
AccordionPanel,
AccordionRoot,
AccordionTrigger,
} from '@lglab/compose-ui'
import { ChevronDown } from 'lucide-react'
const items = [
{
title: 'What is Compose UI?',
content:
'Compose UI is a collection of accessible React components built with Base UI and Tailwind CSS, ready to use in your design systems and web apps.',
},
{
title: 'How do I get started?',
content:
'Head to the "Quick start" guide in the docs. Install the package and start using components right away.',
},
{
title: 'Can I use it for my project?',
content: 'Of course! Compose UI is free and open source.',
},
]
export default function BasicExample() {
return (
{items.map((item) => (
{item.title}
{item.content}
))}
)
}
```
### Icon
```tsx
import {
AccordionHeader,
AccordionItem,
AccordionPanel,
AccordionRoot,
AccordionTrigger,
} from '@lglab/compose-ui'
import { Plus } from 'lucide-react'
const items = [
{
title: 'What is Compose UI?',
content:
'Compose UI is a collection of accessible React components built with Base UI and Tailwind CSS, ready to use in your design systems and web apps.',
},
{
title: 'How do I get started?',
content:
'Head to the "Quick start" guide in the docs. Install the package and start using components right away.',
},
{
title: 'Can I use it for my project?',
content: 'Of course! Compose UI is free and open source.',
},
]
export default function BasicExample() {
return (
{items.map((item) => (
{item.title}
{item.content}
))}
)
}
```
### Multiple
```tsx
import {
AccordionHeader,
AccordionItem,
AccordionPanel,
AccordionRoot,
AccordionTrigger,
} from '@lglab/compose-ui'
import { ChevronDown } from 'lucide-react'
const items = [
{
title: 'Installation',
content:
'Install Compose UI using your preferred package manager: npm, pnpm, yarn, or bun.',
},
{
title: 'Styling',
content:
'Import the default styles and register Compose UI as a Tailwind source in your main CSS file.',
},
{
title: 'Usage',
content:
'Import components directly from the package and start using them in your React application.',
},
{
title: 'Customization',
content:
'Override the default theme by setting CSS variables. All components accept className props for additional styling.',
},
]
export default function MultipleExample() {
return (
{items.map((item) => (
{item.title}