Référence
Widgets déclaratifs
Mis à jour le 4 septembre 2026Plateforme v1 Markdown brut
Le principe
Un widget déclaratif est la façon la plus légère d’apparaître sur
l’accueil d’un tenant : vous ne livrez ni page, ni code. Vous décrivez le
widget dans le manifeste — un template fourni par Capibara, d’éventuels
champs config que l’utilisateur du tenant remplit (ex. une adresse), une
source de données — et la plateforme fait tout le reste :
- elle collecte la donnée côté serveur (fetch borné, HTTPS, host
allowlisté par vos capabilitieshttp.fetch:<host>) ; - elle rend le widget avec ses propres composants, à la charte graphique
Capibara — jamais d’iframe, jamais de site externe ; - elle stocke la configuration saisie par l’utilisateur sur son
installation. Votre code n’y touche jamais (et n’existe d’ailleurs pas,
pour un widget purement déclaratif).
C’est le même esprit qu’un bot Discord : vous déclarez, la plateforme exécute.
Déclaration dans le manifeste
{
"capabilities": [
"ui.widget",
"http.fetch:geocoding-api.open-meteo.com",
"http.fetch:api.open-meteo.com"
],
"contributes": {
"widgets": [
{
"key": "meteo",
"title": "Météo",
"kind": "declarative",
"template": "weather",
"config": [
{ "key": "address", "label": "Votre ville ou adresse", "type": "text", "placeholder": "Paris", "required": true }
],
"minHeight": 220
}
]
}
}
| Champ | Type | Règle |
|---|---|---|
kind |
"declarative" |
obligatoire — distingue le widget déclaratif d’un widget embedUrl. |
template |
string | weather, kpi ou list (catalogue plateforme, il s’étoffera). |
config |
tableau | optionnel, max 6 champs — { key, label (≤ 60), type: "text"|"number", placeholder?, required? }. Saisis par l’utilisateur SUR le widget, stockés par la plateforme. |
source |
objet | optionnel — { url, map? } : URL HTTPS templatée avec les champs de config (…?q={address}) + mapping champ de sortie → chemin dans la réponse JSON ("value": "data.count"). |
minHeight |
number | optionnel, 120-1200 px. |
Règle d’allowlist (bloquante à la validation) : tout host appelé — celui
de source.url, ou les hosts intégrés du template — doit être déclaré en
capability http.fetch:<host>. Le validateur du manifeste vous liste les
capabilities manquantes.
Les templates
weather — météo (source intégrée)
Aucune source à fournir : le template embarque Open-Meteo (géocodage de
l’adresse saisie puis conditions actuelles — température, ressenti, vent,
humidité, ciel, heure locale). Déclarez les deux hosts :
http.fetch:geocoding-api.open-meteo.com et http.fetch:api.open-meteo.com.
Champ de config attendu : address (requis).
kpi — un chiffre clé
Sans source : rend les valeurs de config value et label telles quelles
(mode statique). Avec source : la réponse JSON est mappée via map
(ex. { "value": "stats.total" }) — chemins pointés, index de tableau
autorisés (results.0.name).
list — une liste d’éléments
La source doit produire un champ items (via map, ex.
{ "items": "data.entries" }) : tableau d’objets { title | name | label, subtitle? | description? } — 6 éléments affichés au maximum.
Ce que voit l’utilisateur
- Il ajoute votre widget depuis « Personnaliser » › « Ajouter un widget » sur
son accueil (rubrique Apps du sélecteur — le widget porte le nom de votre
app). - Si un champ
requiredn’est pas rempli, le widget affiche directement le
petit formulaire de configuration ; ensuite, un bouton « Modifier » discret
permet de changer la saisie (ex. changer de ville). - La donnée est rafraîchie à l’affichage (avec un cache client de quelques
minutes) — prévoyez unesourcequi supporte des lectures régulières.
Bornes d’exécution
Le fetch plateforme applique les mêmes bornes que la sandbox : HTTPS
obligatoire, host allowlisté, redirections refusées, timeout 10 s,
réponse ≤ 512 Ko, JSON uniquement. Une source injoignable produit un message
d’erreur sobre dans le widget — jamais de widget cassé.
Exemple complet
Le tutoriel Démarrer construit pas à pas un widget
météo déclaratif (manifeste seul, sans code), l’installe en test puis le
publie. L’app « Météo (exemple) », téléchargeable depuis l’index de la
documentation, montre ensuite la version avec code hébergé (page
et widget rendus par le Kit).