Scroll Pane
O ScrollPane é um componente composto que gerencia deslocamentos responsivos em listas que transbordam dentro de um contêiner. Fornece sobreposições de gradiente, setas de navegação opcionais e funcionalidade de deslocamento para um elemento.
import React from "react";
import {
ScrollPane,
Card,
Text,
Button,
IconButton,
Box,
} from "@nimbus-ds/components";
import { ChevronRightIcon, ChevronLeftIcon } from "@nimbus-ds/icons";
const Example: React.FC = () => (
<Box maxWidth="100%">
<ScrollPane
direction="horizontal"
scrollPaneArrowEnd={
<ScrollPane.ArrowHorizontalEnd>
<IconButton source={<ChevronRightIcon />} />
</ScrollPane.ArrowHorizontalEnd>
}
scrollPaneArrowStart={
<ScrollPane.ArrowHorizontalStart>
<IconButton source={<ChevronLeftIcon />} />
</ScrollPane.ArrowHorizontalStart>
}
showArrows
showGradients
showScrollbar
scrollToItemOnClick={false}
>
{Array.from({ length: 10 }).map((_, index) => (
<ScrollPane.Item key={index} padding="2">
<Card padding="base">
<Text fontSize="base" fontWeight="bold">
Card {index + 1}
</Text>
<Text color="neutral-textLow" fontSize="caption">
This is a sample card with some content that demonstrates the
scroll functionality.
</Text>
<Button>Action</Button>
</Card>
</ScrollPane.Item>
))}
</ScrollPane>
</Box>
);
export default Example;
Instale o componente via terminal.
npm install @nimbus-ds/scroll-pane
O componente Scroll Pane permite conter e visualizar conteúdo que excede a altura ou largura disponível de seu contêiner, através de um scroll interno. É ideal para preservar o contexto visual do usuário dentro de um fluxo principal, permitindo o deslocamento isolado de seções específicas sem impactar o layout global da página. A presença de gradientes que suavizam os limites do contêiner ajuda o usuário a perceber que há mais conteúdo disponível.
- Para mostrar conteúdo extenso (múltiplas opções, múltiplos módulos de texto, etc.) dentro de um contêiner limitado, como painéis laterais, modais ou carrosséis de cards.
- Quando é necessário evitar que o scroll principal da página seja afetado por seções com muito conteúdo.
- Para manter elementos chave visíveis (como cabeçalhos ou botões fixos) enquanto o resto do conteúdo se desloca.
- No mobile, para mostrar conteúdo comparativo ou múltiplos módulos de conteúdo em cards.
- Quando todo o conteúdo pode ser mostrado sem necessidade de scroll, especialmente em dispositivos móveis. (Se há 2 ou menos módulos de conteúdo, não usar Scroll Pane).
- Em situações onde múltiplos scrolls na mesma visualização podem gerar confusão ou dificultar a navegação (scrolls aninhados desnecessários).
- Para substituir o scroll natural do navegador em visualizações principais de página.
- Mantém o foco do usuário ao isolar o scroll de certas seções sem desorientá-lo no fluxo global.
- Minimiza a mudança de contexto, permitindo trabalhar sobre conteúdo detalhado sem sair do ambiente principal.
- Reduz telas intermediárias ou modais desnecessários, mostrando mais conteúdo sem interromper a navegação.
- Assegurar navegação com teclado: o usuário deve poder acessar todo o conteúdo com Tab e setas.
- Usar roles ARIA apropriados como aria-label para descrever a área rolável se for relevante para a navegação.
- Não ocultar o foco visual dentro do conteúdo que faz scroll.
- Definir áreas de toque adequadas para scrollbars customizadas no mobile.
O Scroll Pane é composto por:
- Contêiner visível com dimensões definidas.
- Área de conteúdo rolável.
- Scrollbar vertical (nativa ou personalizada).
Dependências
- Pode incluir qualquer componente do Nimbus como Text, Card, Button, etc.
- Recomenda-se que sua implementação esteja dentro de layouts como Modal, Sidebar, ou seções da página.
Variantes
- Com conteúdo simples: texto longo, listas, cards.
- Com scroll automático: ajusta o scroll ao adicionar elementos dinamicamente (como notificações ou mensagens).
✅ Do
- Usar scroll interno para conteúdo longo sem perder o cabeçalho ou botões de ação.
- Combinar com foco automático para melhorar a produtividade.
❌ Don't
- Não aninhar múltiplos Scroll Pane.
- Não ocultar conteúdo importante que não é óbvio que requer scroll.
- Não substituir o scroll nativo se o conteúdo principal pode ser mostrado completo.
Props adicionais são passadas para o elemento <ScrollPane>. Veja a documentação do div para uma lista de props aceitas pelo elemento <ScrollPane>.
ScrollPane
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | The content to be rendered inside the scroll pane | |
showGradients | boolean | 'true' | Whether to show gradient overlays when content overflows |
showArrows | boolean | 'false' | Whether to show navigation arrows for scrolling |
showScrollbar | boolean | 'true' | Whether to show the scrollbar |
direction | 'horizontal' | 'horizontal' | The direction of the scroll (horizontal or vertical) |
scrollToItemOnClick | boolean | 'true' | Whether items should scroll into view when clicked |
scrollPaneArrowStart | React.ReactNode | Custom arrow component to render at the start of the scroll area | |
scrollPaneArrowEnd | React.ReactNode | Custom arrow component to render at the end of the scroll area |
ScrollPane.Item
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | The content to be rendered inside the scroll pane item | |
className | string | Custom class name for styling | |
style | object | Custom inline styles | |
onClick | object | Callback fired when the item is clicked |
ScrollPane.ArrowHorizontalStart
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | Represents all of the things React can render. Where {@link ReactElement} only represents JSX, `ReactNode` represents everything that can be rendered. |
ScrollPane.ArrowHorizontalEnd
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | Represents all of the things React can render. Where {@link ReactElement} only represents JSX, `ReactNode` represents everything that can be rendered. |
ScrollPane.ArrowVerticalStart
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | Represents all of the things React can render. Where {@link ReactElement} only represents JSX, `ReactNode` represents everything that can be rendered. |
ScrollPane.ArrowVerticalEnd
Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | Represents all of the things React can render. Where {@link ReactElement} only represents JSX, `ReactNode` represents everything that can be rendered. |