```
---
## MalioDataTable
Tableau de données presentational avec pagination, filtres par slots et lignes cliquables.
| Prop | Type | Défaut | Description |
|------|------|--------|-------------|
| `id` | `string` | auto | Identifiant HTML |
| `columns` | `{ key: string, label: string }[]` | **requis** | Définition des colonnes |
| `items` | `Record[]` | **requis** | Données à afficher |
| `totalItems` | `number` | **requis** | Total pour la pagination |
| `page` | `number` | `1` | Page courante (v-model) |
| `perPage` | `number` | `10` | Lignes par page (v-model) |
| `perPageOptions` | `number[]` | `[10, 25, 50]` | Options du sélecteur de lignes |
| `rowClickable` | `boolean` | `true` | Lignes cliquables (cursor pointer + hover) |
| `tableClass` | `string` | `''` | Classes CSS sur `
` (twMerge) |
| `emptyMessage` | `string` | `'Aucune donnée'` | Message si items vide |
**Events :** `update:page(value: number)`, `update:per-page(value: number)`, `row-click(item: Record)`
**Slots :** `#header-{key}` (filtre dans le `
`, placeholder = label), `#cell-{key}` (contenu du `
`), `#empty` (état vide)
```vue
{{ item.nom }}
```
---
## MalioSiteSelector
Sélecteur horizontal pour choisir un site (usine ou lieu) parmi une liste. Les tuiles occupent une largeur proportionnelle du conteneur. La couleur du site sélectionné est appliquée à toutes les tuiles ; la tuile active est opaque, les autres sont atténuées à 40 %.
| Prop | Type | Défaut | Description |
|------|------|--------|-------------|
| `sites` | `{ id: string, name: string, color: string }[]` | **requis** | Liste des sites. `color` est un hex (ex : `'#0055ff'`) |
| `modelValue` | `string` | `undefined` | `id` du site sélectionné (v-model). Sans v-model, le premier site est sélectionné |
| `id` | `string` | auto | Identifiant HTML du conteneur |
| `groupClass` | `string` | `''` | Classes CSS du conteneur (twMerge) |
| `tileClass` | `string` | `''` | Classes CSS de chaque tuile (twMerge) |
| `labelClass` | `string` | `''` | Classes CSS du libellé (twMerge) |
**Events :**
- `update:modelValue(value: string)` — id du site sélectionné (v-model)
- `change(site: { id: string, name: string, color: string })` — objet site complet, émis au clic (pratique pour déclencher un appel API côté consommateur)
```vue
refetch(site.id)"
/>
```