# NavLink
A **built-in** tag for a navigation link, built on Mantine's `NavLink`: a `label` with an
optional `description`, a left/right **icon** (any
[`{% icon %}`](/components/data-display/icon/) spec), an `active`
state, a `variant` and `color`, and one level of **nested** sub-links via `items`.
Use it as `{% navlink %}` in Markdown, or call it from Python logic (loops, snippets) via `component('aardvark', 'navlink', …)`.
## Demonstrations
### Label, description, icon, and active
The `label` is required; add a `description` for secondary text and `leftSection` /
`rightSection` for an icon. Set `active=true` to highlight the current link, and `href` to
render it as a real ``.
Source: Markdown
```aardvark
{% navlink label='Dashboard' description='Your overview' leftSection='dashboard' href='/dashboard/' %}
{% navlink label='Active page' leftSection='star' active=true %}
```
Source: Python
```python
component('aardvark', 'navlink', label='Dashboard', description='Your overview', leftSection='dashboard', href='/dashboard/')
component('aardvark', 'navlink', label='Active page', leftSection='star', active=True)
```
### Variants and color
`variant` is `light` (the default), `filled`, or `subtle`; `color` sets the accent for the
active/hover state.
Source: Markdown
```aardvark
{% navlink label='Light' variant='light' active=true %}
{% navlink label='Filled' variant='filled' active=true color='grape' %}
{% navlink label='Subtle' variant='subtle' active=true %}
```
Source: Python
```python
component('aardvark', 'navlink', label='Light', variant='light', active=True)
component('aardvark', 'navlink', label='Filled', variant='filled', active=True, color='grape')
component('aardvark', 'navlink', label='Subtle', variant='subtle', active=True)
```
### Disabled, no-wrap, and right section
`disabled` dims and disables the link; `noWrap` keeps the label on one line; a
`rightSection` icon sits at the trailing edge (handy for a chevron or external-link mark).
Source: Markdown
```aardvark
{% navlink label='Disabled' leftSection='lock' disabled=true %}
{% navlink label='External docs' rightSection='external-link' href='https://mantine.dev' %}
```
Source: Python
```python
component('aardvark', 'navlink', label='Disabled', leftSection='lock', disabled=True)
component('aardvark', 'navlink', label='External docs', rightSection='external-link', href='https://mantine.dev')
```
### Nested sub-links
Pass nested sub-links as a JSON array in `items` — `children` is reserved for the block
body, so the nested data rides its own param. Set `defaultOpened=true` to start the group
expanded and `childrenOffset` to indent it. Nesting goes **one level** deep through the
tag.
Source: Markdown
```aardvark
{% navlink label='Settings' leftSection='settings' childrenOffset=20 defaultOpened=true items='[{"label":"Profile","href":"/profile/","leftSection":"user"},{"label":"Billing","href":"/billing/","leftSection":"credit-card"}]' %}
```
Source: Python
```python
import json
items = json.dumps([
{'label': 'Profile', 'href': '/profile/', 'leftSection': 'user'},
{'label': 'Billing', 'href': '/billing/', 'leftSection': 'credit-card'},
])
component('aardvark', 'navlink', label='Settings', leftSection='settings', childrenOffset=20, defaultOpened=True, items=items)
```
## With other components
Build a navigation column by looping over a list of pages in Python and emitting a
`{% navlink %}` for each, marking the current page `active`. Wrap the
run in a `{% stack %}` for vertical spacing.
Source: Markdown
```aardvark
{% stack gap='xs' %}
{% navlink label='Overview' leftSection='home' href='/' %}
{% navlink label='Navigation' leftSection='compass' active=true %}
{% navlink label='Layout' leftSection='layout' href='/components/' %}
{% endStack %}
```
Source: Python
```python
pages = [
('Overview', 'home', '/'),
('Navigation', 'compass', None), # current page — active
('Layout', 'layout', '/components/'),
]
links = ''
for label, icon, href in pages:
links += component('aardvark', 'navlink', label=label, leftSection=icon,
href=href or '', active=href is None)
component('aardvark', 'stack', gap='xs', children=links)
```
For deeper trees or fully custom link state, build a
[snippet](/authoring/components-and-snippets/) that nests `component('NavLink', ...)`
directly.
## Attributes
Omit any attribute to take its default.
| Attribute | Valid values | Description |
| --- | --- | --- |
| `label` | Any string (**required**) | The link text. |
| `description` | Any string | Secondary text below the label. |
| `href` | A relative path or URL | Destination — renders the link as an ``. |
| `leftSection` | An icon spec (Tabler name, Font Awesome class, image path, emoji, or inline SVG) | Leading icon, exactly like [`{% icon %}`](/components/data-display/icon/). |
| `rightSection` | An icon spec (as above) | Trailing icon. |
| `active` | `true` / `false` (default) | Highlight this link as the current one. |
| `variant` | `light` (default), `filled`, `subtle` | Visual style of the active/hover state. |
| `color` | Any theme color (`blue`, `grape`, …) | Accent color for the active/hover state. |
| `disabled` | `true` / `false` (default) | Dim and disable interaction. |
| `noWrap` | `true` / `false` (default) | Keep the label on one line. |
| `autoContrast` | `true` / `false` (default) | Auto-pick a readable label color against `color`. |
| `items` | JSON array of nested-link objects (`{label, href, leftSection, …}`) | One level of nested sub-links. |
| `childrenOffset` | An integer (pixels) | Indent of the nested group. |
| `defaultOpened` | `true` / `false` (default) | Whether the nested group starts expanded. |
## CSS Selectors
Each link mounts inside an island wrapper carrying `data-aardvark-island="NavLink"`; Mantine's Styles API breaks the rendered element into the root, label, description, and (for nested links) the chevron.
```css
[data-aardvark-island="NavLink"] /* the island wrapper */
.mantine-NavLink-root /* the link/button */
.mantine-NavLink-label /* the primary label */
.mantine-NavLink-description /* the secondary line */
.mantine-NavLink-chevron /* the expand chevron (nested links) */
```
## Injecting Attributes
`attr={…}` forwards raw HTML attributes (including event handlers) onto the rendered link.
Source: Markdown
```aardvark
{% navlink label='Dashboard' description='Your overview' leftSection='dashboard' href='/dashboard/' attr={'onclick': '''
event.preventDefault();
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''} %}
```
Source: Python
```python
component('aardvark', 'navlink', label='Dashboard', description='Your overview', leftSection='dashboard', href='/dashboard/', attr={'onclick': '''
event.preventDefault();
const value = this.innerText;
console.log('attr demo value:', value);
alert(value);
'''})
```