Stack
The built-in stack tag — a flex column that stacks its children vertically with a consistent gap. Usage, options (justify, align, gap), and live examples.
{% stack %} stacks its children in a vertical column with a
consistent gap — the column counterpart to
{% group %}. It is a flex column: control
where children sit along the column (justify), how they line up across it (align), and the
space between them (gap). By default align is stretch, so children fill the width. The
block body is the content.
Use it as {% stack %} in Markdown, or call it from Python logic (loops,
snippets) via component('aardvark', 'stack', …).
Basic column
With no options, children stretch to the full width and stack with the default md gap.
{% stack %}
{% button text='Top' %}
{% button text='Middle' %}
{% button text='Bottom' %}
{% endStack %}
component('aardvark', 'stack', children=(
component('aardvark', 'button', text='Top')
+ component('aardvark', 'button', text='Middle')
+ component('aardvark', 'button', text='Bottom')
))
Align (cross axis)
align sets align-items — how children line up across the column. The default is stretch
(children fill the width); use center, flex-start, or flex-end to size children to their
content and position them.
{% stack align='center' %}
{% badge %}One{% endBadge %}
{% badge %}Two{% endBadge %}
{% badge %}Three{% endBadge %}
{% endStack %}
component('aardvark', 'stack', align='center', children=(
component('aardvark', 'badge', children='One')
+ component('aardvark', 'badge', children='Two')
+ component('aardvark', 'badge', children='Three')
))
Justify (main axis)
justify sets justify-content — where children sit along the column when the stack is taller
than its content. The default is flex-start; center, flex-end, and space-between need a
fixed height (h) to have a visible effect.
{% stack justify='space-between' h=160 align='center' %}
{% badge %}First{% endBadge %}
{% badge %}Last{% endBadge %}
{% endStack %}
component('aardvark', 'stack', justify='space-between', h=160, align='center', children=(
component('aardvark', 'badge', children='First')
+ component('aardvark', 'badge', children='Last')
))
Gap
gap is the space between children — a Mantine size token (xs–xl) or any CSS value
(4px, 2rem). The default is md.
{% stack gap='xs' align='center' %}
{% badge %}One{% endBadge %}
{% badge %}Two{% endBadge %}
{% badge %}Three{% endBadge %}
{% endStack %}
component('aardvark', 'stack', gap='xs', align='center', children=(
component('aardvark', 'badge', children='One')
+ component('aardvark', 'badge', children='Two')
+ component('aardvark', 'badge', children='Three')
))
With other components
stack composes with any other tag. Here it stacks a heading badge above a
group of action buttons.
{% stack gap='sm' %}
{% badge size='lg' color='grape' %}Project settings{% endBadge %}
{% group %}
{% button text='Save' %} {% button text='Cancel' variant='default' %}
{% endGroup %}
{% endStack %}
component('aardvark', 'stack', gap='sm', children=(
component('aardvark', 'badge', size='lg', color='grape', children='Project settings')
+ component('aardvark', 'group', children=(
component('aardvark', 'button', text='Save')
+ component('aardvark', 'button', text='Cancel', variant='default')
))
))
Attributes
| Attribute | Valid values | Description |
|---|---|---|
justify |
flex-start (default), center, flex-end, space-between, space-around, space-evenly |
justify-content for the column — where children sit on the main axis (needs a fixed height to show). |
align |
stretch (default), center, flex-start, flex-end |
align-items — how children line up on the cross axis. |
gap |
xs, sm, md (default), lg, xl, or any CSS value |
Space between children. |
m, mt, mb, ml, mr, mx, my |
Mantine size token or any CSS value | Margin (all sides / top / bottom / left / right / horizontal / vertical). |
p, pt, pb, pl, pr, px, py |
Mantine size token or any CSS value | Padding (all sides / top / bottom / left / right / horizontal / vertical). |
bg |
color name or CSS color | Background color. |
c |
color name or CSS color | Text color. |
w, h |
Mantine size token or any CSS value | Width / height. |
miw, mih, maw, mah |
any CSS value | Min/max width and min/max height. |
attr={...} forwards raw HTML attributes onto the rendered element.
Good to know
justifyneeds somewhere to distribute: a stack is exactly as tall as its children unless you give it anh(ormih), socenter,flex-end, andspace-betweenlook identical to the default until you do — the example above setsh=160for that reason.- Because
aligndefaults tostretch, children fill the column’s width — buttons and papers come out full-width. Setalign='center'(orflex-start) to let them size to their own content. - Each tag in the body becomes its own child, one line after another — but consecutive lines of
plain text are a single paragraph and stack as one child. Separate text items with a blank line
if each should be spaced by
gap.
CSS Selectors
Each stack carries data-aardvark-island="Stack" on its wrapper, and Mantine exposes its parts as mantine-Stack-* classes — target either to style it from your theme CSS.
[data-aardvark-island="Stack"] {
/* style every stack on the page */
}
.mantine-Stack-root {
/* the root part */
}
Injecting Attributes
attr={…} forwards raw HTML attributes (including event handlers) straight onto the rendered element.
{% stack attr={'onclick': '''
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''} %}
{% badge %}one{% endBadge %} {% badge %}two{% endBadge %}
{% endStack %}
component('aardvark', 'stack', attr={'onclick': '''
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''}, children=(
component('aardvark', 'badge', children='one')
+ ' '
+ component('aardvark', 'badge', children='two')
))