# @cloud-ru/ds-scroll
> Контейнер с кастомными скроллбарами, размерами s/m, стратегиями скрытия, автоскролом и опциональным ресайзом.
Docs: /snack-v2/components/scroll/
## Установка
```sh
pnpm add @cloud-ru/ds-scroll
```
## Когда использовать
- Прокручиваемые области внутри интерфейса: боковые панели, чаты, логи, списки, таблицы в карточках.
- Контент с динамической высотой, где нужно прилипание к низу (чат, live-лог) — через `autoscrollTo='bottom'`.
- Контейнер, размер которого пользователь регулирует сам — через `resize='both' | 'horizontal' | 'vertical'`.
Когда **не** использовать:
- На весь `
` — нативный скролл окна лучше для SEO, клавиатуры и системных жестов.
- Внутри виртуализированных списков — они уже управляют своим скроллом.
- Для коротких блоков, которые гарантированно помещаются — лишний контейнер и JS без выгоды.
## API
### Scroll
| Prop | Type | Default | Required | Description |
|------|------|---------|----------|-------------|
| `autoscrollTo` | `bottom \| right` | — | no | Включает автоскрол при маунте и изменении размера контента:
- `bottom` - автоскрол вниз,
- `right` - автоскрол вправо, |
| `barHideStrategy` | `leave \| move \| never \| scroll` | `leave` | no | Управление скрытием скролл баров:
- `Never` - показывать всегда
- `Leave` - скрывать когда курсор покидает компонент
- `Scroll` - показывать только когда происходит скроллинг
- `Move` - показывать при движении курсора над компонентом |
| `children` | `string \| number \| boolean \| ReactElement> \| Iterable \| ReactPortal \| null \| undefined` | — | no | |
| `className` | `string` | — | no | |
| `clickScrolling` | `boolean` | `true` | no | Скролить ли по клику в скроллбар. |
| `data-test-id` | `string` | — | no | |
| `onInitialized` | `(() => void)` | — | no | Коллбэк вызывающийся на инициализацию скролла |
| `onScroll` | `((event?: Event) => void)` | — | no | Колбек события скрола. |
| `overflow` | `{ x?: "hidden" \| "scroll" \| "visible" \| "visible-hidden" \| "visible-scroll"; y?: "hidden" \| "scroll" \| "visible" \| "visible-hidden" \| "visible-scroll"; } \| undefined` | — | no | Поведение overflow по осям. По умолчанию OverlayScrollbars выставляет `scroll` на обе оси; если контента по оси быть не должно — передавай `'hidden'`. |
| `paddingAbsolute` | `boolean` | — | no | Должны ли паддинги быть абсолютными |
| `resize` | `both \| horizontal \| none \| vertical` | `none` | no | Настройка возможности регулировать Scroll-контейнер:
- `None` - нельзя изменять размер
- `Horizontal` - можно изменять размер только по горизонтали
- `Vertical` - можно изменять размер только по вертикали
- `Both` - можно изменять размер в обеих координатах |
| `size` | `m \| s` | `m` | no | Размер скролбаров |
| `untouchableScrollbars` | `boolean` | `false` | no | Отключает возможность взаимодействовать со скролбарами мышью. |
#### Related types
- `AutoscrollTo` = `bottom | right`
- `BarHideStrategy` = `leave | move | never | scroll`
- `Resize` = `both | horizontal | none | vertical`
- `Size` = `m | s`
## Примеры
### AutoscrollBottom
```tsx
import { Scroll } from '@cloud-ru/ds-scroll';
export function AutoscrollBottom() {
return (
{Array.from({ length: 40 }, (_, i) => (
Сообщение {i + 1}
))}
);
}
```
### Basic
```tsx
import { Scroll } from '@cloud-ru/ds-scroll';
export function Basic() {
return (
{Array.from({ length: 20 }, (_, i) => (
Строка контента {i + 1}
))}
);
}
```
### HideOnLeave
```tsx
import { Scroll } from '@cloud-ru/ds-scroll';
export function HideOnLeave() {
return (
{Array.from({ length: 20 }, (_, i) => (
Строка {i + 1}
))}
);
}
```
### Resizable
```tsx
import { Scroll } from '@cloud-ru/ds-scroll';
export function Resizable() {
return (
{Array.from({ length: 20 }, (_, i) => (
Контент, который можно ресайзить — {i + 1}
))}
);
}
```
### SmallSize
```tsx
import { Scroll } from '@cloud-ru/ds-scroll';
export function SmallSize() {
return (
{Array.from({ length: 15 }, (_, i) => (
Пункт {i + 1}
))}
);
}
```