# ContextMenu A **right-click context menu**: right-click the target and a floating menu of actions appears at the cursor. `label` is the visible target text; `items` is a JSON array describing the menu entries — actions and dividers. The menu opens on a real right-click after the page hydrates, so in a static screenshot you'll see only the target box; right-click it in a live browser to open the menu. A **Community Component** — wraps [mantine-contextmenu](https://icflorescu.github.io/mantine-contextmenu/) by **Ionut-Cristian Florescu**, **MIT** licensed, npm `mantine-contextmenu`. Use it as `{% contextmenu %}` in Markdown, or call it from Python logic (loops, snippets) via `component('aardvark', 'contextmenu', …)`. Each entry in `items` is a small JSON object: - **An action** — a `key`, a `title`, plus optional `href` (navigates there when picked on a static page), `color` (e.g. `red` for a destructive action), and `icon` (a Tabler icon name, e.g. `copy`). - **A divider** — `{"divider": true}`, a horizontal rule between groups. ## Demonstrations ### Actions, icons, and dividers Each action takes a `key` and a `title`; add an `icon` (a Tabler icon name) for a leading glyph, a `color` to tint a destructive action, and a `{"divider": true}` entry to rule off a group.
Source: Markdown ```aardvark {% contextmenu label='Right-click this card' items='[ {"key": "copy", "title": "Copy to clipboard", "icon": "copy"}, {"key": "download", "title": "Download", "icon": "download"}, {"divider": true}, {"key": "delete", "title": "Delete", "icon": "trash", "color": "red"} ]' %} ``` Source: Python ```python component('aardvark', 'contextmenu', label='Right-click this card', items='''[ {"key": "copy", "title": "Copy to clipboard", "icon": "copy"}, {"key": "download", "title": "Download", "icon": "download"}, {"divider": true}, {"key": "delete", "title": "Delete", "icon": "trash", "color": "red"} ]''') ``` ### Link actions Give an action an `href` and picking it navigates there — the only meaningful side effect a static page can take. Relative paths and `http(s)://` links are allowed; unsafe schemes are rejected at build time.
Source: Markdown ```aardvark {% contextmenu label='Right-click for links' items='[ {"key": "docs", "title": "Open the docs", "icon": "book", "href": "/"}, {"key": "repo", "title": "View on GitHub", "icon": "brand-github", "href": "https://github.com/"} ]' %} ``` Source: Python ```python component('aardvark', 'contextmenu', label='Right-click for links', items='''[ {"key": "docs", "title": "Open the docs", "icon": "book", "href": "/"}, {"key": "repo", "title": "View on GitHub", "icon": "brand-github", "href": "https://github.com/"} ]''') ``` ## With other components Because `items` is plain data, a Python caller can build the menu from a loop — for example mapping a list of pages to link actions — and render it under a [Text](/components/typography/text/) heading: Right-click for documentation sections
Source: Markdown ```aardvark {% text fw='600' %}Right-click for documentation sections{% endText %} {% contextmenu label='Right-click here' items='[ {"key": "start", "title": "Getting started", "href": "/"}, {"key": "components", "title": "Components", "href": "/"}, {"key": "config", "title": "Configuration", "href": "/"} ]' %} ``` Source: Python ```python import json pages = [ ('start', 'Getting started', '/'), ('components', 'Components', '/'), ('config', 'Configuration', '/'), ] items = json.dumps([{'key': k, 'title': t, 'href': u} for k, t, u in pages]) component('aardvark', 'text', fw='600', children='Right-click for documentation sections') component('aardvark', 'contextmenu', label='Right-click here', items=items) ``` ## Attributes Omit any attribute to take its default. | Attribute | Valid values | Description | | --- | --- | --- | | `label` | string | The visible right-click target text. Defaults to `Right-click here`. | | `items` | JSON array string | The menu entries. Each is an action object (`key`, `title`, plus optional `href`, `color`, and a Tabler `icon` name) or a divider object (`{"divider": true}`). | | `attr={…}` | An object of HTML attributes | Forwards raw HTML attributes onto the rendered target element. See [Injecting Attributes](#injecting-attributes). | ## CSS Selector The right-click target carries the class `aardvark-contextmenu-target`; target it to restyle the surface authors see on the page: ```css .aardvark-contextmenu-target { background: var(--mantine-color-gray-0); } ``` The floating menu itself is styled by the upstream `mantine-contextmenu` stylesheet, which the component pulls in automatically. ## Injecting Attributes Pass `attr={…}` to forward raw HTML attributes onto the rendered target element — useful for `id`, `data-*`, ARIA attributes, or anything not exposed as a named param:
Source: Markdown ```aardvark {% contextmenu label='Right-click me' attr={'id': 'demo-context', 'data-role': 'menu-target'} items='[{"key": "x", "title": "Action"}]' %} ``` Source: Python ```python component('aardvark', 'contextmenu', label='Right-click me', attr={'id': 'demo-context', 'data-role': 'menu-target'}, items='[{"key": "x", "title": "Action"}]') ```