Accordion
The built-in accordion tag — collapsible sections whose bodies are full Markdown. Usage, options, and a live example with source.
A compound built-in tag for collapsible sections. The parent {% accordion %}
wraps one or more {% accordionSection title="…" %} children; each section’s
title is the clickable control and everything between the section tags is its panel body. That
body is ordinary Markdown — headings, lists, code, links, even nested component(...) calls —
and renders as such. By default one panel is open at a time; add multiple to let several stay open.
Use it as {% accordion %} in Markdown, or call it from Python logic (loops,
snippets) via component('aardvark', 'accordion', …) — nesting component('aardvark', 'accordionSection', …) calls as its children.
Basic accordion
A single-open accordion with two sections. Each panel body is full Markdown.
Markdown content
This builds great!
More Markdown content
- This bulleted list actually renders!
- See?
{% accordion %}
{% accordionSection title="Section One" %}
**Markdown content**
_This builds great!_
{% endAccordionSection %}
{% accordionSection title="Section Two" %}
**More Markdown content**
- This bulleted list actually renders!
- See?
{% endAccordionSection %}
{% endAccordion %}
component('aardvark', 'accordion', children=(
component('aardvark', 'accordionSection', title='Section One',
children='**Markdown content**\n\n_This builds great!_')
+ component('aardvark', 'accordionSection', title='Section Two',
children='**More Markdown content**\n\n- This bulleted list actually renders!\n- See?')
))
Multiple open panels
By default opening one panel closes the others. Add the bare multiple flag to let several stay
open at once. In multiple mode, defaultValue takes a comma-separated list of section values to
open on load (a section’s value defaults to a slug of its title, or set it explicitly).
Run npm install.
Run vark build.
Run npm install.
{% accordion multiple defaultValue="install" %}
{% accordionSection title="Install" value="install" %}
Run `npm install`.
{% endAccordionSection %}
{% accordionSection title="Build" %}
Run `vark build`.
{% endAccordionSection %}
{% endAccordion %}
component('aardvark', 'accordion', multiple=True, defaultValue='install', children=(
component('aardvark', 'accordionSection', title='Install', value='install',
children='Run `npm install`.')
+ component('aardvark', 'accordionSection', title='Build',
children='Run `vark build`.')
))
A single panel open on load
In single-open mode, defaultValue is one section value — the panel to expand on load. Here the
second section is open from the start.
What the tool does, in a sentence.
How to run it, expanded by default.
How to run it, expanded by default.
{% accordion defaultValue="usage" %}
{% accordionSection title="Overview" value="overview" %}
What the tool does, in a sentence.
{% endAccordionSection %}
{% accordionSection title="Usage" value="usage" %}
How to run it, expanded by default.
{% endAccordionSection %}
{% endAccordion %}
component('aardvark', 'accordion', defaultValue='usage', children=(
component('aardvark', 'accordionSection', title='Overview', value='overview',
children='What the tool does, in a sentence.')
+ component('aardvark', 'accordionSection', title='Usage', value='usage',
children='How to run it, expanded by default.')
))
With other components
A panel body is full Markdown, so it can hold any other built-in — here an icon in the title text and a nested card in the body.
Everything you need to build and deploy:
Run vark build and you’re live.
{% accordion %}
{% accordionSection title="What ships in the box" %}
Everything you need to build and deploy:
{% card title="Static output" subtitle="Plain HTML, CSS, and JS — host it anywhere." icon="package" %}{% endCard %}
{% endAccordionSection %}
{% accordionSection title="Get started" %}
Run {% icon 'rocket' %} `vark build` and you're live.
{% endAccordionSection %}
{% endAccordion %}
box = ('Everything you need to build and deploy:\n\n'
+ component('aardvark', 'card', title='Static output',
subtitle='Plain HTML, CSS, and JS — host it anywhere.', icon='package'))
start = 'Run ' + component('aardvark', 'icon', 'rocket') + " `vark build` and you're live."
component('aardvark', 'accordion', children=(
component('aardvark', 'accordionSection', title='What ships in the box', children=box)
+ component('aardvark', 'accordionSection', title='Get started', children=start)
))
Attributes
{% accordion %}
| Attribute | Valid values | Description |
|---|---|---|
multiple |
bare flag (multiple) |
Allow several panels open at once. Off by default (single-open). |
defaultValue |
a section value, or a comma-separated list with multiple |
Panel(s) expanded on load. In single-open mode one value; in multiple mode a comma-separated list ("a,b"). |
The look is fixed to Mantine’s contained variant — there is no author-facing variant.
{% accordionSection %}
| Attribute | Valid values | Description |
|---|---|---|
title |
string | The clickable control label. |
value |
string | Stable id for the panel, used by the parent’s defaultValue. Defaults to a slug of title (deduplicated if two titles collide). |
The body between {% accordionSection %} and
{% endAccordionSection %} is the panel content (full Markdown). In the Python
form it is the children argument.
CSS Selectors
Target the rendered element through its island marker — [data-aardvark-island="Accordion"] — or through the Mantine Styles API classes (.mantine-Accordion-root and its inner parts):
/* Every rendered Accordion carries this island marker */
[data-aardvark-island="Accordion"] { }
/* Mantine Styles API class on the root element */
.mantine-Accordion-root { }
.mantine-Accordion-item { }
.mantine-Accordion-control { }
.mantine-Accordion-panel { }
Injecting Attributes
attr={…} forwards raw HTML attributes — id, data-*, ARIA, analytics hooks — onto the
rendered accordion root. (Scalar attributes beyond the ones it handles — like multiple to
keep several panels open, or a defaultValue — pass straight through to the underlying Mantine
Accordion; attr={…} is the channel for raw HTML attributes.)
A single panel of body text, open by default.
A second panel that can stay open alongside it.
A single panel of body text, open by default.
{% accordion multiple defaultValue="overview" attr={'data-analytics': 'faq', 'aria-label': 'Frequently asked questions'} %}
{% accordionSection title="Overview" %}
A single panel of body text, open by default.
{% endAccordionSection %}
{% accordionSection title="Details" %}
A second panel that can stay open alongside it.
{% endAccordionSection %}
{% endAccordion %}
component('aardvark', 'accordion', multiple=True, defaultValue='overview',
attr={'data-analytics': 'faq', 'aria-label': 'Frequently asked questions'}, children=(
component('aardvark', 'accordionSection', title='Overview', value='overview',
children='A single panel of body text, open by default.')
+ component('aardvark', 'accordionSection', title='Details',
children='A second panel that can stay open alongside it.')
))