# Scroller
`scroller` is a **minimal, low-level scroll container** — a plain overflow box with the
**browser's native scrollbars**, no styled overlay bars and no JavaScript. Give it a fixed
height with `h` (and/or width with `w`) and its content scrolls; `axis` chooses which way. It's
built on [Box](/components/layout/box/) (it just adds an `overflow` style), so it inherits the same
spacing, sizing, and color props. For nicer, styled, auto-hiding overlay scrollbars that look
the same across platforms, use [ScrollArea](/components/layout/scrollarea/) — `scroller` is the
no-frills sibling. Close the block with `{% endScroller %}` (one capital S).
Use it as `{% scroller %}…{% endScroller %}` in Markdown, or call it from
Python logic (loops, snippets) via `component('aardvark', 'scroller', …)`.
## Demonstrations
Give it an `h` so the content can overflow; the block body is the content. By default it scrolls
vertically (`axis='y'`).
**Preview:**
A native-scrolling region — the browser's own scrollbar, no styling applied.
This is deliberately plain: it's just a `Box` with `overflow-y: auto`. If you want a styled,
auto-hiding scrollbar, switch to the `scrollarea` tag.
Keep reading — there's more content here than fits in 140 pixels, so the native scrollbar
appears and you can scroll.
Source: Markdown
```aardvark
{% scroller h='140' p='sm' bg='var(--mantine-color-gray-light)' %}
A native-scrolling region — the browser's own scrollbar, no styling applied.
Add enough text and it scrolls vertically inside the fixed 140px height.
{% endScroller %}
```
Source: Python
```python
component('aardvark', 'scroller',
h='140', p='sm', bg='var(--mantine-color-gray-light)',
children='A native-scrolling region — the browser\'s own scrollbar.')
```
### Horizontal scrolling
`axis='x'` scrolls sideways instead — useful for a wide table or a row of items that shouldn't
wrap. `axis='both'` enables scrolling on both axes.
**Preview:**
onetwothreefourfivesixseveneightnineteneleventwelve
Source: Markdown
```aardvark
{% scroller axis='x' w='100%' p='sm' bg='var(--mantine-color-gray-light)' %}
one…ten
{% endScroller %}
```
Source: Python
```python
row = '' + \
''.join(f'{n}' for n in ['one', 'two', 'three', 'four', 'five']) + \
'
'
component('aardvark', 'scroller', axis='x', w='100%', p='sm', children=row)
```
## With other components
Wrap a stack of [Paper](/components/layout/paper/) surfaces in a fixed-height `scroller` to keep a
long list inside a native-scrolling panel.
**Preview:**
First row
Second row
Third row
Fourth row
Fifth row — scroll for more
Source: Markdown
```aardvark
{% scroller h='140' p='xs' bg='var(--mantine-color-gray-light)' %}
{% paper withBorder=true p='sm' radius='sm' mb='xs' %}First row{% endPaper %}
{% paper withBorder=true p='sm' radius='sm' %}…more rows…{% endPaper %}
{% endScroller %}
```
Source: Python
```python
rows = ''.join(
component('aardvark', 'paper', withBorder=True, p='sm', radius='sm', mb='xs',
children=f'Row {i}')
for i in range(1, 6)
)
component('aardvark', 'scroller', h='140', p='xs', children=rows)
```
## Attributes
Omit any attribute to take its default.
| Attribute | Valid values | Description |
| --- | --- | --- |
| `axis` | `y` (default, vertical) / `x` (horizontal) / `both` | Which way the box scrolls. |
| `h` / `w` | A CSS length, or a bare number (treated as pixels) | Height / width — give it an `h` so the content can overflow. |
| `miw` / `mih` / `maw` / `mah` | A CSS length, or a bare number (treated as pixels) | Min/max width and height. |
| `bg` | A theme color or CSS color | Background color. |
| `m` / `mt` / `mb` / `ml` / `mr` / `mx` / `my` | A Mantine size token or CSS length | Margin (all / top / bottom / left / right / horizontal / vertical). |
| `p` / `pt` / `pb` / `pl` / `pr` / `px` / `py` | A Mantine size token or CSS length | Padding (all / top / bottom / left / right / horizontal / vertical). |
| `attr={…}` | An object of HTML attributes | Forwards raw HTML attributes onto the rendered element. |
## CSS Selectors
Each `scroller` carries `data-aardvark-island="Box"` on its wrapper; it renders a single element with no Mantine Styles API parts, so target the island wrapper.
```css
[data-aardvark-island="Box"] {
/* style every scroller on the page */
}
```
## Injecting Attributes
`attr={…}` forwards raw HTML attributes (including event handlers) straight onto the rendered element.
Lots of content to scroll through.
Source: Markdown
```aardvark
{% scroller h='140' p='sm' bg='var(--mantine-color-gray-light)' attr={'onclick': '''
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''} %}
Lots of content to scroll through.
{% endScroller %}
```
Source: Python
```python
component('aardvark', 'scroller',
h='140', p='sm', bg='var(--mantine-color-gray-light)',
children='Lots of content to scroll through.',
attr={'onclick': '''
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''})
```