- Accordion
- Alert
- Alert Dialog
- Autocomplete
- Auth Surface
- Avatar
- Badge
- Browse Catalog Dialog
- Button
- Card
- Checkbox
- Checkbox Group
- Collapsible
- Combobox
- Command
- Connector Setup Dialog
- Cookie Banner
- Dialog
- Directory Card
- Directory Detail
- Directory Skeleton
- DrawerНовое
- Token Parts Input
- Empty
- Field
- Fieldset
- File Preview Modal
- File Preview Skeleton
- Form
- Frame
- Group
- Icon
- Input
- Input Group
- Kbd
- Label
- Legal Shell
- Menu
- Mermaid Diagram
- Mind Map Diagram
- Not Found Screen
- Onboarding Frame
- Popover
- PDF Thumbnail
- Personalization Landing
- Preview Card
- Pricing Page
- Progress
- Radio Group
- Ring Spinner
- Scroll Area
- Select
- Separator
- Settings Page
- Settings Skills
- Settings Connectors
- Settings Capabilities
- Settings Usage
- Settings Account
- Settings Billing
- Sheet
- Sidebar
- Skeleton
- Skill Create Dialog
- Slider
- Spinner
- Stat
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Tooltip
- Компоненты AI
- Chat Conversation
- Chat Message
- Chat Response
- Chat Suggestion
- Chat Prompt Input
- Slash Highlighted Textarea
- Chat Search Dialog
- Chat Skill Doc
- Chat Connector Detail
- Chat Attachments
- Chat File Card
- Chat Token Chip
- Chat Code Block
- Chat Image
- Chat Inline Citation
- Chat Sources
- Chat Web Search
- Chat Research
- Chat Source
- Chat Actions
- Chat Context
- Chat Loader
- Chat Compaction
- Chat Timeline
- Chat Snippet
- Chat Terminal
- Chat Stack Trace
- Chat Test Results
- Chat File Tree
- Chat Environment Variables
- Chat Audio Player
- Chat Transcription
- Chat Speech Input
- Chat Mic Selector
- Chat Voice Selector
- Chat Agent
- Chat Persona
- Chat Connection
- Chat Connector Suggestion
- Chat Queue
- Chat Checkpoint
- Chat Confirmation
- Chat Artifact
- Chat JSX Preview
- Chat Schema Display
- Chat Package Info
- Chat Commit
- Chat Plan
- Chat Open In Chat
- Chat Sandbox
- Chat Model Selector
- Chat Canvas
- Chat Node
- Chat Edge
Scroll Area
Нативный контейнер прокрутки с кастомными полосами прокрутки.
Теги
import { ScrollArea } from "@/components/ui/scroll-area";
const tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-alpha.${i}`);
export default function Particle() {
return (
<ScrollArea className="h-64 rounded-lg border">
<div className="px-4 py-2">
<h4 className="mb-2 font-medium text-sm">Теги</h4>
<div className="flex flex-col gap-1">
{tags.map((tag) => (
<div className="text-sm" key={tag}>
{tag}
</div>
))}
</div>
</div>
</ScrollArea>
);
}
Установка
pnpm dlx shadcn@latest add @oracul/scroll-area
Использование
import { ScrollArea } from "@/components/ui/scroll-area"<ScrollArea className="h-64 rounded-md border">
<div className="p-4">
Just as suddenly as it had begun, the sensation stopped, leaving Alice
feeling slightly disoriented. She looked around and realized that the room
hadn't changed at all - it was she who had grown smaller, shrinking down to
a fraction of her previous size. Alice felt herself growing larger and
larger, filling up the entire room until she feared she might burst. The
sensation was both thrilling and terrifying, as if she were expanding beyond
the confines of her own body. She wondered if this was what it felt like to
be a balloon, swelling with air until it could hold no more.
</div>
</ScrollArea>API
ScrollArea
Корневой компонент. Стилизованная обёртка над ScrollArea.Root из Base UI с кастомным оформлением полосы прокрутки.
| Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
scrollFade | boolean | false | Маскирует края области просмотра, чтобы содержимое плавно появлялось и исчезало при прокрутке |
scrollbarGutter | boolean | false | Резервирует место под полосу прокрутки, чтобы избежать сдвигов раскладки |
ScrollAreaViewport
Контейнер прокручиваемой области просмотра. Стилизованная обёртка над ScrollArea.Viewport из Base UI.
ScrollAreaScrollbar
Дорожка полосы прокрутки. Стилизованная обёртка над ScrollArea.Scrollbar из Base UI.
ScrollAreaThumb
Ползунок полосы прокрутки. Стилизованная обёртка над ScrollArea.Thumb из Base UI.
ScrollAreaCorner
Угловой элемент, когда видны обе полосы прокрутки. Псевдоним для ScrollArea.Corner из Base UI.
Примеры
Затухание при прокрутке
Используйте scrollFade, чтобы маскировать края области просмотра, благодаря чему содержимое плавно появляется и исчезает при прокрутке, намекая на наличие дополнительного содержимого без добавления лишних элементов интерфейса.
Теги
import { ScrollArea } from "@/components/ui/scroll-area";
const tags = Array.from({ length: 50 }, (_, i) => `v1.0.0-alpha.${i}`);
export default function Particle() {
return (
<ScrollArea className="h-64 rounded-lg border" scrollFade>
<div className="px-4 py-2">
<h4 className="mb-2 font-medium text-sm">Теги</h4>
<div className="flex flex-col gap-1">
{tags.map((tag) => (
<div className="text-sm" key={tag}>
{tag}
</div>
))}
</div>
</div>
</ScrollArea>
);
}
Горизонтальная прокрутка
import { ScrollArea } from "@/components/ui/scroll-area";
export default function Particle() {
return (
<ScrollArea className="max-w-96 rounded-lg border">
<div className="flex w-max gap-4 p-4">
{Array.from({ length: 20 }).map((_, i) => (
<div
className="flex h-20 w-32 shrink-0 items-center justify-center rounded-md bg-muted"
key={String(i)}
>
<span className="font-medium text-sm">Элемент {i + 1}</span>
</div>
))}
</div>
</ScrollArea>
);
}
Зазор для полосы прокрутки
Включите scrollbarGutter, чтобы зарезервировать место под полосу прокрутки при появлении переполнения, предотвращая сдвиги раскладки при отображении или скрытии полосы.
import { ScrollArea } from "@/components/ui/scroll-area";
export default function Particle() {
return (
<ScrollArea className="max-w-96 rounded-lg border" scrollbarGutter>
<div className="flex w-max gap-4 p-4">
{Array.from({ length: 20 }).map((_, i) => (
<div
className="flex h-20 w-32 shrink-0 items-center justify-center rounded-md bg-muted"
key={String(i)}
>
<span className="font-medium text-sm">Элемент {i + 1}</span>
</div>
))}
</div>
</ScrollArea>
);
}
Обе полосы прокрутки
Так же внезапно, как и началось, странное ощущение прекратилось, оставив Алису слегка растерянной. Она огляделась и поняла, что комната ничуть не изменилась — это она сама стала меньше, сжавшись до крошечной доли своего прежнего роста. Затем Алиса почувствовала, что растёт всё больше и больше, заполняя собой всю комнату, и испугалась, что вот-вот лопнет. Ощущение было одновременно восхитительным и пугающим, словно она раздувалась за пределы собственного тела. Алиса подумала, не так ли чувствует себя воздушный шар, который наполняют воздухом, пока он уже не в силах вместить больше. Она вгляделась в зеркало, и отражение смотрело на неё с лукавым выражением. Алиса задумалась, каково это — шагнуть сквозь стекло в потусторонний мир, где всё перевёрнуто вверх дном и ничто не таково, каким кажется. Нет смысла возвращаться во вчера, ведь тогда я была совсем другим человеком, размышляла Алиса.
import { ScrollArea } from "@/components/ui/scroll-area";
export default function Particle() {
return (
<ScrollArea className="h-80 max-w-80 rounded-lg border">
<p className="min-w-100 p-4">
Так же внезапно, как и началось, странное ощущение прекратилось, оставив
Алису слегка растерянной. Она огляделась и поняла, что комната ничуть не
изменилась — это она сама стала меньше, сжавшись до крошечной доли
своего прежнего роста. Затем Алиса почувствовала, что растёт всё больше
и больше, заполняя собой всю комнату, и испугалась, что вот-вот лопнет.
Ощущение было одновременно восхитительным и пугающим, словно она
раздувалась за пределы собственного тела. Алиса подумала, не так ли
чувствует себя воздушный шар, который наполняют воздухом, пока он уже не
в силах вместить больше. Она вгляделась в зеркало, и отражение смотрело
на неё с лукавым выражением. Алиса задумалась, каково это — шагнуть
сквозь стекло в потусторонний мир, где всё перевёрнуто вверх дном и
ничто не таково, каким кажется. Нет смысла возвращаться во вчера, ведь
тогда я была совсем другим человеком, размышляла Алиса.
</p>
</ScrollArea>
);
}