` se `href` è valorizzato).
```
{% ag_button [label=""] [variant="primary"] [size=""] [outline=False] [href=""] [type="button"] %}
```
```django
{% ag_button label="Salva" variant="primary" %}
{% ag_button label="Annulla" variant="secondary" outline=True %}
{% ag_button label="Apri sito" variant="primary" href="https://www.agesci.it" %}
{% ag_button label="Small" variant="success" size="sm" %}
```
---
### `ag_breadcrumb`
Breadcrumb con stile del tema.
```
{% ag_breadcrumb [items=None] %}
```
| Parametro | Descrizione |
|---|---|
| `items` | Lista di dict `{"label": "...", "url": "..."}`. L'ultimo elemento è sempre `active` (senza link). |
```python
# views.py
breadcrumb_items = [
{"label": "Home", "url": "/"},
{"label": "Eventi", "url": "/eventi/"},
{"label": "Dettaglio"},
]
```
```django
{% ag_breadcrumb items=breadcrumb_items %}
```
:::{tip}
Se passi `breadcrumb_items` come variabile di contesto dalla view, l'header
la mostra automaticamente nella barra inferiore (`ag-header-bottom`), senza
bisogno del tag `{% ag_breadcrumb %}` nel contenuto. Usa questo tag solo se
preferisci posizionare la breadcrumb manualmente all'interno del blocco `content`.
:::
---
### `ag_dropdown`
Menu dropdown Bootstrap.
```
{% ag_dropdown [label=""] [items=None] [variant="primary"] [split=False] [direction=""] %}
```
| Parametro | Descrizione |
|---|---|
| `items` | Lista di dict con `label`, `url`, `active` (opt.), `disabled` (opt.). Usa `{"divider": True}` per un separatore. |
| `split` | `True` per bottone split (freccia separata) |
| `direction` | `""` · `"dropup"` · `"dropstart"` · `"dropend"` |
```python
voci = [
{"label": "Profilo", "url": "/profilo/"},
{"label": "Impostazioni","url": "/impostazioni/"},
{"divider": True},
{"label": "Esci", "url": "/logout/"},
]
```
```django
{% ag_dropdown label="Account" items=voci variant="primary" %}
```
---
### `ag_list_group`
List group Bootstrap.
```
{% ag_list_group [items=None] [flush=False] [numbered=False] %}
```
| Parametro | Descrizione |
|---|---|
| `items` | Lista di dict con `label`, `url` (opt.), `active` (opt.), `disabled` (opt.), `badge` (opt.) |
| `flush` | `True` per rimuovere i bordi laterali |
| `numbered` | `True` per lista numerata |
```python
voci = [
{"label": "Branca L/C", "badge": "12"},
{"label": "Branca E/G", "badge": "8", "active": True},
{"label": "Branca R/S", "badge": "5"},
]
```
```django
{% ag_list_group items=voci %}
{% ag_list_group items=voci flush=True %}
```
---
### `ag_modal_trigger`
Bottone che apre un modal Bootstrap.
```
{% ag_modal_trigger modal_id [label="Apri"] [variant="primary"] [size=""] %}
```
Va accoppiato con il template `agesci_theme/components/modal.html` tramite `{% include %}`:
```django
{# Pulsante trigger #}
{% ag_modal_trigger modal_id="conferma" label="Conferma" %}
{# Shell del modal (in fondo alla pagina, fuori dal flusso) #}
{% include "agesci_theme/components/modal.html" with
modal_id="conferma"
title="Conferma operazione"
body="Sei sicuro di voler procedere?
"
size="sm" %}
```
Per contenuto più complesso, prepara il corpo nella view come stringa `mark_safe`:
```python
from django.utils.safestring import mark_safe
context["modal_body"] = mark_safe("Contenuto HTML.
")
```
```django
{% include "agesci_theme/components/modal.html" with
modal_id="info" title="Informazioni" body=modal_body centered=True %}
```
**Parametri di `modal.html`:**
| Parametro | Default | Descrizione |
|---|---|---|
| `modal_id` | — | ID univoco (obbligatorio) |
| `title` | `""` | Titolo nell'intestazione |
| `body` | `""` | Corpo (HTML come `mark_safe`) |
| `size` | `""` | `"sm"` · `"lg"` · `"xl"` · `"fullscreen"` |
| `centered` | `False` | `True` per centratura verticale |
---
### `ag_masonry_grid`
Griglia Masonry a cascata.
```
{% ag_masonry_grid [items=None] [cols=3] %}
```
**Requisito:** la libreria JavaScript Masonry deve essere caricata nel blocco
`extra_js` del template che usa il componente:
```django
{% block extra_js %}{{ block.super }}
{% endblock %}
```
**Parametri:**
| Parametro | Descrizione |
|---|---|
| `items` | Lista di dict con chiave `content` (HTML come `mark_safe`) |
| `cols` | Colonne su desktop: `2`, `3` (default) o `4` |
```python
from django.utils.safestring import mark_safe
items = [
{"content": mark_safe('')},
{"content": mark_safe('')},
]
```
```django
{% ag_masonry_grid items=masonry_items cols=3 %}
```